diff options
author | David Shah <davey1576@gmail.com> | 2018-08-06 21:25:30 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-06 21:25:30 +0200 |
commit | 88d2c49440c952a097107b6299fd09034532a8db (patch) | |
tree | 1729562bd277e25e15fa328900af210bf393968b /common/timing.cc | |
parent | 0b1c67cad348d0470d81aa6d6e72b25a4972f525 (diff) | |
parent | 9addcac09cd9e95a1078b938c92290c453e53160 (diff) | |
download | nextpnr-88d2c49440c952a097107b6299fd09034532a8db.tar.gz nextpnr-88d2c49440c952a097107b6299fd09034532a8db.tar.bz2 nextpnr-88d2c49440c952a097107b6299fd09034532a8db.zip |
Merge pull request #40 from eddiehung/fix_budget_overrides
Fix budget overrides
Diffstat (limited to 'common/timing.cc')
-rw-r--r-- | common/timing.cc | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/common/timing.cc b/common/timing.cc index ae5783cd..d6c46632 100644 --- a/common/timing.cc +++ b/common/timing.cc @@ -2,6 +2,7 @@ * nextpnr -- Next Generation Place and Route * * Copyright (C) 2018 David Shah <david@symbioticeda.com> + * Copyright (C) 2018 Eddie Hung <eddieh@ece.ubc.ca> * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -48,22 +49,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 = ctx->getBudgetOverride(net, usr, net_budget); - if (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(); } |