Skip to content

Bug: a declared plane cannot be stitched on a fine-pitch BGA, and the suggested remedy does not exist #165

Open

Description

@JeffMboya

What were you trying to achieve?

Export a four-layer board whose two rails are planes, with a 121-ball 0.8 mm BGA on them.

What are the expected results?

The board declares requires via_in_pad and a tier that fills, so the stitching via goes in the pad.

What are the received results?

Export fails. plane_via_offset only ever places beside the pad, and nothing can grant via-in-pad here.

synth: kicad export failed: power-plane fanout failed: net `net_8`: no legal
stitching-via position beside the pad at (51.85, 39.96) mm on Top: every
candidate is outside the board or within clearance of another pad or via.
Move the part, widen the board, or allow via-in-pad explicitly.

The board declares requires via_in_pad and manufacturer "jlc-filled-via",
and synth validate exits 0 on it, so ERC agrees the process is available.
The export still refuses.

This is not a placement accident. The failing pad is on a plane net, and the
only component within reach of it is the BGA. Its 21 rail-ball connections sit
in an 11 x 11 grid at 0.8 mm pitch, so an interior rail ball has neighbours on
all four sides 0.8 mm away. A beside-pad via needs 0.582 mm of clearance from
pad copper at this floor — 0.3 mm drill plus 2 x 0.13 mm ring is 0.56 mm across
— and 0.400 mm is all there is. Beside-pad stitching is arithmetically
impossible for those balls, which is the same arithmetic that makes via-in-pad
mandatory for the escape.

Steps To Reproduce

  1. Declare two netclasses with plane, join a rail net to each, and put a
    121-ball 0.8 mm BGA's supply balls on them.
  2. Declare requires via_in_pad and manufacturer "jlc-filled-via".
  3. synth validate — exits 0.
  4. synth export-kicad — fails as above.

In what environment did you encounter the issue?

synth main at 157f6ea plus #155, #159, #160, #161 and #164. KiCad 10.0.6, Linux.

Additional information you deem important

The error names a remedy that does not exist: --krt-allow-via-in-pad reaches the router, never build_pcb.

crates/synth-kicad/src/pcb.rs:581, fn plane_via_offset(pad, origin, outline, obstacles), takes no via-in-pad parameter and has no in-pad branch. The
comment above the plane emission says the via is placed beside the pad "so the
board does not silently depend on via-in-pad" — reasonable when nothing could
declare it, but #155 now lets a board declare exactly that, and the exporter
does not read it.

So the suggestion is unreachable by any route: not by flag, since
krt_allow_via_in_pad is a router option; not by profile, since build_pcb
takes no FabricationPolicy; and not by declaration, since the board's
required_processes never reaches the exporter.

Fixing it looks like threading the granted permission into build_pcb and
letting plane_via_offset return the pad centre when via-in-pad is allowed and
no offset position is legal. Happy to pick this up.

Activity

  1. JeffMboya commented on Oct 30, 2026

    @JeffMboya
    ContributorAuthor

    #165 scope: this fix refuses the iCE40 BGA naming the 0.35 mm pad and 0.6 mm via; exporting it needs a microvia profile, tracked in #392.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions