aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/transforms/EnsureNamedStatements.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/firrtl/transforms/EnsureNamedStatements.scala')
-rw-r--r--src/main/scala/firrtl/transforms/EnsureNamedStatements.scala39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/transforms/EnsureNamedStatements.scala b/src/main/scala/firrtl/transforms/EnsureNamedStatements.scala
new file mode 100644
index 00000000..a40409f9
--- /dev/null
+++ b/src/main/scala/firrtl/transforms/EnsureNamedStatements.scala
@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: Apache-2.0
+
+package firrtl.transforms
+
+import firrtl._
+import firrtl.ir._
+
+/** Adds default names to print, stop and verification statements if their name is empty. */
+object EnsureNamedStatements extends Transform with DependencyAPIMigration {
+ override def invalidates(a: Transform) = false
+
+ override protected def execute(state: CircuitState): CircuitState = {
+ val c = state.circuit.mapModule(onModule)
+ state.copy(circuit = c)
+ }
+
+ private def onModule(m: DefModule): DefModule = m match {
+ case e: ExtModule => e
+ case mod: Module =>
+ val namespace = Namespace(mod)
+ // Ensure we always start with _0 suffix
+ val prefixes = Seq("cover", "assert", "assume", "print", "stop")
+ prefixes.filterNot(namespace.contains).foreach(namespace.newName)
+ mod.mapStmt(onStmt(namespace))
+ }
+
+ private def onStmt(namespace: Namespace)(stmt: Statement): Statement = stmt match {
+ case s: Print if s.name.isEmpty => s.withName(namespace.newName("print"))
+ case s: Stop if s.name.isEmpty => s.withName(namespace.newName("stop"))
+ case s: Verification if s.name.isEmpty =>
+ val baseName = s.op match {
+ case Formal.Cover => "cover"
+ case Formal.Assert => "assert"
+ case Formal.Assume => "assume"
+ }
+ s.withName(namespace.newName(baseName))
+ case other => other.mapStmt(onStmt(namespace))
+ }
+}