mirror of https://github.com/YosysHQ/nextpnr.git
wip: cost of existing routing on heap
This commit is contained in:
parent
9b117b8b95
commit
6710ec45aa
|
|
@ -329,7 +329,7 @@ struct Router2
|
||||||
DeterministicRNG rng;
|
DeterministicRNG rng;
|
||||||
|
|
||||||
// Used to add existing routing to the heap
|
// Used to add existing routing to the heap
|
||||||
pool<WireId> in_wire_by_loc;
|
dict<WireId, float> wire_by_loc_cost;
|
||||||
dict<std::pair<int, int>, pool<WireId>> wire_by_loc;
|
dict<std::pair<int, int>, pool<WireId>> wire_by_loc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -742,15 +742,34 @@ struct Router2
|
||||||
WireId cursor = ad.sink_wire;
|
WireId cursor = ad.sink_wire;
|
||||||
if (!nd.wires.count(cursor))
|
if (!nd.wires.count(cursor))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Compute cost
|
||||||
|
float final_cost = 0;
|
||||||
while (cursor != nd.src_wire) {
|
while (cursor != nd.src_wire) {
|
||||||
if (!t.in_wire_by_loc.count(cursor)) {
|
auto found = t.wire_by_loc_cost.find(cursor);
|
||||||
t.in_wire_by_loc.insert(cursor);
|
if (found != t.wire_by_loc_cost.end()) {
|
||||||
for (auto dh : ctx->getPipsDownhill(cursor)) {
|
final_cost += found->second;
|
||||||
Loc dh_loc = ctx->getPipLocation(dh);
|
break;
|
||||||
t.wire_by_loc[std::make_pair(dh_loc.x, dh_loc.y)].insert(cursor);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
cursor = ctx->getPipSrcWire(nd.wires.at(cursor).first);
|
auto pip = nd.wires.at(cursor).first;
|
||||||
|
final_cost += cfg.get_base_cost(ctx, cursor, pip, 0);
|
||||||
|
cursor = ctx->getPipSrcWire(pip);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
while (cursor != nd.src_wire) {
|
||||||
|
if (t.wire_by_loc_cost.count(cursor))
|
||||||
|
break;
|
||||||
|
t.wire_by_loc_cost[cursor] = final_cost;
|
||||||
|
auto pip = nd.wires.at(cursor).first;
|
||||||
|
for (auto dh : ctx->getPipsDownhill(cursor)) {
|
||||||
|
Loc dh_loc = ctx->getPipLocation(dh);
|
||||||
|
t.wire_by_loc[std::make_pair(dh_loc.x, dh_loc.y)].insert(cursor);
|
||||||
|
}
|
||||||
|
// clamp at epsilon to avoid the risk of small negative delays breaking the router in case of rounding errors
|
||||||
|
final_cost = std::max(ctx->getDelayNS(ctx->getDelayEpsilon()),
|
||||||
|
final_cost - cfg.get_base_cost(ctx, cursor, pip, 0));
|
||||||
|
cursor = ctx->getPipSrcWire(pip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -854,14 +873,14 @@ struct Router2
|
||||||
ROUTE_LOG_DBG("src_wire = %s -> dst_wire = %s\n", ctx->nameOfWire(src_wire), ctx->nameOfWire(dst_wire));
|
ROUTE_LOG_DBG("src_wire = %s -> dst_wire = %s\n", ctx->nameOfWire(src_wire), ctx->nameOfWire(dst_wire));
|
||||||
|
|
||||||
// Add 'forward' direction startpoints to queue
|
// Add 'forward' direction startpoints to queue
|
||||||
auto seed_queue_fwd = [&](WireId wire) {
|
auto seed_queue_fwd = [&](WireId wire, float base_cost = 0) {
|
||||||
WireScore base_score;
|
WireScore base_score;
|
||||||
base_score.delay = 0;
|
base_score.delay = base_cost;
|
||||||
base_score.cost = 0;
|
base_score.cost = base_cost;
|
||||||
int wire_idx = wire_to_idx.at(wire);
|
int wire_idx = wire_to_idx.at(wire);
|
||||||
base_score.togo_cost = get_togo_cost(net, i, wire_idx, dst_wire, false, crit_weight);
|
base_score.togo_cost = get_togo_cost(net, i, wire_idx, dst_wire, false, crit_weight);
|
||||||
t.fwd_queue.push(QueuedWire(wire_idx, base_score));
|
t.fwd_queue.push(QueuedWire(wire_idx, base_score));
|
||||||
set_visited_fwd(t, wire_idx, PipId(), 0.0);
|
set_visited_fwd(t, wire_idx, PipId(), base_cost);
|
||||||
};
|
};
|
||||||
auto &dst_data = flat_wires.at(dst_wire_idx);
|
auto &dst_data = flat_wires.at(dst_wire_idx);
|
||||||
// Look for nearby existing routing
|
// Look for nearby existing routing
|
||||||
|
|
@ -872,7 +891,7 @@ struct Router2
|
||||||
continue;
|
continue;
|
||||||
for (WireId wire : fnd->second) {
|
for (WireId wire : fnd->second) {
|
||||||
ROUTE_LOG_DBG(" seeding with %s\n", ctx->nameOfWire(wire));
|
ROUTE_LOG_DBG(" seeding with %s\n", ctx->nameOfWire(wire));
|
||||||
seed_queue_fwd(wire);
|
seed_queue_fwd(wire, t.wire_by_loc_cost.at(wire));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1176,7 +1195,7 @@ struct Router2
|
||||||
t.processed_sinks.clear();
|
t.processed_sinks.clear();
|
||||||
t.route_arcs.clear();
|
t.route_arcs.clear();
|
||||||
t.wire_by_loc.clear();
|
t.wire_by_loc.clear();
|
||||||
t.in_wire_by_loc.clear();
|
t.wire_by_loc_cost.clear();
|
||||||
auto &nd = nets.at(net->udata);
|
auto &nd = nets.at(net->udata);
|
||||||
bool failed_slack = false;
|
bool failed_slack = false;
|
||||||
for (auto usr : net->users.enumerate())
|
for (auto usr : net->users.enumerate())
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue