Skip to content

Commit 685c85b

Browse files
committed
cts: update apply_ndr command. Now we have 4 options: none, root_only, half, full
Signed-off-by: Jonas Gava <[email protected]>
1 parent 7bc0e1c commit 685c85b

File tree

5 files changed

+63
-23
lines changed

5 files changed

+63
-23
lines changed

src/cts/src/CtsOptions.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,31 @@
55

66
namespace cts {
77

8+
void CtsOptions::setApplyNDR(const std::string& strategy)
9+
{
10+
std::string lower_strategy = strategy;
11+
std::transform(lower_strategy.begin(),
12+
lower_strategy.end(),
13+
lower_strategy.begin(),
14+
::tolower);
15+
16+
if (lower_strategy == "none") {
17+
ndrStrategy_ = NdrStrategy::NONE;
18+
} else if (lower_strategy == "root_only") {
19+
ndrStrategy_ = NdrStrategy::ROOT_ONLY;
20+
} else if (lower_strategy == "half") {
21+
ndrStrategy_ = NdrStrategy::HALF;
22+
} else if (lower_strategy == "full") {
23+
ndrStrategy_ = NdrStrategy::FULL;
24+
} else {
25+
logger_->warn(utl::CTS,
26+
33,
27+
"Invalid NDR strategy: {}. Defaulting to root_only.",
28+
strategy);
29+
ndrStrategy_ = NdrStrategy::ROOT_ONLY;
30+
}
31+
}
32+
833
CtsOptions::MasterType CtsOptions::getType(odb::dbInst* inst) const
934
{
1035
if (inst->getName().substr(0, dummyload_prefix_.size())

src/cts/src/CtsOptions.h

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ namespace cts {
2727
class CtsOptions : public odb::dbBlockCallBackObj
2828
{
2929
public:
30+
enum class NdrStrategy
31+
{
32+
NONE,
33+
ROOT_ONLY,
34+
HALF,
35+
FULL
36+
};
37+
3038
enum class MasterType
3139
{
3240
DUMMY,
@@ -222,8 +230,6 @@ class CtsOptions : public odb::dbBlockCallBackObj
222230
stt::SteinerTreeBuilder* getSttBuilder() const { return sttBuilder_; }
223231
void setObstructionAware(bool obs) { obsAware_ = obs; }
224232
bool getObstructionAware() const { return obsAware_; }
225-
void setApplyNDR(bool ndr) { applyNDR_ = ndr; }
226-
bool applyNDR() const { return applyNDR_; }
227233
void enableInsertionDelay(bool insDelay) { insertionDelay_ = insDelay; }
228234
bool insertionDelayEnabled() const { return insertionDelay_; }
229235
void setBufferListInferred(bool inferred) { bufferListInferred_ = inferred; }
@@ -264,6 +270,10 @@ class CtsOptions : public odb::dbBlockCallBackObj
264270
void setRepairClockNets(bool value) { repairClockNets_ = value; }
265271
bool getRepairClockNets() { return repairClockNets_; }
266272

273+
// NDR strategies
274+
void setApplyNDR(const std::string& strategy);
275+
NdrStrategy getApplyNdr() const { return ndrStrategy_; }
276+
267277
private:
268278
std::string clockNets_;
269279
std::string rootBuffer_;
@@ -315,7 +325,6 @@ class CtsOptions : public odb::dbBlockCallBackObj
315325
utl::Logger* logger_ = nullptr;
316326
stt::SteinerTreeBuilder* sttBuilder_ = nullptr;
317327
bool obsAware_ = true;
318-
bool applyNDR_ = false;
319328
bool insertionDelay_ = true;
320329
bool bufferListInferred_ = false;
321330
bool sinkBufferInferred_ = false;
@@ -330,6 +339,7 @@ class CtsOptions : public odb::dbBlockCallBackObj
330339
std::string dummyload_prefix_ = "clkload";
331340
MasterCount dummy_count_;
332341
bool repairClockNets_ = false;
342+
NdrStrategy ndrStrategy_ = NdrStrategy::NONE;
333343
};
334344

335345
} // namespace cts

src/cts/src/TritonCTS.cpp

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ void TritonCTS::writeDataToDb()
481481

482482
for (auto& builder : builders_) {
483483
writeClockNetsToDb(builder.get(), clkLeafNets);
484-
if (options_->applyNDR()) {
484+
if (options_->getApplyNdr() != CtsOptions::NdrStrategy::NONE) {
485485
writeClockNDRsToDb(builder.get());
486486
}
487487
if (options_->dummyLoadEnabled()) {
@@ -1697,21 +1697,22 @@ void TritonCTS::writeClockNDRsToDb(TreeBuilder* builder)
16971697

16981698
int clkNets = 0;
16991699

1700-
// TODO: Add user specified args to choose the NDR strategy
1701-
// Option 1: Apply NDR to specific levels
1702-
// const std::vector<int> specificLevels = {0}; // Apply to level 0
1703-
// clkNets = applyNDRToClockLevels(clockNet, clockNDR, specificLevels);
1704-
1705-
// Option 2: Apply NDR to a range of levels (e.g., Levels 0-3)
1706-
// clkNets = applyNDRToClockLevelRange(block_, clockNDR, clkLeafNets, 0, 3);
1707-
1708-
// Option 3: Apply NDR to the first half of the clk tree levels (higher
1709-
// levels)
1710-
// clkNets = applyNDRToFirstHalfLevels(clockNet, clockNDR);
1711-
1712-
// Option 4: Apply NDR to all non-leaf clock nets (default)
1713-
clkNets = applyNDRToClockLevels(
1714-
clockNet, clockNDR, getAllClockTreeLevels(clockNet));
1700+
// Apply NDR following the selected strategy (root_only, half, full)
1701+
switch (options_->getApplyNdr()) {
1702+
case CtsOptions::NdrStrategy::ROOT_ONLY:
1703+
clkNets = applyNDRToClockLevels(clockNet, clockNDR, {0});
1704+
break;
1705+
case CtsOptions::NdrStrategy::HALF:
1706+
clkNets = applyNDRToFirstHalfLevels(clockNet, clockNDR);
1707+
break;
1708+
case CtsOptions::NdrStrategy::FULL:
1709+
clkNets = applyNDRToClockLevels(
1710+
clockNet, clockNDR, getAllClockTreeLevels(clockNet));
1711+
break;
1712+
case CtsOptions::NdrStrategy::NONE:
1713+
// Should not be called
1714+
break;
1715+
}
17151716

17161717
logger_->info(CTS,
17171718
202,

src/cts/src/TritonCTS.i

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,9 @@ set_obstruction_aware(bool obs)
205205
}
206206

207207
void
208-
set_apply_ndr(bool ndr)
208+
set_apply_ndr(const char* strategy)
209209
{
210-
getTritonCts()->getParms()->setApplyNDR(ndr);
210+
getTritonCts()->getParms()->setApplyNDR(strategy);
211211
}
212212

213213
void

src/cts/src/TritonCTS.tcl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,10 @@ proc clock_tree_synthesis { args } {
7474
-clustering_unbalance_ratio -sink_clustering_max_diameter \
7575
-macro_clustering_size -macro_clustering_max_diameter \
7676
-sink_clustering_levels -tree_buf \
77+
-apply_ndr \
7778
-sink_buffer_max_cap_derate -delay_buffer_derate -library} \
7879
flags {-post_cts_disable -sink_clustering_enable -balance_levels \
79-
-obstruction_aware -no_obstruction_aware -apply_ndr \
80+
-obstruction_aware -no_obstruction_aware \
8081
-dont_use_dummy_load -repair_clock_nets -no_insertion_delay
8182
} ;# checker off
8283

@@ -213,7 +214,10 @@ proc clock_tree_synthesis { args } {
213214
cts::set_dummy_load true
214215
}
215216

216-
cts::set_apply_ndr [info exists flags(-apply_ndr)]
217+
if { [info exists keys(-apply_ndr)] } {
218+
set strategy $keys(-apply_ndr)
219+
cts::set_apply_ndr $strategy
220+
}
217221

218222
if { [info exists flags(-repair_clock_nets)] } {
219223
cts::set_repair_clock_nets true

0 commit comments

Comments
 (0)