System Designer #

URL: /designer

The System Designer is the visual surface for wiring a part's UUT pins to a station's instrument channels. Pick a part, pick a station, click a pin, click an instrument channel — the page draws the wire and auto-saves a fixture YAML to disk.

The bottom of the page has three tabs (Connections, Station Type, YAML Preview) that always reflect the current graph state.

Experimental. The System Designer is less mature than the rest of Litmus, and the screen carries an "Experimental" banner. Expect rough edges, and check the saved fixture YAML before you depend on it in a run.

Top bar — selection #

ControlPurpose
PartDropdown of every part in the project's parts/ directory. Picking one loads the part's pin map onto the design surface and, if a matching fixture YAML already exists for the auto-generated fixture ID, loads its connections too.
StationDropdown of every station in the project's stations/ directory. Picking one loads the station's instruments + channels into the right-side pool of wiring targets.
Load FixtureOpens a dialog listing every fixture in fixtures/. Pick one and the designer replaces the current connections with that fixture's.
Add InstrumentOpens a dialog to add an instrument to the current station definition. Fields: Instrument Type (optional dropdown from the project catalog — selecting one pre-fills channel names from the type's capability spec), Role Name (e.g. dmm, psu), Driver (e.g. examples.drivers.DMM), Channels (comma-separated).

ID bar #

FieldPurpose
System IDIdentifier the Station Type tab uses when rendering the station-type YAML preview. The designer does not write a station-type YAML on its own — the preview is for copy-paste or for matching against a hand-written stations/<id>.yaml.
Fixture IDIdentifier for the fixture YAML the designer writes on auto-save.

Auto-save writes fixtures/<fixture_id>.yaml whenever both IDs are set and the graph has at least one connection. It runs after:

  • Adding a wire (clicking a channel node while a pin is selected)
  • Auto-Match
  • Clear All

Because auto-save only writes when at least one connection exists, Clear All does not rewrite the file to the empty state — the saved fixture keeps its last non-empty connections until you add the next wire. Drawer-initiated actions (Delete Connection, Delete Pin, Delete Instrument, editing a pin field) don't save on their own either; add a wire to write them out.

There is no Save button anywhere on the page.

Status bar #

A row of counters and toggles, just above the design surface:

IndicatorMeaning
N / M pins wiredHow many of the part's pins are connected, and the total.
N availableHow many pins are still unconnected.
N instrumentsInstruments currently in the station.
Wiring: <pin>When a pin is selected and waiting for a channel click, the status bar shows it in a blue chip.
Hide Unused checkboxFilters the graph to only nodes with at least one connection.
Auto-Match buttonWalks every unconnected pin that has a characteristic defined on it, asks the matching engine for a compatible channel from the current station, and creates the connection. Pins without a characteristic are skipped silently.
Clear All buttonWipes every connection on the current fixture in memory. The saved file is not rewritten to the empty state (auto-save only writes when at least one connection exists) — the cleared state lives in the page until you add the next wire.

Design Surface #

An ECharts graph showing UUT pins on the left and instrument channels on the right, with wires drawn between connected nodes. Three interactions:

  • Click a pin — selects it. Status bar shows "Wiring: <pin>".
  • Click a channel while a pin is selected — creates the connection and clears the selection.
  • Click a wire — opens the connection in the right-side properties drawer. The drawer shows the connection's fields (Point Name, UUT Pin, Net, Instrument, Channel, optional Terminal) as read-only inputs with a Delete Connection button — it's a remove-or-leave-alone affordance, not an edit form.

When no part is selected and no instruments are loaded, the graph is replaced with a hint: "Select a part and load a station to begin."

Bottom tabs #

Three tabs share the panel below the graph; they always reflect the current graph state.

Connections tab #

A table of every current wire on the fixture.

ColumnWhat it shows
PointThe connection point name — auto-generated from pin + role at wire time and not user-editable
UUT PinThe pin on the part side
NetNet / signal name (optional, free-text)
InstrumentThe station instrument the wire terminates on
ChannelThe channel / terminal on that instrument

Click a row to open the same read-only-with-Delete drawer that the graph wires open.

When the fixture has no connections, the tab shows: "No connections yet. Wire pins to instrument channels above."

Station Type tab #

A live YAML preview of a station-type document derived from the current station's instruments. The structure mirrors what /stations consumes — useful for copying out to a stations/<id>.yaml file by hand. The designer does not save this on its own; you write it to disk yourself.

When no instruments are loaded, the tab shows: "No instruments added yet."

YAML Preview tab #

A live YAML preview of the fixture document — the file that gets auto-saved to fixtures/<fixture_id>.yaml. Cross-check this against the Fixture YAML schema to confirm the shape before you depend on the fixture in a run.

When the fixture has no connections, the tab shows: "No connections to preview."

Pre-fill via URL #

The designer accepts three URL query parameters; the URL is also kept in sync (via history.replaceState) as you make selections so the current state is bookmarkable.

ParameterPre-fills
partThe Part dropdown — ?part=<id>
stationThe Station dropdown — ?station=<id>
fixtureLoads an existing fixture by ID — ?fixture=<id>

Underlying data #

  • Parts come from parts/.
  • Stations come from stations/.
  • Fixtures (loaded and saved) live in fixtures/.
  • Auto-Match uses the same capability matching used elsewhere to find a station-channel that satisfies a part pin's required signal direction.

Common tasks #

  • Wire a fresh fixture from scratch — pick Part + Station, set Fixture ID, click pins → click channels. Save happens automatically.
  • Iterate on an existing fixture — open the designer with ?fixture=<id> (or pick it from Load Fixture), make changes, watch the YAML Preview tab confirm the shape.
  • Generate a draft fixture quickly — load Part + Station, click Auto-Match, then refine the suggestions by clicking individual wires.

See also #