Fixed handling of constant-true branches in proc_clean
authorClifford Wolf <clifford@clifford.at>
Tue, 12 Aug 2014 15:35:22 +0000 (17:35 +0200)
committerClifford Wolf <clifford@clifford.at>
Tue, 12 Aug 2014 15:35:22 +0000 (17:35 +0200)
passes/proc/proc_clean.cc
passes/proc/proc_rmdead.cc

index 13be0ddb635f334143e80013d9fec4140022259c..1e3dd9ce7c5ffee221311a16ad91c06644ed4d71 100644 (file)
@@ -59,7 +59,8 @@ void proc_clean_switch(RTLIL::SwitchRule *sw, RTLIL::CaseRule *parent, bool &did
                        sw->signal = RTLIL::SigSpec();
        }
 
-       if (sw->cases.size() == 1 && (sw->signal.size() == 0 || sw->cases[0]->compare.empty()))
+       if (parent->switches.front() == sw && sw->cases.size() == 1 &&
+                       (sw->signal.size() == 0 || sw->cases[0]->compare.empty()))
        {
                did_something = true;
                for (auto &action : sw->cases[0]->actions)
index 61844d5ebd8105f5bc833f259df4d5a42c7e0ae5..fe3532da8eca4614529043258d678597e39156b7 100644 (file)
@@ -31,7 +31,7 @@ static void proc_rmdead(RTLIL::SwitchRule *sw, int &counter)
 
        for (size_t i = 0; i < sw->cases.size(); i++)
        {
-               bool is_default = sw->cases[i]->compare.size() == 0 && !pool.empty();
+               bool is_default = SIZE(sw->cases[i]->compare) == 0 && (!pool.empty() || SIZE(sw->signal) == 0);
 
                for (size_t j = 0; j < sw->cases[i]->compare.size(); j++) {
                        RTLIL::SigSpec sig = sw->cases[i]->compare[j];