diff options
| author | Kevin Laeufer | 2023-01-25 11:06:45 -0500 |
|---|---|---|
| committer | GitHub | 2023-01-25 16:06:45 +0000 |
| commit | 82af22f300a6d47c63cd3304d5c9d0447b33091a (patch) | |
| tree | c1eca36fdebed0ffa362a0d44295ab3352afcf27 /src | |
| parent | 59f62d82f28947af472fc8ed030051be40f5bfbe (diff) | |
[smem] fix read-under-write serialization (#2595)
* [smem] fix read-under-write serialization
Also adds some tests for the parser and
the serializer.
* Serializer: always serialize smem ruw behavior
* test: simplify smem test circuit
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/scala/firrtl/ir/Serializer.scala | 3 | ||||
| -rw-r--r-- | src/test/scala/firrtlTests/ParserSpec.scala | 29 | ||||
| -rw-r--r-- | src/test/scala/firrtlTests/SerializerSpec.scala | 15 |
3 files changed, 46 insertions, 1 deletions
diff --git a/src/main/scala/firrtl/ir/Serializer.scala b/src/main/scala/firrtl/ir/Serializer.scala index 654fa7c5..3a4fe90e 100644 --- a/src/main/scala/firrtl/ir/Serializer.scala +++ b/src/main/scala/firrtl/ir/Serializer.scala @@ -302,7 +302,8 @@ object Serializer { // WIR case firrtl.CDefMemory(info, name, tpe, size, seq, readUnderWrite) => if (seq) b ++= "smem " else b ++= "cmem " - b ++= name; b ++= " : "; s(tpe); b ++= " ["; b ++= size.toString(); b += ']'; s(info) + b ++= name; b ++= " : "; s(tpe); b ++= " ["; b ++= size.toString(); b += ']' + b += ' '; b ++= readUnderWrite.toString; s(info) case firrtl.CDefMPort(info, name, _, mem, exps, direction) => b ++= direction.serialize; b ++= " mport "; b ++= name; b ++= " = "; b ++= mem b += '['; s(exps.head); b ++= "], "; s(exps(1)); s(info) diff --git a/src/test/scala/firrtlTests/ParserSpec.scala b/src/test/scala/firrtlTests/ParserSpec.scala index 5003871d..dea44844 100644 --- a/src/test/scala/firrtlTests/ParserSpec.scala +++ b/src/test/scala/firrtlTests/ParserSpec.scala @@ -405,6 +405,35 @@ class ParserSpec extends FirrtlFlatSpec { firrtl.Parser.parse(input) } } + + it should "parse smem read-under-write behavior" in { + val undefined = firrtl.Parser.parse(SMemTestCircuit.src("")) + assert(SMemTestCircuit.findRuw(undefined) == ReadUnderWrite.Undefined) + + val undefined2 = firrtl.Parser.parse(SMemTestCircuit.src(" undefined")) + assert(SMemTestCircuit.findRuw(undefined2) == ReadUnderWrite.Undefined) + + val old = firrtl.Parser.parse(SMemTestCircuit.src(" old")) + assert(SMemTestCircuit.findRuw(old) == ReadUnderWrite.Old) + + val readNew = firrtl.Parser.parse(SMemTestCircuit.src(" new")) + assert(SMemTestCircuit.findRuw(readNew) == ReadUnderWrite.New) + } +} + +/** used to test parsing and serialization of smems */ +object SMemTestCircuit { + def src(ruw: String): String = + s"""circuit Example : + | module Example : + | smem mem : UInt<8> [8] $ruw@[main.scala 10:25] + |""".stripMargin + + def findRuw(c: Circuit): ReadUnderWrite.Value = { + val main = c.modules.head.asInstanceOf[ir.Module] + val mem = main.body.asInstanceOf[ir.Block].stmts.collectFirst { case m: CDefMemory => m }.get + mem.readUnderWrite + } } class ParserPropSpec extends FirrtlPropSpec { diff --git a/src/test/scala/firrtlTests/SerializerSpec.scala b/src/test/scala/firrtlTests/SerializerSpec.scala index 9a984d60..0e72b97f 100644 --- a/src/test/scala/firrtlTests/SerializerSpec.scala +++ b/src/test/scala/firrtlTests/SerializerSpec.scala @@ -121,4 +121,19 @@ class SerializerSpec extends AnyFlatSpec with Matchers { val serialized = Serializer.serialize(when, 1) serialized should be(" when cond :\n skip\n") } + + it should "serialize read-under-write behavior for smems correctly" in { + def parseSerializeParse(src: String): Circuit = Parser.parse(Parser.parse(src).serialize) + val undefined = parseSerializeParse(SMemTestCircuit.src("")) + assert(SMemTestCircuit.findRuw(undefined) == ReadUnderWrite.Undefined) + + val undefined2 = parseSerializeParse(SMemTestCircuit.src(" undefined")) + assert(SMemTestCircuit.findRuw(undefined2) == ReadUnderWrite.Undefined) + + val old = parseSerializeParse(SMemTestCircuit.src(" old")) + assert(SMemTestCircuit.findRuw(old) == ReadUnderWrite.Old) + + val readNew = parseSerializeParse(SMemTestCircuit.src(" new")) + assert(SMemTestCircuit.findRuw(readNew) == ReadUnderWrite.New) + } } |
