"검증한 줄 알았던 것들" — 리뷰 한 번에 무너진 자동화

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

한 문장 요약

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


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

첫 지적은 이거였다. “왜 IC에 다리가 없냐고.”

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

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

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

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

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

두 번째 지적이 뼈아팠다. “기존 회로를 참조하라고. 니 맘대로 그리지 말고. 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%  ← 배선이 없는 축으로 뻗는가

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

방향 규칙도 두 번 틀렸다. “가까운 심볼의 반대쪽”은 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
릴레이 포어접점(로드)측만 컷, 코일·전원측 복원

남은 것

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

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

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

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


▶️ 8부까지가 시리즈 본편 — 이 글은 그 뒤 실물 도면 리뷰에서 나온 후속편입니다.

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

댓글

로그인 없이 이름만 적고 남기실 수 있어요. 남긴 댓글은 바로 게시됩니다.

댓글을 불러오는 중…