3838#include < vector>
3939
4040#include " BufferedNet.hh"
41+ #include " ResizerObserver.hh"
4142#include " db_sta/dbNetwork.hh"
4243#include " rsz/Resizer.hh"
4344#include " sta/Corner.hh"
@@ -670,7 +671,7 @@ void RepairDesign::repairNet(Net* net,
670671 repaired_net = true ;
671672
672673 debugPrint (logger_, RSZ, " repair_net" , 3 , " fanout violation" );
673- LoadRegion region = findLoadRegions (drvr_pin, max_fanout);
674+ LoadRegion region = findLoadRegions (net, drvr_pin, max_fanout);
674675 corner_ = corner;
675676 makeRegionRepeaters (region,
676677 max_fanout,
@@ -1480,12 +1481,21 @@ LoadRegion::LoadRegion(PinSeq& pins, Rect& bbox) : pins_(pins), bbox_(bbox)
14801481{
14811482}
14821483
1483- LoadRegion RepairDesign::findLoadRegions (const Pin* drvr_pin, int max_fanout)
1484+ LoadRegion RepairDesign::findLoadRegions (const Net* net,
1485+ const Pin* drvr_pin,
1486+ int max_fanout)
14841487{
14851488 PinSeq loads = findLoads (drvr_pin);
14861489 Rect bbox = findBbox (loads);
14871490 LoadRegion region (loads, bbox);
1491+ if (graphics_) {
1492+ odb::dbNet* db_net = db_network_->staToDb (net);
1493+ graphics_->subdivideStart (db_net);
1494+ }
14881495 subdivideRegion (region, max_fanout);
1496+ if (graphics_) {
1497+ graphics_->subdivideDone ();
1498+ }
14891499 return region;
14901500}
14911501
@@ -1498,17 +1508,20 @@ void RepairDesign::subdivideRegion(LoadRegion& region, int max_fanout)
14981508 int y_min = region.bbox_ .yMin ();
14991509 int y_max = region.bbox_ .yMax ();
15001510 region.regions_ .resize (2 );
1501- int64_t x_mid = (x_min + x_max) / 2 ;
1502- int64_t y_mid = (y_min + y_max) / 2 ;
1511+ int x_mid = (x_min + x_max) / 2 ;
1512+ int y_mid = (y_min + y_max) / 2 ;
15031513 bool horz_partition;
1514+ odb::Line cut;
15041515 if (region.bbox_ .dx () > region.bbox_ .dy ()) {
15051516 region.regions_ [0 ].bbox_ = Rect (x_min, y_min, x_mid, y_max);
15061517 region.regions_ [1 ].bbox_ = Rect (x_mid, y_min, x_max, y_max);
1518+ cut = odb::Line{x_mid, y_min, x_mid, y_max};
15071519 horz_partition = true ;
15081520 } else {
15091521 region.regions_ [0 ].bbox_ = Rect (x_min, y_min, x_max, y_mid);
15101522 region.regions_ [1 ].bbox_ = Rect (x_min, y_mid, x_max, y_max);
15111523 horz_partition = false ;
1524+ cut = odb::Line{x_min, y_mid, x_max, y_mid};
15121525 }
15131526 for (const Pin* pin : region.pins_ ) {
15141527 Point loc = db_network_->location (pin);
@@ -1523,6 +1536,9 @@ void RepairDesign::subdivideRegion(LoadRegion& region, int max_fanout)
15231536 logger_->critical (RSZ, 83 , " pin outside regions" );
15241537 }
15251538 }
1539+ if (graphics_) {
1540+ graphics_->subdivide (cut);
1541+ }
15261542 region.pins_ .clear ();
15271543 for (LoadRegion& sub : region.regions_ ) {
15281544 if (!sub.pins_ .empty ()) {
@@ -2233,4 +2249,9 @@ void RepairDesign::reportViolationCounters(bool invalidate_driver_vertices,
22332249 }
22342250}
22352251
2252+ void RepairDesign::setDebugGraphics (std::shared_ptr<ResizerObserver> graphics)
2253+ {
2254+ graphics_ = std::move (graphics);
2255+ }
2256+
22362257} // namespace rsz
0 commit comments