Skip to content

Commit 13be041

Browse files
committed
rsz: Caching drive resistance value.
Calculating drive resistance takes about 2.8 hours of the currently 30 hour runtime of our block. It's very expensive to calculate so we should cache it. Signed-off-by: Ethan Mahintorabi <[email protected]>
1 parent 3821007 commit 13be041

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

src/rsz/src/Rebuffer.cc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,17 @@ bool Rebuffer::bufferSizeCanDriveLoad(const BufferSize& size,
386386

387387
const float extra_cap = resizer_->dbuToMeters(extra_wire_length) * wire_cap
388388
+ outp->capacitance();
389-
const float r_drvr = outp->driveResistance();
389+
390+
// Cache the value of drive resistance since it's expensive to calculate.
391+
float r_drvr;
392+
auto it_drive_resistance = drive_resistance_cache_.find(outp);
393+
if (it_drive_resistance != drive_resistance_cache_.end()) {
394+
r_drvr = it_drive_resistance->second;
395+
} else {
396+
r_drvr = outp->driveResistance();
397+
drive_resistance_cache_[outp] = r_drvr;
398+
}
399+
390400
const float load_slew
391401
= (r_drvr
392402
+ resizer_->dbuToMeters(bnet->maxLoadWireLength() + extra_wire_length)

src/rsz/src/Rebuffer.hh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ class Rebuffer : public sta::dbStaState
138138

139139
std::vector<BufferSize> buffer_sizes_;
140140
std::map<LibertyCell*, BufferSize*> buffer_sizes_index_;
141+
std::unordered_map<LibertyPort*, float> drive_resistance_cache_;
141142

142143
Pin* pin_;
143144
float fanout_limit_;

0 commit comments

Comments
 (0)