KiCadサブ回路にも対応したネットリスト生成
メモ
以下の時点で作成。
KiCad Version: 5.1.10
ネットリストコンバータ(SpiceConverter.py HierarchicalSpice.py)Version: v0_2
ネットリストコンバータ(FlatSpice.py)Version: v0_2
注意 2022/03/08
変換処理の都合上、階層構造に基づいたネットリストの生成はあらゆる全ての回路には対応できないことが分かりました。
そのため、HierarchicalSpice.pyの使用は非推奨とします。
またそれに伴い、フラット化して1つのサブ回路としてネットリストを生成するネットリストコンバータ(FlatSpice.py)を公開しました。また、SpiceConverter.pyは、v0_4へのバージョンアップ後にHierarchicalSpice.pyにファイル名を修正しています。
以下の「初期設定」の説明は、SpiceConverter.pyのv0_2時点のものですが、FlatSpice.pyに読み替えてください。
はじめに
このネットリストコンバータは、KiCad Eeschemaで階層ラベルと階層シートを使って複数の回路を組み合わせた回路を描いたときに、その階層構造に基づいて回路をサブサーキット(subckt)化して、SPICE形式のネットリストを生成するものです。 コンバータはPythonで書かれていて、KiCad上から実行することができます。
ここでは、その初期設定と使い方などについて紹介します。
https://makelsi.github.io/images/docs/KiCad/netGen01.png
https://makelsi.github.io/images/docs/KiCad/netGen10.png
↑HierarchicalSpice.py で出力したネットリスト ※非推奨
https://makelsi.github.io/images/docs/KiCad/netGen11.png
↑FlatSpice.py で出力したネットリスト ※推奨
初期設定
まず、OpenRule1umのGitHubからコンバータをダウンロードします。コンバータは下のGitHubのリンクからダウンロードしてください。OpenRule1um/KiCad/NetlistConverter/以下にあるxxx.pyがコンバータです。
ZIPにしてダウロードするには緑のボタンの「Code」を押して、「Download ZIP」でダウンロード出来ます。
そして、適当なフォルダにxxx.pyを置いたら、KiCad Eeschemaで"ツール"→"ネットリスト ファイルを生成"をクリック、またはアイコンからネットリストの出力のウィンドウを開きます。
https://makelsi.github.io/images/docs/KiCad/netGen02.png
↑どちらの方法でも良いです↓
https://makelsi.github.io/images/docs/KiCad/netGen03.png
出てきたウィンドウにて、"プラグインを追加"をクリックして、"プラグインを参照"から先ほどのxxx.pyを選択します。
https://makelsi.github.io/images/docs/KiCad/netGen04.png
https://makelsi.github.io/images/docs/KiCad/netGen05.png
すると、"ネットリスト コマンド"には自動的に以下のように入力されます。
python "xxxxx\xxx.py" "%I" "%O"
"%O"は出力されるファイル名です。デフォルトでは拡張子を持たないファイルになるため、次のように変更してネットリストのファイル(.cirファイル)を得るようにします。
"%O" → "%O.cir"
"タイトル"には「xxx.py」のxxxの部分を入力します。
次回以降もこのネットリストコンバータを使うときは"デフォルトの出力形式に設定"にチェックを入れておくと楽です。
"ネットリストを生成"をクリックするとプロジェクトフォルダにネットリストのファイルが生成されます。
また、ショートカットキー(KiCad 5.1.10)は、
Alt → T → N
でネットリスト出力のウィンドウが開かれます。
サンプル
https://makelsi.github.io/images/docs/KiCad/netGen06.png
このページのトップも出していましたが、上の画像のようにインバータの回路図を書いたとします。この時のラベルに階層ラベルを使うと、他の回路図からこの回路を呼び出すことができます。
https://makelsi.github.io/images/docs/KiCad/netGen07.png
階層シートを使って適当な場所に描き、"ファイル名"にインバータの回路図(inv_test.sch)を相対パスで呼び出すとこのようになります。
パスの前についている"./"は現在のフォルダ、それに続く"../"は1つ上のフォルダを表していて、この回路図のフォルダの1つ上のフォルダにあるinv_test.schを指定しています。
画像の上の方にある"Sheet"の名前は、画像では変更していますが、特に理由がなければ変更する必要はありません。
https://makelsi.github.io/images/docs/KiCad/netGen08.png
"階層ナビゲータの表示"をクリックするとウィンドウが出てきて、呼び出した側の回路が"ルート"となっていて、トップ層にあることが分かります。ダブルクリックすればその回路に移動出来ます。
ここで、ネットリストを出力してみます。
KiCadに標準で入っているSpiceネットリスト(上)、HierarchicalSpice(中)、FlatSpice(下)で出力したネットリストを比べると次のような感じです。ちなみに、どのネットリストもKLayoutにおけるOpenRule1umのLVSはパスします。
https://makelsi.github.io/images/docs/KiCad/netGen09.png
KiCadに標準で入っているSpiceネットリスト出力↑
https://makelsi.github.io/images/docs/KiCad/netGen10.png
HierarchicalSpiceで出力↑
https://makelsi.github.io/images/docs/KiCad/netGen11.png
FlatSpiceで出力↑
使用上の注意など
ネットリストの生成は、内部的に生成される中間ネットリストファイルから変換して最終的に出力したいネットリストを生成します。
中間ネットリストファイルが残ってしまうので、コンバータの最後に中間ネットリストを削除するコードを追加しました。ただ、デフォルトではコメントアウトしています。(HierarchicalSpice.py v0_2時点) ※1
中間ネットリストでは階層ピン名とネットラベル名が区別できないため、ネットラベルがある場合はその回路の入出力ピンとして抽出されます。抽出されないようにするためには、ネットラベルの名前を"Net"から始まる名前にしてください。
基本的にOpenRule1umのシンボルで書かれた回路のみ(SPICEモデルが指定されているシンボルのみの回路)に対して使ってください。特に、KiCadの標準ライブラリのRやCなどではValueフィールドに定数を書くようになっていて、そのようなシンボルが回路に含まれていると、エラーによりコンバータの実行が途中で強制終了します。
検証を少しずつ行いながら開発を行っているため、まだバグ等があるかもしれません。もし、バグが見つかった場合はMakeLSI:のDiscord等で教えていただけると嬉しいです。
HierarchicalSpice.py にのみに関する注意など (非推奨の理由なども)
サブ回路の入出力ピン名は、コメントとしてネットリストにも出力されますが、トップ層以外の回路には出力されません。中間ネットリストにおいて、ピン名は最上位層のピン名で上書きされるため、すべてのサブサーキットに入出力ピン名をつけることができません。
階層シートのピン同士を直接接続している配線がある回路図では使用しないでください。テストベンチのような回路図ではこのような結線が含まれる可能性が高いです。そのような配線があると、それらの階層シートのIOピンを正しく抽出できません。これは、中間ネットリストファイル内ではそのような配線が同一の名前になり、階層シート内で使われるシンボルの端子につながる配線の名前から階層シートのIOピンを抽出しようとしても、階層シートの内側で接続されているのか外側で接続されているのか区別ができないためです。それにより、階層シートの階層ピンも正しく抽出できません。また、そのような配線があった場合、エラーが出るようにしました(v0_4時点)が、エラーの発生条件を十分に検証できていないため、正しくないネットリストを生成する可能性があります。(しかしながら、テストベンチ以外の回路では最初に書いたような結線は考えにくい気がするので、困ることは少ないと思っています。)
階層シートの階層構造に基づいてサブ回路化してネットリストを生成するというのは、原理的に出来ないわけではありません。それを実装するためには中間ネットリストに含まれる情報だけでは足りず、回路図ファイルも解析して、含まれているすべてのコンポーネントの各端子が、どういう階層ピンを経由して接続されているかを知る必要があります。しかし、それを実装してしまうと、いわば、中間ネットリストのジェネレータの再開発になってしまいます。標準で用意されているのは、中間ネットリストから変換し、任意のフォーマットのネットリストを生成することなので、あらゆる回路への対応はいったん保留としました。
開発メモ
コンバータは、XSLTとPython (KiCad 5.1.10では2系)で作ることが出来るようだが、XSLTはVer. 1.0の環境しかないようで、".iter"などが使えない。そのため、抽出済みの入出力ピンと未抽出の入出力ピンを区別して条件分岐する必要があるが、それを実装できない。
中間ネットリストには、回路上に書き込んだテキストなどは含まれないため、SPICEモデルファイルの読み込み(.include xxx, param xxx)などを出力すことはできない。そのため、このコンバータで出力したネットリストファイルの用途はLVS等に限られると思われる。LTspiceなどの外部シミュレータに読み込ませる場合は、標準のSpiceネットリスト出力で出力する。
回路図にて"Net_xxx"というネットラベルを付けると、KiCad 5.1.10で出力された中間ネットリストでは"/Net_xxx"という表現になるが、KiCad 6.0.2ではそのまま"Net_xxx"という表現になり、"/"が付く場合と付かない場合がある。
ToDo(?)
※1の対応
KiCad 6 での検証
History
・2022/02/06:Okawa作成。Ver1.0
・2022/03/02:使用上の制約などを追記。Okawa
・2022/03/08:FlatSpiceの公開に伴う修正と追記。Okawa