@@ -44,7 +44,7 @@ using utl::ThreadException;
4444
4545static 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()
107107void 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
126127void 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
316312bool 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
327323bool FlexPA::isSkipInst (frInst* inst)
0 commit comments