GDSII形式 - 集積回路設計のデータフォーマットについて
はじめに
皆さん、いつもお疲れ様です。本日は、EDA(電子設計自動化)の世界において非常に重要な役割を担っているGDSII形式についてご説明させていただきたいと思います。
GDSII、すなわちGraphic Design Systemとは、集積回路やチップレイアウトのデータを交換する際に使用されるバイナリファイル形式です。このGDSII形式というのは、単なるデータ形式ではなく、半導体設計の世界において三十年以上にわたって業界標準として活躍し続けている、大変重要な存在です。
本記事は、この重要な形式についての知識を体系的に整理するために作成いたしました。作成には以下の技術文献を使用しており、英語で読みにくいと感じていたので自分なりに日本語でまとめました。
- GDSII, the data format for chip and integrated circuit design - WelSim (Medium)
- GDSII Format Reference - Boolean Inc
- The GDSII Stream Format - NCTU Mathematics Department
それでは、このGDSII形式の本質を理解するために、その歴史、構造、そして実際の使用方法について、丁寧にご説明していきたいと思います。
GDSII形式の歴史と発展

GDSII形式が最初に開発されましたのは、今から四十年以上前の1980年代のことです。当時、Calmaという企業がこの形式を標準として定めました。その後の時代の流れの中で、このフォーマットの所有権は様々な企業へと移り変わってきました。具体的には、CalmaからGE、そしてValidを経由して、最終的にはCadenceという企業に受け継がれました。
このような変遷を経ながらも、GDSII形式の基本的なフォーマットと構文というものは、驚くほど安定しており、ほぼ変わることなく今日まで継続されています。これはどういうことかと申しますと、三十年以上前に設計された古いGDSIIファイルであっても、今日のツールで読み込むことができるということです。このような互換性の保持というのは、GDSII形式が持つ優れた構造設計と、その簡潔さに由来しているのです。
ご存知の方も多いかもしれませんが、OASIS形式という後継の形式が開発されました。この形式はより効率的で、ファイルサイズも小さいという利点を持っています。しかし、現在でもなお、チップの物理的レイアウトを記述する際には、GDSII形式が最も広く使用されているのです。その理由は、単に長い歴史にあるだけではなく、膨大なレガシーコードベースの存在と、ほぼすべてのEDAソフトウェアおよびハードウェアシステムが、このGDSII形式をサポートしているという点にあるのです。
GDSII形式の基本構造!

それでは、GDSIIファイルの内部構造について、詳しくご説明いたします。GDSII形式は、その簡潔さにおいて大変優れており、キーワードを用いてファイルのライブラリ、構造、および様々なパラメータを定義しているのです。
ライブラリレコード(HEADER BGNLIB LIBNAME UTITS)
-
HEADER
GDSIIファイルは、常にHEADERレコードで始まります。このレコードには、使用しているGDSIIのバージョン番号が記録されているのです。HEADER 600というような形式で記載される場合が多く、ここでの数字はバージョンを示しています。 -
BGNLIB
その次に続くのが、BGNLIBレコードです。このレコードには、ファイルが最後に修正された日時と、最後にアクセスされた日時が記録されます。このような時間情報を記録することで、ファイルの管理と追跡が容易になるのです。 -
LIBNAME
LIBNAMEレコードは、ライブラリ自体の名前を指定するものです。これにより、複数のプロジェクトを扱う場合に、どのライブラリであるかを明確に識別することができます。 -
ファイルヘッダー
ファイルヘッダーには、さらにいくつかの選択可能なレコードが存在します。REFLIBSは外部参照ライブラリについての情報を、FONTSはテキスト要素に使用するフォント情報を、ATTRTABLEは属性テーブルを、GENERATIONSはバージョン管理情報を、そしてFORMATはファイル形式についての情報を記録するものです。 -
UNITS
ファイルヘッダーで最も重要なのが、UNITSレコードです。このレコードは、ファイルで使用される単位とその精度を定義しており、ファイルヘッダーの最後に必ず配置されなければなりません。UNITSレコードでは、通常は二つの数値が指定されます。第一の数値は、ユーザーユニット(例えば、マイクロメートル)を指定し、第二の数値は、基本ユニット(通常はナノメートル)に対する変換係数を指定するのです。
以下に、ファイルの最初の部分の実例をお示しいたします:
HEADER 600
BGNLIB 10/31/2023 14:28:48 10/31/2023 14:28:48
LIBNAME WelSim_First
UNITS 0.001 1e-09
…
ENDLIB
このような構造になっているのです。HEADERからUNITSまでが、ファイルの基本情報を定義する部分であり、その後に実際のレイアウト情報を記述する構造セクションが続きます。そして、すべての構造が定義され終わりましたら、ファイルはENDLIBレコードで終了するのです。
構造レコード(STRUCTURES)
ファイルヘッダーに続く部分が、構造セクションです。各々の構造は、二つのヘッダーレコードと一つの末尾レコードによって囲まれており、その内部に様々な要素を含むことができるのです。
構造の最初のレコードはBGNSTRです。このレコードには、その構造が作成された日時と、最後に修正された日時が記録されます。この時間情報は、設計の履歴管理に役立つのです。
その次に来るのが、STRNAMEレコードです。ここで、その構造に一意の名前を付けるのです。例えば「Square」や「Circle」、「ARRAY_EX」というような名前が使用されます。
STRNAMEレコードの次から、その構造の内容が展開されます。構造内部には、BOUNDARY、PATH、SREF、AREF、TEXT、NODE、BOXという七つの要素タイプのいずれかを配置することができるのです。各要素は、チップの異なる特性を表現するために設計されており、それぞれが特定の目的を持っているのです。
そして、すべての要素の定義が終わりましたら、ENDSTRレコードでその構造を閉じるのです。その後、別の構造セクションが続くか、あるいは全ライブラリの終了を示すENDLIBレコードが現れるのです。
BGNSTR
STRNAME
...
ENDSTR
このような形式で、各々の構造が定義されていくのです。
GDSII形式の七つの要素タイプ

GDSII形式の最大の特徴は、レイアウト情報を七つの異なる要素タイプを用いて表現する点にあります。各要素タイプは、異なる目的を持っており、チップ設計のあらゆる側面を記述することができるのです。それでは、これらの要素について、一つずつ丁寧にご説明いたします。
第一要素:BOUNDARY(境界要素)
BOUNDARYは、填められた多角形を定義する要素です。つまり、この要素を使用することで、チップの固形部分、例えば金属層や半導体層の形状を表現することができます。
BOUNDARYレコードで始まる境界要素は、その後、いくつかの選択可能なレコードを含むことができます。ELFLAGSは要素フラグを、PLEXはプレックス情報を記録するものですが、これらは多くの場合、使用されません。
その後、必ず含まれなければならないレコードが三つあります。最初のLAYERレコードは、この境界がどのレイヤーに属するかを指定するものです。レイヤー番号は0から63の範囲で指定されます。異なるレイヤーは、異なる材料や工程ステップを表現します。例えば、レイヤー0は最下層の金属かもしれず、レイヤー1は次の層の金属かもしれません。
DATATYPEレコードは、ほぼすべての場合において、その値は0に設定されます。このレコードは、バージョン互換性のために存在しているのですが、現代的な使用方法では、ほぼ意味を持たないのです。
最後に、XYレコードが存在します。このレコードには、四組から二百組の座標ペアが含まれる可能性があります。これらの座標ペアは、多角形の輪郭を定義するのです。座標は、X座標とY座標の組み合わせで表記されます。非常に重要な点として、多角形は必ず閉じていなければならないため、最初の座標と最後の座標は同じ値でなければならないのです。これにより、多角形の形状が完全に閉じた領域を表現することが保証されるのです。
以下に、実例をお示しいたします:
BOUNDARY
LAYER 0
DATATYPE 0
XY 0: 0
0: 1000
2000: 1000
2000: 0
0: 0
ENDEL
この例では、(0, 0)、(0, 1000)、(2000, 1000)、(2000, 0)という四つの頂点を持つ四角形が定義されており、最後に(0, 0)に戻ることで、多角形が完全に閉じているのです。これは、幅2000単位、高さ1000単位の矩形を表現しているのです。

第二要素:PATH(パス要素)
PATHは、非ゼロの幅を持つ開いた図形を表現する要素です。これは、主に導体配線、つまり金属層での配線を配置するために使用されるのです。回路設計において、異なる部品を接続するための配線は、非常に重要な役割を担っているのです。
PATHレコードで始まるパス要素は、その後、選択可能なELFLAGSおよびPLEXレコードを含むことができます。次に、LAYERレコードが必ず含まれなければなりません。これにより、このパスが何の材料で構成されるのかを指定するのです。
さらに、DATATYPEレコードとXYレコードが必ず存在しなければなりません。XYレコードには、二組から二百組の座標ペアが含まれ、パスの経路を定義するのです。BOUNDARYとは異なり、パスは開いた形状であるため、最初と最後の座標が同じである必要はないのです。
XYレコードが指定される前に、二つの選択可能なレコードが存在することがあります。最初はPATHTYPEレコードです。このレコードは、パスセグメントの端点の性質を記述するのです。その値が0である場合、セグメントはパスの頂点で終わる正方形の端点を持ちます。値が1の場合、丸い端点になり、値が2の場合、幅が半分に等しい正方形の端点になるのです。異なるPATHTYPEを使用することで、視覚的により美しい、あるいは機能的により優れた配線を表現することができるのです。
WIDTHレコードは、パスの幅を定義するものです。通常、この値は正の整数で指定されます。もし幅の値が負である場合、その値は他の構造に依存することなく、独立してスケーリングされるという特殊な動作をするのです。
以下に、パス要素の実例をお示しいたします:
PATH
LAYER 1
DATATYPE 0
PATHTYPE 0
WIDTH 500
XY 0: 0
0: 10000
20000: 0
18000: 15000
8000: 15000
ENDEL
この例では、幅500単位の配線が、(0, 0)、(0, 10000)、(20000, 0)、(18000, 15000)、(8000, 15000)という五つの点を経由して描画されているのです。PATHTYPEが0に設定されているため、各々の曲がり角は正方形の端点を持つことになります。

第三要素:SREF(構造参照要素)
SREFは、構造参照を表現する要素です。これは、GDSII形式における階層構造を実現するための非常に重要なメカニズムなのです。チップの設計においては、同一のパターンが何度も繰り返されることが多いのです。例えば、メモリセルやロジックゲートなど、基本的な構成単位が数百万回も繰り返されるのです。そのような場合、同じレイアウト情報を何度も記述するのではなく、一度定義した構造を参照することで、ファイルサイズを大幅に削減できるのです。
SREFレコードの後には、選択可能なELFLAGSおよびPLEXレコードが続きます。その次に、SNAMEレコードが存在します。SNAMEには、参照される構造の名前が記載されるのです。例えば、「Circle」や「Square」という名前の構造を参照する場合、「SNAME Circle」というように記載されるのです。
XYレコードには、単一の座標ペアが含まれます。この座標は、参照される構造の配置位置を指定するのです。つまり、参照先の構造の原点が、このXY座標に配置されることになるのです。
XYレコードの前に、選択可能な変換レコードが存在することがあります。構造に変換を適用する必要がある場合、STRANSレコードが最初に現れるのです。STRANSレコードには、構造を反転させるかどうかの情報が含まれ、その後にMAGレコード(倍率)やANGLEレコード(角度)が続く可能性があります。
以下に、SREF要素の実例をお示しいたします:
BGNSTR 10/31/2023 14:28:48 10/31/2023 14:28:48
STRNAME Square
SREF
SNAME Circle
XY -10000: 5000
ENDEL
BOUNDARY
LAYER 0
DATATYPE 0
XY -15000: 0
-15000: 10000
-5000: 10000
-5000: 0
-15000: 0
ENDEL
ENDSTR
この例では、「Square」という名前の構造内に、「Circle」という名前の構造への参照が含まれています。その参照は、座標(-10000, 5000)に配置されているのです。同時に、Squareには境界要素も含まれており、この構造は複数の要素から成り立っているのです。
【図の指示】階層構造を示す図を作成してください。最上位の「Square」構造の内部に、「Circle」構造への参照が含まれている様子を、ネストされたボックス図で表現するのが良いでしょう。さらに、SREFの座標がどのように相対位置を決定するのかを示す矢印や数値も含めるとより分かりやすくなります。
第四要素:AREF(配列参照要素)
ARIFは、配列参照を表現する要素です。SREFが単一の構造参照を表現するのに対し、ARIFは、一次元または二次元の構造配列を配置することができるのです。これは、特に集積回路のレイアウト、特にメモリなどで、同一の構造が規則的に繰り返される場合に非常に有用なのです。
例えば、メモリは、多くの場合、行と列の格子状に配列されたセルで構成されています。ARIFを使用することで、このような規則的な配列を、効率的に記述することができるのです。
ARIFレコードの後には、選択可能なELFLAGSおよびPLEXレコードが続きます。その次に、SNAMEレコードが存在し、配列される構造の名前を指定するのです。
その後、選択可能な変換レコードが続きます。STRANS(反転情報)、MAG(倍率)、およびANGLE(回転角度)レコードにより、配列内の各インスタンスの向きや倍率を指定することができるのです。
最も重要なレコードがCOLROWです。このレコードには、配列の列数と行数が指定されるのです。例えば「COLROW 5 3」と書かれている場合、五列三行の配列が作成されるのです。
最後に、XYレコードが存在します。このレコードには、三つの座標ペアが含まれます。第一の座標は、原点インスタンスの座標です。第二の座標は、列方向の最後のインスタンスの座標です。第三の座標は、行方向の最後のインスタンスの座標です。これら三つの座標により、配列全体のサイズと位置が決定されるのです。
以下に、AREF要素の実例をお示しいたします:
BGNSTR 10/31/2023 11:56:33 10/31/2023 11:56:34
STRNAME ARRAY_EX
AREF
SNAME WELSIM_RECT
ANGLE 10
COLROW 5 3
XY 0: 0
20000: 0
0: -10000
ENDEL
ENDSTR
この例では、「WELSIM_RECT」という名前の構造が、十度回転させられて、五列三行の配列として配置されているのです。原点は(0, 0)に、列方向の最後は(20000, 0)に、行方向の最後は(0, -10000)に配置されています。これらの座標から、配列の間隔が自動的に計算されるのです。


第五要素:TEXT(テキスト要素)
TEXTは、回路にテキストラベルを含めるための要素です。これは、デバイスの機能説明や、特定の領域の識別などに使用されるのです。
TEXTレコードで始まるテキスト要素は、その後、選択可能なELFLAGSおよびPLEXレコードを含むことができます。次に、必須のLAYERレコードが続きます。その後、パラメータが零に設定されたTEXTTYPEレコードが現れるのです。
選択可能なPRESENTATIONレコードは、テキストのフォント情報を指定するものです。その他にも、選択可能なPATHTYPE、WIDTH、STRANS、MAG、およびANGLEレコードが存在し、テキストの外観や位置を細かく調整することができるのです。
最後に、二つの必須レコードが存在します。XYレコードには、テキストを配置する座標が単一のペアで指定され、STRINGレコードには、実際のテキスト内容が記載されるのです。
以下に、テキスト要素の実例をお示しいたします:
TEXT
LAYER 0
TEXTTYPE 2
PRESENTATION 0
XY 5000: 3000
STRING WelSim label
ENDEL
この例では、「WelSim label」というテキストが、座標(5000, 3000)に、レイヤー0に配置されているのです。
テキスト要素は、設計図面の注釈や、コンポーネントの識別に使用されるもので、実際の製造には影響を与えないものがほとんどですが、設計者の意図を明確に伝えるために、大変重要な役割を果たしているのです。
第六要素:NODE(ノード要素)
NODEレコードは、回路情報を指定するための要素です。この要素に含まれる情報は、グラフィカルなものではなく、製造されるチップに直接的な影響を与えるものではないのです。その代わり、ノード要素は、他のCADシステムがトポロジー情報を利用する際に有用なのです。
トポロジー情報とは、回路がどのように接続されているかという情報のことです。これは、回路シミュレーションや電気検証を行う際に重要になるのです。
NODE
LAYER 21
NODETYPE 1
XY 123000: 124500
123000: 103500
126000: 103500
126000: 124500
123000: 124500
ENDEL
ノード要素の詳細については、本記事の範囲を超えておりますため、ここでは説明を割愛させていただきます。
第七要素:BOX(ボックス要素)
BOXは、GDSIIファイルに含まれる最後の要素タイプです。BOXレコードの後には、選択可能なELFLAGSおよびPLEXレコードが続きます。次に、必須のLAYERレコードが存在します。
BOXレコードには、パラメータが零に設定されたBOXTYPEレコードと、XYレコードが含まれるのです。XYレコードには、閉じた矩形を描写する五つの座標ペアが含まれなければなりません。矩形の四つの頂点と、矩形を閉じるための最初の頂点への戻りで、合計五つの座標となるのです。
重要な点として、ボックスは填められた図形ではなく、単なる枠線として表現されるのです。つまり、BUOUNDARYのように内部が填められるのではなく、輪郭線のみが描画されるのです。そのため、ボックスは、集積回路の幾何学的形状を記述するために使用されるのではなく、別の目的で使用されるのです。
BOX 43 2
92000 -7000
106000 -7000
106000 19000
92000 19000
92000 -7000
ENDEL
GDSII形式の実用的な活用
ここまで、GDSII形式の理論的な側面についてご説明いたしました。では、実際の設計現場において、どのようにしてGDSIIファイルを読み込み、書き込むのかについても、ご説明いたします。
GDSIIファイルの読み書きにおける利用可能なツール
商用ソフトウェアベンダーに加えて、無償で利用できるGDSIIツールが多数存在するのです。これらのツールは、エディタ、ビューア、二次元レイアウトデータを汎用の三次元フォーマットに変換するユーティリティ、バイナリフォーマットを可読性の高いASCIIフォーマットに変換するユーティリティ、およびライブラリなど、多岐にわたるのです。
実際の使用と検証を通じて、以下のようなツールが特に有用であることがわかっております。
KLayout - オープンソースの統合ビューアエディタ
KLayoutは、最も有名なオープンソースの回路レイアウト可視化、編集ツールです。ユーザーフレンドリーなインターフェースが特徴で、初心者にとって非常に使いやすいです。さらに素晴らしい点としてオープンソースコードとして公開するため、学習のために活用することもできます。
gdstk - C++ベースのGDSライブラリ
gdstkは、オープンソースのGDS I/Oライブラリであり、C++をベースとしながらも、フレンドリーなインターフェースを備えています。そのため、商用的なGDS関連プロジェクトにおいても、安心して使用することができます。さらに素晴らしい点として、Pythonバージョンも利用可能なのです。C++の高速性とPythonの開発効率を、プロジェクトの要求に応じて選び分けることができるのが特徴です。
GDS3D - リアルタイム3D可視化ビューアー
GDS3Dは、標準的なGDSIIファイルを3D可視化できるアプリケーションです。その最大の特徴は、ICレイアウトを3次元で立体的に描画することにより、複雑な層構造を直感的に理解することができる点にあります。GDSIIファイルに加えて、プロセス定義ファイルと呼ばれるテクノロジーファイルを組み合わせることで、各層の3D物理パラメータ(高さ、厚さ、色など)を正確に表現することが可能です。
GDSII形式の設計と優位性
なぜ、GDSII形式がこのように長く、広く使用され続けているのかについて、その本質的な理由をご説明したいと思います。
簡潔で優れた構造設計
GDSII形式の最大の強みは、その簡潔性にあります。複雑さを避け、必要な情報を効率的に表現するという設計思想は、三十年以上経った今でも多くのツールに支持されています。シンプルな構造ゆえに、新しいツールを開発する際の障壁が低く、多くの企業や団体がGDSII対応ツールを開発できます。
バイナリ形式による効率性
GDSII形式がバイナリフォーマットであるという点も、その採用を促進した重要な要因です。バイナリフォーマットはテキストフォーマットと比べてファイルサイズを大幅に削減できます。大規模なチップ設計では数ギガバイト単位のレイアウトデータを扱うことが珍しくなく、バイナリフォーマットにより転送速度の向上とストレージ容量の削減が実現されます。
階層構造による設計の柔軟性
SREFおよびAREFを用いた階層構造の実装により、設計の再利用性が大幅に向上します。同一のセルを何度も使用することで、ファイルサイズを削減できるだけでなく設計の一貫性を保つことができます。例えばメモリセルの設計を変更する場合、親のセルを一度修正するだけで、すべてのインスタンスが自動的に更新されます。
互換性と継続性
長年にわたる互換性の維持により、古いレイアウトデータを新しいツールで読み込むことができます。このような継続性は設計資産の長期的な保護となります。設計企業は数年前に設計したレイアウトを、今日のツールで再利用することが可能です。
まとめ
GDSIIについて、その歴史から実用的な活用方法まで説明してきました。
GDSII形式は単なるファイルフォーマットではなく、半導体設計の世界で三十年以上にわたって信頼され、使用され続けている技術的な基盤です。その簡潔な設計、バイナリフォーマットの効率性、そして階層構造の柔軟性は、多くの革新的なEDAツールの土台となっています。
EDA(電子設計自動化)ツール開発に携わる者にとって、GDSIIフォーマットの知識は必須です。このフォーマットを深く理解することで、より効果的で革新的なツール開発が可能になります。GDSIIという基本に立ち返り、その本質を理解した上で新しい技術と組み合わせることで、より良い設計環境を作ることができるのです。
Discussion