Work "overtime" to find better solutions in routing search algorithm

Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
Clifford Wolf 2018-06-21 19:17:04 +02:00
parent fcfb85e9dc
commit 38dc1cc550

View File

@ -100,7 +100,7 @@ struct Router
std::unordered_set<IdString> rippedNets;
std::unordered_map<WireId, QueuedWire> visited;
int visitCnt = 0, revisitCnt = 0;
int visitCnt = 0, revisitCnt = 0, overtimeRevisitCnt = 0;
bool routedOkay = false;
delay_t maxDelay = 0.0;
WireId failedDest;
@ -126,16 +126,22 @@ struct Router
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();
queue.pop();
if (thisVisitCntLimit == 0 && visited.count(dst_wire))
thisVisitCntLimit = (thisVisitCnt*3)/2;
for (auto pip : ctx->getPipsDownhill(qw.wire)) {
delay_t next_delay =
qw.delay + ctx->getPipDelay(pip).avgDelay();
WireId next_wire = ctx->getPipDstWire(pip);
bool foundRipupNet = false;
visitCnt++;
thisVisitCnt++;
if (!ctx->checkWireAvail(next_wire)) {
if (!ripup)
@ -180,7 +186,10 @@ struct Router
ctx->getDelayNS(visited.at(next_wire).delay),
ctx->getDelayNS(next_delay));
#endif
revisitCnt++;
if (thisVisitCntLimit == 0)
revisitCnt++;
else
overtimeRevisitCnt++;
}
QueuedWire next_qw;
@ -194,6 +203,8 @@ struct Router
queue.push(next_qw);
}
}
visitCnt += thisVisitCnt;
}
Router(Context *ctx, RipupScoreboard &scores, WireId src_wire,
@ -488,7 +499,7 @@ bool route_design(Context *ctx)
if (ctx->verbose)
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;
@ -512,6 +523,7 @@ bool route_design(Context *ctx)
netCnt++;
visitCnt += router.visitCnt;
revisitCnt += router.revisitCnt;
overtimeRevisitCnt += router.overtimeRevisitCnt;
if (!router.routedOkay) {
if (printNets)
@ -534,8 +546,8 @@ bool route_design(Context *ctx)
normalRouteCnt, int(ripupQueue.size()));
if (ctx->verbose)
log_info(" routing pass visited %d PIPs (%.2f%% revisits).\n",
visitCnt, (100.0 * revisitCnt) / visitCnt);
log_info(" visited %d PIPs (%.2f%% revisits, %.2f%% overtime revisits).\n",
visitCnt, (100.0 * revisitCnt) / visitCnt, (100.0 * overtimeRevisitCnt) / visitCnt);
if (!ripupQueue.empty()) {
if (ctx->verbose || iterCnt == 1)
@ -546,6 +558,7 @@ bool route_design(Context *ctx)
visitCnt = 0;
revisitCnt = 0;
overtimeRevisitCnt = 0;
netCnt = 0;
int ripCnt = 0;
@ -564,6 +577,7 @@ bool route_design(Context *ctx)
netCnt++;
visitCnt += router.visitCnt;
revisitCnt += router.revisitCnt;
overtimeRevisitCnt += router.overtimeRevisitCnt;
if (!router.routedOkay)
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);
if (ctx->verbose)
log_info(" routing pass visited %d PIPs (%.2f%% revisits).\n",
visitCnt, (100.0 * revisitCnt) / visitCnt);
log_info(" visited %d PIPs (%.2f%% revisits, %.2f%% overtime revisits).\n",
visitCnt, (100.0 * revisitCnt) / visitCnt, (100.0 * overtimeRevisitCnt) / visitCnt);
if (ctx->verbose && !netsQueue.empty())
log_info(" ripped up %d previously routed nets. continue "