diff options
author | David Shah <dave@ds0.me> | 2018-12-02 14:14:44 +0000 |
---|---|---|
committer | David Shah <dave@ds0.me> | 2018-12-06 10:53:01 +0000 |
commit | a990a1576cc3b932ec784a0d9863f0ba9c337b0f (patch) | |
tree | a4b663c0436602ac1d2cc7df041e94303e2d7894 /common/timing.cc | |
parent | f3adf5a576a881e39cf78e599cbcd7ed3d3b8ec1 (diff) | |
download | nextpnr-a990a1576cc3b932ec784a0d9863f0ba9c337b0f.tar.gz nextpnr-a990a1576cc3b932ec784a0d9863f0ba9c337b0f.tar.bz2 nextpnr-a990a1576cc3b932ec784a0d9863f0ba9c337b0f.zip |
timing_opt: Fix criticality and cost calculations
Signed-off-by: David Shah <dave@ds0.me>
Diffstat (limited to 'common/timing.cc')
-rw-r--r-- | common/timing.cc | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/common/timing.cc b/common/timing.cc index 000a36b7..18caa989 100644 --- a/common/timing.cc +++ b/common/timing.cc @@ -531,6 +531,10 @@ struct Timing bool is_path = ctx->getCellDelay(drv.cell, port.first, drv.port, comb_delay); if (!is_path) continue; + int cc; + auto pclass = ctx->getPortTimingClass(drv.cell, port.first, cc); + if (pclass != TMG_COMB_INPUT) + continue; NetInfo *sink_net = port.second.net; if (net_data.count(sink_net) && net_data.at(sink_net).count(startdomain.first)) { auto &sink_nd = net_data.at(sink_net).at(startdomain.first); @@ -562,15 +566,24 @@ struct Timing auto &nc = (*net_crit)[net->name]; if (nc.slack.empty()) nc.slack.resize(net->users.size(), std::numeric_limits<delay_t>::max()); + if (ctx->debug) + log_info("Net %s cd %s\n", net->name.c_str(ctx), startdomain.first.clock.c_str(ctx)); for (size_t i = 0; i < net->users.size(); i++) { delay_t slack = nd.min_required.at(i) - (nd.max_arrival + ctx->getNetinfoRouteDelay(net, net->users.at(i))); + if (ctx->debug) + log_info(" user %s.%s required %.02fns arrival %.02f route %.02f slack %.02f\n", + net->users.at(i).cell->name.c_str(ctx), net->users.at(i).port.c_str(ctx), + ctx->getDelayNS(nd.min_required.at(i)), ctx->getDelayNS(nd.max_arrival), + ctx->getDelayNS(ctx->getNetinfoRouteDelay(net, net->users.at(i))), ctx->getDelayNS(slack)); if (worst_slack.count(startdomain.first)) worst_slack.at(startdomain.first) = std::min(worst_slack.at(startdomain.first), slack); else worst_slack[startdomain.first] = slack; nc.slack.at(i) = std::min(nc.slack.at(i), slack); } + if (ctx->debug) + log_break(); } } // Assign criticality values |