Skip to content

Commit ff08057

Browse files
authored
Merge pull request The-OpenROAD-Project#7464 from The-OpenROAD-Project-staging/rsz-cbk-parasitics
rsz: Rely on odb callback for all parasitics invalidation
2 parents 49ac76d + ca295fb commit ff08057

File tree

13 files changed

+306
-347
lines changed

13 files changed

+306
-347
lines changed

src/rsz/include/rsz/Resizer.hh

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ class SizeDownMove;
118118
class SizeUpMove;
119119
class SwapPinsMove;
120120
class UnbufferMove;
121+
class RegisterOdbCallbackGuard;
121122

122123
class NetHash
123124
{
@@ -409,7 +410,7 @@ class Resizer : public dbStaState, public dbNetworkObserver
409410

410411
dbNetwork* getDbNetwork() { return db_network_; }
411412
ParasiticsSrc getParasiticsSrc() { return parasitics_src_; }
412-
void setParasiticsSrc(ParasiticsSrc src) { parasitics_src_ = src; }
413+
void setParasiticsSrc(ParasiticsSrc src);
413414
dbBlock* getDbBlock() { return block_; };
414415
double dbuToMeters(int dist) const;
415416
int metersToDbu(double dist) const;
@@ -421,7 +422,6 @@ class Resizer : public dbStaState, public dbNetworkObserver
421422
void journalBeginTest();
422423
void journalRestoreTest();
423424
Logger* logger() const { return logger_; }
424-
void invalidateParasitics(const Pin* pin, const Net* net);
425425
void eraseParasitics(const Net* net);
426426
void eliminateDeadLogic(bool clean_nets);
427427
std::optional<float> cellLeakage(LibertyCell* cell);
@@ -728,6 +728,7 @@ class Resizer : public dbStaState, public dbNetworkObserver
728728

729729
ParasiticsSrc parasitics_src_ = ParasiticsSrc::none;
730730
UnorderedSet<const Net*, NetHash> parasitics_invalid_;
731+
bool incremental_parasitics_enabled_ = false;
731732

732733
double design_area_ = 0.0;
733734
const MinMax* min_ = MinMax::min();
@@ -783,9 +784,6 @@ class Resizer : public dbStaState, public dbNetworkObserver
783784
sta::UnorderedMap<LibertyPort*, InputSlews> input_slew_map_;
784785

785786
std::unique_ptr<OdbCallBack> db_cbk_;
786-
bool is_callback_registered_ = false;
787-
bool isCallBackRegistered() { return is_callback_registered_; }
788-
void setCallBackRegistered(bool val) { is_callback_registered_ = val; }
789787

790788
// Restrict default sizing such that one sizing move cannot increase area or
791789
// leakage by more than 4X. Subsequent sizing moves can exceed the 4X limit.
@@ -837,6 +835,18 @@ class Resizer : public dbStaState, public dbNetworkObserver
837835
friend class CloneMove;
838836
friend class SwapPinsMove;
839837
friend class UnbufferMove;
838+
friend class IncrementalParasiticsGuard;
839+
};
840+
841+
class IncrementalParasiticsGuard
842+
{
843+
public:
844+
IncrementalParasiticsGuard(Resizer* resizer);
845+
~IncrementalParasiticsGuard();
846+
847+
private:
848+
Resizer* resizer_;
849+
bool need_unregister_;
840850
};
841851

842852
} // namespace rsz

src/rsz/src/BaseMove.cc

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -678,20 +678,6 @@ bool BaseMove::replaceCell(Instance* inst, const LibertyCell* replacement)
678678
|| resizer_->getParasiticsSrc() == ParasiticsSrc::detailed_routing) {
679679
opendp_->legalCellPos(db_network_->staToDb(inst));
680680
}
681-
if (resizer_->haveEstimatedParasitics()) {
682-
auto pin_iter
683-
= std::unique_ptr<InstancePinIterator>(network_->pinIterator(inst));
684-
while (pin_iter->hasNext()) {
685-
const Pin* pin = pin_iter->next();
686-
const Net* net = network_->net(pin);
687-
odb::dbNet* db_net = nullptr;
688-
odb::dbModNet* db_modnet = nullptr;
689-
db_network_->staToDb(net, db_net, db_modnet);
690-
// only work on dbnets
691-
resizer_->invalidateParasitics(pin, db_network_->dbToSta(db_net));
692-
// invalidateParasitics(pin, net);
693-
}
694-
}
695681

696682
return true;
697683
}

src/rsz/src/CloneMove.cc

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,6 @@ bool CloneMove::doMove(const Path* drvr_path,
229229
if (modnet) {
230230
iterm->connect(modnet);
231231
}
232-
resizer_->parasiticsInvalid(db_network_->dbToSta(dbnet));
233232
}
234233
}
235234

@@ -284,8 +283,6 @@ bool CloneMove::doMove(const Path* drvr_path,
284283
}
285284
}
286285
}
287-
resizer_->parasiticsInvalid(out_net);
288-
resizer_->parasiticsInvalid(network_->net(drvr_pin));
289286
return true;
290287
}
291288

src/rsz/src/EstimateWireParasitics.cc

Lines changed: 8 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -279,43 +279,15 @@ bool Resizer::haveEstimatedParasitics() const
279279
return parasitics_src_ != ParasiticsSrc::none;
280280
}
281281

282-
void Resizer::incrementalParasiticsBegin()
283-
{
284-
switch (parasitics_src_) {
285-
case ParasiticsSrc::placement:
286-
break;
287-
case ParasiticsSrc::global_routing:
288-
case ParasiticsSrc::detailed_routing:
289-
// TODO: add IncrementalDRoute
290-
incr_groute_ = new IncrementalGRoute(global_router_, block_);
291-
// Don't print verbose messages for incremental routing
292-
global_router_->setVerbose(false);
293-
break;
294-
case ParasiticsSrc::none:
295-
break;
296-
}
297-
parasitics_invalid_.clear();
298-
}
299-
300-
void Resizer::incrementalParasiticsEnd()
282+
void Resizer::updateParasitics(bool save_guides)
301283
{
302-
switch (parasitics_src_) {
303-
case ParasiticsSrc::placement:
304-
break;
305-
case ParasiticsSrc::global_routing:
306-
case ParasiticsSrc::detailed_routing:
307-
// TODO: add IncrementalDRoute
308-
delete incr_groute_;
309-
incr_groute_ = nullptr;
310-
break;
311-
case ParasiticsSrc::none:
312-
break;
284+
if (!incremental_parasitics_enabled_) {
285+
logger_->error(
286+
RSZ,
287+
109,
288+
"updateParasitics() called with incremental parasitics disabled");
313289
}
314-
parasitics_invalid_.clear();
315-
}
316290

317-
void Resizer::updateParasitics(bool save_guides)
318-
{
319291
switch (parasitics_src_) {
320292
case ParasiticsSrc::placement:
321293
for (const Net* net : parasitics_invalid_) {
@@ -327,7 +299,6 @@ void Resizer::updateParasitics(bool save_guides)
327299
}
328300
estimateWireParasitic(net);
329301
}
330-
parasitics_invalid_.clear();
331302
break;
332303
case ParasiticsSrc::global_routing:
333304
case ParasiticsSrc::detailed_routing: {
@@ -336,12 +307,13 @@ void Resizer::updateParasitics(bool save_guides)
336307
for (const Net* net : parasitics_invalid_) {
337308
global_router_->estimateRC(db_network_->staToDb(net));
338309
}
339-
parasitics_invalid_.clear();
340310
break;
341311
}
342312
case ParasiticsSrc::none:
343313
break;
344314
}
315+
316+
parasitics_invalid_.clear();
345317
}
346318

347319
bool Resizer::parasiticsValid() const

src/rsz/src/OdbCallBack.cc

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#include <memory>
1818

1919
#include "rsz/Resizer.hh"
20+
#include "sta/Liberty.hh"
21+
#include "sta/PortDirection.hh"
2022

2123
namespace rsz {
2224

@@ -115,14 +117,22 @@ void OdbCallBack::inDbInstSwapMasterAfter(dbInst* inst)
115117
"inDbInstSwapMasterAfter {}",
116118
inst->getName());
117119
Instance* sta_inst = db_network_->dbToSta(inst);
120+
121+
// Invalidate estimated parasitics on all instance pins.
118122
std::unique_ptr<InstancePinIterator> pin_iter{
119123
network_->pinIterator(sta_inst)};
120124
while (pin_iter->hasNext()) {
121125
Pin* pin = pin_iter->next();
122126
Net* net = network_->net(pin);
123-
// we can only update parasitics for flat net
124-
odb::dbNet* db_net = db_network_->flatNet(net);
125-
resizer_->parasiticsInvalid(db_network_->dbToSta(db_net));
127+
128+
const LibertyPort* port = network_->libertyPort(pin);
129+
// Tristate nets have multiple drivers and this is drivers^2 if
130+
// the parasitics are updated for each resize.
131+
if (!port || !port->direction()->isAnyTristate()) {
132+
// we can only update parasitics for flat net
133+
odb::dbNet* db_net = db_network_->flatNet(net);
134+
resizer_->parasiticsInvalid(db_network_->dbToSta(db_net));
135+
}
126136
}
127137
}
128138

src/rsz/src/Rebuffer.cc

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -735,11 +735,8 @@ Slack BufferMove::slackAtDriverPin(const BufferedNetPtr& bnet,
735735
void BufferMove::rebufferNet(const Pin* drvr_pin)
736736
{
737737
init();
738-
resizer_->incrementalParasiticsBegin();
738+
IncrementalParasiticsGuard guard(resizer_);
739739
int inserted_buffer_count_ = rebuffer(drvr_pin);
740-
// Leave the parasitics up to date.
741-
resizer_->updateParasitics();
742-
resizer_->incrementalParasiticsEnd();
743740
logger_->report("Inserted {} buffers.", inserted_buffer_count_);
744741
}
745742

@@ -1004,15 +1001,6 @@ int BufferMove::rebufferTopDown(const BufferedNetPtr& choice,
10041001
const int buffer_count = rebufferTopDown(
10051002
choice->ref(), net2, level + 1, parent, buffer_op_iterm, mod_net_in);
10061003

1007-
// ip_net
1008-
odb::dbNet* db_net = nullptr;
1009-
odb::dbModNet* db_modnet = nullptr;
1010-
db_network_->staToDb(net, db_net, db_modnet);
1011-
resizer_->parasiticsInvalid(db_network_->dbToSta(db_net));
1012-
1013-
db_network_->staToDb(net2, db_net, db_modnet);
1014-
resizer_->parasiticsInvalid(db_network_->dbToSta(db_net));
1015-
10161004
return buffer_count + 1;
10171005
}
10181006

@@ -1116,8 +1104,6 @@ int BufferMove::rebufferTopDown(const BufferedNetPtr& choice,
11161104
}
11171105

11181106
// sta_->connectPin(load_inst, load_port, net);
1119-
resizer_->parasiticsInvalid(db_network_->dbToSta(db_net));
1120-
// resizer_->parasiticsInvalid(load_net);
11211107
}
11221108
return 0;
11231109
}

src/rsz/src/RecoverPower.cc

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ bool RecoverPower::recoverPower(const float recover_power_percent, bool verbose)
9898

9999
int end_index = 0;
100100
int failed_move_threshold = 0;
101+
IncrementalParasiticsGuard guard(resizer_);
101102
for (Vertex* end : ends_with_slack) {
102103
resizer_->journalBegin();
103104
const Slack end_slack_before = sta_->vertexSlack(end, max_);
@@ -218,11 +219,12 @@ Vertex* RecoverPower::recoverPower(const Pin* end_pin)
218219
Vertex* vertex = graph_->pinLoadVertex(end_pin);
219220
const Slack slack = sta_->vertexSlack(vertex, max_);
220221
const Path* path = sta_->vertexWorstSlackPath(vertex, max_);
221-
resizer_->incrementalParasiticsBegin();
222-
Vertex* drvr_vertex = recoverPower(path, slack);
223-
// Leave the parasitices up to date.
224-
resizer_->updateParasitics();
225-
resizer_->incrementalParasiticsEnd();
222+
Vertex* drvr_vertex;
223+
224+
{
225+
IncrementalParasiticsGuard guard(resizer_);
226+
drvr_vertex = recoverPower(path, slack);
227+
}
226228

227229
if (resize_count_ > 0) {
228230
logger_->info(RSZ, 3111, "Resized {} instances.", resize_count_);

0 commit comments

Comments
 (0)