aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJiuyang Liu2021-03-27 00:53:25 +0000
committerGitHub2021-03-27 00:53:25 +0000
commitabeff01f0714d5474b9d18d78fc13011e5ad6b99 (patch)
tree8985ae7da691d378d192060872360517debd8805 /src
parent67ce97a10564cfa07829af8cfce562009d60bafb (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>
Diffstat (limited to 'src')
-rw-r--r--src/main/resources/META-INF/services/firrtl.options.RegisteredTransform1
-rw-r--r--src/main/scala/firrtl/stage/FirrtlAnnotations.scala1
-rw-r--r--src/main/scala/firrtl/transforms/ConstantPropagation.scala19
-rw-r--r--src/main/scala/firrtl/transforms/OptimizationAnnotations.scala3
-rw-r--r--src/test/scala/firrtlTests/ConstantPropagationTests.scala11
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 :