T0 · 全体像(一覧)
RNL言語の全体像
以下は言語標準 0.3の表記です。46個のキーワードがあり、標準例文として書けば自然な文章として読め、中国語で書くこともできます。ツールキットのランタイムはすべてのキーワードを実装しています。0.xの各バージョン間に互換性の保証はありませんが、ツールは引き続き0.2のファイルも読み込めます。
1つの文の構造
同じ1文の2つの書き方
自由テキストは人間が読むためのものなので、同じ1つの文を記号だけで書くことも、標準例文として書くこともできます。機械が読み取る内容は完全に同一であり、ツールでスタイルを相互変換することも可能です。
参照のプレフィックス記号(シジル)
何がネットリストに属し、何がRNL自身に属するかが一目で分かります。
ネットリスト内のインスタンス参照のみを行い、新規作成はしないネットネットリスト内のノード端子端子名、または#M1:1のような番号(1始まり)で指定このサブサーキットのポート.subcktで定義されるポート。単独の#はこのサブサーキット自身を指すこのレベル内の名前レベルごとに1回だけ束縛でき、そのレベル内でのみ有効定義シンボル、スタイル、定義、またはセット(下位レベルへ継承される)定義内のロール適用時にオブジェクトが入る。シンボル内の単独の?はそれで描画されるインスタンス自身を指す点「_」はその軸をソルバーに委ねることを表し、%j = (10, 10)は名前付きの点になるセット順序付き。他のセットに入れると1段階展開され、{{…}}とすると1つのメンバーのまま保たれるバス#XI<3:0>のようなインデックス付きのネットまたはインスタンスのグループ子オブジェクトkeyで名前を付けたラベルなどパイプ結果を次の部分へ渡し、=> %xでそれに名前を付ける文の基本パターン
M1を(10, 20)に配置します。@PLACE(x=10)のように片方の軸だけを指定し、もう片方をソルバーに委ねることもできます。
波括弧は順序付きのオブジェクト群を表します:M1とM2が同じy座標を共有します。
オブジェクト直後の丸括弧は定義のどのロールに入るかを示します。「and」や「are treated」は自由テキストです。
文が生成するオブジェクトに名前を付け、後から%g0を参照して位置などを指定できるようにします。末尾に=> %g0と書いても同じです。
各部分が結果を次へと渡します:まず配置し、次に左右反転させます。
セミコロンで区切られた複数の文からなる1つのレコードです。レコードヘッダーは内部のすべての文に適用され、authorは記述者を記録し、priorityはデフォルトの優先度を設定します(ただしASとATTACHは例外で、レコードの優先度が「disabled」のときのみそれを継承します)。
キーワードの9分類
46個のキーワードは9つのグループに分かれます。クリックすると用途と標準例文が表示されます。
5種類のレイアウト制約
すべてのレイアウト意図はこれら5つの関係に帰着します(最初の4つはxまたはy座標に、5つ目は向きに作用します)。軸だけを指定した制約は向きを固定せず、"left-to-right"のような方向を指定すると前後関係まで定まります。
整列(Align):同じy座標に揃え、横一列に並べます。
順序(Order):x軸に沿って厳密に並べます。軸のみの指定なら順方向・逆方向のどちらも満たし、"left-to-right"で方向が固定されます。
等間隔(Distribute):隣り合う間隔を等しくします(テールを中央に置く場合など)。
距離(Distance):BをAの右に3グリッド以上離します。方向を"x"にすると前後を問いません。
向きの関係(Orientation relation):Bの向きをAの左右鏡像にします。それぞれがどちらを向くかはソルバーに委ねられます。
1つの回路レベルが有効になるまでの流れ
1つのレベル全体が読み込まれると、9つの固定フェーズで順番に処理されます。そのため、名前を定義より前に使うことができ、誤った文があってもその文自身にしか影響せず、標準パッケージが補うグラウンドのようにルールで生成されたオブジェクトにも正しくシンボルと位置が与えられます。
言語ツアー実践しながら学べる9つのセクション:文、定義、標準パッケージのデフォルト動作、セットと選択、配線、テキスト、向き、優先度、ヘッダー。T1 · 文と表記
文は事実として読める:記号表記と標準例文
機械が読み取るのは記号(# & % $で始まる参照、@で始まるキーワード、丸括弧内のパラメータ、波括弧、セミコロン、=>)だけです。それらの間にある言葉は自由テキストであり、書いても書かなくても構いません。標準例文は各キーワードに定型の言葉を補うことで、同じ種類の文がどこでも同じように読めるようにします。中国語の別名パッケージを使えば、同じ文をそのまま中国語にできます。
- 機械の解釈
- 事実としての意味
標準例文の作られ方
- 命令ではなく「事実」として書く文は「行うべき操作」ではなく「図面上で成り立つ事実」を述べます。オブジェクトが主語、キーワードが述語または名詞、パラメータがその値となり、そこへis、are、has、there isなどのつなぎ言葉だけが添えられます。
- 意味以上のことを書かないmust、only、requiredのように、文の本来の意味以上の強い主張を含む言葉は使いません(人間はそれを信じてしまいますが、機械は無視するためです)。
- 補足説明(グロス)向きコードや軸の後ろに「, i.e., …」を添えて意味を補足できます:
#M2 @ORIENT("MX"), i.e., flipped upside down。 - 自由テキストに書ける文字丸括弧の外側では、@ # & % $ ? " ; = { } ( ) [ ] < > を除く任意の文字(句読点や日本語・中国語を含む)をトークン間に置けます。なお、すべての@の直前には空白が必要です。
よくある4つの落とし穴
自由テキストの中に書かれた参照はやはり参照として扱われ、逆にプレフィックスのない名前は自由テキストになります。
自由テキスト内のM3がインスタンス#M3と同じ名前です。プレフィックスが抜けていませんか?
M3には#がないため自由テキストとして扱われ、M1とM2だけが整列されます。
メッセージなし:構文上は完全に有効です。
「説明」のつもりで書いても#M2はオブジェクトとして扱われます。PLACEは2つのオブジェクトを受け取ってそれぞれ配置するため、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ファイルです。すべてのファイルの前に読み込まれるため、ファイル側の記述でいつでも上書きできます(各パッケージの内容については標準パッケージのギャラリーを参照してください)。下のエミッタ接地増幅段は素のネットリストから始まります。2つのプリセットを順に切り替えてRNLを3行追加し、標準パッケージによる自動補完(灰色で表示)がどう変化するか見てみましょう。
デフォルトのシンボル
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 · セットと選択
セットは1段階展開され、選択(SELECT)はルールになる
波括弧は順序付きのセットを表します。セットの中で別のセットを参照するとそのメンバーが展開されますが、もう1組の波括弧で囲むと1つのメンバー(サブグループ)として保たれます。選択(SELECT)で抽出されたオブジェクト群もセットになり、選択は記述されたレベルと下位の各レベルで1回ずつ評価されます。
展開するか、1つのメンバーにするか
%s1 = {#M1 #M2}、%s2 = {#M3 #M4}とします。LLM記述ベンチマークでは、右側の意味を意図しながら左側の形式を出力したケースが約15回ありました。「別の配置を見る」を押して、それぞれが許容する配置を確認してみてください。
メンバー:M1 M2 M3 M4
4つのインスタンスが1つずつ順番に並ぶ:M1 M2 M3 M4、またはその逆順のみ。
メンバー:{M1 M2} {M3 M4}
2つのグループがそれぞれの中心座標で順序付けられ、各グループ内の並び順は問わない。
条件による選択
選択はスコープから条件に合うオブジェクトを抽出します。スコープが#ならレベル全体、ネットならそのネットに接続されたオブジェクトが対象になります。文をクリックして、何が選ばれるか見てみましょう。
すべてのレベルで1回ずつ評価
ルールは定義と同じように扱われます。トップレベルに書くと、トップレベルと下位のすべてのサブサーキットで1回ずつ(毎回そのレベル内のオブジェクトだけを対象に)評価されます。recursive=falseを指定すると、記述されたレベルでのみ有効になります。
T5 · 配線
同じ点を共有する配線だけが接続される
WIREはネットと順序付きの点リスト(各点は端子または点オブジェクト)を受け取ります。ネットの指定は注記にすぎず、電気的な接続関係はあくまでネットリストによって決まります。描画された配線同士がつながるかどうかは、同じ点オブジェクトまたは端子を共有しているかどうかだけで決まります。
6つの配線モード
点リスト内のすべての点を順番に通り、隣り合う2点間をどう結ぶかはmodeで決まります。auto以外の各モードはビューアが厳密に従う決定論的なルールです。図面内の任意の場所をクリックして終点を動かしてみてください。
バス、タップ、バンドル
ネットリスト自体にはバスという概念はありません。バスは複数のネットを1本の太線として描く表現方法です。単一配線がバスと点を共有するとタップ(分岐)になります。バンドル(BUNDLE)は複数のインスタンスをまとめて1つのシンボルとして描画し、その各ピンはメンバーの同名端子を代表します。
経路を自分で書きたくない場合は、&D<1> @ROUTEと書くことでネット全体をソルバーに委ねられます(分岐・経路・接続点の黒丸すべてをソルバーが決定します)。
T6 · テキスト
オブジェクトに付随するテキストはラベル、点に付随するテキストは注釈
TEXTを何に付随させるかによって、${…}が誰のプロパティを読み取るか、テキストのデフォルト位置がどこになるか、そしてkeyを指定したときに誰の子オブジェクトになるかの3つが決まります。テキスト自身の位置は別個に扱われ、PLACEやdx・dyで調整できます。
テキストマークアップ
テキストマークアップには、言語モデルがよく知っているLaTeXの小さなサブセットを使用します。下付き・上付き文字には波括弧が必須なため、g_mはそのまま表示されます。${…}はテキストが付随するオブジェクト(ここではW=2u L=0.5uのM1)のプロパティを読み取ります。未知のコマンドは警告を出した上で記述どおりに表示され、テキスト自体は有効に保たれます。
T7 · 向き
xは右、yは上。8つの向きコード
座標はグリッド単位で、Virtuosoと同様にy軸が上向きです。向き(ORIENT)はシンボルの原点を中心に作用し、ピンの位置と配線の引き出し方向は向きとともに変わりますが、対応する端子そのものは変わりません。以下の8つのコードのみが有効で、R90は反時計回り90°回転、MYR90とMXR90は先に鏡像反転してから回転します。
向きの関係
ORIENT-RELATIONは個々の向きを固定せず、両者の関係だけを決めます(Bの向きがAの向きにこの変換を続けたものになります)。$MIRROREDは"MY"を使っており、Aがどの向きになってもBはその左右鏡像になります。
T8 · 優先度
競合はエラーではない:まず優先度、次に記述順
すべての幾何学的事実にはdisabled、low、normal(デフォルト)、highのいずれかの優先度があります。事実は優先度の高い順、同じ優先度内では後に書かれた順に取り込まれ、すでに採用された事実と矛盾しない限り採用されます。1つのPLACEはxとyの2つの事実から成り、個別に破棄され得ます。適用オブジェクトから展開された事実は、文の順序においてその適用オブジェクトを生成した文の位置に入ります。
3つのレコードの共存
意味記述と制約(デフォルトはnormal)。自由に編集します。
座標と配線(優先度high)。求解のたびにレコード全体が置き換えられ、hashに求解時の入力が記録されます。
手動の編集はソルバーの後ろに追記されます(同じく優先度high)。同じ優先度では後に書かれたものが勝つため、ソルバーの結果を上書きします。
入力が変わってhashが一致しなくなっても、以前の結果はそのまま表示され、ビューアはエラーを出さずに再求解を提案するだけにとどまります。次回の求解時には、エディタが書いたhighの座標が固定位置として扱われ、残りの部分がそれに合わせて再調整されます。
T9 · ヘッダー
ヘッダーレコード:バージョン、別名パッケージ、素子の端子名
ヘッダーレコードは省略可能です。記述する場合はファイルの最初(どのサブサーキットよりも外側)に高々1つだけ置き、常に別名を使わない標準の表記で読み取られます。省略した場合はツールのデフォルトバージョンで読み取られ、ツールがファイルを保存する際にヘッダーが補われます。
PDK素子の端子名
PDKのsky130_fd_pr__nfet_01v8のようにネットリスト内で定義されていないサブサーキットは、端子名が不明なため位置インデックス(:1など)でしか端子を参照できません。@DEVICEは名前とモデルのパターンでインスタンスを照合し、その端子名を宣言します。
E · サンプル集
いくつかの小さなサンプル
左がファイル、右が描画結果です。行にカーソルを合わせると図面の対応する部分が示され、図面上の要素にカーソルを合わせるとそれを参照する行が強調表示されます。