1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

KLayout の Python API を試してみた!(PCell Library)

1
Last updated at Posted at 2025-12-18

1990年、NHKが「電子立国日本」と持て囃した半導体業界に 30年ぶりにスポットライトが当たっています。舞台に立っているのは最先端製造技術ですが、ここでは裏方として舞台を支えてきた製造+設計の橋渡し役である PDK や半導体の開発コスト構造、レガシー半導体の活用等々、製造技術に偏りがちの半導体を設計やビジネス面からの切り口で論考を上げて来ました。今回は、生業である設計エンジニアから見たオープンソース EDA ツールである KLayout の Python API に関して簡単に紹介したいと思います。設計者だけでなく、製造やプロセス開発畑の方にも参考になる内容に膨らましていますので、ご笑読頂ければ幸いです。

なお、本内容は、過去の業務経験を元にした、個人的意見・見解の表明であり、いかなる組織を代表したものではありません

第一回の「Klayout の Python API を試してみた!」では、Layout と Cell Class に関して解説。第二回では Instance Class に関して解説。第三回では Pcell のパラメーター変更とファイルの保存を試して見ました。第四回では Python API で PCell を作って、Library に保存して見ます。

PCellDeclarationHelper

今回は PCellDeclarationHelper を使って PCell を作成してみます。PCell のパラメーターとしてLayer と Width を与えて BOX を描画する PCell を作成します。

#! /usr/bin/env python3
# 
import sys
import pya
import klayout.db  as db
#
class PTEST(db.PCellDeclarationHelper) :

    def __init__(self):
        #
        super(PTEST, self).__init__()
        #
        self.param("w", self.TypeDouble, "Width", default = 1.0)
        self.param("l", self.TypeLayer,  "Layer", default = db.LayerInfo(1, 0))

    def display_text_impl(self):
        return "BOX (l=%s,w=%10f)" % (str(self.l), self.w)

    def produce_impl(self):
        self.cell.shapes(self.l_layer).insert(db.DBox(-self.w/2, -self.w/2, self.w/2, self.w/2))

class TestLib(db.Library):

    def __init__(self):
        self.description = "Test library"
        self.layout().register_pcell("TEST", PTEST())   # register PTEST PCell
        self.register("TestLib")

# create and register the library
lib = TestLib()
# ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- 
# Pcell place to TOP
#
ly    = db.Layout()  
args  = sys.argv
ofile = args[1]
#
top = ly.create_cell("TOP")
cl  = ly.create_cell("TEST", "TestLib", {  })
top.insert(db.DCellInstArray(cl.cell_index(), db.DTrans(db.DVector(0, 0))))
#
ly.write(ofile)
#
exit

前半で、PTEST という PCell を生成して、TestLib という Library に登録しています。後半では、生成した PTEST PCell を TOP セルに配置して、それを GDSII ファイルに書き出します。実行してできた GDSII を開くと

Screenshot 2025-12-05 at 16.32.44.png

BOX データができていますが、本来の PCell の機能である Parameter の変更ができません。TestLib という Library が GUI 側で登録されていない為です。

.klayout

Python API で作成した TestLib として GUI で認識させる為に、.klayout/pymacros の下に XXXX.lym (XXXは何でも良い)を作ります。

<?xml version="1.0" encoding="utf-8"?>
<klayout-macro>
 <description>TR-1um</description>
 <version/>
 <category/>
 <prolog/>
 <epilog/>
 <doc/>
 <autorun>true</autorun>
 <autorun-early>false</autorun-early>
 <priority>0</priority>
 <shortcut/>
 <show-in-menu>false</show-in-menu>
 <group-name/>
 <menu-path/>
 <interpreter>python</interpreter>
 <dsl-interpreter-name/>
 <text>
# TR-1um PCell v0.001
# Original version was made by jun1okamura 
# LICENSE: Apache License Version 2.0, January 2004,
#          http://www.apache.org/licenses/
# ----- ------ ----- 
# %include TestLib.py
#----
 </text>
</klayout-macro>

# %include 文で前述の Python コードの前半部分を TestLib.py として読み込みます。

import klayout.db  as db

class PTEST(db.PCellDeclarationHelper) :

    def __init__(self):
        #
        super(PTEST, self).__init__()
        #
        self.param("w", self.TypeDouble, "Width", default = 1.0)
        self.param("l", self.TypeLayer,  "Layer", default = db.LayerInfo(1, 0))

    def display_text_impl(self):
        return "CONT (l=%s,w=%10f)" % (str(self.l), self.w)

    def produce_impl(self):
        self.cell.shapes(self.l_layer).insert(db.DBox(-self.w/2, -self.w/2, self.w/2, self.w/2))

class TestLib(db.Library):

    def __init__(self):
        self.description = "Test library"
        self.layout().register_pcell("TEST", PTEST())   # register PTEST PCell
        self.register("TestLib")

# create and register the library
lib = TestLib()

以上の準備をした後に、先程の GDSII を開くと

Screenshot 2025-12-05 at 16.45.22.png

Library paneTestLib が登録されています。また PCell の機能である Parameter の変更もできます。ちなみに w = 2.0 に変更して見ると。

Screenshot 2025-12-05 at 16.44.51.png

ちゃんと PCell として動作します。

今回は、Python API を使って、Pcell の生成と TOP セルへの配置、PCell Library の GUI への登録の仕方を試しました、

Basic PCell, again

前回のコードに戻って Basic PCell を配置して GDSII に出力します。その後、klayout.lib を import した以下のコードを実行してみると。

#! /usr/bin/env python3
import sys
import klayout.db as db
import klayout.lib          # loading the library
#
ly    = db.Layout()  
args  = sys.argv
#
ifile = args[1]
#
ly.read(ifile)
#
print(ly.library())

if ly.top_cell() != None :
    for inst in ly.top_cell().each_inst() :
        print("CELL: %-10s PCELL:" % inst.cell.name, inst.is_pcell())
        #

exit

実行すると...

% ./TEST8.py test.gds
None
CELL: TEXT       PCELL: True

このように、GDSII を作成した際につかった PCell librry を Python API に import することで、Python API 内で、read した GDSII の 元PCell を PCell として編集できるようになります。つまり、.klayout/pymacros の下に配置した、オリジナルの Python PCell を import することで、GUIPython API の間で同じ PCell library を利用できるようになります。

まとめ

Python API を使って GDSII ファイルの内部構造へのアクセスを試してみました。Cadence の Skill と同じく、EDA ツールの Layout データに直接アクセスできる手段があると、設計の効率を上げるツールを自ら開発することが可能になります。チュートリアルが乏しいことは、少し残念ではありますが、振り返ると 1987 年に導入した Cadence の前身の SDA 社の Edge ツール で Skill 言語を学んだ時も、資料が乏しい中で Cut & Try だった事を思い出しています。皆さんも是非挑戦して見て下さい。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?