@@ -335,6 +335,7 @@ void GlobalRouter::globalRoute(bool save_guides,
335335 } else {
336336 try {
337337 if (end_incremental) {
338+ fastroute_->setResistanceAware (resistance_aware_);
338339 updateDirtyRoutes ();
339340 grouter_cbk_->removeOwner ();
340341 delete grouter_cbk_;
@@ -818,11 +819,7 @@ void GlobalRouter::updateDirtyNets(std::vector<Net*>& dirty_nets)
818819 initRoutingLayers (min_layer, max_layer);
819820 for (odb::dbNet* db_net : dirty_nets_) {
820821 Net* net = db_net_map_[db_net];
821- net->destroyPins ();
822- // update pin positions
823- makeItermPins (net, db_net, grid_->getGridArea ());
824- makeBtermPins (net, db_net, grid_->getGridArea ());
825- findPins (net);
822+ updateNetPins (net);
826823 destroyNetWire (net);
827824 std::string pins_not_covered;
828825 // compare new positions with last positions & add on vector
@@ -4211,9 +4208,7 @@ Net* GlobalRouter::addNet(odb::dbNet* db_net)
42114208 delete db_net_map_[db_net];
42124209 }
42134210 db_net_map_[db_net] = net;
4214- makeItermPins (net, db_net, grid_->getGridArea ());
4215- makeBtermPins (net, db_net, grid_->getGridArea ());
4216- findPins (net);
4211+ updateNetPins (net);
42174212 return net;
42184213 }
42194214 return nullptr ;
@@ -4233,6 +4228,15 @@ void GlobalRouter::removeNet(odb::dbNet* db_net)
42334228 routes_.erase (db_net);
42344229}
42354230
4231+ void GlobalRouter::updateNetPins (Net* net)
4232+ {
4233+ odb::dbNet* db_net = net->getDbNet ();
4234+ net->destroyPins ();
4235+ makeItermPins (net, db_net, grid_->getGridArea ());
4236+ makeBtermPins (net, db_net, grid_->getGridArea ());
4237+ findPins (net);
4238+ }
4239+
42364240Net* GlobalRouter::getNet (odb::dbNet* db_net)
42374241{
42384242 return db_net_map_[db_net];
@@ -4908,22 +4912,29 @@ void GlobalRouter::mergeNetsRouting(odb::dbNet* db_net1, odb::dbNet* db_net2)
49084912{
49094913 Net* net1 = db_net_map_[db_net1];
49104914 Net* net2 = db_net_map_[db_net2];
4911- // Do not merge the routing if the survivor net is already dirty.
4912- if (!net1->isDirtyNet ()) {
4913- connectRouting (db_net1, db_net2);
4915+ // Try to connect the routing of the two nets
4916+ if (connectRouting (db_net1, db_net2)) {
49144917 net1->setIsMergedNet (true );
49154918 net1->setMergedNet (db_net2);
4919+ net1->setDirtyNet (false );
49164920 net2->setIsMergedNet (true );
49174921 net2->setMergedNet (db_net1);
4922+ } else {
4923+ // After failing to connect the routing, the survivor net still have
4924+ // uncovered pins and needs to be re-routed
4925+ net1->setDirtyNet (true );
49184926 }
49194927}
49204928
4921- void GlobalRouter::connectRouting (odb::dbNet* db_net1, odb::dbNet* db_net2)
4929+ bool GlobalRouter::connectRouting (odb::dbNet* db_net1, odb::dbNet* db_net2)
49224930{
49234931 Net* net1 = db_net_map_[db_net1];
49244932 Net* net2 = db_net_map_[db_net2];
49254933
4926- // find the pin positions in the buffer that connects the two nets
4934+ // Find the pin positions in the buffer that connects the two nets.
4935+ // At the time this function is called, the buffer information still preserved
4936+ // on GRT data structures, allowing us to use it to define the connection
4937+ // position.
49274938 odb::Point pin_pos1;
49284939 odb::Point pin_pos2;
49294940 findBufferPinPostions (net1, net2, pin_pos1, pin_pos2);
@@ -4940,6 +4951,10 @@ void GlobalRouter::connectRouting(odb::dbNet* db_net1, odb::dbNet* db_net2)
49404951 } else {
49414952 net1_route.insert (net1_route.end (), net2_route.begin (), net2_route.end ());
49424953 }
4954+
4955+ updateNetPins (net1);
4956+ std::string dump;
4957+ return netIsCovered (db_net1, dump);
49434958}
49444959
49454960void GlobalRouter::findBufferPinPostions (Net* net1,
@@ -5805,8 +5820,8 @@ void GRouteDbCbk::inDbNetDestroy(odb::dbNet* net)
58055820 grouter_->removeNet (net);
58065821}
58075822
5808- void GRouteDbCbk::inDbNetPreMerge (odb::dbNet* preserved_net,
5809- odb::dbNet* removed_net)
5823+ void GRouteDbCbk::inDbNetPostMerge (odb::dbNet* preserved_net,
5824+ odb::dbNet* removed_net)
58105825{
58115826 grouter_->mergeNetsRouting (preserved_net, removed_net);
58125827}
@@ -5815,9 +5830,7 @@ void GRouteDbCbk::inDbITermPreDisconnect(odb::dbITerm* iterm)
58155830{
58165831 odb::dbNet* db_net = iterm->getNet ();
58175832 if (db_net != nullptr && !db_net->isSpecial ()) {
5818- Net* net = grouter_->getNet (db_net);
58195833 grouter_->addDirtyNet (iterm->getNet ());
5820- net->destroyITermPin (iterm);
58215834 }
58225835}
58235836
@@ -5851,9 +5864,7 @@ void GRouteDbCbk::inDbBTermPreDisconnect(odb::dbBTerm* bterm)
58515864{
58525865 odb::dbNet* db_net = bterm->getNet ();
58535866 if (db_net != nullptr && !db_net->isSpecial ()) {
5854- Net* net = grouter_->getNet (db_net);
58555867 grouter_->addDirtyNet (bterm->getNet ());
5856- net->destroyBTermPin (bterm);
58575868 }
58585869}
58595870
0 commit comments