Skip to content

Commit 795d8a4

Browse files
authored
Merge pull request #8092 from eder-matheus/grt_fix
grt: fix pin connection layer
2 parents 9cc9edf + e9d0fa9 commit 795d8a4

File tree

6 files changed

+106
-137
lines changed

6 files changed

+106
-137
lines changed

src/grt/include/grt/GlobalRouter.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ using Guides = std::vector<std::pair<int, odb::Rect>>;
103103
using LayerId = int;
104104
using TileSet = std::set<std::pair<int, int>>;
105105
using RoutePointToPinsMap = std::map<RoutePt, RoutePointPins>;
106+
using PointPair = std::pair<odb::Point, odb::Point>;
106107

107108
class GlobalRouter
108109
{
@@ -267,7 +268,7 @@ class GlobalRouter
267268

268269
bool findPinAccessPointPositions(
269270
const Pin& pin,
270-
std::vector<std::pair<odb::Point, odb::Point>>& ap_positions);
271+
std::map<int, std::vector<PointPair>>& ap_positions);
271272
void getNetLayerRange(odb::dbNet* db_net, int& min_layer, int& max_layer);
272273
void getGridSize(int& x_grids, int& y_grids);
273274
int getGridTileSize();
@@ -336,14 +337,14 @@ class GlobalRouter
336337
std::vector<int8_t>*& edge_costs_per_layer);
337338

338339
// aux functions
339-
std::vector<odb::Point> findOnGridPositions(const Pin& pin,
340-
bool& has_access_points,
341-
odb::Point& pos_on_grid,
342-
bool ignore_db_access_points
343-
= false);
340+
std::vector<RoutePt> findOnGridPositions(const Pin& pin,
341+
bool& has_access_points,
342+
odb::Point& pos_on_grid,
343+
bool ignore_db_access_points
344+
= false);
344345
int getNetMaxRoutingLayer(const Net* net);
345346
void findPins(Net* net);
346-
void computePinPositionOnGrid(std::vector<odb::Point>& pin_positions_on_grid,
347+
void computePinPositionOnGrid(std::vector<RoutePt>& pin_positions_on_grid,
347348
Pin& pin,
348349
odb::Point& pos_on_grid,
349350
bool has_access_points);

src/grt/src/GlobalRouter.cpp

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -529,10 +529,10 @@ std::vector<int> GlobalRouter::routeLayerLengths(odb::dbNet* db_net)
529529
odb::Point grid_pt = pin.getOnGridPosition();
530530
odb::Point pt = pin.getPosition();
531531

532-
std::vector<std::pair<odb::Point, odb::Point>> ap_positions;
532+
std::map<int, std::vector<PointPair>> ap_positions;
533533
bool has_access_points = findPinAccessPointPositions(pin, ap_positions);
534534
if (has_access_points) {
535-
auto ap_position = ap_positions.front();
535+
auto ap_position = ap_positions[0].front();
536536
pt = ap_position.first;
537537
grid_pt = ap_position.second;
538538
}
@@ -877,7 +877,7 @@ Rudy* GlobalRouter::getRudy()
877877

878878
bool GlobalRouter::findPinAccessPointPositions(
879879
const Pin& pin,
880-
std::vector<std::pair<odb::Point, odb::Point>>& ap_positions)
880+
std::map<int, std::vector<PointPair>>& ap_positions)
881881
{
882882
std::vector<odb::dbAccessPoint*> access_points;
883883
// get APs from odb
@@ -907,31 +907,35 @@ bool GlobalRouter::findPinAccessPointPositions(
907907
xform.apply(ap_position);
908908
}
909909

910-
ap_positions.push_back(
910+
const int ap_layer = ap->getLayer()->getRoutingLevel();
911+
ap_positions[ap_layer].push_back(
911912
{ap_position, grid_->getPositionOnGrid(ap_position)});
912913
}
913914

914915
return true;
915916
}
916917

917-
std::vector<odb::Point> GlobalRouter::findOnGridPositions(
918+
std::vector<RoutePt> GlobalRouter::findOnGridPositions(
918919
const Pin& pin,
919920
bool& has_access_points,
920921
odb::Point& pos_on_grid,
921922
bool ignore_db_access_points)
922923
{
923-
std::vector<std::pair<odb::Point, odb::Point>> ap_positions;
924+
std::map<int, std::vector<PointPair>> ap_positions;
924925

925926
// temporarily ignore odb access points when incremental changes
926927
// are made, in order to avoid getting invalid APs
927928
has_access_points = findPinAccessPointPositions(pin, ap_positions);
928929

929-
std::vector<odb::Point> positions_on_grid;
930+
std::vector<RoutePt> positions_on_grid;
930931

931932
if (has_access_points && !ignore_db_access_points) {
932-
for (const auto& ap_position : ap_positions) {
933-
pos_on_grid = ap_position.second;
934-
positions_on_grid.push_back(pos_on_grid);
933+
for (const auto& [layer, positions] : ap_positions) {
934+
for (const PointPair& position : positions) {
935+
pos_on_grid = position.second;
936+
positions_on_grid.emplace_back(
937+
pos_on_grid.getX(), pos_on_grid.getY(), layer);
938+
}
935939
}
936940
} else {
937941
// if odb doesn't have any APs, run the grt version considering the
@@ -959,7 +963,8 @@ std::vector<odb::Point> GlobalRouter::findOnGridPositions(
959963
pin.getPositionNearInstEdge(pin_box, rect_middle));
960964
}
961965
}
962-
positions_on_grid.push_back(pos_on_grid);
966+
positions_on_grid.emplace_back(
967+
pos_on_grid.getX(), pos_on_grid.getY(), conn_layer);
963968
has_access_points = false;
964969
}
965970
}
@@ -972,7 +977,7 @@ void GlobalRouter::findPins(Net* net)
972977
for (Pin& pin : net->getPins()) {
973978
bool has_access_points;
974979
odb::Point pos_on_grid;
975-
std::vector<odb::Point> pin_positions_on_grid
980+
std::vector<RoutePt> pin_positions_on_grid
976981
= findOnGridPositions(pin, has_access_points, pos_on_grid);
977982

978983
computePinPositionOnGrid(
@@ -981,15 +986,17 @@ void GlobalRouter::findPins(Net* net)
981986
}
982987

983988
void GlobalRouter::computePinPositionOnGrid(
984-
std::vector<odb::Point>& pin_positions_on_grid,
989+
std::vector<RoutePt>& pin_positions_on_grid,
985990
Pin& pin,
986991
odb::Point& pos_on_grid,
987992
const bool has_access_points)
988993
{
989994
int votes = -1;
990995

991-
odb::Point pin_position;
992-
for (odb::Point pos : pin_positions_on_grid) {
996+
RoutePt pin_position(pin.getPosition().getX(),
997+
pin.getPosition().getY(),
998+
pin.getConnectionLayer());
999+
for (const RoutePt& pos : pin_positions_on_grid) {
9931000
int equals = std::count(
9941001
pin_positions_on_grid.begin(), pin_positions_on_grid.end(), pos);
9951002
if (equals > votes) {
@@ -1005,16 +1012,18 @@ void GlobalRouter::computePinPositionOnGrid(
10051012
const int conn_layer = pin.getConnectionLayer();
10061013
odb::dbTechLayer* layer = routing_layers_[conn_layer];
10071014
pos_on_grid = grid_->getPositionOnGrid(pos_on_grid);
1008-
if (!(pos_on_grid == pin_position)
1015+
if (!(pos_on_grid == odb::Point(pin_position.x(), pin_position.y()))
10091016
&& ((layer->getDirection() == odb::dbTechLayerDir::HORIZONTAL
10101017
&& pos_on_grid.y() != pin_position.y())
10111018
|| (layer->getDirection() == odb::dbTechLayerDir::VERTICAL
10121019
&& pos_on_grid.x() != pin_position.x()))) {
1013-
pin_position = pos_on_grid;
1020+
pin_position = RoutePt(
1021+
pos_on_grid.getX(), pos_on_grid.getY(), pin_position.layer());
10141022
}
10151023
}
10161024

1017-
pin.setOnGridPosition(pin_position);
1025+
pin.setOnGridPosition(odb::Point(pin_position.x(), pin_position.y()));
1026+
pin.setConnectionLayer(pin_position.layer());
10181027
}
10191028

10201029
int GlobalRouter::getNetMaxRoutingLayer(const Net* net)
@@ -2221,7 +2230,7 @@ void GlobalRouter::ensurePinsPositions(odb::dbNet* db_net)
22212230
if (pins_not_covered.find(pin.getName()) != std::string::npos) {
22222231
bool has_aps;
22232232
odb::Point pos_on_grid;
2224-
std::vector<odb::Point> pin_positions_on_grid
2233+
std::vector<RoutePt> pin_positions_on_grid
22252234
= findOnGridPositions(pin, has_aps, pos_on_grid, true);
22262235
computePinPositionOnGrid(
22272236
pin_positions_on_grid, pin, pos_on_grid, has_aps);

src/grt/src/Pin.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,4 @@ odb::Point Pin::getPositionNearInstEdge(const odb::Rect& pin_box,
182182
return pin_pos;
183183
}
184184

185-
int Pin::getConnectionLayer() const
186-
{
187-
return connection_layer_;
188-
}
189-
190185
} // namespace grt

src/grt/src/Pin.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ class Pin
4848
const odb::Point& getPosition() const { return position_; }
4949
const std::vector<int>& getLayers() const { return layers_; }
5050
int getNumLayers() const { return layers_.size(); }
51-
int getConnectionLayer() const;
51+
int getConnectionLayer() const { return connection_layer_; }
52+
void setConnectionLayer(int layer) { connection_layer_ = layer; }
5253
PinEdge getEdge() const { return edge_; }
5354
const std::map<int, std::vector<odb::Rect>>& getBoxes() const
5455
{

test/jpeg_sky130hd.metrics

Lines changed: 62 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"IFP::instance_count": "45634",
44
"floorplan__design__io": 47,
55
"design__io__hpwl": 13000488,
6-
"design__instance__displacement__total": 115695,
6+
"design__instance__displacement__total": 115694,
77
"design__instance__displacement__mean": 1.573,
88
"design__instance__displacement__max": 11.669,
99
"route__wirelength__estimated": 1.48933e+06,
@@ -21,129 +21,92 @@
2121
"RSZ::worst_slack_max": "-0.12962520312918588",
2222
"RSZ::tns_max": "-0.3188001064481866",
2323
"RSZ::hold_buffer_count": "38",
24-
"design__instance__displacement__total": 2183.09,
24+
"design__instance__displacement__total": 2168.43,
2525
"design__instance__displacement__mean": 0.029,
26-
"design__instance__displacement__max": 17.642,
26+
"design__instance__displacement__max": 15.382,
2727
"route__wirelength__estimated": 1.5989e+06,
2828
"DPL::utilization": "21.1",
2929
"DPL::design_area": "460883",
3030
"route__net": 57397,
3131
"route__net__special": 2,
32-
"global_route__vias": 349639,
33-
"global_route__wirelength": 2644452,
34-
"grt__global_route__vias": 5303,
35-
"grt__global_route__vias": 176,
36-
"grt__antenna_diodes_count": 172,
32+
"global_route__vias": 369867,
33+
"global_route__wirelength": 2640933,
34+
"grt__global_route__vias": 5209,
35+
"grt__global_route__vias": 155,
36+
"grt__antenna_diodes_count": 180,
3737
"grt__antenna__violating__nets": 0,
3838
"grt__antenna__violating__pins": 0,
3939
"GRT::ANT::errors": "0",
4040
"route__net": 57397,
4141
"route__net__special": 2,
42-
"route__drc_errors__iter:0": 6401,
43-
"route__wirelength__iter:0": 1788734,
44-
"route__drc_errors__iter:1": 855,
45-
"route__wirelength__iter:1": 1780101,
46-
"route__drc_errors__iter:2": 421,
47-
"route__wirelength__iter:2": 1779380,
42+
"route__drc_errors__iter:0": 6392,
43+
"route__wirelength__iter:0": 1787880,
44+
"route__drc_errors__iter:1": 913,
45+
"route__wirelength__iter:1": 1779861,
46+
"route__drc_errors__iter:2": 397,
47+
"route__wirelength__iter:2": 1779373,
4848
"route__drc_errors__iter:3": 2,
49-
"route__wirelength__iter:3": 1779336,
49+
"route__wirelength__iter:3": 1779338,
5050
"route__drc_errors__iter:4": 0,
51-
"route__wirelength__iter:4": 1779337,
51+
"route__wirelength__iter:4": 1779342,
5252
"route__drc_errors": 0,
53-
"route__wirelength": 1779337,
54-
"route__vias": 313917,
55-
"route__vias__singlecut": 313917,
53+
"route__wirelength": 1779342,
54+
"route__vias": 313894,
55+
"route__vias__singlecut": 313894,
5656
"route__vias__multicut": 0,
5757
"DRT::drv": "0",
58-
"drt__repair_antennas__pre_repair__antenna__violating__nets": 70,
59-
"drt__repair_antennas__pre_repair__antenna__violating__pins": 83,
60-
"drt__repair_antennas__iter_0__global_route__vias": 2866,
61-
"drt__repair_antennas__iter_0__antenna_diodes_count": 285,
62-
"drt__repair_antennas__iter_0__route__drc_errors__iter:0": 918,
63-
"drt__repair_antennas__iter_0__route__wirelength__iter:0": 1779850,
64-
"drt__repair_antennas__iter_0__route__drc_errors__iter:1": 278,
65-
"drt__repair_antennas__iter_0__route__wirelength__iter:1": 1779717,
66-
"drt__repair_antennas__iter_0__route__drc_errors__iter:2": 250,
67-
"drt__repair_antennas__iter_0__route__wirelength__iter:2": 1779719,
68-
"drt__repair_antennas__iter_0__route__drc_errors__iter:3": 0,
69-
"drt__repair_antennas__iter_0__route__wirelength__iter:3": 1779758,
58+
"drt__repair_antennas__pre_repair__antenna__violating__nets": 76,
59+
"drt__repair_antennas__pre_repair__antenna__violating__pins": 85,
60+
"drt__repair_antennas__iter_0__global_route__vias": 3592,
61+
"drt__repair_antennas__iter_0__antenna_diodes_count": 294,
62+
"drt__repair_antennas__iter_0__route__drc_errors__iter:0": 988,
63+
"drt__repair_antennas__iter_0__route__wirelength__iter:0": 1779453,
64+
"drt__repair_antennas__iter_0__route__drc_errors__iter:1": 321,
65+
"drt__repair_antennas__iter_0__route__wirelength__iter:1": 1779317,
66+
"drt__repair_antennas__iter_0__route__drc_errors__iter:2": 265,
67+
"drt__repair_antennas__iter_0__route__wirelength__iter:2": 1779320,
68+
"drt__repair_antennas__iter_0__route__drc_errors__iter:3": 3,
69+
"drt__repair_antennas__iter_0__route__wirelength__iter:3": 1779330,
70+
"drt__repair_antennas__iter_0__route__drc_errors__iter:4": 0,
71+
"drt__repair_antennas__iter_0__route__wirelength__iter:4": 1779325,
7072
"drt__repair_antennas__iter_0__route__drc_errors": 0,
71-
"drt__repair_antennas__iter_0__route__wirelength": 1779758,
72-
"drt__repair_antennas__iter_0__route__vias": 314080,
73-
"drt__repair_antennas__iter_0__route__vias__singlecut": 314080,
73+
"drt__repair_antennas__iter_0__route__wirelength": 1779325,
74+
"drt__repair_antennas__iter_0__route__vias": 313976,
75+
"drt__repair_antennas__iter_0__route__vias__singlecut": 313976,
7476
"drt__repair_antennas__iter_0__route__vias__multicut": 0,
75-
"drt__repair_antennas__iter_0__antenna__violating__nets": 12,
76-
"drt__repair_antennas__iter_0__antenna__violating__pins": 13,
77-
"drt__repair_antennas__iter_1__global_route__vias": 769,
78-
"drt__repair_antennas__iter_1__antenna_diodes_count": 313,
79-
"drt__repair_antennas__iter_1__route__drc_errors__iter:0": 175,
80-
"drt__repair_antennas__iter_1__route__wirelength__iter:0": 1779908,
81-
"drt__repair_antennas__iter_1__route__drc_errors__iter:1": 72,
82-
"drt__repair_antennas__iter_1__route__wirelength__iter:1": 1779875,
83-
"drt__repair_antennas__iter_1__route__drc_errors__iter:2": 40,
84-
"drt__repair_antennas__iter_1__route__wirelength__iter:2": 1779864,
77+
"drt__repair_antennas__iter_0__antenna__violating__nets": 19,
78+
"drt__repair_antennas__iter_0__antenna__violating__pins": 21,
79+
"drt__repair_antennas__iter_1__global_route__vias": 997,
80+
"drt__repair_antennas__iter_1__antenna_diodes_count": 332,
81+
"drt__repair_antennas__iter_1__route__drc_errors__iter:0": 192,
82+
"drt__repair_antennas__iter_1__route__wirelength__iter:0": 1779348,
83+
"drt__repair_antennas__iter_1__route__drc_errors__iter:1": 42,
84+
"drt__repair_antennas__iter_1__route__wirelength__iter:1": 1779273,
85+
"drt__repair_antennas__iter_1__route__drc_errors__iter:2": 14,
86+
"drt__repair_antennas__iter_1__route__wirelength__iter:2": 1779283,
8587
"drt__repair_antennas__iter_1__route__drc_errors__iter:3": 0,
86-
"drt__repair_antennas__iter_1__route__wirelength__iter:3": 1779864,
88+
"drt__repair_antennas__iter_1__route__wirelength__iter:3": 1779276,
8789
"drt__repair_antennas__iter_1__route__drc_errors": 0,
88-
"drt__repair_antennas__iter_1__route__wirelength": 1779864,
89-
"drt__repair_antennas__iter_1__route__vias": 314153,
90-
"drt__repair_antennas__iter_1__route__vias__singlecut": 314153,
90+
"drt__repair_antennas__iter_1__route__wirelength": 1779276,
91+
"drt__repair_antennas__iter_1__route__vias": 314029,
92+
"drt__repair_antennas__iter_1__route__vias__singlecut": 314029,
9193
"drt__repair_antennas__iter_1__route__vias__multicut": 0,
92-
"drt__repair_antennas__iter_1__antenna__violating__nets": 2,
93-
"drt__repair_antennas__iter_1__antenna__violating__pins": 2,
94-
"drt__repair_antennas__iter_2__global_route__vias": 56,
95-
"drt__repair_antennas__iter_2__antenna_diodes_count": 316,
96-
"drt__repair_antennas__iter_2__route__drc_errors__iter:0": 13,
97-
"drt__repair_antennas__iter_2__route__wirelength__iter:0": 1779884,
98-
"drt__repair_antennas__iter_2__route__drc_errors__iter:1": 0,
99-
"drt__repair_antennas__iter_2__route__wirelength__iter:1": 1779881,
100-
"drt__repair_antennas__iter_2__route__drc_errors": 0,
101-
"drt__repair_antennas__iter_2__route__wirelength": 1779881,
102-
"drt__repair_antennas__iter_2__route__vias": 314157,
103-
"drt__repair_antennas__iter_2__route__vias__singlecut": 314157,
104-
"drt__repair_antennas__iter_2__route__vias__multicut": 0,
105-
"drt__repair_antennas__iter_2__antenna__violating__nets": 2,
106-
"drt__repair_antennas__iter_2__antenna__violating__pins": 2,
107-
"drt__repair_antennas__iter_3__global_route__vias": 62,
108-
"drt__repair_antennas__iter_3__antenna_diodes_count": 318,
109-
"drt__repair_antennas__iter_3__route__drc_errors__iter:0": 9,
110-
"drt__repair_antennas__iter_3__route__wirelength__iter:0": 1779871,
111-
"drt__repair_antennas__iter_3__route__drc_errors__iter:1": 0,
112-
"drt__repair_antennas__iter_3__route__wirelength__iter:1": 1779868,
113-
"drt__repair_antennas__iter_3__route__drc_errors": 0,
114-
"drt__repair_antennas__iter_3__route__wirelength": 1779868,
115-
"drt__repair_antennas__iter_3__route__vias": 314161,
116-
"drt__repair_antennas__iter_3__route__vias__singlecut": 314161,
117-
"drt__repair_antennas__iter_3__route__vias__multicut": 0,
118-
"drt__repair_antennas__iter_3__antenna__violating__nets": 1,
119-
"drt__repair_antennas__iter_3__antenna__violating__pins": 1,
120-
"drt__repair_antennas__iter_4__global_route__vias": 42,
121-
"drt__repair_antennas__iter_4__antenna_diodes_count": 319,
122-
"drt__repair_antennas__iter_4__route__drc_errors__iter:0": 5,
123-
"drt__repair_antennas__iter_4__route__wirelength__iter:0": 1779884,
124-
"drt__repair_antennas__iter_4__route__drc_errors__iter:1": 0,
125-
"drt__repair_antennas__iter_4__route__wirelength__iter:1": 1779887,
126-
"drt__repair_antennas__iter_4__route__drc_errors": 0,
127-
"drt__repair_antennas__iter_4__route__wirelength": 1779887,
128-
"drt__repair_antennas__iter_4__route__vias": 314164,
129-
"drt__repair_antennas__iter_4__route__vias__singlecut": 314164,
130-
"drt__repair_antennas__iter_4__route__vias__multicut": 0,
131-
"drt__repair_antennas__iter_4__antenna__violating__nets": 1,
132-
"drt__repair_antennas__iter_4__antenna__violating__pins": 1,
133-
"drt__antenna__violating__nets": 1,
134-
"drt__antenna__violating__pins": 1,
135-
"DRT::ANT::errors": "1",
94+
"drt__repair_antennas__iter_1__antenna__violating__nets": 0,
95+
"drt__repair_antennas__iter_1__antenna__violating__pins": 0,
96+
"drt__antenna__violating__nets": 0,
97+
"drt__antenna__violating__pins": 0,
98+
"DRT::ANT::errors": "0",
13699
"design__violations": 0,
137100
"timing__drv__floating__nets": 0,
138101
"timing__drv__floating__pins": 0,
139-
"DRT::worst_slack_min": "0.09995449195693355",
140-
"DRT::worst_slack_max": "-0.2870423979752196",
141-
"DRT::tns_max": "-9.286394138732806",
142-
"DRT::clock_skew": "0.6894636168247199",
143-
"DRT::max_slew_slack": "-1.2674772793225084",
102+
"DRT::worst_slack_min": "0.0962816520429936",
103+
"DRT::worst_slack_max": "-0.31572167995844214",
104+
"DRT::tns_max": "-7.3133448034178",
105+
"DRT::clock_skew": "0.6811709167300511",
106+
"DRT::max_slew_slack": "-2.67742023180178",
144107
"DRT::max_fanout_slack": "100.0",
145-
"DRT::max_capacitance_slack": "-2.6939405927223747",
108+
"DRT::max_capacitance_slack": "-4.333322601907189",
146109
"DRT::clock_period": "8.000000",
147-
"flow__warnings__count": 248,
110+
"flow__warnings__count": 168,
148111
"flow__errors__count": 0
149112
}

0 commit comments

Comments
 (0)