@@ -1012,12 +1012,16 @@ void PadDirectConnectionStraps::makeShapesFacingCore(
10121012 return ;
10131013 }
10141014
1015- std::set<odb::dbTechLayer*> connectable_layers;
1015+ std::set<odb::dbTechLayer*> pin_layers;
1016+ std::map<odb::dbTechLayer*, std::set<odb::dbTechLayer*>> connectable_layers;
10161017 for (const auto & [layer, shapes] : other_shapes) {
10171018 for (const auto & shape : shapes) {
10181019 if (shape->getType () == target_shapes_type_) {
10191020 const auto layers = getGrid ()->connectableLayers (layer);
1020- connectable_layers.insert (layers.begin (), layers.end ());
1021+ pin_layers.insert (layers.begin (), layers.end ());
1022+ for (auto * clayer : layers) {
1023+ connectable_layers[clayer].insert (layer);
1024+ }
10211025 }
10221026 }
10231027 }
@@ -1033,23 +1037,39 @@ void PadDirectConnectionStraps::makeShapesFacingCore(
10331037 transform.apply (pin_rect);
10341038
10351039 auto * layer = pin->getTechLayer ();
1036- if (connectable_layers .find (layer) == connectable_layers .end ()) {
1040+ if (pin_layers .find (layer) == pin_layers .end ()) {
10371041 // layer is not connectable to a target
10381042 continue ;
10391043 }
10401044
1045+ const auto & connect_layers = connectable_layers[layer];
1046+
10411047 // find nearest target
10421048 for (const auto & [search_layer, search_shape_tree] : other_shapes) {
10431049 if (layer == search_layer) {
10441050 continue ;
10451051 }
1052+ if (connect_layers.find (search_layer) == connect_layers.end ()) {
1053+ // cannot connect to this layer
1054+ continue ;
1055+ }
10461056
10471057 ShapePtr closest_shape
10481058 = getClosestShape (search_shape_tree, pin_rect, net);
10491059 if (closest_shape == nullptr ) {
10501060 continue ;
10511061 }
10521062
1063+ debugPrint (getLogger (),
1064+ utl::PDN,
1065+ " Pad" ,
1066+ 2 ,
1067+ " Connect iterm {} ({}/{}) -> {}" ,
1068+ iterm_->getName (),
1069+ layer->getName (),
1070+ pin->getName (),
1071+ closest_shape->getReportText ());
1072+
10531073 odb::Rect shape_rect;
10541074 if (!snapRectToClosestShape (closest_shape, pin_rect, shape_rect)) {
10551075 continue ;
0 commit comments