Skip to content

Commit b57dad1

Browse files
authored
Merge pull request #8225 from The-OpenROAD-Project-staging/grt-antenna-underflow-fix
grt: underflow after repair antennas fix
2 parents 1c8ae07 + 85c703e commit b57dad1

File tree

9 files changed

+206
-57
lines changed

9 files changed

+206
-57
lines changed

src/grt/include/grt/GlobalRouter.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,8 @@ class GlobalRouter
187187
bool hasAvailableResources(bool is_horizontal,
188188
const int& pos_x,
189189
const int& pos_y,
190-
const int& layer_level);
190+
const int& layer_level,
191+
odb::dbNet* db_net);
191192
odb::Point getPositionOnGrid(const odb::Point& real_position);
192193
int repairAntennas(odb::dbMTerm* diode_mterm,
193194
int iterations,
@@ -198,7 +199,15 @@ class GlobalRouter
198199
const int& final_x,
199200
const int& final_y,
200201
const int& layer_level,
201-
int used);
202+
int used,
203+
odb::dbNet* db_net);
204+
void updateFastRouteGridsLayer(const int& init_x,
205+
const int& init_y,
206+
const int& final_x,
207+
const int& final_y,
208+
const int& layer_level,
209+
const int& new_layer_level,
210+
odb::dbNet* db_net);
202211
// Incremental global routing functions.
203212
// See class IncrementalGRoute.
204213
void addDirtyNet(odb::dbNet* net);

src/grt/src/GlobalRouter.cpp

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,6 @@ int GlobalRouter::repairAntennas(odb::dbMTerm* diode_mterm,
481481
for (odb::dbNet* db_net : dirty_nets_) {
482482
nets_to_repair.push_back(db_net);
483483
}
484-
fastroute_->clearNDRnets();
485484
incr_groute.updateRoutes();
486485
saveGuides(nets_to_repair);
487486
}
@@ -1663,7 +1662,8 @@ void GlobalRouter::computeRegionAdjustments(const odb::Rect& region,
16631662
bool GlobalRouter::hasAvailableResources(bool is_horizontal,
16641663
const int& pos_x,
16651664
const int& pos_y,
1666-
const int& layer_level)
1665+
const int& layer_level,
1666+
odb::dbNet* db_net)
16671667
{
16681668
// transform from real position to grid pos of fastroute
16691669
int grid_x = (int) ((pos_x - grid_->getXMin()) / grid_->getTileSize());
@@ -1676,7 +1676,7 @@ bool GlobalRouter::hasAvailableResources(bool is_horizontal,
16761676
cap = fastroute_->getAvailableResources(
16771677
grid_x, grid_y, grid_x, grid_y + 1, layer_level);
16781678
}
1679-
return cap > 0;
1679+
return cap >= fastroute_->getDbNetLayerEdgeCost(db_net, layer_level);
16801680
}
16811681

16821682
// Find the position of the middle of a GCell closest to the position
@@ -1690,7 +1690,8 @@ void GlobalRouter::updateResources(const int& init_x,
16901690
const int& final_x,
16911691
const int& final_y,
16921692
const int& layer_level,
1693-
int used)
1693+
int used,
1694+
odb::dbNet* db_net)
16941695
{
16951696
// transform from real position to grid pos of fastrouter
16961697
int grid_init_x = (int) ((init_x - grid_->getXMin()) / grid_->getTileSize());
@@ -1699,8 +1700,39 @@ void GlobalRouter::updateResources(const int& init_x,
16991700
= (int) ((final_x - grid_->getXMin()) / grid_->getTileSize());
17001701
int grid_final_y
17011702
= (int) ((final_y - grid_->getYMin()) / grid_->getTileSize());
1702-
fastroute_->updateEdge2DAnd3DUsage(
1703-
grid_init_x, grid_init_y, grid_final_x, grid_final_y, layer_level, used);
1703+
1704+
fastroute_->updateEdge2DAnd3DUsage(grid_init_x,
1705+
grid_init_y,
1706+
grid_final_x,
1707+
grid_final_y,
1708+
layer_level,
1709+
used,
1710+
db_net);
1711+
}
1712+
1713+
void GlobalRouter::updateFastRouteGridsLayer(const int& init_x,
1714+
const int& init_y,
1715+
const int& final_x,
1716+
const int& final_y,
1717+
const int& layer_level,
1718+
const int& new_layer_level,
1719+
odb::dbNet* db_net)
1720+
{
1721+
// transform from real position to grid pos of fastrouter
1722+
int grid_init_x = (int) ((init_x - grid_->getXMin()) / grid_->getTileSize());
1723+
int grid_init_y = (int) ((init_y - grid_->getYMin()) / grid_->getTileSize());
1724+
int grid_final_x
1725+
= (int) ((final_x - grid_->getXMin()) / grid_->getTileSize());
1726+
int grid_final_y
1727+
= (int) ((final_y - grid_->getYMin()) / grid_->getTileSize());
1728+
// update treeedges
1729+
fastroute_->updateRouteGridsLayer(grid_init_x,
1730+
grid_init_y,
1731+
grid_final_x,
1732+
grid_final_y,
1733+
layer_level - 1,
1734+
new_layer_level - 1,
1735+
db_net);
17041736
}
17051737

17061738
// Use release flag to increase rather than reduce resources on obstruction

src/grt/src/RepairAntennas.cpp

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,8 @@ void RepairAntennas::addJumperAndVias(GRoute& route,
584584
const int& init_y,
585585
const int& final_x,
586586
const int& final_y,
587-
const int& layer_level)
587+
const int& layer_level,
588+
odb::dbNet* db_net)
588589
{
589590
// Create vias (at the start and end of the jumper)
590591
for (int layer = layer_level; layer < layer_level + 2; layer++) {
@@ -601,17 +602,22 @@ void RepairAntennas::addJumperAndVias(GRoute& route,
601602
layer_level + 2,
602603
true));
603604
// Reducing usage in the layer level
604-
grouter_->updateResources(init_x, init_y, final_x, final_y, layer_level, -1);
605+
grouter_->updateResources(
606+
init_x, init_y, final_x, final_y, layer_level, -1, db_net);
605607
// Increasing usage in the layer level + 2
606608
grouter_->updateResources(
607-
init_x, init_y, final_x, final_y, layer_level + 2, 1);
609+
init_x, init_y, final_x, final_y, layer_level + 2, 1, db_net);
610+
// Update FastRoute Tree Edges
611+
grouter_->updateFastRouteGridsLayer(
612+
init_x, init_y, final_x, final_y, layer_level, layer_level + 2, db_net);
608613
}
609614

610615
void RepairAntennas::addJumperToRoute(GRoute& route,
611616
const int& seg_id,
612617
const int& jumper_init_pos,
613618
const int& jumper_final_pos,
614-
const int& layer_level)
619+
const int& layer_level,
620+
odb::dbNet* db_net)
615621
{
616622
const int seg_init_x = route[seg_id].init_x;
617623
const int seg_init_y = route[seg_id].init_y;
@@ -639,7 +645,8 @@ void RepairAntennas::addJumperToRoute(GRoute& route,
639645
jumper_init_y,
640646
jumper_final_x,
641647
jumper_final_y,
642-
layer_level);
648+
layer_level,
649+
db_net);
643650
// Divide segment (new segment is added before jumper insertion)
644651
route.push_back(GSegment(seg_init_x,
645652
seg_init_y,
@@ -654,7 +661,8 @@ void RepairAntennas::addJumperToRoute(GRoute& route,
654661

655662
void RepairAntennas::addJumper(GRoute& route,
656663
const int& segment_id,
657-
const int& jumper_pos)
664+
const int& jumper_pos,
665+
odb::dbNet* db_net)
658666
{
659667
odb::dbTech* tech = db_->getTech();
660668
const int segment_layer_level = route[segment_id].init_layer;
@@ -666,14 +674,22 @@ void RepairAntennas::addJumper(GRoute& route,
666674
// Get start and final X position of jumper
667675
const int jumper_start_x = jumper_pos;
668676
const int jumper_final_x = jumper_start_x + jumper_size_;
669-
addJumperToRoute(
670-
route, segment_id, jumper_start_x, jumper_final_x, segment_layer_level);
677+
addJumperToRoute(route,
678+
segment_id,
679+
jumper_start_x,
680+
jumper_final_x,
681+
segment_layer_level,
682+
db_net);
671683
} else {
672684
// Get start and final Y position jumper
673685
const int jumper_start_y = jumper_pos;
674686
const int jumper_final_y = jumper_start_y + jumper_size_;
675-
addJumperToRoute(
676-
route, segment_id, jumper_start_y, jumper_final_y, segment_layer_level);
687+
addJumperToRoute(route,
688+
segment_id,
689+
jumper_start_y,
690+
jumper_final_y,
691+
segment_layer_level,
692+
db_net);
677693
}
678694
}
679695

@@ -902,7 +918,8 @@ bool RepairAntennas::findPosToJumper(const GRoute& route,
902918
LayerToSegmentNodeVector& segment_graph,
903919
const SegmentNode& seg_node,
904920
const odb::Point& parent_pos,
905-
int& jumper_position)
921+
int& jumper_position,
922+
odb::dbNet* db_net)
906923
{
907924
jumper_position = -1;
908925
const GSegment& seg = route[seg_node.seg_id];
@@ -936,7 +953,7 @@ bool RepairAntennas::findPosToJumper(const GRoute& route,
936953
while (pos_x <= seg_final_x && pos_y <= seg_final_y) {
937954
// Check if the position has resources available
938955
has_available_resources = grouter_->hasAvailableResources(
939-
is_horizontal, pos_x, pos_y, layer_level + 2);
956+
is_horizontal, pos_x, pos_y, layer_level + 2, db_net);
940957
is_via = (is_horizontal && via_pos.find(pos_x) != via_pos.end())
941958
|| (!is_horizontal && via_pos.find(pos_y) != via_pos.end());
942959
// If the position has vias or does not have resources
@@ -987,7 +1004,8 @@ void RepairAntennas::findSegments(const GRoute& route,
9871004
LayerToSegmentNodeVector& segment_graph,
9881005
const int& num_nodes,
9891006
const int& violation_layer,
990-
SegmentToJumperPos& segments_to_repair)
1007+
SegmentToJumperPos& segments_to_repair,
1008+
odb::dbNet* db_net)
9911009
{
9921010
// Init stack and vector of visited and parent position
9931011
std::stack<std::pair<odb::dbTechLayer*, SegmentNode>> node_stack;
@@ -1033,7 +1051,8 @@ void RepairAntennas::findSegments(const GRoute& route,
10331051
segment_graph,
10341052
cur_node,
10351053
parent_pos[cur_node.node_id],
1036-
jumper_pos);
1054+
jumper_pos,
1055+
db_net);
10371056
// If jumper wasnt added, then explore adjacent segment nodes
10381057
if (is_found) {
10391058
segments_to_repair[cur_node.seg_id].insert(jumper_pos);
@@ -1084,7 +1103,8 @@ void RepairAntennas::getViolations(
10841103

10851104
int RepairAntennas::addJumperOnSegments(
10861105
const SegmentToJumperPos& segments_to_repair,
1087-
GRoute& route)
1106+
GRoute& route,
1107+
odb::dbNet* db_net)
10881108
{
10891109
int jumper_by_net = 0;
10901110
// Iterate all jumper positions on segments
@@ -1099,11 +1119,11 @@ int RepairAntennas::addJumperOnSegments(
10991119
// Avoid overlap with last jumper position
11001120
const int dist = abs(last_pos_aux - pos_it);
11011121
if (dist > jumper_size_) {
1102-
addJumper(route, seg_it.first, pos_it);
1122+
addJumper(route, seg_it.first, pos_it, db_net);
11031123
jumper_by_net++;
11041124
}
11051125
} else {
1106-
addJumper(route, seg_it.first, pos_it);
1126+
addJumper(route, seg_it.first, pos_it, db_net);
11071127
jumper_by_net++;
11081128
}
11091129
last_pos_aux = pos_it;
@@ -1160,14 +1180,16 @@ void RepairAntennas::jumperInsertion(NetRouteMap& routing,
11601180
segment_graph,
11611181
num_nodes,
11621182
layer_level,
1163-
segments_to_repair);
1183+
segments_to_repair,
1184+
db_net);
11641185
}
11651186
}
11661187
required_jumper_by_net = segments_to_repair.size();
11671188
}
11681189
if (required_jumper_by_net > 0) {
11691190
// Add jumper in found segment positions
1170-
jumper_by_net = addJumperOnSegments(segments_to_repair, routing[db_net]);
1191+
jumper_by_net
1192+
= addJumperOnSegments(segments_to_repair, routing[db_net], db_net);
11711193
if (jumper_by_net > 0) {
11721194
db_net->setJumpers(true);
11731195
net_with_jumpers++;

src/grt/src/RepairAntennas.h

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,24 +138,28 @@ class RepairAntennas
138138
const int& init_y,
139139
const int& final_x,
140140
const int& final_y,
141-
const int& layer_level);
141+
const int& layer_level,
142+
odb::dbNet* db_net);
142143
void addJumperToRoute(GRoute& route,
143144
const int& seg_id,
144145
const int& jumper_init_pos,
145146
const int& jumper_final_pos,
146-
const int& layer_level);
147+
const int& layer_level,
148+
odb::dbNet* db_net);
147149
void findSegments(const GRoute& route,
148150
odb::dbITerm* iterm,
149151
const SegmentNodeIds& segment_ids,
150152
LayerToSegmentNodeVector& segment_graph,
151153
const int& num_nodes,
152154
const int& violation_layer,
153-
SegmentToJumperPos& segments_to_repair);
155+
SegmentToJumperPos& segments_to_repair,
156+
odb::dbNet* db_net);
154157
bool findPosToJumper(const GRoute& route,
155158
LayerToSegmentNodeVector& segment_graph,
156159
const SegmentNode& seg_node,
157160
const odb::Point& parent_pos,
158-
int& jumper_position);
161+
int& jumper_position,
162+
odb::dbNet* db_net);
159163
int getJumperPosition(const int& init_pos,
160164
const int& final_pos,
161165
const int& target_pos);
@@ -169,7 +173,10 @@ class RepairAntennas
169173
int getSegmentsPerLayer(const GRoute& route,
170174
const int& max_layer,
171175
LayerToSegmentNodeVector& segment_by_layer);
172-
void addJumper(GRoute& route, const int& segment_id, const int& jumper_pos);
176+
void addJumper(GRoute& route,
177+
const int& segment_id,
178+
const int& jumper_pos,
179+
odb::dbNet* db_net);
173180
void findJumperCandidatePositions(const int& init_x,
174181
const int& init_y,
175182
const int& final_x,
@@ -185,7 +192,8 @@ class RepairAntennas
185192
std::vector<int>& violation_id_to_repair,
186193
int& max_layer_to_repair);
187194
int addJumperOnSegments(const SegmentToJumperPos& segments_to_repair,
188-
GRoute& route);
195+
GRoute& route,
196+
odb::dbNet* db_net);
189197
void insertDiode(odb::dbNet* net,
190198
odb::dbMTerm* diode_mterm,
191199
odb::dbITerm* sink_iterm,

src/grt/src/fastroute/include/FastRoute.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ class FastRouteCore
119119
void clearNetRoute(odb::dbNet* db_net);
120120
void clearNetsToRoute() { net_ids_.clear(); }
121121
void initEdges();
122+
void init3DEdges();
123+
int getDbNetLayerEdgeCost(odb::dbNet* db_net, int layer);
122124
void initEdgesCapacityPerLayer();
123125
void setNumAdjustments(int nAdjustments);
124126
void addAdjustment(int x1,
@@ -198,8 +200,16 @@ class FastRouteCore
198200
int x2,
199201
int y2,
200202
int layer,
201-
int used);
203+
int used,
204+
odb::dbNet* db_net);
202205
void setMaxNetDegree(int);
206+
void updateRouteGridsLayer(int x1,
207+
int y1,
208+
int x2,
209+
int y2,
210+
int layer,
211+
int new_layer,
212+
odb::dbNet* db_net);
203213
void setVerbose(bool v);
204214
void setCriticalNetsPercentage(float u);
205215
float getCriticalNetsPercentage() { return critical_nets_percentage_; };

0 commit comments

Comments
 (0)