@@ -44,6 +44,14 @@ struct GowinGlobalRouter
44
44
45
45
bool segment_wire_filter (PipId pip) const { return !gwu.is_segment_pip (pip); }
46
46
47
+ bool dcs_input_filter (PipId pip) const
48
+ {
49
+ return !ctx->getWireName (ctx->getPipSrcWire (pip))[1 ].in (
50
+ id_P16A, id_P16B, id_P16C, id_P16D, id_P17A, id_P17B, id_P17C, id_P17D, id_P26A, id_P26B, id_P26C,
51
+ id_P26D, id_P27A, id_P27B, id_P27C, id_P27D, id_P36A, id_P36B, id_P36C, id_P36D, id_P37A, id_P37B,
52
+ id_P37C, id_P37D, id_P46A, id_P46B, id_P46C, id_P46D, id_P47A, id_P47B, id_P47C, id_P47D);
53
+ }
54
+
47
55
// allow io->global, global->global and global->tile clock
48
56
bool global_pip_filter (PipId pip, WireId src_wire) const
49
57
{
@@ -372,7 +380,7 @@ struct GowinGlobalRouter
372
380
RouteResult route_result = route_direct_net (
373
381
net,
374
382
[&](PipId pip, WireId src_wire) {
375
- return global_DQCE_pip_filter (pip, src) && segment_wire_filter (pip);
383
+ return global_DQCE_pip_filter (pip, src) && segment_wire_filter (pip) && dcs_input_filter (pip) ;
376
384
},
377
385
src);
378
386
if (route_result == NOT_ROUTED) {
@@ -582,11 +590,14 @@ struct GowinGlobalRouter
582
590
RouteResult route_result;
583
591
if (driver_is_mipi (driver)) {
584
592
route_result = route_direct_net (
585
- net, [&](PipId pip, WireId src_wire) { return segment_wire_filter (pip); }, src, &path);
593
+ net, [&](PipId pip, WireId src_wire) { return segment_wire_filter (pip) && dcs_input_filter (pip); },
594
+ src, &path);
586
595
} else {
587
596
route_result = route_direct_net (
588
597
net,
589
- [&](PipId pip, WireId src_wire) { return global_pip_filter (pip, src) && segment_wire_filter (pip); },
598
+ [&](PipId pip, WireId src_wire) {
599
+ return global_pip_filter (pip, src) && segment_wire_filter (pip) && dcs_input_filter (pip);
600
+ },
590
601
src, &path);
591
602
}
592
603
@@ -659,7 +670,7 @@ struct GowinGlobalRouter
659
670
RouteResult route_result = route_direct_net (
660
671
net,
661
672
[&](PipId pip, WireId src_wire) {
662
- return global_pip_filter (pip, src_wire) && segment_wire_filter (pip);
673
+ return global_pip_filter (pip, src_wire) && segment_wire_filter (pip) && dcs_input_filter (pip) ;
663
674
},
664
675
src);
665
676
if (route_result == NOT_ROUTED || route_result == ROUTED_PARTIALLY) {
@@ -671,8 +682,9 @@ struct GowinGlobalRouter
671
682
CellInfo *true_src_ci = net_before_buf->driver .cell ;
672
683
src = ctx->getBelPinWire (true_src_ci->bel , net_before_buf->driver .port );
673
684
ctx->bindWire (src, net, STRENGTH_LOCKED);
674
- backwards_bfs_route (net, src, dst, 1000000 , false ,
675
- [&](PipId pip, WireId src_wire) { return segment_wire_filter (pip); });
685
+ backwards_bfs_route (net, src, dst, 1000000 , false , [&](PipId pip, WireId src_wire) {
686
+ return segment_wire_filter (pip) && dcs_input_filter (pip);
687
+ });
676
688
// remove net
677
689
buf_ci->movePortTo (id_O, true_src_ci, net_before_buf->driver .port );
678
690
net_before_buf->driver .cell = nullptr ;
@@ -683,7 +695,7 @@ struct GowinGlobalRouter
683
695
void route_clk_net (NetInfo *net)
684
696
{
685
697
RouteResult route_result = route_direct_net (net, [&](PipId pip, WireId src_wire) {
686
- return global_pip_filter (pip, src_wire) && segment_wire_filter (pip);
698
+ return global_pip_filter (pip, src_wire) && segment_wire_filter (pip) && dcs_input_filter (pip) ;
687
699
});
688
700
if (route_result != NOT_ROUTED) {
689
701
log_info (" '%s' net was routed using global resources %s.\n " , ctx->nameOf (net),
@@ -788,7 +800,8 @@ struct GowinGlobalRouter
788
800
log_info (" %s\n " , ctx->nameOfWire (gatewire));
789
801
}
790
802
routed = backwards_bfs_route (
791
- ni, src_wire, gatewire, 1000000 , false , [&](PipId pip, WireId src) { return true ; }, &bound_pips);
803
+ ni, src_wire, gatewire, 1000000 , false ,
804
+ [&](PipId pip, WireId src) { return dcs_input_filter (pip); }, &bound_pips);
792
805
if (routed) {
793
806
// bind src
794
807
if (ctx->checkWireAvail (src_wire)) {
0 commit comments