aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/transforms/LegalizeClocks.scala
diff options
context:
space:
mode:
authorDavid Biancolin2020-08-21 23:22:24 -0700
committerGitHub2020-08-22 06:22:24 +0000
commit72d3983b313fb20b819c2555a13a627cbb9d63c3 (patch)
tree16093716a5a8b2d41fa83032982577450b389e28 /src/main/scala/firrtl/transforms/LegalizeClocks.scala
parent266ac5fc32865d001409194f426b4126f5d9001b (diff)
Async reset tieoff bug (#1854)
* Elide emission of literals for async reset in sensitivity lists * Deprecate LegalizeClocksTransform Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Diffstat (limited to 'src/main/scala/firrtl/transforms/LegalizeClocks.scala')
-rw-r--r--src/main/scala/firrtl/transforms/LegalizeClocks.scala87
1 files changed, 0 insertions, 87 deletions
diff --git a/src/main/scala/firrtl/transforms/LegalizeClocks.scala b/src/main/scala/firrtl/transforms/LegalizeClocks.scala
deleted file mode 100644
index 248775d9..00000000
--- a/src/main/scala/firrtl/transforms/LegalizeClocks.scala
+++ /dev/null
@@ -1,87 +0,0 @@
-package firrtl
-package transforms
-
-import firrtl.ir._
-import firrtl.Mappers._
-import firrtl.options.Dependency
-import firrtl.Utils.isCast
-
-// Fixup otherwise legal Verilog that lint tools and other tools don't like
-// Currently:
-// - don't emit "always @(posedge <literal>)"
-// Hitting this case is rare, but legal FIRRTL
-// TODO This should be unified with all Verilog legalization transforms
-object LegalizeClocksTransform {
-
- // Checks if an Expression is illegal in use in a @(posedge <Expression>) construct
- // Legality is defined here by what standard lint tools accept
- // Currently only looks for literals nested within casts
- private def illegalClockExpr(expr: Expression): Boolean = expr match {
- case _: Literal => true
- case DoPrim(op, args, _, _) if isCast(op) => args.exists(illegalClockExpr)
- case _ => false
- }
-
- /** Legalize Clocks in a Statement
- *
- * Enforces legal Verilog semantics on all Clock Expressions.
- * Legal is defined as what standard lint tools accept.
- * Currently only Literal Expressions (guarded by casts) are handled.
- *
- * @note namespace is lazy because it should not typically be needed
- */
- def onStmt(namespace: => Namespace)(stmt: Statement): Statement =
- stmt.map(onStmt(namespace)) match {
- // Proper union types would deduplicate this code
- case r: DefRegister if illegalClockExpr(r.clock) =>
- val node = DefNode(r.info, namespace.newTemp, r.clock)
- val rx = r.copy(clock = WRef(node))
- Block(Seq(node, rx))
- case p: Print if illegalClockExpr(p.clk) =>
- val node = DefNode(p.info, namespace.newTemp, p.clk)
- val px = p.copy(clk = WRef(node))
- Block(Seq(node, px))
- case s: Stop if illegalClockExpr(s.clk) =>
- val node = DefNode(s.info, namespace.newTemp, s.clk)
- val sx = s.copy(clk = WRef(node))
- Block(Seq(node, sx))
- case s: Verification if illegalClockExpr(s.clk) =>
- val node = DefNode(s.info, namespace.newTemp, s.clk)
- val sx = s.copy(clk = WRef(node))
- Block(Seq(node, sx))
- case other => other
- }
-
- def onMod(mod: DefModule): DefModule = {
- // It's actually *extremely* important that this Namespace is a lazy val
- // onStmt accepts it lazily so that we don't perform the namespacing traversal unless necessary
- // If we were to inline the declaration, it would create a Namespace for every problem, causing
- // name collisions
- lazy val namespace = Namespace(mod)
- mod.map(onStmt(namespace))
- }
-}
-
-/** Ensure Clocks to be emitted are legal Verilog */
-class LegalizeClocksTransform extends Transform with DependencyAPIMigration {
-
- override def prerequisites = firrtl.stage.Forms.LowFormMinimumOptimized ++
- Seq(
- Dependency[BlackBoxSourceHelper],
- Dependency[FixAddingNegativeLiterals],
- Dependency[ReplaceTruncatingArithmetic],
- Dependency[InlineBitExtractionsTransform],
- Dependency[InlineCastsTransform]
- )
-
- override def optionalPrerequisites = firrtl.stage.Forms.LowFormOptimized
-
- override def optionalPrerequisiteOf = Seq.empty
-
- override def invalidates(a: Transform) = false
-
- def execute(state: CircuitState): CircuitState = {
- val modulesx = state.circuit.modules.map(LegalizeClocksTransform.onMod(_))
- state.copy(circuit = state.circuit.copy(modules = modulesx))
- }
-}