Tools for parsing, formatting, and manipulating KiCad S-expression files using the Zig engine exposed to Python.
Install
mkdir -p .claude/skills/sexp && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/1126" && unzip -o skill.zip -d .claude/skills/sexp && rm skill.zipInstalls to .claude/skills/sexp
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
How the Zig S-expression engine and typed KiCad models work, how they are exposed to Python (pyzig_sexp), and the invariants around parsing, formatting, and freeing. Use when working with KiCad file parsing, S-expression generation, or layout sync.Key capabilities
- →Tokenize KiCad S-expression files
- →Parse KiCad file format structures
- →Pretty-print S-expression code
- →Map typed models to PCB/Footprint data
- →Synchronize layout files with Python objects
How it works
Uses a Zig-based engine for high-performance parsing and tokenization, exposed to Python through a bridge that enforces memory and format invariants.
Inputs & outputs
When to use sexp
- →Parse KiCad PCB files
- →Generate S-expression output for symbols
- →Manage KiCad file schema invariants
- →Synchronize PCB layout data
About this skill
Sexp Module
The sexp subsystem provides:
- a fast S-expression tokenizer/parser/pretty-printer in Zig, and
- typed Zig models for KiCad formats (PCB, footprint, netlist, symbol, schematic, fp_lib_table),
exposed to Python via the
pyzig_sexpextension module.
Source-of-truth docs and code:
src/faebryk/core/zig/README.md(high-level overview)src/faebryk/core/zig/src/sexp/*(tokenizer/AST/structure)src/faebryk/core/zig/src/python/sexp/sexp_py.zig(Python API + critical memory rules)
Quick Start
from pathlib import Path
from faebryk.libs.kicad.fileformats import kicad
pcb = kicad.loads(kicad.pcb.PcbFile, Path("board.kicad_pcb"))
_text = kicad.dumps(pcb)
Relevant Files
- Zig core:
src/faebryk/core/zig/src/sexp/tokenizer.zig(tokenization + line/column tracking)src/faebryk/core/zig/src/sexp/ast.zig(SExp tree + KiCad pretty formatting)src/faebryk/core/zig/src/sexp/structure.zig(decode/encode + error context)src/faebryk/core/zig/src/sexp/kicad/*(typed KiCad models)
- Python extension entrypoint:
src/faebryk/core/zig/src/python/sexp/init.zig(exportsPyInit_pyzig_sexp)src/faebryk/core/zig/src/python/sexp/sexp_py.zig(module + type binding generation)
- Generated Python stubs (what users “see”):
src/faebryk/core/zig/gen/sexp/*.pyi
- Convenience wrapper used throughout the codebase:
src/faebryk/libs/kicad/fileformats.py(namespaces modules + caching +loads/dumps)
Dependants (Call Sites)
src/faebryk/libs/kicad/fileformats.py(primary integration layer)- KiCad exporters and layout sync:
src/faebryk/exporters/pcb/kicad/*src/faebryk/exporters/pcb/layout/layout_sync.py
- KiCad plugin workflow:
src/atopile/kicad_plugin/*
How to Work With / Develop / Test
Core Concepts
- Two-level model:
- raw
SExpparsing/formatting (tokenizer.zig,ast.zig) - typed KiCad decoding/encoding (
structure.zig+sexp/kicad/*.zig)
- raw
- Python API shape: the extension exposes per-format modules (e.g.
pcb,netlist) with:- module-level
loads(data: str) -> File - module-level
dumps(file: File) -> str File.free(...)for releasing Zig-owned allocations
- module-level
- Convenience wrapper:
faebryk.libs.kicad.fileformats.kicadwraps these modules and provideskicad.loads(...)/kicad.dumps(...).
Development Workflow
- Modify Zig:
- parsing/formatting:
src/faebryk/core/zig/src/sexp/* - Python exposure:
src/faebryk/core/zig/src/python/sexp/sexp_py.zig
- parsing/formatting:
- Rebuild:
ato dev compile(importsfaebryk.core.zig)
- If you changed the API:
- verify stubs under
src/faebryk/core/zig/gen/sexp/*.pyiupdate accordingly - adjust
src/faebryk/libs/kicad/fileformats.pyif needed
- verify stubs under
Testing
- Best practical test is round-trip:
- load a known
.kicad_pcb/.kicad_sch, dump it, and ensure KiCad accepts it (formatting-sensitive).
- load a known
- Zig unit tests (where present):
zig test src/faebryk/core/zig/src/sexp/ast.zigzig test src/faebryk/core/zig/src/sexp/structure.zig
Best Practices
- Prefer
faebryk.libs.kicad.fileformats.kicadunless you explicitly need the raw module API. - Be mindful of shared-object caching in
kicad.loads(...): path-based loads are cached and returned by reference (mutations are shared).
Memory & Lifetime Invariants (critical)
The Python bindings duplicate the input S-expression string into a persistent allocator because parsed structs contain pointers into the input buffer.
Implications:
- Repeated
loads(...)of large files can grow memory if you never callfree(...)on the returned*File. - The convenience wrapper currently caches loaded objects by path; do not
free(...)cached objects unless you also invalidate the cache.
When not to use it
- →Parsing non-KiCad file formats
- →Generating non-S-expression files
Prerequisites
Limitations
- →Requires understanding of KiCad schema
- →Memory-managed via Zig rules
How it compares
This tool provides low-level, typed, high-speed access to KiCad file internals, which is significantly faster and more stable than regex parsing.
Compared to similar skills
sexp side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| sexp (this skill) | 3 | 6mo | No flags | Advanced |
| cocoindex | 6 | 9mo | Review | Intermediate |
| similarity-search-patterns | 3 | 2mo | No flags | Advanced |
| api-test-generator | 1 | 9mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by atopile
View all by atopile →You might also like
cocoindex
cocoindex-io
Comprehensive toolkit for developing with the CocoIndex library. Use when users need to create data transformation pipelines (flows), write custom functions, or operate flows via CLI or API. Covers building ETL workflows for AI data processing, including embedding documents into vector databases, building knowledge graphs, creating search indexes, or processing data streams with incremental updates.
similarity-search-patterns
wshobson
Implement efficient similarity search with vector databases. Use when building semantic search, implementing nearest neighbor queries, or optimizing retrieval performance.
api-test-generator
mikopbx
Генерация полных Python pytest тестов для REST API эндпоинтов с валидацией схемы. Использовать при создании тестов для новых эндпоинтов, добавлении покрытия для CRUD операций или валидации соответствия API с OpenAPI схемами.
check-vault-onchain
tradingstrategy-ai
Check our feature flagging against an onchain vault
generate-validation-notebook
monte-carlo-data
Generate SQL validation notebooks for dbt changes. Pass a GitHub PR URL or local dbt repo path.
miniqmt-skill
xiaxiaoqian
MiniQMT量化交易开发技能,基于迅投XtQuant库提供行情数据获取(xtdata)和交易执行(xttrader)功能。用于开发股票、期货、期权等量化交易策略,支持历史/实时行情数据下载、K线/分笔数据获取、财务数据查询、自动下单/撤单、持仓查询、资产查询等。适用于需要连接MiniQMT客户端进行量化交易的场景。