@@ -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