importing-kicad-projec…
Imports KiCad projects and schematics into the current repository. Use when asked to import or convert an existing KiCad design.
Read or edit Zener HDL, package APIs, and tool-managed dependencies.
$ npx -y skills add diodeinc/pcb --skill zener-language --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/zener-languageContext preview
The summary Claude sees to decide when to auto-load this skill.
Read or edit Zener HDL, package APIs, and tool-managed dependencies.
name: zener-language description: Read or edit Zener HDL, package APIs, and tool-managed dependencies.
Zener is Starlark plus PCB-specific modules, typed electrical connections, physical parts, sourcing, layout, and diagnostics.
Use `pcb list -m -json @stdlib` or `pcb list -m -json <package>[@<version>]` to find a package's local source directory, then read its `.zen` files for the public API and exact behavior.
For CLI behavior, use the installed command's `--help`; do not invent or infer subcommands or flags. When version history matters, inspect the installed version and nearby entries in the [`pcb` changelog](https://github.com/diodeinc/pcb/blob/main/CHANGELOG.md) instead of relying on old examples.
A `.zen` file can be:
Relative paths stay within the current package. Cross-package imports use full package URLs:
load("./helpers.zen", "helper")
LocalBlock = Module("./LocalBlock.zen")
RemoteBlock = Module("github.com/org/repo/modules/RemoteBlock.zen")An instantiation passes `name=...`, its public `io()` and `config()` inputs, and optional `dnp` and `properties` arguments.
`name` establishes instance-path identity, not a fixed reference designator. Refdes-like names are only annotation hints; exact source-reference preservation is not supported.
Use refdes-like names only when the user explicitly asks. In that case, set `prefix=` on the underlying `Component()` to match the refdes prefix.
`Component()` creates a physical part from `name`, `symbol`, and `pins`. The selected symbol is the authority for its footprint, part identity, datasheet, and pins. Keep those properties correct in `.kicad_sym` rather than repeating them in Zener. Omit true `no_connect` pins; they are wired to `NotConnected()` automatically.
Use `Symbol(library, name=...)` for multi-symbol libraries. Use `Part(mpn=..., manufacturer=...)` only when the symbol does not already provide part identity.
`Project()` takes `layout = False` or `schematic = False` to disable either. Use one declaration per entrypoint with a config-independent path relative to its `.zen` file; use separate entrypoints for distinct projects.
Define public electrical connections as flat top-level assignments:
VDD = io(Power(voltage="3.0V to 5.5V")) GND = io(Ground) EN = io(Net, optional=True)
Do not introduce legacy `Pins = struct(...)` wrappers in new or touched APIs.
With `optional=True`, an omitted IO receives an automatically generated net or interface.
`Net` is the base connection type. `Power`, `Ground`, `NotConnected`, and stdlib interfaces add constraints and semantics. Across an `io()` boundary, `NotConnected` can promote to any net type, a specialized net can demote to `Net`, and a plain `Net` does not automatically gain specialized semantics. Adapt intentionally with casts such as `Power(net, voltage=...)` or `Net(power_net)`.
Use stdlib interfaces such as `DiffPair`, `I2c`, `I3c`, `Spi`, `Qspi`, `Uart`, `Usart`, `Swd`, `Jtag`, `Usb2`, and `Usb3` when the grouped protocol semantics are meaningful.
Use `UartPair()` and `UsartPair()` when a point-to-point link should cross-connect the two endpoints.
Declare a voltage range on every public `Power` IO unless the API is intentionally generic.
Define non-electrical choices with typed `config()`:
output_voltage = config(Voltage, default="3.3V", allowed=["3.3V", "5V"])
Load physical value types from `@stdlib/units.zen`: `Voltage`, `Current`, `Resistance`, `Capacitance`, `Inductance`, `Impedance`, `Frequency`, `Temperature`, `Time`, and `Power`. String defaults and allowed values auto-convert to the declared physical type. Use enums for non-physical modes and strategies. Expose application-level choices rather than internal passive values or implementation details.
Physical constructors accept point values, engineering notation, ranges, and tolerances. Arithmetic tracks units. Equality between two physical values is strict; use `.matches(...)` for coercive comparison with a string or scalar. Inspect the installed API for other operations.
Enum defaults use the selected string value:
Mode = enum("PULLUP", "PULLDOWN")
mode = config(Mode, default="PULLUP")Configs may change values and `dnp=` state, but should not add, remove, or reconnect schematic instances. Stable instance and net identity preserves layout and reviewability.
Put non-trivial electrical calculations in named functions. Cite the relevant datasheet equation or table and snap calculated values with the appropriate stdlib E-series helper.
The available E-series helpers in `@stdlib/utils.zen` are `e3`, `e6`, `e12`, `e24`, `e48`, `e96`, and `e192`.
Use `check`, `warn`, `error`, and stdlib checks for enforceable electrical constraints rather than documenting them only in comments.
For reusable power-rail boundary checks, inspect and prefer `voltage_within(...)` from `@stdlib/checks.zen` instead of duplicating the constraint.
Reusable-package compatibility includes the public `io()` and `config()` API, entrypoints, behavior, layout, and physical integration assumptions. A build of the current package does not prove existing consumers remain compatible.
If consumers must change to adopt an update, treat it as breaking. Document the migration and use a breaking commit.
Inspect the root declaration and its
pcb is a command-line tool for circuit board projects written in Zener. Zener is a Starlark-based language for describing PCB schematics; pcb builds those designs, manages dependencies, and generates KiCad layout files.
Imports KiCad projects and schematics into the current repository. Use when asked to import or convert an existing KiCad design.
Create or repair reusable component and module packages in a PCB registry.
Find reusable registry modules and component packages for a board or specification.
Add or run an ngspice-backed Zener testbench with `pcb sim`.