diff options
| author | Albert Magyar | 2019-09-11 18:16:20 -0700 |
|---|---|---|
| committer | Albert Magyar | 2019-09-30 16:22:01 -0700 |
| commit | a10084fbba0ba88a1f0517b826ef8de44d8760d1 (patch) | |
| tree | 8a1ac0098409dbb95a45d3b7107a4f6d59d8e166 /src/main/scala/firrtl/proto | |
| parent | 4ca2b859473e0a88723463eac2821cfbd3249c43 (diff) | |
Improve read-under-write parameter support
* Make the read-under-write (RUW) parameter typesafe
* Add RUW support to the FIRRTL proto and CHIRRTL grammar
Diffstat (limited to 'src/main/scala/firrtl/proto')
| -rw-r--r-- | src/main/scala/firrtl/proto/FromProto.scala | 11 | ||||
| -rw-r--r-- | src/main/scala/firrtl/proto/ToProto.scala | 13 |
2 files changed, 20 insertions, 4 deletions
diff --git a/src/main/scala/firrtl/proto/FromProto.scala b/src/main/scala/firrtl/proto/FromProto.scala index 22c90316..ef2ee5bd 100644 --- a/src/main/scala/firrtl/proto/FromProto.scala +++ b/src/main/scala/firrtl/proto/FromProto.scala @@ -8,6 +8,7 @@ import java.io.{File, FileInputStream, InputStream} import collection.JavaConverters._ import FirrtlProtos._ import com.google.protobuf.CodedInputStream +import Firrtl.Statement.ReadUnderWrite object FromProto { @@ -133,6 +134,12 @@ object FromProto { ir.Conditionally(convert(info), convert(when.getPredicate), conseq, alt) } + def convert(ruw: ReadUnderWrite): ir.ReadUnderWrite.Value = ruw match { + case ReadUnderWrite.UNDEFINED => ir.ReadUnderWrite.Undefined + case ReadUnderWrite.OLD => ir.ReadUnderWrite.Old + case ReadUnderWrite.NEW => ir.ReadUnderWrite.New + } + def convert(dt: Firrtl.Statement.CMemory.TypeAndDepth): (ir.Type, BigInt) = (convert(dt.getDataType), convert(dt.getDepth)) @@ -145,7 +152,7 @@ object FromProto { case TYPE_AND_DEPTH_FIELD_NUMBER => convert(cmem.getTypeAndDepth) } - CDefMemory(convert(info), cmem.getId, tpe, depth, cmem.getSyncRead) + CDefMemory(convert(info), cmem.getId, tpe, depth, cmem.getSyncRead, convert(cmem.getReadUnderWrite)) } import Firrtl.Statement.MemoryPort.Direction._ @@ -181,7 +188,7 @@ object FromProto { case BIGINT_DEPTH_FIELD_NUMBER => convert(mem.getBigintDepth) } ir.DefMemory(convert(info), mem.getId, dtype, depth, mem.getWriteLatency, mem.getReadLatency, - rs, ws, rws, None) + rs, ws, rws, convert(mem.getReadUnderWrite)) } def convert(attach: Firrtl.Statement.Attach, info: Firrtl.SourceInfo): ir.Attach = { diff --git a/src/main/scala/firrtl/proto/ToProto.scala b/src/main/scala/firrtl/proto/ToProto.scala index 17adb698..70de3ccd 100644 --- a/src/main/scala/firrtl/proto/ToProto.scala +++ b/src/main/scala/firrtl/proto/ToProto.scala @@ -6,6 +6,7 @@ package proto import java.io.OutputStream import FirrtlProtos._ +import Firrtl.Statement.ReadUnderWrite import Firrtl.Expression.PrimOp.Op import com.google.protobuf.{CodedOutputStream, WireFormat} import firrtl.PrimOps._ @@ -103,6 +104,12 @@ object ToProto { BPSet -> Op.OP_SET_BINARY_POINT ) + def convert(ruw: ir.ReadUnderWrite.Value): ReadUnderWrite = ruw match { + case ir.ReadUnderWrite.Undefined => ReadUnderWrite.UNDEFINED + case ir.ReadUnderWrite.Old => ReadUnderWrite.OLD + case ir.ReadUnderWrite.New => ReadUnderWrite.NEW + } + def convertToIntegerLiteral(value: BigInt): Firrtl.Expression.IntegerLiteral.Builder = { Firrtl.Expression.IntegerLiteral.newBuilder() .setValue(value.toString) @@ -260,22 +267,24 @@ object ToProto { val ib = Firrtl.Statement.IsInvalid.newBuilder() .setExpression(convert(expr)) sb.setIsInvalid(ib) - case ir.DefMemory(_, name, dtype, depth, wlat, rlat, rs, ws, rws, _) => + case ir.DefMemory(_, name, dtype, depth, wlat, rlat, rs, ws, rws, ruw) => val mem = Firrtl.Statement.Memory.newBuilder() .setId(name) .setType(convert(dtype)) .setBigintDepth(convertToBigInt(depth)) .setWriteLatency(wlat) .setReadLatency(rlat) + .setReadUnderWrite(convert(ruw)) mem.addAllReaderId(rs.asJava) mem.addAllWriterId(ws.asJava) mem.addAllReadwriterId(rws.asJava) sb.setMemory(mem) - case CDefMemory(_, name, tpe, size, seq) => + case CDefMemory(_, name, tpe, size, seq, ruw) => val mb = Firrtl.Statement.CMemory.newBuilder() .setId(name) .setTypeAndDepth(convert(tpe, size)) .setSyncRead(seq) + .setReadUnderWrite(convert(ruw)) sb.setCmemory(mb) case CDefMPort(_, name, _, mem, exprs, dir) => val pb = Firrtl.Statement.MemoryPort.newBuilder() |
