Skip to content

Commit a4b543e

Browse files
authored
Merge pull request #8393 from The-OpenROAD-Project-staging/secure-hier-repair-tie-fanout
rsz: Enhanced repair_tie_fanout to support hierarchical flow
2 parents 0702233 + c83f28d commit a4b543e

32 files changed

+5956
-316
lines changed

src/dbSta/include/db_sta/dbNetwork.hh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,9 @@ class dbNetwork : public ConcreteNetwork
178178
void hierarchicalConnect(dbITerm* source_pin,
179179
dbITerm* dest_pin,
180180
const char* connection_name = "net");
181+
void hierarchicalConnect(dbITerm* source_pin,
182+
dbModITerm* dest_pin,
183+
const char* connection_name = "net");
181184
Instance* findHierInstance(const char* name);
182185
void replaceHierModule(dbModInst* mod_inst, dbModule* module);
183186
void removeUnusedPortsAndPinsOnModuleInstances();
@@ -251,6 +254,8 @@ class dbNetwork : public ConcreteNetwork
251254
PortDirection* direction(const Pin* pin) const override;
252255
VertexId vertexId(const Pin* pin) const override;
253256
void setVertexId(Pin* pin, VertexId id) override;
257+
// Find the connected dbModITerm in the parent module of the input pin.
258+
dbModITerm* findInputModITermInParent(const Pin* input_pin) const;
254259

255260
////////////////////////////////////////////////////////////////
256261
// Terminal functions
@@ -366,6 +371,7 @@ class dbNetwork : public ConcreteNetwork
366371
dbNet* orig_flat_net);
367372

368373
void reassociateFromDbNetView(dbNet* flat_net, dbModNet* mod_net);
374+
void reassociatePinConnection(Pin* pin);
369375

370376
void accumulateFlatLoadPinsOnNet(
371377
Net* net,

src/dbSta/src/dbEditHierarchy.cc

Lines changed: 262 additions & 130 deletions
Large diffs are not rendered by default.

src/dbSta/src/dbEditHierarchy.hh

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ using odb::dbModule;
2525
using odb::dbNet;
2626

2727
class dbNetwork;
28+
class Pin;
2829

2930
// This class manipulates hierarchical relationships with pins, nets, and
3031
// instances.
@@ -40,26 +41,39 @@ class dbEditHierarchy
4041
void setLogger(Logger* logger) { logger_ = logger; }
4142
void getParentHierarchy(dbModule* start_module,
4243
std::vector<dbModule*>& parent_hierarchy) const;
43-
dbModule* findHighestCommonModule(std::vector<dbModule*>& itree1,
44-
std::vector<dbModule*>& itree2) const;
44+
dbModule* findLowestCommonModule(std::vector<dbModule*>& itree1,
45+
std::vector<dbModule*>& itree2) const;
4546
bool connectionToModuleExists(dbITerm* source_pin,
4647
dbModule* dest_module,
4748
dbModBTerm*& dest_modbterm,
4849
dbModITerm*& dest_moditerm) const;
4950
void hierarchicalConnect(dbITerm* source_pin,
5051
dbITerm* dest_pin,
5152
const char* connection_name = "net");
53+
void hierarchicalConnect(dbITerm* source_pin,
54+
dbModITerm* dest_pin,
55+
const char* connection_name = "net");
5256

5357
private:
54-
void createHierarchyBottomUp(dbITerm* pin,
55-
dbModule* highest_common_module,
58+
void createHierarchyBottomUp(Pin* pin,
59+
dbModule* lowest_common_module,
5660
const dbIoType& io_type,
5761
const char* connection_name,
5862
dbModNet*& top_mod_net,
5963
dbModITerm*& top_mod_iterm) const;
64+
void reassociatePinConnection(Pin* pin);
65+
66+
// During the addition of new ports and new wiring we may
67+
// leave orphaned pins, clean them up.
68+
void cleanUnusedHierPins(
69+
const std::vector<dbModule*>& source_parent_tree,
70+
const std::vector<dbModule*>& dest_parent_tree) const;
71+
72+
const char* getBaseName(const char* connection_name) const;
73+
6074
// Debug log methods
6175
void dlogHierConnStart(dbITerm* source_pin,
62-
dbITerm* dest_pin,
76+
Pin* dest_pin,
6377
const char* connection_name) const;
6478
void dlogHierConnCreateFlatNet(const std::string& flat_name) const;
6579
void dlogHierConnConnectSrcToFlatNet(dbITerm* source_pin,
@@ -69,13 +83,13 @@ class dbEditHierarchy
6983
void dlogHierConnReusingConnection(dbModule* dest_db_module,
7084
dbModNet* dest_mod_net) const;
7185
void dlogHierConnCreatingSrcHierarchy(dbITerm* source_pin,
72-
dbModule* highest_common_module) const;
73-
void dlogHierConnCreatingDstHierarchy(dbITerm* dest_pin,
74-
dbModule* highest_common_module) const;
86+
dbModule* lowest_common_module) const;
87+
void dlogHierConnCreatingDstHierarchy(Pin* dest_pin,
88+
dbModule* lowest_common_module) const;
7589
void dlogHierConnConnectingInCommon(const char* connection_name,
76-
dbModule* highest_common_module) const;
90+
dbModule* lowest_common_module) const;
7791
void dlogHierConnCreatingTopNet(const char* connection_name,
78-
dbModule* highest_common_module) const;
92+
dbModule* lowest_common_module) const;
7993
void dlogHierConnConnectingTopDstPin(dbModITerm* top_mod_dest,
8094
dbModNet* net) const;
8195
void dlogHierConnConnectingDstPin(dbITerm* dest_pin, dbModNet* top_net) const;
@@ -92,11 +106,11 @@ class dbEditHierarchy
92106
const std::string& new_term_net_name_i) const;
93107
void dlogCreateHierDisconnectingPin(int level,
94108
dbModule* cur_module,
95-
dbITerm* pin,
109+
Pin* pin,
96110
dbModNet* pin_mod_net) const;
97111
void dlogCreateHierConnectingPin(int level,
98112
dbModule* cur_module,
99-
dbITerm* pin,
113+
Pin* pin,
100114
dbModNet* db_mod_net) const;
101115
void dlogCreateHierCreatingITerm(
102116
int level,

src/dbSta/src/dbNetwork.cc

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1583,6 +1583,51 @@ void dbNetwork::setVertexId(Pin* pin, VertexId id)
15831583
}
15841584
}
15851585

1586+
dbModITerm* dbNetwork::findInputModITermInParent(const Pin* input_pin) const
1587+
{
1588+
if (input_pin == nullptr) {
1589+
return nullptr;
1590+
}
1591+
1592+
dbITerm* iterm = nullptr;
1593+
dbBTerm* bterm = nullptr;
1594+
dbModITerm* mod_iterm = nullptr;
1595+
staToDb(input_pin, iterm, bterm, mod_iterm);
1596+
1597+
// Get mod net
1598+
dbModNet* mod_net = nullptr;
1599+
if (iterm) {
1600+
assert(iterm->getIoType().getValue() != dbIoType::OUTPUT);
1601+
mod_net = iterm->getModNet();
1602+
} else if (mod_iterm) {
1603+
assert(mod_iterm->getChildModBTerm()->getIoType().getValue()
1604+
!= dbIoType::OUTPUT);
1605+
mod_net = mod_iterm->getModNet();
1606+
}
1607+
1608+
if (mod_net == nullptr) {
1609+
return nullptr;
1610+
}
1611+
1612+
// Get the input modBTerm.
1613+
// - Typically, there will be one or zero input modBTerm.
1614+
dbModBTerm* input_mod_bterm = nullptr;
1615+
for (dbModBTerm* mod_bterm : mod_net->getModBTerms()) {
1616+
if (dbIoType::OUTPUT != mod_bterm->getIoType().getValue()) {
1617+
input_mod_bterm = mod_bterm;
1618+
break;
1619+
}
1620+
}
1621+
1622+
if (input_mod_bterm == nullptr) {
1623+
return nullptr;
1624+
}
1625+
1626+
// Found the target modITerm in parent.
1627+
dbModITerm* parent_mod_iterm = input_mod_bterm->getParentModITerm();
1628+
return parent_mod_iterm;
1629+
}
1630+
15861631
void dbNetwork::location(const Pin* pin,
15871632
// Return values.
15881633
double& x,
@@ -3479,6 +3524,13 @@ void dbNetwork::hierarchicalConnect(dbITerm* source_pin,
34793524
hierarchy_editor_->hierarchicalConnect(source_pin, dest_pin, connection_name);
34803525
}
34813526

3527+
void dbNetwork::hierarchicalConnect(dbITerm* source_pin,
3528+
dbModITerm* dest_pin,
3529+
const char* connection_name)
3530+
{
3531+
hierarchy_editor_->hierarchicalConnect(source_pin, dest_pin, connection_name);
3532+
}
3533+
34823534
/*
34833535
Get the dbModule driving a net.
34843536
@@ -3824,6 +3876,21 @@ void dbNetwork::reassociateFromDbNetView(dbNet* flat_net, dbModNet* mod_net)
38243876
visitConnectedPins(dbToSta(flat_net), visitordb, visited_dbnets);
38253877
}
38263878

3879+
void dbNetwork::reassociatePinConnection(Pin* pin)
3880+
{
3881+
// Ensure that a pin is consistently connected to both its hierarchical
3882+
// (dbModNet) and flat (dbNet) representations. This is often needed after
3883+
// complex hierarchical edits.
3884+
dbModNet* mod_net = hierNet(pin);
3885+
if (mod_net) {
3886+
dbNet* flat_net = this->flatNet(pin);
3887+
// Disconnect both flat and hierarchical nets before reconnecting
3888+
// to ensure a clean state.
3889+
disconnectPin(pin);
3890+
connectPin(pin, dbToSta(flat_net), dbToSta(mod_net));
3891+
}
3892+
}
3893+
38273894
void dbNetwork::replaceHierModule(dbModInst* mod_inst, dbModule* module)
38283895
{
38293896
(void) mod_inst->swapMaster(module);

0 commit comments

Comments
 (0)