circuit.yaml 포맷
한 줄 요약 — 회로를 텍스트로 적습니다. 사람이 읽고 쓸 수 있으면서, 검증·시뮬레이션·EasyEDA 내보내기가 모두 이 파일 하나에서 나옵니다.
왜 텍스트인가
| 이점 | 설명 |
|---|---|
| 버전 관리 | git diff로 변경 추적 |
| 검증 자동화 | 규칙 엔진이 읽을 수 있음 |
| 시뮬레이션 | SPICE 넷리스트(netlist)로 변환 |
| EasyEDA 내보내기 | JSON 생성 |
| 채팅으로 생성 | LLM이 쓰기 쉬움 |
| 재현성 | 같은 파일 = 같은 회로 |
회로의 본질은 넷리스트(연결 관계)입니다 (0-04). 그것을 가장 직접적으로 표현한 것이 이 포맷입니다.
기본 구조
# yaml-language-server: $schema=../../schema/circuit.schema.json
meta:
name: 부하가 걸린 분압기
lesson: docs/01-dc-basics/04-voltage-divider.md
note: RL을 바꿔가며 출력이 어떻게 무너지는지 본다
components:
- {ref: V1, type: vdc, value: 5}
- {ref: R1, type: r, value: 10k, params: {power_rating: 0.25}}
- {ref: R2, type: r, value: 10k, params: {power_rating: 0.25}}
- {ref: RL, type: r, value: 10k, label: 부하}
nets:
VIN: [V1.p, R1.1]
OUT: [R1.2, R2.1, RL.1]
GND: [V1.n, R2.2, RL.2]
analyses:
- {type: op}
expect:
- {measure: v, node: OUT, value: 1.667, tol: 1%}
- {measure: p, of: R1, max: 0.25}섹션별 설명
meta
| 필드 | 설명 |
|---|---|
name | 회로 이름 (한국어 가능) |
lesson | 관련 학습 문서 경로 |
note | 설명 |
components
| 필드 | 설명 |
|---|---|
ref | 참조 지정자 (R1, C2, U1) — 중복 불가 |
type | 부품 타입 (아래 표) |
value | 값 (10k, 4k7, 100n, 1MEG) |
model | 반도체 모델명 (2N3904, 1N4148) |
params | 부품별 추가 파라미터 |
label | 한국어 설명 |
nets
nets:
넷이름: [부품.핀, 부품.핀, ...]GND는 예약어 — SPICE의 노드 0- 넷 이름은 ASCII (
^[A-Za-z_][A-Za-z0-9_+.-]*$) - 한국어는
label과meta에만
analyses
| 타입 | 파라미터 |
|---|---|
op | (없음) — DC 동작점(operating point)동작점 operating point신호가 없을 때 트랜지스터가 앉아 있는 전압·전류 자리로, 여기가 어긋나면 증폭이 잘려 나갑니다.자세히 보기 → |
dc | source, start, stop, step |
tran | tstep, tstop, tstart, uic |
ac | sweep(dec/lin), points, fstart, fstop |
noise | out, source, sweep, points, fstart, fstop |
expect — 측정 검증
| 형태 | 예 |
|---|---|
| DC 노드 전압 | {measure: v, node: OUT, value: 2.5, tol: 1%} |
| 소자 전류 | {measure: i, through: R1, value: 250u, tol: 2%} |
| 전력 상한 | {measure: p, of: R1, max: 0.25} |
| 과도응답(transient response)과도응답 transient response입력이 갑자기 바뀐 뒤 출력이 자리를 잡기까지의 움직임으로, 정상상태 해석으로는 안 보입니다.자세히 보기 → 특정 시각 | {measure: v, node: OUT, at: 1m, analysis: tran, value: 3.16, tol: 3%} |
| AC 이득 | {measure: gain_db, node: OUT, at: 1k, analysis: ac, value: -3, tol: 0.5} |
tol: "1%"(상대) 또는 숫자(절대). min/max만 줘도 됩니다.
💡
expect가 “측정이 잘 되는지”를 자동 검증하는 지점입니다. 손계산 → 시뮬레이션 → EasyEDA가 같은 값을 내는지 확인합니다.
부품 타입
| type | 핀 | SPICE |
|---|---|---|
r | 1, 2 | R |
c | 1, 2 | C |
c_pol | +, - | C (극성 검사) |
l | 1, 2 | L |
vdc | p, n | V … DC |
vac | p, n | V … AC |
vsin | p, n | V … SIN |
vpulse | p, n | V … PULSE |
idc / iac / ipulse | p, n | I |
d | a, k | D |
led | a, k | D (전류제한 검사) |
zener | a, k | D |
q_npn / q_pnp | c, b, e | Q |
m_nmos / m_pmos | d, g, s | M |
opamp | in+, in-, out, v+, v- | X (subckt) |
sw | 1, 2, cp, cn | S |
k (결합(coupling)) | — | K |
부품 목록(BOM) 조회:
circuit parts # 사람용
circuit parts --json # 도구·스킬용기생 성분 표현
11~13장과 16장의 예제는 기생 성분(parasitic)기생 성분 parasitics부품과 배선이 표기값 말고 원치 않게 함께 갖는 저항·용량·인덕턴스로, 고주파에서 회로의 성질을 바꿔 놓습니다.자세히 보기 →을 명시합니다 (11-07).
방법 1 — 파라미터
components:
- {ref: C1, type: c, value: 100n, params: {esr: 0.02, esl: 0.5n}}
- {ref: R1, type: r, value: 1MEG, params: {cp: 0.2p}}방법 2 — 명시적 등가회로 (권장)
components:
- {ref: C1, type: c, value: 100n}
- {ref: RC1, type: r, value: 0.02, label: ESR}
- {ref: LC1, type: l, value: 0.5n, label: ESL}
nets:
RAIL: [LC1.1]
N1: [LC1.2, RC1.1]
N2: [RC1.2, C1.1]
GND: [C1.2]무엇을 모델링했는지 명확하고, 어떤 시뮬레이터에서도 동작합니다.
★ ideal / real 쌍
examples/11-parasitics/electrode-buffer-ideal.yaml # 기생 없음
examples/11-parasitics/electrode-buffer-real.yaml # 기생 포함두 시뮬레이션을 비교하면 기생 성분의 영향을 파형으로 볼 수 있습니다.
값 표기
| 표기 | 의미 |
|---|---|
4k7 | 4.7 kΩ |
10k | 10 kΩ |
1MEG 또는 1M | 1 MΩ |
100n | 100 nF |
4u7 | 4.7 µF |
2R2 | 2.2 Ω |
1e-6 | 지수 표기 |
⚠️ SPICE에서
1M은 밀리(0.001)입니다 (0-03). 이 포맷은 공학 관례(1M= 메가) 를 따르고, SPICE로 변환할 때1MEG으로 바꿔줍니다. 이 함정에 빠지지 않습니다.
스키마와 에디터 지원
파일 첫 줄에 스키마를 지정하면 VS Code 등에서 자동완성과 검증이 됩니다.
# yaml-language-server: $schema=../../schema/circuit.schema.jsonschema/circuit.schema.json은 도구가 자동 생성하고 저장소에 커밋됩니다.
⚖️ 포맷 설계 트레이드오프
| 선택 | ✅ | ⚠️ |
|---|---|---|
| YAML | 사람이 읽고 쓰기 쉬움, 주석 가능 | 들여쓰기 민감 |
| JSON | 도구 친화 | 주석 없음, 장황 |
| SPICE 넷리스트 직접 | 시뮬레이터 직결 | 검증·EasyEDA에 정보 부족, 가독성 |
| 회로도 파일 | 시각적 | 텍스트 diff 불가, 도구 종속 |
| 넷 중심 표기 | 연결이 명확, 검증 쉬움 | 회로도로 시각화 필요 |
| 부품 중심 표기 | 부품 정보 집중 | 연결 파악 어려움 |
🔌 이 포맷에서 나오는 것들
circuit.yaml 하나에서 다섯 가지가 나옵니다.
| 명령 | 나오는 것 | 문서 |
|---|---|---|
circuit check | ERC 검증 결과 | 02 |
circuit sim / test | ngspice 측정값 | 03 |
circuit export | EasyEDA JSON | 04 |
circuit preview | SVG 회로도 | — |
circuit explain | 한국어 설명 | — |
하나의 파일에서 전부 나옵니다.
연습문제
문제 1. 다음 회로를 circuit.yaml로 쓰세요: 9 V 전원, 1 kΩ과 2 kΩ 직렬, 중간점이 출력.
exercises/17-01-divider-yaml.yaml풀이
meta:
name: 9V 분압기
components:
- {ref: V1, type: vdc, value: 9}
- {ref: R1, type: r, value: 1k}
- {ref: R2, type: r, value: 2k}
nets:
VIN: [V1.p, R1.1]
OUT: [R1.2, R2.1]
GND: [V1.n, R2.2]
analyses:
- {type: op}
expect:
- {measure: v, node: OUT, value: 6.0, tol: 1%}V
문제 2. 이 포맷에서 GND가 예약어인 이유는?
exercises/17-01-ground-reference.yaml풀이
SPICE에서 노드 0이 접지이고, 모든 회로는 접지 기준이 있어야 풀립니다.
GND 넷을 자동으로 노드 0에 매핑하면:
- 사용자가 매번 지정할 필요 없음
- 접지 없는 회로를 검증 단계에서 잡을 수 있음 (
E201) - EasyEDA 내보내기에서 접지 심볼로 변환
⚠️ 접지가 없으면 SPICE가 singular matrix 오류를 냅니다 (2-02). 검증기가 시뮬레이션 전에 잡아줍니다.
다음 → 02 검증 (ERC)