File tree Expand file tree Collapse file tree 2 files changed +18
-5
lines changed
Expand file tree Collapse file tree 2 files changed +18
-5
lines changed Original file line number Diff line number Diff 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}
Original file line number Diff line number Diff 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 ();
You can’t perform that action at this time.
0 commit comments