aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorEddie Hung <eddieh@ece.ubc.ca>2018-08-06 09:02:49 -0700
committerEddie Hung <eddieh@ece.ubc.ca>2018-08-06 09:02:49 -0700
commit266b761f41baef3bb9a50ffc15235451f0fc2b05 (patch)
tree4d7ff7a0b019684cc4ac7d585f863618286d7ee1 /common
parent665202e9361bf4229ec4e1fe833c5592624f1230 (diff)
parentc9141262b23b6cbebec0c94deb877fd7cbf2f99a (diff)
downloadnextpnr-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.cc47
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);
}
}