read_aiger to cope with non-unique POs
authorEddie Hung <eddieh@ece.ubc.ca>
Tue, 19 Feb 2019 23:14:08 +0000 (15:14 -0800)
committerEddie Hung <eddieh@ece.ubc.ca>
Tue, 19 Feb 2019 23:14:08 +0000 (15:14 -0800)
frontends/aiger/aigerparse.cc

index a1bdcbfffc64ad873d051934852a900159db8eaf..94189931640dbb4814b9c072cefa87434c22071c 100644 (file)
@@ -650,12 +650,19 @@ void AigerReader::parse_aiger_binary()
         }
         else {
             log_debug("%d is an output\n", l1);
-            wire = createWireIfNotExists(module, l1);
-        }
-        if (wire->port_input) {
-            RTLIL::Wire *new_wire = module->addWire(NEW_ID);
-            module->connect(new_wire, wire);
-            wire = new_wire;
+            const unsigned variable = l1 >> 1;
+            const bool invert = l1 & 1;
+            RTLIL::IdString wire_name(stringf("\\n%d%s", variable, invert ? "_inv" : "")); // FIXME: is "_inv" the right suffix?
+            wire = module->wire(wire_name);
+            if (!wire)
+                wire = createWireIfNotExists(module, l1);
+            else {
+                if ((wire->port_input || wire->port_output)) {
+                    RTLIL::Wire *new_wire = module->addWire(stringf("\\o%zu", outputs.size()));
+                    module->connect(new_wire, wire);
+                    wire = new_wire;
+                }
+            }
         }
         wire->port_output = true;
         outputs.push_back(wire);