---
title: "작은 회로 수정의 영향이 수정한 셀에서 끝나지 않는 이유"
author: "브레이브브라우저쓰자"
published_at: "2026-10-25T03:26:04.815Z"
updated_at: "2026-10-06T02:15:46.293Z"
tags: ["incremental eco"]
canonical_url: "https://ariser.io/@writer_a9817d5a8de0/%EC%9E%91%EC%9D%80-%ED%9A%8C%EB%A1%9C-%EC%88%98%EC%A0%95%EC%9D%98-%EC%98%81%ED%96%A5%EC%9D%B4-%EC%88%98%EC%A0%95%ED%95%9C-%EC%85%80%EC%97%90%EC%84%9C-%EB%81%9D%EB%82%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EC%9D%B4%EC%9C%A0"
ai_assisted: true
---

# 작은 회로 수정의 영향이 수정한 셀에서 끝나지 않는 이유

이 글은 AI가 활용됐습니다.

[원문](https://ariser.io/@writer_a9817d5a8de0/%EC%9E%91%EC%9D%80-%ED%9A%8C%EB%A1%9C-%EC%88%98%EC%A0%95%EC%9D%98-%EC%98%81%ED%96%A5%EC%9D%B4-%EC%88%98%EC%A0%95%ED%95%9C-%EC%85%80%EC%97%90%EC%84%9C-%EB%81%9D%EB%82%98%EC%A7%80-%EC%95%8A%EB%8A%94-%EC%9D%B4%EC%9C%A0)

작은 타이밍 위반 하나를 고치려고 모든 셀과 배선을 처음부터 다시 정리하면, 이미 괜찮던 수많은 경로도 바뀔 수 있다. Incremental ECO는 기존 결과를 활용하면서 필요한 회로 변경과 그 영향 부분을 갱신하는 접근이다. 빨리 끝나는 수정이 되려면 무엇을 바꾸고 무엇을 다시 분석할지의 경계를 정확히 잡아야 한다.

## 수정한 셀 하나와 영향받는 경로는 같지 않다

가상 회로에서 드라이버 A의 출력이 B와 C의 입력으로 분기한다고 하자. C 뒤 경로가 느려 C를 더 강한 셀로 교체했다. C의 출력 구동은 좋아지지만 입력 정전용량이 2fF에서 8fF로 늘었다고 가정한다. A는 두 분기를 함께 구동하므로 C의 입력 변화는 B로 가는 경로에도 영향을 줄 수 있다.

설명용 선형 근사에서 A의 지연이 입력 부하 1fF당 1ps 늘어난다고 정의하자. 추가 6fF는 A의 지연을 6ps 늘린다. B의 데이터 도착이 원래 95ps이고 setup 요구 시간이 100ps였다면, 교체 후 도착은 101ps가 되어 slack은 +5에서 −1ps로 바뀐다. C 뒤 경로는 개선되었어도 B에서 새 위반이 생길 수 있다.

이 계산은 특정 라이브러리의 특성값이 아니라 부하 민감도를 정한 가상 예제다. 실제 지연은 입력 slew, 출력 부하와 코너별 표를 사용해 계산해야 한다. 그럼에도 변경한 셀의 출력 경로만 재검사하면 부족할 수 있다는 의존 관계는 분명하다. 논리 연결이 그대로인 셀 교체도 입력 부하와 물리 크기를 바꾼다.

## 버퍼 한 개는 연결 목록도 바꾼다

이번에는 C 분기에 버퍼를 넣는다고 하자. 원래 net N의 연결은 `A/Z → B/A, C/A`다. 삽입 뒤에는 N이 `A/Z → B/A, BUF/A`를 연결하고, 새 net N2가 `BUF/Z → C/A`를 연결한다. 기존 N의 부하 집합이 바뀌고 N2가 생겼다. 변경 셀 이름을 하나 추가하는 것만으로 데이터가 갱신된 것은 아니다.

실제 위치를 정하면 BUF를 합법적인 사이트에 놓아야 하고 관련 배선의 경로와 기생 성분도 달라진다. 이전 N의 배선에 C가 계속 붙어 있는 상태를 새 회로의 결과로 사용하면 논리 연결과 물리 연결이 어긋난다. 변경 전후의 net·핀 집합을 비교하면 어떤 결과를 갱신해야 하는지 구체적으로 알 수 있다.

OpenROAD global routing은 incremental 시작 시 변경 net을 추적할 listener를 초기화하고, 종료 시 변경된 net을 반영해 routing하는 옵션을 설명한다. 수정 이후에 추적을 시작하면 그전에 일어난 변경을 같은 방식으로 잡았다고 가정할 수 없다. 도구가 제공하는 변경 감지 범위와 사용 순서를 따라야 한다. [global_route의 incremental 옵션](https://openroad.readthedocs.io/en/latest/main/src/grt/README.html#global-route)

## 국소 갱신과 전체 조건 검증을 구분한다

기존의 좋은 배선을 유지하면서 변경 net만 다시 연결하면 많은 경우 계산량을 줄일 수 있다. 하지만 새 경로는 주변 net과 같은 자원을 사용한다. 변경하지 않은 연결의 형상과 간격, 여유 공간에도 영향을 줄 수 있다. 어떤 경로를 다시 만들지의 범위와 어떤 조건을 다시 확인할지의 범위는 반드시 같을 필요가 없다.

타이밍도 마찬가지다. 의존 관계를 정확히 추적하는 incremental 분석은 영향을 받지 않은 값을 재사용할 수 있다. 그 결과가 전체 조건을 만족한다고 결론 내려면 사용한 코너·모드와 예외, clock 관계까지 일관되어야 한다. “수정한 경로에서 위반이 사라졌다”와 “전체 설계에 위반이 없다”는 서로 다른 주장이다.

OpenROAD의 global placement는 기존 배치에서 시작하는 incremental 모드를 제공하지만, 이미 배치한 상태에 맞춰 파라미터를 조정할 필요도 설명한다. ECO라는 이름만으로 어느 위치나 경로가 무조건 동결된다고 가정하지 않는다. 실제 명령이 보존하는 범위와 움직일 수 있는 대상을 확인해야 한다. [Global Placement의 incremental 모드](https://openroad.readthedocs.io/en/latest/main/src/gpl/README.html#global-placement)

## 기존 결과를 보존하는 데에도 비용이 있다

가상 배치에서 새 버퍼를 넣을 수 있는 가장 가까운 빈 사이트가 중요한 net의 통로에 붙어 있다고 하자. 국소 수정만 허용하면 그 자리에 넣고 배선을 우회시켜야 할 수 있다. 주변 셀 몇 개를 함께 이동하면 더 짧은 연결이 가능해질 수도 있다. 기존 결과를 보존하는 목표가 새로운 전체 최적해를 찾는 목표와 어긋날 수 있는 경우다.

그렇다고 매번 전면 수정할 필요는 없다. 변경이 작고 국소적인 후보가 제약을 만족하면 보존의 이점이 크다. 반대로 새 위반이 반복해서 주변으로 이동한다면 수정 범위를 넓힐 이유가 생긴다. 넓혀야 하는 근거는 ECO라는 방식의 이름보다, 남은 병목과 의존 경로다.

변경 전 상태를 보관하고 셀·핀 연결·위치의 차이를 기록하면 수정은 검토 가능해진다. 변경 이후에는 연결성, 배치와 배선 규칙, 관련 부하와 타이밍이 같은 설계를 가리키는지 확인한다. OpenROAD의 타이밍 repair 설명도 setup·hold와 다른 위반 목적지들을 다루므로 특정 수정 경로 하나의 개선으로 검증을 끝내지 않는다. [OpenROAD Repair Timing](https://openroad.readthedocs.io/en/latest/main/src/rsz/README.html#repair-timing)

Incremental ECO의 장점은 필요한 결과를 다시 계산하면서 기존 작업을 활용하는 데 있다. 그 장점을 지키는 조건은 변경량을 작게 주장하는 것이 아니라 실제 영향 범위를 빠짐없이 추적하는 것이다. 수정한 셀에서 시작해 연결·부하·위치와 경로의 의존 관계를 따라가면, 작은 수정이 전체 설계를 어디까지 바꾸었는지 설명할 수 있다.

