Work "overtime" to find better solutions in routing search algorithm
Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
parent
fcfb85e9dc
commit
38dc1cc550
@ -100,7 +100,7 @@ struct Router
|
|||||||
|
|
||||||
std::unordered_set<IdString> rippedNets;
|
std::unordered_set<IdString> rippedNets;
|
||||||
std::unordered_map<WireId, QueuedWire> visited;
|
std::unordered_map<WireId, QueuedWire> visited;
|
||||||
int visitCnt = 0, revisitCnt = 0;
|
int visitCnt = 0, revisitCnt = 0, overtimeRevisitCnt = 0;
|
||||||
bool routedOkay = false;
|
bool routedOkay = false;
|
||||||
delay_t maxDelay = 0.0;
|
delay_t maxDelay = 0.0;
|
||||||
WireId failedDest;
|
WireId failedDest;
|
||||||
@ -126,16 +126,22 @@ struct Router
|
|||||||
visited[qw.wire] = qw;
|
visited[qw.wire] = qw;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!queue.empty() && !visited.count(dst_wire)) {
|
int thisVisitCnt = 0;
|
||||||
|
int thisVisitCntLimit = 0;
|
||||||
|
|
||||||
|
while (!queue.empty() && (thisVisitCntLimit == 0 || thisVisitCnt < thisVisitCntLimit)) {
|
||||||
QueuedWire qw = queue.top();
|
QueuedWire qw = queue.top();
|
||||||
queue.pop();
|
queue.pop();
|
||||||
|
|
||||||
|
if (thisVisitCntLimit == 0 && visited.count(dst_wire))
|
||||||
|
thisVisitCntLimit = (thisVisitCnt*3)/2;
|
||||||
|
|
||||||
for (auto pip : ctx->getPipsDownhill(qw.wire)) {
|
for (auto pip : ctx->getPipsDownhill(qw.wire)) {
|
||||||
delay_t next_delay =
|
delay_t next_delay =
|
||||||
qw.delay + ctx->getPipDelay(pip).avgDelay();
|
qw.delay + ctx->getPipDelay(pip).avgDelay();
|
||||||
WireId next_wire = ctx->getPipDstWire(pip);
|
WireId next_wire = ctx->getPipDstWire(pip);
|
||||||
bool foundRipupNet = false;
|
bool foundRipupNet = false;
|
||||||
visitCnt++;
|
thisVisitCnt++;
|
||||||
|
|
||||||
if (!ctx->checkWireAvail(next_wire)) {
|
if (!ctx->checkWireAvail(next_wire)) {
|
||||||
if (!ripup)
|
if (!ripup)
|
||||||
@ -180,7 +186,10 @@ struct Router
|
|||||||
ctx->getDelayNS(visited.at(next_wire).delay),
|
ctx->getDelayNS(visited.at(next_wire).delay),
|
||||||
ctx->getDelayNS(next_delay));
|
ctx->getDelayNS(next_delay));
|
||||||
#endif
|
#endif
|
||||||
revisitCnt++;
|
if (thisVisitCntLimit == 0)
|
||||||
|
revisitCnt++;
|
||||||
|
else
|
||||||
|
overtimeRevisitCnt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
QueuedWire next_qw;
|
QueuedWire next_qw;
|
||||||
@ -194,6 +203,8 @@ struct Router
|
|||||||
queue.push(next_qw);
|
queue.push(next_qw);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
visitCnt += thisVisitCnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
Router(Context *ctx, RipupScoreboard &scores, WireId src_wire,
|
Router(Context *ctx, RipupScoreboard &scores, WireId src_wire,
|
||||||
@ -488,7 +499,7 @@ bool route_design(Context *ctx)
|
|||||||
if (ctx->verbose)
|
if (ctx->verbose)
|
||||||
log_info("-- %d --\n", iterCnt);
|
log_info("-- %d --\n", iterCnt);
|
||||||
|
|
||||||
int visitCnt = 0, revisitCnt = 0, netCnt = 0;
|
int visitCnt = 0, revisitCnt = 0, overtimeRevisitCnt = 0, netCnt = 0;
|
||||||
|
|
||||||
std::unordered_set<IdString> ripupQueue;
|
std::unordered_set<IdString> ripupQueue;
|
||||||
|
|
||||||
@ -512,6 +523,7 @@ bool route_design(Context *ctx)
|
|||||||
netCnt++;
|
netCnt++;
|
||||||
visitCnt += router.visitCnt;
|
visitCnt += router.visitCnt;
|
||||||
revisitCnt += router.revisitCnt;
|
revisitCnt += router.revisitCnt;
|
||||||
|
overtimeRevisitCnt += router.overtimeRevisitCnt;
|
||||||
|
|
||||||
if (!router.routedOkay) {
|
if (!router.routedOkay) {
|
||||||
if (printNets)
|
if (printNets)
|
||||||
@ -534,8 +546,8 @@ bool route_design(Context *ctx)
|
|||||||
normalRouteCnt, int(ripupQueue.size()));
|
normalRouteCnt, int(ripupQueue.size()));
|
||||||
|
|
||||||
if (ctx->verbose)
|
if (ctx->verbose)
|
||||||
log_info(" routing pass visited %d PIPs (%.2f%% revisits).\n",
|
log_info(" visited %d PIPs (%.2f%% revisits, %.2f%% overtime revisits).\n",
|
||||||
visitCnt, (100.0 * revisitCnt) / visitCnt);
|
visitCnt, (100.0 * revisitCnt) / visitCnt, (100.0 * overtimeRevisitCnt) / visitCnt);
|
||||||
|
|
||||||
if (!ripupQueue.empty()) {
|
if (!ripupQueue.empty()) {
|
||||||
if (ctx->verbose || iterCnt == 1)
|
if (ctx->verbose || iterCnt == 1)
|
||||||
@ -546,6 +558,7 @@ bool route_design(Context *ctx)
|
|||||||
|
|
||||||
visitCnt = 0;
|
visitCnt = 0;
|
||||||
revisitCnt = 0;
|
revisitCnt = 0;
|
||||||
|
overtimeRevisitCnt = 0;
|
||||||
netCnt = 0;
|
netCnt = 0;
|
||||||
int ripCnt = 0;
|
int ripCnt = 0;
|
||||||
|
|
||||||
@ -564,6 +577,7 @@ bool route_design(Context *ctx)
|
|||||||
netCnt++;
|
netCnt++;
|
||||||
visitCnt += router.visitCnt;
|
visitCnt += router.visitCnt;
|
||||||
revisitCnt += router.revisitCnt;
|
revisitCnt += router.revisitCnt;
|
||||||
|
overtimeRevisitCnt += router.overtimeRevisitCnt;
|
||||||
|
|
||||||
if (!router.routedOkay)
|
if (!router.routedOkay)
|
||||||
log_error("Net %s is impossible to route.\n",
|
log_error("Net %s is impossible to route.\n",
|
||||||
@ -597,8 +611,8 @@ bool route_design(Context *ctx)
|
|||||||
log_info(" routed %d nets, ripped %d nets.\n", netCnt, ripCnt);
|
log_info(" routed %d nets, ripped %d nets.\n", netCnt, ripCnt);
|
||||||
|
|
||||||
if (ctx->verbose)
|
if (ctx->verbose)
|
||||||
log_info(" routing pass visited %d PIPs (%.2f%% revisits).\n",
|
log_info(" visited %d PIPs (%.2f%% revisits, %.2f%% overtime revisits).\n",
|
||||||
visitCnt, (100.0 * revisitCnt) / visitCnt);
|
visitCnt, (100.0 * revisitCnt) / visitCnt, (100.0 * overtimeRevisitCnt) / visitCnt);
|
||||||
|
|
||||||
if (ctx->verbose && !netsQueue.empty())
|
if (ctx->verbose && !netsQueue.empty())
|
||||||
log_info(" ripped up %d previously routed nets. continue "
|
log_info(" ripped up %d previously routed nets. continue "
|
||||||
|
Loading…
Reference in New Issue
Block a user