EDA Bridge Standard: one way for an AI to drive every PCB tool
Public Made by Adomby adom
The standard every Adom EDA bridge follows so one AI can drive Altium, KiCad, Fusion 360 and any future PCB tool the same way: shared verb names in tiers, the board model JSON, reply and refusal conventions, and a coverage table of each bridge against the Altium reference.
Fusion bridge 1.12.0 speaks the board model: what it gives the shared checks engine and what it needs
From the fusion-lane thread (Fusion bridge development). The Fusion bridge 1.12.0 source on adom/fusion-bridge now returns the board model and its companions. reference/fusion360-1.12.0.json is pushed and tools/generate.py re-run: Fusion covers 56 of 182 standard verbs (was 39). This issue lists what the shared checks engine gets from Fusion and what Fusion needs from it.
What the Fusion bridge returns now
All of it comes from Fusion's own board export, in the background, in mm, Fusion's frame (y up), copper layers named F.Cu / In<n>.Cu (by stack order) / B.Cu / *.Cu.
| Model | Verb | Notes |
|---|---|---|
| Board model | fusion_routing_state |
Validates against schema/board.schema.json. model: "eda-bridge-standard/board 0.1". |
| Stack-up | fusion_layer_stack |
From Fusion's Layer Stack Manager: copper um, dielectric um and dk1000 below each layer, plus the dielectric pieces (prepreg or core). Without stack data it falls back to the design rules and says Dk is unknown. |
| Poured copper | fusion_pour_state zones |
Fusion's own fill, island by island with holes. |
| 3D bodies | fusion_bodies |
One box per part (ref, side, x0, y0, x1, y1, z0, z1) from the 3D PCB, not one per body. Through-hole parts add throughHole and leadsPastFarSideMm. noBody and suspect (model off its footprint, floating or sunk) are listed. |
| Sheet parts | fusion_read_sheet_file |
From an EAGLE .sch or the one in a .fsch, no Fusion needed. electrical is a string: input, output, io, open_collector, passive, hiz, power, plus supply and not_connected, which have no Altium code. |
| Netlist | fusion_netlist |
{net: ["U1.3"]}, from the live board or a .sch file, with expect. |
| Reads | component_data, component_pins, list_nets, net_connections (with airlineMm), layers, copper_layers, layers_in_use, read_rules, rules_by_kind, silk_state, net_classes |
Answered in mm with the unit in the field name (xMm), per conventions.md, not in mils as the Altium-generated standard.json text says. |
Asks for the shared engine
- Ship it as a Rust crate as well as a CLI. The Fusion bridge is a Rust exe; linking the crate is simpler than shipping a second binary to every Windows box.
- Custom-shape pads. Fusion pads made of a footprint polygon carry
customShape: trueand the real outline incopperPoints(one polygon can join several pads: a CSD17581Q3A drain joins pads 5 to 9). UsecopperPointswhen it is present and the bounding rectangle otherwise. - Use
zonesfills for real copper. Fusion gives the poured fill with its holes.polygonsis the pour as drawn. unconnectedsemantics. Fusion drops a poured island that touches nothing else of its net (the slivers a pour with orphans on leaves) from the count and lists it underfloatingPourIslands. Altium counts every group. Please settle this in the standard; I suggest Fusion's rule, since a dead island is not a connection still to make.- Reply units.
verbs/standard.jsondescribes outputs in Altium's mils (xMil). The conventions say mm. Fusion answers in mm (xMm,wMm). Please settle on mm-named fields in the standard so one AI can read every bridge alike. - Planner output to apply. Fusion applies plans with
fusion_route_net(two-layer boards today; layerF.Cu/B.Cuor 1 / 16),fusion_place_vias,fusion_apply_pours,fusion_change_pours,fusion_move_partsandfusion_ripup_nets. There is no silkscreen edit verb yet; designator placement plans need one. - Bodies as one box per part. Height and placement checks should accept one box per part (Fusion) as well as several (Altium).
Lessons from this round that may apply to other bridges
- DRC severity. Fusion's ULP gives
ERROR_TYPE_WARNING = 1andERROR_TYPE_ERROR = 2, andERROR_STATE_APPROVED = 2. The Fusion bridge had errors and warnings swapped until now. If another bridge reads a numeric severity, read the constants from the tool rather than assuming them. - Track ends near pad anchors. On a real board Fusion's ratsnest showed 3 airwires where track ends lay 5 to 7.5 um off the pad anchor but over its copper. Computing
unconnectedfrom the copper gives 0. The bridge keeps Fusion's count asfusionAirwiresand its hint explains the difference. - EAGLE files carry a DOCTYPE. roxmltree refuses EAGLE
.schand.brdfiles unlessallow_dtdis set.
Evidence: every pad of the BQ25792 charger (304 pads, 4 layers, mirrored and SR90 parts) matches Fusion's own ULP dump exactly; detail in the fusion-bridge CHANGELOG (1.12.0).