Skip to content

Commit b11143c

Browse files
committed
grt: set pin connection layer according to its access point
Signed-off-by: Eder Monteiro <[email protected]>
1 parent b23ff76 commit b11143c

File tree

2 files changed

+36
-26
lines changed

2 files changed

+36
-26
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);

0 commit comments

Comments
 (0)