diff options
| author | Jack Koenig | 2017-06-29 23:08:34 -0700 |
|---|---|---|
| committer | Jack Koenig | 2017-06-29 23:08:34 -0700 |
| commit | 31b3e35f935acdb652edbee5abe3ea35caad0611 (patch) | |
| tree | 23d123b8f9e51a446ba50f608a1a724ddc502344 /src/main/scala | |
| parent | d6abb875675ef0bb4461d2d8799657ff42830ea5 (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.scala | 13 |
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 |
