diff options
author | Clifford Wolf <clifford@clifford.at> | 2015-08-18 13:50:15 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2015-08-18 13:50:15 +0200 |
commit | f43815054e9784d9e1a1b28b5ea2db8404c91d58 (patch) | |
tree | 244fa15cb18c79ca39d68755a9a7c6221b9f672f /passes/techmap/dffinit.cc | |
parent | a7ab9172f9f003a0552c9f6e7d8df7729bc1dbbb (diff) | |
download | yosys-f43815054e9784d9e1a1b28b5ea2db8404c91d58.tar.gz yosys-f43815054e9784d9e1a1b28b5ea2db8404c91d58.tar.bz2 yosys-f43815054e9784d9e1a1b28b5ea2db8404c91d58.zip |
Properly clean up unused "init" attributes
Diffstat (limited to 'passes/techmap/dffinit.cc')
-rw-r--r-- | passes/techmap/dffinit.cc | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/passes/techmap/dffinit.cc b/passes/techmap/dffinit.cc index 2215c18e5..84770ff3e 100644 --- a/passes/techmap/dffinit.cc +++ b/passes/techmap/dffinit.cc @@ -63,16 +63,26 @@ struct DffinitPass : public Pass { SigMap sigmap(module); dict<SigBit, State> init_bits; pool<SigBit> cleanup_bits; + pool<SigBit> used_bits; - for (auto wire : module->selected_wires()) + for (auto wire : module->selected_wires()) { if (wire->attributes.count("\\init")) { Const value = wire->attributes.at("\\init"); for (int i = 0; i < std::min(GetSize(value), GetSize(wire)); i++) init_bits[sigmap(SigBit(wire, i))] = value[i]; } + if (wire->port_output) + for (auto bit : sigmap(wire)) + used_bits.insert(bit); + } for (auto cell : module->selected_cells()) { + for (auto it : cell->connections()) + if (!cell->known() || cell->input(it.first)) + for (auto bit : sigmap(it.second)) + used_bits.insert(bit); + if (ff_types.count(cell->type) == 0) continue; @@ -104,11 +114,15 @@ struct DffinitPass : public Pass { for (auto wire : module->selected_wires()) if (wire->attributes.count("\\init")) { - Const value = wire->attributes.at("\\init"); + Const &value = wire->attributes.at("\\init"); bool do_cleanup = true; - for (int i = 0; i < std::min(GetSize(value), GetSize(wire)); i++) - if (cleanup_bits.count(sigmap(SigBit(wire, i))) == 0) + for (int i = 0; i < std::min(GetSize(value), GetSize(wire)); i++) { + SigBit bit = sigmap(SigBit(wire, i)); + if (cleanup_bits.count(bit) || !used_bits.count(bit)) + value[i] = State::Sx; + else if (value[i] != State::Sx) do_cleanup = false; + } if (do_cleanup) { log("Removing init attribute from wire %s.%s.\n", log_id(module), log_id(wire)); wire->attributes.erase("\\init"); |