
Audio routed
Bu3nd14/EDA
Scripted analog EDA + PCB automation environment (KiCad 10 + ngspice + SKiDL) for macOS Apple Silicon

Scripted analog EDA + PCB automation environment (KiCad 10 + ngspice + SKiDL) for macOS Apple Silicon
Audio routed is an open-source printed circuit board by Bu3nd14, from the Bu3nd14/EDA repository on GitHub. It is a 2-layer board of 392.6 × 198.3 mm with 657 parts on 396 nets, routed with 6,154 tracks and 419 vias.
It is built around the LM4040B50FTA, MMBT5401 and MMBT5551, with the DZT5551, DZT5401 and MJE15032 among its other parts. Its parts include 303 resistors, 104 transistors, 98 capacitors, 79 diodes and 17 switches. It belongs with the audio and music boards of this library.
A scripted, non-interactive toolchain for taking an analog circuit from code-first topology definition through SPICE simulation, KiCad schematic generation, PCB layout, autorouting, DRC/ERC, and fabrication export — on macOS / Apple Silicon.
This README documents only what has been verified by actually running
commands in this environment. See docs/limitations.md for the full
limitations list and docs/smoke-test.md for the end-to-end pipeline
evidence.
| Tool | Version | Path | Notes |
|---|---|---|---|
| ngspice | 47 | /opt/homebrew/bin/ngspice | Native arm64 (file → "Mach-O 64-bit executable arm64", non-fat). Installed via brew install ngspice. |
| KiCad | 10.0.6 | App: /Users/roberto/Applications/KiCad.app; CLI: /Users/roberto/Applications/KiCad.app/Contents/MacOS/kicad-cli | Universal binary (x86_64 + arm64), runs natively on Apple Silicon. Installed from the official CERN-hosted dmg into ~/Applications, without sudo. |
| Python (project) | 3.13.15 | /opt/homebrew/bin/python3.13 | Native arm64. Project venv at /Users/roberto/EDA/env/venv. |
| SKiDL | 2.3.0 | installed in env/venv | Code-first circuit definition layer. |
| Python (KiCad bundled) | 3.9.13 | /Users/roberto/Applications/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/bin/python3.9 | The only interpreter where import pcbnew works. pcbnew is not pip-installable. |
| kinet2pcb | (per bundled install) | installed into the bundled python3.9 via --user pip install | Not installed in the venv. |
| Freerouting | 2.4.1 | /Users/roberto/EDA/scripts/tools/freerouting.jar | External autorouter. Needs a JRE (brew install openjdk). |
poppler (pdftotext) | 26.09.0 | /opt/homebrew/bin/pdftotext | Native arm64 (file → "Mach-O 64-bit executable arm64"). Installed via brew install poppler in L6. Reads vendor datasheet PDFs past page 1, which sips/qlmanage cannot. No script requires it, so verify_env.sh does not check for it: scripts/pdf_glyphs.py is the stdlib-only fallback. |
brew install ngspice.~/Applications without sudo.
brew install --cask kicad)
FAILS during install because its bundled demos artifact needs sudo to
write to /Library/Application Support/kicad. Use the no-sudo dmg route
instead — do not retry the brew cask expecting a different result.python3.13 -m venv /Users/roberto/EDA/env/venv, then
pip install skidl (→ SKiDL 2.3.0) inside that venv./Users/roberto/Applications/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/bin/python3.9 -m pip install --user kinet2pcbfreerouting.jar placed at scripts/tools/freerouting.jar.
Requires a JRE: brew install openjdk, then invoke with
PATH="/opt/homebrew/opt/openjdk/bin:$PATH" java -jar scripts/tools/freerouting.jar ....brew install poppler (added in L6). Only needed to read
vendor datasheet PDFs beyond the first page — macOS ships sips and
qlmanage, which render page 1 only. No script in this repo depends on
it; scripts/pdf_glyphs.py covers the text case with the stdlib alone.Selected: KiCad 10 + ngspice, with SKiDL as the code-first circuit definition layer and Freerouting as an external autorouter.
| Alternative | Rejected because |
|---|---|
| LibrePCB | No SPICE export at all — structurally incompatible with a simulate-then-layout workflow. SKiDL also has no LibrePCB output path. |
| Qucs-S | No headless/CLI mode found. Usable only as an optional human-facing GUI visualization layer, not automation. |
| gEDA/gaf | Effectively dead (~1-2 commits/year, last stable release 2020). |
| Xyce | Kept only as a possible alternate SPICE backend. ngspice is the reference engine KiCad targets and has a faster release cadence. |
A hybrid model with a hard boundary:
circuits/*.py (version-controlled,
no GUI state). TODO: unverified — a circuits/ directory does not yet
exist in this repo; the only SKiDL topology definition currently present is
the smoke-test fixture at smoke/rc_circuit.py..kicad_pcb file, because layout cannot be expressed in SKiDL..kicad_pcb as a topology source.kicad-cli sch export netlist --format spice, not from SKiDL's native
SPICE generator. SKiDL's native SPICE path does not work with
KiCad-library parts — see Limitations #2.EDA/
models/ curated, canonical SPICE models (.include-able), each with a
<file>.provenance.json sidecar. See models/README.md,
models/PROVENANCE_CONVENTION.md.
vendor/ read-only vendor originals (mode 0444, sha256 + PROVENANCE.json
per part). Never hand-edited. See vendor/README.md.
scripts/ automation entry points (setup, validation, simulation, ERC/DRC,
fab export) and support tools (freerouting.jar). Owned/maintained
separately — see "Scripts" below.
testbenches/ standalone ngspice .cir testbenches (01_op .. 08_vendor_model)
used to exercise/validate analysis types and the model library.
smoke/ scratch: the trivial RC-lowpass smoke-test fixture and its
full pipeline output (schematic, netlists, sim results, PCB,
routing, DRC/ERC reports, gerbers).
pcb/ scratch: PCB-automation-engineer's capability tests
(board creation, DSN/SES routing round-trip, DRC, fab export).
results/ scratch: simulation outputs (raw + normalized CSV/JSON) and
model-validation testbenches/results.
docs/ this documentation set (architecture, limitations, smoke-test
report).
env/venv/ project Python 3.13 virtualenv (SKiDL).
.claude/agents/ subagent role definitions (see AGENTS.md).circuits/ (canonical topology home per the source-of-truth strategy) does
not exist yet — TODO: unverified, flagged rather than assumed.
smoke/ and results/ are scratch, not canonical; models/, vendor/ are
canonical (see AGENTS.md operating rules).
All ngspice runs are non-interactive (ngspice -b). Verified analysis types,
with existing testbenches under testbenches/:
| Testbench | Analysis |
|---|---|
01_op.cir | .op |
02_dc.cir | .dc sweep |
03_ac.cir | .ac |
04_tran.cir | .tran |
05_noise.cir | .noise |
06_paramsweep.cir | parameter sweep (via .control/alterparam, not native .step — see Limitations #10) |
07_temp.cir | temperature sweep |
08_vendor_model.cir | vendor-model .include |
Run directly, e.g.:
/opt/homebrew/bin/ngspice -b /Users/roberto/EDA/testbenches/04_tran.cirResults are written via wrdata/.print/.write and normalized to
CSV/JSON with scripts/normalize_wrdata.py (present under results/*.normalized.{csv,json}).
Accuracy: verified against closed-form theory (RC -3dB point, RC time constant, thermal noise floor) to well under 1% error. Example from the smoke-test RC fixture (R=1k, C=100n): theoretical fc = 1591.55 Hz, simulated fc = 1587.62 Hz, error 0.25%.
Model library: models/ contains curated device models (resistor,
capacitor, inductor, diode, BJT NPN/PNP, MOSFET N/P, JFET, opamp macro-model,
generic transformer subckt), each validated by
scripts/validate_models.py against a real ngspice testbench (38/38 checks
passing at last verification). The R/C/L/transformer/opamp checks are exact
analytic cross-checks; the BJT/MOSFET/JFET checks are order-of-magnitude
sanity checks only, not exact — see Limitations #11. The validator was
proven to catch both a bad model parameter and a tampered vendor file
(exit 1 in both cases).
Vendor model provenance: vendor/ holds read-only (mode 0444) originals with
sha256 + PROVENANCE.json; models/ holds curated/derived copies, each with
a .provenance.json sidecar recording origin and any changes. See
models/PROVENANCE_CONVENTION.md.
Verified capabilities, driven through the pcbnew Python API (bundled
python3.9) and kicad-cli:
kicad-cli sch erc --format json --exit-code-violations — real
JSON output, correct exit codes.kicad-cli pcb drc --format json --exit-code-violations — real
JSON, exit 5 on violations / 0 when clean. Verified semantically correct:
flagged genuine unconnected items before routing, clean after.kicad-cli pcb export gerbers and
kicad-cli pcb export drill — verified by inspecting file contents (valid
RS-274X and Excellon data), not just exit codes.pcbnew.ExportSpecctraDSN → Freerouting CLI → pcbnew.ImportSpecctraSES →
DRC clean (0 violations), verified end-to-end. Note kicad-cli does not
offer DSN export — only the pcbnew Python API does.Example Freerouting invocation (from smoke/run_pipeline.sh):
PATH="/opt/homebrew/opt/openjdk/bin:$PATH" java -jar /Users/roberto/EDA/scripts/tools/freerouting.jar \
-de rc_circuit.dsn -do rc_circuit.ses -mp 1 -l enGUI-only KiCad features (e.g. the interactive router) were not tested and must not be assumed scriptable (Limitations #12).
SKiDL runs on the project venv, Python 3.13
(/Users/roberto/EDA/env/venv/bin/python3). pcbnew and kinet2pcb run
only on KiCad's bundled Python 3.9
(/Users/roberto/Applications/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/bin/python3.9).
Any script that touches both must bridge explicitly with absolute
interpreter paths — invoking each stage with its own interpreter, e.g. from
smoke/run_pipeline.sh:
SKIDL_PY=/Users/roberto/EDA/env/venv/bin/python3
KICAD_PY=/Users/roberto/Applications/KiCad.app/Contents/Frameworks/Python.framework/Versions/3.9/bin/python3.9venv/bin/python -c "import pcbnew" fails with ModuleNotFoundError —
this is not a configuration bug, it is the expected split. Never assume one
interpreter can do both halves of the pipeline.
Scripts live under scripts/ (owned/maintained by a separate workflow —
see AGENTS.md). Confirmed present at time of writing:
scripts/validate_models.py, scripts/freeze_vendor.sh,
scripts/normalize_wrdata.py, scripts/pcbnew_test.py,
scripts/specctra_roundtrip_test.py, scripts/tools/freerouting.jar.
The following entry points are documented interface (purpose/invocation as specified) — they were being written/verified concurrently with this documentation, so their internals are not described here beyond intent:
| Script | Purpose |
|---|---|
scripts/setup.sh | One-shot environment setup. |
scripts/verify_env.sh | Verify installed tool versions/paths match what's documented. |
scripts/run_simulation.sh <netlist.cir> [outdir] | Run an ngspice batch simulation and extract results. |
scripts/run_tests.sh | Run the project's test/validation suite. |
scripts/validate_models.py | Validate every model in models/ against a real ngspice testbench; also checks provenance (--check-provenance). |
scripts/run_erc.sh <sch> [outjson] | Run kicad-cli sch erc and emit JSON. |
scripts/run_drc.sh <pcb> [outjson] | Run kicad-cli pcb drc and emit JSON. |
scripts/export_fab.sh <pcb> [outdir] | Export gerbers/drill; refuses to export if DRC fails. |
scripts/check_schematic.py <manifest.json> <netlist.cir> | Verify a hand-laid-out schematic drawing against the netlist, in both directions. Exit 1 on any mismatch. |
scripts/pdf_glyphs.py <file.pdf> [--offset N|--scan|--raw] | Extract text from a PDF with the stdlib only (zlib + the text operators). The mechanical half of the two-independent-readings rule ADR-013 imposes on hand-transcribed vendor models. Not a general-purpose extractor — see its header. |
scripts/freeze_vendor.sh | Set every file under vendor/ to mode 0444. Idempotent. |
TODO: unverified — confirm the final invocation syntax/flags of the above
against the actual script contents once they land; this table reflects the
interface as specified to this documentation task, not a read of the scripts
themselves (except validate_models.py, which already exists and is
described above from models/README.md).
Readable analog schematics cannot be auto-placed — researched and tested
against ASG, lcapy and netlistsvg, none of which work for this (see
docs/limitations.md #16). Every tool that does automatic placement targets
digital netlists, where dataflow dictates layout; analog readability lives in
conventions that encode designer intent and are absent from the netlist.
Drawings are therefore laid out by hand, in code, with schemdraw — a text
source that versions and diffs. The resulting risk, a drawing drifting silently
from the circuit, is mechanised away: each drawing emits a connectivity manifest
next to its SVG, and scripts/check_schematic.py compares it to the netlist in
both directions (nothing invented, nothing omitted). scripts/run_tests.sh
discovers every manifest under docs/*/schematic/ automatically.
The checker was proven to catch an invented device, an omitted device and a miswired pin — it passes a correct manifest and fails a deliberately broken one.
A human-reviewable schematic is a precondition for gates G1 and G2. See
docs/architecture.md for the convention and AGENTS.md for the gate rule.
Full detail in docs/limitations.md. Summary (none of these are soft-pedaled):
kicad-cli sch export netlist --format spice path is used instead.Sim.Type/Sim.Device when caching symbols into the generated .kicad_sch — silent invalid SPICE line unless set manually.power_pin_not_driven on GND + 3 lib_symbol_mismatch warnings).KICAD10_SYMBOL_DIR/KICAD10_FOOTPRINT_DIR for SKiDL 2.3.0); wrong version → confusing FileNotFoundError.item.GetLayerName() in pcbnew is unreliable — use board.GetLayerName(item.GetLayer()) or IsOnLayer().ImportSpecctraSES gives no error message on failure — only True/False..step (use .control/alterparam); multi-value .temp silently falls back to 27°C with only a warning (use dc TEMP start stop step inside .control); .lib <file> fails for plain model files (use .include); C/L need C=/inductance=, not a positional value; the first line of any .cir is always a title/comment.validate_models.py are order-of-magnitude sanity checks, not exact analytic cross-checks like R/C/L/transformer/opamp.Trivial RC low-pass fixture (R=1k, C=100n), driven through the full pipeline
by smoke/run_pipeline.sh. 11 stages PASSED, 3 PARTIAL, 0 FAILED.
| Stage | Verdict |
|---|---|
| Circuit definition | PASSED |
| Simulation | PASSED |
| Result extraction | PASSED |
| KiCad netlist generation | PASSED |
| PCB creation | PASSED |
| Footprint assignment | PASSED |
| Placement | PASSED |
| Routing | PASSED |
| DRC | PASSED |
| Gerber export | PASSED |
| Drill export | PASSED |
| Schematic generation | PARTIAL |
| SPICE netlist generation | PARTIAL |
| ERC | PARTIAL |
See docs/smoke-test.md for per-stage evidence (exact JSON/CSV values).
# Model library validation (38/38 checks)
/usr/bin/python3 /Users/roberto/EDA/scripts/validate_models.py
# Individual SPICE testbenches
/opt/homebrew/bin/ngspice -b /Users/roberto/EDA/testbenches/01_op.cir
/opt/homebrew/bin/ngspice -b /Users/roberto/EDA/testbenches/04_tran.cir
# ... etc. for 02..08
# Full smoke-test pipeline (schematic -> sim -> PCB -> routing -> DRC -> gerbers)
zsh /Users/roberto/EDA/smoke/run_pipeline.sh
# Vendor freeze re-enforcement (idempotent)
/Users/roberto/EDA/scripts/freeze_vendor.shdocs/architecture.md — architecture decision detail (selected stack,
rejected alternatives, source-of-truth contract).docs/limitations.md — full limitations list with detail.docs/smoke-test.md — per-stage smoke-test evidence.AGENTS.md — subagent roster and delegation/operating rules.models/README.md, models/PROVENANCE_CONVENTION.md, vendor/README.md —
model library and provenance conventions (owned by the scaffolding agent,
read here for reference).| Qty | Value | Footprint | References |
|---|---|---|---|
| 73 | 1N4148 | Diode_THT:D_DO-35_SOD27_P7.62mm_Horizontal | D12, D13, D14, D15, D16, D17, D18, D19, D102, D103, D152, D153, D154, D155, D156, D157 +57 |
| 26 | 100n | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mm | C1, C2, C105, C138, C139, C205, C238, C239, C305, C338, C339, C405, C438, C439, C505, C537 +10 |
| 24 | 100 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R108, R109, R111, R208, R209, R211, R308, R309, R311, R408, R409, R411, R508, R509, R511, R608 +8 |
| 24 | 100u | Capacitor_THT:CP_Radial_D8.0mm_P3.50mm | C104, C140, C141, C204, C240, C241, C304, C340, C341, C404, C440, C441, C504, C539, C540, C604 +8 |
| 24 | MMBT5401 | Package_TO_SOT_SMD:SOT-23 | Q144, Q146, Q193, Q245, Q247, Q293, Q344, Q346, Q393, Q445, Q447, Q493, Q543, Q545, Q593, Q643 +8 |
| 24 | MMBT5551 | Package_TO_SOT_SMD:SOT-23 | Q106, Q117, Q118, Q206, Q216, Q217, Q306, Q317, Q318, Q406, Q416, Q417, Q506, Q516, Q517, Q606 +8 |
| 18 | 10k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R4, R5, R147, R190, R248, R290, R347, R390, R448, R490, R546, R590, R646, R690, R746, R790 +2 |
| 16 | 10 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R130, R131, R229, R230, R330, R331, R429, R430, R529, R530, R629, R630, R729, R730, R829, R830 |
| 16 | 2.4k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R151, R158, R252, R259, R351, R358, R452, R459, R550, R557, R650, R657, R750, R757, R850, R857 |
| 16 | 20 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R142, R150, R243, R251, R342, R350, R443, R451, R541, R549, R641, R649, R741, R749, R841, R849 |
| 16 | 200 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R112, R149, R212, R250, R312, R349, R412, R450, R512, R548, R612, R648, R712, R748, R812, R848 |
| 16 | 22 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R134, R135, R233, R234, R334, R335, R433, R434, R533, R534, R633, R634, R733, R734, R833, R834 |
| 16 | 220 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R119, R120, R218, R219, R319, R320, R418, R419, R518, R519, R618, R619, R718, R719, R818, R819 |
| 16 | 3.40k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R101, R191, R201, R291, R301, R391, R401, R491, R501, R591, R601, R691, R701, R791, R801, R891 |
| 16 | 470k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R163, R166, R167, R168, R171, R172, R173, R174, R363, R366, R367, R368, R371, R372, R373, R374 |
| 16 | DZT5551 | Package_TO_SOT_SMD:SOT-223-3_TabPin2 | Q125, Q127, Q224, Q226, Q325, Q327, Q424, Q426, Q524, Q526, Q624, Q626, Q724, Q726, Q824, Q826 |
| 11 | 4.99k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R1, R2, R3, R114, R213, R314, R413, R513, R613, R713, R813 |
| 10 | 1k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R179, R194, R294, R379, R394, R494, R594, R694, R794, R894 |
| 9 | TP_GND | TestPoint:TestPoint_Keystone_5000-5004_Miniature | TP3, TP102, TP202, TP302, TP402, TP502, TP602, TP702, TP802 |
| 8 | 1.00k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R129, R228, R329, R428, R528, R628, R728, R828 |
| 8 | 1.2k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R145, R246, R345, R446, R544, R644, R744, R844 |
| 8 | 1.50k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R136, R235, R336, R435, R535, R635, R735, R835 |
| 8 | 1.58k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R128, R227, R328, R427, R527, R627, R727, R827 |
| 8 | 10.0k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R115, R214, R315, R414, R514, R614, R714, R814 |
| 8 | 1000u | Capacitor_THT:CP_Radial_D10.0mm_P5.00mm | C143, C244, C343, C444, C542, C642, C742, C842 |
| 8 | 10M | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R175, R176, R177, R178, R375, R376, R377, R378 |
| 8 | 137 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R107, R207, R307, R407, R507, R607, R707, R807 |
| 8 | 18.7 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R192, R292, R392, R492, R592, R692, R792, R892 |
| 8 | 1u | Capacitor_THT:C_Rect_L26.5mm_W11.5mm_P22.50mm_MKS4 | C171, C172, C173, C174, C371, C372, C373, C374 |
| 8 | 330p | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mm | C137, C236, C337, C436, C536, C636, C736, C836 |
| 8 | 36.5 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R123, R222, R323, R422, R522, R622, R722, R822 |
| 8 | 4.7k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R148, R249, R348, R449, R547, R647, R747, R847 |
| 8 | 470p | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P5.00mm | C124, C223, C324, C423, C523, C623, C723, C823 |
| 8 | 47u | Capacitor_THT:CP_Radial_D8.0mm_P3.50mm | C116, C215, C316, C415, C515, C615, C715, C815 |
| 8 | 56 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R126, R225, R326, R425, R525, R625, R725, R825 |
| 8 | DZT5401 | Package_TO_SOT_SMD:SOT-223-3_TabPin2 | Q122, Q221, Q322, Q421, Q521, Q621, Q721, Q821 |
| 8 | LS352 | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | Q121, Q220, Q321, Q420, Q520, Q620, Q720, Q820 |
| 8 | LSK489B | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | Q110, Q210, Q310, Q410, Q510, Q610, Q710, Q810 |
| 8 | MJE15032 | preamp:TO-220-3_Vertical_Ohmite_WA-T220-101E | Q132, Q231, Q332, Q431, Q531, Q631, Q731, Q831 |
| 8 | MJE15033 | preamp:TO-220-3_Vertical_Ohmite_WA-T220-101E | Q133, Q232, Q333, Q432, Q532, Q632, Q732, Q832 |
| 6 | 47 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R161, R164, R261, R361, R364, R461 |
| 4 | 1M | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R113, R265, R313, R465 |
| 4 | 220k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R263, R264, R463, R464 |
| 4 | 464 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R902, R903, R912, R913 |
| 4 | MountingHole_3.2mm_M3 | MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 2 | 10u | Capacitor_THT:C_Rect_L41.5mm_W19.0mm_P37.50mm_MKS4 | C265, C465 |
| 2 | 1u | L73:C_Rect_L26.5mm_W7.0mm_P22.50mm_STAX_1uF | C165, C365 |
| 2 | 3.57k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R237, R437 |
| 2 | 4.7u | Capacitor_THT:C_Rect_L41.5mm_W19.0mm_P37.50mm_MKS4 | C162, C362 |
| 2 | 4.7u | Capacitor_THT:C_Rect_L31.5mm_W15.0mm_P27.50mm_MKS4 | C262, C462 |
| 2 | 845 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R901, R911 |
| 2 | 866 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R242, R442 |
| 2 | BAV199 | Package_TO_SOT_SMD:SOT-23 | D179, D379 |
| 2 | LM4040B-5.0 | Package_TO_SOT_SMD:SOT-23 | U1, U2 |
| 2 | Schottky 1A | Diode_THT:D_DO-41_SOD81_P10.16mm_Horizontal | D10, D11 |
| 2 | TP_RLY_RET | TestPoint:TestPoint_Keystone_5000-5004_Miniature | TP5, TP9 |
| 2 | TVS bidir | Diode_SMD:D_SMA | D1, D2 |
| 1 | G6K-2F-Y GAIN | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K1 |
| 1 | G6K-2F-Y GAIN10 | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K5 |
| 1 | G6K-2F-Y HOLD10 | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K12 |
| 1 | G6K-2F-Y HOLD3 | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K11 |
| 1 | G6K-2F-Y MUTE1 | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K2 |
| 1 | G6K-2F-Y MUTE3 | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K4 |
| 1 | G6K-2F-Y PERMIT | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K6 |
| 1 | G6K-2F-Y SEL1 | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K13 |
| 1 | G6K-2F-Y SEL2 | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K14 |
| 1 | G6K-2F-Y SEL3 | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K15 |
| 1 | G6K-2F-Y SEL4 | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K16 |
| 1 | G6KU-2F-Y SPIA1 | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K9 |
| 1 | G6KU-2F-Y SPIA2 | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K10 |
| 1 | G6KU-2F-Y TRIM1 | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K7 |
| 1 | G6KU-2F-Y TRIM2 | Relay_SMD:Relay_DPDT_Omron_G6K-2F-Y | K8 |
| 1 | GAIN 0/+3/+10 dB | Connector_PinHeader_2.54mm:PinHeader_2x08_P2.54mm_Vertical | SW2 |
| 1 | GAIN_LED | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J6 |
| 1 | IM06TS MUTE2 | Relay_SMD:Relay_DPDT_AXICOM_IMSeries_JLeg | K3 |
| 1 | IN1_L | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J101 |
| 1 | IN1_R | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J301 |
| 1 | IN2_L | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J102 |
| 1 | IN2_R | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J302 |
| 1 | IN3_L | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J103 |
The 624 most common of 657 parts.

Bu3nd14/EDA
Scripted analog EDA + PCB automation environment (KiCad 10 + ngspice + SKiDL) for macOS Apple Silicon

Bu3nd14/EDA
Scripted analog EDA + PCB automation environment (KiCad 10 + ngspice + SKiDL) for macOS Apple Silicon

Bu3nd14/EDA
Scripted analog EDA + PCB automation environment (KiCad 10 + ngspice + SKiDL) for macOS Apple Silicon

Bu3nd14/EDA
Scripted analog EDA + PCB automation environment (KiCad 10 + ngspice + SKiDL) for macOS Apple Silicon

Bu3nd14/EDA
Scripted analog EDA + PCB automation environment (KiCad 10 + ngspice + SKiDL) for macOS Apple Silicon

Bu3nd14/EDA
Scripted analog EDA + PCB automation environment (KiCad 10 + ngspice + SKiDL) for macOS Apple Silicon





eez-open/psu-hw
EEZ H24005 programmable bench power supply (powered by Arduino Due)

fietser28/EL-Load
The DCL8010 electronic load module features a DC Electronic Load with several modes and protections. This project is the for the development boards for this project. There is a seperate git project for the firmware.


It measures 392.6 × 198.3 mm and has 2 copper layers, 1.6 mm thick.
657 parts, built around the LM4040B50FTA, MMBT5401, MMBT5551 and DZT5551. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the Bu3nd14/EDA repository on GitHub, at the commit this page was made from: the board is docs/preamp/data/2026-11-05/L73/audio/audio_routed.kicad_pcb and its schematic smoke/rc_circuit.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask Bu3nd14 before reusing the design.