aboutsummaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorKevin Laeufer2020-11-09 14:15:56 -0800
committerGitHub2020-11-09 22:15:56 +0000
commitfe95544d573fff9bb114b3302986aa746e1f4763 (patch)
treed0bcaa3397527338b7ce6511c7fd2452e63eb2b0 /src/test
parent1d0b1138c479b5b414362bbce43aebe70ac4eeb5 (diff)
smt: ensure that all signals have a unique name (#1943)
* smt: add tests for assert name clashes * smt: ensure unique signal names with a namespace this fixes issues #1934
Diffstat (limited to 'src/test')
-rw-r--r--src/test/scala/firrtl/backends/experimental/smt/FirrtlModuleToTransitionSystemSpec.scala36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/test/scala/firrtl/backends/experimental/smt/FirrtlModuleToTransitionSystemSpec.scala b/src/test/scala/firrtl/backends/experimental/smt/FirrtlModuleToTransitionSystemSpec.scala
index f4b3a1f5..a90e8506 100644
--- a/src/test/scala/firrtl/backends/experimental/smt/FirrtlModuleToTransitionSystemSpec.scala
+++ b/src/test/scala/firrtl/backends/experimental/smt/FirrtlModuleToTransitionSystemSpec.scala
@@ -347,4 +347,40 @@ private class FirrtlModuleToTransitionSystemSpec extends SMTBackendBaseSpec {
}
assert(err.getMessage.contains("clk"))
}
+
+ it should "automatically generate unique names for verification statements" in {
+ val src0 =
+ """circuit m:
+ | module m:
+ | input c : Clock
+ | input i : UInt<1>
+ | ; two asserts with the same message should get unique names
+ | assert(c, i, UInt(1), "")
+ | assert(c, i, UInt(1), "")
+ |""".stripMargin
+ assertUniqueSignalNames(toSys(src0))
+
+ val src1 =
+ """circuit m:
+ | module m:
+ | input c : Clock
+ | input i : UInt<1>
+ | ; assert name should not be the same as an existing signal name
+ | assert(c, i, UInt(1), "")
+ | node assert_ = i
+ |""".stripMargin
+ assertUniqueSignalNames(toSys(src1))
+ }
+
+ private def assertUniqueSignalNames(sys: TransitionSystem): Unit = {
+ val names = scala.collection.mutable.HashSet[String]()
+ sys.inputs.foreach { input =>
+ assert(!names.contains(input.name), s"Input name ${input.name} already taken!")
+ names.add(input.name)
+ }
+ sys.signals.foreach { signal =>
+ assert(!names.contains(signal.name), s"Signal name ${signal.name} already taken! (${signal.e})")
+ names.add(signal.name)
+ }
+ }
}