Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
a986328
mpl:
AcKoucher Feb 6, 2025
a102c48
mpl: some refactoring, clean up and anotations for subsequent work
AcKoucher Feb 6, 2025
f8f5de5
mpl:
AcKoucher Feb 27, 2025
f157c03
mpl: uncomment code
AcKoucher Feb 28, 2025
a4f6ea9
mpl: fix limit/max cost for dist to boundary WL computation
AcKoucher Feb 28, 2025
3c4fefc
mpl:
AcKoucher Mar 4, 2025
98dc6a6
mpl: adapt orientation improvement to work with regions
AcKoucher Mar 5, 2025
3ba36bb
mpl: remove odd comment
AcKoucher Mar 5, 2025
db20afb
mpl: remove comment
AcKoucher Mar 5, 2025
0ec8347
mpl: adapt pusher to new io blockages based on regions and
AcKoucher Mar 5, 2025
3a90f13
mpl: adjust regression tests' results to orientation improve bug fix …
AcKoucher Mar 5, 2025
7ee63d0
mpl:
AcKoucher Mar 6, 2025
701ca9e
mpl:
AcKoucher Mar 6, 2025
f734be7
mpl:
AcKoucher Mar 6, 2025
9d95cd3
mpl: clang-tidy and format
AcKoucher Mar 7, 2025
845d02a
mpl: remove unneeded function and alias from util.h
AcKoucher Mar 7, 2025
b33f9de
mpl: remove unused APIs to avoid confusion
AcKoucher Mar 7, 2025
526ff46
Merge branch 'master' into mpl-io-constraints-regions
AcKoucher Mar 14, 2025
becd880
Merge branch 'master' into mpl-io-constraints-regions
AcKoucher Apr 28, 2025
dd6f684
mpl:
AcKoucher Apr 28, 2025
52132c5
Merge branch 'master' into mpl-io-constraints-regions
AcKoucher Apr 28, 2025
67d1cf4
mpl:
AcKoucher Apr 28, 2025
d8bd6b7
mpl: limit pin access blockages' depth
AcKoucher Apr 28, 2025
2da59d0
mpl: improve comment
AcKoucher Apr 28, 2025
e33ab33
mpl: address clang-tidy
AcKoucher Apr 28, 2025
6ee3dd3
mpl:
AcKoucher Apr 29, 2025
6c34940
mpl:
AcKoucher Apr 29, 2025
6fd0ec5
mpl: missing const
AcKoucher Apr 29, 2025
f25b016
mpl: use the minimum distance to the nearest point
AcKoucher May 5, 2025
5a9af09
mpl:
AcKoucher May 6, 2025
284223c
mpl:
AcKoucher May 6, 2025
a76731b
mpl:
AcKoucher May 6, 2025
0ccc662
mpl:
AcKoucher May 7, 2025
d235ce6
Merge branch 'master' into mpl-io-constraints-regions
AcKoucher May 7, 2025
7087692
mpl:
AcKoucher May 9, 2025
5010d1e
mpl: renaming and more simplifications
AcKoucher May 9, 2025
ece7ecc
mpl:
AcKoucher May 9, 2025
04ce233
Merge branch 'master' into mpl-io-constraints-regions
AcKoucher May 19, 2025
feae30b
mpl:
AcKoucher May 20, 2025
e3859ce
Merge branch 'master' into mpl-io-constraints-regions
AcKoucher May 20, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/mpl/src/MplObserver.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,18 @@ class MplObserver
virtual void setOutline(const odb::Rect& outline) {}
virtual void setGuides(const std::map<int, Rect>& guides) {}
virtual void setFences(const std::map<int, Rect>& fences) {}
virtual void setIOConstraintsMap(
const ClusterToBoundaryRegionMap& io_cluster_to_constraint)
{
}
virtual void setBlockedRegionsForPins(
const std::vector<odb::Rect>& blocked_regions_for_pins)
{
}
virtual void setAvailableRegionsForUnconstrainedPins(
const BoundaryRegionList& regions)
{
}

virtual void setAreaPenalty(const PenaltyData& penalty) {}
virtual void setBoundaryPenalty(const PenaltyData& penalty) {}
Expand Down
6 changes: 4 additions & 2 deletions src/mpl/src/SACoreHardMacro.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ SACoreHardMacro::SACoreHardMacro(PhysicalHierarchy* tree,
int num_perturb_per_step,
unsigned seed,
MplObserver* graphics,
utl::Logger* logger)
utl::Logger* logger,
odb::dbBlock* block)
: SimulatedAnnealingCore<HardMacro>(tree,
outline,
macros,
Expand All @@ -45,7 +46,8 @@ SACoreHardMacro::SACoreHardMacro(PhysicalHierarchy* tree,
num_perturb_per_step,
seed,
graphics,
logger)
logger,
block)
{
flip_prob_ = flip_prob;
}
Expand Down
3 changes: 2 additions & 1 deletion src/mpl/src/SACoreHardMacro.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ class SACoreHardMacro : public SimulatedAnnealingCore<HardMacro>
int num_perturb_per_step,
unsigned seed,
MplObserver* graphics,
utl::Logger* logger);
utl::Logger* logger,
odb::dbBlock* block);

void run() override;

Expand Down
6 changes: 4 additions & 2 deletions src/mpl/src/SACoreSoftMacro.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ SACoreSoftMacro::SACoreSoftMacro(PhysicalHierarchy* tree,
int num_perturb_per_step,
unsigned seed,
MplObserver* graphics,
utl::Logger* logger)
utl::Logger* logger,
odb::dbBlock* block)
: SimulatedAnnealingCore<SoftMacro>(tree,
outline,
macros,
Expand All @@ -56,7 +57,8 @@ SACoreSoftMacro::SACoreSoftMacro(PhysicalHierarchy* tree,
num_perturb_per_step,
seed,
graphics,
logger),
logger,
block),
root_(tree->root.get())
{
boundary_weight_ = boundary_weight;
Expand Down
3 changes: 2 additions & 1 deletion src/mpl/src/SACoreSoftMacro.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ class SACoreSoftMacro : public SimulatedAnnealingCore<SoftMacro>
int num_perturb_per_step,
unsigned seed,
MplObserver* graphics,
utl::Logger* logger);
utl::Logger* logger,
odb::dbBlock* block);

void run() override;

Expand Down
91 changes: 33 additions & 58 deletions src/mpl/src/SimulatedAnnealingCore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,9 @@ SimulatedAnnealingCore<T>::SimulatedAnnealingCore(PhysicalHierarchy* tree,
int num_perturb_per_step,
unsigned seed,
MplObserver* graphics,
utl::Logger* logger)
: outline_(outline),
blocked_boundaries_(tree->blocked_boundaries),
graphics_(graphics)
utl::Logger* logger,
odb::dbBlock* block)
: outline_(outline), graphics_(graphics), block_(block)
{
core_weights_ = weights;

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

setDieArea(tree->die_area);
setBlockedBoundariesForIOs();
setAvailableRegionsForUnconstrainedPins(
tree->available_regions_for_unconstrained_pins);

io_cluster_to_constraint_ = tree->io_cluster_to_constraint;
}

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

template <class T>
void SimulatedAnnealingCore<T>::setBlockedBoundariesForIOs()
void SimulatedAnnealingCore<T>::setAvailableRegionsForUnconstrainedPins(
const BoundaryRegionList& regions)
{
if (blocked_boundaries_.find(Boundary::L) != blocked_boundaries_.end()) {
left_is_blocked_ = true;
}

if (blocked_boundaries_.find(Boundary::R) != blocked_boundaries_.end()) {
right_is_blocked_ = true;
}
available_regions_for_unconstrained_pins_ = regions;

if (blocked_boundaries_.find(Boundary::B) != blocked_boundaries_.end()) {
bottom_is_blocked_ = true;
}

if (blocked_boundaries_.find(Boundary::T) != blocked_boundaries_.end()) {
top_is_blocked_ = true;
for (BoundaryRegion& region : available_regions_for_unconstrained_pins_) {
region.line.addX(-block_->micronsToDbu(outline_.xMin()));
region.line.addY(-block_->micronsToDbu(outline_.yMin()));
}
}

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

if (target.isClusterOfUnplacedIOPins()) {
addBoundaryDistToWirelength(source, target, net.weight);
computeWLForClusterOfUnplacedIOPins(source, target, net.weight);
continue;
}

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

template <class T>
void SimulatedAnnealingCore<T>::addBoundaryDistToWirelength(
void SimulatedAnnealingCore<T>::computeWLForClusterOfUnplacedIOPins(
const T& macro,
const T& unplaced_ios,
const float net_weight)
Expand All @@ -321,46 +315,27 @@ void SimulatedAnnealingCore<T>::addBoundaryDistToWirelength(
return;
}

const float x1 = macro.getPinX();
const float y1 = macro.getPinY();

Boundary constraint_boundary
= unplaced_ios.getCluster()->getConstraintBoundary();

if (constraint_boundary == NONE) {
float dist_to_left = max_dist;
if (!left_is_blocked_) {
dist_to_left = std::abs(x1 - die_area_.xMin());
const odb::Point macro_location(block_->micronsToDbu(macro.getPinX()),
block_->micronsToDbu(macro.getPinY()));
double smallest_distance;
if (unplaced_ios.getCluster()->isClusterOfUnconstrainedIOPins()) {
if (available_regions_for_unconstrained_pins_.empty()) {
logger_->critical(
utl::MPL,
47,
"There's no available region for the unconstrained pins!");
}

float dist_to_right = max_dist;
if (!right_is_blocked_) {
dist_to_right = std::abs(x1 - die_area_.xMax());
}

float dist_to_bottom = max_dist;
if (!bottom_is_blocked_) {
dist_to_right = std::abs(y1 - die_area_.yMin());
}

float dist_to_top = max_dist;
if (!top_is_blocked_) {
dist_to_top = std::abs(y1 - die_area_.yMax());
}

wirelength_
+= net_weight
* std::min(
{dist_to_left, dist_to_right, dist_to_bottom, dist_to_top});
} else if (constraint_boundary == Boundary::L
|| constraint_boundary == Boundary::R) {
const float x2 = unplaced_ios.getPinX();
wirelength_ += net_weight * std::abs(x2 - x1);
} else if (constraint_boundary == Boundary::T
|| constraint_boundary == Boundary::B) {
const float y2 = unplaced_ios.getPinY();
wirelength_ += net_weight * std::abs(y2 - y1);
smallest_distance = computeDistToNearestRegion(
macro_location, available_regions_for_unconstrained_pins_, nullptr);
} else {
Cluster* cluster = unplaced_ios.getCluster();
const BoundaryRegion& constraint = io_cluster_to_constraint_.at(cluster);
smallest_distance
= computeDistToNearestRegion(macro_location, {constraint}, nullptr);
}

wirelength_ += net_weight * block_->dbuToMicrons(smallest_distance);
}

// We consider the macro outside the outline based on the location of
Expand Down
24 changes: 10 additions & 14 deletions src/mpl/src/SimulatedAnnealingCore.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ class SimulatedAnnealingCore
int num_perturb_per_step,
unsigned seed,
MplObserver* graphics,
utl::Logger* logger);
utl::Logger* logger,
odb::dbBlock* block);

virtual ~SimulatedAnnealingCore() = default;

Expand Down Expand Up @@ -97,19 +98,20 @@ class SimulatedAnnealingCore

void fastSA();

void setAvailableRegionsForUnconstrainedPins(
const BoundaryRegionList& regions);
void initSequencePair();
void setDieArea(const Rect& die_area);
void setBlockedBoundariesForIOs();
void updateBestValidResult();
void useBestValidResult();

virtual float calNormCost() const = 0;
virtual void calPenalty() = 0;
void calOutlinePenalty();
void calWirelength();
void addBoundaryDistToWirelength(const T& macro,
const T& unplaced_ios,
float net_weight);
void computeWLForClusterOfUnplacedIOPins(const T& macro,
const T& unplaced_ios,
float net_weight);
bool isOutsideTheOutline(const T& macro) const;
void calGuidancePenalty();
void calFencePenalty();
Expand All @@ -136,8 +138,8 @@ class SimulatedAnnealingCore
Rect outline_;
Rect die_area_; // Offset to the current outline.

// Boundaries blocked for IO pins
std::set<Boundary> blocked_boundaries_;
BoundaryRegionList available_regions_for_unconstrained_pins_;
ClusterToBoundaryRegionMap io_cluster_to_constraint_;

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

utl::Logger* logger_ = nullptr;
MplObserver* graphics_ = nullptr;
odb::dbBlock* block_;

Result best_valid_result_;

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

bool has_initial_sequence_pair_ = false;

// Blocked boundaries data is kept in bools to avoid overhead
// during SA steps.
bool left_is_blocked_ = false;
bool right_is_blocked_ = false;
bool bottom_is_blocked_ = false;
bool top_is_blocked_ = false;
};

// SACore wrapper function
Expand Down
Loading