mirror of https://github.com/YosysHQ/nextpnr.git
ripup_arc walks from the sink wire back to the net source, unbinding pips as it goes. For nets with constant_value set, the walk condition required every wire on the path to itself carry that constant value (getWireConstantValue(cursor) == net->constant_value). This is false for all general-purpose routing wires, so the walk terminated at the sink immediately and ripup never unbound anything. Consequences on congested designs with const routing (observed on himbaechel/xilinx, where GND/VCC use const-net mode): - re-routing the arc rebound the same path on top of itself, leaking one wire refcount per ripup/re-route cycle - congestion on contested constant tap wires could never resolve; the router livelocked with a handful of wires stuck overused for thousands of iterations Constant-net arc trees root at a tap wire bound with a null pip (the const_mode midpoint bind in route_arc), so terminate the walk there instead: walk to the net source as usual, and stop at the first null-pip binding. Hardware-verified on xc7a100t: a MEGA65 core port (~34k LCs) that previously livelocked (>3000 iterations, 6 wires pinned overused) now routes to 0 overused wires in ~30 iterations. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| kernel | ||
| place | ||
| route | ||
| CMakeLists.txt | ||
| version.h.in | ||