Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
a4f7534
drt: fix 3D pin access via generation from bottom layers
jferreiraOpenRoad Dec 31, 2025
c3a4c44
drt: fix clang-format issues in FlexPA_acc_point.cpp
jferreiraOpenRoad Dec 31, 2025
82179e8
feature drt: Only Bterms using down-via
jferreiraOpenRoad Dec 31, 2025
c333733
drt: fix 3D pin access and clang-format issues
jferreiraOpenRoad Dec 31, 2025
d55613f
drt: refactor via search and improve robustness based on review
jferreiraOpenRoad Dec 31, 2025
4772537
drt: fix duplicated logger message ID
jferreiraOpenRoad Dec 31, 2025
634382a
feat: enable 3D pin access and extend top routing layer
jferreiraOpenRoad Jan 14, 2026
c9c0f87
style: fix clang-format violations
jferreiraOpenRoad Jan 14, 2026
7ec1d61
drt: update top_level_term golden files due to auto layer extension
jferreiraOpenRoad Jan 15, 2026
5696d6f
test: update golden files for 3D pin access changes
jferreiraOpenRoad Jan 15, 2026
33c3544
fix(drt): respect top routing layer constraint
jferreiraOpenRoad Jan 15, 2026
d122c78
test(drt): update golden files for top level term tests
jferreiraOpenRoad Jan 15, 2026
a359621
drt: update regression tests for BTerm fix
jferreiraOpenRoad Jan 16, 2026
68bfbd9
Revert changes to io.cpp
jferreiraOpenRoad Jan 16, 2026
98aaca5
Merge remote-tracking branch 'origin/master' into test-drt-fix-3d-pin
osamahammad21 Jan 21, 2026
0c8531d
drt: allow via access from below for bterms when planar is blocked
osamahammad21 Jan 21, 2026
cc62522
Merge pull request #3090 from The-OpenROAD-Project-private/TR-bterm-d…
jferreiraOpenRoad Jan 22, 2026
097d902
clang-tidy requested changes
osamahammad21 Jan 22, 2026
dfc5287
Merge remote-tracking branch 'origin/master' into test-drt-fix-3d-pin
osamahammad21 Jan 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/drt/src/pa/FlexPA.h
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,8 @@ class FlexPA
std::map<frCoord, frAccessPointEnum>& y_coords,
frAccessPointEnum lower_type,
frAccessPointEnum upper_type,
bool is_macro_cell_pin);
bool is_macro_cell_pin,
bool is_bterm = false);

/**
* @brief Generates an OnGrid access coordinate (on or half track)
Expand Down Expand Up @@ -420,7 +421,8 @@ class FlexPA
void genAPEnclosedBoundary(std::map<frCoord, frAccessPointEnum>& coords,
const gtl::rectangle_data<frCoord>& rect,
frLayerNum layer_num,
bool is_curr_layer_horz);
bool is_curr_layer_horz,
bool is_bterm = false);

/**
* @brief Calls the other genAP functions according to the informed cost
Expand All @@ -441,7 +443,8 @@ class FlexPA
frLayerNum base_layer_num,
frLayerNum layer_num,
const gtl::rectangle_data<frCoord>& rect,
int offset = 0);
int offset = 0,
bool is_bterm = false);

bool OnlyAllowOnGridAccess(frLayerNum layer_num, bool is_macro_cell_pin);

Expand Down
72 changes: 56 additions & 16 deletions src/drt/src/pa/FlexPA_acc_point.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,19 @@ void FlexPA::genViaEnclosedCoords(std::map<frCoord, frAccessPointEnum>& coords,
const auto rect_width = gtl::delta(rect, gtl::HORIZONTAL);
const auto rect_height = gtl::delta(rect, gtl::VERTICAL);
frVia via(via_def);
const odb::Rect box = via.getLayer1BBox();
odb::Rect box;
if (via_def->getLayer1Num() == layer_num) {
box = via.getLayer1BBox();
} else if (via_def->getLayer2Num() == layer_num) {
box = via.getLayer2BBox();
} else {
logger_->warn(DRT,
25,
"genViaEnclosedCoords: layer_num {} is not part of via {}",
layer_num,
via_def->getName());
return;
}
const auto via_width = box.dx();
const auto via_height = box.dy();
if (via_width > rect_width || via_height > rect_height) {
Expand Down Expand Up @@ -150,19 +162,39 @@ void FlexPA::genViaEnclosedCoords(std::map<frCoord, frAccessPointEnum>& coords,
void FlexPA::genAPEnclosedBoundary(std::map<frCoord, frAccessPointEnum>& coords,
const gtl::rectangle_data<frCoord>& rect,
const frLayerNum layer_num,
const bool is_curr_layer_horz)
const bool is_curr_layer_horz,
const bool is_bterm)
{
if (layer_num + 1 > getDesign()->getTech()->getTopLayerNum()) {
return;
}
// hardcode first two single vias
const int max_num_via_trial = 2;
int cnt = 0;
for (auto& [tup, via] : layer_num_to_via_defs_[layer_num + 1][1]) {
genViaEnclosedCoords(coords, rect, via, layer_num, is_curr_layer_horz);
cnt++;
if (cnt >= max_num_via_trial) {
break;

auto process_cut_layer = [&](int cut_layer_num, int& counter) {
if (layer_num_to_via_defs_.find(cut_layer_num)
== layer_num_to_via_defs_.end()) {
return;
}
for (auto& [tup, via] : layer_num_to_via_defs_[cut_layer_num][1]) {
genViaEnclosedCoords(coords, rect, via, layer_num, is_curr_layer_horz);
counter++;
if (counter >= max_num_via_trial) {
break;
}
}
};

if (layer_num + 1 <= getDesign()->getTech()->getTopLayerNum()) {
process_cut_layer(layer_num + 1, cnt);
}

if (is_bterm) {
int down_via_cnt = 0;
const int bottom_layer = getDesign()->getTech()->getBottomLayerNum();
for (int l = layer_num - 1; l >= layer_num - 3 && l >= bottom_layer; l--) {
process_cut_layer(l, down_via_cnt);
if (down_via_cnt >= max_num_via_trial) {
break;
}
}
}
}
Expand All @@ -174,7 +206,8 @@ void FlexPA::genAPCosted(
const frLayerNum base_layer_num,
const frLayerNum layer_num,
const gtl::rectangle_data<frCoord>& rect,
const int offset)
const int offset,
const bool is_bterm)
{
auto layer = getDesign()->getTech()->getLayer(layer_num);
const bool is_curr_layer_horz = layer->isHorizontal();
Expand All @@ -195,7 +228,8 @@ void FlexPA::genAPCosted(
break;

case (frAccessPointEnum::EncOpt):
genAPEnclosedBoundary(coords, rect, base_layer_num, is_curr_layer_horz);
genAPEnclosedBoundary(
coords, rect, base_layer_num, is_curr_layer_horz, is_bterm);
break;

case (frAccessPointEnum::NearbyGrid):
Expand Down Expand Up @@ -371,7 +405,8 @@ void FlexPA::genAPsFromRect(const gtl::rectangle_data<frCoord>& rect,
std::map<frCoord, frAccessPointEnum>& y_coords,
const frAccessPointEnum lower_type,
const frAccessPointEnum upper_type,
const bool is_macro_cell_pin)
const bool is_macro_cell_pin,
const bool is_bterm)
{
if (OnlyAllowOnGridAccess(layer_num, is_macro_cell_pin)
&& upper_type != frAccessPointEnum::OnGrid) {
Expand Down Expand Up @@ -436,7 +471,8 @@ void FlexPA::genAPsFromRect(const gtl::rectangle_data<frCoord>& rect,
layer_num,
second_layer_num,
rect,
offset);
offset,
is_bterm);
}
}
if (!use_center_line) {
Expand All @@ -447,7 +483,9 @@ void FlexPA::genAPsFromRect(const gtl::rectangle_data<frCoord>& rect,
layer1_track_coords,
layer_num,
layer_num,
rect);
rect,
0,
is_bterm);
}
}
} else {
Expand Down Expand Up @@ -484,6 +522,7 @@ void FlexPA::genAPsFromLayerShapes(
{
// IO term is treated as the MacroCellPin as the top block
bool is_macro_cell_pin = isMacroCellTerm(inst_term) || isIOTerm(inst_term);
bool is_bterm = (inst_term == nullptr);

std::vector<gtl::rectangle_data<frCoord>> maxrects;
gtl::get_max_rectangles(maxrects, layer_shapes);
Expand All @@ -497,7 +536,8 @@ void FlexPA::genAPsFromLayerShapes(
y_coords,
lower_type,
upper_type,
is_macro_cell_pin);
is_macro_cell_pin,
is_bterm);

layer_rect_to_coords[layer_num].push_back(
{bbox_rect, {x_coords, y_coords}});
Expand Down