@@ -173,6 +173,41 @@ GlobalRouter::~GlobalRouter()
173173 delete rudy_;
174174}
175175
176+ std::vector<Net*> GlobalRouter::initNets (bool check_pin_placement)
177+ {
178+ std::vector<Net*> nets = findNets (true );
179+ check_pin_placement_ = check_pin_placement;
180+ if (check_pin_placement) {
181+ checkPinPlacement ();
182+ }
183+ initNetlist (nets);
184+ return nets;
185+ }
186+
187+ void GlobalRouter::initRoutingGrid (int min_routing_layer, int max_routing_layer)
188+ {
189+ initRoutingLayers (min_routing_layer, max_routing_layer);
190+ reportLayerSettings (min_routing_layer, max_routing_layer);
191+ initRoutingTracks (max_routing_layer);
192+ initCoreGrid (max_routing_layer);
193+ computeObstructionsAdjustments ();
194+ computeUserGlobalAdjustments (min_routing_layer, max_routing_layer);
195+ }
196+
197+ std::vector<Net*> GlobalRouter::initCUGR (int min_routing_layer,
198+ int max_routing_layer)
199+ {
200+ initRoutingGrid (min_routing_layer, max_routing_layer);
201+ std::vector<Net*> nets = initNets (true );
202+ initialized_ = true ;
203+ odb::PtrSet<odb::dbNet> clock_nets;
204+ findClockNets (nets, clock_nets);
205+
206+ cugr_->setCongestionIterations (congestion_iterations_);
207+ cugr_->init (min_routing_layer, max_routing_layer, clock_nets);
208+ return nets;
209+ }
210+
176211std::vector<Net*> GlobalRouter::initFastRoute (int min_routing_layer,
177212 int max_routing_layer,
178213 bool check_pin_placement)
@@ -195,12 +230,7 @@ std::vector<Net*> GlobalRouter::initFastRoute(int min_routing_layer,
195230 // Init the data structures to monitor 3D capacity during 2D phases
196231 fastroute_->initEdgesCapacityPerLayer ();
197232
198- std::vector<Net*> nets = findNets (true );
199- check_pin_placement_ = check_pin_placement;
200- if (check_pin_placement) {
201- checkPinPlacement ();
202- }
203- initNetlist (nets);
233+ std::vector<Net*> nets = initNets (check_pin_placement);
204234
205235 initialized_ = true ;
206236 return nets;
@@ -366,7 +396,11 @@ void GlobalRouter::startIncremental()
366396 if (!initialized_ || haveDetailedRoutes ()) {
367397 int min_layer, max_layer;
368398 getMinMaxLayer (min_layer, max_layer);
369- initFastRoute (min_layer, max_layer);
399+ if (use_cugr_) {
400+ initCUGR (min_layer, max_layer);
401+ } else {
402+ initFastRoute (min_layer, max_layer);
403+ }
370404 }
371405 grouter_cbk_ = new GRouteDbCbk (this );
372406 grouter_cbk_->addOwner (block_);
@@ -409,12 +443,8 @@ void GlobalRouter::globalRoute(bool save_guides)
409443 int min_layer, max_layer;
410444 getMinMaxLayer (min_layer, max_layer);
411445
412- std::vector<Net*> nets = initFastRoute (min_layer, max_layer);
413446 if (use_cugr_) {
414- odb::PtrSet<odb::dbNet> clock_nets;
415- findClockNets (nets, clock_nets);
416- cugr_->setCongestionIterations (congestion_iterations_);
417- cugr_->init (min_layer, max_layer, clock_nets);
447+ std::vector<Net*> nets = initCUGR (min_layer, max_layer);
418448 if (verbose_) {
419449 reportResources ();
420450 }
@@ -423,6 +453,7 @@ void GlobalRouter::globalRoute(bool save_guides)
423453 updatePinAccessPoints ();
424454 addRemainingGuides (routes_, nets, min_layer, max_layer);
425455 } else {
456+ std::vector<Net*> nets = initFastRoute (min_layer, max_layer);
426457 if (verbose_) {
427458 reportResources ();
428459 }
@@ -2498,7 +2529,11 @@ void GlobalRouter::configFastRoute()
24982529 GRT ,
24992530 300 ,
25002531 " Timing is not available, setting critical nets percentage to 0." );
2501- fastroute_->setCriticalNetsPercentage (0 );
2532+ if (use_cugr_) {
2533+ cugr_->setCriticalNetsPercentage (0 );
2534+ } else {
2535+ fastroute_->setCriticalNetsPercentage (0 );
2536+ }
25022537 }
25032538}
25042539
@@ -5389,6 +5424,13 @@ std::vector<odb::dbNet*> GlobalRouter::getNetsToRoute()
53895424
53905425void GlobalRouter::mergeNetsRouting (odb::dbNet* db_net1, odb::dbNet* db_net2)
53915426{
5427+ if (use_cugr_) {
5428+ // TODO: Fully support merging nets in CUGR.
5429+ // For now, we simply rip up and add the base net to the dirty list
5430+ // to be completely re-routed from scratch.
5431+ addDirtyNet (db_net1);
5432+ return ;
5433+ }
53925434 Net* net1 = db_net_map_[db_net1];
53935435 Net* net2 = db_net_map_[db_net2];
53945436 // Try to connect the routing of the two nets
@@ -6176,23 +6218,32 @@ AbstractGrouteRenderer* GlobalRouter::getRenderer()
61766218
61776219void GlobalRouter::addDirtyNet (odb::dbNet* net)
61786220{
6179- db_net_map_[net]->setDirtyNet (true );
6180- db_net_map_[net]->saveLastPinPositions ();
6181- dirty_nets_.insert (net);
6182- }
6183-
6184- void GlobalRouter::updateCUGRNet (odb::dbNet* net)
6185- {
6186- if (use_cugr_) {
6187- cugr_->updateNet (net);
6221+ auto it = db_net_map_.find (net);
6222+ if (it == db_net_map_.end ()) {
6223+ return ;
61886224 }
6225+
6226+ it->second ->setDirtyNet (true );
6227+ it->second ->saveLastPinPositions ();
6228+ dirty_nets_.insert (net);
61896229}
61906230
61916231std::vector<Net*> GlobalRouter::updateDirtyRoutes (bool save_guides)
61926232{
61936233 if (auto * pa = service_registry_->find <drt::PinAccessService>()) {
61946234 pa->updateDirtyPinAccess ();
61956235 }
6236+
6237+ if (use_cugr_) {
6238+ for (odb::dbNet* net : dirty_nets_) {
6239+ cugr_->updateNet (net);
6240+ }
6241+ dirty_nets_.clear ();
6242+ cugr_->routeIncremental ();
6243+ routes_ = cugr_->getRoutes ();
6244+ return {};
6245+ }
6246+
61966247 std::vector<Net*> dirty_nets;
61976248
61986249 if (!initialized_) {
0 commit comments