Skip to content

Commit 7d59c7d

Browse files
authored
Merge pull request #8691 from arthurjolo/cts_balance_levels_crash
Cts: fix balance levels crash
2 parents da61325 + 7060c70 commit 7d59c7d

File tree

4 files changed

+34
-10
lines changed

4 files changed

+34
-10
lines changed

src/cts/include/cts/TritonCTS.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ class TritonCTS
221221
std::set<odb::dbNet*> visitedClockNets_;
222222
std::map<odb::dbInst*, ClockInst*> inst2clkbuf_;
223223
std::map<ClockInst*, ClockSubNet*> driver2subnet_;
224+
std::map<odb::dbNet*, TreeBuilder*> net2builder_;
224225

225226
// db vars
226227
odb::dbDatabase* db_ = nullptr;

src/cts/src/LatencyBalancer.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ void LatencyBalancer::buildGraph(odb::dbNet* clkInputNet)
158158

159159
for (odb::dbITerm* sinkIterm : driverNet->getITerms()) {
160160
if (sinkIterm->getIoType() == odb::dbIoType::INPUT) {
161+
if (!isSink(sinkIterm) && !propagateClock(sinkIterm)) {
162+
continue;
163+
}
161164
int sinkId = graph_.size();
162165
odb::dbInst* sinkInst = sinkIterm->getInst();
163166
std::string sinkName = sinkInst->getName();
@@ -197,7 +200,7 @@ void LatencyBalancer::buildGraph(odb::dbNet* clkInputNet)
197200
}
198201
}
199202
}
200-
203+
worseDelay_ = std::max(worseDelay_, (arrival + insDelay));
201204
graph_[sinkId].arrival = arrival + insDelay;
202205
debugPrint(logger_,
203206
CTS,
@@ -288,7 +291,10 @@ float LatencyBalancer::computeAveSinkArrivals(TreeBuilder* builder)
288291
odb::dbITerm* iterm = sink.getDbInputPin();
289292
computeSinkArrivalRecur(topInputClockNet, iterm, sumArrivals, numSinks);
290293
});
291-
float aveArrival = sumArrivals / (float) numSinks;
294+
float aveArrival = 0.0;
295+
if (numSinks) {
296+
aveArrival = sumArrivals / (float) numSinks;
297+
}
292298
builder->setAveSinkArrival(aveArrival);
293299
debugPrint(logger_,
294300
CTS,

src/cts/src/TritonCTS.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,9 @@ void TritonCTS::initOneClockTree(odb::dbNet* driverNet,
302302
} else {
303303
clockBuilder = initClock(driverNet, clkInputNet, sdcClockName, parent);
304304
}
305+
if (clockBuilder != nullptr && net2builder_[clkInputNet] == nullptr) {
306+
net2builder_[clkInputNet] = clockBuilder;
307+
}
305308
// Treat gated clocks as separate clock trees
306309
// TODO: include sinks from gated clocks together with other sinks and build
307310
// one clock tree
@@ -317,8 +320,16 @@ void TritonCTS::initOneClockTree(odb::dbNet* driverNet,
317320
if (visitedClockNets_.find(outputNet) == visitedClockNets_.end()
318321
&& !openSta_->sdc()->isLeafPinClock(
319322
network_->dbToSta(outputPin))) {
320-
initOneClockTree(
321-
outputNet, clkInputNet, sdcClockName, clockBuilder);
323+
if (clockBuilder == nullptr
324+
&& net2builder_[clkInputNet] != nullptr) {
325+
initOneClockTree(outputNet,
326+
clkInputNet,
327+
sdcClockName,
328+
net2builder_[clkInputNet]);
329+
} else {
330+
initOneClockTree(
331+
outputNet, clkInputNet, sdcClockName, clockBuilder);
332+
}
322333
}
323334
}
324335
}

src/cts/test/skip_nets.ok

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,15 @@ CTS config:
149149
[INFO CTS-0102] Path depth 2 - 2
150150
[INFO CTS-0207] Leaf load cells 18
151151
[INFO CTS-0033] Balancing latency for clock clk
152-
[DEBUG CTS-insertion delay] new delay buffer delaybuf_0_clk is inserted at (100608 169407)
153-
[DEBUG CTS-insertion delay] new delay buffer delaybuf_1_clk is inserted at (101216 138954)
154-
[DEBUG CTS-insertion delay] new delay buffer delaybuf_2_clk is inserted at (101824 108501)
155-
[DEBUG CTS-insertion delay] new delay buffer delaybuf_3_clk is inserted at (102432 78048)
156-
[INFO CTS-0036] inserted 4 delay buffers
157-
[INFO CTS-0037] Total number of delay buffers: 4
152+
[DEBUG CTS-insertion delay] new delay buffer delaybuf_0_clk is inserted at (53554 164304)
153+
[DEBUG CTS-insertion delay] new delay buffer delaybuf_1_clk is inserted at (53513 162428)
154+
[DEBUG CTS-insertion delay] new delay buffer delaybuf_2_clk is inserted at (53472 160552)
155+
[DEBUG CTS-insertion delay] new delay buffer delaybuf_3_clk is inserted at (53431 158676)
156+
[DEBUG CTS-insertion delay] new delay buffer delaybuf_4_clk is inserted at (100434 178107)
157+
[DEBUG CTS-insertion delay] new delay buffer delaybuf_5_clk is inserted at (100868 156355)
158+
[DEBUG CTS-insertion delay] new delay buffer delaybuf_6_clk is inserted at (101302 134603)
159+
[DEBUG CTS-insertion delay] new delay buffer delaybuf_7_clk is inserted at (101737 112851)
160+
[DEBUG CTS-insertion delay] new delay buffer delaybuf_8_clk is inserted at (102171 91099)
161+
[DEBUG CTS-insertion delay] new delay buffer delaybuf_9_clk is inserted at (102605 69347)
162+
[INFO CTS-0036] inserted 10 delay buffers
163+
[INFO CTS-0037] Total number of delay buffers: 10

0 commit comments

Comments
 (0)