aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala
diff options
context:
space:
mode:
authorJack Koenig2017-06-29 23:08:34 -0700
committerJack Koenig2017-06-29 23:08:34 -0700
commit31b3e35f935acdb652edbee5abe3ea35caad0611 (patch)
tree23d123b8f9e51a446ba50f608a1a724ddc502344 /src/main/scala
parentd6abb875675ef0bb4461d2d8799657ff42830ea5 (diff)
ConstProp registers that are only connected to or reset to a consant
Diffstat (limited to 'src/main/scala')
-rw-r--r--src/main/scala/firrtl/transforms/ConstantPropagation.scala13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/transforms/ConstantPropagation.scala b/src/main/scala/firrtl/transforms/ConstantPropagation.scala
index 31a6a660..bf8b1a55 100644
--- a/src/main/scala/firrtl/transforms/ConstantPropagation.scala
+++ b/src/main/scala/firrtl/transforms/ConstantPropagation.scala
@@ -9,6 +9,7 @@ import firrtl.ir._
import firrtl.Utils._
import firrtl.Mappers._
import firrtl.PrimOps._
+import firrtl.WrappedExpression.weq
import annotation.tailrec
import collection.mutable
@@ -317,6 +318,18 @@ class ConstantPropagation extends Transform {
case Connect(_, WRef(wname, wtpe, WireKind, _), expr) if !dontTouches.contains(wname) =>
val exprx = constPropExpression(pad(expr, wtpe))
propagateRef(wname, exprx)
+ // Const prop registers that are fed only a constant or a mux between and constant and the
+ // register itself
+ // This requires that reset has been made explicit
+ case Connect(_, rref @ WRef(rname, rtpe, RegKind, _), expr) => expr match {
+ case lit: Literal =>
+ nodeMap(rname) = constPropExpression(pad(lit, rtpe))
+ case Mux(_, tval: WRef, fval: Literal, _) if weq(rref, tval) =>
+ nodeMap(rname) = constPropExpression(pad(fval, rtpe))
+ case Mux(_, tval: Literal, fval: WRef, _) if weq(rref, fval) =>
+ nodeMap(rname) = constPropExpression(pad(tval, rtpe))
+ case _ =>
+ }
case _ =>
}
stmtx