aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shah <davey1576@gmail.com>2018-08-06 21:25:30 +0200
committerGitHub <noreply@github.com>2018-08-06 21:25:30 +0200
commit88d2c49440c952a097107b6299fd09034532a8db (patch)
tree1729562bd277e25e15fa328900af210bf393968b
parent0b1c67cad348d0470d81aa6d6e72b25a4972f525 (diff)
parent9addcac09cd9e95a1078b938c92290c453e53160 (diff)
downloadnextpnr-88d2c49440c952a097107b6299fd09034532a8db.tar.gz
nextpnr-88d2c49440c952a097107b6299fd09034532a8db.tar.bz2
nextpnr-88d2c49440c952a097107b6299fd09034532a8db.zip
Merge pull request #40 from eddiehung/fix_budget_overrides
Fix budget overrides
-rw-r--r--common/timing.cc29
-rw-r--r--docs/archapi.md4
-rw-r--r--ecp5/arch.cc2
-rw-r--r--ecp5/arch.h2
-rw-r--r--generic/arch.cc2
-rw-r--r--generic/arch.h2
-rw-r--r--ice40/arch.cc27
-rw-r--r--ice40/arch.h2
8 files changed, 46 insertions, 24 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();
}
diff --git a/docs/archapi.md b/docs/archapi.md
index 79562fe6..222b9f78 100644
--- a/docs/archapi.md
+++ b/docs/archapi.md
@@ -402,9 +402,9 @@ Convert an `delay_t` to an actual real-world delay in nanoseconds.
Convert a `delay_t` to an integer for checksum calculations.
-### delay\_t getBudgetOverride(const NetInfo \*net\_info, const PortRef &sink, delay\_t budget) const
+### bool getBudgetOverride(const NetInfo \*net\_info, const PortRef &sink, delay\_t &budget) const
-Overwrite or modify the timing budget for a given arc. Returns the new budget.
+Overwrite or modify (in-place) the timing budget for a given arc. Returns a bool to indicate whether this was done.
Flow Methods
------------
diff --git a/ecp5/arch.cc b/ecp5/arch.cc
index d72b0085..d2d62241 100644
--- a/ecp5/arch.cc
+++ b/ecp5/arch.cc
@@ -422,7 +422,7 @@ delay_t Arch::predictDelay(const NetInfo *net_info, const PortRef &sink) const
return 200 * (abs(driver_loc.x - sink_loc.x) + abs(driver_loc.y - sink_loc.y));
}
-delay_t Arch::getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t budget) const { return budget; }
+bool Arch::getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t &budget) const { return false; }
// -----------------------------------------------------------------------
diff --git a/ecp5/arch.h b/ecp5/arch.h
index 74f0c4e1..e00e111a 100644
--- a/ecp5/arch.h
+++ b/ecp5/arch.h
@@ -805,7 +805,7 @@ struct Arch : BaseCtx
delay_t getRipupDelayPenalty() const { return 200; }
float getDelayNS(delay_t v) const { return v * 0.001; }
uint32_t getDelayChecksum(delay_t v) const { return v; }
- delay_t getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t budget) const;
+ bool getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t &budget) const;
// -------------------------------------------------
diff --git a/generic/arch.cc b/generic/arch.cc
index 7e65d411..0fa93da8 100644
--- a/generic/arch.cc
+++ b/generic/arch.cc
@@ -408,7 +408,7 @@ delay_t Arch::predictDelay(const NetInfo *net_info, const PortRef &sink) const
return (dx + dy) * grid_distance_to_delay;
}
-delay_t Arch::getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t budget) const { return budget; }
+bool Arch::getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t &budget) const { return false; }
// ---------------------------------------------------------------
diff --git a/generic/arch.h b/generic/arch.h
index a5b3470f..59fe8d05 100644
--- a/generic/arch.h
+++ b/generic/arch.h
@@ -200,7 +200,7 @@ struct Arch : BaseCtx
delay_t getRipupDelayPenalty() const { return 1.0; }
float getDelayNS(delay_t v) const { return v; }
uint32_t getDelayChecksum(delay_t v) const { return 0; }
- delay_t getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t budget) const;
+ bool getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t &budget) const;
bool pack() { return true; }
bool place();
diff --git a/ice40/arch.cc b/ice40/arch.cc
index 0b168383..fcc9d798 100644
--- a/ice40/arch.cc
+++ b/ice40/arch.cc
@@ -637,17 +637,34 @@ std::vector<GroupId> Arch::getGroupGroups(GroupId group) const
// -----------------------------------------------------------------------
-delay_t Arch::getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t budget) const
+bool Arch::getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t &budget) const
{
const auto &driver = net_info->driver;
- if (driver.port == id_cout) {
+ if (driver.port == id_cout && sink.port == id_cin) {
auto driver_loc = getBelLocation(driver.cell->bel);
auto sink_loc = getBelLocation(sink.cell->bel);
if (driver_loc.y == sink_loc.y)
- return 0;
- return 250;
+ budget = 0;
+ else switch (args.type) {
+#ifndef ICE40_HX1K_ONLY
+ case ArchArgs::HX8K:
+#endif
+ case ArchArgs::HX1K:
+ budget = 190; break;
+#ifndef ICE40_HX1K_ONLY
+ case ArchArgs::LP384:
+ case ArchArgs::LP1K:
+ case ArchArgs::LP8K:
+ budget = 290; break;
+ case ArchArgs::UP5K:
+ budget = 560; break;
+#endif
+ default:
+ log_error("Unsupported iCE40 chip type.\n");
+ }
+ return true;
}
- return budget;
+ return false;
}
// -----------------------------------------------------------------------
diff --git a/ice40/arch.h b/ice40/arch.h
index 236f73f1..328950df 100644
--- a/ice40/arch.h
+++ b/ice40/arch.h
@@ -766,7 +766,7 @@ struct Arch : BaseCtx
delay_t getRipupDelayPenalty() const { return 200; }
float getDelayNS(delay_t v) const { return v * 0.001; }
uint32_t getDelayChecksum(delay_t v) const { return v; }
- delay_t getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t budget) const;
+ bool getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t &budget) const;
// -------------------------------------------------