parse_xaiger() to cope with multi bit inouts
authorEddie Hung <eddieh@ece.ubc.ca>
Tue, 26 Feb 2019 19:37:34 +0000 (11:37 -0800)
committerEddie Hung <eddieh@ece.ubc.ca>
Tue, 26 Feb 2019 19:37:34 +0000 (11:37 -0800)
frontends/aiger/aigerparse.cc

index 8f0338f7e7b343b6ae10bc4051bcd3c0a8de6cc5..9a9f2b2d8bc5b8e6af8d5516eba9fca6d77ce070 100644 (file)
@@ -380,11 +380,22 @@ void AigerReader::parse_xaiger()
             else if (c == 'o') wire = outputs[l1];
             else log_abort();
 
+            if (wideports && (wire->port_input || wire->port_output)) {
+                RTLIL::IdString escaped_symbol;
+                int index;
+                std::tie(escaped_symbol,index) = wideports_split(RTLIL::escape_id(s));
+                if (escaped_symbol.size() > 10 && escaped_symbol.substr(escaped_symbol.size()-10) == "$inout.out") {
+                    deferred_inouts.emplace_back(wire, stringf("%s[%d]", escaped_symbol.substr(0, escaped_symbol.size()-10).c_str(), index));
+                    goto next_line;
+                }
+            }
+
             if (s.size() > 10 && s.substr(s.size()-10) == "$inout.out")
                 deferred_inouts.emplace_back(wire, RTLIL::escape_id(s.substr(0, s.size()-10)));
             else
                 deferred_renames.emplace_back(wire, RTLIL::escape_id(s));
 
+next_line:
             std::getline(f, line); // Ignore up to start of next line
             ++line_count;
         }