aboutsummaryrefslogtreecommitdiffstats
path: root/passes/proc/proc_arst.cc
diff options
context:
space:
mode:
Diffstat (limited to 'passes/proc/proc_arst.cc')
-rw-r--r--passes/proc/proc_arst.cc12
1 files changed, 12 insertions, 0 deletions
diff --git a/passes/proc/proc_arst.cc b/passes/proc/proc_arst.cc
index d0a0d864c..021d87c81 100644
--- a/passes/proc/proc_arst.cc
+++ b/passes/proc/proc_arst.cc
@@ -23,6 +23,9 @@
#include <stdlib.h>
#include <stdio.h>
+// defined in proc_clean.cc
+extern void proc_clean_case(RTLIL::CaseRule *cs, bool &did_something, int &count, int max_depth);
+
static bool check_signal(RTLIL::Module *mod, RTLIL::SigSpec signal, RTLIL::SigSpec ref, bool &polarity)
{
if (signal.width != 1)
@@ -132,10 +135,18 @@ static void eliminate_const(RTLIL::Module *mod, RTLIL::CaseRule *cs, RTLIL::SigS
eliminate_const(mod, cs2, const_sig, polarity);
}
}
+
+ int dummy_count = 0;
+ bool did_something = true;
+ while (did_something) {
+ did_something = false;
+ proc_clean_case(cs, did_something, dummy_count, 1);
+ }
}
static void proc_arst(RTLIL::Module *mod, RTLIL::Process *proc, SigMap &assign_map)
{
+restart_proc_arst:
if (proc->root_case.switches.size() != 1)
return;
@@ -173,6 +184,7 @@ static void proc_arst(RTLIL::Module *mod, RTLIL::Process *proc, SigMap &assign_m
action.second = rval;
}
eliminate_const(mod, &proc->root_case, root_sig, polarity);
+ goto restart_proc_arst;
}
}
}