nextpnr/common/route
Joris van Zwieten 35cbbaec1f router2: fix no-op ripup of constant-net arcs
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>
2026-07-30 15:27:30 +02:00
..
CMakeLists.txt CMake: rationalize and refactor build system. 2025-01-16 11:36:44 +01:00
router1.cc clangformat 2026-04-20 15:45:20 +02:00
router1.h Split up common into kernel,place,route 2022-04-08 13:42:54 +01:00
router2.cc router2: fix no-op ripup of constant-net arcs 2026-07-30 15:27:30 +02:00
router2.h Split up common into kernel,place,route 2022-04-08 13:42:54 +01:00