aboutsummaryrefslogtreecommitdiffstats
path: root/passes
diff options
context:
space:
mode:
authorMarcelina Koƛcielnicka <mwk@0x04.net>2020-08-09 13:53:01 +0200
committerMarcelina Koƛcielnicka <mwk@0x04.net>2020-08-09 13:57:00 +0200
commit2ab350a7b01aab8f0ed39f518720d6e6792cd6d6 (patch)
treefd6ebe9f88b7687c9ecf32b1b84d75773717dc6f /passes
parent9a4f420b4b8285bd05181b6988c35ce45e3c979a (diff)
downloadyosys-2ab350a7b01aab8f0ed39f518720d6e6792cd6d6.tar.gz
yosys-2ab350a7b01aab8f0ed39f518720d6e6792cd6d6.tar.bz2
yosys-2ab350a7b01aab8f0ed39f518720d6e6792cd6d6.zip
opt_clean: Fix module keep rules.
- wires with keep attribute now force a module to be kept - presence of $memwr and $meminit cells no longer forces a module to be kept
Diffstat (limited to 'passes')
-rw-r--r--passes/opt/opt_clean.cc13
1 files changed, 9 insertions, 4 deletions
diff --git a/passes/opt/opt_clean.cc b/passes/opt/opt_clean.cc
index 44de60b48..5370881d3 100644
--- a/passes/opt/opt_clean.cc
+++ b/passes/opt/opt_clean.cc
@@ -55,7 +55,12 @@ struct keep_cache_t
if (!module->get_bool_attribute(ID::keep)) {
bool found_keep = false;
for (auto cell : module->cells())
- if (query(cell, true /* ignore_specify */)) {
+ if (query(cell, true /* ignore_specify_mem */)) {
+ found_keep = true;
+ break;
+ }
+ for (auto wire : module->wires())
+ if (wire->get_bool_attribute(ID::keep)) {
found_keep = true;
break;
}
@@ -65,12 +70,12 @@ struct keep_cache_t
return cache[module];
}
- bool query(Cell *cell, bool ignore_specify = false)
+ bool query(Cell *cell, bool ignore_specify_mem = false)
{
- if (cell->type.in(ID($memwr), ID($meminit), ID($assert), ID($assume), ID($live), ID($fair), ID($cover)))
+ if (cell->type.in(ID($assert), ID($assume), ID($live), ID($fair), ID($cover)))
return true;
- if (!ignore_specify && cell->type.in(ID($specify2), ID($specify3), ID($specrule)))
+ if (!ignore_specify_mem && cell->type.in(ID($memwr), ID($meminit), ID($specify2), ID($specify3), ID($specrule)))
return true;
if (cell->has_keep_attr())