soldermaskdocs

The pipeline

One sentence goes in; a directory of fab files comes out. In between are ten stages, each of which reports what it could not do. The command line prints them in order; the app runs the same code (soldermask/workspace.py) and shows the stage names as a build progresses.

prompt ──▶ design ──▶ resolve ──┬──▶ ERC · simulation
  (the model)   (parts · footprints · symbols)
                                ├──▶ place ──▶ route ──┬──▶ Gerbers · drill · BOM · CPL
                                │       (freerouting, then  └──▶ .kicad_pcb · 3D models
                                │        the A* router if a
                                │        net is left short)
                                └──▶ stock & price
                                                        all of it ──▶ one immutable version on disk
StageModuleDecidesReports
Designdesign.py, schema.py, priors.pywhich parts, which packages, which pins wire togetherassumptions, decisions, unsupported
Parts and packagesresolve.py, parts.py, packages.py, easyeda.pya real LCSC part for each component, its footprintgaps (no part), notes (substitutions, unverified footprints, stock)
Symbols and pinssymbols.pypad numbers from pin function namesgaps (no symbol, unverifiable pin), notes (borrowed pinouts)
ERCerc.pynothing — it only checkserrors and warnings by rule
Simulationspice.pynothing — it switches the declared rails on in ngspice and reads what settlesthe rails a regulator drives against their declaration, LED currents, the parts with no model; the traces as sim.json for the scope
Placement and routingplacer.py, dsn.py, ses.py, pour.py, fillet.pywhere parts go, where copper goes, what stays clear of an antenna, what ground is poured overoverlap, incomplete nets pin by pin, which placement was kept, what the pour came to
Two routersastar.pywhether a board left short of a pin gets a second opinion, and whose copper is keptwhich pins the second router reached that the first did not
Routabilitycongestion.py, corpus.py, routability.py, precedent.pywhich placement the router sees first, and which corpus board one anneal starts fromthe prediction beside the verdict; the model's own score; the precedent it used
Fab filesgerber.py, assembly.py—read-back verification
KiCad and 3Dkicad.py, models3d.py, kicadcli.py—frame agreement, model orientation, DRC when KiCad is installed
Stock and pricinginventory.py—buildable or not at each quantity, headroom
Repair and evaluationrepair.py, evaluate.pywhether a revision is betterscore, dropped parts, pass@1

The last page, What is not guaranteed, collects every honest limitation in one place.

The instruments built to ask whether any of this can be predicted rather than run — the mould, the fold, the rubric — are not stages and live under Research.