tools/epro2/kicad: fix two --all crashes found running the other 4 Pro projects
Running the new --all on the remaining 4 Pro projects (X86 motherboard, 220V power supply, Taishan Pi, Liangshan Pi) surfaced two crash modes not covered by ESP-VoCat: 1. Odd inner-layer count → KiCad rejects the file at load with "3 is not a valid layer count". The 220V power boards have one used inner SIGNAL layer (3 copper total: F.Cu / In1.Cu / B.Cu), but KiCad requires an even copper count. Fixed pcb_writer to pad with one empty inner layer when the inner count is odd, so the total stays even (2, 4, 6, ...). 2. Two BOARDs sharing the same META.title — twin "显示板" boards in the 220V power project — landed in the same project directory and the second silently overwrote the first's .kicad_sch / .kicad_pcb / .kicad_pro. Fixed --all to detect title collisions and suffix every colliding basename with the BOARD uuid prefix (so both '显示板' boards become '显示板_52e8cc76' and '显示板_55d32906' rather than one quietly winning). 71 → 73 unit tests pass (test_odd_inner_signal_count_padded_to_even_total + test_duplicate_board_titles_get_distinct_basenames). Tangentially noted while running this: Taishan Pi and Liangshan Pi are Pro 2.x JSON, not EPRO2 streams — our replay layer reads the files but doesn't decode docType, so SCH/PCB grouping returns nothing. Pro 2.x needs a separate writer; out of scope for this commit. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -132,11 +132,18 @@ def _build_layer_map(doc: Document) -> _LayerMap:
|
||||
inner_signal_ids.append(lid)
|
||||
inner_signal_ids.sort()
|
||||
|
||||
# KiCad requires an EVEN copper layer count (2, 4, 6, ...). F.Cu + N
|
||||
# inner + B.Cu = N+2 — must be even, i.e. N must be even. If we have an
|
||||
# odd number of used inner SIGNAL layers, pad with one empty inner
|
||||
# layer. Without this a board with one used inner (3 copper total)
|
||||
# crashes the loader with "3 is not a valid layer count".
|
||||
inner_emit = len(inner_signal_ids) + (len(inner_signal_ids) % 2)
|
||||
epro_to_kicad: dict[int, str] = {1: "F.Cu", 2: "B.Cu"}
|
||||
layers_in_order: list[tuple[int, str, str]] = [(0, "F.Cu", "signal")]
|
||||
for n, lid in enumerate(inner_signal_ids, start=1):
|
||||
for n in range(1, inner_emit + 1):
|
||||
kname = f"In{n}.Cu"
|
||||
epro_to_kicad[lid] = kname
|
||||
if n - 1 < len(inner_signal_ids):
|
||||
epro_to_kicad[inner_signal_ids[n - 1]] = kname
|
||||
layers_in_order.append((n, kname, "signal"))
|
||||
layers_in_order.append((31, "B.Cu", "signal"))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user