Bugfixes in handling of "keep" attribute on wires

This commit is contained in:
Clifford Wolf 2015-10-15 14:57:28 +02:00
parent 5dd3e93e8f
commit 1d83854d84
2 changed files with 8 additions and 2 deletions

View File

@ -136,7 +136,7 @@ struct OptMuxtreeWorker
} }
} }
for (auto wire : module->wires()) { for (auto wire : module->wires()) {
if (wire->port_output) if (wire->port_output || wire->get_bool_attribute("\\keep"))
for (int idx : sig2bits(RTLIL::SigSpec(wire))) for (int idx : sig2bits(RTLIL::SigSpec(wire)))
bit2info[idx].seen_non_mux = true; bit2info[idx].seen_non_mux = true;
} }

View File

@ -51,6 +51,7 @@ struct WreduceWorker
std::set<Cell*, IdString::compare_ptr_by_name<Cell>> work_queue_cells; std::set<Cell*, IdString::compare_ptr_by_name<Cell>> work_queue_cells;
std::set<SigBit> work_queue_bits; std::set<SigBit> work_queue_bits;
pool<SigBit> keep_bits;
WreduceWorker(WreduceConfig *config, Module *module) : WreduceWorker(WreduceConfig *config, Module *module) :
config(config), module(module), mi(module) { } config(config), module(module), mi(module) { }
@ -68,7 +69,7 @@ struct WreduceWorker
for (int i = GetSize(sig_y)-1; i >= 0; i--) for (int i = GetSize(sig_y)-1; i >= 0; i--)
{ {
auto info = mi.query(sig_y[i]); auto info = mi.query(sig_y[i]);
if (!info->is_output && GetSize(info->ports) <= 1) { if (!info->is_output && GetSize(info->ports) <= 1 && !keep_bits.count(mi.sigmap(sig_y[i]))) {
bits_removed.push_back(Sx); bits_removed.push_back(Sx);
continue; continue;
} }
@ -265,6 +266,11 @@ struct WreduceWorker
void run() void run()
{ {
for (auto w : module->wires())
if (w->get_bool_attribute("\\keep"))
for (auto bit : mi.sigmap(w))
keep_bits.insert(bit);
for (auto c : module->selected_cells()) for (auto c : module->selected_cells())
work_queue_cells.insert(c); work_queue_cells.insert(c);