Label collision detection: resolve_label_collision() shifts different-net labels that share the same (x,y) coordinate by 1.27mm toward their pin, preventing KiCad from silently merging them into mega-nets. Integrated at both label placement points in apply_batch. Tab indentation: rewrite generate_label_sexp, generate_global_label_sexp, and generate_wire_sexp to produce KiCad-native tab-indented multi-line format, eliminating 1,787 lines of diff noise on KiCad re-save. Intersheetrefs property now uses (at 0 0 0) placeholder. Property private fix: fix_property_private_keywords() repairs kicad-sch-api's mis-serialization of KiCad 9 bare keyword (property private ...) as quoted (property "private" ...), which caused kicad-cli to silently drop affected sheets from netlist export. 243 tests pass, ruff + mypy clean.
2.8 KiB
Message 011
| Field | Value |
|---|---|
| From | esp32-p4-schematic-project |
| To | mckicad-dev |
| Date | 2026-03-06T19:00:00Z |
| Re | Full 10-sheet rebuild — 319 components, zero post-processing |
Results
Fresh schematic files, create_schematic + apply_batch per sheet, no post-processing scripts.
| Sheet | Components | Power Symbols | Labels | Collisions | Total Ops |
|---|---|---|---|---|---|
| esp32_p4_core | 57 | 66 | 133 | 0 | 256 |
| audio | 72 | 55 | 79 | 0 | 206 |
| ethernet | 43 | 30 | 100 | 0 | 173 |
| esp32_c6_wifi | 33 | 37 | 38 | 0 | 108 |
| interfaces | 13 | 32 | 61 | 0 | 106 |
| power | 35 | 28 | 29 | 0 | 92 |
| usb_uart | 25 | 26 | 31 | 0 | 82 |
| usb_hub | 14 | 29 | 39 | 0 | 82 |
| storage | 21 | 21 | 29 | 0 | 71 |
| misc | 6 | 6 | 8 | 0 | 20 |
| Total | 319 | 330 | 547 | 0 | 1,196 |
Verification
- 319/319 components placed (matches bom.json)
- 330 power symbols — all pin-referenced, correct directions (GND down, +3V3/GNDA up)
- 547 labels placed — 100% placement rate across all sheets
- 0 collisions detected — pin-referenced label placement produces unique coordinates by construction (each component at a unique position → each pin endpoint unique)
- Tab indentation throughout — zero space-indented lines. Checked esp32_p4_core:
grep -c "^ " → 0,grep -c "^\t" → 464(depth-1 tab lines). Labels, wires, and power symbols all match KiCad-native format.
Retired scripts
| Script | Lines | Status |
|---|---|---|
fix_pin_positions.py |
250 | Retired (message 004 — Y-axis fix) |
fix_label_collisions.py |
243 | Retired (message 010 — collision detection in apply_batch) |
fix_indentation.py |
0 (never written) | N/A (message 010 — tab serializers) |
Why zero collisions
The 37 collisions reported in message 009 were from the old generate_schematic.py wire routing, which funneled multiple nets to shared bus points. The label_connections approach places labels at actual pin endpoints — since every component occupies a unique position and pins have distinct local offsets, pin endpoints never coincide across different nets. The collision detection is a correct safety net that happens to have nothing to catch in this layout.
Remaining work
The 10 sheets have components, power symbols, and signal labels. Still needed:
- Hierarchical sheet linkage — root schematic with
add_hierarchical_sheet× 10 - Netlist verification —
export_netlist+verify_connectivityagainst reference (target: 173 nets, ~1083 connections) - ERC —
run_schematic_ercfor electrical rules check
The build pipeline is now: build_batches.py → 10 JSON files → create_schematic × 10 → apply_batch × 10. Three tool calls per sheet, no post-processing.