Skip to content

Commit 5dcb44a

Browse files
committed
Merge branch 'master' of github.com:The-OpenROAD-Project-private/OpenROAD into grt-incr-res-aware
2 parents dc6ab06 + 2bec092 commit 5dcb44a

Some content is hidden

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

75 files changed

+7959
-1808
lines changed

MODULE.bazel

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ bazel_dep(name = "bazel-orfs")
162162
# To bump version, run: bazelisk run @bazel-orfs//:bump
163163
git_override(
164164
module_name = "bazel-orfs",
165-
commit = "60f7488a0480dc8f17aba1d28da18f0b3e777f73",
165+
commit = "b2ea891b7a20e806f7a80b97523b9065d498b3ac",
166166
remote = "https://github.com/The-OpenROAD-Project/bazel-orfs.git",
167167
)
168168

@@ -171,10 +171,10 @@ orfs = use_extension("@bazel-orfs//:extension.bzl", "orfs_repositories")
171171
# To bump version, run: bazelisk run @bazel-orfs//:bump
172172
orfs.default(
173173
# Official image https://hub.docker.com/r/openroad/orfs/tags
174-
image = "docker.io/openroad/orfs:v3.0-4324-g16e8a645e",
174+
image = "docker.io/openroad/orfs:v3.0-4338-g23bfbc7f2",
175175
# Use OpenROAD of this repo instead of from the docker image
176176
openroad = "//:openroad",
177-
sha256 = "675813db8a9fbfd08bc86e40675c2a376fc3461b59cbf22d96a2f1905dbb4519",
177+
sha256 = "59fa14cf42c9d2ebf388e77e45cee79ba1ae7dae24cf7fe8a004d6b37d160968",
178178
)
179179
use_repo(orfs, "com_github_nixos_patchelf_download")
180180
use_repo(orfs, "docker_orfs")

MODULE.bazel.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/cts/src/CtsOptions.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,14 @@ void CtsOptions::inDbInstCreate(odb::dbInst* inst, odb::dbRegion* region)
3131

3232
void CtsOptions::limitSinkClusteringSizes(unsigned limit)
3333
{
34-
unsigned new_size = limit;
3534
if (sinkClustersSizeSet_) {
36-
new_size = std::min(new_size, sinkClustersSize_);
35+
setSinkClusteringSize(std::min(limit, sinkClustersSize_));
36+
return;
3737
}
38-
setSinkClusteringSize(new_size);
38+
auto lowerBound = std::lower_bound(
39+
sinkClusteringSizes_.begin(), sinkClusteringSizes_.end(), limit);
40+
sinkClusteringSizes_.erase(lowerBound, sinkClusteringSizes_.end());
41+
sinkClusteringSizes_.push_back(limit);
3942
}
4043

4144
void CtsOptions::recordBuffer(odb::dbMaster* master, MasterType type)

src/cts/src/CtsOptions.h

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ class CtsOptions : public odb::dbBlockCallBackObj
8484

8585
void setSinkClustering(bool enable) { sinkClusteringEnable_ = enable; }
8686
bool getSinkClustering() const { return sinkClusteringEnable_; }
87+
void setSinkClusteringUseMaxCap(bool useMaxCap)
88+
{
89+
sinkClusteringUseMaxCap_ = useMaxCap;
90+
}
91+
bool getSinkClusteringUseMaxCap() const { return sinkClusteringUseMaxCap_; }
8792
void setNumMaxLeafSinks(unsigned numSinks) { numMaxLeafSinks_ = numSinks; }
8893
unsigned getNumMaxLeafSinks() const { return numMaxLeafSinks_; }
8994
void setMaxSlew(unsigned slew) { maxSlew_ = slew; }
@@ -204,26 +209,38 @@ class CtsOptions : public odb::dbBlockCallBackObj
204209
void setMaxDiameter(double distance)
205210
{
206211
maxDiameter_ = distance;
212+
sinkClusteringUseMaxCap_ = false;
207213
maxDiameterSet_ = true;
208214
}
209215
void resetMaxDiameter()
210216
{
211217
maxDiameter_ = 50;
218+
sinkClusteringUseMaxCap_ = true;
212219
maxDiameterSet_ = false;
213220
}
214221
bool isMaxDiameterSet() const { return maxDiameterSet_; }
222+
const std::vector<unsigned>& getSinkClusteringDiameters()
223+
{
224+
return sinkClusteringDiameters_;
225+
}
215226
unsigned getSinkClusteringSize() const { return sinkClustersSize_; }
216227
void setSinkClusteringSize(unsigned size)
217228
{
218229
sinkClustersSize_ = size;
230+
sinkClusteringUseMaxCap_ = false;
219231
sinkClustersSizeSet_ = true;
220232
}
221233
void resetSinkClusteringSize()
222234
{
223-
sinkClustersSize_ = 30;
235+
sinkClustersSize_ = 20;
236+
sinkClusteringUseMaxCap_ = true;
224237
sinkClustersSizeSet_ = false;
225238
}
226239
bool isSinkClusteringSizeSet() const { return sinkClustersSizeSet_; }
240+
const std::vector<unsigned>& getSinkClusteringSizes()
241+
{
242+
return sinkClusteringSizes_;
243+
}
227244
void limitSinkClusteringSizes(unsigned limit);
228245
unsigned getSinkClusteringLevels() const { return sinkClusteringLevels_; }
229246
void setSinkClusteringLevels(unsigned levels)
@@ -346,6 +363,7 @@ class CtsOptions : public odb::dbBlockCallBackObj
346363
unsigned wireSegmentUnit_ = 0;
347364
bool plotSolution_ = false;
348365
bool sinkClusteringEnable_ = true;
366+
bool sinkClusteringUseMaxCap_ = true;
349367
bool simpleSegmentsEnable_ = false;
350368
bool vertexBuffersEnable_ = false;
351369
std::unique_ptr<CtsObserver> observer_;
@@ -372,8 +390,10 @@ class CtsOptions : public odb::dbBlockCallBackObj
372390
int sinks_ = 0;
373391
double maxDiameter_ = 50;
374392
bool maxDiameterSet_ = false;
375-
unsigned sinkClustersSize_ = 30;
393+
std::vector<unsigned> sinkClusteringDiameters_ = {50, 100, 200};
394+
unsigned sinkClustersSize_ = 20;
376395
bool sinkClustersSizeSet_ = false;
396+
std::vector<unsigned> sinkClusteringSizes_ = {10, 20, 30};
377397
double macroMaxDiameter_ = 50;
378398
bool macroMaxDiameterSet_ = false;
379399
unsigned macroSinkClustersSize_ = 4;

src/cts/src/HTreeBuilder.cpp

Lines changed: 62 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,63 @@ void HTreeBuilder::preSinkClustering(
8080

8181
unsigned bestClusterSize = 0;
8282
float bestDiameter = 0.0;
83-
// clang-format off
84-
debugPrint(logger_, CTS, "clustering", 1, "**** match.run({}, {}, {}) ****",
85-
clusterSize, maxDiameter, wireSegmentUnit_);
86-
// clang-format on
87-
matching.run(clusterSize,
88-
maxDiameter,
89-
wireSegmentUnit_,
90-
bestClusterSize,
91-
bestDiameter);
83+
if (clusterSizeSet && maxDiameterSet) {
84+
// clang-format off
85+
debugPrint(logger_, CTS, "clustering", 1, "**** match.run({}, {}, {}) ****",
86+
clusterSize, maxDiameter, wireSegmentUnit_);
87+
// clang-format on
88+
matching.run(clusterSize,
89+
maxDiameter,
90+
wireSegmentUnit_,
91+
bestClusterSize,
92+
bestDiameter);
93+
} else if (!clusterSizeSet && maxDiameterSet) {
94+
// only diameter is set, try clustering sizes of 10, 20 and 30
95+
for (unsigned clusterSize2 : options_->getSinkClusteringSizes()) {
96+
// clang-format off
97+
debugPrint(logger_, CTS, "clustering", 1, "**** match.run({}, {}, {}) ****",
98+
clusterSize2, maxDiameter, wireSegmentUnit_);
99+
// clang-format on
100+
matching.run(clusterSize2,
101+
maxDiameter,
102+
wireSegmentUnit_,
103+
bestClusterSize,
104+
bestDiameter);
105+
}
106+
} else if (clusterSizeSet && !maxDiameterSet) {
107+
// only clustering size is set, try diameters of 50, 100 and 200 um
108+
for (unsigned clusterDiameter2 : options_->getSinkClusteringDiameters()) {
109+
// clang-format off
110+
debugPrint(logger_, CTS, "clustering", 1, "**** match.run({}, {}, {}) ****",
111+
clusterSize, clusterDiameter2, wireSegmentUnit_);
112+
// clang-format on
113+
float maxDiameter2 = clusterDiameter2 * (float) options_->getDbUnits()
114+
/ wireSegmentUnit_;
115+
matching.run(clusterSize,
116+
maxDiameter2,
117+
wireSegmentUnit_,
118+
bestClusterSize,
119+
bestDiameter);
120+
}
121+
} else { // neighther clustering size nor diameter is set
122+
// try diameters of 50, 100 and 200 um
123+
for (unsigned clusterDiameter2 : clusterDiameters()) {
124+
// try clustering sizes of 10, 20 and 30
125+
for (unsigned clusterSize2 : options_->getSinkClusteringSizes()) {
126+
// clang-format off
127+
debugPrint(logger_, CTS, "clustering", 1, "**** match.run({}, {}, {}) ****",
128+
clusterSize2, clusterDiameter2, wireSegmentUnit_);
129+
// clang-format on
130+
float maxDiameter2 = clusterDiameter2 * (float) options_->getDbUnits()
131+
/ wireSegmentUnit_;
132+
matching.run(clusterSize2,
133+
maxDiameter2,
134+
wireSegmentUnit_,
135+
bestClusterSize,
136+
bestDiameter);
137+
}
138+
}
139+
}
92140

93141
if (clusterSizeSet || maxDiameterSet) {
94142
logger_->info(
@@ -1128,21 +1176,18 @@ void HTreeBuilder::run()
11281176
unsigned clusterSize = (type_ == TreeType::MacroTree)
11291177
? options_->getMacroSinkClusteringSize()
11301178
: options_->getSinkClusteringSize();
1131-
bool use_max_diameter = (type_ == TreeType::MacroTree)
1132-
? options_->isMacroMaxDiameterSet()
1133-
: options_->isMaxDiameterSet();
1134-
bool use_max_size = (type_ == TreeType::MacroTree)
1135-
? options_->isMacroSinkClusteringSizeSet()
1136-
: options_->isSinkClusteringSizeSet();
11371179
bool useMaxCap = (type_ == TreeType::MacroTree)
11381180
? false
1139-
: !(use_max_size && use_max_diameter);
1181+
: options_->getSinkClusteringUseMaxCap();
11401182

11411183
logger_->info(
11421184
CTS, 27, "Generating H-Tree topology for net {}.", clock_.getName());
11431185
logger_->info(CTS, 28, " Total number of sinks: {}.", clock_.getNumSinks());
11441186
if (options_->getSinkClustering()) {
1145-
if (!useMaxCap) {
1187+
if (useMaxCap) {
1188+
logger_->info(
1189+
CTS, 90, " Sinks will be clustered based on buffer max cap.");
1190+
} else {
11461191
logger_->info(
11471192
CTS,
11481193
29,
@@ -1151,23 +1196,6 @@ void HTreeBuilder::run()
11511196
type_ == TreeType::MacroTree ? "Macro " : "Register",
11521197
clusterSize,
11531198
clusterDiameter);
1154-
} else if (use_max_diameter && !use_max_size) {
1155-
logger_->info(CTS,
1156-
59,
1157-
" {} sinks will be clustered with maximum cluster diameter "
1158-
"of {:.1f} um and based on buffer max cap.",
1159-
type_ == TreeType::MacroTree ? "Macro " : "Register",
1160-
clusterDiameter);
1161-
} else if (!use_max_diameter && use_max_size) {
1162-
logger_->info(CTS,
1163-
60,
1164-
" {} sinks will be clustered in groups of up to {} and "
1165-
"based on buffer max cap.",
1166-
type_ == TreeType::MacroTree ? "Macro " : "Register",
1167-
clusterSize);
1168-
} else {
1169-
logger_->info(
1170-
CTS, 90, " Sinks will be clustered based on buffer max cap.");
11711199
}
11721200
}
11731201
logger_->info(

src/cts/src/SinkClustering.cpp

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
#include <sstream>
1313
#include <vector>
1414

15-
#include "TreeBuilder.h"
1615
#include "stt/SteinerTreeBuilder.h"
1716
#include "utl/Logger.h"
1817

@@ -29,15 +28,9 @@ SinkClustering::SinkClustering(const CtsOptions* options,
2928
techChar_(techChar),
3029
maxInternalDiameter_(10),
3130
capPerUnit_(0.0),
32-
use_max_diameter_((HTree->getTreeType() == TreeType::MacroTree)
33-
? options->isMacroMaxDiameterSet()
34-
: options->isMaxDiameterSet()),
35-
use_max_size_((HTree->getTreeType() == TreeType::MacroTree)
36-
? options->isMacroSinkClusteringSizeSet()
37-
: options->isSinkClusteringSizeSet()),
3831
useMaxCapLimit_((HTree->getTreeType() == TreeType::MacroTree)
3932
? false
40-
: !(use_max_size_ && use_max_diameter_)),
33+
: options->getSinkClusteringUseMaxCap()),
4134
scaleFactor_(1),
4235
HTree_(HTree)
4336
{
@@ -421,20 +414,11 @@ bool SinkClustering::isLimitExceeded(const unsigned size,
421414
const double capCost,
422415
const unsigned sizeLimit)
423416
{
424-
bool is_limit_exceeded = false;
425417
if (useMaxCapLimit_) {
426-
is_limit_exceeded
427-
|= (capCost > options_->getSinkBufferInputCap() * max_cap__factor_);
418+
return (capCost > options_->getSinkBufferInputCap() * max_cap__factor_);
428419
}
429-
// size is defined by the user
430-
if (use_max_size_) {
431-
is_limit_exceeded |= (size >= sizeLimit);
432-
}
433-
// diameter is defined by the user
434-
if (use_max_diameter_) {
435-
is_limit_exceeded |= (cost > maxInternalDiameter_);
436-
}
437-
return is_limit_exceeded;
420+
421+
return (size >= sizeLimit || cost > maxInternalDiameter_);
438422
}
439423

440424
void SinkClustering::writePlotFile(unsigned groupSize)

src/cts/src/SinkClustering.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,6 @@ class SinkClustering
9090
std::vector<std::vector<unsigned>> bestSolution_;
9191
float maxInternalDiameter_;
9292
float capPerUnit_;
93-
bool use_max_diameter_;
94-
bool use_max_size_;
9593
bool useMaxCapLimit_;
9694
int scaleFactor_;
9795
static constexpr double max_cap__factor_ = 10;

0 commit comments

Comments
 (0)