Skip to content

Commit 0575333

Browse files
Merge pull request #8257 from The-OpenROAD-Project-staging/TR-pa-unique-class
DRT: PA Unique Class
2 parents 95462fe + 17e14f3 commit 0575333

File tree

11 files changed

+255
-235
lines changed

11 files changed

+255
-235
lines changed

src/drt/src/pa/AbstractPAGraphics.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ class AbstractPAGraphics
2727

2828
virtual void startPin(frBPin* pin,
2929
frInstTerm* inst_term,
30-
frOrderedIdSet<frInst*>* inst_class)
30+
UniqueClass* inst_class)
3131
= 0;
3232

3333
virtual void startPin(frMPin* pin,
3434
frInstTerm* inst_term,
35-
frOrderedIdSet<frInst*>* inst_class)
35+
UniqueClass* inst_class)
3636
= 0;
3737

3838
virtual void setAPs(const std::vector<std::unique_ptr<frAccessPoint>>& aps,

src/drt/src/pa/FlexPA.cpp

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ using utl::ThreadException;
4444

4545
static inline void serializePatterns(
4646
const std::unordered_map<
47-
frInst*,
47+
UniqueClass*,
4848
std::vector<std::unique_ptr<FlexPinAccessPattern>>>& patterns,
4949
const std::string& file_name)
5050
{
@@ -53,8 +53,8 @@ static inline void serializePatterns(
5353
registerTypes(ar);
5454
int sz = patterns.size();
5555
ar << sz;
56-
for (auto& [inst, pattern] : patterns) {
57-
frBlockObject* obj = (frBlockObject*) inst;
56+
for (auto& [unique_class, pattern] : patterns) {
57+
frBlockObject* obj = (frBlockObject*) unique_class->getFirstInst();
5858
serializeBlockObject(ar, obj);
5959
ar << pattern;
6060
}
@@ -107,13 +107,14 @@ void FlexPA::init()
107107
void FlexPA::addInst(frInst* inst)
108108
{
109109
const bool new_unique = unique_insts_.addInst(inst);
110+
auto unique_class = unique_insts_.getUniqueClass(inst);
110111
if (new_unique) {
111-
unique_insts_.initUniqueInstPinAccess(inst);
112-
initSkipInstTerm(inst);
112+
unique_insts_.initUniqueInstPinAccess(unique_class);
113+
initSkipInstTerm(unique_class);
113114
genInstAccessPoints(inst);
114115
prepPatternInst(inst);
115116
}
116-
inst->setPinAccessIdx(unique_insts_.getUnique(inst)->getPinAccessIdx());
117+
inst->setPinAccessIdx(unique_class->getPinAccessIdx());
117118

118119
insts_set_.insert(inst);
119120
if (isSkipInst(inst)) {
@@ -125,22 +126,12 @@ void FlexPA::addInst(frInst* inst)
125126

126127
void FlexPA::deleteInst(frInst* inst)
127128
{
128-
const bool is_class_head = (inst == unique_insts_.getUnique(inst));
129-
// if inst is the class head the new head will be returned by deleteInst()
130-
UniqueInsts::InstSet* unique_class = unique_insts_.getClass(inst);
131-
frInst* class_head = unique_insts_.deleteInst(inst);
132-
129+
auto old_unique_class = unique_insts_.getUniqueClass(inst);
130+
unique_insts_.deleteInst(inst);
133131
// whole class has to be deleted
134-
if (!class_head) {
135-
unique_inst_patterns_.erase(inst);
136-
for (auto& inst_term : inst->getInstTerms()) {
137-
skip_unique_inst_term_.erase({unique_class, inst_term->getTerm()});
138-
}
139-
}
140-
// new class representative has to be chosen
141-
else if (is_class_head) {
142-
unique_inst_patterns_[class_head] = std::move(unique_inst_patterns_[inst]);
143-
unique_inst_patterns_.erase(inst);
132+
if (old_unique_class->getInsts().empty()) {
133+
unique_inst_patterns_.erase(old_unique_class);
134+
unique_insts_.deleteUniqueClass(old_unique_class);
144135
}
145136
insts_set_.erase(inst);
146137
}
@@ -157,7 +148,8 @@ void FlexPA::applyPatternsFile(const char* file_path)
157148
while (sz--) {
158149
frBlockObject* obj;
159150
serializeBlockObject(ar, obj);
160-
auto& pattern = unique_inst_patterns_[static_cast<frInst*>(obj)];
151+
auto unique_class = unique_insts_.getUniqueClass(static_cast<frInst*>(obj));
152+
auto& pattern = unique_inst_patterns_[unique_class];
161153
ar >> pattern;
162154
}
163155
file.close();
@@ -217,7 +209,7 @@ void FlexPA::prepPattern()
217209
{
218210
ProfileTask profile("PA:pattern");
219211

220-
const auto& unique = unique_insts_.getUnique();
212+
const auto& unique = unique_insts_.getUniqueClasses();
221213

222214
// revert access points to origin
223215
unique_inst_patterns_.reserve(unique.size());
@@ -227,15 +219,19 @@ void FlexPA::prepPattern()
227219
omp_set_num_threads(router_cfg_->MAX_THREADS);
228220
ThreadException exception;
229221
#pragma omp parallel for schedule(dynamic)
230-
for (frInst* unique_inst : unique) {
222+
for (auto& unique_class : unique) {
231223
try {
232224
// only do for core and block cells
233225
// TODO the above comment says "block cells" but that's not what the code
234226
// does?
235-
if (!isStdCell(unique_inst)) {
227+
if (unique_class->getInsts().empty()) {
228+
continue;
229+
}
230+
auto candidate_inst = *unique_class->getInsts().begin();
231+
if (!isStdCell(candidate_inst)) {
236232
continue;
237233
}
238-
prepPatternInst(unique_inst);
234+
prepPatternInst(candidate_inst);
239235
#pragma omp critical
240236
{
241237
cnt++;
@@ -315,13 +311,13 @@ bool FlexPA::isSkipInstTermLocal(frInstTerm* in)
315311

316312
bool FlexPA::isSkipInstTerm(frInstTerm* in)
317313
{
318-
auto inst_class = unique_insts_.getClass(in->getInst());
314+
auto inst_class = unique_insts_.getUniqueClass(in->getInst());
319315
if (inst_class == nullptr) {
320316
return isSkipInstTermLocal(in);
321317
}
322318

323319
// This should be already computed in initSkipInstTerm()
324-
return skip_unique_inst_term_.at({inst_class, in->getTerm()});
320+
return inst_class->isSkipTerm(in->getTerm());
325321
}
326322

327323
bool FlexPA::isSkipInst(frInst* inst)

src/drt/src/pa/FlexPA.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,13 +126,11 @@ class FlexPA
126126
int macro_cell_pin_valid_planar_ap_cnt_ = 0;
127127
int macro_cell_pin_valid_via_ap_cnt_ = 0;
128128
int macro_cell_pin_no_ap_cnt_ = 0;
129-
std::unordered_map<frInst*,
129+
std::unordered_map<UniqueClass*,
130130
std::vector<std::unique_ptr<FlexPinAccessPattern>>>
131131
unique_inst_patterns_;
132132

133133
UniqueInsts unique_insts_;
134-
using UniqueMTerm = std::pair<const UniqueInsts::InstSet*, frMTerm*>;
135-
std::map<UniqueMTerm, bool> skip_unique_inst_term_;
136134

137135
// helper structures
138136
std::vector<std::map<frCoord, frAccessPointEnum>> track_coords_;
@@ -167,7 +165,7 @@ class FlexPA
167165
void initTrackCoords();
168166
void initViaRawPriority();
169167
void initAllSkipInstTerm();
170-
void initSkipInstTerm(frInst* unique_inst);
168+
void initSkipInstTerm(UniqueClass* unique_class);
171169
// prep
172170
void prep();
173171

src/drt/src/pa/FlexPA_acc_pattern.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,10 @@ void FlexPA::buildInstsSet()
6767

6868
void FlexPA::prepPatternInst(frInst* unique_inst)
6969
{
70+
auto unique_class = unique_insts_.getUniqueClass(unique_inst);
7071
#pragma omp critical
71-
unique_inst_patterns_[unique_inst]
72+
unique_inst_patterns_[unique_class]
7273
= std::vector<std::unique_ptr<FlexPinAccessPattern>>();
73-
7474
int num_valid_pattern = prepPatternInstHelper(unique_inst, true);
7575

7676
if (num_valid_pattern > 0) {
@@ -662,7 +662,8 @@ bool FlexPA::genPatternsCommit(
662662
if (target_obj != nullptr
663663
&& genPatternsGC({target_obj}, objs, Commit, &owners)) {
664664
pin_access_pattern->updateCost();
665-
unique_inst_patterns_[unique_inst].push_back(std::move(pin_access_pattern));
665+
unique_inst_patterns_[unique_insts_.getUniqueClass(unique_inst)].push_back(
666+
std::move(pin_access_pattern));
666667
// genPatternsPrint(nodes, pins);
667668
is_valid = true;
668669
} else {

src/drt/src/pa/FlexPA_acc_point.cpp

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1356,9 +1356,9 @@ int FlexPA::genPinAccess(T* pin, frInstTerm* inst_term)
13561356
std::set<std::pair<Point, frLayerNum>> apset;
13571357

13581358
if (graphics_) {
1359-
frOrderedIdSet<frInst*>* inst_class = nullptr;
1359+
UniqueClass* inst_class = nullptr;
13601360
if (inst_term) {
1361-
inst_class = unique_insts_.getClass(inst_term->getInst());
1361+
inst_class = unique_insts_.getUniqueClass(inst_term->getInst());
13621362
}
13631363
graphics_->startPin(pin, inst_term, inst_class);
13641364
}
@@ -1482,21 +1482,23 @@ void FlexPA::genAllAccessPoints()
14821482
omp_set_num_threads(router_cfg_->MAX_THREADS);
14831483
ThreadException exception;
14841484

1485-
const std::vector<frInst*>& unique = unique_insts_.getUnique();
1485+
const auto& unique = unique_insts_.getUniqueClasses();
14861486
#pragma omp parallel for schedule(dynamic)
1487-
for (frInst* unique_inst : unique) { // NOLINT
1487+
for (const auto& unique_class : unique) { // NOLINT
14881488
try {
1489+
auto candidate_inst = unique_class->getFirstInst();
14891490
// only do for core and block cells
1490-
if (!isStdCell(unique_inst) && !isMacroCell(unique_inst)) {
1491+
if (!isStdCell(candidate_inst) && !isMacroCell(candidate_inst)) {
14911492
continue;
14921493
}
14931494

1494-
genInstAccessPoints(unique_inst);
1495+
genInstAccessPoints(candidate_inst);
14951496
if (router_cfg_->VERBOSE <= 0) {
14961497
continue;
14971498
}
14981499

1499-
int inst_terms_cnt = static_cast<int>(unique_inst->getInstTerms().size());
1500+
int inst_terms_cnt
1501+
= static_cast<int>(candidate_inst->getInstTerms().size());
15001502
#pragma omp critical
15011503
for (int j = 0; j < inst_terms_cnt; j++) {
15021504
pin_count++;
@@ -1548,18 +1550,15 @@ void FlexPA::genAllAccessPoints()
15481550

15491551
void FlexPA::revertAccessPoints()
15501552
{
1551-
const auto& unique = unique_insts_.getUnique();
1552-
for (frInst* inst : unique) {
1553-
const dbTransform xform = inst->getTransform();
1553+
const auto& unique = unique_insts_.getUniqueClasses();
1554+
for (const auto& unique_class : unique) {
1555+
auto candidate_inst = unique_class->getFirstInst();
1556+
const dbTransform xform = candidate_inst->getTransform();
15541557
const Point offset(xform.getOffset());
15551558
dbTransform revertXform(Point(-offset.getX(), -offset.getY()));
15561559

1557-
const auto pin_access_idx = inst->getPinAccessIdx();
1558-
for (auto& inst_term : inst->getInstTerms()) {
1559-
// if (isSkipInstTerm(inst_term.get())) {
1560-
// continue;
1561-
// }
1562-
1560+
const auto pin_access_idx = candidate_inst->getPinAccessIdx();
1561+
for (auto& inst_term : candidate_inst->getInstTerms()) {
15631562
for (auto& pin : inst_term->getTerm()->getPins()) {
15641563
auto pin_access = pin->getPinAccess(pin_access_idx);
15651564
for (auto& access_point : pin_access->getAccessPoints()) {

src/drt/src/pa/FlexPA_graphics.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ void FlexPAGraphics::drawLayer(odb::dbTechLayer* layer, gui::Painter& painter)
151151

152152
void FlexPAGraphics::startPin(frMPin* pin,
153153
frInstTerm* inst_term,
154-
frOrderedIdSet<frInst*>* inst_class)
154+
UniqueClass* inst_class)
155155
{
156156
pin_ = nullptr;
157157

@@ -160,7 +160,7 @@ void FlexPAGraphics::startPin(frMPin* pin,
160160
if (term_name_ != "*" && term->getName() != term_name_) {
161161
return;
162162
}
163-
if (inst_class->find(inst_) == inst_class->end()) {
163+
if (!inst_class->hasInst(inst_)) {
164164
return;
165165
}
166166
}
@@ -180,7 +180,7 @@ void FlexPAGraphics::startPin(frMPin* pin,
180180

181181
void FlexPAGraphics::startPin(frBPin* pin,
182182
frInstTerm* inst_term,
183-
frOrderedIdSet<frInst*>* inst_class)
183+
UniqueClass* inst_class)
184184
{
185185
pin_ = nullptr;
186186

src/drt/src/pa/FlexPA_graphics.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,11 @@ class FlexPAGraphics : public gui::Renderer, public AbstractPAGraphics
4949

5050
void startPin(frBPin* pin,
5151
frInstTerm* inst_term,
52-
frOrderedIdSet<frInst*>* inst_class) override;
52+
UniqueClass* inst_class) override;
5353

5454
void startPin(frMPin* pin,
5555
frInstTerm* inst_term,
56-
frOrderedIdSet<frInst*>* inst_class) override;
56+
UniqueClass* inst_class) override;
5757

5858
void setAPs(const std::vector<std::unique_ptr<frAccessPoint>>& aps,
5959
frAccessPointEnum lower_type,

src/drt/src/pa/FlexPA_init.cpp

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -147,37 +147,25 @@ void FlexPA::initTrackCoords()
147147

148148
void FlexPA::initAllSkipInstTerm()
149149
{
150-
const auto& unique = unique_insts_.getUnique();
150+
const auto& unique = unique_insts_.getUniqueClasses();
151151
#pragma omp parallel for schedule(dynamic)
152-
for (frInst* unique_inst : unique) {
153-
initSkipInstTerm(unique_inst);
152+
for (const auto& unique_class : unique) {
153+
initSkipInstTerm(unique_class.get());
154154
}
155155
}
156156

157-
void FlexPA::initSkipInstTerm(frInst* unique_inst)
157+
void FlexPA::initSkipInstTerm(UniqueClass* unique_class)
158158
{
159-
for (auto& inst_term : unique_inst->getInstTerms()) {
160-
frMTerm* term = inst_term->getTerm();
161-
const UniqueInsts::InstSet* inst_class
162-
= unique_insts_.getClass(unique_inst);
163-
164-
#pragma omp critical
165-
skip_unique_inst_term_[{inst_class, term}] = false;
166-
167-
// We have to be careful that the skip conditions are true not only of
168-
// the unique instance but also all the equivalent instances.
169-
bool skip = isSkipInstTermLocal(inst_term.get());
170-
if (skip) {
171-
for (frInst* inst : *inst_class) {
172-
frInstTerm* it = inst->getInstTerm(inst_term->getIndexInOwner());
173-
skip = isSkipInstTermLocal(it);
174-
if (!skip) {
175-
break;
176-
}
159+
for (const auto& term : unique_class->getMaster()->getTerms()) {
160+
bool skip = true;
161+
for (const auto& inst : unique_class->getInsts()) {
162+
auto inst_term = inst->getInstTerm(term->getIndexInOwner());
163+
skip = isSkipInstTermLocal(inst_term);
164+
if (!skip) {
165+
break;
177166
}
178167
}
179-
#pragma omp critical
180-
skip_unique_inst_term_.at({inst_class, term}) = skip;
168+
unique_class->setSkipTerm(term.get(), skip);
181169
}
182170
}
183171

src/drt/src/pa/FlexPA_row_pattern.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,8 @@ void FlexPA::genInstRowPatternInit(
267267
// init inst nodes
268268
for (int inst_idx = 0; inst_idx < (int) insts.size(); inst_idx++) {
269269
auto& inst = insts[inst_idx];
270-
auto unique_inst = unique_insts_.getUnique(inst);
271-
auto& inst_patterns = unique_inst_patterns_[unique_inst];
270+
auto unique_class = unique_insts_.getUniqueClass(inst);
271+
auto& inst_patterns = unique_inst_patterns_[unique_class];
272272
nodes[inst_idx]
273273
= std::vector<std::unique_ptr<FlexDPNode>>(inst_patterns.size());
274274
for (int acc_pattern_idx = 0; acc_pattern_idx < (int) inst_patterns.size();
@@ -347,9 +347,9 @@ void FlexPA::genInstRowPatternCommit(
347347

348348
frInst* inst = insts[curr_inst_idx];
349349
int access_point_idx = 0;
350-
frInst* unique_inst = unique_insts_.getUnique(inst);
350+
auto unique_class = unique_insts_.getUniqueClass(inst);
351351
auto access_pattern
352-
= unique_inst_patterns_[unique_inst][curr_acc_patterns_idx].get();
352+
= unique_inst_patterns_[unique_class][curr_acc_patterns_idx].get();
353353
auto& access_points = access_pattern->getPattern();
354354

355355
// update inst_term ap
@@ -391,9 +391,9 @@ void FlexPA::genInstRowPatternPrint(
391391
// print debug information
392392
auto& inst = insts[curr_inst_idx];
393393
int access_point_idx = 0;
394-
auto unique_inst = unique_insts_.getUnique(inst);
394+
auto unique_class = unique_insts_.getUniqueClass(inst);
395395
auto access_pattern
396-
= unique_inst_patterns_[unique_inst][curr_acc_pattern_idx].get();
396+
= unique_inst_patterns_[unique_class][curr_acc_pattern_idx].get();
397397
auto& access_points = access_pattern->getPattern();
398398

399399
for (auto& inst_term : inst->getInstTerms()) {
@@ -448,13 +448,13 @@ int FlexPA::getEdgeCost(FlexDPNode* prev_node,
448448
std::vector<std::pair<frConnFig*, frBlockObject*>> objs;
449449
// push the vias from prev inst access pattern and curr inst access pattern
450450
const auto prev_inst = insts[prev_inst_idx];
451-
const auto prev_unique_inst = unique_insts_.getUnique(prev_inst);
451+
const auto prev_unique_class = unique_insts_.getUniqueClass(prev_inst);
452452
const auto curr_inst = insts[curr_inst_idx];
453-
const auto curr_unique_inst = unique_insts_.getUnique(curr_inst);
453+
const auto curr_unique_class = unique_insts_.getUniqueClass(curr_inst);
454454
const auto prev_pin_access_pattern
455-
= unique_inst_patterns_[prev_unique_inst][prev_acc_pattern_idx].get();
455+
= unique_inst_patterns_[prev_unique_class][prev_acc_pattern_idx].get();
456456
const auto curr_pin_access_pattern
457-
= unique_inst_patterns_[curr_unique_inst][curr_acc_pattern_idx].get();
457+
= unique_inst_patterns_[curr_unique_class][curr_acc_pattern_idx].get();
458458
addAccessPatternObj(
459459
prev_inst, prev_pin_access_pattern, objs, temp_vias, true);
460460
addAccessPatternObj(

0 commit comments

Comments
 (0)