diff options
author | Marcelina KoĆcielnicka <mwk@0x04.net> | 2020-08-09 13:53:01 +0200 |
---|---|---|
committer | Marcelina KoĆcielnicka <mwk@0x04.net> | 2020-08-09 13:57:00 +0200 |
commit | 2ab350a7b01aab8f0ed39f518720d6e6792cd6d6 (patch) | |
tree | fd6ebe9f88b7687c9ecf32b1b84d75773717dc6f /passes | |
parent | 9a4f420b4b8285bd05181b6988c35ce45e3c979a (diff) | |
download | yosys-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.cc | 13 |
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()) |