07. Circuit言語げんご
方針ほうしん
二値にち・固定幅こていはば・同期離散時間どうきりさんじかんの回路かいろを正式せいしきな意味領域いみりょういきとする。構文木こうぶんきと回路かいろgraph、回路生成かいろせいせいと信号しんごうの実行値じっこうち、定義ていぎの再利用さいりようと状態じょうたいの共有きょうゆうを分離ぶんりする。
1. surfaceと型かた
Designはmodules、entry名めい、tests。Moduleはname、入力列にゅうりょくれつ、宣言列せんげんれつ、出力列しゅつりょくれつ。入力にゅうりょく/出力しゅつりょく/stateの幅はばは正せいのNat。upper boundは構成上こうせいじょうのLimitsで決きまり、暗黙あんもくの32/64bitに制限せいげんしない。
bit-vectorは (width, unsigned value)、0 <= value < 2^width。bits width valueの範囲外はんいがいはエラーで、literalの切捨きりすてをしない。true/falseは1bit。
信号名しんごうめいはinput/wire/stateの共通空間きょうつうくうかん。instance名めいはInstance空間くうかん、module名めいはDesign内ないのModule空間くうかん、output名めいは各かくmoduleのOutput空間くうかん。同おなじ空間くうかんの重複ちょうふくはエラー。outputは内部ないぶで裸はだかの名前参照なまえさんしょうとして再利用さいりようしない。共有きょうゆうしたい式しきはwireで宣言せんげんする。
Name leafは信号参照しんごうさんしょう。at instance outputは、そのinstanceが参照さんしょうするmoduleのoutputを参照さんしょうする。definition linkにはinstance siteとoutput definitionの双方そうほうを提示ていじできる。
2. 各宣言かくせんげん
wire name expr: exprの値あたいを共有きょうゆうする組合くみあわせ信号しんごう。宣言順せんげんじゅんに依存いぞんせず前方参照ぜんぽうさんしょうを認みとめる。state name width initial: 初期値しょきちを持もつ状態じょうたい。initialはBitsのliteralで幅はばが一致いっちする必要ひつようがある。next name expr: 次つぎのtickのstate値ち。対象たいしょうはstateに限かぎり、各かくstateにちょうど一ひとつ必要ひつよう。省略しょうりゃくを暗黙あんもくの保持ほじとしない。保持ほじはnext q qと明示めいじする。inst name module arguments: moduleの入力列にゅうりょくれつの順じゅんに引数ひきすうを接続せつぞくする。毎回独立まいかいどくりつしたinstanceを作つくる。定義ていぎの構文こうぶんfragmentの共有きょうゆうは状態じょうたいの共有きょうゆうを意味いみしない。output name width expr: 外部出力がいぶしゅつりょく。明示幅めいじはばとexpr幅はばの一致いっちを要求ようきゅうする。
3. 演算えんざん
notはbitwise。and/or/xor/nor/addは等幅とうはばの2入力にゅうりょく。addはmod 2^widthの加算かさん。符号付ふごうつき解釈かいしゃくはしない。
muxは1bit selectと等幅とうはばのyes/no。select=1ならyes。
concat a bはaを上位じょうい、bを下位かいへ置おき、幅はばはwa+wb。
slice value lo widthはLSB=0として [lo,lo+width) を抜ぬき出だす。width>0かつlo+width<=入力幅にゅうりょくはば。全加算ぜんかさん・index計算けいさんをcheckedにする。
4. 検査けんさとelaboration
Design内ないのmodule signatureを収集しゅうしゅうする。entryと各かくinstanceのmoduleを解決かいけつする。
module-instantiation graphがDAGであることを検査けんさする。再帰さいきinstantiationは有限ゆうげんな回路かいろにならないので拒否きょひする。
各かくinstanceを独立どくりつした階層かいそうpathへ展開てんかいし、信号参照しんごうさんしょうと状態じょうたいを結むすぶ。未使用みしようmoduleも単独たんどくに検査けんさし、不正ふせいな定義ていぎを放置ほうちしない。
各かくstate readを組合くみあわせgraphの入力にゅうりょくとして扱あつかい、next assignmentを別べつのsinkにする。state readからnext exprへ逆ぎゃくの依存いぞんedgeを加くわえない。
その実際じっさいのgraphで組合くみあわせcycleを検査けんさする。instanceの全入力ぜんにゅうりょくが全出力ぜんしゅつりょくに依存いぞんすると近似きんじしてはいけない。内部ないぶstateで遮断しゃだんされるfeedbackを誤拒否ごきょひしない。
DAGの順序じゅんじょでwidthを推論すいろん・検査けんさする。input/state/constantが既知幅きちはばのroot。各かくoutput/state-next/instance-inputの要求幅ようきゅうはばと照合しょうごうする。
共有きょうゆうwireは同おなじsignal identity。再利用さいりようmoduleは異ことなるinstance identity。instance pathはowner module instanceと宣言せんげんordinalで一意いちいにし、表示名ひょうじめいの連結れんけつだけでIDを作つくらない。
5. stepと時間じかん
状態じょうたいq_k、入力にゅうりょくu_kに対たいし、組合くみあわせgraphからy_kとnext値ちを計算けいさんし、結果けっかとして(q_{k+1},y_k)を返かえす。全ぜんstateは同時更新どうじこうしん。stateを逐次上書ちくじうわがきして後続こうぞくのnext計算けいさんへ影響えいきょうさせない。
initial(PreparedNetlist) は、entryを選えらんでelaborateした全ぜんinstanceのstate初期値しょきちをslot順じゅんに返かえす。CheckedDesignとentryはelaborateの入力にゅうりょくであり、initialは階層展開かいそうてんかいと組合くみあわせDAG・幅はばの検査けんさを済すませた値あたいだけを受うける。step は入力にゅうりょくstateを変更へんこうせず新あたらしい値あたいを返かえす。observe は現在げんざいの出力しゅつりょくだけを返かえす純粋操作じゅんすいそうさ。入力列にゅうりょくれつと出力列しゅつりょくれつの順じゅんはmodule宣言順せんげんじゅん。
test name module ticksはそのtest開始時かいしじにinitial状態じょうたいへ戻もどす。tick inputs expectedOutputsはpre-edgeのy_kを比較ひかくしてからstateを更新こうしんする。同おなじtest内ないのticksは連続時間れんぞくじかん。別べつtestでは状態じょうたいを共有きょうゆうしない。期待列きたいれつの数かず/幅はばの不一致ふいっちはtest失敗しっぱいと別べつのInvalidTestShape。
この仕様しようは非同期ひどうきlatch、伝播遅延でんぱちえん、X/Z、アナログ挙動きょどうをモデル化かしない。これらを適当てきとうに二値にちへ潰つぶす変換へんかんは許可きょかしない。別べつmodelを導入どうにゅうするならschemaと操作そうさの版ばんを分わける。
6. NOR IRへの変換へんかん
正式せいしきなlowering先さきは4種しゅのnode(InputBit、StateBit、ConstBit、Nor2)と2種しゅのsink(nextBits、outputBits)から成なるNorNetlist。vector-level演算えんざんをbit-levelへ展開てんかいする。NextBit/OutputBitという独立どくりつnode variantは作つくらず、sink配列はいれつの各項かくこうが既存きそんnodeのindexを参照さんしょうする。StateBitとnextBitsを維持いじするので順序回路じゅんじょかいろも表現ひょうげんできる。stateの初期しょきbit列れつ、sinkの長ながさとLSBからの順序じゅんじょはモデル不変条件ふへんじょうけんに従したがう。
not a = nor a a。or a b = not (nor a b)。and a b = nor (not a) (not b)。xor a b = nor (nor a b) (and a b)。mux = (select AND yes) OR ((NOT select) AND no)。addはLSBからcarryを伝つたえるfull-adderで最終さいしゅうcarryを捨すてる。slice/concat/wireはbit参照さんしょうの配線はいせんになる。
式しきの入力順にゅうりょくじゅん、bit順じゅん、生成せいせいnode ordinalを固定こていし、同おなじ入力にゅうりょくから同おなじIRを出だす。任意最適化にんいさいてきかをreference loweringへ混在こんざいさせない。最適化さいてきかを提供ていきょうする場合ばあいは別べつoperationとして同値どうちテストとsource mapを要求ようきゅうする。
比較試験ひかくしけんは元もとのvector evaluatorとNOR evaluatorの両方りょうほうで、全小幅入力ぜんしょうはばにゅうりょく・複数ふくすうtickを比較ひかくする。NOR evaluatorを元もとのevaluatorと同おなじコードへの単たんなるaliasにしない。
7. SVG backendの配置はいち
elaborated vector-level graphを対象たいしょうに、入力にゅうりょく/stateをrank0、各組合かくくみあわせnodeを前提ぜんていnodeの最大さいだいrank+1、出力しゅつりょくを最後さいごに配置はいちする。同どうrank内ないは定義ていぎ/instance ordinal順じゅん。固定こていpaddingとlabelのscalar数すうから幅はばを決きめ、SVG textLengthを使つかって描画幅びょうがはばを明示めいじする。font依存いぞんでSVG byte列れつを変かえない。
edgeはrank間かんのlaneをordinalで割わり当あてた直交線ちょっこうせん。stateへのnext edgeは破線はせんで表示ひょうじし、組合くみあわせedgeと区別くべつする。node/edgeにはEntityIdとOriginを対応付たいおうづけ、クリックでソースに戻もどせる。最小交差数さいしょうこうさすうや最適配置さいてきはいちを保証ほしょうする算法さんぽうとはしない。
全ぜんラベルはescapeし、任意にんいscriptやURLを挿入そうにゅうしない。
8. 公開操作こうかいそうさ
lower、check、elaborate、initial、observe、step、run_tests、lower_nor、print、diagram。CheckedDesignは必要ひつようなmodule検査けんさを含ふくむ。PreparedNetlistはinstance展開てんかいと組合くみあわせDAG/幅検査済はばけんさずみ。sourceをparseしただけでsimulationを開始かいししない。