Skip to content

Commit 286be5a

Browse files
committed
pdn: add check for macro pin access before running power grid generation
Signed-off-by: Peter Gadfort <[email protected]>
1 parent 0974240 commit 286be5a

11 files changed

+40191
-1
lines changed

src/pdn/src/grid.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1666,6 +1666,66 @@ bool InstanceGrid::isValid() const
16661666
return true;
16671667
}
16681668

1669+
void InstanceGrid::checkSetup() const
1670+
{
1671+
Grid::checkSetup();
1672+
1673+
// check blockages above pins
1674+
std::set<odb::dbBox*> obs;
1675+
odb::dbMaster* master = inst_->getMaster();
1676+
for (auto* box : master->getObstructions()) {
1677+
obs.insert(box);
1678+
}
1679+
1680+
const auto nets = getNets(startsWithPower());
1681+
for (auto* iterm : inst_->getITerms()) {
1682+
if (std::find(nets.begin(), nets.end(), iterm->getNet()) == nets.end()) {
1683+
continue;
1684+
}
1685+
odb::dbTechLayer* top = nullptr;
1686+
std::map<odb::dbTechLayer*, std::set<odb::Rect>> boxes;
1687+
for (auto* mpin : iterm->getMTerm()->getMPins()) {
1688+
for (auto* box : mpin->getGeometry()) {
1689+
auto* layer = box->getTechLayer();
1690+
if (layer == nullptr) {
1691+
continue;
1692+
}
1693+
boxes[layer].insert(box->getBox());
1694+
if (top == nullptr
1695+
|| top->getRoutingLevel() < layer->getRoutingLevel()) {
1696+
top = layer;
1697+
}
1698+
}
1699+
}
1700+
1701+
if (top != nullptr) {
1702+
const int top_idx = top->getNumber();
1703+
for (auto* master_obs : obs) {
1704+
auto* obs_layer = master_obs->getTechLayer();
1705+
if (obs_layer == nullptr) {
1706+
continue;
1707+
}
1708+
if (obs_layer->getType() != odb::dbTechLayerType::ROUTING) {
1709+
continue;
1710+
}
1711+
if (obs_layer->getNumber() > top_idx) {
1712+
for (const auto& pin : boxes[top]) {
1713+
if (pin.intersects(master_obs->getBox())) {
1714+
getLogger()->error(
1715+
utl::PDN,
1716+
6,
1717+
"Pins on {} are blocked by obstructions on {} for {}",
1718+
top->getName(),
1719+
obs_layer->getName(),
1720+
inst_->getName());
1721+
}
1722+
}
1723+
}
1724+
}
1725+
}
1726+
}
1727+
}
1728+
16691729
////////
16701730

16711731
BumpGrid::BumpGrid(VoltageDomain* domain,

src/pdn/src/grid.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ class Grid
153153

154154
virtual bool isReplaceable() const { return false; }
155155

156-
void checkSetup() const;
156+
virtual void checkSetup() const;
157157

158158
void setSwitchedPower(GridSwitchedPower* cell);
159159

@@ -251,6 +251,7 @@ class InstanceGrid : public Grid
251251
bool isReplaceable() const override { return replaceable_; }
252252

253253
virtual bool isValid() const;
254+
void checkSetup() const override;
254255

255256
static ShapeVectorMap getInstanceObstructions(odb::dbInst* inst,
256257
const Halo& halo

src/pdn/test/BUILD

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ load("//test:regression.bzl", "regression_test")
33
# From CMakeLists.txt or_integration_tests(TESTS
44
COMPULSORY_TESTS = [
55
"add_double_global_connection",
6+
"asap7_failed_macro_covered",
67
"asap7_failed_macro_grid",
78
"asap7_no_via_generate",
89
"asap7_no_via_generate_v1_snapped",
@@ -19,6 +20,7 @@ COMPULSORY_TESTS = [
1920
"asap7_vias_max_rows_columns",
2021
"asap7_M1_M3_followpins",
2122
"asap7_M1_M3_followpins_staggered",
23+
"asap7_macro_notcovered",
2224
"bpin_removal",
2325
"core_grid",
2426
"core_grid_adjacentcuts",
@@ -168,6 +170,8 @@ filegroup(
168170
"Nangate45/work_around_yosys/cells.v",
169171
"Nangate45_vias/Nangate45_adjacentcuts.lef",
170172
"asap7_data/fakeram7_256x32.lef",
173+
"asap7_data/fakeram7_256x32_covered.lef",
174+
"asap7_data/fakeram7_256x32_notcovered.lef",
171175
"asap7_vias/asap7_tech_1x.lef",
172176
"asap7_vias/asap7_tech_1x_arrayspacing.lef",
173177
"asap7_vias/asap7_tech_1x_arrayspacing_tightspacing.lef",

src/pdn/test/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ or_integration_tests(
22
"pdn"
33
TESTS
44
add_double_global_connection
5+
asap7_failed_macro_covered
56
asap7_failed_macro_grid
67
asap7_no_via_generate
78
asap7_no_via_generate_v1_snapped
@@ -18,6 +19,7 @@ or_integration_tests(
1819
asap7_vias_max_rows_columns
1920
asap7_M1_M3_followpins
2021
asap7_M1_M3_followpins_staggered
22+
asap7_macro_notcovered
2123
bpin_removal
2224
core_grid
2325
core_grid_adjacentcuts

0 commit comments

Comments
 (0)