circuit.yaml 포맷 명세 (v0.1)

이 문서는 규범(normative) 명세입니다. 튜토리얼은 docs/17-workflow/01-circuit-format.md를 보세요.

examples/ 아래 102개 회로가 전부 이 명세를 따릅니다. 명세와 예제가 어긋나면 명세가 아니라 둘 중 하나가 버그입니다.

요구 수준 표기 — MUST(반드시) / SHOULD(권장) / MAY(선택)


1. 파일

항목규칙
인코딩UTF-8 (BOM 없음)
확장자.yaml
YAML 버전1.2 안전 서브셋 (yaml.safe_load 가능)
최상위매핑(mapping) 1개 MUST
첫 줄스키마 주석 SHOULD
# yaml-language-server: $schema=../../schema/circuit.schema.json

../../의 깊이는 파일 위치에 맞춥니다(examples/<장>/<이름>.yaml이면 ../../).


2. 최상위 키

키필수타입설명
metaMUST매핑회로 식별 정보
componentsMUST배열부품 목록 (1개 이상)
netsMUST매핑연결 관계
analysesMUST배열해석 목록 (1개 이상)
expectMAY배열기대 측정값

정의되지 않은 최상위 키는 에러입니다(오타를 잡기 위해 additionalProperties: false).


3. meta

키필수설명
nameMUST회로 이름. 한국어 MAY
lessonSHOULD관련 문서의 저장소 루트 기준 경로. 예: docs/01-dc-basics/04-voltage-divider.md
noteMAY자유 서술. 여러 줄이면 | 블록

lesson은 링크 체커가 검사합니다. 존재하지 않는 경로면 테스트가 실패합니다. 커리큘럼과 예제가 따로 썩는 것을 막는 장치입니다.


4. components

각 원소는 매핑이며 다음 키만 허용합니다.

키필수설명
refMUST참조 지정자. ^[A-Z][A-Z0-9_]*$, 파일 내 유일 MUST
typeMUST§4.1의 타입 중 하나
value타입별주 값. §5의 값 표기
model타입별SPICE 모델/서브서킷 이름
paramsMAY타입별 추가 파라미터 (§4.2)
labelMAY한국어 설명. 전기적 의미 없음

ref의 접두 문자는 관례를 SHOULD 따릅니다: R(저항) C(커패시터) L(인덕터) D(다이오드) Q(BJT) M(MOSFET) U(IC) V(전압원) I(전류원) SW(스위치) K(결합).

4.1 부품 타입과 핀

핀 이름은 대소문자를 구분하며, 여기 적힌 것 외에는 에러입니다.

type핀valuemodelSPICE
r1, 2MUST—R
c1, 2MUST—C
c_pol+, -MUST—C (역극성 검사 대상)
l1, 2MUST—L
vdcp, nMUST—V ... DC
vacp, nMUST—V ... AC
vsinp, n——V ... SIN (params 필수)
vpulsep, n——V ... PULSE (params 필수)
idcp, nMUST—I ... DC
iacp, nMUST—I ... AC
ipulsep, n——I ... PULSE (params 필수)
da, k—MUSTD
leda, k—MUSTD (W301 검사 대상)
zenera, k—MUSTD
q_npnc, b, e—MUSTQ
q_pnpc, b, e—MUSTQ
m_nmosd, g, s—MUSTM
m_pmosd, g, s—MUSTM
opampin+, in-, out, v+, v-—MUSTX (subckt)
sw1, 2, cp, cn—MUSTS (전압제어 스위치)
k— (핀 없음)——K (params로 결합 지정)

⚠️ opamp의 v+/v-는 생략할 수 없습니다. 전원핀을 결선하지 않으면 SPICE에서 부유 노드가 되어 해가 안 나오거나 엉뚱한 값이 나옵니다. circuit check가 W306으로 잡습니다.

핀 이름에 +나 -가 들어가면 YAML에서 따옴표가 필요합니다:

nets:
  IN:  [RS.2, U1.'in+']     # ← 작은따옴표 MUST
  OUT: [U1.out, R2.2]       # ← 특수문자 없으면 불필요

4.2 params

파라미터대상 타입의미
power_ratingr정격 전력 [W] — E401 검사
if_maxled최대 순전류 [A] — E402 검사
vzzener항복 전압 [V]
v1, v2, td, tr, tf, pw, pervpulse시작/끝 전압, 지연, 상승, 하강, 폭, 주기
i1, i2, td, tr, tf, pw, peripulse위와 동일(전류)
offset, amp, freqvsin오프셋, 진폭, 주파수
esr, eslc등가 직렬 저항 [Ω] / 인덕턴스 [H]
cpr, l병렬 기생 용량 [F]
dcrlDC 저항 [Ω]
w, lm_nmos, m_pmos채널 폭 / 길이 [m]
l1, l2, kk결합할 두 인덕터의 ref와 결합 계수

기생 파라미터(esr/esl/cp/dcr)는 도구가 등가 회로로 전개합니다. 무엇이 모델링됐는지 명시하고 싶으면 11-07처럼 등가 회로를 직접 쓰는 편이 낫습니다(SHOULD).


5. 값 표기

value와 수치형 params는 문자열 또는 숫자입니다.

5.1 문법

<숫자>[<접두어>][<단위문자>]        예: 10k, 4.7u, 100n, 1MEG
<정수><접두어><소수부>              예: 4k7 = 4.7k, 2R2 = 2.2
<지수표기>                          예: 1e-6, 1.5E3

5.2 접두어

표기배수표기배수
f1e-15k / K1e3
p1e-12M1e6
n1e-9MEG1e6
u1e-6G1e9
m1e-3T1e12
R1 (소수점 자리 표시)

5.3 ★ M의 의미 — 이 포맷의 가장 중요한 규정

1M1m
circuit.yaml1e6 (메가)1e-3 (밀리)
SPICE1e-3 (밀리)1e-3 (밀리)

이 포맷은 공학 관례를 따르고, SPICE로 변환할 때 M → MEG로 바꿉니다.

⚠️ 대소문자 구분이 없는 SPICE에서 1M을 메가로 알고 썼다가 1000배 틀리는 것은 가장 흔한 사고 중 하나입니다(0-03). 이 포맷은 그 함정을 원천 차단합니다. 혼동이 걱정되면 1MEG을 쓰세요 — 양쪽에서 동일합니다.

단위 문자(Ω, F, H, V, A)는 쓰지 않습니다. 타입이 단위를 결정합니다.


6. nets

nets:
  <넷이름>: [<ref>.<핀>, <ref>.<핀>, ...]
규칙내용
넷 이름^[A-Za-z_][A-Za-z0-9_+.-]*$ MUST. ASCII만
한국어넷 이름에 사용 금지. label과 meta에만
원소 수넷당 2개 이상 SHOULD (1개면 E105 부유 넷)
중복같은 ref.핀이 두 넷에 나오면 E104
누락선언된 부품의 핀이 어느 넷에도 없으면 E103

6.1 예약 넷

이름의미
GNDSPICE 노드 0. 모든 회로에 MUST (없으면 E201)

VCC/VDD/VEE/VSS는 예약어가 아니지만, EasyEDA 내보내기에서 전원 플래그 심볼로 변환되므로 전원 레일에 SHOULD 사용합니다.


7. analyses

type필수 필드선택 필드SPICE
op——.op
dcsource, start, stop, step—.dc
trantstep, tstoptstart, uic.tran
acsweep, points, fstart, fstop—.ac
noiseout, source, sweep, points, fstart, fstop—.noise
  • sweep: dec | oct | lin
  • source: 전압/전류원의 ref
  • out: 넷 이름
  • 시간·주파수 값은 §5 표기 사용 (1n, 100MEG)

해석 1개당 ngspice 프로세스 1개를 띄웁니다. 여러 해석을 한 파일에 넣어도 서로 간섭하지 않습니다.


8. expect — 측정 검증

각 원소는 하나의 측정을 기술합니다. 이 블록이 “손계산 = 시뮬레이션 = EasyEDA”를 자동 확인하는 지점입니다.

8.1 공통 필드

필드필수설명
measureMUST§8.2의 측정 종류
analysis조건부대상 해석 타입. 생략 시 op
at조건부tran이면 시각[s], ac/noise면 주파수[Hz]
value셋 중 1개 이상 MUST기대값
min / max〃허용 범위
tolMAYvalue와 함께. "1%"(상대) 또는 절대값(0.05, 1u — §5 표기 가능)

8.2 측정 종류와 대상 지정

measure대상 필드단위의미
vnodeV노드 전압
ithroughA소자를 흐르는 전류
pofW소자의 소비 전력
gain_dbnodedB입력 대비 이득 (analysis: ac MUST)
phase_degnode°위상 (analysis: ac MUST)
noise_input—V/√Hz입력 환산 잡음 밀도 (analysis: noise MUST)
noise_output—V/√Hz출력 잡음 밀도 (analysis: noise MUST)
expect:
  - {measure: v, node: OUT, value: 1.667, tol: 1%}
  - {measure: i, through: D1, value: 9.1m, tol: 15%}
  - {measure: p, of: R1, max: 0.25}
  - {measure: gain_db, node: OUT, at: 1k, analysis: ac, value: -3, tol: 0.5}
  - {measure: v, node: OUT, at: 1m, analysis: tran, value: 3.16, tol: 3%}
  - {measure: noise_input, at: 1k, analysis: noise, value: 57.8n, tol: 10%}

8.3 판정

조건판정
value + tol|측정 − 기대| ≤ tol
min만측정 ≥ min
max만측정 ≤ max
min + maxmin ≤ 측정 ≤ max

tol 없이 value만 주면 기본 1% 상대 허용오차입니다.

💡 저항의 전류·전력은 노드 전압에서 해석적으로 계산합니다((V₁−V₂)/R). ngspice의 @r1[i] 문법이 버전마다 다르기 때문입니다.

8.4 EasyEDA 연동

expect에 등장하는 모든 node에는 내보내기 시 전압 프로브가 자동으로 붙습니다. EasyEDA에서 파일을 열고 Ctrl+R만 누르면, 우리가 검증한 그 노드가 이미 프로브되어 있습니다(17-04).


9. ideal / real 쌍 규약

11~13장과 16장의 예제는 같은 회로의 두 버전을 SHOULD 제공합니다.

examples/11-parasitics/electrode-buffer-ideal.yaml   # 기생 없음
examples/11-parasitics/electrode-buffer-real.yaml    # 기생 포함
규칙내용
파일명<이름>-ideal.yaml / <이름>-real.yaml
meta.lesson동일해야 함
해석비교 가능하도록 동일한 analyses MUST
차이기생 소자 추가만. 이상 회로의 소자 값은 바꾸지 않음

기생 성분의 영향을 말이 아니라 시뮬 파형의 차이로 보여주는 것이 목적입니다.


10. 최소 예제

부하가 걸린 분압기 회로도R110kΩV15VR210kΩRL10kΩ부하VINOUTGND
부하가 걸린 분압기
# 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}

11. 버전 정책

항목규칙
현재v0.1
파일 내 버전 표기없음 (스키마 URL이 버전을 가리킴)
호환성v1.0 전까지 비호환 변경 가능
변경 시examples/ 전체를 함께 갱신하고 테스트가 통과해야 함

12. 명세 자체의 검증

이 명세가 지켜지는지는 다음으로 확인합니다.

검사방법
문법schema/circuit.schema.json 검증
핀 이름§4.1 표와 대조 (E102)
meta.lesson 존재링크 체커
문서 속 YAML = 예제 파일추출 후 diff
값 표기파서 단위 테스트

문서의 코드블록과 examples/의 파일이 어긋나면 테스트가 실패합니다. 둘 중 하나만 고치는 일이 생기지 않게 하는 장치입니다.