23 Commits

Author SHA1 Message Date
Akhil Velagapudi ac8434ff42 Board-level configuration (#188)
* Add `builtin.add_board_config`

Sets constraints

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Enable json extension

Useful for debugging

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* More compact config mapping

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add predefined sizes support to board config

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Make all board config fields optional, add merging

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add netclass support to board config

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add stackup support, sexpr library

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Patch stackup on `pcb layout`

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Sync board config by default

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Fix deep_merge

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Document board config feature

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Flatten netclasses

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add base configurations

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Remove unused _is_new_board

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Move board_config.zen to examples/

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Use pcb-sexpr

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Replace --dont-sync with --sync (default true)

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

---------

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>
2025-09-29 15:57:15 -04:00
Lenny Khazan ace6984ecd Always include all layout logs (#156) 2025-09-15 15:29:45 -04:00
Akhil Velagapudi bb0898dbef Add moved() directive (#152)
* Add pcb:sch comments to test board

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add moved() directive

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Include moved paths in Schematic

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Repair footprints, groups in layout

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Update docs

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Compute remapper data *before* processing positions

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add warnings if old path exists or new path doesn't

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add snapshot tests for moved()

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

---------

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>
2025-09-14 21:15:37 -04:00
Akhil Velagapudi 0760ecaec4 Add basic BOM matching API (#145)
* Add EvalConfig, reuse pcb_zen::eval

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add Bom struct with multiple views

This also limits the public API of Bom to just json() and
ungrouped_json().

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add bom rule matching

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add basic BOM matching API

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Address PR comments

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add multiple offers to matching rule

Also added package to matching key

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add matched_by, make package required

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

---------

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>
2025-09-09 00:24:55 -04:00
Akhil Velagapudi ec94b7e6dd Sync orphaned zones, vias, polygons (#141)
* Sync orphaned zones, vias, polygons

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Ruff format

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

---------

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>
2025-09-05 17:21:17 -04:00
Akhil Velagapudi 0c2c87c338 [DIO-352] Add TestBench() support (#129)
* Add TestBench

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add checks

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add net -> ports dict

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add port -> pin dict

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Provide component properties to check fns

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Update spec, fix spans on check failures

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Use check(), error() to fail checks instead of return value

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add ModuleView to group check fn args

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add component_values field, expose more typed values

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Fully switch to ComponentValues in check fn

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Use ModuleValue directly

Delete ModuleView

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add at() support for module which can return sub-module or component

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Rename testbench.rs -> test_bench.rs

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Move bench_test_cases to test-workspaces/bench

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Print "checks passed" log to eprintln

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Make .nets and .components functions

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add schematic to graph conversion, path finding

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add external net support to path finding

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Don't use bool ret for matchers

Use error(), check()

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add path.matches()

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add samples

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Moar samples

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Update spec.mdx

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Consolidate seq matchers test code

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add suppress_errors

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add lm5163q1 example

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add test_cases, inputs arg to check fns

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Update bmi270 example to use path.matches()

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Use more path.matches()

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add span for path.matches()

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add pcb test

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Print stuff only to stderr

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Output test results in TAP or json

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* "testbench" -> "test_bench"

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add table output format for pcb test

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Tolerate non-callable inputs to "checks"

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add tuple checks support for renaming check fns

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add snapshot tests

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Make max_depth optional

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

---------

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>
2025-09-04 22:30:30 -04:00
Akhil Velagapudi d137c811dc Remove load() dir support (#133)
Signed-off-by: akhilles <akhilvelagapudi@gmail.com>
2025-09-03 16:54:12 -04:00
Lenny Khazan dcf602bcff Hide netlist.json from layout output (#131) 2025-08-30 22:44:05 -04:00
Lenny Khazan dfadcb0b14 [DIO-358] Fix incorrect reference designators in schematics viewer (#127) 2025-08-29 23:53:47 -04:00
Akhil Velagapudi de8c9a3d99 Fix layout sync when using Path() (#120)
Since Path() resolves to an absolute path, we shouldn't prefix it with
module path.

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>
2025-08-26 12:04:37 -07:00
Akhil Velagapudi ae7766a8a6 Add warnings for unstable refs in load(), Module() (#105)
* Refactor diagnostics for warnings support

- Add render trait
- Render warnings after errors
- Reuse build code across build, layout

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Delete bundle

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Fix clippy lints

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add git ref metadata

3 stages to fetch_remote:
- Ensure remote is in cache
- Add appropriate symlinks
- Classify + store ref metadata

Some code cleanup:
- Factored out some git clone dupe code
- Centralized git operations in git.rs

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Warn on unstable refs

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add "-Dwarnings" flag to error on warnings

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Warn on unstable refs in Module()

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add snapshot tests for warnings

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Fix span detection for chained Module()

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add ResolveContext, dedup resolve code

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Use spec history for better alias warnings

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add pcb.toml spans

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add type-erased error storage to Diagnostic

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Fix bug with load() span detection

The previous logic would just attempt to match by path, but if there are
multiple load() statements in a single file with the same path, then
find_load_span_for_path with always return the first.

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Added diagnostics passes

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add LSP-specific pass to filter out some warnings

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Fix rebase conflicts

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Fix unstable ref detection logic

If we clone by tag and the tag exists in the git repo, it's a stable
ref. Same with commit.

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

---------

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>
2025-08-25 15:45:51 -07:00
Davide Asnaghi 8e6a63deb4 [FEATURE] sync zones and graphics (#79)
* sync zones and text

* add initial test for zone sync

* add zones to groups

* simpler zone test

* fix zone sync

* fix net determinism

* add more interesting test

* hack: amend tests with (0,0) positioning for now

* wip: fix nets for zones

* hack: keep old tests to make sure we don't mess up

* add zone sync

* fix sync graphics

* add complex test

* deterministic snapshot

* fix snapshots with no files

* add graphics test

* add timout

* bump timout

* reduce complexity

* move methods to virtual item

* add graphics groups

* use Duplicate

* add hatching to complex test
2025-08-24 01:29:00 -04:00
Akhil Velagapudi 44c73baf2d [DIO-319] Add board config to pcb.toml, pcb info (#92)
* Add board config to pcb.toml, pcb info

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Choose first board (when sorted) as fallback default

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add secondary heuristics pass to detect boards without pcb.toml

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Update snapshots

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Don't allow malformed pcb.toml

Empty pcb.toml is fine.

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Don't copy .pcb/cache into test fixture

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Replace test-workspace with snapshot tests of pcb info

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

---------

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>
2025-08-21 15:20:16 -07:00
Akhil Velagapudi 58549fb924 [DIO-301] Add pcb vendor, pcb build --offline (#72)
* Update Cargo.lock

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Add pcb vendor

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Copy pcb.toml to release if it exists

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Use vendor dir in resolver

Add --offline support to build, layout.
Standardize behavior of find_workspace_root. Most of the callsites would
fallback on parent dir of target .zen file. We should just do that
universally to reduce conditional code paths.

Add an option to the resolve to not use the vendor dir in case that's
useful in some cases.

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Drop vendor alias

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Only support pcb vendor in pcb.toml workspaces

Attempting to resolve a common workspace root from multiple zen files in
a dir without pcb.toml just got way too complicated. We can add support
for this in the future if needed.

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

* Canonicalize zen_path

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>

---------

Signed-off-by: akhilles <akhilvelagapudi@gmail.com>
2025-08-15 12:07:51 -07:00
Lenny Khazan d3bef1b0a5 Update net naming strategy (#62)
* Consistent net naming

* cargo fmt

* fix clippy

* uniquify net names
2025-08-08 15:52:15 -04:00
Lenny Khazan 834fc645cc [DIO-293] Add dnp/exclude_from_bom support (#58)
* [DIO-293] Add dnp/exclude_from_bom support

* ignore underscored fields
2025-08-04 16:28:07 -04:00
Lenny Khazan 7aef7940c2 Fix handling of kicad_sym (extends ...) (#40)
* Fix handling of kicad_sym (extends ...)

* update snaps
2025-07-21 23:02:33 -04:00
Lenny Khazan 345494f55b Fix symbols with multiple pads per pin + component orientation on back-side components (#34)
* Fix symbols with multiple pads per pin

* remove unused

* update layout syncing

* update snap for kicad 9.0.3

* Fix orientation syncing for back components

* update to kicad 9.0.3 on windows

* more robust kicad version in CI
2025-07-18 14:37:05 -04:00
Lenny Khazan aebd53ce61 Schematic layout persistence (#31)
* port changes from main repo

* persist sch position

* Update tests

* remove unused
2025-07-14 02:20:13 -04:00
Lenny Khazan 47d379eb84 Properly sync component sides (#24) 2025-07-07 16:44:31 -07:00
Lenny Khazan f75787dbf3 Standardize crate metadata (#10) 2025-07-02 23:40:29 -04:00
Lenny Khazan 143633eb14 Starlark -> Zener (#8) 2025-07-02 17:25:45 -04:00
Lenny Khazan e852477546 Initial release (#5)
* Initial release

* cargo-dist

* build and test CI

* update ubuntu workflow

* fmt

* ubuntu: install deps

* clippy: 0.1.88 fixes

* format

* install clippy

* Update README.md

* Don't run cargo-dist on PRs
2025-07-01 04:06:08 -04:00