mirror of https://github.com/YosysHQ/nextpnr.git
router2: Try harder on constants to prevent infinite loop (#1647)
Signed-off-by: gatecat <gatecat@ds0.me>
This commit is contained in:
parent
1f4d3fdc91
commit
2400a90e04
|
|
@ -707,6 +707,7 @@ struct Router2
|
||||||
|
|
||||||
// This records the point where forwards and backwards routing met
|
// This records the point where forwards and backwards routing met
|
||||||
int midpoint_wire = -1;
|
int midpoint_wire = -1;
|
||||||
|
float best_midpoint_cost = 0;
|
||||||
int explored = 1;
|
int explored = 1;
|
||||||
|
|
||||||
for (; mode < 2; mode++) {
|
for (; mode < 2; mode++) {
|
||||||
|
|
@ -776,7 +777,7 @@ struct Router2
|
||||||
// Mode 0 required both queues to be live
|
// Mode 0 required both queues to be live
|
||||||
while (((mode == 0) ? (!t.fwd_queue.empty() && !t.bwd_queue.empty())
|
while (((mode == 0) ? (!t.fwd_queue.empty() && !t.bwd_queue.empty())
|
||||||
: (!t.fwd_queue.empty() || !t.bwd_queue.empty())) &&
|
: (!t.fwd_queue.empty() || !t.bwd_queue.empty())) &&
|
||||||
(!is_bb || iter < toexplore)) {
|
((!is_bb && midpoint_wire == -1) || iter < toexplore)) {
|
||||||
++iter;
|
++iter;
|
||||||
if (!t.fwd_queue.empty() && !const_mode) {
|
if (!t.fwd_queue.empty() && !const_mode) {
|
||||||
// Explore forwards
|
// Explore forwards
|
||||||
|
|
@ -828,11 +829,26 @@ struct Router2
|
||||||
t.bwd_queue.pop();
|
t.bwd_queue.pop();
|
||||||
++explored;
|
++explored;
|
||||||
auto &curr_data = flat_wires.at(curr.wire);
|
auto &curr_data = flat_wires.at(curr.wire);
|
||||||
if (was_visited_fwd(curr.wire, std::numeric_limits<float>::max()) ||
|
if (const_mode && ctx->getWireConstantValue(curr_data.w) == net->constant_value) {
|
||||||
(const_mode && ctx->getWireConstantValue(curr_data.w) == net->constant_value)) {
|
if (midpoint_wire == -1) {
|
||||||
// Meet in the middle; done
|
midpoint_wire = curr.wire;
|
||||||
midpoint_wire = curr.wire;
|
best_midpoint_cost = curr.score.cost;
|
||||||
break;
|
if (curr_cong_weight >= 10) {
|
||||||
|
// try harder at this point to prevent infinite iterations when constants conflict
|
||||||
|
toexplore = iter + std::min(200, int(curr.score.cost));
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (curr.score.cost < best_midpoint_cost) {
|
||||||
|
midpoint_wire = curr.wire;
|
||||||
|
best_midpoint_cost = curr.score.cost;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (was_visited_fwd(curr.wire, std::numeric_limits<float>::max())) {
|
||||||
|
// Meet in the middle; done
|
||||||
|
midpoint_wire = curr.wire;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Don't allow the same wire to be bound to the same net with a different driving pip
|
// Don't allow the same wire to be bound to the same net with a different driving pip
|
||||||
PipId bound_pip;
|
PipId bound_pip;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue