diff options
| author | Andrew Waterman | 2016-04-07 15:07:23 -0700 |
|---|---|---|
| committer | Andrew Waterman | 2016-04-07 15:14:47 -0700 |
| commit | b3874120be90f194b39eee78b74b045146b74b31 (patch) | |
| tree | 69f5f36582607f3966bcbcdb65e559d592794b79 /src | |
| parent | 39974611ab6b70d9e86b4e6030bf31b6b80c4582 (diff) | |
Add constant propagation for muxes on UInt
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/scala/firrtl/passes/Passes.scala | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/passes/Passes.scala b/src/main/scala/firrtl/passes/Passes.scala index 5c4fbaf6..4f947202 100644 --- a/src/main/scala/firrtl/passes/Passes.scala +++ b/src/main/scala/firrtl/passes/Passes.scala @@ -1267,9 +1267,26 @@ object ConstProp extends Pass { case _ => e } + private def constPropMuxCond(m: Mux) = (m.cond, tpe(m.tval), tpe(m.fval), m.tpe) match { + case (c: UIntValue, ttpe: UIntType, ftpe: UIntType, mtpe: UIntType) => + if (c.value == 1 && ttpe == mtpe) m.tval + else if (c.value == 0 && ftpe == mtpe) m.fval + else m + case _ => m + } + + private def constPropMux(m: Mux): Expression = (m.tval, m.fval) match { + case (t: UIntValue, f: UIntValue) => + if (t == f) t + else if (t.value == 1 && f.value == 0 && long_BANG(m.tpe) == 1) m.cond + else constPropMuxCond(m) + case _ => constPropMuxCond(m) + } + private def constPropExpression(e: Expression): Expression = { e map constPropExpression match { case p: DoPrim => constPropPrim(p) + case m: Mux => constPropMux(m) case x => x } } |
