context: Add getNetinfoRouteDelayQuad

Signed-off-by: gatecat <gatecat@ds0.me>
This commit is contained in:
gatecat 2023-01-18 16:28:33 +01:00
parent a46afc6ff8
commit 6079326633
3 changed files with 49 additions and 1 deletions

View File

@ -157,6 +157,53 @@ delay_t Context::getNetinfoRouteDelay(const NetInfo *net_info, const PortRef &us
return max_delay;
}
DelayQuad Context::getNetinfoRouteDelayQuad(const NetInfo *net_info, const PortRef &user_info) const
{
#ifdef ARCH_ECP5
if (net_info->is_global)
return DelayQuad(0);
#endif
if (net_info->wires.empty())
return DelayQuad(predictArcDelay(net_info, user_info));
WireId src_wire = getNetinfoSourceWire(net_info);
if (src_wire == WireId())
return DelayQuad(0);
DelayQuad result(std::numeric_limits<delay_t>::max(), std::numeric_limits<delay_t>::lowest());
for (auto dst_wire : getNetinfoSinkWires(net_info, user_info)) {
WireId cursor = dst_wire;
DelayQuad delay{0};
while (cursor != WireId() && cursor != src_wire) {
auto it = net_info->wires.find(cursor);
if (it == net_info->wires.end())
break;
PipId pip = it->second.pip;
if (pip == PipId())
break;
delay = delay + getPipDelay(pip);
delay = delay + getWireDelay(cursor);
cursor = getPipSrcWire(pip);
}
if (cursor == src_wire)
delay = delay + getWireDelay(src_wire);
else
delay = DelayQuad(predictArcDelay(net_info, user_info)); // unrouted
result.rise.min_delay = std::min(result.rise.min_delay, delay.rise.min_delay);
result.rise.max_delay = std::max(result.rise.max_delay, delay.rise.max_delay);
result.fall.min_delay = std::min(result.fall.min_delay, delay.fall.min_delay);
result.fall.max_delay = std::max(result.fall.max_delay, delay.fall.max_delay);
}
return result;
}
static uint32_t xorshift32(uint32_t x)
{
x ^= x << 13;

View File

@ -58,6 +58,7 @@ struct Context : Arch, DeterministicRNG
size_t getNetinfoSinkWireCount(const NetInfo *net_info, const PortRef &sink) const;
WireId getNetinfoSinkWire(const NetInfo *net_info, const PortRef &sink, size_t phys_idx) const;
delay_t getNetinfoRouteDelay(const NetInfo *net_info, const PortRef &sink) const;
DelayQuad getNetinfoRouteDelayQuad(const NetInfo *net_info, const PortRef &sink) const;
// provided by router1.cc
bool checkRoutedDesign() const;

View File

@ -324,7 +324,7 @@ void Context::writeSDF(std::ostream &out, bool cvc_mode) const
ic.to.cell = usr.cell->name.str(this);
ic.to.port = usr.port.str(this);
// FIXME: min/max routing delay
ic.delay = convert_delay(DelayQuad(getNetinfoRouteDelay(ni, usr)));
ic.delay = convert_delay(getNetinfoRouteDelayQuad(ni, usr));
wr.conn.push_back(ic);
}
}