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(填充多边形)⽆
第3、4字节标志位类型数据参数类型
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 01ELFLAGS int16
2F 03PLEX int32
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
第3、4字节标志位类型数据参数类型
17 01PERSENTATION int16
19 06ASCII STRING(字符串)最多512个char
2A 02NODETYPE(拓扑点类型)int16
2E 02BOXTYPE int16
图素尾
第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结束库⽂件。