diff options
| author | Jiuyang Liu | 2021-03-27 00:53:25 +0000 |
|---|---|---|
| committer | GitHub | 2021-03-27 00:53:25 +0000 |
| commit | abeff01f0714d5474b9d18d78fc13011e5ad6b99 (patch) | |
| tree | 8985ae7da691d378d192060872360517debd8805 | |
| parent | 67ce97a10564cfa07829af8cfce562009d60bafb (diff) | |
Add NoConstantPropagationAnnotation to disable constatnt propagation (#2150)
* add --no-constant-propagation to disable constant propagation
* add test
* deprecate DisableFold.
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
5 files changed, 32 insertions, 3 deletions
diff --git a/src/main/resources/META-INF/services/firrtl.options.RegisteredTransform b/src/main/resources/META-INF/services/firrtl.options.RegisteredTransform index bb72d45c..9304c39a 100644 --- a/src/main/resources/META-INF/services/firrtl.options.RegisteredTransform +++ b/src/main/resources/META-INF/services/firrtl.options.RegisteredTransform @@ -3,3 +3,4 @@ firrtl.transforms.CheckCombLoops firrtl.passes.InlineInstances firrtl.passes.clocklist.ClockListTransform firrtl.transforms.formal.AssertSubmoduleAssumptions +firrtl.transforms.ConstantPropagation diff --git a/src/main/scala/firrtl/stage/FirrtlAnnotations.scala b/src/main/scala/firrtl/stage/FirrtlAnnotations.scala index 26655efd..44c88418 100644 --- a/src/main/scala/firrtl/stage/FirrtlAnnotations.scala +++ b/src/main/scala/firrtl/stage/FirrtlAnnotations.scala @@ -291,6 +291,7 @@ case object PrettyNoExprInlining extends NoTargetAnnotation with FirrtlOption wi */ case class DisableFold(op: ir.PrimOp) extends NoTargetAnnotation with FirrtlOption +@deprecated("will be removed and merged into ConstantPropagation in 1.5", "1.4") object DisableFold extends HasShellOptions { private val mapping: Map[String, ir.PrimOp] = PrimOps.builtinPrimOps.map { case op => op.toString -> op }.toMap diff --git a/src/main/scala/firrtl/transforms/ConstantPropagation.scala b/src/main/scala/firrtl/transforms/ConstantPropagation.scala index 7106c699..5610c7e7 100644 --- a/src/main/scala/firrtl/transforms/ConstantPropagation.scala +++ b/src/main/scala/firrtl/transforms/ConstantPropagation.scala @@ -13,7 +13,7 @@ import firrtl.PrimOps._ import firrtl.graph.DiGraph import firrtl.analyses.InstanceKeyGraph import firrtl.annotations.TargetToken.Ref -import firrtl.options.Dependency +import firrtl.options.{Dependency, RegisteredTransform, ShellOption} import firrtl.stage.DisableFold import annotation.tailrec @@ -101,7 +101,7 @@ object ConstantPropagation { } -class ConstantPropagation extends Transform with DependencyAPIMigration { +class ConstantPropagation extends Transform with RegisteredTransform with DependencyAPIMigration { import ConstantPropagation._ override def prerequisites = @@ -124,6 +124,14 @@ class ConstantPropagation extends Transform with DependencyAPIMigration { case _ => false } + val options = Seq( + new ShellOption[Unit]( + longOption = "no-constant-propagation", + toAnnotationSeq = _ => Seq(NoConstantPropagationAnnotation), + helpText = "Disable constant propagation elimination" + ) + ) + sealed trait SimplifyBinaryOp { def matchingArgsValue(e: DoPrim, arg: Expression): Expression def apply(e: DoPrim): Expression = { @@ -869,6 +877,11 @@ class ConstantPropagation extends Transform with DependencyAPIMigration { val disabledOps = state.annotations.collect { case DisableFold(op) => op }.toSet - state.copy(circuit = run(state.circuit, dontTouchMap, disabledOps)) + if (state.annotations.contains(NoConstantPropagationAnnotation)) { + logger.info("Skipping Constant Propagation") + state + } else { + state.copy(circuit = run(state.circuit, dontTouchMap, disabledOps)) + } } } diff --git a/src/main/scala/firrtl/transforms/OptimizationAnnotations.scala b/src/main/scala/firrtl/transforms/OptimizationAnnotations.scala index 10163b72..e817571a 100644 --- a/src/main/scala/firrtl/transforms/OptimizationAnnotations.scala +++ b/src/main/scala/firrtl/transforms/OptimizationAnnotations.scala @@ -9,6 +9,9 @@ import firrtl.passes.PassException /** Indicate that DCE should not be run */ case object NoDCEAnnotation extends NoTargetAnnotation +/** Indicate that ConstantPropagation should not be run */ +case object NoConstantPropagationAnnotation extends NoTargetAnnotation + /** Lets an annotation mark its ReferenceTarget members as DontTouch * * This permits a transform to run and remove its associated annotations, diff --git a/src/test/scala/firrtlTests/ConstantPropagationTests.scala b/src/test/scala/firrtlTests/ConstantPropagationTests.scala index 60cf1b8b..bc7f92e6 100644 --- a/src/test/scala/firrtlTests/ConstantPropagationTests.scala +++ b/src/test/scala/firrtlTests/ConstantPropagationTests.scala @@ -908,6 +908,17 @@ class ConstantPropagationIntegrationSpec extends LowTransformSpec { execute(input, check, Seq(dontTouch("Child.in1"))) } + it should "NOT optimize if no-constant-propagation is enabled" in { + val input = + """circuit Foo: + | module Foo: + | input a: UInt<1> + | output b: UInt<1> + | b <= and(UInt<1>(0), a)""".stripMargin + val check = parse(input).serialize + execute(input, check, Seq(NoConstantPropagationAnnotation)) + } + it should "still propagate constants even when there is name swapping" in { val input = """circuit Top : |
