Skip to content

Commit 12ff72b

Browse files
authored
Merge pull request #8106 from The-OpenROAD-Project-staging/mpl-sa-fixes
Mpl sa fixes
2 parents 03ae045 + d909979 commit 12ff72b

13 files changed

+918
-911
lines changed

src/mpl/src/SimulatedAnnealingCore.cpp

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -707,7 +707,6 @@ void SimulatedAnnealingCore<T>::fastSA()
707707
{
708708
float cost = calNormCost();
709709
float pre_cost = cost;
710-
float delta_cost = 0.0;
711710
int step = 1;
712711
float temperature = init_temperature_;
713712
const float min_t = 1e-10;
@@ -718,31 +717,34 @@ void SimulatedAnnealingCore<T>::fastSA()
718717
// as it is too expensive
719718
notch_weight_ = 0.0;
720719

721-
if (isValid()) {
722-
updateBestValidResult(cost);
723-
}
720+
updateBestResult(cost);
724721

725722
while (step <= max_num_step_) {
726723
for (int i = 0; i < num_perturb_per_step_; i++) {
727724
saveState();
728725
perturb();
729726
cost = calNormCost();
730727

731-
const bool keep_result
732-
= cost < pre_cost
733-
|| best_valid_result_.sequence_pair.pos_sequence.empty();
734-
if (isValid() && keep_result) {
735-
updateBestValidResult(cost);
728+
const bool is_valid = isValid();
729+
const bool improved = cost < pre_cost || best_result_.empty();
730+
if ((!is_best_result_valid_ || is_valid) && improved) {
731+
updateBestResult(cost);
732+
is_best_result_valid_ = is_valid;
736733
}
737734

738-
delta_cost = cost - pre_cost;
739-
const float num = distribution_(generator_);
740-
const float prob
741-
= (delta_cost > 0.0) ? std::exp((-1) * delta_cost / temperature) : 1;
742-
if (num < prob) {
735+
const float delta_cost = cost - pre_cost;
736+
if (delta_cost <= 0) {
737+
// always accept improvements
743738
pre_cost = cost;
744739
} else {
745-
restoreState();
740+
// probabilistically accept degradations for hill climbing
741+
const float num = distribution_(generator_);
742+
const float prob = std::exp(-delta_cost / temperature);
743+
if (num < prob) {
744+
pre_cost = cost;
745+
} else {
746+
restoreState();
747+
}
746748
}
747749
}
748750

@@ -765,40 +767,42 @@ void SimulatedAnnealingCore<T>::fastSA()
765767
graphics_->doNotSkip();
766768
}
767769
calPenalty();
770+
cost = calNormCost();
768771

769-
if (!best_valid_result_.sequence_pair.pos_sequence.empty()
770-
&& (!isValid() || best_valid_result_.cost < calNormCost())) {
771-
useBestValidResult();
772+
const bool is_valid = isValid();
773+
const bool improved = cost < best_result_.cost || best_result_.empty();
774+
if ((is_best_result_valid_ && !is_valid) || !improved) {
775+
useBestResult();
772776
}
773777
}
774778

775779
template <class T>
776-
void SimulatedAnnealingCore<T>::updateBestValidResult(const float cost)
780+
void SimulatedAnnealingCore<T>::updateBestResult(const float cost)
777781
{
778-
best_valid_result_.sequence_pair.pos_sequence = pos_seq_;
779-
best_valid_result_.sequence_pair.neg_sequence = neg_seq_;
782+
best_result_.sequence_pair.pos_sequence = pos_seq_;
783+
best_result_.sequence_pair.neg_sequence = neg_seq_;
780784

781785
if constexpr (std::is_same_v<T, SoftMacro>) {
782786
for (const int macro_id : pos_seq_) {
783787
SoftMacro& macro = macros_[macro_id];
784-
best_valid_result_.macro_id_to_width[macro_id] = macro.getWidth();
788+
best_result_.macro_id_to_width[macro_id] = macro.getWidth();
785789
}
786790
}
787791

788-
best_valid_result_.cost = cost;
792+
best_result_.cost = cost;
789793
}
790794

791795
template <class T>
792-
void SimulatedAnnealingCore<T>::useBestValidResult()
796+
void SimulatedAnnealingCore<T>::useBestResult()
793797
{
794-
pos_seq_ = best_valid_result_.sequence_pair.pos_sequence;
795-
neg_seq_ = best_valid_result_.sequence_pair.neg_sequence;
798+
pos_seq_ = best_result_.sequence_pair.pos_sequence;
799+
neg_seq_ = best_result_.sequence_pair.neg_sequence;
796800

797801
if constexpr (std::is_same_v<T, SoftMacro>) {
798802
for (const int macro_id : pos_seq_) {
799803
SoftMacro& macro = macros_[macro_id];
800804
const float valid_result_width
801-
= best_valid_result_.macro_id_to_width.at(macro_id);
805+
= best_result_.macro_id_to_width.at(macro_id);
802806

803807
if (macro.isMacroCluster()) {
804808
const float valid_result_height = macro.getArea() / valid_result_width;

src/mpl/src/SimulatedAnnealingCore.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ class SimulatedAnnealingCore
9292
protected:
9393
struct Result
9494
{
95+
bool empty() const { return sequence_pair.pos_sequence.empty(); }
96+
9597
float cost{std::numeric_limits<float>::max()};
9698
SequencePair sequence_pair;
9799
// [Only for SoftMacro] The same sequence pair can represent different
@@ -105,8 +107,8 @@ class SimulatedAnnealingCore
105107
const BoundaryRegionList& regions);
106108
void initSequencePair();
107109
void setDieArea(const Rect& die_area);
108-
void updateBestValidResult(float cost);
109-
void useBestValidResult();
110+
void updateBestResult(float cost);
111+
void useBestResult();
110112

111113
virtual float calNormCost() const = 0;
112114
virtual void calPenalty() = 0;
@@ -210,7 +212,8 @@ class SimulatedAnnealingCore
210212
MplObserver* graphics_ = nullptr;
211213
odb::dbBlock* block_;
212214

213-
Result best_valid_result_;
215+
Result best_result_;
216+
bool is_best_result_valid_ = false;
214217

215218
std::vector<float> cost_list_; // store the cost in the list
216219
std::vector<float> T_list_; // store the temperature

src/mpl/test/boundary_push1.defok

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,10 @@ TRACKS Y 140 DO 282 STEP 3200 LAYER metal9 ;
183183
TRACKS X 190 DO 282 STEP 3200 LAYER metal10 ;
184184
TRACKS Y 140 DO 282 STEP 3200 LAYER metal10 ;
185185
COMPONENTS 4 ;
186-
- MACRO_1 HM_100x100_1x1 + FIXED ( 600 610 ) FS ;
187-
- MACRO_2 HM_100x100_1x1 + FIXED ( 600 241970 ) FS ;
188-
- MACRO_3 HM_100x100_1x1 + FIXED ( 239440 241970 ) FS ;
189-
- MACRO_4 HM_100x100_1x1 + FIXED ( 239440 610 ) FS ;
186+
- MACRO_1 HM_100x100_1x1 + FIXED ( 239440 610 ) S ;
187+
- MACRO_2 HM_100x100_1x1 + FIXED ( 600 241970 ) S ;
188+
- MACRO_3 HM_100x100_1x1 + FIXED ( 600 610 ) S ;
189+
- MACRO_4 HM_100x100_1x1 + FIXED ( 239440 241970 ) S ;
190190
END COMPONENTS
191191
PINS 4 ;
192192
- io_1 + NET io_1 + DIRECTION INPUT + USE SIGNAL ;

src/mpl/test/boundary_push2.defok

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,9 @@ TRACKS Y 140 DO 282 STEP 3200 LAYER metal9 ;
183183
TRACKS X 190 DO 282 STEP 3200 LAYER metal10 ;
184184
TRACKS Y 140 DO 282 STEP 3200 LAYER metal10 ;
185185
COMPONENTS 54 ;
186-
- MACRO_1 HM_100x100_1x1 + FIXED ( 600 20770 ) S ;
187-
- MACRO_2 HM_100x100_1x1 + FIXED ( 239440 221810 ) FS ;
188-
- MACRO_3 HM_100x100_1x1 + FIXED ( 600 221810 ) FS ;
186+
- MACRO_1 HM_100x100_1x1 + FIXED ( 600 20770 ) FS ;
187+
- MACRO_2 HM_100x100_1x1 + FIXED ( 600 221810 ) FS ;
188+
- MACRO_3 HM_100x100_1x1 + FIXED ( 239440 221810 ) FS ;
189189
- MACRO_4 HM_100x100_1x1 + FIXED ( 239440 20770 ) FS ;
190190
- _001_ DFF_X1 + PLACED ( 216790 219801 ) N ;
191191
- _002_ DFF_X1 + PLACED ( 216790 219801 ) N ;

src/mpl/test/boundary_push3.defok

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,10 @@ TRACKS Y 140 DO 282 STEP 3200 LAYER metal9 ;
183183
TRACKS X 190 DO 282 STEP 3200 LAYER metal10 ;
184184
TRACKS Y 140 DO 282 STEP 3200 LAYER metal10 ;
185185
COMPONENTS 54 ;
186-
- MACRO_1 HM_100x100_1x1 + FIXED ( 220620 610 ) S ;
187-
- MACRO_2 HM_100x100_1x1 + FIXED ( 19420 610 ) FS ;
188-
- MACRO_3 HM_100x100_1x1 + FIXED ( 19420 241970 ) FS ;
189-
- MACRO_4 HM_100x100_1x1 + FIXED ( 220620 241970 ) FS ;
186+
- MACRO_1 HM_100x100_1x1 + FIXED ( 220620 241970 ) FS ;
187+
- MACRO_2 HM_100x100_1x1 + FIXED ( 220620 610 ) FS ;
188+
- MACRO_3 HM_100x100_1x1 + FIXED ( 19420 610 ) FS ;
189+
- MACRO_4 HM_100x100_1x1 + FIXED ( 19420 241970 ) FS ;
190190
- _001_ DFF_X1 + PLACED ( 216790 219801 ) N ;
191191
- _002_ DFF_X1 + PLACED ( 216790 219801 ) N ;
192192
- _003_ DFF_X1 + PLACED ( 216790 219801 ) N ;

src/mpl/test/centralization1.defok

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ TRACKS Y 140 DO 282 STEP 3200 LAYER metal9 ;
241241
TRACKS X 190 DO 282 STEP 3200 LAYER metal10 ;
242242
TRACKS Y 140 DO 282 STEP 3200 LAYER metal10 ;
243243
COMPONENTS 1 ;
244-
- MACRO_1 HM_100x100_1x1 + FIXED ( 202100 202490 ) FS ;
244+
- MACRO_1 HM_100x100_1x1 + FIXED ( 202100 202490 ) S ;
245245
END COMPONENTS
246246
PINS 1 ;
247247
- io_1 + NET io_1 + DIRECTION INPUT + USE SIGNAL ;

src/mpl/test/clocked_macro.defok

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ TRACKS Y 140 DO 282 STEP 3200 LAYER metal9 ;
339339
TRACKS X 190 DO 282 STEP 3200 LAYER metal10 ;
340340
TRACKS Y 140 DO 282 STEP 3200 LAYER metal10 ;
341341
COMPONENTS 1 ;
342-
- U1 CLOCKED_MACRO + FIXED ( 17880 16610 ) FS ;
342+
- U1 CLOCKED_MACRO + FIXED ( 17880 16610 ) S ;
343343
END COMPONENTS
344344
NETS 3 ;
345345
- clk ( U1 CK ) + USE SIGNAL ;

src/mpl/test/guides2.defok

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -339,16 +339,16 @@ TRACKS Y 140 DO 282 STEP 3200 LAYER metal9 ;
339339
TRACKS X 190 DO 282 STEP 3200 LAYER metal10 ;
340340
TRACKS Y 140 DO 282 STEP 3200 LAYER metal10 ;
341341
COMPONENTS 10 ;
342-
- U1 HM_100x400_4x4 + FIXED ( 665880 16610 ) S ;
343-
- U10 HM_100x100_1x1 + FIXED ( 17880 232430 ) FN ;
344-
- U2 HM_100x100_1x1 + FIXED ( 233880 448450 ) S ;
345-
- U3 HM_100x100_1x1 + FIXED ( 233880 664610 ) S ;
346-
- U4 HM_100x100_1x1 + FIXED ( 233880 16550 ) FN ;
347-
- U5 HM_100x100_1x1 + FIXED ( 17880 448450 ) S ;
348-
- U6 HM_100x400_4x4 + FIXED ( 449880 16590 ) N ;
349-
- U7 HM_100x100_1x1 + FIXED ( 233880 232430 ) N ;
350-
- U8 HM_100x100_1x1 + FIXED ( 17880 664610 ) S ;
351-
- U9 HM_100x100_1x1 + FIXED ( 17880 16550 ) FN ;
342+
- U1 HM_100x400_4x4 + FIXED ( 665880 16590 ) FN ;
343+
- U10 HM_100x100_1x1 + FIXED ( 233880 664610 ) S ;
344+
- U2 HM_100x100_1x1 + FIXED ( 449880 16550 ) FN ;
345+
- U3 HM_100x100_1x1 + FIXED ( 449880 448450 ) S ;
346+
- U4 HM_100x100_1x1 + FIXED ( 449880 232430 ) FN ;
347+
- U5 HM_100x100_1x1 + FIXED ( 449880 664610 ) S ;
348+
- U6 HM_100x400_4x4 + FIXED ( 17880 16590 ) FN ;
349+
- U7 HM_100x100_1x1 + FIXED ( 233880 16550 ) FN ;
350+
- U8 HM_100x100_1x1 + FIXED ( 233880 448450 ) S ;
351+
- U9 HM_100x100_1x1 + FIXED ( 233880 232430 ) FN ;
352352
END COMPONENTS
353353
NETS 12 ;
354354
- w1 ( U2 I1 ) ( U1 O1 ) + USE SIGNAL ;

0 commit comments

Comments
 (0)