Skip to content

Commit eb5d890

Browse files
authored
Merge pull request #10683 from sparsh-karna/auto-odb-callback-cugr
grt, rsz: automatic ODB-callback wiring for CUGR and CI log fix
2 parents d6d29f5 + 68065d0 commit eb5d890

18 files changed

Lines changed: 302 additions & 56 deletions

src/grt/include/grt/GlobalRouter.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,6 @@ class GlobalRouter
237237
// Incremental global routing functions.
238238
// See class IncrementalGRoute.
239239
void addDirtyNet(odb::dbNet* net);
240-
void updateCUGRNet(odb::dbNet* net);
241240
odb::PtrSet<odb::dbNet> getDirtyNets() { return dirty_nets_; }
242241
// check_antennas
243242
bool haveRoutes();
@@ -375,6 +374,9 @@ class GlobalRouter
375374
bool horizontal);
376375
odb::Rect getGCellRect(int x, int y);
377376
void initNetlist(std::vector<Net*>& nets, bool incremental = false);
377+
std::vector<Net*> initNets(bool check_pin_placement = true);
378+
void initRoutingGrid(int min_routing_layer, int max_routing_layer);
379+
std::vector<Net*> initCUGR(int min_routing_layer, int max_routing_layer);
378380
void makeFastrouteNet(Net* net);
379381
bool pinPositionsChanged(Net* net);
380382
bool newPinOnGrid(Net* net, std::multiset<RoutePt>& last_pos);

src/grt/src/GlobalRouter.cpp

Lines changed: 73 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
176211
std::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

53905425
void 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

61776219
void 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

61916231
std::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_) {

src/grt/src/GlobalRouter.i

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -176,19 +176,7 @@ set_infinite_cap(bool infinite_capacity)
176176
getGlobalRouter()->setInfiniteCapacity(infinite_capacity);
177177
}
178178

179-
void
180-
add_dirty_net(odb::dbNet* net)
181-
{
182-
if (net != nullptr) {
183-
getGlobalRouter()->addDirtyNet(net);
184-
}
185-
}
186179

187-
void
188-
update_cugr_net(odb::dbNet* net)
189-
{
190-
getGlobalRouter()->updateCUGRNet(net);
191-
}
192180

193181
void start_incremental()
194182
{

src/grt/src/GlobalRouter.tcl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,15 @@ proc global_route { args } {
176176
utl::error GRT 52 "Missing dbBlock."
177177
}
178178

179-
grt::set_use_cugr [info exists flags(-use_cugr)]
179+
# Only update the use_cugr flag when not in incremental start/end mode.
180+
# During -start_incremental / -end_incremental, preserve the flag that was
181+
# set during the initial global_route call.
182+
set is_inc_start [info exists flags(-start_incremental)]
183+
set is_inc_end [info exists flags(-end_incremental)]
184+
set is_incremental_bracket [expr { $is_inc_start || $is_inc_end }]
185+
if { !$is_incremental_bracket } {
186+
grt::set_use_cugr [info exists flags(-use_cugr)]
187+
}
180188

181189
grt::set_verbose [info exists flags(-verbose)]
182190

src/grt/src/cugr/src/CUGR.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -971,6 +971,9 @@ void CUGR::getBTermsAccessPoints(
971971

972972
void CUGR::addDirtyNet(odb::dbNet* net)
973973
{
974+
if (!design_) {
975+
return;
976+
}
974977
auto it = db_net_map_.find(net);
975978
if (it != db_net_map_.end()) {
976979
GRNet* gr_net = it->second;
@@ -987,6 +990,9 @@ void CUGR::addDirtyNet(odb::dbNet* net)
987990

988991
void CUGR::updateNet(odb::dbNet* db_net)
989992
{
993+
if (!design_) {
994+
return;
995+
}
990996
auto it = db_net_map_.find(db_net);
991997
if (it != db_net_map_.end()) {
992998
GRNet* gr_net = it->second;
@@ -1016,6 +1022,9 @@ void CUGR::updateNet(odb::dbNet* db_net)
10161022

10171023
void CUGR::removeNet(odb::dbNet* db_net)
10181024
{
1025+
if (!design_) {
1026+
return;
1027+
}
10191028
auto it = db_net_map_.find(db_net);
10201029
if (it == db_net_map_.end()) {
10211030
design_->removeNet(db_net);
@@ -1293,8 +1302,6 @@ void CUGR::routeIncremental()
12931302
}
12941303
route();
12951304
}
1296-
1297-
printStatistics();
12981305
}
12991306

13001307
} // namespace grt

src/grt/test/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ TESTS = [
3535
"gcd_flute",
3636
"increase_capacity1",
3737
"incremental_deleted_net",
38+
"incremental_repair_cugr",
3839
"incremental_update_net",
3940
"infinite_cap",
4041
"inst_pin_out_of_die",

src/grt/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ or_integration_tests(
3232
gcd_flute
3333
increase_capacity1
3434
incremental_deleted_net
35+
incremental_repair_cugr
3536
incremental_update_net
3637
infinite_cap
3738
inst_pin_out_of_die

src/grt/test/cugr_adjustment1.ok

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
[INFO ODB-0130] Created 54 pins.
44
[INFO ODB-0131] Created 676 components and 2850 component-terminals.
55
[INFO ODB-0133] Created 579 nets and 1498 connections.
6-
[WARNING GRT-0300] Timing is not available, setting critical nets percentage to 0.
76
[INFO GRT-0020] Min routing layer: metal2
87
[INFO GRT-0021] Max routing layer: metal10
98
[INFO GRT-0022] Global adjustment: 50%

src/grt/test/cugr_adjustment2.ok

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
[INFO ODB-0130] Created 54 pins.
44
[INFO ODB-0131] Created 676 components and 2850 component-terminals.
55
[INFO ODB-0133] Created 579 nets and 1498 connections.
6-
[WARNING GRT-0300] Timing is not available, setting critical nets percentage to 0.
76
[INFO GRT-0020] Min routing layer: metal2
87
[INFO GRT-0021] Max routing layer: metal10
98
[INFO GRT-0022] Global adjustment: 0%

src/grt/test/cugr_adjustment3.ok

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
[INFO ODB-0130] Created 54 pins.
44
[INFO ODB-0131] Created 676 components and 2850 component-terminals.
55
[INFO ODB-0133] Created 579 nets and 1498 connections.
6-
[WARNING GRT-0300] Timing is not available, setting critical nets percentage to 0.
76
[INFO GRT-0020] Min routing layer: metal2
87
[INFO GRT-0021] Max routing layer: metal10
98
[INFO GRT-0022] Global adjustment: 0%

0 commit comments

Comments
 (0)