Adds ripup_needed.dsn: one signal layer (B.Cu is a power plane, so vias are impossible) with two nets whose greedy order strands NET_B, but where rip-up reroutes NET_A around NET_B to connect both. Tests: greedy (rip_up=False) leaves >= 1 connection unrouted with no vias; rip-up connects all with no vias; the result is deterministic across re-runs; rip-up keeps endpoints on pads and produces no same-layer cross between nets (ripped traces leave no orphaned occupancy). The crossing board's single-layer test now targets the greedy path explicitly, and a regression test asserts the real KiCad board still connects all four of its multi-pin nets. Oracle-gated parity added for the congested board.
DSN test fixtures
Hand-crafted minimal Specctra DSN files, written to exercise the parser. They
are modeled on the real fixtures shipped in the upstream FreeRouting repo
(fixtures/empty_board.dsn and fixtures/SMD-routing-issue-demo.dsn) so the
grammar and formatting match what kicad-cli pcb export specctra-dsn and
FreeRouting itself produce, but they were typed fresh here (no upstream file is
copied into this tree).
empty_board.dsn— the smallest valid board: parser, resolution, unit, and a structure with two signal layers and apcbboundary path. Modeled on FreeRoutingfixtures/empty_board.dsn.smd_demo.dsn— a fuller board exercising every scope the parser handles: quoted board/padstack/image names,via, defaultrule(width + clearance with a(type smd_smd)pair), akeepout, padstacks (rect and circle pads), images with pins, placement withfront/rotation, nets withComp-Pinreferences, and aclasswithcircuit/use_viaand arule. Modeled on FreeRoutingfixtures/SMD-routing-issue-demo.dsn.