T0 · 한눈에 보기
RNL 언어의 생김새
아래 표기법은 언어 표준 0.3을 따릅니다. 총 46개의 키워드가 있으며, 표준 문장으로 적으면 자연스러운 문장처럼 읽히고 중국어로도 작성할 수 있습니다. 툴킷의 런타임은 모든 키워드를 구현하고 있습니다. 0.x 버전 간에는 호환성을 보장하지 않지만 도구는 0.2 파일도 계속 읽을 수 있습니다.
구문 하나 해부하기
한 구문을 적는 두 가지 방식
자유 텍스트는 사람만을 위한 것이므로, 동일한 구문을 기호만으로 적거나 표준 문장으로 적을 수 있습니다. 기계가 읽는 내용은 완전히 똑같으며 도구로 스타일 간 양방향 변환도 가능합니다.
참조 기호(Sigil)
무엇이 넷리스트의 객체이고 무엇이 RNL의 객체인지 첫 글자로 한눈에 구분합니다.
넷리스트의 인스턴스참조만 하며 새로 만들지 않음넷넷리스트의 노드단자단자 이름으로 적거나 #M1:1처럼 순번(1부터 시작)으로 표기현재 서브서킷의 포트.subckt로 정의됨; 단독 #은 현재 서브서킷 자신을 가리킴현재 레벨의 이름레벨당 한 번만 바인딩되며 해당 레벨에서만 보임정의심볼, 스타일, 일반 정의 또는 집합; 하위 레벨로 상속됨정의 내부의 역할적용 시 객체로 채워짐; 심볼 안에서 단독 ?는 그 심볼로 그려지는 인스턴스를 가리킴점“_”는 해당 축을 솔버에 맡김; %j = (10, 10)은 이름 있는 점집합순서가 있음; 다른 집합 안에서는 한 단계 펼쳐지며 {{…}}로 감싸면 하나의 원소로 유지됨버스#XI<3:0>처럼 인덱스가 붙은 넷이나 인스턴스 묶음하위 객체key로 이름을 붙인 라벨 등파이프앞 단계의 결과를 다음 단계로 전달함; => %x는 결과에 이름을 붙임구문의 기본 형태
M1을 (10, 20)에 놓습니다. @PLACE(x=10)처럼 한 축만 적어도 되며 나머지 축은 솔버에 맡겨집니다.
중괄호는 순서 있는 객체 묶음을 나타냅니다. M1과 M2가 동일한 y 좌표를 공유합니다.
객체 바로 뒤의 괄호는 정의의 어느 역할을 맡는지 나타냅니다. “and”와 “are treated”는 자유 텍스트입니다.
구문이 만든 객체에 이름을 붙여 나중에 %g0으로 위치를 지정하는 등 참조할 수 있게 합니다. 끝에 => %g0을 적어도 같습니다.
각 단계가 결과를 다음 단계로 넘깁니다. 먼저 위치를 놓은 뒤 좌우 반전합니다.
하나의 레코드 안에서 구문들을 세미콜론으로 구분합니다. 레코드 헤더는 안의 모든 구문에 적용되어 author는 작성자를 기록하고 priority는 기본 우선순위를 설정합니다(단, AS와 ATTACH는 레코드 우선순위가 “disabled”일 때만 이를 상속합니다).
키워드 분류
46개의 키워드는 아홉 가지 분류로 나뉩니다. 키워드를 클릭하면 용도와 표준 문장을 볼 수 있습니다.
다섯 가지 레이아웃 제약
모든 레이아웃 의도는 이 다섯 가지 관계로 귀결됩니다. 앞의 네 가지는 x 또는 y 좌표에, 다섯 번째는 방향에 작용합니다. 축만 적은 제약은 방향을 고정하지 않으며, "left-to-right"처럼 방향을 적어야 선후 순서가 정해집니다.
정렬(Align): 같은 y 좌표를 가져 가로 한 줄에 놓입니다.
순서(Order): x축을 따라 엄격한 순서로 놓입니다. 축만 적으면 정순과 역순 모두 성립하며 "left-to-right"를 적어야 방향이 고정됩니다.
등간격(Distribute): 이웃한 객체들 사이의 간격을 같게 맞춥니다(예: 꼬리 트랜지스터 중앙 배치).
거리(Distance): B가 A의 오른쪽으로 최소 3칸 이상 떨어집니다. 방향을 "x"로 적으면 어느 쪽이 먼저 와도 됩니다.
방향 관계(Orient-relation): B는 A의 좌우 거울 대칭 방향을 가집니다. 둘이 각각 어느 쪽을 바라볼지는 솔버가 결정합니다.
한 회로 레벨이 적용되는 과정
한 레벨 전체를 읽어들인 뒤 아홉 개의 고정된 단계에 따라 처리합니다. 덕분에 정의보다 사용이 먼저 나와도 되고, 잘못된 구문이 자기 자신에게만 영향을 주며, 표준 패키지가 추가하는 접지처럼 규칙이 생성한 객체들도 똑같이 심볼과 위치를 부여받습니다.
언어 둘러보기직접 조작해 보는 아홉 개의 섹션: 문장, 정의, 표준 패키지의 기본 동작, 집합과 선택, 배선, 텍스트, 방향, 우선순위 및 헤더 레코드.T1 · 문장
구문은 사실로 읽힙니다: 기호와 표준 문장
기계는 오직 기호만 읽습니다: # & % $로 시작하는 참조, @로 시작하는 키워드, 괄호 안의 매개변수, 중괄호, 세미콜론, =>가 전부입니다. 그 사이의 단어들은 있든 없든 무방한 자유 텍스트입니다. 표준 문장은 각 키워드에 어울리는 단어들을 정해 두어 같은 종류의 구문이 어디서나 일관되게 읽히도록 하며, 중국어 별칭 패키지는 같은 문장을 중국어로 바꿔 줍니다.
- 기계가 읽는 토큰
- 의미 해석
표준 문장 작성 원칙
- 명령이 아닌 사실로 기술구문은 수행할 동작이 아니라 도면에서 성립하는 사실을 진술합니다. 객체가 주어, 키워드가 서술어 또는 명사, 매개변수가 값이 되며 그 사이에 is, are, has, there is 같은 연결어만 덧붙입니다.
- 실제 의미 이상을 주장하지 않음must, only, required처럼 구문의 실제 동작보다 더 강한 의미를 담은 단어는 쓰지 않습니다. 사람은 그 말을 믿지만 기계는 무시하기 때문입니다.
- 부연 설명(Gloss)방향 코드나 축 이름 뒤에는 “, i.e., …”를 붙여 뜻을 풀이할 수 있습니다:
#M2 @ORIENT("MX"), i.e., flipped upside down. - 자유 텍스트에 쓸 수 있는 문자괄호 바깥에서는 @ # & % $ ? " ; = { } ( ) [ ] < >를 제외한 모든 문자(문장 부호 포함)를 토큰 사이에 적을 수 있습니다. 모든 @ 앞에는 공백이 하나 있어야 합니다.
자주 하는 네 가지 실수
자유 텍스트 안에 적힌 참조도 여전히 참조로 인식되는 반면, 접두사를 빠뜨린 이름은 자유 텍스트가 됩니다.
자유 텍스트 M3이 인스턴스 #M3과 이름이 같습니다. 접두사가 누락되었나요?
M3 앞에 #이 없으므로 자유 텍스트로 처리되어 M1과 M2만 정렬됩니다.
경고 없음: 문법적으로 완전히 적법한 구문입니다.
“설명”처럼 적은 부분 안의 #M2도 객체로 인식됩니다. PLACE가 두 객체를 받아 각각 배치하므로 M2까지 x = 0에 놓입니다. 단순 메모는 /* */ 주석 안에 적으세요.
참조 바로 뒤에 .과 이름이 이어집니다. 단자는 :로 표기하므로 여기서 .d는 자유 텍스트가 됩니다.
이 구문은 드레인 단자가 아니라 M1 자체를 가리킵니다. CURRENT는 단자만 받으므로 구문이 실패합니다. #M1:d로 적어야 합니다.
참조 바로 뒤에 !가 이어집니다. 이름에 !가 포함된 경우 &"vdd!"처럼 따옴표로 감싸야 합니다.
따옴표가 없으면 넷 vdd 뒤에 자유 텍스트 “!”가 붙은 것으로 해석되는데, 이 레벨에는 넷 vdd가 없습니다.
완전한 파일 예제
소개 페이지에서 본 5트랜지스터 OTA의 2단계 전체 파일입니다.
T2 · 정의
AS는 “무엇인지”를, ATTACH는 “무엇을 덧붙이는지”를 나타냅니다
일반 정의(@DEFINE)는 역할, 매개변수, 본문으로 이루어집니다. AS나 ATTACH로 정의를 적용하면 이름을 붙이고 선택할 수 있는 용례(usage) 객체가 만들어집니다. 차동쌍, 대칭쌍, 접지, 포트 태그 모두 이 방식으로 만들어지며 그 정의는 표준 패키지 안에 들어 있습니다.
앞의 객체들이 함께 모여 그 구조를 이룹니다. 정의가 맨 뒤에 오며 객체들이 역할을 채웁니다(M1은 in_p, M2는 in_n).
정의된 요소를 뒤의 객체에 덧붙입니다. 정의가 맨 앞에 오며 넷 vss에 접지가 추가됩니다. 화면 표시만을 위해 존재하며 전기적 연결을 만들지 않습니다.
무엇인지와 어떻게 그릴지
$CURRENT_MIRROR는 본문이 비어 있어, 적용하면 “이것은 전류 거울이다”라는 사실만 기록할 뿐 도면은 바꾸지 않습니다. $MIRRORED는 본문에 제약 조건들이 들어 있어, 적용하면 역할 자리에 실제 객체들이 들어가고 제약들이 현재 레벨로 전개됩니다. $DIFFERENTIAL_PAIR는 두 가지를 모두 가집니다. 차동쌍임을 기록하는 동시에 꼬리 소자를 두 트랜지스터 한가운데 아래에 두는 제약을 본문에 담고 있습니다. 표준 패키지 정의 본문의 제약들은 모두 우선순위가 low이므로 작성자가 직접 적은 구문이 항상 우선하며, 용례에 PRIORITY를 지정해 끌 수도 있습니다.
직접 정의 작성하기
정의 본문 안에서 역할은 ?a처럼, 매개변수는 ?gap처럼 적습니다. 적용할 때 AS 뒤의 괄호에 매개변수 값을 넣으며, 생략하면 기본값이 쓰입니다. 슬라이더를 움직여 gap 값을 바꾸면서 파일과 도면이 함께 변하는 모습을 확인해 보세요.
min=?gap은 최소 간격이므로 솔버가 더 넓게 배치할 수도 있습니다. 이 도면은 가장 좁게 붙인 경우를 보여줍니다.
표준 패키지의 정의들
RNL 언어 자체는 차동쌍이 무엇인지 알지 못합니다. 아래 정의들은 모두 표준 패키지가 RNL 문법으로 작성한 일반 정의들입니다. 항목을 클릭해 원문을 확인해 보세요. 파일에서 같은 이름으로 정의를 작성하면 표준 정의를 가립니다.
T3 · 기본 동작
아무것도 적지 않아도 도면은 그려집니다
표준 패키지는 기본 심볼, 스타일, 정의, 자동 보충 규칙을 담은 RNL 파일입니다. 모든 파일보다 먼저 불러오므로 파일에 적은 구문으로 언제든 덮어쓸 수 있으며, 각 패키지의 내용은 표준 패키지 갤러리에서 볼 수 있습니다. 아래 공통 이미터 증폭단은 순수 넷리스트 상태에서 시작합니다. 두 프리셋을 순서대로 눌러 RNL 세 줄을 추가하면서 표준 패키지의 자동 보충 결과(회색 표시)가 어떻게 달라지는지 살펴보세요.
기본 심볼 배정
SPICE 넷리스트에서 심볼은 먼저 인스턴스 이름의 첫 글자로, 이어서 모델의 타입으로 선택되며, Spectre 넷리스트에서는 마스터와 모델의 타입으로 선택됩니다. 파일 안에 적은 SET-SYMBOL은 그 뒤에 적용되므로 기본 규칙을 덮어씁니다.
| 인스턴스 | 심볼 | 단자 |
|---|---|---|
R* C* L* | $RESISTOR $CAPACITOR $INDUCTOR | p n |
V* I* | $VOLTAGE_SOURCE $CURRENT_SOURCE | p n |
D* | $DIODE | a k |
E* G* | $VCVS_4TERM $VCCS_4TERM | p n cp cn |
M* | $NMOS_4TERM; pmos 타입 $PMOS_4TERM | d g s b |
Q* | $NPN; pnp 타입 $PNP | c b e |
F, H, B, S, W, J, T, U 등 나머지 소자들의 심볼과 실제 모양은 표준 패키지 갤러리에서 볼 수 있습니다.
자동 보충 규칙(발췌)
표준 패키지 자체도 RNL로 작성되어 있습니다. 몇 개의 이름 있는 집합이 파일을 위한 연결 고리(hook) 역할을 하므로, 집합에 원소를 넣거나 빼면 자동 보충 결과도 그에 맞춰 바뀝니다.
T4 · 집합과 선택
집합은 한 단계 펼쳐지고, 선택식은 규칙이 됩니다
중괄호로 순서 있는 집합을 작성합니다. 집합 안에서 다른 집합을 참조하면 그 원소들이 한 단계 펼쳐져 들어오며, 하나의 원소로 유지하려면 중괄호로 한 번 더 감싸야 합니다. 조건부 선택으로 골라낸 객체들도 집합을 이루며, 선택식은 작성된 레벨과 그 아래 모든 하위 레벨에서 각각 한 번씩 평가됩니다.
한 단계 펼치기 vs 하나의 원소로 유지
%s1 = {#M1 #M2}, %s2 = {#M3 #M4}라고 합시다. LLM 작성 벤치마크에서 약 15회가 오른쪽 의미를 의도하면서 왼쪽 형태로 작성했습니다. “다른 배치 보기”를 눌러 두 구문이 각각 허용하는 배치들을 확인해 보세요.
원소:M1 M2 M3 M4
네 인스턴스를 개별적으로 순서 정렬합니다. M1 M2 M3 M4 또는 그 역순만 허용됩니다.
원소:{M1 M2} {M3 M4}
두 그룹의 중심점끼리만 순서를 정렬하며, 각 그룹 내부의 순서는 어떻게 놓여도 성립합니다.
조건으로 객체 선택하기
선택식은 주어진 범위 안에서 조건에 맞는 객체를 골라냅니다. 범위가 #이면 현재 레벨 전체가 되고, 넷이면 그 넷에 연결된 객체들이 됩니다. 각 구문을 클릭해 무엇이 선택되는지 확인해 보세요.
모든 레벨에서 한 번씩 평가
규칙은 정의와 마찬가지로 하위 레벨로 상속됩니다. 최상위 레벨에 작성하면 최상위 레벨과 그 아래 모든 서브서킷에서 각각 해당 레벨의 객체들만 대상으로 한 번씩 평가됩니다. recursive=false를 지정하면 구문이 작성된 레벨에서만 적용됩니다.
T5 · 배선
같은 점을 공유해야만 배선이 서로 연결됩니다
WIRE는 넷 하나와 순서 있는 점(단자 또는 점 객체) 목록을 받습니다. 넷 이름은 확인용 표기일 뿐이며 전기적 연결은 여전히 넷리스트가 정의합니다. 그려진 배선들이 서로 이어지는지는 오직 같은 점 객체나 단자를 공유하는지에 달려 있습니다.
여섯 가지 라우팅 모드
배선은 점 목록의 모든 점을 순서대로 지나며, 이웃한 두 점 사이를 잇는 방식은 mode로 정합니다. auto를 제외한 나머지 모드는 뷰어가 그대로 따르는 엄격한 기하 규칙입니다. 도면의 아무 곳이나 클릭해 끝점을 옮겨 보세요.
버스, 탭, 번들
넷리스트에는 원래 버스라는 개념이 없습니다. 버스는 여러 넷을 하나의 굵은 선으로 묶어 그리는 표현 방식일 뿐입니다. 단일 배선이 버스와 한 점을 공유하면 탭(분기)이 됩니다. 번들(BUNDLE)은 여러 인스턴스를 하나의 심볼로 합쳐 그리며, 번들의 각 핀은 구성원들의 같은 이름 단자들을 대표합니다.
배선 경로를 직접 적지 않으려면 &D<1> @ROUTE로 넷 전체를 솔버에 맡기면 됩니다. 분기, 경로, 접합점 모두 솔버가 결정합니다.
T6 · 텍스트
객체에 붙은 텍스트는 라벨이고, 점에 붙은 텍스트는 어노테이션입니다
TEXT가 어디에 부착되는지에 따라 세 가지가 결정됩니다: ${…}가 누구의 속성을 읽는지, 텍스트의 기본 위치가 어디인지, 그리고 key를 지정했을 때 누구의 하위 객체가 되는지입니다. 텍스트 자체의 위치는 별개이며 PLACE나 dx, dy로 조정할 수 있습니다.
텍스트 마크업
텍스트 마크업은 언어 모델이 잘 아는 LaTeX의 작은 부분집합을 사용합니다. 아래첨자와 위첨자는 중괄호로 감싸야 하므로 g_m은 적힌 그대로 표시됩니다. ${…}는 텍스트가 부착된 객체(여기서는 W=2u L=0.5u인 M1)의 속성을 읽습니다. 알 수 없는 명령은 경고와 함께 작성된 그대로 표시되며 텍스트 자체는 유효하게 유지됩니다.
T7 · 방향
x는 오른쪽, y는 위쪽이며 여덟 가지 방향 코드를 씁니다
좌표는 Virtuoso와 마찬가지로 y축이 위를 향하는 격자 단위입니다. 방향 변환은 심볼의 원점을 기준으로 적용되어 핀의 위치와 배선 인출 방향은 함께 바뀌지만 각 핀이 대응하는 단자 이름은 바뀌지 않습니다. 아래 여덟 가지 방향 코드만 사용할 수 있으며 R90은 반시계 방향 회전이고 MYR90과 MXR90은 먼저 대칭 반전한 뒤 회전합니다.
방향 관계
ORIENT-RELATION은 개별 방향을 고정하지 않고 두 객체 사이의 관계만 지정합니다. B의 방향은 A의 방향에 지정한 변환을 적용한 결과가 됩니다. $MIRRORED는 "MY"를 사용하므로 A가 어느 쪽으로 회전하든 B는 항상 A의 좌우 거울 대칭이 됩니다.
T8 · 우선순위
충돌은 오류가 아닙니다: 우선순위가 먼저, 그다음은 작성 순서입니다
모든 기하학적 사실은 disabled, low, normal(기본값), high 중 하나의 우선순위를 가집니다. 사실들은 높은 우선순위부터, 같은 우선순위 안에서는 뒤에 적힌 것부터 순서대로 처리되며, 이미 유지된 사실들과 모순되지 않는 한 각각 유지됩니다. 하나의 PLACE는 x와 y 두 개의 사실로 나뉘어 각각 독립적으로 버려질 수 있으며, 용례에서 전개된 사실들은 그 용례를 생성한 구문의 구문 순서를 따릅니다.
세 레코드가 공존하는 방식
의미 구조와 제약 조건(기본값 normal). 언제든 자유롭게 수정합니다.
좌표와 배선(우선순위 high). 솔버를 실행할 때마다 통째로 교체되며 hash에 입력 상태를 기록합니다.
수동 편집 내용이 솔버 레코드 뒤에 우선순위 high로 추가됩니다. 같은 우선순위에서는 뒤에 적힌 것이 이기므로 솔버 결과를 덮어씁니다.
입력이 바뀌어 hash가 일치하지 않더라도 기존 결과는 그대로 화면에 표시되며, 뷰어는 오류 없이 다시 풀기만 제안합니다. 다음에 솔버를 실행하면 편집기의 high 좌표는 고정 위치로 유지되고 나머지 요소들이 그에 맞춰 재조정됩니다.
T9 · 헤더
헤더 레코드: 언어 버전, 별칭 패키지, 소자 단자 이름
헤더 레코드는 선택 사항이며, 작성할 경우 모든 서브서킷 바깥의 파일 첫 번째 레코드로 최대 하나만 올 수 있습니다. 별칭 없이 항상 표준 표기로만 읽습니다. 생략하면 도구의 기본 언어 버전으로 읽으며, 도구가 파일을 저장할 때 헤더를 추가합니다.
PDK 소자의 단자 이름 지정
PDK의 sky130_fd_pr__nfet_01v8처럼 넷리스트 안에 정의되지 않은 서브서킷은 단자 이름을 알 수 없으므로 위치 순번(:1 등)으로만 단자를 참조할 수 있습니다. @DEVICE는 이름 및 모델 패턴으로 인스턴스를 매칭하여 단자 이름을 선언합니다.
E · 예제
작은 예제 모음
왼쪽은 파일이고 오른쪽은 그려진 도면입니다. 파일의 줄에 마우스를 올리면 도면의 어느 부분을 제어하는지 표시되고, 반대로 도면의 요소를 가리키면 그 요소를 참조하는 줄들이 표시됩니다.