sexp 代码同步
- 作者仓库星标 3,367
- 许可证 MIT
- 作者仓库 atopile
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.
- 流狐分类
- 通用
- 作者声明 Agent
- 未找到明确声明;不据此推断已兼容或已测试
- 静态检查
- 94 / 100 · 启发式扫描,不代表运行安全
- 作者 / 版本 / 许可
- @atopile · MIT
- 流狐 Token 估算
- 低消耗
- 流狐接入估算
- 即装即用
- 是否需要外部 API Key
- 未发现要求
- 检测到的系统要求
- 未声明
- 底层运行要求
- Python
- 检测到的文件与系统行为
-
- 只读
- 允许写入 / 修改
- 检测到的网络行为
- 仅限本地
- 安装命令数
- 无(仅作为资料)
档案由构建时根据 SKILL.md 与安装命令自动衍生,可能与作者实际意图存在差异。
需要注意: 未限定 allowed-tools,默认拥有全部工具权限。
作者没有在当前 SKILL.md 中定义固定输出样例。 Quick Start
Quick Start
Development Workflow
Modify Zig: parsing/formatting: src/faebryk/core/zig/src/sexp/ Python exposure: src/faebryk/core/zig/src/python/sexp/sexppy.zig
# 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_sexp` extension 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
```python
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` (exports `PyInit_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
… 证据边界与执行链路
作者原文负责流程事实;流狐只索引当前章节、要点、文件与命令。
章节 -> Quick Start → Relevant Files → Dependants (Call Sites) → How to Work With / Develop / Test → Core Concepts → Development Workflow
要点 -> Two-level model · Python API shape · Convenience wrapper · shared-object caching
文件/命令 -> pyzigsexp · src/faebryk/core/zig/README.md · src/faebryk/core/zig/src/sexp/ · src/faebryk/core/zig/src/python/sexp/sexppy.zig · src/faebryk/core/zig/src/sexp/tokenizer.zig · src/faebryk/core/zig/src/sexp/ast.zig · src/faebryk/core/zig/src/sexp/structure.zig · src/faebryk/core/zig/src/sexp/kicad/
内容 SHA-256 -> 6c65510f5923
方法与流程
适用与边界
原文中的明确线索
pyzigsexp、src/faebryk/core/zig/README.md、src/faebryk/core/zig/src/sexp/、src/faebryk/core/zig/src/python/sexp/sexppy.zig、src/faebryk/core/zig/src/sexp/tokenizer.zig、src/faebryk/core/zig/src/sexp/ast.zig、src/faebryk/core/zig/src/sexp/structure.zig、src/faebryk/core/zig/src/sexp/kicad/