Skip to content

Commit ba9d679

Browse files
committed
grt: antenna underflow fix updating fastroute treeedges and checking real net layer edge cost.
Signed-off-by: Jonas Gava <[email protected]>
1 parent 6ae4487 commit ba9d679

File tree

7 files changed

+169
-40
lines changed

7 files changed

+169
-40
lines changed

src/grt/include/grt/GlobalRouter.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,8 @@ class GlobalRouter
182182
bool hasAvailableResources(bool is_horizontal,
183183
const int& pos_x,
184184
const int& pos_y,
185-
const int& layer_level);
185+
const int& layer_level,
186+
odb::dbNet* db_net);
186187
odb::Point getPositionOnGrid(const odb::Point& real_position);
187188
int repairAntennas(odb::dbMTerm* diode_mterm,
188189
int iterations,
@@ -193,7 +194,14 @@ class GlobalRouter
193194
const int& final_x,
194195
const int& final_y,
195196
const int& layer_level,
196-
int used);
197+
int used,
198+
odb::dbNet* db_net);
199+
void updateFastRouteGridsLayer(const int& init_x,
200+
const int& init_y,
201+
const int& final_x,
202+
const int& final_y,
203+
const int& layer_level,
204+
odb::dbNet* db_net);
197205
// Incremental global routing functions.
198206
// See class IncrementalGRoute.
199207
void addDirtyNet(odb::dbNet* net);

src/grt/src/GlobalRouter.cpp

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include <algorithm>
77
#include <cmath>
8+
#include <cstdint>
89
#include <cstring>
910
#include <fstream>
1011
#include <functional>
@@ -465,7 +466,6 @@ int GlobalRouter::repairAntennas(odb::dbMTerm* diode_mterm,
465466
for (odb::dbNet* db_net : dirty_nets_) {
466467
nets_to_repair.push_back(db_net);
467468
}
468-
fastroute_->clearNDRnets();
469469
incr_groute.updateRoutes();
470470
saveGuides(nets_to_repair);
471471
}
@@ -1647,7 +1647,8 @@ void GlobalRouter::computeRegionAdjustments(const odb::Rect& region,
16471647
bool GlobalRouter::hasAvailableResources(bool is_horizontal,
16481648
const int& pos_x,
16491649
const int& pos_y,
1650-
const int& layer_level)
1650+
const int& layer_level,
1651+
odb::dbNet* db_net)
16511652
{
16521653
// transform from real position to grid pos of fastroute
16531654
int grid_x = (int) ((pos_x - grid_->getXMin()) / grid_->getTileSize());
@@ -1660,7 +1661,7 @@ bool GlobalRouter::hasAvailableResources(bool is_horizontal,
16601661
cap = fastroute_->getAvailableResources(
16611662
grid_x, grid_y, grid_x, grid_y + 1, layer_level);
16621663
}
1663-
return cap > 0;
1664+
return cap >= fastroute_->getDbNetLayerEdgeCost(db_net, layer_level);
16641665
}
16651666

16661667
// Find the position of the middle of a GCell closest to the position
@@ -1674,7 +1675,8 @@ void GlobalRouter::updateResources(const int& init_x,
16741675
const int& final_x,
16751676
const int& final_y,
16761677
const int& layer_level,
1677-
int used)
1678+
int used,
1679+
odb::dbNet* db_net)
16781680
{
16791681
// transform from real position to grid pos of fastrouter
16801682
int grid_init_x = (int) ((init_x - grid_->getXMin()) / grid_->getTileSize());
@@ -1683,8 +1685,37 @@ void GlobalRouter::updateResources(const int& init_x,
16831685
= (int) ((final_x - grid_->getXMin()) / grid_->getTileSize());
16841686
int grid_final_y
16851687
= (int) ((final_y - grid_->getYMin()) / grid_->getTileSize());
1686-
fastroute_->updateEdge2DAnd3DUsage(
1687-
grid_init_x, grid_init_y, grid_final_x, grid_final_y, layer_level, used);
1688+
1689+
fastroute_->updateEdge2DAnd3DUsage(grid_init_x,
1690+
grid_init_y,
1691+
grid_final_x,
1692+
grid_final_y,
1693+
layer_level,
1694+
used,
1695+
db_net);
1696+
}
1697+
1698+
void GlobalRouter::updateFastRouteGridsLayer(const int& init_x,
1699+
const int& init_y,
1700+
const int& final_x,
1701+
const int& final_y,
1702+
const int& layer_level,
1703+
odb::dbNet* db_net)
1704+
{
1705+
// transform from real position to grid pos of fastrouter
1706+
int grid_init_x = (int) ((init_x - grid_->getXMin()) / grid_->getTileSize());
1707+
int grid_init_y = (int) ((init_y - grid_->getYMin()) / grid_->getTileSize());
1708+
int grid_final_x
1709+
= (int) ((final_x - grid_->getXMin()) / grid_->getTileSize());
1710+
int grid_final_y
1711+
= (int) ((final_y - grid_->getYMin()) / grid_->getTileSize());
1712+
// update treeedges
1713+
fastroute_->updateRouteGridsLayer(grid_init_x,
1714+
grid_init_y,
1715+
grid_final_x,
1716+
grid_final_y,
1717+
layer_level - 1,
1718+
db_net);
16881719
}
16891720

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

src/grt/src/RepairAntennas.cpp

Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "Pin.h"
1919
#include "boost/pending/disjoint_sets.hpp"
2020
#include "grt/GlobalRouter.h"
21+
#include "odb/db.h"
2122
#include "utl/Logger.h"
2223

2324
namespace grt {
@@ -577,7 +578,8 @@ void RepairAntennas::addJumperAndVias(GRoute& route,
577578
const int& init_y,
578579
const int& final_x,
579580
const int& final_y,
580-
const int& layer_level)
581+
const int& layer_level,
582+
odb::dbNet* db_net)
581583
{
582584
// Create vias (at the start and end of the jumper)
583585
for (int layer = layer_level; layer < layer_level + 2; layer++) {
@@ -594,17 +596,22 @@ void RepairAntennas::addJumperAndVias(GRoute& route,
594596
layer_level + 2,
595597
true));
596598
// Reducing usage in the layer level
597-
grouter_->updateResources(init_x, init_y, final_x, final_y, layer_level, -1);
599+
grouter_->updateResources(
600+
init_x, init_y, final_x, final_y, layer_level, -1, db_net);
598601
// Increasing usage in the layer level + 2
599602
grouter_->updateResources(
600-
init_x, init_y, final_x, final_y, layer_level + 2, 1);
603+
init_x, init_y, final_x, final_y, layer_level + 2, 1, db_net);
604+
// Update FastRoute Tree Edges
605+
grouter_->updateFastRouteGridsLayer(
606+
init_x, init_y, final_x, final_y, layer_level, db_net);
601607
}
602608

603609
void RepairAntennas::addJumperToRoute(GRoute& route,
604610
const int& seg_id,
605611
const int& jumper_init_pos,
606612
const int& jumper_final_pos,
607-
const int& layer_level)
613+
const int& layer_level,
614+
odb::dbNet* db_net)
608615
{
609616
const int seg_init_x = route[seg_id].init_x;
610617
const int seg_init_y = route[seg_id].init_y;
@@ -632,7 +639,8 @@ void RepairAntennas::addJumperToRoute(GRoute& route,
632639
jumper_init_y,
633640
jumper_final_x,
634641
jumper_final_y,
635-
layer_level);
642+
layer_level,
643+
db_net);
636644
// Divide segment (new segment is added before jumper insertion)
637645
route.push_back(GSegment(seg_init_x,
638646
seg_init_y,
@@ -647,7 +655,8 @@ void RepairAntennas::addJumperToRoute(GRoute& route,
647655

648656
void RepairAntennas::addJumper(GRoute& route,
649657
const int& segment_id,
650-
const int& jumper_pos)
658+
const int& jumper_pos,
659+
odb::dbNet* db_net)
651660
{
652661
odb::dbTech* tech = db_->getTech();
653662
const int segment_layer_level = route[segment_id].init_layer;
@@ -659,14 +668,22 @@ void RepairAntennas::addJumper(GRoute& route,
659668
// Get start and final X position of jumper
660669
const int jumper_start_x = jumper_pos;
661670
const int jumper_final_x = jumper_start_x + jumper_size_;
662-
addJumperToRoute(
663-
route, segment_id, jumper_start_x, jumper_final_x, segment_layer_level);
671+
addJumperToRoute(route,
672+
segment_id,
673+
jumper_start_x,
674+
jumper_final_x,
675+
segment_layer_level,
676+
db_net);
664677
} else {
665678
// Get start and final Y position jumper
666679
const int jumper_start_y = jumper_pos;
667680
const int jumper_final_y = jumper_start_y + jumper_size_;
668-
addJumperToRoute(
669-
route, segment_id, jumper_start_y, jumper_final_y, segment_layer_level);
681+
addJumperToRoute(route,
682+
segment_id,
683+
jumper_start_y,
684+
jumper_final_y,
685+
segment_layer_level,
686+
db_net);
670687
}
671688
}
672689

@@ -895,7 +912,8 @@ bool RepairAntennas::findPosToJumper(const GRoute& route,
895912
LayerToSegmentNodeVector& segment_graph,
896913
const SegmentNode& seg_node,
897914
const odb::Point& parent_pos,
898-
int& jumper_position)
915+
int& jumper_position,
916+
odb::dbNet* db_net)
899917
{
900918
jumper_position = -1;
901919
const GSegment& seg = route[seg_node.seg_id];
@@ -929,7 +947,7 @@ bool RepairAntennas::findPosToJumper(const GRoute& route,
929947
while (pos_x <= seg_final_x && pos_y <= seg_final_y) {
930948
// Check if the position has resources available
931949
has_available_resources = grouter_->hasAvailableResources(
932-
is_horizontal, pos_x, pos_y, layer_level + 2);
950+
is_horizontal, pos_x, pos_y, layer_level + 2, db_net);
933951
is_via = (is_horizontal && via_pos.find(pos_x) != via_pos.end())
934952
|| (!is_horizontal && via_pos.find(pos_y) != via_pos.end());
935953
// If the position has vias or does not have resources
@@ -980,7 +998,8 @@ void RepairAntennas::findSegments(const GRoute& route,
980998
LayerToSegmentNodeVector& segment_graph,
981999
const int& num_nodes,
9821000
const int& violation_layer,
983-
SegmentToJumperPos& segments_to_repair)
1001+
SegmentToJumperPos& segments_to_repair,
1002+
odb::dbNet* db_net)
9841003
{
9851004
// Init stack and vector of visited and parent position
9861005
std::stack<std::pair<odb::dbTechLayer*, SegmentNode>> node_stack;
@@ -1026,7 +1045,8 @@ void RepairAntennas::findSegments(const GRoute& route,
10261045
segment_graph,
10271046
cur_node,
10281047
parent_pos[cur_node.node_id],
1029-
jumper_pos);
1048+
jumper_pos,
1049+
db_net);
10301050
// If jumper wasnt added, then explore adjacent segment nodes
10311051
if (is_found) {
10321052
segments_to_repair[cur_node.seg_id].insert(jumper_pos);
@@ -1077,7 +1097,8 @@ void RepairAntennas::getViolations(
10771097

10781098
int RepairAntennas::addJumperOnSegments(
10791099
const SegmentToJumperPos& segments_to_repair,
1080-
GRoute& route)
1100+
GRoute& route,
1101+
odb::dbNet* db_net)
10811102
{
10821103
int jumper_by_net = 0;
10831104
// Iterate all jumper positions on segments
@@ -1092,11 +1113,11 @@ int RepairAntennas::addJumperOnSegments(
10921113
// Avoid overlap with last jumper position
10931114
const int dist = abs(last_pos_aux - pos_it);
10941115
if (dist > jumper_size_) {
1095-
addJumper(route, seg_it.first, pos_it);
1116+
addJumper(route, seg_it.first, pos_it, db_net);
10961117
jumper_by_net++;
10971118
}
10981119
} else {
1099-
addJumper(route, seg_it.first, pos_it);
1120+
addJumper(route, seg_it.first, pos_it, db_net);
11001121
jumper_by_net++;
11011122
}
11021123
last_pos_aux = pos_it;
@@ -1153,14 +1174,16 @@ void RepairAntennas::jumperInsertion(NetRouteMap& routing,
11531174
segment_graph,
11541175
num_nodes,
11551176
layer_level,
1156-
segments_to_repair);
1177+
segments_to_repair,
1178+
db_net);
11571179
}
11581180
}
11591181
required_jumper_by_net = segments_to_repair.size();
11601182
}
11611183
if (required_jumper_by_net > 0) {
11621184
// Add jumper in found segment positions
1163-
jumper_by_net = addJumperOnSegments(segments_to_repair, routing[db_net]);
1185+
jumper_by_net
1186+
= addJumperOnSegments(segments_to_repair, routing[db_net], db_net);
11641187
if (jumper_by_net > 0) {
11651188
db_net->setJumpers(true);
11661189
net_with_jumpers++;

src/grt/src/RepairAntennas.h

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,24 +136,28 @@ class RepairAntennas
136136
const int& init_y,
137137
const int& final_x,
138138
const int& final_y,
139-
const int& layer_level);
139+
const int& layer_level,
140+
odb::dbNet* db_net);
140141
void addJumperToRoute(GRoute& route,
141142
const int& seg_id,
142143
const int& jumper_init_pos,
143144
const int& jumper_final_pos,
144-
const int& layer_level);
145+
const int& layer_level,
146+
odb::dbNet* db_net);
145147
void findSegments(const GRoute& route,
146148
odb::dbITerm* iterm,
147149
const SegmentNodeIds& segment_ids,
148150
LayerToSegmentNodeVector& segment_graph,
149151
const int& num_nodes,
150152
const int& violation_layer,
151-
SegmentToJumperPos& segments_to_repair);
153+
SegmentToJumperPos& segments_to_repair,
154+
odb::dbNet* db_net);
152155
bool findPosToJumper(const GRoute& route,
153156
LayerToSegmentNodeVector& segment_graph,
154157
const SegmentNode& seg_node,
155158
const odb::Point& parent_pos,
156-
int& jumper_position);
159+
int& jumper_position,
160+
odb::dbNet* db_net);
157161
int getJumperPosition(const int& init_pos,
158162
const int& final_pos,
159163
const int& target_pos);
@@ -167,7 +171,10 @@ class RepairAntennas
167171
int getSegmentsPerLayer(const GRoute& route,
168172
const int& max_layer,
169173
LayerToSegmentNodeVector& segment_by_layer);
170-
void addJumper(GRoute& route, const int& segment_id, const int& jumper_pos);
174+
void addJumper(GRoute& route,
175+
const int& segment_id,
176+
const int& jumper_pos,
177+
odb::dbNet* db_net);
171178
void findJumperCandidatePositions(const int& init_x,
172179
const int& init_y,
173180
const int& final_x,
@@ -183,7 +190,8 @@ class RepairAntennas
183190
std::vector<int>& violation_id_to_repair,
184191
int& max_layer_to_repair);
185192
int addJumperOnSegments(const SegmentToJumperPos& segments_to_repair,
186-
GRoute& route);
193+
GRoute& route,
194+
odb::dbNet* db_net);
187195
void insertDiode(odb::dbNet* net,
188196
odb::dbMTerm* diode_mterm,
189197
odb::dbITerm* sink_iterm,

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "boost/icl/interval_set.hpp"
1818
#include "boost/multi_array.hpp"
1919
#include "grt/GRoute.h"
20+
#include "odb/db.h"
2021
#include "odb/geom.h"
2122
#include "stt/SteinerTreeBuilder.h"
2223

@@ -117,6 +118,8 @@ class FastRouteCore
117118
void clearNetRoute(odb::dbNet* db_net);
118119
void clearNetsToRoute() { net_ids_.clear(); }
119120
void initEdges();
121+
void init3DEdges();
122+
int getDbNetLayerEdgeCost(odb::dbNet* db_net, int layer);
120123
void initEdgesCapacityPerLayer();
121124
void setNumAdjustments(int nAdjustments);
122125
void addAdjustment(int x1,
@@ -196,8 +199,10 @@ class FastRouteCore
196199
int x2,
197200
int y2,
198201
int layer,
199-
int used);
202+
int used,
203+
odb::dbNet* db_net);
200204
void setMaxNetDegree(int);
205+
void updateRouteGridsLayer(int x1, int y1, int x2, int y2, int layer, odb::dbNet* db_net);
201206
void setVerbose(bool v);
202207
void setCriticalNetsPercentage(float u);
203208
float getCriticalNetsPercentage() { return critical_nets_percentage_; };

0 commit comments

Comments
 (0)