@@ -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
878878bool 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
983988void 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
10201029int 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