aboutsummaryrefslogtreecommitdiffstats
path: root/passes/proc
diff options
context:
space:
mode:
authorMarcelina Koƛcielnicka <mwk@0x04.net>2021-03-06 11:05:57 +0100
committerMarcelina Koƛcielnicka <mwk@0x04.net>2021-03-06 17:39:50 +0100
commitd245e2bae59d18eb641aa6b324eef1bbbfa13c38 (patch)
tree8634caf2113f127d9c966dfd537307dd67210d60 /passes/proc
parent3d2aef0bde5ee35d283da4b230430ffcb73ec176 (diff)
downloadyosys-d245e2bae59d18eb641aa6b324eef1bbbfa13c38.tar.gz
yosys-d245e2bae59d18eb641aa6b324eef1bbbfa13c38.tar.bz2
yosys-d245e2bae59d18eb641aa6b324eef1bbbfa13c38.zip
proc_clean: Fix empty case removal conditions.
Fixes #2639.
Diffstat (limited to 'passes/proc')
-rw-r--r--passes/proc/proc_clean.cc31
1 files changed, 21 insertions, 10 deletions
diff --git a/passes/proc/proc_clean.cc b/passes/proc/proc_clean.cc
index 5e78b7316..54d5a81ff 100644
--- a/passes/proc/proc_clean.cc
+++ b/passes/proc/proc_clean.cc
@@ -76,22 +76,33 @@ void proc_clean_switch(RTLIL::SwitchRule *sw, RTLIL::CaseRule *parent, bool &did
}
else
{
- bool all_fully_def = true;
for (auto cs : sw->cases)
- {
if (max_depth != 0)
proc_clean_case(cs, did_something, count, max_depth-1);
- int size = 0;
- for (auto cmp : cs->compare)
+
+ bool is_parallel_case = sw->get_bool_attribute(ID::parallel_case);
+ bool is_full_case = sw->get_bool_attribute(ID::full_case);
+
+ // Empty case removal. The rules are:
+ //
+ // - for full_case: only remove cases if *all* cases are empty
+ // - for parallel_case but not full_case: remove any empty case
+ // - for non-parallel and non-full case: remove the final case if it's empty
+
+ if (is_full_case)
+ {
+ bool all_empty = true;
+ for (auto cs : sw->cases)
+ if (!cs->empty())
+ all_empty = false;
+ if (all_empty)
{
- size += cmp.size();
- if (!cmp.is_fully_def())
- all_fully_def = false;
+ for (auto cs : sw->cases)
+ delete cs;
+ sw->cases.clear();
}
- if (sw->signal.size() != size)
- all_fully_def = false;
}
- if (all_fully_def)
+ else if (is_parallel_case)
{
for (auto cs = sw->cases.begin(); cs != sw->cases.end();)
{