@@ -503,7 +503,8 @@ struct DesignEditRapidSilicon : public ScriptPass {
503503 if (in_bit.wire != nullptr )
504504 {
505505 remove_fab_prims.push_back (cell);
506- if (fab_ins.count (in_bit) && fab_outs.count (out_bit))
506+ if (new_ins.find (in_bit.wire ->name .str ()) != new_ins.end () &&
507+ new_outs.find (out_bit.wire ->name .str ()) != new_outs.end ())
507508 {
508509 RTLIL::SigSig new_conn;
509510 new_conn.first = out_bit;
@@ -534,7 +535,8 @@ struct DesignEditRapidSilicon : public ScriptPass {
534535 if (in_bit.wire != nullptr )
535536 {
536537 remove_fab_prims.push_back (cell);
537- if (fab_ins.count (in_bit) && fab_outs.count (out_bit))
538+ if (new_ins.find (in_bit.wire ->name .str ()) != new_ins.end () &&
539+ new_outs.find (out_bit.wire ->name .str ()) != new_outs.end ())
538540 {
539541 RTLIL::SigSig new_conn;
540542 new_conn.first = out_bit;
@@ -568,6 +570,7 @@ struct DesignEditRapidSilicon : public ScriptPass {
568570 if (cell->type == RTLIL::escape_id (" O_FAB" ) ||
569571 cell->type == RTLIL::escape_id (" I_FAB" )) continue ;
570572
573+ string module_name = remove_backslashes (cell->type .str ());
571574 for (auto conn : cell->connections ())
572575 {
573576 IdString portName = conn.first ;
@@ -577,22 +580,44 @@ struct DesignEditRapidSilicon : public ScriptPass {
577580 {
578581 if (ofab_sig_map.count (bit))
579582 {
580- const std::vector<RTLIL::SigBit> outbits = ofab_sig_map[bit];
581- if (outbits. size () < 1 ) sigspec. append (bit);
582- if (outbits. size () == 1 )
583+
584+ if (( std::find (primitives. begin (), primitives. end (), module_name) !=
585+ primitives. end ()) && cell-> input (portName) )
583586 {
587+ const std::vector<RTLIL::SigBit> outbits = ofab_sig_map[bit];
588+ RTLIL::SigSig new_conn;
589+ RTLIL::Wire *new_wire = mod->addWire (NEW_ID, 1 );
590+ new_outs.erase (bit.wire ->name .str ());
591+ new_outs.insert (new_wire->name .str ());
592+ new_conn.first = new_wire;
593+ new_conn.second = outbits[0 ];
594+ mod->connect (new_conn);
584595 if (unset_port)
585- {
586- cell->unsetPort (portName);
587- unset_port = false ;
588- }
589- sigspec.append (outbits[0 ]);
590- } else if (outbits.size () > 1 )
596+ {
597+ cell->unsetPort (portName);
598+ unset_port = false ;
599+ }
600+ sigspec.append (new_wire);
601+ }
602+ else
591603 {
592- sigspec.append (bit);
593- if (ofab_conns.find (bit) == ofab_conns.end ())
604+ const std::vector<RTLIL::SigBit> outbits = ofab_sig_map[bit];
605+ if (outbits.size () < 1 ) sigspec.append (bit);
606+ if (outbits.size () == 1 )
594607 {
595- ofab_conns.insert ({bit, outbits});
608+ if (unset_port)
609+ {
610+ cell->unsetPort (portName);
611+ unset_port = false ;
612+ }
613+ sigspec.append (outbits[0 ]);
614+ } else if (outbits.size () > 1 )
615+ {
616+ sigspec.append (bit);
617+ if (ofab_conns.find (bit) == ofab_conns.end ())
618+ {
619+ ofab_conns.insert ({bit, outbits});
620+ }
596621 }
597622 }
598623 } else {
@@ -1487,6 +1512,7 @@ struct DesignEditRapidSilicon : public ScriptPass {
14871512 elapsed_time (start, end);
14881513 intersection_copy_remove (new_ins, new_outs, interface_wires);
14891514 intersect (interface_wires, keep_wires);
1515+ remove_io_fab_prim (original_mod);
14901516 }
14911517
14921518 Module *wrapper_mod = original_mod->clone ();
@@ -1610,8 +1636,6 @@ struct DesignEditRapidSilicon : public ScriptPass {
16101636
16111637 get_fabric_ios (original_mod);
16121638
1613- remove_io_fab_prim (original_mod);
1614-
16151639 start = high_resolution_clock::now ();
16161640 log (" Deleting non-primitive cells\n " );
16171641 for (auto cell : wrapper_mod->cells ()) {
0 commit comments