Skip to content

Commit 2b0ea76

Browse files
committed
rsz: Fix for top ports without specified drive
Signed-off-by: Martin Povišer <[email protected]>
1 parent da1ad39 commit 2b0ea76

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

src/rsz/src/RepairDesign.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff 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

94100
void 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

src/rsz/src/RepairDesign.hh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff 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;

0 commit comments

Comments
 (0)