Handle reset logic in latches
authorEddie Hung <eddieh@ece.ubc.ca>
Fri, 8 Feb 2019 16:37:18 +0000 (08:37 -0800)
committerEddie Hung <eddieh@ece.ubc.ca>
Fri, 8 Feb 2019 16:37:18 +0000 (08:37 -0800)
frontends/aiger/aigerparse.cc

index 0414d3db3272d6b8cfdd174d4238c536686ceb67..c3cc6b32121ee9fe0aca8ab0c9ef2a9737f2107b 100644 (file)
@@ -134,8 +134,23 @@ static void parse_aiger_ascii(RTLIL::Design *design, std::istream &f, std::strin
         RTLIL::Wire *d_wire = createWireIfNotExists(l2);
 
         module->addDff(NEW_ID, clk_wire, d_wire, q_wire);
-        // AIGER latches are assumed to be initialized to zero
-        q_wire->attributes["\\init"] = RTLIL::Const(0);
+
+        if (f.peek() == ' ') {
+            if (!(f >> l3))
+                log_error("Line %d cannot be interpreted as a latch!\n", line_count);
+
+            if (l3 == 0 || l3 == 1)
+                q_wire->attributes["\\init"] = RTLIL::Const(0);
+            else if (l3 == l1) {
+                //q_wire->attributes["\\init"] = RTLIL::Const(RTLIL::State::Sx);
+            }
+            else
+                log_error("Line %d has invalid reset literal for latch!\n", line_count);
+        }
+        else {
+            // AIGER latches are assumed to be initialized to zero
+            q_wire->attributes["\\init"] = RTLIL::Const(0);
+        }
         latches.push_back(q_wire);
     }