aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/proto
diff options
context:
space:
mode:
authorAlbert Magyar2019-09-11 18:16:20 -0700
committerAlbert Magyar2019-09-30 16:22:01 -0700
commita10084fbba0ba88a1f0517b826ef8de44d8760d1 (patch)
tree8a1ac0098409dbb95a45d3b7107a4f6d59d8e166 /src/main/scala/firrtl/proto
parent4ca2b859473e0a88723463eac2821cfbd3249c43 (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.scala11
-rw-r--r--src/main/scala/firrtl/proto/ToProto.scala13
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()