#2020/11/25注
gdspyの作者@heitzmannが現在新プロジェクトgdstkに注力しているため、筆者もgdstkに乗り換えた。gdspyに比べgdstkは爆速なので、よろしければ次の記事gdstkでPython最速のGDSII layout制作環境を作るを参照されたい。
#はじめに
本稿は、PythonでGDSII formatを扱うの続きである。gdspyライブラリがインストールできたことを前提に、はじめてのGDSファイルを作ってみる。
まず、原稿執筆時点(2020年2月16日)でgdspyの最新バージョンは1.5.2である。1.5から設計思想がだいぶ変わったらしく、以前のバージョンで作ったスクリプトはそのままでは動かない。gdspyのオフィシャルにあるスクリプトですら現時点で正しく動かないので、取り急ぎ動くようにしたバージョンのみ下記に挙げる。
import gdspy
# The GDSII file is called a library, which contains multiple cells.
lib = gdspy.GdsLibrary()
# Geometry must be placed in cells.
cell = lib.new_cell('FIRST')
# Create the geometry (a single rectangle) and add it to the cell.
rect = gdspy.Rectangle((0, 0), (2, 1))
cell.add(rect)
# Save the library in a file called 'first.gds'.
lib.write_gds('first.gds')
# Optionally, save an image of the cell as SVG.
cell.write_svg('first.svg')
# Display all cells using the internal viewer.
gdspy.LayoutViewer(lib)
<- ここ1行だけオフィシャルから変えた
#GDSファイルの構成
GDSファイル(GDS IIフォーマット)の詳細については、参考サイトを見てほしいが12、大まかにいうと
ライブラリ
├セル
├ジオメトリ
という構成になっている。ライブラリが、1つのGDSファイル全体を指す。ジオメトリは個々の図形(多角形、円形、etc, etc,...)であり、セルはジオメトリをまとめたものである。
通常、GDSはTopという名前のCellを持ち、これがライブラリ全体を記述するCellとなる。Topセルにはライブラリか、他のセル(サブセルという)への参照(リファレンス)が含まれる。つまりセルには階層構造が許されているので、適切に利用することができればファイルサイズの効率化につながる。、
#gdspy 1.4 と1.5以降で何が変わったか
1.4までは、取り扱うGDSのライブラリをグローバルなクラスとして取り扱っていたのだが1、1.5以降は明確にローカルなクラス lib = gdspy.GdsLibrary()
として取り扱われるようになった。それに伴い、オフィシャルのドキュメント含めそのままでは動かないコードが多々ある。当然、サブルーチン(関数)へ渡す時も変更が必要だし、CellReferenceなどの使い方が大きく変わっている。
今後、gdspy2.0へのアップデートが予定されており、変更点はさらに増大すると思われる。詳しくはGitHubでソースを見てほしい~~(それを言ったらおしまいである)~~。
#Python/GdspyでGDSファイルを取り扱う上での注意
前節で、 lib = gdspy.GdsLibrary()
はローカルなクラスとして取り扱われると述べたが、原稿執筆時点では問題も多い。まず、gdspy.GdsLibrary には、コンストラクタはあってもデストラクタがないようである。
つまり、forループ中でlib = gdspy.GdsLibrary()
を複数回実行した場合、以前の履歴が残っているためエラーが出る。このエラーを回避するには、Spyderで実行している場合、Pythonスクリプトの中でgdspy.GdsLibrary()の実行は1回のみにするとともに、スクリプトを実行するたびに"コンソール"->”カーネルの再起動”をするべきである3。
-
https://gdspy.readthedocs.io/en/stable/gettingstarted.html#gdsii-library ↩
-
これは私のPythonのプログラミングスキルがタコなせいかもしれないが判別できない。識者のご意見を求む。 ↩