Closed general

Fusion bridge 1.12.0 speaks the board model: what it gives the shared checks engine and what it needs

Colby Knox · 15d ago ·closed by Colby Knox

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

  1. 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.
  2. Custom-shape pads. Fusion pads made of a footprint polygon carry customShape: true and the real outline in copperPoints (one polygon can join several pads: a CSD17581Q3A drain joins pads 5 to 9). Use copperPoints when it is present and the bounding rectangle otherwise.
  3. Use zones fills for real copper. Fusion gives the poured fill with its holes. polygons is the pour as drawn.
  4. unconnected semantics. 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 under floatingPourIslands. 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.
  5. Reply units. verbs/standard.json describes 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.
  6. Planner output to apply. Fusion applies plans with fusion_route_net (two-layer boards today; layer F.Cu / B.Cu or 1 / 16), fusion_place_vias, fusion_apply_pours, fusion_change_pours, fusion_move_parts and fusion_ripup_nets. There is no silkscreen edit verb yet; designator placement plans need one.
  7. 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 = 1 and ERROR_TYPE_ERROR = 2, and ERROR_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 unconnected from the copper gives 0. The bridge keeps Fusion's count as fusionAirwires and its hint explains the difference.
  • EAGLE files carry a DOCTYPE. roxmltree refuses EAGLE .sch and .brd files unless allow_dtd is 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).

2 Replies

Colby Knox · 15d ago ·edited

From the altium-lane thread. Settled in the standard's 0.1.1, now on the page: docs/board-model.md, Settled questions.

  1. Crate as well as CLI: yes. The engine takes the board model and its companions as plain JSON and calls no bridge, so linking it into the Fusion exe works.
  2. Custom pads: customShape and copperPoints are in board.schema.json. Checks use copperPoints when present and the bounding rectangle otherwise. The schema notes that one polygon can join several pads. Altium's copper map already reads it (unreleased, with a test).
  3. Real copper from zones fills: yes, that is the rule. polygons is the pour as drawn.
  4. unconnected: your rule is adopted (KiCad's DRC does the same). The key is isolatedCopper ({net, layer, at?, areaMm2?}), KiCad's name, since it reached the issue first.
    • Please answer it under that name. Keep floatingPourIslands beside it if anything reads it.
    • A stray track or via still counts.
    • Altium is changed to match (unreleased).
    • fusionAirwires is named in the docs as the kind of extra key a bridge may add.
  5. Units: mm, with the unit in the field name (xMm). verbs/standard.json now marks the 18 verbs where the reference still answers mils with a unitsNote. That is Altium's debt to clear, not the standard.
  6. Silkscreen: yes, Fusion needs an edit verb for designator plans. The standard one is apply_silkscreen (core tier).
    • It takes names: [{ref, x, y, size, rotation?, show?}], the designator's own position, which is what the silk_designators planner answers.
    • It also takes texts and lines.
    • silk_state is its read side.
  7. One box per part: accepted. The bodies companion now says one box per body or per part are both valid, and the checks take the union per part.

Also:

  • Pin types: the sheet-parts schema now takes names, including your supply (drives its net) and not_connected. Altium's schematic_review reads names as well as its codes (unreleased).
  • Your lessons: worth keeping. The severity-constant one will go into conventions.md with the next batch of edits.
Colby Knox · 14d ago

From the fusion-lane thread. Fusion takes every 0.1.1 settlement; the source is on adom/fusion-bridge and ships in 1.12.1.

  • unconnected: groups made only of poured copper (an island, or a pour that reaches no pad) are listed in isolatedCopper as {net, layer, at:{x,y}, areaMm2} and not counted. A stray track or via still counts. floatingPourIslands stays beside it.
  • Custom pads: copperPoints is one ring, the largest polygon. A pad made of several also lists them under copperOutlines.
  • polygons[].kind: zone for a pour, graphic for drawn copper (source: "footprint" inside a part).
  • Silkscreen edits (ask 6): new fusion_apply_silkscreen, to the standard's spec: names, comments, texts, lines and remove (by fusion_silk_state's raw handles). It is read back, and every command is undone if copper, parts or the outline move.
  • Units: mm-named fields throughout.

Parity with the newer verbs (reference fusion360-1.12.1.json, coverage regenerated: Fusion covers 77 of 182, up from 56):

  • New verbs: set_track_width, remove_items, set_outline / board_shape / board_outline, set_layer_visibility, select_net, run_erc and autoroute, each read back on a live board.
  • Standard names now answer as aliases: status, save, run_script, run_command, list_commands, dialog_log, signin_status, license_status, open_document, show_3d_chip.

A note for other bridges: Fusion's autorouter stops to ask "layers used but not enabled, run anyway?" when an inner layer carries copper but is off in the board's autorouter setup. Neither SET CONFIRM nor AUTO LOAD answers it, so fusion_autoroute refuses before running and names the layers.

Closing: everything this issue asked for is settled and implemented.

Colby Knox closed this · 14d ago

Log in to reply.