介绍

25 多年来,GDSII 一直是 IC 布局的行业标准数据库。虽然已经提出了其他格式来替代它(其中一种格式,OASIS,似乎正在获得一些牵引力)GDSII 仍然是迄今为止描述用于构建芯片的掩模的物理布局的主要方式。

尽管 GDSII 不是一个开放的行业标准,但它是由 Calma 在 80 年代开发的,并且多年来该规范的所有权从 Calma 转移到 GE 到 Valid 到 Cadence。如果您问对了人,您甚至可以从 Cadence 获得 GDSII 规范的副本,尽管我一直在使用我在 1989 年Xeroxed ®的规范副本。

自 1989 年以来的改进和改进?

据我所知,自 1989 年以来,GDSII 规范没有进行过正式更新。正如您可以想象的那样,从那时起,计算机和处理器已经取得了长足的进步。该规范有一些限制,这可能是基于 80 年代计算机的局限性,以及开发人员认为芯片在可预见的未来将具有大致相同的复杂性的信念。

幸运的是,创建数据库的方式使用户能够扩展许多法律限制,同时保持与实际架构基础的事实上的兼容性。

简单

在某种程度上,GDSII 的长寿命是由于其优雅的架构和简单性。优雅的架构使其能够支持当今具有数十亿多边形的现代芯片,而简单性使程序员能够编写代码来操作 GDSII 并使用它完成开发人员无法想象的事情。这种庞大的遗留代码库可能是减缓向替代方案(尤其是 OASIS)过渡的原因。

GDSII的基本性质

如果你不得不用几句话来描述 GDSII,那么这些可能是很好的选择:

整数数据库

GDSII 是一个整数数据库。基本测量单位是纳米(10 -9米)

由于使用四字节有符号整数来描述坐标,因此整数坐标的范围可以从负 2 31到正 2 31 -1。(二进制补码)

分层的

GDSII 以分层方式组织。也就是说,将多个元素组合成一个单元或结构,然后多次引用(或实例化或放置)该结构。由于数字 IC 非常重复,数据库非常有效地匹配物理布局方法。

单元格可以嵌套,对嵌套的深度没有限制(尽管我还没有看到嵌套超过 9 层。)

正是这种嵌套和层次结构允许人们使用大约 5 GB 的数据库来描述具有 10 亿个多边形的 IC …

不幸的是,当需要计算多边形实体的实际位置时,必须“反转”这种嵌套;对于大型数据库,事实证明这是一个难以快速完成的计算。

二进制

为了紧凑,数据库是二进制的。这意味着任何用于读取或写入 GDSII 的软件都必须能够提取每个字节并解释这些位。

没有与二进制格式等效的官方 ASCII。各种公司(包括 Artwork)已经为那些希望使用 Perl、awk 或 Python 等工具来处理 GDSII 数据的人开发了自己的 gdsii二进制-ascii 转换器。

基于记录

GDSII 分为“记录”。只有少数记录类型构成了 GDSII 数据的绝大部分。我在这里列出了重要的:

在 GDSII 文件开头使用过一次的记录。记录号显示在括号中。

BGNLIB[1]
LIBNAME[2]
UNITS[3]
ENDLIB[4]

用于开始/结束结构的记录

BGNSTR[5]
STRNAME[6]
ENDSTR[7]

结构内实体的记录

BOUNDARY[8] [LAYER [13], DATATYPE [14], XY[16]]
PATH[9] [ LAYER[13], DATATYPE[14], PATHTYPE[33], WIDTH[15], XY[16] ]
TEXT[12][LAYER[13], DATATYPE[14], TEXTTYPE[22], PRESENTATION[23], STRING[25], XY[16] ]

结构内的引用记录

SREF [10] [ STRANS[26], MAG[27], ANGLE[28], XY[16] ]
AREF [11] [ STRANS[26], MAG[27], ANGLE[27], COLROW[19], XY[16]]

Hierarchy

GDSII 数据是分层的,这使得它可以用更少的数据库记录来描述数百万或数十亿个多边形。

基本容器称为结构(通常称为单元)。该结构可以包含几何元素,例如边界和路径以及对其他结构(SREF 和 AREF)的引用。让我们看一个非常简单的示例来了解发生了什么。

个非常简单的示例来了解发生了什么。

 BGNLIB                          start of the so called "library"

BGNSTR                          begin a structure
NAME=TOP                        the structure's name
BOUNDARY                        a geometric boundary
BOUNDARY                        a geometric boundary
SREF CELL_A [X,Y,ROT,MIR,MAG]   a reference placing another structure
ENDSTR                          end the structure

BGNSTR                          begin a new structure
NAME=CELL_A                     the structure's name
BOUNDARY                        a geometric boundary
BOUNDARY                        a geometric boundary
BOUNDARY                        a geometric boundary
BOUNDARY                        a geometric boundary
BOUNDARY                        a geometric boundary
ENDSTR                          end the structure

ENDLIB                          end the library


在上面的伪 GDSII 代码中,我们定义了两个结构:TOP 和 CELL_A。TOP 包含对 CELL_A 的引用,本质上是通过一些转换将其放置在某处。CELL_A 是一个非常简单的单元格,并且没有对其他单元格的引用(尽管它可以。)

这是一张假设 CELL_A(较小的蓝色)相对于 TOP 中心位于左下象限的图片。



现在 TOP 可以轻松引用 CELL_A 4 次 - 每次都在不同的位置和旋转。
BGNLIB                             start of the so called "library"

BGNSTR                             begin a structure
NAME=TOP                           the structure's name
BOUNDARY                           a geometric boundary
BOUNDARY                           a geometric boundary
SREF CELL_A [X1,Y1,ROT1,MIR,MAG]   a reference placing another structure
SREF CELL_A [X2,Y2,ROT2,MIR,MAG]   a reference placing another structure
SREF CELL_A [X3,Y3,ROT3,MIR,MAG]   a reference placing another structure
SREF CELL_A [X4,Y4,ROT4,MIR,MAG]   a reference placing another structure
ENDSTR                             end the structure
下面是它的样子:



额外的嵌套级别

CELL_A 可以引用另一个单元格 - CELL_B。[请注意,禁止 CELL_A 引用引用它的单元格;这将创建一个不可能的递归。] 如果是这样的话,每次 TOP 引用 CELL_A 时,CELL_B 也会最终生成。
BGNSTR                             开始结构
NAME=TOP                           结构名称
BOUNDARY                           几何边界
BOUNDARY                           几何边界
SREF CELL_A [X1,Y1,ROT1,MIR,MAG]   放置另一个结构的参考
SREF CELL_A [X2,Y2,ROT2,MIR,MAG]    a参考放置另一个结构
SREF CELL_A [X3,Y3,ROT3,MIR,MAG]   参考放置另一个结构
SREF CELL_A [X4,Y4,ROT4,MIR,MAG]   参考放置另一个结构
ENDSTR                             结束结构

BGNSTR                             开始一个新结构
NAME=CELL_A                        结构名称
BOUNDARY                           几何边界
BOUNDARY                           几何边界
BOUNDARY                           几何边界
BOUNDARY                           几何边界
BOUNDARY                           几何边界
SREF CELL_B [X,Y,ROT,MIR,MAG]      放置另一个结构的参考
ENDSTR                              end结构

BGNSTR                             开始一个新结构
NAME=CELL_B                        结构名称
BOUNDARY                           几何边界
BOUNDARY                           几何边界
ENDSTR                             结束结构


排序和排序?

程序员会注意到数据库中应该有顺序 - 即人们希望在引用之前定义一个单元格。事实证明,GDSII 没有这样的要求,并且人们会经常遇到结构在早期被引用并且只在以后定义的文件。

这使得渲染布局的工作量更大,因为无法单次通过数据库并能够计算图像的外观。

对于小型布局文件,额外的传递并不是什么大问题,但随着文件大小的增长(而且确实增长到许多 GB),“打开”数据时,这种“顺序”的缺失成为一个重大的惩罚。

优化文件的初始打开并创建一种方法来快速访问任何特定几何窗口中的元素,结果证明在处理大文件时非常重要,而且很难高效地完成。当涉及查看、绘制和操作 GDSII 文件的代码时,这就是男人与男孩之间的区别。

GDSII 边界
GDSII 边界记录(几何实体)是用于描述布局的两个关键几何之一(另一个是PATH)

边界由一系列顶点组成,这些顶点由直边连接以形成闭合轮廓。轮廓的“内部”称为数字化区域。
BOUNDARY 5 0  <-- layer 5, datatype 0
-50000 -50000 <-- First X,Y vertex
50000 -50000  <-- Second X,Y vertex
50000 50000   <-- Third X,Y vertex
-50000 50000  <-- Fourth X,Y vertex
-50000 -50000 <-- Back to First X,Y vertex
ENDEL

[注意:由于此示例假定 UM 为单位,并且每个 GDSII db tick 的分辨率为 1000 UM,因此每个整数值是 UM 值的 1000 倍]


每个边界的顶点数

GDSII 规范将顶​​点数限制为 200。

这个限制是完全任意的,可能是当时设置的,以限制渲染、存储和处理多边形所需的计算能力。大多数现代 GDSII 读取器和写入器都支持更大的数字,例如 1024、2048 或 4096。实际上限由数据库的设计设置。由于 GDSII 边界中的一条记录定义了要遵循的顶点对的数量,并且该记录长两个字节,因此最大坐标数为 8191。

如果您正在开发 GDSII 阅读器,您应该使用 8191 数字作为预期的最大顶点对数。如果您正在编写 GDSII 阅读器,您应该使每个多边形的最大顶点数可配置,以便用户可以生成与要读取它的目标兼容的 GDSII 文件。


方向?

顶点的方向(即顺时针或逆时针)在 GDSII 中没有意义,并且可以编写多边形而无需考虑它们的顶点顺序的方向。


自穿越

形成边界的轮廓可能不会在其自身上交叉。尽管某些 CAD 系统会处理这样的多边形,但这被认为是非法行为。但是,在开发 GDSII 写入器时,应在将多边形写出之前检查多边形是否自相交。



Self Touching
Self touching (也称为“重入”或“钥匙孔”)与自相交并不完全相同,实际上在 GDSII 中是允许的。然而,它必须“正确地”完成。自接触通常用于在数字化区域内形成孤岛或孔洞。下面的一系列图像显示了如何创建自接触(也称为重入)边界,以及处理后它在蒙版上的外观。



多边形 (a) 显然是合法的,因为它不会自相交或自接触。现在想象一下,面对的边缘被慢慢地推向彼此(b)和(c),直到它们最终相遇(d)。(d) 是合法的多边形吗?是的。它不被认为是自相交的,但它确实接触到了自己。

多个孔

单个边界中的多个“孔”很常见,如下所示:


边界之间的交互

每个边界都是独立的,从数据库的角度来看,边界之间没有交互。其他 CAD 系统可能会将“内部”边界视为孔或切口,但 GDSII 并非如此。


曼哈顿数据

人们经常会听到“曼哈顿”这个词。这意味着所有几何数据边都是垂直或水平的。GDSII 数据不必是曼哈顿数据,但主要出于计算原因,大多数数字 IC 布局仍然使用纯粹的曼哈顿数据。模拟、高压和射频集成电路通常使用非曼哈顿(也称为全角度)布局。


路径
PATH 是用于描述布局的两个基本几何实体之一(另一个是BOUNDARY)

PATH 由两个或多个顶点组成,这些顶点描述了一条线的中心点。路径通常具有有限宽度。这是一个简单的概念,除了路径中的弯道和路径的起点/终点。


每条路径的顶点数

GDSII 规范将顶​​点数限制为 200。

大多数 GDSII 阅读器可以支持更多的顶点。根据路径记录中描述要遵循的 XY 记录数的两个字节,最大值为 8191 个顶点。


弯头
GDSII 规范没有说明如何渲染路径中的弯曲。对于 90 度弯,没有混淆。然而,对于锐角的弯曲,大多数渲染算法都假设一定量的斜接 - 斜接的确切公式将因实施而异。


端盖
路径记录有一个标志,指示开始和结束的性质(称为结束帽)。有三个标准值和第四个标志,指示自定义值。

Flush
1=Half Round Extension
2=Half Width Extension
4=Custom Extension


自相交
自相交路径 (a) 不应写入 GDSII。一些读取 GDSII 的工具会正确解释它们,但许多会产生意想不到的结果 (b) 甚至崩溃。



SREF - 结构参考
我们提到 GDSII 是一个分层数据库。这是一个基本特征——否则用它来描述具有数百万甚至数十亿边界和路径的 IC 布局是不切实际的。层次结构很有价值,因为 IC 设计倾向于一遍又一遍地重复使用相同的几何图案。

STRUCTURE 记录包含边界、路径、SREF 和 AREF。可以使用 SREF(包含在不同的结构中)来引用或“放置”一个结构。以这种方式,边界、路径和引用的完整列表不需要一遍又一遍地明确列举。

SREF 记录如下所示:
SREF [ELFLAGS] SNAME  [<strans>]  XY
where:
SREF       - string identifying this as a SREF
ELFLAGS    - rarely used binary flags (see plex)
SNAME      - the name of the structure being referenced
strans     - two byte bit array controlling reflection, magnification and rotation.
XY         - placement coordinates of the instance

STRANS Details



Examples of SREF and Transformations
假设我们创建了一个具有两个独立结构的 GDSII 文件:TOP 和 CELL_A。最初我们在文件中没有 SREF,因此这两个结构没有关系。如下图所示:


现在让我们将 SREF 记录添加到指向 CELL_A 的 TOP。我们只会在 2,3 处有一个简单的 XY 插入,没有任何变换。


这次让我们将 CELL_A 放在 2,3,但我们也将它逆时针旋转 90 度 (CCW)。


这次让我们将 CELL_A 放置在 2,3 并打开反射(关于 X)标志。



这次让我们将 CELL_A 放置在 2,3,让我们打开镜像标志,让我们逆时针旋转 90。


这次让我们将 CELL_A 放在 2,3,让我们打开镜像标志,让我们逆时针旋转 180。


请注意,关于 X 的反射与 180 度旋转的组合等效于围绕 Y 的反射。这很有用,因为没有 Y 反射标志。在旋转之前执行反射。

数组参考
除了作为结构(单元)的单一放置的 SREF(结构参考)之外,GDSII 还具有一个 AREF(阵列参考),可以放置 1D 和 2D 阵列。这对于包括存储器在内的许多类型的 IC 布局非常有用;相同的存储单元通常以二维排列。

AREF 记录有许多参数:

结构名称到数组
镜像标志(M0 或 M1)
比例因子
回转
列数
行数
然后,必须提供三组坐标:
阵列参考点
从参考点偏移列间距 x 列数的位置
从参考点偏移行间距 x 行数的位置

让我们看一个 5 x 5 的单元阵列,其范围为 50 um x 30 um,它们之间的间隙为 2 um。
AREF 坐标



我们将使用这个数组编写一个小型 GDSII 文件的 ASCII“等效”文件。


LIBRARY ARRAY_EXAMPLE1.GDS unit:UM grid:1000
STRUCT RECT
BOUNDARY 1 0
0 0
50000 0
50000 -30000
0 -30000
0 0
ENDEL
ENDSTR
STRUCT TOP
AREF RECT M0 1.0 0.0 5 5 0 0 260000 0 0 -160000
ENDEL
ENDSTR
ENDLIB
如果我们使用 Artwork 的ascii2gds程序将其转换为GDSII,我们会看到:

array_example1.gds 的 Qckvu3



旋转阵列

有人会认为将此数组旋转 30 度将是更改旋转参数的简单问题,即:

AREF RECT M0 1.0 30.0 5 5 0 0 260000 0 0 -160000

然而这行不通!实际上必须计算旋转数组的第二和第三对坐标并输入这些坐标。我不知道为什么会这样,但确实如此。因此,对于同一个数组(但参考点为 0 20000(而不是 0 0)),我们的 AREF 中将包含以下参数。

AREF RECT M0 1.0 30.0 5 5 0 200000 225167 330000 80000 61436

您可以在下图中看到如何计算第二对和第三对坐标参数的位置:

计算旋转 AREF 参数的坐标


参考:https://artwork.com/gdsii/gdsii/
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。