Add router1 cfg.useEstimate, improve getActualRouteDelay
Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
parent
086bc941a8
commit
af74f6e511
@ -484,7 +484,8 @@ struct Context : Arch, DeterministicRNG
|
|||||||
delay_t getNetinfoRouteDelay(const NetInfo *net_info, const PortRef &sink) const;
|
delay_t getNetinfoRouteDelay(const NetInfo *net_info, const PortRef &sink) const;
|
||||||
|
|
||||||
// provided by router1.cc
|
// provided by router1.cc
|
||||||
bool getActualRouteDelay(WireId src_wire, WireId dst_wire, delay_t &delay);
|
bool getActualRouteDelay(WireId src_wire, WireId dst_wire, delay_t &delay,
|
||||||
|
std::unordered_map<WireId, PipId> *route = nullptr, bool useEstimate = true);
|
||||||
|
|
||||||
// --------------------------------------------------------------
|
// --------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -130,7 +130,8 @@ struct Router
|
|||||||
qw.wire = it.first;
|
qw.wire = it.first;
|
||||||
qw.pip = PipId();
|
qw.pip = PipId();
|
||||||
qw.delay = it.second - (it.second / 16);
|
qw.delay = it.second - (it.second / 16);
|
||||||
qw.togo = ctx->estimateDelay(qw.wire, dst_wire);
|
if (cfg.useEstimate)
|
||||||
|
qw.togo = ctx->estimateDelay(qw.wire, dst_wire);
|
||||||
qw.randtag = ctx->rng();
|
qw.randtag = ctx->rng();
|
||||||
|
|
||||||
queue.push(qw);
|
queue.push(qw);
|
||||||
@ -216,7 +217,8 @@ struct Router
|
|||||||
next_qw.wire = next_wire;
|
next_qw.wire = next_wire;
|
||||||
next_qw.pip = pip;
|
next_qw.pip = pip;
|
||||||
next_qw.delay = next_delay;
|
next_qw.delay = next_delay;
|
||||||
next_qw.togo = ctx->estimateDelay(next_wire, dst_wire);
|
if (cfg.useEstimate)
|
||||||
|
next_qw.togo = ctx->estimateDelay(next_wire, dst_wire);
|
||||||
next_qw.randtag = ctx->rng();
|
next_qw.randtag = ctx->rng();
|
||||||
|
|
||||||
visited[next_qw.wire] = next_qw;
|
visited[next_qw.wire] = next_qw;
|
||||||
@ -945,13 +947,32 @@ bool router1(Context *ctx, const Router1Cfg &cfg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Context::getActualRouteDelay(WireId src_wire, WireId dst_wire, delay_t &delay)
|
bool Context::getActualRouteDelay(WireId src_wire, WireId dst_wire, delay_t &delay,
|
||||||
|
std::unordered_map<WireId, PipId> *route, bool useEstimate)
|
||||||
{
|
{
|
||||||
RipupScoreboard scores;
|
RipupScoreboard scores;
|
||||||
Router router(this, Router1Cfg(), scores, src_wire, dst_wire);
|
Router1Cfg cfg;
|
||||||
if (router.routedOkay)
|
cfg.useEstimate = useEstimate;
|
||||||
delay = router.visited.at(dst_wire).delay;
|
|
||||||
return router.routedOkay;
|
Router router(this, cfg, scores, src_wire, dst_wire);
|
||||||
|
|
||||||
|
if (!router.routedOkay)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
delay = router.visited.at(dst_wire).delay;
|
||||||
|
|
||||||
|
if (route != nullptr) {
|
||||||
|
WireId cursor = dst_wire;
|
||||||
|
while (1) {
|
||||||
|
PipId pip = router.visited.at(cursor).pip;
|
||||||
|
(*route)[cursor] = pip;
|
||||||
|
if (pip == PipId())
|
||||||
|
break;
|
||||||
|
cursor = getPipSrcWire(pip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
NEXTPNR_NAMESPACE_END
|
NEXTPNR_NAMESPACE_END
|
||||||
|
@ -29,6 +29,7 @@ struct Router1Cfg
|
|||||||
int maxIterCnt = 200;
|
int maxIterCnt = 200;
|
||||||
bool cleanupReroute = true;
|
bool cleanupReroute = true;
|
||||||
bool fullCleanupReroute = true;
|
bool fullCleanupReroute = true;
|
||||||
|
bool useEstimate = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern bool router1(Context *ctx, const Router1Cfg &cfg);
|
extern bool router1(Context *ctx, const Router1Cfg &cfg);
|
||||||
|
Loading…
Reference in New Issue
Block a user