Skip to content

Commit fa92de9

Browse files
authored
Merge pull request #6820 from AcKoucher/mpl-io-constraints-regions
mpl: IOs abstraction adaptation to ORFS flow - second version (enhanced)
2 parents 094205a + e3859ce commit fa92de9

41 files changed

Lines changed: 4792 additions & 699 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/mpl/src/MplObserver.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,18 @@ class MplObserver
5454
virtual void setOutline(const odb::Rect& outline) {}
5555
virtual void setGuides(const std::map<int, Rect>& guides) {}
5656
virtual void setFences(const std::map<int, Rect>& fences) {}
57+
virtual void setIOConstraintsMap(
58+
const ClusterToBoundaryRegionMap& io_cluster_to_constraint)
59+
{
60+
}
61+
virtual void setBlockedRegionsForPins(
62+
const std::vector<odb::Rect>& blocked_regions_for_pins)
63+
{
64+
}
65+
virtual void setAvailableRegionsForUnconstrainedPins(
66+
const BoundaryRegionList& regions)
67+
{
68+
}
5769

5870
virtual void setAreaPenalty(const PenaltyData& penalty) {}
5971
virtual void setBoundaryPenalty(const PenaltyData& penalty) {}

src/mpl/src/SACoreHardMacro.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ SACoreHardMacro::SACoreHardMacro(PhysicalHierarchy* tree,
3131
int num_perturb_per_step,
3232
unsigned seed,
3333
MplObserver* graphics,
34-
utl::Logger* logger)
34+
utl::Logger* logger,
35+
odb::dbBlock* block)
3536
: SimulatedAnnealingCore<HardMacro>(tree,
3637
outline,
3738
macros,
@@ -45,7 +46,8 @@ SACoreHardMacro::SACoreHardMacro(PhysicalHierarchy* tree,
4546
num_perturb_per_step,
4647
seed,
4748
graphics,
48-
logger)
49+
logger,
50+
block)
4951
{
5052
flip_prob_ = flip_prob;
5153
}

src/mpl/src/SACoreHardMacro.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ class SACoreHardMacro : public SimulatedAnnealingCore<HardMacro>
3434
int num_perturb_per_step,
3535
unsigned seed,
3636
MplObserver* graphics,
37-
utl::Logger* logger);
37+
utl::Logger* logger,
38+
odb::dbBlock* block);
3839

3940
void run() override;
4041

src/mpl/src/SACoreSoftMacro.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ SACoreSoftMacro::SACoreSoftMacro(PhysicalHierarchy* tree,
4242
int num_perturb_per_step,
4343
unsigned seed,
4444
MplObserver* graphics,
45-
utl::Logger* logger)
45+
utl::Logger* logger,
46+
odb::dbBlock* block)
4647
: SimulatedAnnealingCore<SoftMacro>(tree,
4748
outline,
4849
macros,
@@ -56,7 +57,8 @@ SACoreSoftMacro::SACoreSoftMacro(PhysicalHierarchy* tree,
5657
num_perturb_per_step,
5758
seed,
5859
graphics,
59-
logger),
60+
logger,
61+
block),
6062
root_(tree->root.get())
6163
{
6264
boundary_weight_ = boundary_weight;

src/mpl/src/SACoreSoftMacro.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ class SACoreSoftMacro : public SimulatedAnnealingCore<SoftMacro>
4242
int num_perturb_per_step,
4343
unsigned seed,
4444
MplObserver* graphics,
45-
utl::Logger* logger);
45+
utl::Logger* logger,
46+
odb::dbBlock* block);
4647

4748
void run() override;
4849

src/mpl/src/SimulatedAnnealingCore.cpp

Lines changed: 33 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,9 @@ SimulatedAnnealingCore<T>::SimulatedAnnealingCore(PhysicalHierarchy* tree,
3636
int num_perturb_per_step,
3737
unsigned seed,
3838
MplObserver* graphics,
39-
utl::Logger* logger)
40-
: outline_(outline),
41-
blocked_boundaries_(tree->blocked_boundaries),
42-
graphics_(graphics)
39+
utl::Logger* logger,
40+
odb::dbBlock* block)
41+
: outline_(outline), graphics_(graphics), block_(block)
4342
{
4443
core_weights_ = weights;
4544

@@ -62,7 +61,10 @@ SimulatedAnnealingCore<T>::SimulatedAnnealingCore(PhysicalHierarchy* tree,
6261
macros_ = macros;
6362

6463
setDieArea(tree->die_area);
65-
setBlockedBoundariesForIOs();
64+
setAvailableRegionsForUnconstrainedPins(
65+
tree->available_regions_for_unconstrained_pins);
66+
67+
io_cluster_to_constraint_ = tree->io_cluster_to_constraint;
6668
}
6769

6870
template <class T>
@@ -74,22 +76,14 @@ void SimulatedAnnealingCore<T>::setDieArea(const Rect& die_area)
7476
}
7577

7678
template <class T>
77-
void SimulatedAnnealingCore<T>::setBlockedBoundariesForIOs()
79+
void SimulatedAnnealingCore<T>::setAvailableRegionsForUnconstrainedPins(
80+
const BoundaryRegionList& regions)
7881
{
79-
if (blocked_boundaries_.find(Boundary::L) != blocked_boundaries_.end()) {
80-
left_is_blocked_ = true;
81-
}
82-
83-
if (blocked_boundaries_.find(Boundary::R) != blocked_boundaries_.end()) {
84-
right_is_blocked_ = true;
85-
}
82+
available_regions_for_unconstrained_pins_ = regions;
8683

87-
if (blocked_boundaries_.find(Boundary::B) != blocked_boundaries_.end()) {
88-
bottom_is_blocked_ = true;
89-
}
90-
91-
if (blocked_boundaries_.find(Boundary::T) != blocked_boundaries_.end()) {
92-
top_is_blocked_ = true;
84+
for (BoundaryRegion& region : available_regions_for_unconstrained_pins_) {
85+
region.line.addX(-block_->micronsToDbu(outline_.xMin()));
86+
region.line.addY(-block_->micronsToDbu(outline_.yMin()));
9387
}
9488
}
9589

@@ -284,7 +278,7 @@ void SimulatedAnnealingCore<T>::calWirelength()
284278
T& target = macros_[net.terminals.second];
285279

286280
if (target.isClusterOfUnplacedIOPins()) {
287-
addBoundaryDistToWirelength(source, target, net.weight);
281+
computeWLForClusterOfUnplacedIOPins(source, target, net.weight);
288282
continue;
289283
}
290284

@@ -308,7 +302,7 @@ void SimulatedAnnealingCore<T>::calWirelength()
308302
}
309303

310304
template <class T>
311-
void SimulatedAnnealingCore<T>::addBoundaryDistToWirelength(
305+
void SimulatedAnnealingCore<T>::computeWLForClusterOfUnplacedIOPins(
312306
const T& macro,
313307
const T& unplaced_ios,
314308
const float net_weight)
@@ -321,46 +315,27 @@ void SimulatedAnnealingCore<T>::addBoundaryDistToWirelength(
321315
return;
322316
}
323317

324-
const float x1 = macro.getPinX();
325-
const float y1 = macro.getPinY();
326-
327-
Boundary constraint_boundary
328-
= unplaced_ios.getCluster()->getConstraintBoundary();
329-
330-
if (constraint_boundary == NONE) {
331-
float dist_to_left = max_dist;
332-
if (!left_is_blocked_) {
333-
dist_to_left = std::abs(x1 - die_area_.xMin());
318+
const odb::Point macro_location(block_->micronsToDbu(macro.getPinX()),
319+
block_->micronsToDbu(macro.getPinY()));
320+
double smallest_distance;
321+
if (unplaced_ios.getCluster()->isClusterOfUnconstrainedIOPins()) {
322+
if (available_regions_for_unconstrained_pins_.empty()) {
323+
logger_->critical(
324+
utl::MPL,
325+
47,
326+
"There's no available region for the unconstrained pins!");
334327
}
335328

336-
float dist_to_right = max_dist;
337-
if (!right_is_blocked_) {
338-
dist_to_right = std::abs(x1 - die_area_.xMax());
339-
}
340-
341-
float dist_to_bottom = max_dist;
342-
if (!bottom_is_blocked_) {
343-
dist_to_right = std::abs(y1 - die_area_.yMin());
344-
}
345-
346-
float dist_to_top = max_dist;
347-
if (!top_is_blocked_) {
348-
dist_to_top = std::abs(y1 - die_area_.yMax());
349-
}
350-
351-
wirelength_
352-
+= net_weight
353-
* std::min(
354-
{dist_to_left, dist_to_right, dist_to_bottom, dist_to_top});
355-
} else if (constraint_boundary == Boundary::L
356-
|| constraint_boundary == Boundary::R) {
357-
const float x2 = unplaced_ios.getPinX();
358-
wirelength_ += net_weight * std::abs(x2 - x1);
359-
} else if (constraint_boundary == Boundary::T
360-
|| constraint_boundary == Boundary::B) {
361-
const float y2 = unplaced_ios.getPinY();
362-
wirelength_ += net_weight * std::abs(y2 - y1);
329+
smallest_distance = computeDistToNearestRegion(
330+
macro_location, available_regions_for_unconstrained_pins_, nullptr);
331+
} else {
332+
Cluster* cluster = unplaced_ios.getCluster();
333+
const BoundaryRegion& constraint = io_cluster_to_constraint_.at(cluster);
334+
smallest_distance
335+
= computeDistToNearestRegion(macro_location, {constraint}, nullptr);
363336
}
337+
338+
wirelength_ += net_weight * block_->dbuToMicrons(smallest_distance);
364339
}
365340

366341
// We consider the macro outside the outline based on the location of

src/mpl/src/SimulatedAnnealingCore.h

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ class SimulatedAnnealingCore
5252
int num_perturb_per_step,
5353
unsigned seed,
5454
MplObserver* graphics,
55-
utl::Logger* logger);
55+
utl::Logger* logger,
56+
odb::dbBlock* block);
5657

5758
virtual ~SimulatedAnnealingCore() = default;
5859

@@ -97,19 +98,20 @@ class SimulatedAnnealingCore
9798

9899
void fastSA();
99100

101+
void setAvailableRegionsForUnconstrainedPins(
102+
const BoundaryRegionList& regions);
100103
void initSequencePair();
101104
void setDieArea(const Rect& die_area);
102-
void setBlockedBoundariesForIOs();
103105
void updateBestValidResult();
104106
void useBestValidResult();
105107

106108
virtual float calNormCost() const = 0;
107109
virtual void calPenalty() = 0;
108110
void calOutlinePenalty();
109111
void calWirelength();
110-
void addBoundaryDistToWirelength(const T& macro,
111-
const T& unplaced_ios,
112-
float net_weight);
112+
void computeWLForClusterOfUnplacedIOPins(const T& macro,
113+
const T& unplaced_ios,
114+
float net_weight);
113115
bool isOutsideTheOutline(const T& macro) const;
114116
void calGuidancePenalty();
115117
void calFencePenalty();
@@ -136,8 +138,8 @@ class SimulatedAnnealingCore
136138
Rect outline_;
137139
Rect die_area_; // Offset to the current outline.
138140

139-
// Boundaries blocked for IO pins
140-
std::set<Boundary> blocked_boundaries_;
141+
BoundaryRegionList available_regions_for_unconstrained_pins_;
142+
ClusterToBoundaryRegionMap io_cluster_to_constraint_;
141143

142144
// Number of macros that will actually be part of the sequence pair
143145
int macros_to_place_ = 0;
@@ -203,6 +205,7 @@ class SimulatedAnnealingCore
203205

204206
utl::Logger* logger_ = nullptr;
205207
MplObserver* graphics_ = nullptr;
208+
odb::dbBlock* block_;
206209

207210
Result best_valid_result_;
208211

@@ -213,13 +216,6 @@ class SimulatedAnnealingCore
213216
static constexpr float acc_tolerance_ = 0.001;
214217

215218
bool has_initial_sequence_pair_ = false;
216-
217-
// Blocked boundaries data is kept in bools to avoid overhead
218-
// during SA steps.
219-
bool left_is_blocked_ = false;
220-
bool right_is_blocked_ = false;
221-
bool bottom_is_blocked_ = false;
222-
bool top_is_blocked_ = false;
223219
};
224220

225221
// SACore wrapper function

0 commit comments

Comments
 (0)