Skip to content

Commit 0ae7290

Browse files
committed
gui: correct counting of unconstrained paths in charts widget
Signed-off-by: Peter Gadfort <[email protected]>
1 parent 30b098f commit 0ae7290

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

src/gui/src/chartsWidget.cpp

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -235,21 +235,38 @@ void ChartsWidget::removeUnconstrainedPinsAndSetLimits(
235235
int unconstrained_count = 0;
236236
sta::Unit* time_unit = sta_->units()->timeUnit();
237237

238+
auto network = sta_->getDbNetwork();
238239
for (StaPins::iterator pin_iter = end_points.begin();
239240
pin_iter != end_points.end();) {
240-
float slack = stagui_->getPinSlack(*pin_iter);
241+
const sta::Pin* pin = *pin_iter;
241242

242-
if (slack != sta::INF) {
243+
float slack = stagui_->getPinSlack(pin);
244+
245+
if (slack != sta::INF && slack != -sta::INF) {
243246
slack = time_unit->staToUser(slack);
244247
data.min = std::min(slack, data.min);
245248
data.max = std::max(slack, data.max);
246249

247250
++pin_iter;
248251
} else {
249-
auto network = sta_->getDbNetwork();
250-
// Don't count dangling outputs (eg clk loads)
251-
if (!network->direction(*pin_iter)->isOutput()
252-
|| network->net(*pin_iter)) {
252+
const bool is_input = network->direction(pin)->isAnyInput();
253+
auto net = network->isTopLevelPort(pin) ? network->net(network->term(pin))
254+
: network->net(pin);
255+
bool has_connections = false;
256+
if (net != nullptr) {
257+
std::unique_ptr<sta::NetPinIterator> pin_itr(network->pinIterator(net));
258+
while (pin_itr->hasNext()) {
259+
auto next_pin = pin_itr->next();
260+
261+
if (next_pin != pin) {
262+
has_connections = true;
263+
break;
264+
}
265+
}
266+
}
267+
268+
// Only consider input endpoints and nets with more than 1 connection
269+
if (is_input || has_connections) {
253270
unconstrained_count++;
254271
}
255272
pin_iter = end_points.erase(pin_iter);

0 commit comments

Comments
 (0)