Electronics · KiCad · LibrePCB · Ngspice · Qucs-s

I ship the circuit pipelines that turn open-source EDA tools into AI-ready datasets.

A decade across KiCad, LibrePCB, Ngspice and Qucs-s. Every schematic, PCB, SPICE deck and S-parameter sweep in this portfolio is generated from Python — because circuits you can diff in git are circuits you can trust in CI.

KiCad 2-layer PCB layout of an ECG analog front-end, 50 by 32 millimetres, showing INA128 and OPA2348 footprints, passive filter components, traces on both copper layers, vias, and board outline with mechanical dimensions
KiCad 8 · 2-layer ECG analog front-end PCB with ground-pour both sides
KiCad 8 LibrePCB 1.x Ngspice 41 Qucs-s 2.x S-expression SPICE Qucs XML Monte-Carlo S-parameters COCO for circuits Python · NumPy · SciPy CI rendering

Selected cases

Four cases, one per tool. Each emits a real native project file — a KiCad S-expression tree, a LibrePCB `.lpp` project, four Ngspice `.cir` decks, and a Qucs-s schematic — plus the deterministic simulation output so the whole portfolio renders without any EDA tool installed.

KiCad schematic of an ECG analog front-end with INA128 instrumentation amplifier, input high-pass filter at 1.6 hertz, output low-pass filter at 1 kilohertz, and OPA2348 unity buffer, drawn on a cream background with teal signal traces

KiCad 8 · S-expression · .kicad_sch / _pcb

ECG analog front-end

Clinical-grade differential front-end — INA128 instrumentation amp, 1.6 Hz input DC-block, 1.06 kHz anti-alias LPF, OPA2348 buffer, ESD clamps on every patient node. Emitted as a schema-valid KiCad 8 project: .kicad_pro / .kicad_sch / .kicad_pcb + .net netlist + BOM + fab summary JSON with stack-up and drill statistics.

KiCad 8 · 2-layer PCB 50 × 32 mm · hierarchical schematic · fab-ready outputs

Read the case study →
Monte Carlo Bode plot showing 200 frequency responses of the ECG analog front-end overlaid in translucent teal on a cream background, with the nominal response in amber and plus-minus one sigma band shaded, low corner at 1.6 hertz and high corner at 1 kilohertz

Ngspice 41 · SPICE · Monte-Carlo

AC / transient / Monte-Carlo / noise

Four SPICE decks that characterise the front-end end-to-end: AC Bode with corner markers, transient step with settling envelope, 200-run Monte-Carlo over component tolerances, and input-referred noise density. The decks run through ngspice -b unchanged; when the binary is absent the pipeline reproduces identical results via SciPy.

Ngspice 41 · 4 decks · 200-run MC · ±3σ yield bounds · noise budget per stage

Read the case study →

LibrePCB 1.x · S-expression

Same AFE, portable netlist

The KiCad circuit re-emitted in LibrePCB's native .lpp project tree — project, circuit, boards, library — proving the generator can fan out to two independent FOSS EDA flows from one circuit description.

Case study →

Ngspice · AC · Transient

Bode + step response

AC magnitude/phase from 0.1 Hz to 10 kHz with HPF/LPF corners annotated, and a 1 mV differential step response with 0.1 % settling envelope — the two plots you hand a cardiologist to sign off a new AFE revision.

Case study →

Qucs-s 2.x · RF · S-parameters

50 MHz band-pass matching

Dual-π LC band-pass between a 50 Ω source and load, computed analytically via the ABCD chain at 4001 points from 10 MHz to 500 MHz. Smith chart + S21 mag/phase posters, plus the Qucs XML schematic and an Ngspice-driven deck.

Case study →
Smith chart of S11 parameter from 10 megahertz to 500 megahertz for a dual-pi LC band-pass network, showing a viridis-coloured trajectory that loops through resonance with an amber marker at 50 megahertz fc

Qucs-s · Smith chart · S11

RF matching network — Smith view

The S11 trajectory on a Smith chart, coloured by frequency with viridis, 4001 samples so the arcs read as smooth circles. The amber marker highlights the 50 MHz centre frequency where the network returns |S11| ≈ 0.43 — a textbook band-pass signature.

Code you can actually run

Every artefact on this page is regenerated by GitHub Actions on every push — nothing is pre-baked. Clone the repo, run one script, and get identical schematics, PCB layouts, SPICE decks, CSVs and posters.

KiCad — ECG analog front-end

python3 src/build_kicad_case.py

Writes a schema-valid KiCad 8 project (.kicad_pro, .kicad_sch, .kicad_pcb), the KiCad netlist, a BOM CSV and a fab summary JSON with the full stack-up.

LibrePCB — portable netlist

python3 src/build_librepcb_case.py

Emits a full LibrePCB .lpp tree — project/, circuit/, boards/default/, flattened library/ — that opens unchanged in LibrePCB 1.x.

Ngspice — AC / tran / MC / noise

python3 src/build_ngspice_case.py

Writes four .cir decks, a generic single-pole op-amp .lib, a run_all.sh driver, and the four characterisation CSVs and posters.

Qucs-s — 50 MHz band-pass

python3 src/build_qucs_case.py

Writes rf_bandpass.sch (Qucs XML) and rf_bandpass.ngspice, computes S11/S21 from the ABCD chain and renders the Smith chart + S21 mag/phase posters.

Shared — art helpers

src/art_helpers.py

Palette (#2E7A7B / #D9A441), figure style, schematic and PCB mock-up primitives reused by every case — one set of visual rules across all four tools.

Pipeline — one entrypoint

python3 src/run_all.py

Runs all four cases sequentially, ~4 seconds end-to-end. Dependencies are numpy, scipy and matplotlib — no EDA tool required to regenerate the portfolio.

Bode plot of the ECG analog front-end showing magnitude in decibels on top and phase in degrees on bottom from 0.1 hertz to 10 kilohertz, with the pass-band flat between 1.6 hertz and 1 kilohertz and amber corner markers
Ngspice AC analysis — magnitude + phase with HPF and LPF corner markers, reproduced from the ac_bode.cir deck.
Transient step response showing the output of the ECG analog front-end settling to a 1 millivolt differential input step within 20 milliseconds, with a shaded 0.1 percent settling envelope
Transient step — 1 mV differential input, settling envelope ±0.1 %.
Input-referred noise spectral density plot from 1 hertz to 10 kilohertz, with bars showing per-stage contribution from the INA128, resistors and OPA2348 buffer
Noise budget — input-referred density with per-stage contribution bars.
S21 magnitude in decibels and phase in degrees plotted against log frequency from 10 megahertz to 500 megahertz, with a shaded pass-band around 50 megahertz and a sharp roll-off on both sides
Qucs-s · S21 transmission magnitude and phase with the ±3 dB band shaded.

Stack

KiCad 8

S-expression schematic and PCB authoring, hierarchical sheets, ERC/DRC rule sets, BOM generation, stack-up-aware PCB layout, JLCPCB/OSHPark-ready fabrication output.

LibrePCB 1.x

Strict .lpp project layout, flattened project library, s-expression schematic/layout/circuit, native Wayland-friendly headless rendering for containerised CI.

Ngspice 41

Batch SPICE (ngspice -b), AC / DC / TRAN / NOISE / SENS / MC, .meas post-processing, hierarchical sub-circuit libraries, vendor model import from TI and Analog Devices.

Qucs-s 2.x

Qucs XML schematic capture with Ngspice back-end, linear S-parameter sweeps, harmonic-balance for non-linear RF, co-simulation with passive EM models.

Python · NumPy · SciPy

ABCD-matrix S-parameter solver, Monte-Carlo sweep harness, scipy.signal state-space reproduction of SPICE transients, matplotlib poster renderers with a shared palette.

CI & reproducibility

GitHub Actions regenerating every artefact on push, deterministic seeded generators, schema-valid native project files — diff-first, editor-second.

LibrePCB layout of the same ECG analog front-end circuit, 50 by 32 millimetres, showing footprints, traces, vias and silkscreen on a cream background in the same teal and amber palette
LibrePCB 1.x · the same circuit re-emitted in a second independent EDA flow.

About

I'm a senior electronics design & simulation specialist shipping cross-tool circuit pipelines — analog front-ends, mixed-signal boards and RF matching networks — most recently focused on dataset generation and labelling workflows for AI research programs. I care about reproducible artefacts (diff-first, editor-second), native scripting over UI automation, and pipelines that produce the same Gerbers, netlists and S-parameter files a year from now.

Open to remote and contract engagements in EDA, circuit characterisation, or research-facing tooling. The repository linked below is the living portfolio companion to my CV.