5부까지 오면서 규칙을 하나씩 코드로 박아 넣었습니다. 그리고 이번 회차에서 숫자가 꽤 좋아졌습니다.

항목라우팅 직후다듬은 뒤
직각(90°) 꺾임28곳3곳
임의 각도 세그먼트78개 (132mm)17개
선 굵기 섞임넷 16개0개
DRC 위반1312

세 가지 수법이 먹혔습니다.

1. 모따기 크기를 낮춰가며 시도합니다. 기존 도구는 모따기를 한 가지 크기로만 시도했습니다. 빡빡한 구간에서 그게 안 들어가면 DRC 가 막고, 그 코너는 영원히 직각으로 남습니다. 0.8 → 0.5 → 0.35 → 0.25 … 로 낮춰가며 시도하니 절반이 풀렸습니다.

2. 배치를 15개에서 3개로 줄입니다. “적용 → DRC → 나빠지면 되돌리기”를 배치로 하는데, 배치가 크면 나쁜 편집 하나가 좋은 14개를 같이 죽입니다. 15개 배치에서 97개 중 7개만 살아남던 것이, 3개 배치로 바꾸니 66개 중 50개가 살았습니다.

3. 접점을 이웃 축을 따라 밉니다. 2.19° 처럼 “직선이어야 하는데 살짝 흐른” 선은, 그 접점에 붙은 이웃 배선이 축 정렬돼 있으면 이웃의 자기 방향으로 접점을 밀면 됩니다. 이웃은 각도를 유지한 채 길이만 변하고, 문제 선은 정확한 각도가 됩니다. 62개 중 44개가 이 방식으로 해결됐습니다.

배선을 확대해 보니 나온 네 가지 문제

배선 품질은 숫자가 좋아졌으니 됐다고 생각했습니다. 그러다 배선을 크게 확대해서 봤습니다.

  • 비아가 빈 공간에 박혀 있고, 거기서 선이 길게 늘어집니다. 사람이라면 그 자리에 비아를 놓지 않습니다.
  • 하면 배선이 상면 패드 위를 여러 번 가로지릅니다. 층이 달라 DRC 는 통과하지만, “부품 패드 사이로 지나가지 않는다”는 규칙 위반입니다.
  • 평행 다발이 최소 간격으로 붙어 있습니다. 간격을 넓힐 공간이 없습니다.
  • 올라갔다 대각으로 내려오는 우회가 그대로 남아 있습니다.

측정값이 이미 말하고 있었습니다. 넷당 평균 꺾임 12.9회. 우회율 최대 3.0배 (224mm 를 깔아서 74mm 를 잇습니다). 저는 그 위에 마감만 계속 발랐던 것입니다.

규칙 위반 개수가 줄어드는 것과 배선이 좋아지는 것은 다른 일입니다.

직각 3곳, 임의각 17개는 “게이트를 통과할 수 있는 상태”이지 “양산 도면으로 내놓을 수 있는 상태”가 아닙니다.

원인은 구리층 부족 — 양산품은 4층 배선이었다

구리층 수가 답이었습니다. 5부 끝에 적어둔 실측 그대로, 같은 계열 양산품인 4채널 IO 보드가 4층이고, 내층 두 장이 접지 평면이 아니라 진짜 배선층입니다.

보드상면내층2내층3하면
4채널 IO (양산품)369mm344mm262mm439mm

저는 채널이 4배인 16채널 보드를 2층에 욱여넣고 있었습니다.

4층으로 나눠 깐 배선 — 층마다 다른 색

완성본의 배선을 층별로 색을 달리해 겹쳐 본 것입니다. 빨강·주황이 바깥 두 면, 초록과 파랑이 내층 두 장입니다. 4부에서 2층으로 우겨넣던 배선의 상당 부분이 지금은 내층으로 내려가 있습니다 — 위아래로 곧게 지나갈 자리가 그만큼 생긴 것입니다.

공간이 없으니 라우터는 이렇게 대응합니다 — 0.06mm 씩 비켜 가는 토막을 만들고, 비아를 아무 데나 박아 층을 바꾸고, 패드 위로 넘어갑니다. 그리고 그 결과를 후처리로 고치려 하면 DRC 가 막습니다. 실제로 미세 토막을 흡수하려 했더니 97개 중 7개만 통과했습니다. 나머지는 넣는 순간 간섭이 났습니다. 그 토막들이 존재하는 이유가 바로 “거기 공간이 없어서”였기 때문입니다.

KiCad API 로 4층 전환과 층별 방향 주입

KiCad 층 번호는 추측하지 않고 API 로 바꿨습니다. 직접 쓰면 번호 체계를 틀립니다 (KiCad 10 은 F.Cu=0, B.Cu=2, In1.Cu=4, In2.Cu=6 입니다 — 연속 번호가 아닙니다).

b = pcbnew.LoadBoard("io16.kicad_pcb")
b.SetCopperLayerCount(4)
pcbnew.SaveBoard("io16.kicad_pcb", b)

그리고 층별 방향을 4층에 맞게 다시 넣었습니다. 4부에서 상면=가로 / 하면=세로를 DSN 에 주입했는데, 층 이름을 2층 기준으로 하드코딩해 뒀던 터라 내층에는 방향이 안 들어가고 있었습니다. 보드에서 층 이름을 읽어 번갈아 넣도록 고쳤습니다.

방향
F.Cu가로
In1.Cu세로
In2.Cu가로
B.Cu세로

(In1.Cu 의 점은 정규식 특수문자입니다. escape 를 빼먹으면 조용히 안 맞습니다.)

배운 것 — 품질 지표와 배선 품질은 다르다

이번 회차에서 가장 값비싼 교훈은 이겁니다.

품질 지표를 고치는 것과 물건을 좋게 만드는 것을 혼동하지 말 것.

직각 개수, 각도 분포, 선폭 균일도는 전부 필요조건입니다. 다 만족해도 배선이 나쁠 수 있습니다. 그리고 그 필요조건들이 자꾸 안 채워진다면, 그건 후처리가 부족한 게 아니라 애초에 그 공간에서 불가능하다는 신호일 수 있습니다.

숫자가 잘 안 올라갈 때 후처리 도구를 하나 더 만들기 전에, “이 판이 이 회로를 담을 수 있는 판이 맞나”를 먼저 물었어야 했습니다.

규칙 위반 개수가 줄어드는 것과 배선이 좋아지는 것은 다른 일이고, 필요조건이 계속 안 채워지면 그건 층이 모자란다는 신호입니다.


▶️ 7부 — 마지막 1건과의 전쟁: 자동화가 제일 어려운 곳은 끝이다 — 마감 직전 이슈 총정리

🔧 이전 편: 1부 · 2부 · 3부 · 4부 · 5부 — 측정이 대상을 바꾸고 있었다

문의