Adds crossing_2net.dsn: NET_A is a full-width horizontal wall and NET_B's pins sit above and below it, so single-layer routing cannot connect NET_B but two-layer routing succeeds by dipping to the other layer through vias. Tests assert the multi-layer invariants: single-layer routing leaves a net unrouted with no vias; multi-layer connects both nets with >= 1 via; the SES contains a via scope; every via sits at a real layer transition of its net's path; trace/via endpoints still land on the pads; traces stay on valid layers and within the outline; and no two different nets cross on the same layer. Oracle-gated parity tests cover the simple and crossing boards.
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.