aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Waterman2016-04-07 15:07:23 -0700
committerAndrew Waterman2016-04-07 15:14:47 -0700
commitb3874120be90f194b39eee78b74b045146b74b31 (patch)
tree69f5f36582607f3966bcbcdb65e559d592794b79 /src
parent39974611ab6b70d9e86b4e6030bf31b6b80c4582 (diff)
Add constant propagation for muxes on UInt
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/firrtl/passes/Passes.scala17
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
}
}