diff options
| author | Adam Izraelevitz | 2016-11-21 13:30:11 -0800 |
|---|---|---|
| committer | GitHub | 2016-11-21 13:30:11 -0800 |
| commit | 9a967a27aa8bb51f4b62969d2889f9a9caa48e31 (patch) | |
| tree | dad7370c71df7ce8d4628f70b4079296bfee4d99 /src/main | |
| parent | aad8e09f355f4804d29361d75f54ce4a5c2d5c52 (diff) | |
Bugfix: exponential runtime of pull muxes (#379)
Diffstat (limited to 'src/main')
| -rw-r--r-- | src/main/scala/firrtl/passes/Passes.scala | 53 |
1 files changed, 25 insertions, 28 deletions
diff --git a/src/main/scala/firrtl/passes/Passes.scala b/src/main/scala/firrtl/passes/Passes.scala index 46e68d5c..87458a2b 100644 --- a/src/main/scala/firrtl/passes/Passes.scala +++ b/src/main/scala/firrtl/passes/Passes.scala @@ -54,35 +54,32 @@ object ToWorkingIR extends Pass { object PullMuxes extends Pass { def name = "Pull Muxes" def run(c: Circuit): Circuit = { - def pull_muxes_e(e: Expression): Expression = { - val exxx = e map pull_muxes_e match { - case ex: WSubField => ex.exp match { - case exx: Mux => Mux(exx.cond, - WSubField(exx.tval, ex.name, ex.tpe, ex.gender), - WSubField(exx.fval, ex.name, ex.tpe, ex.gender), ex.tpe) - case exx: ValidIf => ValidIf(exx.cond, - WSubField(exx.value, ex.name, ex.tpe, ex.gender), ex.tpe) - case _ => ex // case exx => exx causes failed tests - } - case ex: WSubIndex => ex.exp match { - case exx: Mux => Mux(exx.cond, - WSubIndex(exx.tval, ex.value, ex.tpe, ex.gender), - WSubIndex(exx.fval, ex.value, ex.tpe, ex.gender), ex.tpe) - case exx: ValidIf => ValidIf(exx.cond, - WSubIndex(exx.value, ex.value, ex.tpe, ex.gender), ex.tpe) - case _ => ex // case exx => exx causes failed tests - } - case ex: WSubAccess => ex.exp match { - case exx: Mux => Mux(exx.cond, - WSubAccess(exx.tval, ex.index, ex.tpe, ex.gender), - WSubAccess(exx.fval, ex.index, ex.tpe, ex.gender), ex.tpe) - case exx: ValidIf => ValidIf(exx.cond, - WSubAccess(exx.value, ex.index, ex.tpe, ex.gender), ex.tpe) - case _ => ex // case exx => exx causes failed tests - } - case ex => ex + def pull_muxes_e(e: Expression): Expression = e map pull_muxes_e match { + case ex: WSubField => ex.exp match { + case exx: Mux => Mux(exx.cond, + WSubField(exx.tval, ex.name, ex.tpe, ex.gender), + WSubField(exx.fval, ex.name, ex.tpe, ex.gender), ex.tpe) + case exx: ValidIf => ValidIf(exx.cond, + WSubField(exx.value, ex.name, ex.tpe, ex.gender), ex.tpe) + case _ => ex // case exx => exx causes failed tests } - exxx map pull_muxes_e + case ex: WSubIndex => ex.exp match { + case exx: Mux => Mux(exx.cond, + WSubIndex(exx.tval, ex.value, ex.tpe, ex.gender), + WSubIndex(exx.fval, ex.value, ex.tpe, ex.gender), ex.tpe) + case exx: ValidIf => ValidIf(exx.cond, + WSubIndex(exx.value, ex.value, ex.tpe, ex.gender), ex.tpe) + case _ => ex // case exx => exx causes failed tests + } + case ex: WSubAccess => ex.exp match { + case exx: Mux => Mux(exx.cond, + WSubAccess(exx.tval, ex.index, ex.tpe, ex.gender), + WSubAccess(exx.fval, ex.index, ex.tpe, ex.gender), ex.tpe) + case exx: ValidIf => ValidIf(exx.cond, + WSubAccess(exx.value, ex.index, ex.tpe, ex.gender), ex.tpe) + case _ => ex // case exx => exx causes failed tests + } + case ex => ex } def pull_muxes(s: Statement): Statement = s map pull_muxes map pull_muxes_e val modulesx = c.modules.map { |
