# ADR-0006: 토폴로지 컴파일, 거리 추출, 그리고 자동 다이어그램 생성

## Status

Accepted

## Context

시뮬레이터는 토폴로지 설정(예: topology.yaml)을 명시적인 모델 그래프로 컴파일하고,
라우팅 및 누적 레이턴시(거리)를 계산한다.
정합성을 보장하고 수작업으로 유지되는 토폴로지 도면을 피하기 위해,
다이어그램은 이 권위 있는 산출물로부터 생성되어야 한다.

또한 사용성을 위해, 다이어그램은 안정적인 위치로 자동 방출되어
개발자가 저장소 내에서 즉시 미리볼 수 있어야 한다.

---

## Decision

### D1. 토폴로지 컴파일은 유일한 진실 공급원이다

- topology.yaml(또는 동등한 설정)은 다음으로 컴파일된다:
  - 명시적인 시스템 그래프,
  - 노드/링크 속성,
  - 라우팅 정책.
이 컴파일된 그래프가 시스템의 권위 있는 표현이다.

### D2. 컴파일 중 거리 추출

- 토폴로지 컴파일 중 또는 그 직후, 시뮬레이터는 ADR-0002와 정합되는
  거리 메타데이터(누적 레이턴시)를 계산해야 한다.
- 거리 메타데이터는 ADR-0005에서 정의한 거리 기반 다이어그램 레이아웃을 지원하기에 충분해야 한다.
- 분산된 패브릭 세그먼트(예: NoC)는 ADR-0002 D4에 따라 distance_mm = 0을 가질 수 있다.
  이러한 노드의 레이아웃 배치는 거리 버킷이 아닌 명시적 위치 메타데이터를 사용한다.

### D3. 다이어그램 생성은 파생 산출물이다

- 다이어그램은 다음으로부터 생성되어야 한다:
  - 컴파일된 토폴로지 그래프,
  - 추출된 거리 메타데이터,
  - ADR-0005에 정의된 뷰/레이아웃 규칙.
- 다이어그램 생성은 추가적인 수작업 토폴로지 기술을 요구해서는 안 된다.

### D4. 저장소로의 자동 다이어그램 방출

- 토폴로지 컴파일의 일부로서, 구현은 기본적으로 다음 다이어그램을 생성해야 한다:
  - SIP 수준 다이어그램 (대표, 거리 인식)
  - CUBE 수준 다이어그램 (대표, 거리 인식)
  - PE 수준 다이어그램 (대표, 거리 인식)
- 기본 출력 디렉터리는 다음과 같다:
  - `docs/diagrams/`
- 생성기는 컴파일된 토폴로지(또는 다이어그램 규칙)가 변경되었을 때에만 덮어쓰기/업데이트해야 한다.

### D5. 뷰별 투영 및 레이아웃

각 뷰(SIP / CUBE / PE)에 대해:

- 생성기는 컴파일된 그래프를 축소된 뷰 그래프로 투영해야 한다:
  - ADR-0005에 따라 노드를 숨기거나 축약하고,
  - 해당 뷰와 관련된 연결성 의미를 보존하고,
  - 거리 버킷을 계산하여 레이아웃 레이어를 결정론적으로 할당한다.
- CUBE 수준 투영은 다음을 포함해야 한다:
  - 라우터 메시 (cube_mesh.yaml로부터), HBM_CTRL, 공유 SRAM, M_CPU, UCIe 포트,
    그리고 불투명 블록으로 표현된 PE.
  - 모든 경로(HBM, 비-HBM, 명령)는 동일한 라우터 메시를 통해 라우팅된다 (ADR-0017).
- 기본 앵커는 암묵적이며 (ADR-0005) 인스턴스 인덱스를 요구해서는 안 된다.

### D6. 출력 포맷과 결정론

- 생성기는 다음 중 최소 하나를 출력해야 한다:
  - Mermaid (Markdown 네이티브)
  - Graphviz DOT (rank 기반 제어)
  - SVG (mm 단위 정확도 레이아웃, 외부 의존성 없음)
- 컴파일된 토폴로지로부터 mm 단위 정확도의 위치 메타데이터가 가용한 경우 SVG가 선호된다.
- 출력은 결정론적이어야 한다:
  - 동일한 토폴로지 + 동일한 규칙 → 동일한 다이어그램 텍스트
- 파일 이름은 결정론적이고 안정적이어야 한다 (아래의 "출력 컨벤션" 참조).

### D7. 성능 및 캐싱

- 다이어그램 생성은 지연(lazy) 및/또는 캐시될 수 있으며, `docs/diagrams/`의 출력이
  컴파일된 토폴로지와 정합을 유지하는 한 그렇다.
- 구현은 다음을 기반으로 한 캐시 키를 사용해야 한다(SHOULD):
  - 토폴로지 콘텐츠 해시,
  - 라우팅 정책 버전,
  - 다이어그램 규칙 버전,
  - 뷰 유형 (SIP/CUBE/PE).

---

## 출력 컨벤션

### 디렉터리

- `docs/diagrams/`는 생성된 다이어그램의 표준 출력 디렉터리이다.

### 파일 이름 (권장, 결정론적)

- `system_view.svg` / `system_view.mmd` / `system_view.dot`
- `sip_view.svg` / `sip_view.mmd` / `sip_view.dot`
- `cube_view.svg` / `cube_view.mmd` / `cube_view.dot`
- `pe_view.svg` / `pe_view.mmd` / `pe_view.dot`

선택적으로, 멀티 토폴로지 워크플로우용:

- `sip_view__{topology_id}.svg`
- `cube_view__{topology_id}.svg`
- `pe_view__{topology_id}.svg`

### 저장소 정책

- 생성된 다이어그램 파일은 diff 기반 리뷰가 가능하도록 저장소에 커밋될 수 있다.
- 커밋된 경우, 이는 토폴로지 컴파일로부터 재현 가능해야 한다.

---

## Consequences

- 다이어그램은 항상 시뮬레이터 동작과 정합한다.
- 아키텍처 변경이 시각화에 자동으로 전파된다.
- 다이어그램 diff는 아키텍처 변경의 의미 있는 지표가 된다.

---

## Links

- SPEC Section 4 (Output, Debuggability, and Diagrams)
- ADR-0002 (거리 의미)
- ADR-0005 (다이어그램 뷰 및 레이아웃 규칙)
