Chapter 1
oasis文件简介
oasis是用来表示光刻版图的一种文件格式,上面记录了光刻图案。作为gdsii文件的替代格式,和gdsii类似是一种流格式的文件。一般性的介绍可以google到。这里就不再累述。
这篇文档,是对参考文献【1】的注释和部分翻译。第一为了方便阅读,对文献【1】中的一些概念和例子进行了解读说明;第二对文献【1】中容易忽略和混淆的地方进行了强调,对没有明确的但可以从其他地方推断出来的一些内容进行了明确。
Chapter 2
oasis文件格式
是一种二进制流的文件格式。它采用变形的BNF语法来描述文件格式,BNF语法见参考文献【1】中36.1节,oasis文件格式的描述见参考文献【1】中36.2节。这里不对那些内容进行重复叙述,只对文件进行部分说明强调。
1.
<magic-bytes> 按照标准是"%SEMI-OASIS<CR><NL>",但是各个厂商可能会有不同,可能厂商会加上自己的log。程序中出现了"
BROA
"作为oasis文件格式的开头字段。
2.
特别注意<geometry>、<element>和<name>字段中的大括号中的域是不能重复出现的,而<cell>和<oasis-file>中的大括号中的字段是可以重复出现的。在解析的时候要特别注意这点。
3.
注意到<oasis-file>中,除了自己的关键字START、CBLOCK、PAD和PROPERTY以外,还有两个内嵌的结构,就是<cell>和<name>。
其中<cell>中,第一个出现的字段是CELL,每一个<cell>中CELL会且仅会出现一次。因此可以把CELL作为第二层解析的入口。而<name>中,由于这些关键字跟其他部分都不重复,而且在一个<name>中仅都只能出现一次,所以可以直接放在第一层解析。
具体可以参见第五章。
Chapter 3
oasis数据类型
不同于普通的计算机编程语言的数据格式,oasis作为一种流格式文件,有自己的数据类型表示方法。这些在参考文献【1】中的第七章进行了说明。这里对其中内容进行部分说明,以便方便查阅。
一共有下面几种类型的数据格式:
Table
1
oasis数据格式
类型
|
长度
|
其他说明
| |
bytes
|
8bit
|
最低位bit放在最右边
| |
integers
|
unsigned-integer
|
不定,N个byte,8个bits中只有7bits表示实际数据,每个byte最高一个bit表示后面是否还有数据。0表示自己是最后一个byte。
|
最低位byte放在oasis文件的最前面
|
signed-integer
|
不定,N个byte,8个bits中只有7bits表示实际数据,每个byte最高一个bit表示后面是否还有数据。0表示自己是最后一个byte。符号位放在最低位byte(文件中最先出现的byte)的最后一位(bit):0表示正,1表示负。
|
最低位byte放在oasis文件的最前面
| |
real
|
不定。有8种表示方式。由一个unsigned-integer的数据来表示采用何种表达方式。
|
表示数据表达方式的unsigned-integer数据出现在文件的最前面。接着它后面才是实际要表达的数值。
| |
string
|
由一个unsigned-integer的数据来表示string的长度
|
unsigned-integer数据出现在文件最前面。string可以分成b-string, a-string和n-string三类
| |
deltas
|
delta是用来表示方向和长度的一种数据类型。分成4类。各类长度不一样。
|
在oasis文件中,这种数据的第一个出现的字节的最后几个bit是表示方向。
后面具体描述。
| |
repetitions
|
用来表示重复出现的各个图形的位置的一种数据类型。也分成多类,各类长度不一。
|
在后面具体说明
| |
point lists
|
利用这个数据结构就可以画出图形。但这个数据结构本身不包括画图的起始位置信息。而在其他地方确定。是一串delta信息,用来表示各条边的长度和方向。
图形的顶点越多,长度越长。
|
在后面具体说明。
| |
property value
|
由一个unsigned-integer表示类型,加上后面的property value 值构成。
|
各种类型的属性,value值不一样,但都比较简单。可以参看参考文献的7.8节table9。
|
3.1
integers类型说明
3.1.1
unsigned-integer
unsigned-integer的长度不确定,是由自己的值来确定的,如果数据长度有N个byte,每个byte的8个bits中只有7bits表示实际数据,最高一个bit表示后面是否还有数据。
0表示自己是最后一个byte。最低位byte放在oasis文件的最前面。
举个例子就清楚了。
十进制的16383:
正常的2进制表示是:11,1111,1111,1111,一共14个1。
在oasis文件中,由于只有7位能代表实际的数,所以我们把它写成x111,1111,y111,1111。还是14个1。但中间插入了一个x和y用来表示是否后面还有数据。由于低字节优先,所以我们写成y111,1111,x111,1111。然后将y变成1,x变成0。所以最后在oasis文件中的表示是1111,1111,0111,1111。
十进制的16384:
正常的2进制表示是:100,0000,0000,0000,1后面一共14个0。
在oasis文件中,由于只有7位能代表实际的数,所以我们把它写成x000,0001,y000,0000,z000,0000。1后面还是14个0。但中间插入了一个x、y和z用来表示是否后面还有数据。由于低字节优先,所以我们写成z000,0000,y000,0000,
x000,0001。然后将z变成1,y变成1,x变成1,。
所以最后在oasis文件中的表示是1000,0000,1000,0000,
0000,0001。
3.1.2
signed-integer
知道了unsigned-integer以后,再变signed-integer就简单了。还是举两个例子。
十进制的8191,
正常的2进制表示是: 1,1111,1111,1111,一共13个1。
在oasis文件中,由于第一个byte只有6位能代表实际的数,后面的byte有7位能代表实际的数。所以我们把它写成x111,1111,y111,111z。还是13个1。但中间插入了一个x和y用来表示是否后面还有数据,插入了一个z作为符号位。由于低字节优先,所以我们写成y111,111z,x111,1111。然后将y变成1,x变成0。由于是正数,所以z为0。所以最后在oasis文件中的表示是1111,1110,0111,1111。
十进制的-8192,
先表示十进制的8192,正常的2进制表示是: 10,0000,0000,0000,1后面一共13个0。
在oasis文件中,由于第一个byte只有6位能代表实际的数,后面的byte有7位能代表实际的数。所以我们把它写成m000,0001,x000,0000,y000,000z。1后面还是13个0。但中间插入了一个x和y用来表示是否后面还有数据,插入了一个z作为符号位,前面补了一个m。由于低字节优先,所以我们写成y000,000z,x000,0000,m000,0001。然后将y变成1,x变成1,m变成0。由于是负数,所以z为1。所以最后在oasis文件中的表示是1000,0001,1000,0000,0000,0001。
3.2
real类型说明
real的数据类型是一个复合的数据类型,它由一个unsigned-integer的类型做为开头,后面加上若干个unsigned-integer或者1个ieee4 float或者1个ieee8 float的数据类型来组成。目前,它只定义了8种类型格式,从0到7。
Table
2
real数据类型说明
类型格式
|
含义
|
0+unsigned-integer
|
是一个正的实数,实数的值就等于后面unsigned-integer
|
1+unsigned-integer
|
是一个负的实数,实数的绝对值就等于后面unsigned-integer
|
2+unsigned-integer
|
是一个正的实数,实数的值就等于后面unsigned-integer的倒数。
|
3+unsigned-integer
|
是一个负的实数,实数的绝对值就等于后面unsigned-integer的倒数。
|
4+unsigned-integer1+ unsigned-integer2
|
是一个正的实数,实数的值就等于(unsigned-integer1/ unsigned-integer2)。(做除数)
|
5+unsigned-integer1+ unsigned-integer2
|
是一个负的实数,实数的绝对值等于(unsigned-integer1/ unsigned-integer2)。(做除数)
|
6+IEEE-4-byte-float
|
表示后面是IEEE-4-byte-float的数据格式
|
7+IEEE-8-byte-float
|
表示后面是IEEE-8-byte-float的数据格式
|
在参考文献【1】中的第7.3.2节的table 4中,各个数值的计算就可以根据上表中的说明计算出来。
3.3
string类型说明
string数据类型是一个复合的数据类型,它由一个表示字符串长度的unsigned-integer类型数据做为开头,后面加上真正的字符串。
字符串可以分成三种:b-string(binary string), a-string(ascii string)和 n-string (name string).
3.4
delta类型说明
delta是代表几何数据。简单来说就是delta类型的数据中存放有长度和方向的信息。
其中分成4种:1-delta, 2-delta, 3-delta和g-delta。分别进行说明
3.4.1
1- delta
1-delta是一种signed-integer的数据结构,其中signed-integer中的符号位就用来表示方向了;singed-integer中的表示数值的部分就用来表示长度。
我们举个例子。比如二进制的
1
111,100
1
,
0
010, 0011。其中第一个方框中的
1
和singed-integer的含义一样,表示后面还有数据。第二个方框中的
1
在signed-integer中表示正负符号,这里就表示方向,1表示向西或者向南(在正交坐标系中表示x和y轴的负方向,具体是x轴还是y轴由这个值出现的当前的场景来确定)。第三个框中的
0
表示这是这个signed-integer数据的最后一个byte。这个数据的长度是二进制的010,0011, 111, 100(去掉框内的数值,然后前后byte调转位置),这就是十进制的2300。因此这个数值就是表示向西(或者向南)画2300长度的一条线。
3.4.2
2- delta
2-delta是一种unsigned-integer的数据结构,其中unsigned-integer中的最低2bits(在oasis文件中最先出现的byte中的最低2bits)用来表示方向了,其他部分表示数值的大小,数值的大小就用来表示长度。
我们举个例子。比如二进制的
1
001,10
00
,
0
010, 1010。其中第一个方框中的
1
和unsinged-integer的含义一样,表示后面还有byte表示同一个unsigned-integer数据。第二个方框中的
00
这里就表示方向,00表示向东(在正交坐标系中表示x正方向,01表示向北,10表示向西,11表示向南)。第三个框中的
0
表示这是这个unsigned-integer数据的最后一个byte。这个数据的长度是二进制的010,1010, 001, 10(去掉框内的数值,然后前后byte调转位置),这就是十进制的1350。因此这个数值就是表示向东(就是从当前位置,向x轴正方向)画长度1350的一条线。
3.4.3
3- delta
3-delta是一种unsigned-integer的数据结构,其中unsigned-integer中的最低3bits(在oasis文件中最先出现的byte中的最低3bits)用来表示方向了,其他部分表示数值的大小,数值的大小就用来表示x轴和y轴的偏移长度。
我们举个例子。比如二进制的
1
100,1
10
1
,
0
000, 0001。其中第一个方框中的
1
和unsinged-integer的含义一样,表示后面还有byte表示同一个unsigned-integer数据。第二个方框中的
101
这里就表示方向,101表示西北方向(在正交坐标系中表示135度角的一条线,000表示向东,001向北,010表示向西,011表示向南,100表示东北方向,110表示西南方向,111表示东南方向)。第三个框中的
0
表示这是这个unsigned-integer数据的最后一个byte。这个数据的长度是二进制的000,0001, 100, 1(去掉框内的数值,然后前后byte调转位置),这就是十进制的25。因此这个数值就是表示向西北方向(就是从当前位置,向135度角方向)画长度为sqrt(25*25+25*25)的一条线(x轴偏移25,y轴偏移25)。
3.4.4
g- delta
g-delta有两种形式,一种是用一个单一的unsigned-integer的数据来表示;第二种是用一对unsigned-integer的数据来表示。如果g-delta数据在文件中第一个出现的字节的最低位(bit0)是0,表示第一种类型的g-delta数据;如果是1,表示第二种类型的g-delta数据。
3.4.4.1
g- delta 第一种类型
如果是第一种类型,只用一个unsigned-integer类型表示g-delta的类型。unsigned-integer的在文件中出现的第一个字节的倒数第2到第4个bit(bit1到bit3)一共3个bits用来表示方向,同3-delta的形式。
举个例子,二进制的
1
110,
110
0
,
0
000,0101。其中第二个方框中的
0
表示这是第一种类型的g-delta格式,第一个方框中的
1
和unsinged-integer的含义一样,表示后面还有byte表示同一个unsigned-integer数据。划下划线的
110
这里就表示方向,110表示西南方向(在正交坐标系中表示135度角的一条线,000表示向东,001向北,010表示向西,011表示向南,100表示东北方向,101表示西北方向,110表示西南方向,111表示东南方向)。第三个框中的
0
表示这是这个unsigned-integer数据的最后一个byte。这个数据的长度是二进制的000,0101, 110(去掉打框的和加下划线的数值,然后前后byte调转位置),就是十进制的46。整个数据的含义就是沿西南方向画一条长度为sqrt(46×46+46×46)的线(也是就是将x轴坐标减少46,y坐标减少46,将这个点作为顶点,和原来坐标点相连画一条直线)。
3.4.4.2
g- delta 第二种类型
如果是第二种类型,则用两个unsigned-integer的数据来表示。第一个unsigned-integer在文件中的第一个byte的最低bit(bit0)必须为1,第一个byte的倒数第二个bit(bit1)表示x轴的方向,其它bit表示长度。第二个unsigned-integer在文件中的第一个byte的最低bit(bit0)表示y轴的方向,其它bit表示长度。因此,它能够表示任何方向的线段。
只有这种数据能够表示任何方向任何角度的线段,其它delta的类型都只能表示45度或者90度方向的线段。
举个例子,二进制的
1
011,10
1
1
,
0
000,0001,
1
011,011
1
,
0
000,1111。
其中第二个方框中的
1
表示这是第二种类型的g-delta格式,第一个方框中的
1
和unsinged-integer的含义一样,表示后面还有byte表示同一个unsigned-integer数据。划下划线的
1
这里就表示方向,1表示向西(x轴负方向,0表示向东)。
第三个框中的
0
表示这是第一个unsigned-integer数据的最后一个byte。这个数据的长度是二进制的000,0001, 011,10(去掉打框的和加下划线的数值,然后前后byte调转位置),就是十进制的46。整个数据的含义就是x轴沿负方向减少长度46,取一条和y轴平行的直线。后面y轴也取一条和x轴平行直线,两者相交得到一个点。整个delta就是从当前位置到这个点画一条直线。
第四个方框中的
1
和unsinged-integer的含义一样,表示后面还有byte表示同一个unsigned-integer数据。第六个框中的
0
表示这是第二个unsigned-integer数据的最后一个byte。第五个框中的
1
就表示方向,1表示向南(y轴负方向,0表示向北)。
整个数据的含义就是y轴沿负方向减少长度46,取一条和x轴平行的直线。
3.5
repetitions类型说明
在光刻版图中,一个相同的图形常常在多个位置重复出现。repetition就用来表示图形重复出现的位置。repetitions其本质是分成三部分,第一部分表示类型,用一个unsigned-integer的数据来表示,一共有12种类型;第二部分表示维数,就是参考文献【1】中7.6节中table6中的dimension,它表示了这个图形重复出现的次数;第三部分是表示位置,就是各个重复出现的图形应该出现在版图中的哪个位置,就是参考文献【1】中7.6节中table6中的space和displacement。
这里先对modal variable进行说明。modal variable类似于文件中的内置的全局变量
,
存储着比如element的放置位置、间隔等信息。当
解析一个新的element的时候,element的相关值会
存在这些变量里面,后面的element如果不明确指定这些值,就用前面element的值来作为自己的值。
由于文件中很多数据是相同的,所以后面的记录(record)中的参数,可能跟前面的一样,所以它就可以省略这些参数,直接将前面record的参数
作为
自己的参数,从而提高文件的压缩性。
Table
3
repetitions类型说明
类型
|
format
|
位置坐标
|
0
|
见文献【1】中7.6节中table6
|
重复上一次repetition的数据。根据上一次repetition的类型和数据来重复本图形的计算。比如上次是类型1的repetition,那么现在也是类型1的repetition,并且dimension和space参数也相同
|
1
|
同上
|
x-dimension=N-2, y-dimension=M-2.
生成一个N列M行的矩阵,矩阵中每个元素表示一个重复的图案。元素
element(i , j )(i=0 , ... , N-1, j= 0, ..., M-1)
的位置
为(i*x-space, j*y-space)。
用来生成x轴和y轴平行的重复图案。
|
2
|
同上
|
x-dimension=N-2,
生成一个
N
列
1
行的矩阵。矩阵中每个元素表示一个重复的图案。元素
element(i)(i=0 , ... , N-1)
的位置
为(i*x-space, 0)。
用来生成和x轴平行的重复图案。
|
3
|
同上
|
y
-dimension=
M
-2,
生成一个
1
列
M
行的矩阵。矩阵中每个元素表示一个重复的图案。元素
element(j)(j=0 , ... , M-1)
的位置
为(0, j*y-space)。
用来生成和y轴平行的重复图案。
|
4
|
同上
|
x-dimension=N-2,
生成一个
N
列
1
行的矩阵。矩阵中每个元素表示一个重复的图案。元素
element(i)(i=0 , ... , N-1)
的位置
为(x-space0+ x-space1+...+ x-spacei, 0),其中x-space0=0。
用来生成和x轴平行的重复图案。
|
5
|
同上
|
跟类型4类似,
x-dimension=N-2,
生成一个
N
列
1
行的矩阵。矩阵中每个元素表示一个重复的图案。元素
element(i)(i=0 , ... , N-1)
的位置
为(grid*(x-space0+ x-space1+...+ x-spacei), 0),其中x-space0=0。
用来生成和x轴平行的重复图案。
|
6
|
同上
|
y
-dimension=
M
-2,
生成一个
1
列
M
行的矩阵。矩阵中每个元素表示一个重复的图案。元素
element(j )(j=0 , ... , M-1)
的位置
为(0, y-space0+ y-space1+...+ y-spacej),其中y-space0=0。
用来生成和y轴平行的重复图案。
|
7
|
同上
|
跟类型6类似,y
-dimension=
M
-2,
生成一个
1
列
M
行的矩阵。矩阵中每个元素表示一个重复的图案。元素
element(j )(j=0 , ... , M-1)
的位置
为(0, gird*(y-space0+ y-space1+...+ y-spacej) ),其中y-space0=0。
用来生成和y轴平行的重复图案。
|
8
|
同上
|
n-dimension=N-2, m-dimension=M-2.
n-displacement(m-displacement
类似这样处理
)
是
g-delta
类型的数据
,
含有长度和方向信息
,
可以把
g-delta
数据分成两部分
nx-space
和
ny-space,
分表表示
x
轴方向的偏移和
y
轴方向的偏移。
g-delta
可以表示任意角度的方向。
整个数据生成一个N列M行的矩阵,矩阵中每个元素表示一个重复的图案。元素
element(i , j )(i=0 , ... , N-1, j= 0, ..., M-1)
的位置
为(i*nx-space+j*mx-space, i*ny-space+j*my-space)。
用来生成沿对角方向(不一定是45度角)的重复图案。
|
9
|
同上
|
dimension=
P
-2,
生成一个
P
维的向量。向量中每个元素表示一个重复的图案。元素
element(k)(k=0 , ... , P-1)
的位置
为(k*x-space, k*y-space),
用来生成沿对角方向的P维重复图形的图案。
|
10
|
同上
|
dimension=
P
-2,
生成一个
P
维的向量。向量中每个元素表示一个重复的图案。元素
element(k)(k=0 , ... , P-1)
的位置
为(x-space0+x-space1+...+x-spacek, y-space0+y-space1+...+y-spacek),
它可以用来生成沿任何方向任何位置的P维重复图形的图案。
|
11
|
同上
|
跟类型10类似,
dimension=
P
-2,
生成一个
P
维的向量。向量中每个元素表示一个重复的图案。元素
element(k)(k=0 , ... , P-1)
的位置
为
(grid*(x-space0+x-space1+...+x-spacek),
grid
*
( y-space0+y-space1+...+y-spacek)),
它可以用来生成沿任何方向任何位置的P维重复图形的图案。
|
3.6
point lists类型说明
point list数据类型是用来画图形的,他可以画出边为直线的任意多边形的图形。point lists有五种类型。其结构可以分成三部分:第一部分表示类型,就是point list 类型;第二部分表示顶点的个数,用一个unsigned-integer类型表示;第三部分用delta表示多边形的边长度以及方向,由一串delta构成,每一个delta表示了多边形的一条边。
图形的起始位置并不包含在point lists数据结构中,图形的起始位置由POLYGON记录和PATH记录中的相关信息给出。
这里不对point list五种类型的数据格式进行具体说明,可以参考参考文献【1】中的7.7.1节中的table7。这里只对表中特别容易混淆或者不清楚的地方进行一些说明。
(1)
表中的vertex-count并不是表示顶点的个数,而是表示后面delta类型的数据的个数。有些多边形的边并不需要用delta来表示,比如最后一条边,总可以将起始顶点和最后顶点直接相连来得到。
(2)
表中所谓manhattan 就是指多边形图形的边只平行x轴或者y轴方向,而不会沿其他方向。
(3)
所谓octangular是指多边形的边只平行x轴或者y轴方向,或者与他们形成45度角方向,而不会沿其他方向。如果不是沿45度角认为出错。
(4)
all-angle则表示多边形的边可能沿任何角度任何方向。
我们可以看几个例子,就拿参考文献【1】中的7.7.7中table 8和figure 6为例子。figure 6和table8是对应的。我们拿type 3为例,其他类似就不重复了。
在Figure 6 中,(x,y)是表示画图的起始位置,虚线表示缺省暗示的线,不会在delta数据中体现出来。。
type3中,对应table 8中的bit pattern为00000011,00000100,00010101,00100001,00110000, 00010011。首先第一个byte为00000011值为3表示类型3,对应文献【1】中的7.7.1的table 7,可以看到后面是3-delta类型的数据。
第二个byte为00000100值为4,表示后面有4个3-delta的数据。第三个byte为00010101,对照3-delta的数据格式,可以看到这是一个沿西北方向的线,长度为二进制的1010,也就是十进制的10。第三个byte为00010101,对照3-delta的数据格式,可以看到这是一个沿西北方向的线,这个3-delta数值大小为二进制的10,也就是十进制的2,所以线的长度为sqrt(2×2+2×2)。第四个byte为00100001,对照3-delta的数据格式,可以看到这是一个向北方向的线,这个3-delta数值大小为二进制的100,也就是十进制的4,所以线的长度为sqrt(4×4+4×4)。以此类推,最后一条线是缺省暗示的,将最后的一个点和起始点相连即可得到最后的一条直线(图上的虚线)。
参考文档
[1]
OASISformat.pdf
:
SEMI P39-0304 OASIS - OPEN ARTWORK SYSTEM INTERCHANGE STANDARD,