8부에서 io16 4층 보드를 “완성”했다고 썼습니다. 그 뒤 실물 도면을 한 장씩 확대해 들여다보는 리뷰가 시작됐고, 거기서 자동화의 진짜 구멍이 드러났습니다. 이번 편은 성공담이 아니라, 통과했다고 믿었던 게 왜 통과가 아니었는지에 대한 기록입니다.

한 문장 요약

제가 잰 지표가 통과했다는 것은, 제가 안 잰 항목이 맞다는 증거가 전혀 아닙니다.


1. “다리 없는 IC” — 심볼이 그림만 있고 핀이 없었다

KiCad 심볼의 핀에 대한 첫 지적은 이거였습니다. “왜 IC에 다리가 없냐고.”

PADS 데칼에서 변환된 심볼은 핀 length가 전부 0이었습니다. 다리처럼 보이던 선은 데칼의 사선 리드 그래픽이었고, 부챗살처럼 보이던 것도 같은 원인이었습니다. ERC는 이걸 잡지 않습니다 — 연결은 정상이니까요.

고친 방식은 데칼 그래픽을 지우고 실제 KiCad 핀을 만드는 것:

  • 핀에 닿는 폴리라인(리드)과 핀 bbox 밖 장식 아트 제거
  • 몸통 사각을 핀에서 3.81mm(상하 2.54mm) 물러난 표준 인셋으로 새로 주입
  • 핀 각도 = 몸통 방향, 길이 = 몸통까지 실거리

다리가 보이자 부수 효과가 하나 생겼습니다. 미접속 핀 끝의 O 마커가 눈에 들어옵니다. 연결 여부를 도면에서 바로 확인할 수 있게 된 것입니다.

수리한 심볼로 다시 그린 입력부 회로도

고치고 난 입력부입니다. IC와 포토커플러에 다리가 붙어 있고, 핀 번호와 이름이 몸통 밖으로 나와 있습니다. 채널 8개가 같은 모양으로 반복되는 것도 이 상태라야 눈으로 확인됩니다 — 다리가 없을 때는 이 그림이 그냥 사각형 줄이었습니다.

한 가지 함정: 다리 방향을 “핀들의 중심점 쪽”으로 잡으면 16핀 IC에서 전 핀이 비스듬해져 부챗살이 됩니다. 축 4방향 중 몸통에 먼저 닿는 축으로 잡아야 합니다.

2. PADS 원본을 두고 내 마음대로 그리고 있었다

PADS LOGIC 원본 도면을 두고 그린 것이 두 번째 지적이었고, 뼈아팠습니다. “기존 회로를 참조하라고. 니 맘대로 그리지 말고. PADS 회로가 있는데 왜 그래도 못 그리는데.”

맞는 말이었습니다. PADS LOGIC 설계 export에는 심볼 기하(CAEDECAL) · 부품 배치(PART) · 배선 좌표(CONNECTION) · 정션(TIEDOTS) · 오프페이지 위치(OFFPAGE REFS) 가 전부 들어 있습니다. 원 설계자의 도면을 그대로 옮길 수 있는데, 저는 그걸 두고 제 배치 알고리즘으로 새로 그리고 있었습니다. 그것도 이미 만들어 둔 이식기(logic2sch.py)를 덮어쓰면서.

원본 이식본으로 되돌리자 회로도는 사람이 그린 도면이 됐습니다. 남은 일은 “새로 그리기”가 아니라 KiCad 렌더 차이에서 오는 결함만 보정하는 것이었습니다.

3. 라벨(offpage) — 같은 실수를 다섯 번 반복한 이유

오프페이지 라벨 배치가 가장 오래 끈 문제입니다. 라벨이 심볼을 덮고, 세로로 눕고, 방향이 반대로 붙었습니다. 매번 눈으로 찾아 고치고 “정리 완료”라고 보고했습니다. 그리고 다음 확대 스크린샷에서 또 나왔습니다. 원인은 단순했습니다 — 측정 항목이 하나뿐이었습니다.

라벨 배치는 최소 네 가지를 동시에 재야 합니다.

게이트 1  라벨 vs 심볼 몸통 겹침   = 0
게이트 2  라벨 vs 라벨 겹침        = 0
게이트 3  세로(90/270) 글로벌 라벨 = 0     ← 전원 라벨이 옆으로 눕는다
게이트 4  방향 준수                = 100%  ← 배선이 없는 축으로 뻗는가

측정 모델을 틀리면 게이트가 통째로 무력화된다는 것도 배웠습니다.

  • 글로벌 라벨 상자 높이를 ±1.3으로 잡으면, 100mil 피치(2.54mm) 이웃이 항상 0.06mm 겹친 것으로 계산돼 교정이 영원히 막힙니다. 실측값은 ±1.15.
  • 로컬 라벨은 justify left bottom — 글자가 앵커 위쪽에 그려집니다. 중앙 정렬로 모델링하면 심볼 위 겹침을 한 건도 못 잡습니다.

방향 규칙도 두 번 틀렸습니다. “가까운 심볼의 반대쪽”은 2열 커넥터에서 뒤집히고, “배선 합산의 반대쪽”은 T 분기점에서 배선을 타고 눕습니다. 정답은 각 배선 방향을 축으로 양자화해 비어 있는 축을 고르는 것이었습니다.

4. 조용히 실패하는 정규식 치환 편집

릴레이 구리 포어를 “로드측만 남기고 전원측은 복원”하라는 요청을 받고 수정했습니다. DRC를 돌려 통과를 확인하고 완료 보고를 했습니다. 그런데 실제 파일은 그대로였습니다.

KiCad 10은 존 폴리곤을 (xy a b) (xy c d)처럼 한 줄에 여러 개 씁니다. 제 치환 정규식은 “한 줄에 하나”를 가정했고, 매칭이 0인데도 파일은 재기록돼서 성공한 것처럼 보였습니다. DRC는 당연히 통과합니다 — 아무것도 안 바꿨으니까요.

교훈은 두 개입니다. 괄호 짝으로 블록을 잘라 교체할 것, 그리고 쓴 뒤 다시 읽어 목표 값을 확인할 것.

5. 그리고 각도 — DRC가 절대 안 잡는 것

배선 각도에 대한 마지막 지적이 제일 아팠습니다. “누가 PCB 라우팅하는데 이렇게 선을 대각선으로 그리지? 직각 만들지 말라고 처음부터 말했는데.”

배선 단순화 패스를 만들면서 후보 경로에 임의각 직선L(직각) 경로를 넣었습니다. DRC는 단락·미연결·클리어런스만 봅니다. 각도는 보지 않습니다. 그래서 통과했습니다.

측정 게이트를 만들고 나서야 숫자가 보였습니다.

세그먼트 1023 : H/V 586 · 45° 429 · 임의각 8 · 직각 코너 85

직각 85개는 오토라우터 탓이 아니었습니다. Freerouting은 기본이 45°입니다. 제가 나중에 돌린 마감 패스들(전원 트렁크 어깨, 비아 스티칭, L 후보)이 만든 것이었습니다.

후보에서 임의각·직각을 빼고 다시 돌린 뒤, 직각 코너를 45° 모따기로 깎는 패스를 만들어 반복했습니다. 임의각 8→4, 직각 85→57까지 줄었습니다. 거기서 멈췄습니다 — 현재 배선 밀도에서 더 깎으면 클리어런스 위반이 나고, 게이트가 자동 원복시킵니다. 사후 수정의 한계입니다. 근본 해법은 45°를 처음부터 강제한 재배선입니다.

리뷰를 반영한 결과

항목
회로도 ERC / 넷리스트에러 0 / intent 완전 일치
라벨·텍스트 겹침몸통 0 · 라벨끼리 0 · 텍스트 0
라벨 방향 준수197/201
보드 DRC에러 2 · 미연결 0 · 단락 0
보드 각도H/V 591 · 45° 468 · 임의각 4 · 직각 57
배선 단순화지그재그 사슬 62곳 정리, 세그먼트 −102
릴레이 포어접점(로드)측만 컷, 코일·전원측 복원

남은 것 — 45° 강제 재배선

  1. 45° 강제 재배선 — 직각 57개를 0으로 만드는 유일한 길
  2. 클리어런스 2건(13µm·7µm) — 입력부 배치 행간 +0.3mm로 근본 해소
  3. 라벨 방향 4건 — 배선은 왼쪽, 라벨은 오른쪽인데 오른쪽이 LED 몸통이고 반대편 핀이 막아 스터브도 못 뺍니다. 겹침 없음을 우선해 둔 상태

이번 편에서 얻은 규칙 (스킬에 성문화)

“고쳤다”고 말하기 전에 그 항목 자체를 측정합니다. 다른 지표의 통과는 증거가 아닙니다.

  • DRC는 각도를 보지 않습니다 → 각도 게이트를 따로 돌립니다
  • 치환은 조용히 실패합니다 → 쓴 뒤 다시 읽어 확인합니다
  • 파이프라인 마지막 스크립트 뒤에 전 지표를 다시 잽니다 (앞 단계 통과는 무의미)
  • 마감 패스에 직각·임의각 후보를 넣지 않습니다
  • 스크립트가 “0건 처리”를 보고하면 성공이 아니라 의심 신호입니다 (조건이 과해 아무것도 안 한 경우가 대부분이었습니다)

자동화의 품질은 생성기의 똑똑함이 아니라 게이트의 촘촘함에서 나옵니다. 이번 편은 그걸 다섯 번 얻어맞고 배운 기록입니다.

“고쳤다”고 말하기 전에 그 항목 자체를 측정해야 하고, 자동화의 품질은 게이트의 촘촘함에서 나옵니다.


▶️ 10부 — “안 된다”고 말하기 전에: 새 보드에서 미연결이 남았습니다. 세 번 “불가능”이라고 결론 냈고 세 번 다 도구가 통로를 못 본 것이었습니다.

🔧 8부까지가 시리즈 본편이고, 이 글부터는 그 뒤 리뷰에서 나온 후속편입니다.

🔧 시리즈 전체: 1부 · 2부 · 3부 · 4부 · 5부 · 6부 · 7부 · 8부 — 완성

문의