Skip to content

Commit f58b6fc

Browse files
authored
Merge pull request #8995 from gadfort/pdn-only-create-connect
pdn: only create pad connections to layers it can connect to
2 parents e824ca6 + ca29334 commit f58b6fc

File tree

1 file changed

+23
-3
lines changed

1 file changed

+23
-3
lines changed

src/pdn/src/straps.cpp

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)