Merge pull request #40 from eddiehung/fix_budget_overrides
Fix budget overrides
This commit is contained in:
commit
88d2c49440
@ -2,6 +2,7 @@
|
|||||||
* nextpnr -- Next Generation Place and Route
|
* nextpnr -- Next Generation Place and Route
|
||||||
*
|
*
|
||||||
* Copyright (C) 2018 David Shah <david@symbioticeda.com>
|
* 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
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* 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 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) {
|
for (auto &usr : net->users) {
|
||||||
|
auto delay = net_delays ? ctx->getNetinfoRouteDelay(net, usr) : delay_t();
|
||||||
if (crit_path)
|
if (crit_path)
|
||||||
current_path.push_back(&usr);
|
current_path.push_back(&usr);
|
||||||
// If budget override is less than existing budget, then do not increment
|
// If budget override exists, use that value and do not increment path_length
|
||||||
// path length
|
auto budget = default_budget;
|
||||||
int pl = path_length + 1;
|
if (ctx->getBudgetOverride(net, usr, budget)) {
|
||||||
auto budget = ctx->getBudgetOverride(net, usr, net_budget);
|
|
||||||
if (budget < net_budget) {
|
|
||||||
net_budget = budget;
|
|
||||||
pl = std::max(1, path_length);
|
|
||||||
}
|
|
||||||
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)
|
if (update)
|
||||||
usr.budget = std::min(usr.budget, delay + net_budget);
|
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);
|
||||||
|
}
|
||||||
if (crit_path)
|
if (crit_path)
|
||||||
current_path.pop_back();
|
current_path.pop_back();
|
||||||
}
|
}
|
||||||
|
@ -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.
|
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
|
Flow Methods
|
||||||
------------
|
------------
|
||||||
|
@ -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));
|
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; }
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -805,7 +805,7 @@ struct Arch : BaseCtx
|
|||||||
delay_t getRipupDelayPenalty() const { return 200; }
|
delay_t getRipupDelayPenalty() const { return 200; }
|
||||||
float getDelayNS(delay_t v) const { return v * 0.001; }
|
float getDelayNS(delay_t v) const { return v * 0.001; }
|
||||||
uint32_t getDelayChecksum(delay_t v) const { return v; }
|
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;
|
||||||
|
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
|
|
||||||
|
@ -408,7 +408,7 @@ delay_t Arch::predictDelay(const NetInfo *net_info, const PortRef &sink) const
|
|||||||
return (dx + dy) * grid_distance_to_delay;
|
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; }
|
||||||
|
|
||||||
// ---------------------------------------------------------------
|
// ---------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -200,7 +200,7 @@ struct Arch : BaseCtx
|
|||||||
delay_t getRipupDelayPenalty() const { return 1.0; }
|
delay_t getRipupDelayPenalty() const { return 1.0; }
|
||||||
float getDelayNS(delay_t v) const { return v; }
|
float getDelayNS(delay_t v) const { return v; }
|
||||||
uint32_t getDelayChecksum(delay_t v) const { return 0; }
|
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 pack() { return true; }
|
||||||
bool place();
|
bool place();
|
||||||
|
@ -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;
|
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 driver_loc = getBelLocation(driver.cell->bel);
|
||||||
auto sink_loc = getBelLocation(sink.cell->bel);
|
auto sink_loc = getBelLocation(sink.cell->bel);
|
||||||
if (driver_loc.y == sink_loc.y)
|
if (driver_loc.y == sink_loc.y)
|
||||||
return 0;
|
budget = 0;
|
||||||
return 250;
|
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 budget;
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
@ -766,7 +766,7 @@ struct Arch : BaseCtx
|
|||||||
delay_t getRipupDelayPenalty() const { return 200; }
|
delay_t getRipupDelayPenalty() const { return 200; }
|
||||||
float getDelayNS(delay_t v) const { return v * 0.001; }
|
float getDelayNS(delay_t v) const { return v * 0.001; }
|
||||||
uint32_t getDelayChecksum(delay_t v) const { return v; }
|
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;
|
||||||
|
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user