diff options
author | Eddie Hung <eddieh@ece.ubc.ca> | 2018-08-06 09:02:49 -0700 |
---|---|---|
committer | Eddie Hung <eddieh@ece.ubc.ca> | 2018-08-06 09:02:49 -0700 |
commit | 266b761f41baef3bb9a50ffc15235451f0fc2b05 (patch) | |
tree | 4d7ff7a0b019684cc4ac7d585f863618286d7ee1 /common | |
parent | 665202e9361bf4229ec4e1fe833c5592624f1230 (diff) | |
parent | c9141262b23b6cbebec0c94deb877fd7cbf2f99a (diff) | |
download | nextpnr-266b761f41baef3bb9a50ffc15235451f0fc2b05.tar.gz nextpnr-266b761f41baef3bb9a50ffc15235451f0fc2b05.tar.bz2 nextpnr-266b761f41baef3bb9a50ffc15235451f0fc2b05.zip |
Merge branch 'fix_budget_overrides' into assign_budget_speedup
Conflicts:
common/timing.cc
Diffstat (limited to 'common')
-rw-r--r-- | common/timing.cc | 47 |
1 files changed, 22 insertions, 25 deletions
diff --git a/common/timing.cc b/common/timing.cc index 69fdd29f..72093183 100644 --- a/common/timing.cc +++ b/common/timing.cc @@ -57,22 +57,26 @@ struct Timing delay_t follow_net(NetInfo *net, int path_length, delay_t slack) { - delay_t net_budget = slack / (path_length + 1); + const delay_t default_budget = slack / (path_length + 1); + delay_t net_budget = default_budget; for (auto &usr : net->users) { + auto delay = net_delays ? ctx->getNetinfoRouteDelay(net, usr) : delay_t(); if (crit_path) current_path.push_back(&usr); - // If budget override is less than existing budget, then do not increment - // path length - int pl = path_length + 1; - auto budget = net_budget; - if (ctx->getBudgetOverride(net, usr, budget) && budget < net_budget) { - net_budget = budget; - pl = std::max(1, path_length); + // If budget override exists, use that value and do not increment path_length + auto budget = default_budget; + if (ctx->getBudgetOverride(net, usr, budget)) { + if (update) + usr.budget = std::min(usr.budget, budget); + budget = follow_user_port(usr, path_length, slack - budget); + net_budget = std::min(net_budget, budget); + } + else { + budget = follow_user_port(usr, path_length + 1, slack - delay); + net_budget = std::min(net_budget, budget); + if (update) + usr.budget = std::min(usr.budget, delay + budget); } - auto delay = net_delays ? ctx->getNetinfoRouteDelay(net, usr) : delay_t(); - net_budget = std::min(net_budget, follow_user_port(usr, pl, slack - delay)); - if (update) - usr.budget = std::min(usr.budget, delay + net_budget); if (crit_path) current_path.pop_back(); } @@ -222,8 +226,7 @@ struct Timing if (ctx->getPortClock(usr.cell, usr.port) != IdString()) { } else { auto net_delay = ctx->getNetinfoRouteDelay(net, usr); - delay_t budget; - auto budget_override = ctx->getBudgetOverride(net, usr, budget); + auto budget_override = ctx->getBudgetOverride(net, usr, net_delay); auto usr_arrival = net_arrival + net_delay; // Follow outputs of the user for (auto port : usr.cell->ports) { @@ -252,15 +255,12 @@ struct Timing auto& net_min_remaining_budget = nd.min_remaining_budget; for (auto &usr : net->users) { const auto net_delay = ctx->getNetinfoRouteDelay(net, usr); - auto budget_override = ctx->getBudgetOverride(net, usr, usr.budget); + auto budget_override = ctx->getBudgetOverride(net, usr, net_delay); if (ctx->getPortClock(usr.cell, usr.port) != IdString()) { const auto net_arrival = nd.max_arrival; auto path_budget = clk_period - (net_arrival + net_delay); - auto budget_share = path_budget / net_length_plus_one; - if (budget_override) - budget_share = 0; - else - usr.budget = std::min(usr.budget, net_delay + budget_share); + auto budget_share = budget_override ? 0 : path_budget / net_length_plus_one; + usr.budget = std::min(usr.budget, net_delay + budget_share); net_min_remaining_budget = std::min(net_min_remaining_budget, path_budget - budget_share); min_slack = std::min(min_slack, path_budget); @@ -277,11 +277,8 @@ struct Timing bool is_path = ctx->getCellDelay(usr.cell, usr.port, port.first, comb_delay); if (is_path) { auto path_budget = net_data.at(port.second.net).min_remaining_budget; - auto budget_share = path_budget / net_length_plus_one; - if (budget_override) - budget_share = 0; - else - usr.budget = std::min(usr.budget, net_delay + budget_share); + auto budget_share = budget_override ? 0 : path_budget / net_length_plus_one; + usr.budget = std::min(usr.budget, net_delay + budget_share); net_min_remaining_budget = std::min(net_min_remaining_budget, path_budget - budget_share); } } |