diff options
author | whitequark <whitequark@whitequark.org> | 2018-12-23 09:04:23 +0000 |
---|---|---|
committer | whitequark <whitequark@whitequark.org> | 2018-12-23 09:04:30 +0000 |
commit | 18291c20d2b17689729d9c36b08967e928e4e32a (patch) | |
tree | 12137ac745879d7f4c9c9d00b6285b9a3f6c7d86 /passes/proc | |
parent | b784440857d6b71f46ae8784cc3767962e4edcaa (diff) | |
download | yosys-18291c20d2b17689729d9c36b08967e928e4e32a.tar.gz yosys-18291c20d2b17689729d9c36b08967e928e4e32a.tar.bz2 yosys-18291c20d2b17689729d9c36b08967e928e4e32a.zip |
proc_clean: remove any empty cases if all cases use all-def compare.
Diffstat (limited to 'passes/proc')
-rw-r--r-- | passes/proc/proc_clean.cc | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/passes/proc/proc_clean.cc b/passes/proc/proc_clean.cc index 477d1ac60..3919e4b9c 100644 --- a/passes/proc/proc_clean.cc +++ b/passes/proc/proc_clean.cc @@ -77,14 +77,36 @@ void proc_clean_switch(RTLIL::SwitchRule *sw, RTLIL::CaseRule *parent, bool &did } else { - for (auto cs : sw->cases) { + bool all_fully_def = true; + for (auto cs : sw->cases) + { if (max_depth != 0) proc_clean_case(cs, did_something, count, max_depth-1); + for (auto cmp : cs->compare) + if (!cmp.is_fully_def()) + all_fully_def = false; } - while (!sw->cases.empty() && (sw->cases.back()->actions.empty() && sw->cases.back()->switches.empty())) { - did_something = true; - delete sw->cases.back(); - sw->cases.pop_back(); + if (all_fully_def) + { + for (auto cs = sw->cases.begin(); cs != sw->cases.end();) + { + if ((*cs)->empty()) + { + did_something = true; + delete *cs; + cs = sw->cases.erase(cs); + } + else ++cs; + } + } + else + { + while (!sw->cases.empty() && sw->cases.back()->empty()) + { + did_something = true; + delete sw->cases.back(); + sw->cases.pop_back(); + } } } } @@ -102,7 +124,7 @@ void proc_clean_case(RTLIL::CaseRule *cs, bool &did_something, int &count, int m } for (size_t i = 0; i < cs->switches.size(); i++) { RTLIL::SwitchRule *sw = cs->switches[i]; - if (sw->cases.size() == 0) { + if (sw->empty()) { cs->switches.erase(cs->switches.begin() + (i--)); did_something = true; delete sw; |