freeroute/tests/dsn/fixtures/smd_demo.dsn
Ryan Malloy 3bf4f6bed2 Implement Specctra DSN parser with typed board model
Ports the read path of FreeRouting's io/specctra/parser package to a
Java-free Python implementation:

- tokenizer: S-expression lexer mirroring SpecctraFileDescription.flex
  (comments, quoted strings, the string_quote IGNORE_QUOTE directive,
  case-insensitive keywords, and hash-prefixed names)
- sexp: nested S-expression tree builder
- shapes: rect/circle/polygon/path plus area-with-holes scopes
- model: typed dataclasses for layers, padstacks, images, placements,
  nets, net classes, rules, keepouts
- reader: recursive-descent scope readers producing a DsnBoard, one
  _read_* function per FreeRouting read_scope method

46 pytest cases cover the tokenizer, tree, shapes, and end-to-end
parsing against hand-crafted fixtures modeled on FreeRouting's own
test DSN files. Parses 90 of 91 upstream fixtures (the one failure is
a binary OLE file, not text DSN).
2026-07-11 15:21:18 -06:00

85 lines
1.6 KiB
Plaintext

(pcb "smd-demo.dsn"
(parser
(string_quote ")
(space_in_quoted_tokens on)
(host_cad "freeroute-test")
(host_version "1.0")
)
(resolution um 10)
(unit um)
(structure
(layer Top
(type signal)
(property
(index 0)
)
)
(layer Bottom
(type signal)
(property
(index 1)
)
)
(boundary
(path pcb 0 0 0 150000 0 150000 -90000 0 -90000 0 0)
)
(via "Via[0-1]_600:300_um")
(rule
(width 200)
(clearance 200)
(clearance 50 (type smd_smd))
)
(keepout "no_route_zone"
(rect Top 10000 -10000 20000 -20000)
)
)
(library
(padstack Rect[T]Pad_800x200_um
(shape (rect Top -400 -100 400 100))
(attach off)
)
(padstack "Via[0-1]_600:300_um"
(shape (circle Top 600))
(shape (circle Bottom 600))
(attach off)
)
(image "MiniQFN-6"
(pin Rect[T]Pad_800x200_um 1 -3000 400)
(pin Rect[T]Pad_800x200_um 2 -3000 0)
(pin Rect[T]Pad_800x200_um 3 -3000 -400)
)
(image "0603"
(pin Rect[T]Pad_800x200_um 1 -850 0)
(pin Rect[T]Pad_800x200_um 2 850 0)
)
)
(placement
(component "MiniQFN-6"
(place U1 75000 -45000 front 90.000000)
)
(component "0603"
(place R1 20000 -35000 front 0.000000)
(place R2 130000 -35000 back 180.000000)
)
)
(network
(net NET_A
(pins U1-1 R2-2)
)
(net NET_B
(pins U1-2 R1-1)
)
(class default
(circuit
(use_via "Via[0-1]_600:300_um")
)
(rule
(width 200)
(clearance 200)
)
)
)
(wiring
)
)