@@ -243,6 +243,10 @@ struct GowinGlobalRouter
243
243
bool driver_is_dqce (const PortRef &driver) { return CellTypePort (driver) == CellTypePort (id_DQCE, id_CLKOUT); }
244
244
bool driver_is_dcs (const PortRef &driver) { return CellTypePort (driver) == CellTypePort (id_DCS, id_CLKOUT); }
245
245
bool driver_is_dhcen (const PortRef &driver) { return CellTypePort (driver) == CellTypePort (id_DHCEN, id_CLKOUT); }
246
+ bool driver_is_mipi (const PortRef &driver)
247
+ {
248
+ return CellTypePort (driver) == CellTypePort (id_IOBUF, id_O) && driver.cell ->params .count (id_MIPI_IBUF);
249
+ }
246
250
bool driver_is_clksrc (const PortRef &driver)
247
251
{
248
252
// dedicated pins
@@ -506,7 +510,7 @@ struct GowinGlobalRouter
506
510
NPNR_ASSERT (net_before_dhcen != nullptr );
507
511
508
512
PortRef driver = net_before_dhcen->driver ;
509
- NPNR_ASSERT_MSG (driver_is_buf (driver) || driver_is_clksrc (driver),
513
+ NPNR_ASSERT_MSG (driver_is_buf (driver) || driver_is_clksrc (driver) || driver_is_mipi (driver) ,
510
514
stringf (" The input source for %s is not a clock." , ctx->nameOf (dhcen_ci)).c_str ());
511
515
512
516
IdString port;
@@ -519,8 +523,14 @@ struct GowinGlobalRouter
519
523
WireId src = ctx->getBelPinWire (driver.cell ->bel , port);
520
524
521
525
std::vector<PipId> path;
522
- RouteResult route_result = route_direct_net (
523
- net, [&](PipId pip, WireId src_wire) { return global_pip_filter (pip, src); }, src, &path);
526
+ RouteResult route_result;
527
+ if (driver_is_mipi (driver)) {
528
+ route_result = route_direct_net (net, [&](PipId pip, WireId src_wire) { return true ; }, src, &path);
529
+ } else {
530
+ route_result = route_direct_net (
531
+ net, [&](PipId pip, WireId src_wire) { return global_pip_filter (pip, src); }, src, &path);
532
+ }
533
+
524
534
if (route_result == NOT_ROUTED) {
525
535
log_error (" Can't route the %s network.\n " , ctx->nameOf (net));
526
536
}
@@ -557,6 +567,9 @@ struct GowinGlobalRouter
557
567
hw_dhcen->setAttr (id_DHCEN_USED, 1 );
558
568
dhcen_ci->copyPortTo (id_CE, hw_dhcen, id_CE);
559
569
}
570
+ if (driver_is_mipi (driver)) {
571
+ ctx->bindWire (src, net_before_dhcen, STRENGTH_LOCKED);
572
+ }
560
573
561
574
// connect all users to upper level net
562
575
std::vector<PortRef> users;
0 commit comments