T0 · 語言一覽
RNL 語言的樣貌
下方語法遵循語言標準 0.3:共 46 個關鍵字;依標準例句編寫時,每條敘述讀起來就像流暢的散文,且同樣可以用中文編寫。工具鏈的執行階段程式庫已完整實作所有關鍵字。0.x 各版本之間不承諾相容性,但工具仍可讀取 0.2 的檔案。
剖析一條敘述
同一條敘述的兩種寫法
自由文字僅供人類閱讀,因此同一條敘述可以只寫精簡記號,也可以寫成標準例句。機器讀取到的內容完全一致,且工具可在不同寫法之間雙向轉換。
引用前綴記號(Sigils)
一眼區分哪些屬於網表、哪些屬於 RNL。
網表中的實例僅引用,絕不建立新實例網路網表中的節點端子依端子名稱,或依序號如 #M1:1(從 1 開始)本層子電路的連接埠由 .subckt 定義;單獨一個 # 代表該子電路本身本層級的名稱每個層級內僅綁定一次,且僅在該層級可見定義符號、樣式、一般定義或集合;向子層級繼承定義中的角色套用時由實際物件填入;在符號定義中,單獨一個 ? 代表使用該符號繪製的實例點座標「_」表示該軸交由求解器決定;%j = (10, 10) 為具名點集合有序集合;放入另一個集合時會展開一層,而 {{…}} 則維持為單一成員匯流排帶有索引範圍的一組網路或實例,例如 #XI<3:0>子物件例如以 key 命名的標籤管線(Pipe)將前一段的結果傳遞給後一段;=> %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" 則不分左右先後。
朝向關係(Orientation relation):B 為 A 的左右鏡像;至於兩者各自面向哪一邊,則由求解器決定。
單一電路層級如何生效
讀取完整個層級後,會依九個固定階段依序處理。因此名稱可以先使用後定義,格式錯誤的敘述也僅影響自身;由規則產生的物件(例如標準套件自動補上的接地符號)同樣會獲得符號與位置。
語言導覽九個可實際操作的章節:句子、定義、標準套件預設行為、集合與篩選、連線、文字、朝向、優先順序以及檔頭記錄。T1 · 句子與寫法
敘述即為陳述事實:記號與標準例句
機器只讀取記號:以 # & % $ 開頭的引用、以 @ 開頭的關鍵字、括號內的參數、大括號、分號與 =>。記號之間的文字皆為自由文字,可寫可不寫。標準例句為每個關鍵字配上了固定詞彙,使同類敘述在各處讀起來一致;中文別名套件則能將相同的句子轉為中文。
- 機器讀取內容
- 語義解讀
標準例句的編寫原則
- 陳述事實,而非下達指令每條敘述描述的是圖面上成立的事實,而非要執行的動作。物件為主詞,關鍵字為動詞或名詞,參數為其數值;中間僅加入 is、are、has、there is(或中文的「是、位於、有、按……排列」)等連接詞。
- 不誇大語義不寫 must、only、「必須」等超出敘述本身語義的字眼:人類讀者會當真,但機器會直接忽略。
- 補充說明(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 的網路。
完整檔案範例
介紹頁中的五電晶體 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 網表中,則依 master 與模型類型指定。檔案中編寫的 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 寫成。它透過幾個集合為檔案預留了擴充方式:只要向集合新增或移除成員,自動補齊行為就會隨之調整。
T4 · 集合與篩選
集合在巢狀時展開一層;篩選即是規則
大括號用來表示有序集合。在集合中引用另一個集合時,會將其成員展開併入;若要將其保留為單一成員,只需再套一層大括號。透過條件篩選出的物件同樣構成集合,且篩選會在所在層級及下方每個層級各評估一次。
展開一層,或保留為單一成員
設 %s1 = {#M1 #M2} 且 %s2 = {#M3 #M4}。在我們的大型語言模型編寫基準測試中,約有 15 次執行想表達右側的群組排序,卻寫成了左側的形式。點選「換一種排法」,查看兩種寫法各自允許哪些排列方式。
成員:M1 M2 M3 M4
四個實例逐一排序:僅允許 M1 M2 M3 M4 或完全反向。
成員:{M1 M2} {M3 M4}
兩個群組依各自的中心排序;群組內部的先後順序則不拘。
依條件篩選
篩選(Selection)會從指定範圍中依條件挑出物件:範圍為 # 時代表整個層級;範圍為網路時則代表連接在該網路上的物件。點選任一敘述以查看其篩選結果。
每個層級各評估一次
規則的繼承方式與定義相同:寫在頂層時,會在頂層及下方每個子電路中各評估一次,且每次僅檢查該層級內的物件。若加上 recursive=false,則僅在編寫該規則的層級生效。
T5 · 連線
唯有共用同一個點物件,連線才會相接
WIRE 接受一個網路與一串有序的點(每個點可為端子或點物件)。網路名稱僅作為標記,實際電氣連接依然由網表定義。繪製出的連線是否相接,完全取決於它們是否共用同一個點物件或端子。
六種走線模式
點列表中的每個點皆會依序經過;相鄰兩點之間的路徑走法則由 mode 決定。除了 auto 之外,每種模式皆為檢視器嚴格遵循的幾何規則。點選圖面任意位置可移動終點。
匯流排、分接(Tap)與疊畫(Bundle)
網表本身沒有匯流排概念:匯流排只是將多個網路畫成一條粗線的呈現方式。單一連線與匯流排共用一個點即構成「分接(tap)」。疊畫(BUNDLE)則將一組實例繪製為單一符號,其接腳代表各成員的同名端子。
若不想手寫走線路徑,可使用 &D<1> @ROUTE 將整個網路交由求解器處理:分支、路徑與交接圓點皆由求解器決定。
T6 · 文字
附著於物件上的文字是標籤;附著於點上的是標註
TEXT 附著的對象決定了三件事:${…} 讀取誰的屬性、文字預設擺放的位置,以及指定 key 時它成為誰的子物件。文字自身的位置則是獨立的,可透過 PLACE 或 dx、dy 設定。
文字標記語法
文字標記採用大型語言模型熟悉的一小部分 LaTeX。上下標必須加上大括號,因此 g_m 會原樣顯示;${…} 會讀取文字所附著物件的屬性(此處為 M1 的 W=2u L=0.5u)。遇到未知命令時會原樣顯示並發出警告,該段文字依然有效。
T7 · 朝向
x 向右、y 向上;共八種朝向代碼
座標採用 y 軸向上的網格單位,與 Virtuoso 一致。朝向變換以符號的原點為中心:接腳位置與出線方向會隨之改變,但接腳所對應的端子不變。僅接受下方八種代碼;R90 為逆時針旋轉,而 MYR90 與 MXR90 則是先鏡像翻轉再旋轉。
朝向關係
ORIENT-RELATION 不固定絕對朝向,僅固定兩者之間的相對關係:B 的朝向為 A 的朝向再套用指定變換。$MIRRORED 使用的正是 "MY":無論 A 如何旋轉,B 永遠是它的左右鏡像。
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 · 綜合範例
幾個完整的小範例
左側為檔案內容,右側為繪製結果。將游標懸停在某一行上,可查看它控制圖面中的哪個部分;反過來將游標懸停在圖面中的某個部分上,也會標示出相關的敘述行。