Magic源码阅读(二)——版图GDSII文件的数据格式和解析方法

GDSII流格式,常见的缩写GDSII,是一个数据库文件格式。它用于集成电路版图的数据转换,并成为事实上的工业标准。GDSII是一个二进制文件,其中含有集成电路版图中的平面的几何形状,文本或标签,以及其他有关信息并可以由层次结构组成。GDSII数据可用于重建所有或部分的版图信息。它可以用作制作光刻掩膜版。

GDSII文件的所有数据都是由一连串的数据块链接组成的。这些数据块大体上可分为文件头,模块结构头,图素头,图素,图素尾,模块结构尾,文件尾这几个部分,每个部分包含若干个模块,有些模块是必须包含的,另外一些则为可选的模块。每模块的前四个字节标志了该部分的元信息,第一二字节描述了该部分的size,第三四字节描述了该部分的type。

文件头
第3、4字节标志位类型数据参数类型
00 02HEADER(文件头)int16
01 02BGNLIB(库文件头)12个int16
02 06LIBNAME(库文件名)ASCII字符串
1F 06REFLIBS(参考文件)90个char
20 06FONTS(字体)176个char
23 06ATTRTABLE(属性)44个char
22 02GENETATIONS(备份文件数)int16
36 02FORMAT(格式)int16
37 06MASK(掩膜)ASCII字符串
38 00ENDMASK(掩膜结束)
03 05UNITS(单位)2个float64

首先以HEADER开始,它定义了GDSII的版本;其后是BGNLIB库文件头,它定义了GDSII文件最后一次修改的时间和读取时间,时间用6个int16数字来表示年月日时分秒;随后是LIBNAME,它定义了文件库名;然后是几个可选的参数(REFLIBS、FONTS、ATTRTABLE、GENERATEIONS、FORMAT等,根据需要它们可能出现也可能不出现);最后是单位参数UNITS,它定义了每一内部单位等了多少用户设定单位和每一个用户设定单位等于多少微米,它们分别由两个浮点数表示。

在GDSII中浮点数由8个字节表示,左边的第一个字节的最左边一位表示这个浮点数的数值的符号:0表正,1表负;第一个字节的后7位用以表示指数,指数表示范围为一64~63,由于指数值本身也含正负值,所以指数的阶码需要采用100000+指数的形式表示,显然指数数值加了64,所以在计算的时候要减去100000;后面的7个字节用原码表示尾数,设定小数点在最左边,尾数共有56位,相当于十进制有15位以上的有效数字,可见表示的精度通足够用了。

例如表示浮点的8个字节16进制3E 41 89 37 4B C6 A7 F0中的第一个字节相当于用二进制BCD码对应的00111110表示的浮点数的符号为正,指数的阶码0111110应减去1000000,实际二进制指数值为-0000010,相当于十进制数值为-2。

模块结构头
第3、4字节标志位类型数据参数类型
05 02BGNSTR(模块结构头)12个int16
06 06STRNAME(模块结构名)最多32个char

UNITS之后是模块结构参数(STRUCTURE)。每个模块结构数据的头有两个参数:一个是BGNSTR,它定义了STRUCTURE创建的日期和最后一次修改的日期;另一个STRNAME,它定义了STRUCTURE的名称。

图素头
第3、4字节标志位类型数据参数类型
08 00BOUNDARY(填充多边形)
09 00PATH(线条)
0A 00SREF(模块插入属性)
0B 00AREF(阵列)
0C 00TEXT(文字)
15 00NODE(拓扑点)
2D 00BOX

模块结构中包含一连串图素参数。OGDSII有七种图素:填充多边形Boundary;带一定宽度的线条(path);插入的模块(Reference Structure);插入模块组成的阵列(Array Reference);文字(Text);电路拓扑结构(Node);框架结构(Box,它对IC没有意义,L-EDIT不支持)。

下面主要介绍前四种图形元素
(0)填充多边形 GDSII的图素以填充多边形为主,填充多边形的数据构成是由BOLNDARY引出填充多边形的定义,然后是ELFLAGS和PLEX两个可选项,通常缺省,随后分别是由LAYER定义的层号,数据类型(DATATYPE)和坐标定义XY等参数。

LAYER定义了GDSII的图形层的层名,以整数数值命名层号,至下那一整数代表什么层可由设计者设定。数据类
型一般为00 00。坐标XY定义多边形每个拐点的坐标值,注意:多边形必须是闭合的,所以第一个坐标必须等于最后一个坐标,例如三角形为4个坐标值,但最多不得超过200个坐标。

(2)带一定宽度的线条 它定义了版图中的线的宽度和路径。它由PATH开始,然后是层号,数据类型和拐点坐标XY。坐标最多200个点。在XY之前可插入线端类型(PATHTYPE)和宽度(WIDTH)等参数。PATHTYPE定义了线末端的属性:0位直角矩形,1为半圆,2为突出了1/2线宽的直角矩形。WIDTH定义了线宽。如果其位负则表示它不受缩放因子影响。

(3)模块插入它定义了插入的模块的属性。它由SREF开始,然后分别是由SNAME定义的插入模块的名称和插入坐标XY。在XY之前可能有一个可选的变换结构参数,它是由STRANS开始后跟两字节,这两字节的第1位如果为1
则表示旋转前先延镜相。第14位为1表示要进行缩放,第15位为1表示要旋转。缩放和旋转参数分别由放缩MAG和旋转角度ANGLE规定,其中旋转角为逆时针。

(4)模块阵列 插入模块的阵列是由AREF廾始,然后分别是由SNAME定义插入的块的名称;选项插入块的变换结构参数STRANS(MAG,ANGLE);由COLROW定义阵列的行数和列数及XY定义的3个坐标,它们分
别是插入的坐标,最后一行插入块的坐标,最后一列插入块的坐标。

图素
第3、4字节标志位类型数据参数类型
26 01ELFLAGSint16
2F 03PLEXint32
0D 02LAYER(层)int16
0E 02DATATYPE(数据类型)int16
10 03XY(坐标)最多200个int32
21 02PATHTYPE(线端类型)int16
0F 03WIDTH(宽度)int32
12 06SNAME(插入模块结构名)最多32个char
1A 01STRANS(坐标变换)int16
1B 05MAG(缩放)int64
1C 05ANGLE(角度)int64
13 02CLOROW(行列数)2个int16
16 02TEXTTYPE(文字类型)int16
17 01PERSENTATIONint16
19 06ASCII STRING(字符串)最多512个char
2A 02NODETYPE(拓扑点类型)int16
2E 02BOXTYPEint16
图素尾
第3、4字节标志位类型数据参数类型
11 00ENDNET(图素参数结束)
…(可包含多个图素参数)
模块结构尾
第3、4字节标志位类型数据参数类型
07 00ENDSTR(模块结构结束)
…(可包含多个结构参数)
文件尾
第3、4字节标志位类型数据参数类型
04 00ENDLIB(库文件结束)
举个例子
00 06 00 02 00 03|00 1C 01 02 00 65 00 01 00 05 00 0F 00 2F 00 32
00 65 00 01 00 05 00 0F 00 2F 00 32|00 0C 02 06 4C 61 79 6F 75 74
31 00|00 14 03 05 3E 41 89 37 4B C6 A7 F0 39 44 B8 2F A0 9B 5A 54|
00 1C 05 02 00 65 00 01 00 05 00 0F 00 2F 00 32 00 65 00 01 00 05 
00 0F 00 2F 00 32|00 0A 06 06 43 65 6C 6C 31 00|00 04 08 00|00 06 
0D 02 00 2B|00 06 0E 02 00 00|00 2C 10 03 00 00 00 00 32 C8 00 00 
90 B8 00 00 32 C8 00 00 90 B8 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 32 C8 00 00|00 04 11 00|00 04 07 00|00 0A 06 06 
43 65 6C 6C 30 00|00 04 0A 00|00 0A 12 06 43 65 6C 6C 31 00|00 06 
1A 01 00 00|00 0C 10 03 00 00 00 00 32 C8 00 00|00 04 11 00|00 04 
08 00 00 06 0D 02 00 2B 00 06 0E 02 00 00 00 2C 10 03 00 00 00 00 
32 C8 00 00 90 B8 00 00 32 C8 00 00 90 B8 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 32 C8 00 00 00 04 11 00|00 04 07 00|
00 04 04 00

这是一个GSDII文件的二进制源文件,其中的|是我额外添加的,为了将各个模块隔开,实际的文件中并不存在|。让我们将其拆分为一个个模块来看:

00 06 00 02 00 03:我们根据前两个字节00 06得到此模块共六个字符,根据00 02得知此模块为文件头,00 03为版本号。

00 1C 01 02 00 65 00 01 00 05 00 0F 00 2F 00 32 00 65 00 01 00 05 00 0F 00 2F 00 32:前两个字节00 1C得到此模块共28个字节,01 02可知为库文件头,两个00 65 00 01 00 05 00 0F 00 2F 00 32 00表示开始时间和更新时间均为2001年1月5日15时47分50秒。

00 0C 02 06 4C 61 79 6F 75 74 31 00: 12个字节,为LIBNAME,后面的八个字节为对应的字符为layout1,最后的00为空字符,表明由于只有奇数个字符而进行了填充。

00 14 03 05 3E 41 89 37 4B C6 A7 F0 39 44 B8 2F A0 9B 5A 54:20个字节,为UNITS,后面跟了两个8字节的浮点数。

00 1C 05 02 00 65 00 01 00 05 00 0F 00 2F 00 32 00 65 00 01 00 05 00 0F 00 2F 00 32:28个字节,为BGNSTR,后面的24个字节记录了创建时间和修改时间。

00 0A 06 06 43 65 6C 6C 31 00:10个字节,STRNAME,名为cell1,加一个空字符

00 04 08 00:4个字节,BOUNDARY多边形

00 06 0D 02 00 2B:6个字节,LAYER,43层

00 06 0E 02 00 00:6个字节,DATATYPE,0

00 2C 10 03 00 00 00 00 32 C8 00 00 90 B8 00 00 32 C8 00 00 90 B8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 C8 00 00 :44个字节,XY,5对int32型的XY坐标

00 04 11 00:4个字节,ENDNET结束图素

00 04 07 00:4个字节,ENDSTR结束模块

00 0A 06 06 43 65 6C 6C 30 00:10个字节,BGNSTR,新建模块Cell0。

00 04 0A 00:4个字节,SREF,插入已建立的模块。

00 0A 12 06 43 65 6C 6C 31 00:10个字节,SNAME,插入Cell1。

00 06 1A 01 00 00:6个字节,STRANS,插入模式既不镜像也不旋转也不缩放。

00 0C 10 03 00 00 00 00 32 C8 00 00: 12个字节,插入坐标XY。

00 04 11 00:4个字节,结束插入。

00 04 08 00 到00 04 11 00:再添加一个多边形到cell0中

00 04 07 00:4个字节,ENDSTR结束模块。

00 04 04 00:4个字节,ENDLIB结束库文件。

  • 15
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值