File tree Expand file tree Collapse file tree 2 files changed +15
-0
lines changed
Expand file tree Collapse file tree 2 files changed +15
-0
lines changed Original file line number Diff line number Diff line change @@ -89,6 +89,12 @@ void RepairDesign::init()
8989 parasitics_src_ = estimate_parasitics_->getParasiticsSrc ();
9090 initial_design_area_ = resizer_->computeDesignArea ();
9191 computeSlewRCFactor ();
92+
93+ r_strongest_buffer_ = std::numeric_limits<float >::max ();
94+ for (auto buffer : resizer_->buffer_cells_ ) {
95+ r_strongest_buffer_ = std::min (r_strongest_buffer_,
96+ resizer_->bufferDriveResistance (buffer));
97+ }
9298}
9399
94100void RepairDesign::computeSlewRCFactor ()
@@ -1452,6 +1458,13 @@ void RepairDesign::repairNetWire(
14521458
14531459 // Calculate estimated slew based on Elmore
14541460 float r_drvr = resizer_->driveResistance (drvr_pin_);
1461+
1462+ // For top ports without a specified input drive, r_drvr is zero
1463+ // which can make us miss the buffer insertion point. Clip r_drvr
1464+ // to be no smaller than the drive resistance of the beefiest buffer
1465+ // to address this.
1466+ r_drvr = std::max (r_drvr, r_strongest_buffer_);
1467+
14551468 double r_wire = length1 * wire_res;
14561469 double c_wire = length1 * wire_cap;
14571470
Original file line number Diff line number Diff line change @@ -269,6 +269,8 @@ class RepairDesign : dbStaState
269269 int print_interval_ = 0 ;
270270 std::shared_ptr<ResizerObserver> graphics_;
271271
272+ float r_strongest_buffer_ = 0 ;
273+
272274 // Shape factor: what we need to multiply the RC product with
273275 // to get a slew estimate
274276 float slew_rc_factor_ = 0 ;
You can’t perform that action at this time.
0 commit comments