aboutsummaryrefslogtreecommitdiffstats
path: root/backends/aiger/xaiger.cc
diff options
context:
space:
mode:
authorEddie Hung <eddie@fpgeh.com>2019-04-23 16:11:14 -0700
committerEddie Hung <eddie@fpgeh.com>2019-04-23 16:11:39 -0700
commitac2aff9e28a087a9a2697cd6ccf754af738903a7 (patch)
treefe44f2a947768d15d88e44c149a762bd75d9e2b8 /backends/aiger/xaiger.cc
parentd9c915042a610672e313f976cdbcbf9a814c380d (diff)
downloadyosys-ac2aff9e28a087a9a2697cd6ccf754af738903a7.tar.gz
yosys-ac2aff9e28a087a9a2697cd6ccf754af738903a7.tar.bz2
yosys-ac2aff9e28a087a9a2697cd6ccf754af738903a7.zip
Fix abc9 with (* keep *) wires
Diffstat (limited to 'backends/aiger/xaiger.cc')
-rw-r--r--backends/aiger/xaiger.cc20
1 files changed, 14 insertions, 6 deletions
diff --git a/backends/aiger/xaiger.cc b/backends/aiger/xaiger.cc
index a881b1b88..7126002f6 100644
--- a/backends/aiger/xaiger.cc
+++ b/backends/aiger/xaiger.cc
@@ -134,6 +134,8 @@ struct XAigerWriter
init_map[initsig[i]] = initval[i] == State::S1;
}
+ bool keep = wire->attributes.count("\\keep");
+
for (int i = 0; i < GetSize(wire); i++)
{
SigBit wirebit(wire, i);
@@ -152,8 +154,10 @@ struct XAigerWriter
if (wire->port_input)
input_bits.insert(bit);
+ else if (keep)
+ input_bits.insert(wirebit);
- if (wire->port_output) {
+ if (wire->port_output || keep) {
if (bit != wirebit)
alias_map[wirebit] = bit;
output_bits.insert(wirebit);
@@ -365,10 +369,12 @@ struct XAigerWriter
for (auto bit : input_bits) {
RTLIL::Wire *wire = bit.wire;
- // If encountering an inout port, then create a new wire with $inout.out
- // suffix, make it a PO driven by the existing inout, and inherit existing
- // inout's drivers
- if (wire->port_input && wire->port_output && !undriven_bits.count(bit)) {
+ // If encountering an inout port, or a keep-ed wire, then create a new wire
+ // with $inout.out suffix, make it a PO driven by the existing inout, and
+ // inherit existing inout's drivers
+ if ((wire->port_input && wire->port_output && !undriven_bits.count(bit))
+ || wire->attributes.count("\\keep")) {
+ log_assert(input_bits.count(bit) && output_bits.count(bit));
RTLIL::Wire *new_wire = module->wire(wire->name.str() + "$inout.out");
if (!new_wire)
new_wire = module->addWire(wire->name.str() + "$inout.out", GetSize(wire));
@@ -381,7 +387,9 @@ struct XAigerWriter
else if (alias_map.count(bit))
alias_map[new_bit] = alias_map.at(bit);
else
+ //log_abort();
alias_map[new_bit] = bit;
+ output_bits.erase(bit);
output_bits.insert(new_bit);
}
}
@@ -820,7 +828,7 @@ struct XAigerWriter
{
RTLIL::SigBit b(wire, i);
if (input_bits.count(b)) {
- int a = aig_map.at(sig[i]);
+ int a = aig_map.at(b);
log_assert((a & 1) == 0);
input_lines[a] += stringf("input %d %d %s\n", (a >> 1)-1, i, log_id(wire));
}