Skip to content

Commit f7a0892

Browse files
committed
odb, rsz: Fixed incorrect BTerm iteration in mergeNet(). Changed a wrong code sequence in removeBuffer().
- Fixes #8093 Signed-off-by: Jaehyun Kim <[email protected]>
1 parent 0aa066a commit f7a0892

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

src/odb/src/db/dbNet.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2234,6 +2234,9 @@ void dbNet::mergeNet(dbNet* in_net)
22342234
_dbNet* net = (_dbNet*) this;
22352235
_dbBlock* block = (_dbBlock*) net->getOwner();
22362236

2237+
// in_net->getITerms() returns a terminal iterator, andibterm->connect() can
2238+
// invalidate the iterator by disconnecting a dbITerm. So storing all dbITerms
2239+
// is needed for safe dbITerms iteration.
22372240
std::vector<dbITerm*> iterms;
22382241
for (dbITerm* iterm : in_net->getITerms()) {
22392242
iterms.push_back(iterm);
@@ -2247,7 +2250,15 @@ void dbNet::mergeNet(dbNet* in_net)
22472250
iterm->connect(this);
22482251
}
22492252

2253+
// in_net->getBTerms() returns an BTerm iterator, and bterm->connect() can
2254+
// invalidate the iterator by disconnecting a dbBTerm. So storing all BTerms
2255+
// is needed for safe BTerms iteration.
2256+
std::vector<dbBTerm*> bterms;
22502257
for (dbBTerm* bterm : in_net->getBTerms()) {
2258+
bterms.push_back(bterm);
2259+
}
2260+
2261+
for (dbBTerm* bterm : bterms) {
22512262
bterm->connect(this);
22522263
}
22532264
}

src/rsz/src/UnbufferMove.cc

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ void UnbufferMove::removeBuffer(Instance* buffer)
405405
}
406406
}
407407

408-
// Remove buffer from the database and handle the nets
408+
// Disconnect the buffer and handle the nets
409409
debugPrint(logger_,
410410
RSZ,
411411
"remove_buffer",
@@ -423,10 +423,6 @@ void UnbufferMove::removeBuffer(Instance* buffer)
423423
}
424424
sta_->disconnectPin(in_pin);
425425
sta_->disconnectPin(out_pin);
426-
sta_->deleteInstance(buffer);
427-
if (removed) {
428-
sta_->deleteNet(removed);
429-
}
430426

431427
// Hierarchical case supported:
432428
// moving an output hierarchical net to the input pin driver.
@@ -447,6 +443,12 @@ void UnbufferMove::removeBuffer(Instance* buffer)
447443
db_network_->connectPin(driver_pin, db_network_->dbToSta(op_modnet));
448444
}
449445

446+
// Deletion
447+
sta_->deleteInstance(buffer);
448+
if (removed) {
449+
sta_->deleteNet(removed);
450+
}
451+
450452
estimate_parasitics_->removeNetFromParasiticsInvalid(removed);
451453
estimate_parasitics_->parasiticsInvalid(survivor);
452454
estimate_parasitics_->updateParasitics();

0 commit comments

Comments
 (0)