@@ -510,7 +510,8 @@ struct DesignEditRapidSilicon : public ScriptPass {
510
510
if (in_bit.wire != nullptr )
511
511
{
512
512
remove_fab_prims.push_back (cell);
513
- if (fab_ins.count (in_bit) && fab_outs.count (out_bit))
513
+ if (new_ins.find (in_bit.wire ->name .str ()) != new_ins.end () &&
514
+ new_outs.find (out_bit.wire ->name .str ()) != new_outs.end ())
514
515
{
515
516
RTLIL::SigSig new_conn;
516
517
new_conn.first = out_bit;
@@ -541,7 +542,8 @@ struct DesignEditRapidSilicon : public ScriptPass {
541
542
if (in_bit.wire != nullptr )
542
543
{
543
544
remove_fab_prims.push_back (cell);
544
- if (fab_ins.count (in_bit) && fab_outs.count (out_bit))
545
+ if (new_ins.find (in_bit.wire ->name .str ()) != new_ins.end () &&
546
+ new_outs.find (out_bit.wire ->name .str ()) != new_outs.end ())
545
547
{
546
548
RTLIL::SigSig new_conn;
547
549
new_conn.first = out_bit;
@@ -575,6 +577,7 @@ struct DesignEditRapidSilicon : public ScriptPass {
575
577
if (cell->type == RTLIL::escape_id (" O_FAB" ) ||
576
578
cell->type == RTLIL::escape_id (" I_FAB" )) continue ;
577
579
580
+ string module_name = remove_backslashes (cell->type .str ());
578
581
for (auto conn : cell->connections ())
579
582
{
580
583
IdString portName = conn.first ;
@@ -584,22 +587,44 @@ struct DesignEditRapidSilicon : public ScriptPass {
584
587
{
585
588
if (ofab_sig_map.count (bit))
586
589
{
587
- const std::vector<RTLIL::SigBit> outbits = ofab_sig_map[bit];
588
- if (outbits. size () < 1 ) sigspec. append (bit);
589
- if (outbits. size () == 1 )
590
+
591
+ if (( std::find (primitives. begin (), primitives. end (), module_name) !=
592
+ primitives. end ()) && cell-> input (portName) )
590
593
{
594
+ const std::vector<RTLIL::SigBit> outbits = ofab_sig_map[bit];
595
+ RTLIL::SigSig new_conn;
596
+ RTLIL::Wire *new_wire = mod->addWire (NEW_ID, 1 );
597
+ new_outs.erase (bit.wire ->name .str ());
598
+ new_outs.insert (new_wire->name .str ());
599
+ new_conn.first = new_wire;
600
+ new_conn.second = outbits[0 ];
601
+ mod->connect (new_conn);
591
602
if (unset_port)
592
- {
593
- cell->unsetPort (portName);
594
- unset_port = false ;
595
- }
596
- sigspec.append (outbits[0 ]);
597
- } else if (outbits.size () > 1 )
603
+ {
604
+ cell->unsetPort (portName);
605
+ unset_port = false ;
606
+ }
607
+ sigspec.append (new_wire);
608
+ }
609
+ else
598
610
{
599
- sigspec.append (bit);
600
- if (ofab_conns.find (bit) == ofab_conns.end ())
611
+ const std::vector<RTLIL::SigBit> outbits = ofab_sig_map[bit];
612
+ if (outbits.size () < 1 ) sigspec.append (bit);
613
+ if (outbits.size () == 1 )
614
+ {
615
+ if (unset_port)
616
+ {
617
+ cell->unsetPort (portName);
618
+ unset_port = false ;
619
+ }
620
+ sigspec.append (outbits[0 ]);
621
+ } else if (outbits.size () > 1 )
601
622
{
602
- ofab_conns.insert ({bit, outbits});
623
+ sigspec.append (bit);
624
+ if (ofab_conns.find (bit) == ofab_conns.end ())
625
+ {
626
+ ofab_conns.insert ({bit, outbits});
627
+ }
603
628
}
604
629
}
605
630
} else {
@@ -1683,6 +1708,7 @@ struct DesignEditRapidSilicon : public ScriptPass {
1683
1708
elapsed_time (start, end);
1684
1709
intersection_copy_remove (new_ins, new_outs, interface_wires);
1685
1710
intersect (interface_wires, keep_wires);
1711
+ remove_io_fab_prim (original_mod);
1686
1712
}
1687
1713
1688
1714
Module *interface_mod = _design->top_module ()->clone ();
@@ -1844,8 +1870,6 @@ struct DesignEditRapidSilicon : public ScriptPass {
1844
1870
1845
1871
get_fabric_ios (original_mod);
1846
1872
1847
- remove_io_fab_prim (original_mod);
1848
-
1849
1873
start = high_resolution_clock::now ();
1850
1874
log (" Deleting non-primitive cells and upgrading wires to ports in interface module\n " );
1851
1875
for (auto cell : interface_mod->cells ()) {
0 commit comments