KLayout:OpenRule1umのget_referenceについて
ここはKLayoutで使うOpenRule1umに含まれるget_referenceが行っていることをメモして共有するためのページです。行っていることすべてを書いているわけではありませんが、ちょっと変更したいときや改良時などに参考にしてください。
KLayoutでLVSを行う際にはレイアウトから抽出した回路の接続情報と比較するための参照ネットリストが必要です。KLayoutには回路図を描く機能は無いため、他のツールから出力したり、別途、回路図を描いてネットリストを出力したりして、参照ネットリストを用意する必要があります。
他のツールから出力したネットリストには、KLayoutのLVSに対応していない部分や、LVSを正しく行うためにネットリストを修正しなければなりません。それを自動的に行うのがget_referenceです。
実行時Tips
実行方法1:KLayoutの"Macros"→"OpenRule1um_Macros"→"get_reference: prepare~"をクリックして実行。開かれるウィンドウにて、参照ネットリストを選択する。
実行方法2:KLayoutの"Macros"→"Macro Development"を開き、ウィンドウ左の"Technology OpenRule1um~"のフォルダを展開、"get_reference"をダブルクリックして開く。ウィンドウ上側にある、再生ボタンに!が付いたボタン(Run script from the current tab (Shift+F5))で実行。
L51(51行目)にて、参照ネットリストを選択するウィンドウにて、開かれるパスを指定できる。デフォルトではコメントアウトされている。LVSを何度も行うとき、必要に応じて各自設定しておくとスムーズにネットリストを選択できる。
デフォルトでは環境変数"Home"のパスを開くようになっている。LVSを何度も行うとき、必要に応じて各自設定しておくとスムーズにネットリストを選択できる。
open_dir = '' のように空欄にすると、GDSファイルのあるフォルダが開かれる。次回以降は最後に開いたフォルダが常に開かれるようになる。
具体的に行っていること
https://makelsi.github.io/images/docs/KLayout/get_reference_fig.png
KiCad Eeschema & KLayout を使ったLSI設計 で作るインバータ(NOT)回路を例にすると、まず、KiCadのEeschemaでインバータの回路図を描いて、ネットリストを出力します。このネットリストを「回路ネットリスト」と呼ぶことにします。また、LVSで使用する回路図から出力したネットリストを「参照ネットリスト」、レイアウトから出力したネットリストを「抽出ネットリスト」と呼ぶことにします。 get_referenceでは、回路ネットリストを選択して内容を修正し、参照ネットリストとして生成します。またこの時、設定ファイル類も同時に生成し、LVS実行時にそれらを読み込んでスムーズに実行できるようになっています。KLayoutでLVSを実行する際はこの参照ネットリストと抽出ネットリストを使います。
スクリプトの内容に関するメモ
ネットリストに@, %, -が含まれるとエラーが起きるのでそれぞれ$, $, _に置換する。
PMOS, NMOSのmパラメータは対応していないため、mパラメータの記述は削除し、ゲート幅wをもとのゲート幅×m倍に修正する。
ネットリストにsubckt行が無い場合は、記述されている回路がトップセル(subckt .TOP として認識)として処理する。その処理を行っているのは以下の記述。
code:Ruby
f.puts " same_circuits '#{cell.name}', '#{circuit_top ? circuit_top.upcase : '.TOP'}'"
レイアウトのトップセル名と同じ名前のsubckt名が定義されておらず、かつ、トップセル名と異なるsubckt名が定義してある場合、その回路はコメントアウトする。
Eeschemaから出力したネットリストには".title KiCad schematic"が一行目に入るが、LVSを通してもエラーは出ない。しかし、一応コメントアウトする処理を行う。
Eeschemaから出力したネットリストには".end"が入り、LVSを通してもエラーは出ないが、一応".ends"に変更する処理を行う。
.paramで定義されたパラメータは、KLayoutではサポートされていないため、変数の呼び出し部分を値に置き換えている。ただし、変数の呼び出しにおいて変数名を例として"val"だとすると、"{val}"というように、中括弧で変数のみを囲った部分しか置換されないため注意(v1.7時点)。
実行するとGDSファイルのあるフォルダにフォルダ・各種ファイルが生成される。「GDS_filename_without_ext」はGDSファイルの拡張子を除いたファイル名の文字列、「refnet_netlist」は参照ネットリストとして選択したネットリストの拡張子を含むファイル名の文字列です。
lvs_work
(GDS_filename_without_ext)_lvs_digital_setting.rb:lvs_digital実行時設定用コード
(GDS_filename_without_ext)_lvs_analog_setting.rb:lvs_analog実行時設定用コード
(GDS_filename_without_ext)_reference.cir.txt:生成した参照ネットリストのハードリンク(orシンボリックリンク)
(refnet_netlist).txt:参照ネットリストのハードリンク(orシンボリックリンク)。".inc"を含む行をコメントアウトしたもの
(GDS_filename_without_ext).yaml:参照ネットリストファイルのパスなどの記録
(GDS_filename_without_ext)_reference.cir:参照ネットリストを修正し、生成したネットリストファイル
コードの細かい部分のメモ
"00.chr"はNULL文字を表す。
文字列マッチで後方参照($1, $2など)を使う必要があるときは =~ を使う。後方参照を使わない時は.match?()メソッドが可読性高い。どちらも正規表現対応。
参考ページ
Klayoutでのレイアウト接続検証:
KLayoutもう一つのチュートリアル:
History
2021/2/25 Okawa:ページの作成。
2021/3/12 Okawa:修正と追記。
2021/3/15 Okawa:修正と追記、図の追加。