200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > OASIS协议标准文档的解读_第二部分

OASIS协议标准文档的解读_第二部分

时间:2020-03-16 12:00:16

相关推荐

OASIS协议标准文档的解读_第二部分

8 CELL REFERENCING

8.1 跟GDSII文件一样, 在OASIS文件中, cells也是用名字来标识的。一个CELL record不仅要包括一个cell的定义,还要包括它的名字。 PLACEMENT record根据cell的名字来指定cell的放置位置。跟GDSII一样,在OASIS中没有匿名的cells,所有的cell都要有名字。

9 LAYERS, DATATYPES, AND TEXTTYPES

跟GDSII一样,每个<geometry>都跟一个layer number和一个datatype number关联在一起; 每一个text element都跟一个textlayer number和一个texttype number关联在一起。

10 MODAL VARIABLES

译者备注:

这里先对modal variable进行说明。modal variable类似于文件中的内置的全局变量,存储着比如element的放置位置、间隔等信息。当解析一个新的element的时候,element的相关值会存在这些变量里面,后面的element如果不明确指定这些值,就用前面element的值来作为自己的值。由于文件中很多数据是相同的,所以后面的记录(record)中的参数,可能跟前面的一样,所以它就可以省略这些参数,直接将前面record的参数作为自己的参数,从而提高文件的压缩性。

10.1 为了压缩的目的,在很多的OASIS records里面的数据元素,可以用modal variables或者存储状态(stored state) 来隐式定义(implicitly specified)。

在文件的开头和一个CELL或者<name> record的开始, 所有的modal variables,除了以下列举的这些(placement-x,placement-y,geometry-x,geometry-y,text-x, 和text-y),都是未定义的。下面6种:placement-x,placement-y,geometry-x,geometry-y,text-x, 和text-y,如果没有赋值,它们不是未定义的,而是应该认为赋予初始值是0.

所有的变量元素(various element)都在cell的描述(description)种定义。跟这些变量元素相关联的modal variable则在元素定义种设置。这些modal variable可以被后继的元素隐式的使用。一个modal variable可以是一个值(比如geometry-w的一个值), 或者包含多个变量的一个结构(比如一个repetition)。

10.2 在上表 Table 10-1中罗列出来了一共12种Modal variable。 其中的的xy-mode类型,用来管理对应的记录(record)的x和y字段(filed)的解释。也就是说一个record中,怎么解释它的x和y field,是由这个record对应的xy-mode类型的Modal variable决定的。 xy-mode有两种模式,绝对值和相对值。具体见21小节对这两种模式的讨论。 (译者注:简单说就是一个record对应的xy-mode决定了这个record的x和y的值,是绝对坐标和相对坐标。)

10.3 异常处理: 如果一个OASIS record对应的modal variable状态是未定义的状态,那么应该当作fatal error 处理。

11 RECORDS

11.1 OASIS文件的基本信息单元就是一个record, 我暂且翻译为记录。一个record 首先是一个无符号整型表示的record-ID, 然后接着这个记录的描述数据。 在本协议中record-ID显示的时候,是一个单引号包起来的十进制整数。

11.2 CBLOCK record是一个特殊的record, 它采用了字节压缩的方式,封装了一系列普通的records. 当解析程序读到一个CBLOCK记录的时候, 首先要解压缩,从而产生一个或者多个普通的record; 然后再依次将这些record解码。更多的CBLOCK record信息可以参考35节。

11.3 大多数records有一个隐含的长度。记录必须被解析和解码以后,才能确定它的长度。 但XNAME, XELEMENT和XGEOMETRY这三个record类型除外。(译者注:就是这三种数据无需解析和解码,就可以知道它的长度)。 这三种类型的record将所有未定义的数据封装在一个变化长度的b-string类型中 因此他们能作为新record类型的原型(译者注:类似基类),隐藏自身嵌入的数据,支持局部的非通用性扩展, 等等。 这样对于一些不支持这些record的解析器,他们可以很容易的知道这些字符串的长度,并且跳过这些不能解析的record.

11.4 异常处理:如果解析发现一个CBLOCK记录嵌套了另外一个CBLOCK记录,这个认为是fatal error.

12 PAD RECORD

12.1 一个PAD记录提供了一个简单的方法在OASIS文件中保留一段空间。它包含下面的格式:‘0’.

12.2 PAD 记录可以插入在任何两个记录中间。

12.3 异常处理: 解析的时候如果在START记录之前或者END记录之后,出现PAD记录,那么认为是fatal error.

13 START RECORD

13.1 一个START记录表示一个OASIS文件的开始, 它紧接在<magic-byte>的后面。<magic-byte>可以参照6.4节的介绍。START记录有下面的格式:

‘1’ version-string unit offset-flag [ table-offsets ]

13.2 上面version-string字段是一个字符串,在当前的OASIS版本中它的值是“1.0”.

13.3 unit 字段是一个正的实数,定义了OASIS文件的坐标系统中坐标系统的全局精度。OASIS文件系统坐标系统是用每1微米作为步长定义的的网格系统。OASIS的unit的值本质上是GDSII文件格式中的UNITS记录中的第一个值的倒数。

13.4 offset-flag是一个无符号的整数,当offset-flag值是0的时候表示table-offsets结构存储在START记录中; offset-flag是1的时候表示table-offsets结构存储在END记录中。把table-offsets存储在END结构中提供了顺序写入OASIS文件的可能性,不需要seek-and-update操作,也就是说不需要到最后返回到前面来更新START记录。然而依然可以为顺序(sequence)的readers提供随机访问cell级别的能力。

13.5table-offsets结构由六个无符号整数对组成。每个整数对由一个flag和一个byte-offset组成。按照table 13-1的顺序组成。

13.6 上面表格中的Flag字段,要么是1, 表示对应表格中的数据是严格模式(strict mode);或者是0, 表示的是非严格模式(non-strict mode).

上面的byte-offset字段,表示的是它对应的table表中的第一条记录相对于oasis文件开头(byte 0)的位置。如果byte-offset为0则表示没有对应的table表。

13.7 在非严格模式中(non-strict mode), 对应类型的记录可能出现在文件中的任何位置,即使它们中的一些记录已经被集中放在table表中用byte-offset指向的位置。

13.8 在严格模式下(strict mode), 对应类型的所有记录(包括与之相关的PROPERTY记录),都会被集中放在table中对应的byte-offset指向的一段连续的位置。PAD记录也可以放在严格模式的table表中。另外,严格模式保证对相应类对象(name, strings or cells)的所有引用均由reference-number独家计数。

13.9 当一个严格模式table表被一个或者多个CBLOCK记录封装时,对应的byte-offset应该指向封装这个table的第一个CBLOCK记录的第一个字节。并且这个table的第一条记录必须时CBLOCK记录解压以后的第一条记录。基于这个要求协议不允许在1个CBLOCK记录中封装多于1个的严格模式table表, 也不允许在CBLOCK记录中间开始一个严格模式table表。

13.10 异常处理:如果一个OASIS文件的开头第一个记录(record)不是START类型的记录,应该认为是一个fatal的错误。如果unit的值是Nan, Inf或者非正数值, 应该认为是fatal错误。当一个tale offset是非0,并且table表是严格模式,如果存在该类型的“杂散”(“stray”)记录与它的表格组(tabular group)存放在不连续的位置,那么应该认为是fatal的错误。任何任何记录未使用reference number来访问该类对象, 应该认为是fatal错误。

一个并不依赖任何严格模式提供的record grouping,renference-number和byte-offset 的OASIS的文件解析者,并不需要检测和报告由严格模式引起的任何异常。(译者注:也就是说,对于文件解析器,如果我没有用到strict mode中的信息,那么我就不需要去专门去检查和报告严格模式中的这些错误,因为我没有用到它,所以我也不关心它。)

14 END RECORD

14.1 END 记录标识OASIS文件的结束。END记录必须是文件中的最后一个记录;不允许有后继的字节。它的格式是:

‘2’ [ table-offsets ] padding-string validation-scheme [ validation-signature ]

14.2 上面的table-offsets结构体是由offset-flag管理的数据,具体可以参看START记录(第13章)。 上面的

padding-string(ab-string) 必须是由OASIS写者计算和写入的,它的目的是使整个END记录,包括record-ID, 正好是256个字节。这样,OASIS的读者就可以从文件的末尾开始寻找,正确找到END记录(以及相关的table-offsets和validation-signature), 从而避免存一个指向START记录的前向指针。padding-string的内容必须初始化成NUL字符。

14.3validation-scheme是一个无符号整型数据,它表示文件使用哪个验证方案(validation schema)。上面的validation-signature就是表示根据validation scheme所对应的验证方案生成的验证字节数据,用来验证OASIS的完整性。下表是验证方案(validation scheme)的定义。

14.4 CRC32 验证方法

14.4.1 The CRC32 多项式是在ISO 3309中定义的:

x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x1 + x0

其中最左边的bit表示的是最高位(most significant)bit. 比如下面是二进制数据以及对应16进制数据:

binary 1 0000 0100 1100 0001 0001 1101 1011 0111

hexadecimal 104c11db7

14.4.2 CRC32值的计算使用所有的OASIS文件的字节, 从START记录的第一个byte到END记录的validation-scheme整数。并且它跟byte的顺序是有关的。它计算的32bits的结果记录在文件的最后四个字节中,最小byte在前面(with the least significant byte first)。 它通常用查表并结合偏移/异或(shift/XOR)的方法来计算。在附录1中给出了用C语言实现的源代码。

14.5 CHECKSUM32 验证方法

14.5.1 CHECKSUM32验证签名计算方式是把OASIS文件从START记录的第一个byte到END记录的validation-scheme整数, 做简单的无符号求和。最后的结果截取最低的32 bits并存放在文件的最后四个字节中,存放的顺序是低字节优先(with the least significant byte first)。它跟字节顺序无关,这个特性使得它更容易计算,尤其是当文件不是顺序写入的时候。但是它对错误的检测能力比CRC32要弱。在附录1中有用C语言实现的源代码。

14.6 异常处理: 如果在OASIS文件中没有END结构认为是一个Fatal的错误。

15 CELLNAME RECORD

15.1 一个CELLNAME记录把一个cell的名称关联到一个全局唯一引用数(a unique reference number)。这允许CELL和PLACEMENT记录,当需要的时候,避免冗余存放cell的名称,而用引用数来替代。(无符号整数长度比字符串短小)。它的格式有两种:

‘3’ cellname-string

‘4’ cellname-string reference-number

15.2cellname-string是一个n-string类型的数据,存放着cell的名称。Reference-number是一个无符号整数,它显式或者隐式的赋值给一个cell。如果记录类型是’3’, 那么它是非明显的赋值,它从0开始赋值,每个CELLNAME记录都递增1来赋值。如果记录类型是’4’,那它是明显赋值,对应的reference-number就是记录中赋值的无符号整数

15.3 两个标准的属性:S_BOUNDING_BOXS_CELL_OFFSET(在A2-2节描述

), 可能会跟每个CELLNAME记录关联。当在严格模式(严格模式在第13节叙述)下 所有的CELLNAME记录都被组织在一个连续的table表中的时候, 对于每个CELLNAME记录都有一个S_CELL_OFFSET属性,这个表格就是整个OASIS文件所有cell的一个完整索引,以便随机访问cell.

15.4 在同一个文件中, CELLNAME记录中的记录类型 ‘3’ 和 ‘4’ 不应该同时出现。(同一个文件中,要不都用类型3, 要不都用类型4,不要混在一起用。)

15.5 异常处理: 如果有两个CELLNAME记录有相同的名字但不同的引用号;或者相同的引用号但不同的名字,应该认为是fatal错误。如果同一个OASIS文件中同时出现类型‘3’和类型‘4’, 应该认为是fatal错误。在一个特定的CELLNAME记录后出现多于一个S_CCELL_OFFSET或者S_BOUNDING_BOX属性,属于fatal错误。

16 TEXTSTRING RECORD

16.1 一个TEXTSTRING记录把一个文本字符串跟一个全局唯一的引用数联系在一起。这允许TEXT记录,当需要的时候,避免存储冗余的字符串,而用对应的引用数替代。它有下面两种格式(跟CELLNAME记录类似):

‘5’ text-string

‘6’ text-string reference-number

16.2text-string是一个a-string类型的字符串,保存实际的文本字符串。而reference-number则是一个无符号整型,对应的这个字符串的全局唯一引用数。有显式和隐式的两种赋值方式。如果记录类型是‘5’,则是隐式的赋值方式,从0开始递增,每遇到一个TEXTSTRING记录加1。 如果记录类型是’6’则是显式的赋值方式。

16.3 记录类型 ‘5’ 和 ‘6’ 不应该出现在同一个OASIS文件中。

16.4 异常处理: 如果出现两个相同名字但是不同引用数的TEXTSTRING记录,或者相同引用数但不同名字的TEXTSTRING记录, 应该认为是一个fatal错误。如果记录类型‘5’ 和 ‘6’ 出现在同一个OASIS文件中,也应该认为是Fatal的错误。

17 PROPNAME RECORD

17.1 一个PROPNAME记录把一个属性名字和一个全局唯一引用数对应起来。这可以使PROPERTY记录,当需要的时候,避免存放冗余的属性名字字符串,而用这个全局唯一的引用数替代。它有下面两种格式:

‘7’ propname-string

‘8’ propname-string reference-number

17.2propname-string是一个n-string类型的字符串,存放属性的名字。而reference-number则是一个无符号整型数据, 表示对应的全局唯一引用数。它有隐式和显式两种赋值方式。如果记录类型是’7’, 则是隐式的赋值方式,记录号从0开始,每遇到一个PROPNAME加1. 如果记录类型是’8’, 则是显式的赋值方式。

17.3 记录类型 ‘7’ 和 ‘8’ 不应该同时出现在同一个OASIS文件中。

17.4 异常处理:如果在一个OASIS文件中,出现两个相同名字但是引用数不一样的PROPNAME,或者出现两个相同引用数但不同名字的PROPNAME,应该认为是个Fatal错误。如果在一个OASIS文件中同时出现记录类型’7’和记录类型’8’, 应该认为是个Fatal错误。

18 PROPSTRING RECORD

18.1 一个PROPSTRING记录把一个属性字符串和一个全局唯一的引用数关联在一起。这样就可以用全局唯一的引用数替代属性字符串,从而避免冗余的属性文本字符串。它有两种格式:

‘9’ prop-string

‘10’ prop-string reference-number

18.2prop-string是一个a-string,b-string或者n-string的字符串用来存放属性字符串。reference-number是一个无符号整型,有隐式赋值和显式赋值两种方式。如果记录类型是 ‘9’则是隐式赋值,引用数从0开始,每遇到一个PROPSTRING记录加1。 如果类型是 ‘10’则是显式赋值。

18.3 记录类型‘9’ 和 ‘10’ 不应该出现在同一个OASIS文件中。

18.4 异常处理:如果出现两个PROPSTRING记录有相同引用数但有不同名称,或者有相同名称但有不同引用数,则被视为Fatal错误。如果记录类型 ‘9’ 和‘10’ 出现在同一个文件中认为是Fatal错误。

19 LAYERNAME RECORD

19.1 一个LAYERNAME记录把数值对 (layer,datatype)或者 (layer,texttype) 和layer的名称结合在一起,其中(layer,datatype)或者 (layer,texttype)它可以是一个范围的数值。LAYERNAME有下面两种格式:

‘11’ layername-string layer-interval datatype-interval

‘12’ layername-string textlayer-interval texttype-interval

19.2 记录类型 ‘11’提供了数值对(layer,datatype) 和 layer名称的映射; 记录类型 ‘12’ 则把数值对

(textlayer,texttype) 和layer名称映射在一起。

19.3layername-string是一个n-string类型的数据,提供了layer的名称。

19.4 每一个interval的域值 fields由一个表示间隔类型的无符号整数, 以及一个(当类型是4的时候有两个)表示间隔边界的无符号整型组成。 具体格式和含义如下表所示。

19.5 对于同一个layer名称,LAYERNAME记录可以重复多个, 这样可以把多个layer, datatype和texttype值(范围段range)映射到同一个layer名称.

20 CELL RECORD

20.1 一个CELL记录引入了一个cell的定义。它有下面的格式:

‘13’ reference-number

‘14’ cellname-string

20.2 如果记录类型是 ‘13’,reference-number是一个无符号整型,根据它可以找到对应的CELLNAME记录中存放的cell名称。如果记录类型是‘14’,cellname-string直接存放的是cell的名称 ,cell的名称必须是一个n-string类型的数据。

20.3 随后所有的记录,一直到下一个CELL, END或者<name> 记录为止,都被认为是这个cell的一部分

20.4 异常处理: 如果使用reference-number但是同一个文件中找不到对应的CELLNAME记录, 认为是一个Fatal错误。在同一个文件中多个CELL记录对应于同一个cell名称(实际上就是重复定了了cell)应该当作是fatal错误。

21 XYABSOLUTE & XYRELATIVE RECORDS

21.1XYABSOLUTEXYRELATIVE记录 控制模态变量(modal variable)xy-mode的值, 这个变量管理着对PLACEMENT,<geometry>TEXT记录中的x和y 值的解释。

着两个记录有一个简单的record-ID组成,没有其它值域。格式如下:

‘15’ = XYABSOLUTE

‘16’ = XYRELATIVE

21.2 每次遇到CELL记录时,模态变量xy-mode初始化成absolute值,同时相关的模态位置变量placement-x,placement-y,geometry-x,geometry-y,text-x和text-y都初始化为0。如果出现

XYRELATIVE记录则需要把模态变量xy-mode设成relative值,如果出现XYABSOLUTE记录则需要将模态变量xy-mode设成absolute值。这个模式可以在一个cell定义中改变多次。

21.3 在absolute模式中,如果显式的提供了xy的值, 那么他们就是实际的 (x,y) 坐标值。

21.4 在relative模式中,如果显式的提供了xy的值,那么需要根据对应的记录类型,将他们解释成对应模态变量placement-x,placement-y,geometry-x,geometry-y,text-x, 或者text-y的相对坐标。在这种模式下,实际的X坐标的计算是x的值和对应的模态位置变量相加。而实际的Y坐标则是y的值和对应的模态位置变量相加。

21.5 不管是在absolute还是在relative模式下, 当x 或者y的值没有在记录中显式的提供,则对应的模态位置变量(modal position variable)的值将用做实际的x或者y的坐标。不管是在absolute还是relative模式中,对应的模态位置变量总是随着最新的实际(x,y)坐标位置不断更新。

21.6 对point-lists和repetitions字段的解释,不依赖于absolute还是relative模式。同样,即使一个给定的元素包含repetition字段,对应的模态位置变量 (placement-x,placement-y,geometryx,

geometry-y,text-x, ortext-y) 总是根据初始元素的实际(x,y)坐标不断更新。

22 PLACEMENT RECORD

22.1 一个PLACEMENT记录描述在当前的cell中放置一个或者多个引用cell (referenced cell). 它有下列格式:

‘17’ placement-info-byte [ reference-number | cellname-string ] [ x ] [ y ] [ repetition ]

‘18’ placement-info-byte [ reference-number | cellname-string ] [ magnification ] [ angle ]

[ x ] [ y ] [ repetition ]

22.2 在记录类型‘17’中,placement-info-byte包含的bit模式(bit pattern)是 ‘CNXYRAAF’.

22.3 在记录类型‘18’中,placement-info-byte包含的bit模式(bit pattern)是‘CNXYRMAF’.

22.4 当C=1时,cell reference是显式的。此时N=1表示当前记录存放的是reference-number(是一个无符号整型数据), 然后根据reference-number找到对应的CELLNAME记录,这样就可以找到cell名称。N=0 则表示当前记录存放的直接是cellname-string(n-string的数据类型)。 当C=0, 忽略N的值,同时使用模态变量

placement-cell的值,指的是使用跟前一个PLACEMENT记录中的相同的cell。

22.5xy是有符号整型的坐标数据,表示放置位置的绝对或者相对坐标的(x,y)值。Xis 1 表示后面提供了x的值,而Yis 1 则表示后面提供了y的值。当任何一个x或者y没有指定的时候,就使用模态变量

placement-x或者placement-y来替代对应的x或者y的值。参考21节关于绝对和相对模式对x和y的解释。

22.6R是 1 表示后面提供了repetition的值.F=1 表示会根据x轴进行翻转;F=0 表示没有翻转。

22.7 在记录类型 ‘17’中, 放大幅度是1.0 , 旋转角度的计算是按逆时针方向来计算,旋转大小是整数乘于90度:

AA=0 表示逆时针旋转0度,AA=1 表示逆时针旋转90度,AA=2 表示逆时针旋转 180 度,AA=3 表示逆时针旋转 270 度。

22.8 在记录类型‘18’中, 放大幅度(magnification和角度(angle)都是实数。角度(angle)的度量单位是度, 正数表示逆时针旋转。幅度是没有单位的。A是 1 表示后面提供了angle 的值(需要调整角度), 否则认为旋转的角度是0度(不需要调整角度)。Mis 1 表示后面提供了 放大幅度(magnification)的值(需要调整幅度),否则认为放大幅度是1.0(不需要调整幅度大小)。

22.9 每一个后继的PLACEMENT记录都会更新所有跟放置相关(placement-related)的模态变量

22.10 异常处理: 如果记录中使用了reference-number但找不到对应的CELLNAME记录,认为是一个fatal错误。任何递归的cell引用 (一个cell把自身放在自己的内部)认为是一个fatal错误。放大幅度(magnification)如果是负数或者是0认为是fatal错误。如果放大幅度或者角度是NaN或者Inf值认为是一个fatal错误。PLACEMENT记录可以引用同一文件中的任何CELL记录,不管它们的相对位置,甚至可以引用不在同一文件中(在其它文件中定义)的外部cell(external cell).

23 PLACEMENT TRANSFORM REPRESENTATION

23.1 EDA应用程序通常用一个3X3的矩阵来定义一个放置转化(placement transform):

这个矩阵通过左乘一个1X3的矩阵[p q 1], 将任何一个点(p, q)做placement的转化。可以根据下面的定义将OASIS的placement数据转化成矩阵数据:

X00 = cos( angle ) * magnification

X01 = sin( angle ) * magnification

X10 = -f * sin( angle ) * magnification

X11 = +f * cos( angle ) * magnification

X20 =x

X21 =y

这里的如果F=0 则 f=1; 如果F=1 则f=-1。 “angle” 是旋转角度,由PLACEMENT记录中的AA或者angle定义。 “magnification” 是变化幅度,如果没有指定则是1.0。 特别注意的是,如果旋转角度是90度的倍数,而变化幅度是1.0的时候,则上面的矩阵中的左上半部分的2X2的矩阵可以简化成下面八种格式,这可以优化对应的数值计算过程。

23.2 当有repetition值域的时候,上面的转化公式是repetition中第一个元素的转化公式。更一般的,repetition中任何一个元素E的转化是通过第一个元素右乘下面矩阵公式得到:

:

从而得到下面这个计算公式:

(参考第 7.6.3 节 repetition类型中关于x-offsety-offset的相关讨论)

(译者注:这个就是图形视觉计算的相关公式,任何一本视觉计算的书都会提到这个计算矩阵)

24 TEXT RECORD

24.1TEXT记录表示一个文本元素,由一个 (x,y) 坐标点和注解字符串(annotation string)组成。它有下列格式:

‘19’ text-info-byte [ reference-number | text-string] [ textlayer-number ] [ texttype-number ]

[ x ] [ y ] [ repetition ]

24.2text-info-byte是一个bit位格式: ‘0CNXYRTL’.

24.3 当C=1表示这个文本引用(text reference)是显式的,在这种情况下,当N=1 时表示后面提供了reference-number(无符号整型数据) 数据, 可以根据reference-number找到对应的TEXTSTRING记录,再找到对应的文本字符串。 当N=0 则表示独赢的文本字符串(数据类型是a-string) 就直接存放在当前记录中。当C=0时,忽略N字段,使用模态变量textstring中的值作为文本字符串替代。

24.4xy是有符号的整型数据, 表示文本元素的绝对或者相对坐标(x,y)。当X1时表示后面提供了x的值;Y是 1 时表示后面提供了y的值。x或者y没有指定的时候,使用对应的模态变量text-x或者text-y替代。可以参考第21节中的关于相对模式和绝对模式下对于x和y的解释。

24.5 当R是 1 表示后面提供了repetition的数据。当L是 1时表示后面提供了textlayer-number的数据. 当T是 1 时表示后面提供了texttype-number的数据。textlayer-numbertexttype-number都是无符号的整型数据。当textlayer-number或者texttype-number没有指定的时候,分别使用模态变量textlayer和texttype的值替代。

24.6 每一个TEXT记录都需要更新所有的文本相关的(text-related)模态变量。

24.7 异常处理:如果TEXT记录中reference-number在同一个OASIS文件中没有对应的TEXTSTRING记录 认为是fatal错误。当模态变量textlayerortexttype在隐式状态下使用的时候,它们还处于未定义的状态,认为是fatal错误。

25 RECTANGLE RECORD

25.1 一个RECTANGLE表示一个矩形图形,它的边是平行x轴或者y轴。它有如下格式:

‘20’ rectangle-info-byte [ layer-number ] [ datatype-number ] [ width ] [ height ] [ x ] [ y ] [ repetition ]

25.2 其中rectangle-info-byte表示如下的bit模式:‘SWHXYRDL’.

25.3 其中R是 1 表示后面有repetition的数据。如果L是 1 表示后面有layer-number的数据。如果D是 1 表示后面有datatype-number的数据。layer-numberdatatype-number都是无符号的整型数据。当layer-number或者datatype-number没有指定的时候,使用对应模态变量layer和datatype的值替代。如果W是 1 表示后面有width的数据。 当H1 表示后面有height的数据。widthheight都是无符号整型数据。当width或者height没有指定的时候,使用对应的模态变量geometry-w和geometry-h的值替代。

25.4 当S是 1 表示这个矩形是一个正方形。在这种情况下,H必须是0。 如果提供了width的值,则将其作为长和宽的值。当width没有指定的时候,使用模态变量geometry-w的值替代。

25.5xy都是有符号的整型数据,表示坐标数据。绝对坐标或者相对坐标(x,y)表示的是矩形左下角顶点的坐标。

X1时表示后面提供了x的值;Y是 1 时表示后面提供了y的值。x或者y没有指定的时候,使用对应的模态变量geometry-x或者geometry-y替代。可以参考第21节中的关于相对模式和绝对模式下对于x和y的解释。

25.6 每一个RECTANGLE记录都会更新所有的跟矩形相关的(rectangle-related)模态变量。(当S=1时,也就是正方形的时候,geometry-w和geometry-h都被设成矩形的宽度。)

25.7 异常处理:当模态变量geometry-w, geometry-h, layer或者datatype还处于未定义状态的时候,使用它们应该当作fatal错误。当S=1时H=1 被认为是fatal错误。如果RECTANGLEs的面积是0,由应用程序决定如何处理。

26 POLYGON RECORD

26.1 一个POLYGON记录表示一个任意的多边形图形。它有如下的格式:

‘21’ polygon-info-byte [ layer-number ] [ datatype-number ] [ point-list ] [ x ] [ y ] [ repetition ]

26.2 其中polygon-info-byte是一个bit模式: ‘00PXYRDL’.

26.3xy都是表示坐标的有符号整型数据。(x,y) 表示的是多边形初始顶点的相对坐标或者绝对坐标。当X是 1 时表示后面有x的数据,当Y是 1 表示后面有y的数据。当x或者y没有指定的时候,使用对应的模态变量geometry-x或者geometry-y替代。可以参考第21节中的关于相对模式和绝对模式下对于x和y的解释。

26.4 当R是 1 表示后面提供了repetition的数据。当L是 1时表示后面提供了layer -number的数据. 当D是 1 时表示后面提供了datatype -number的数据。layer-numberdatatype-number都是无符号的整型数据。当layer -number或者datatype-number没有指定的时候,分别使用模态变量layer和datatype的值替代。

26.5 当P是1的时候表示后面有point-list的数据。否则,使用模态变量polygon-point-list中的数据替代。

point-lists的格式定义见第7.7节。

26.6 每一个POLYGON结构都需要更新所有跟多边形相关(polygon-related)的模态变量.

26.7 异常处理: 如果多边形少于三个顶点认为是fatal错误。如果在隐式模式下使用模态变量

polygon-point-list, layer,或者datatype, 而这些模态变量还处于未初始化的状态,认为是fatal错误。对于自交的多边形(多边形的边跟自己的边相交),重入的多边形(reentrant polygons)和面积为0的多边形,由应用程序自己决定如何处理。

27 PATH RECORD

27.1 一个PATH记录表示一个任意的路径图形(path figure), 路径图形可以看成是有一定宽度的折线。它有如下格式:

‘22’ path-info-byte [ layer-number ] [ datatype-number ] [ half-width ]

[ extension-scheme [ start-extension] [ end-extension ] ] [ point-list ] [ x ] [ y ] [ repetition ]

27.2 其中path-info-byte是一个bit模式:‘EWPXYRDL’.

27.3xy是表示坐标的有符号的整数, 它表示的是path记录中心线初始顶点的相对或者绝对坐标(x,y)。

X是 1 时表示后面有x的数据,当Y是 1 表示后面有y的数据。当x或者y没有指定的时候,使用对应的模态变量geometry-x或者geometry-y替代。可以参考第21节中的关于相对模式和绝对模式下对于x和y的解释。

27.4 当R是 1 表示后面提供了repetition的数据。当L是 1时表示后面提供了layer -number的数据. 当D是 1 时表示后面提供了datatype -number的数据。layer-numberdatatype-number都是无符号的整型数据。当layer -number或者datatype-number没有指定的时候,分别使用模态变量layer和datatype的值替代。

27.5 当P是1的时候表示后面有point-list的数据。否则,使用模态变量polygon-point-list中的数据替代。

point-lists的格式定义见第7.7节

27.6 当W是 1 的时候表示后面提供了half-width(无符号整型) 的数据。 如果没有提供,那么使用模态变量

path-halfwidth中的值作为半宽度的值。Path图形是将中心线(由各个点连接起来的折线)向两边各扩展半宽度的长度来形成。

27.7 当E是 1 时表示后面有extension-scheme的数值。否则extension-scheme,start-extensionend-extension都没有数据,而使用模态变量path-start-extension和path-end-extension来替代。

27.8 当提供了extension-scheme(一个无符号整型) 的数据的时候,它是一个bit模式: ‘0000SSEE’。 TheSS两个bit位管理路径起始端点的扩展模式,EE两个bit位管理路径末端端点的扩展模式。start-extension(当SS=‘11’ 时提供) 和end-extension(当EE=‘11’时提供) 都是有符号的整型数据。和GDSII流文件中定义的一样,正数表示路径从起始或者末尾端点向外扩展;而负值则表示路径从其实或者末尾端点向内收缩。

27.9 每个PATH记录都会更新所有的跟路径相关的模态变量(path-related modal variables).

27.10 各种类型的退化路径,比如half-width=0, path跟自己首位连接,或者extension的值是负的而且幅度大于路径本身的长度, 等等, 并没有被禁止。对这些退化路径的解释,由应用程序自己处理。在路径内部顶点或者连接点如何使用路径扩展方案(path expansion scheme)也是由应用自己决定。

27.11 异常处理:在隐式模式下使用模态变量path-halfwidth, path-point-list, path-start-extension,

path-end-extension, layer,ordatatype,如果此时它们还没有初始化,处于未定义状态,则认为是fatal错误。

28 TRAPEZOID RECORD

28.1 一个TRAPEZOID记录表示一个梯形图案。这里梯形图案表示四边形中至少两条对边相互平行,并且是跟X轴或者Y轴平行。它有下面格式:

‘23’ trap-info-byte [ layer-number ] [ datatype-number ]

[ width ] [ height ] delta-a delta-b [ x ] [ y ] [ repetition ]

‘24’ trap-info-byte [ layer-number ] [ datatype-number ]

[ width ] [ height ] delta-a [ x ] [ y ] [ repetition ]

‘25’ trap-info-byte [ layer-number ] [ datatype-number ]

[ width ] [ height ] delta-b [ x ] [ y ] [ repetition ]

28.2 其中trap-info-byte是一个bit模式:‘OWHXYRDL’.

28.3 当R是 1 表示后面提供了repetition的数据。当L是 1时表示后面提供了layer -number的数据. 当D是 1 时表示后面提供了datatype -number的数据。layer-numberdatatype-number都是无符号的整型数据。当layer -number或者datatype-number没有指定的时候,分别使用模态变量layer和datatype的值替代。

如果W是 1 表示后面有width的数据。 当H1 表示后面有height的数据。widthheight都是无符号整型数据,用来描述梯形的边界范围(见Figure 28-1)。当width或者height没有指定的时候,使用对应的模态变量geometry-w和geometry-h的值替代。

28.4xy都是有符号的整型数据,表示坐标数据。绝对坐标或者相对坐标(x,y)表示的是梯形边界框(bounding box)左下角顶点的坐标(参考Figure 28-1)。

X1时表示后面提供了x的值;Y是 1 时表示后面提供了y的值。x或者y没有指定的时候,使用对应的模态变量geometry-x或者geometry-y替代。可以参考第21节中的关于相对模式和绝对模式下对于x和y的解释。

28.5delta-adelta-b1-deltas的数据格式,在记录类型‘23’中delta-a和delta-b都会出现。在记录类型 ‘24’delta-b被认为是0从而省略。在记录类型 ‘25’ 中delta-a被认为是0从而省略。

28.6 如果O是 0 那么梯形是水平方向的(平行线和X轴平行),上底 (PQ) 和下底 (RS) 和X轴平行。在这种情况下,delta-a表示 (xP- xR) 而delta-b表示 (xQ- xS) (参考Figure 28-1)。

28.7 如果O是 1 表示这个梯形是垂直方向的。左边边线 (PQ) 和右边边线(RS) 和Y轴平行。在这种情况下,

delta-a表示(yP- yR) 而delta-b表示(yQ- yS) (参考Figure 28-1)。

28.8 每一个TRAPEZOID记录都会更新所有的梯形相关的模态变量(trapezoid-related modal variables)。

28.9 异常处理:对于任何一个梯形,如果deltas的值太大从而导致线段 PR 和QS 相交,或者任何delta导致线段 PR 或者 QS的对角线不在边界框(bounding box)内部(什么时候会发生这个情况??不太明白?反正就是不是一个梯形,就认为是错误。),应该当成是一个fatal错误。如果在隐式时使用未初始化的geometry-w, geometry-h, layer或者datatype认为是一个fatal错误。如果一个梯形面积是0,由应用程序决定如何处理。

29 CTRAPEZOID RECORD

29.1CTRAPEZOIDCompact Trapezoid记录是用紧凑的格式表示一个梯形图形。它预先假定两条边或者是跟X轴平行或者是跟Y轴平行,另外两边则是跟它们成45度或者90度角。它有下面的格式:

‘26’ ctrapezoid-info-byte [ layer-number ] [ datatype-number ]

[ ctrapezoid-type ] [ width ] [ height ] [ x ] [ y ] [ repetition ]

29.2 其中ctrapezoid-info-byte是bit模式: ‘TWHXYRDL’.

29.3 当R是 1 表示后面提供了repetition的数据。当L是 1时表示后面提供了layer -number的数据. 当D是 1 时表示后面提供了datatype -number的数据。layer-numberdatatype-number都是无符号的整型数据。当layer -number或者datatype-number没有指定的时候,分别使用模态变量layer和datatype的值替代。

如果W是 1 表示后面有width的数据。 当H1 表示后面有height的数据。widthheight都是无符号整型数据,用来描述梯形的边界范围(见Figure 29-1)。当width或者height没有指定的时候,使用对应的模态变量geometry-w和geometry-h的值替代。

29.4xy都是有符号的整型数据,表示坐标数据。绝对坐标或者相对坐标(x,y)表示的是梯形边界框(bounding box)左下角顶点的坐标(参考Figure 29-1)。

X1时表示后面提供了x的值;Y是 1 时表示后面提供了y的值。x或者y没有指定的时候,使用对应的模态变量geometry-x或者geometry-y替代。可以参考第21节中的关于相对模式和绝对模式下对于x和y的解释。

29.5T是 1 表示后面有ctrapezoid-type(一个无符号整型数据) 的数据; 否则则使用模态变量ctrapezoid-type的值。ctrapezoid-type值0-25 表示的图形见图 29-1:

29.6 为了兼容一些掩膜写格式的文件,紧凑梯形记录提供了三角形,长方形和正方形的描述。见图29-1中的类型 16-19, 22-23, 和 25。此时高度(height)没有使用,必须将H设成0。对于类型 20-21,宽度(width没有使用,必须将W设成 0.

29.7 每次遇到CTRAPEZOID记录要更新所有跟紧凑梯形相关(ctrapezoid-related)所有模态变量,但下列情况除外:对于值使用了width或者height其中一个变量的紧凑梯形类型 (types 16-23 and 25), 模态变量geometry-w或者geometry-h都需要根据指定的大小尺寸进行更新。

29.8 异常处理: 对于类型0-3, 如果(w < h) 应该认为是fatal错误。对于类型 4-7, 如果 (w < 2h)应该认为是fatal错误。对于类型8-11,如果 (h < w) 认为是 fatal错误。对于类型12-15, 如果(h < 2w) 认为是一个fatal 错误。对于类型16-19, 22-23 和 25, 如果H的值是1 认为是fatal 错误。对于类型 20-21, 如果W的值是1 认为是fatal错误。如果ctrapezoid-type的值大于25 认为是fatal错误。如果隐式模式中使用模态变量ctrapezoid-type, geometry-w, geometry-h, layer或者datatype, 而它们还未初始化处于未定义的状态,应该认为是fatal错误。如果处理面积为0的梯形取决于应用程序。

30 CIRCLE RECORD

30.1 一个CIRCLE记录表示一个圆形的图形。它有下面的格式:

‘27’ circle-info-byte [ layer-number ] [ datatype-number ] [ radius ] [ x ] [ y ] [ repetition ]

30.2 其中circle-info-byte包含一个bit模式:‘00rXYRDL’.

30.3 当R是 1 表示后面提供了repetition的数据。当L是 1时表示后面提供了layer -number的数据. 当D是 1 时表示后面提供了datatype -number的数据。layer-numberdatatype-number都是无符号的整型数据。当layer -number或者datatype-number没有指定的时候,分别使用模态变量layer和datatype的值替代。

30.4xy都是有符号的整型数据,表示圆心的绝对坐标或者相对坐标(x,y)。

X1时表示后面提供了x的值;Y是 1 时表示后面提供了y的值。x或者y没有指定的时候,使用对应的模态变量geometry-x或者geometry-y替代。可以参考第21节中的关于相对模式和绝对模式下对于x和y的解释。

30.4.1 当r是1 时,表示后面提供了radius的数据。否则radius的值使用模态变量circle-radius的值替代。

30.5 每次遇到CIRCLE记录都需要更新跟圆相关的模态变量(circle-related modal variables)。

30.6 异常处理:隐式模式下,使用未定义的模态变量circle-radius, layer,ordatatype认为是fatal错误。对于面积为0的圆的处理由应用程序自己决定。

31 PROPERTY RECORD

31.1 一个属性记录是一个注解元素,由名称加上一串可选的值,用来对OASIS文件或者它的组件补充描述它的特性。一个属性可能跟整个OASIS文件关联,或者跟一个<name>记录,或者跟一个CELL, 或者跟一个PLACEMENT, 或者跟cell中的一个<element>记录 关联。PROPERTY记录有下面的格式:

‘28’ prop-info-byte [ reference-number | propname-string ] [ prop-value-count ] [ <property-value>* ]

‘29’

31.2 记录类型‘29’ 提供了一个紧凑的方式用来复制拷贝一份最近使用的属性和它们的值。它使用模态变量

last-property-name和last-value-list, 它们的值由前一个PROPERTY记录定义。.

31.3 上面的prop-info-byte包含的bit模式是:‘UUUUVCNS’.

31.4 当C=1时,属性的名称引用(name reference)是显式的,在这种情况下,N=1 表示后面有引用数(reference-number: 一个无符号整型数据)的数值,然后根据引用数可以在PROPNAME记录中找到对应的属性名称。当N=0 则表示属性名称字符串(propname-string: 一个n-string类型的数据)直接存放在记录里面。当C=0, 忽略N而使用模态变量last-property-name中的值替代。

31.5 当V=0时,bit模式中UUUU的值从 0 到 14 表示<property-value>中域(fields)的数量,它们属于当前记录的一部分,此时忽略prop-value-count的值。 当V=0 并且UUUU=15, 此时记录会提供prop-value-count的值, 它是一个无符号整型数据, 表示<property-value>中域的数量。 当V=1的时候,UUUU必须是 0, 而模态变量last-value-list提供了值的列表。参考7.8 中关于<property-value>类型的描述。

31.6 当S=1时, 表示标准的属性(standard property); 当S=0时,表示非标准或者用户的属性。 OASIS文件标准属性在附录2中提供,在附录中也描述了怎么将GDSII文件属性转化成S_GDS_PROPERTY标准属性。

31.7 每一个PROPERTY都要更新模态变量last-property-name和last-value-list。

31.8 通常,PROPERTY记录直接跟着它关联的记录的后面。PROPERTY记录如果直接出现在START记录后面表示它是一个关联OASIS文件的一个全局的属性。PROPERTY如果出现在CELL记录后面或者它对应的CELLNAME记录后面则表示这个属性属于整个cell。PROPERTY记录如果出现在PLACEMENT记录后面则表示这个属性属于PLACEMENT描述的放置(placements),包括它的repetitions。

PROPERTY记录如果出现在一个<element>记录后面则属于这个元素和它的repetitions.

31.9PROPERTY记录不跟CBLOCK或者PAD记录关联。当CBLOCK记录被全部解压缩以后,PAD记录被删除以后,属性才跟处理后的数据进行关联。

31.10 异常处理:在隐式模式中,使用未定义的模态变量last-property-name或者 last-value-list是一个致命错误。 使用了reference-number但找不到对应的PROPNAME记录认为是一个致命错误。

32 XNAME RECORD

32.1 一个XNAME记录允许后向兼容的扩展 OASIS文件的<name>记录。它把一个string和一个引用号关联在一起。格式如下:

‘30’ xname-attribute xname-string

‘31’ xname-attribute xname-string reference-number

32.2 其中xname-string是用户定义的名称,它可以是a-string,b-string, 或者n-string的数据类型。xname-attribute是一个无符号整数,把用户自定义的一个类(class)跟XNAME记录关联。reference-number是一个无符号整数,它显式或者隐式的赋值给名字。如果记录类型是‘30’则是隐式赋值, 引用号从0开始每遇到一个XNAME记录则增加1。如果记录类型是 ‘31’则是显式赋值。

32.3 记录类型‘30’ 和 ‘31’ 在同一个OASIS文件中不应该同时出现。

32.4 异常处理:如果在同一个文件中两个XNAME记录有相同的引用号但不同的名字应该认为是fatal错误。(如果有相同的名字但不同的引用号呢?)。如果同一个文件同时出现记录类型 ‘30’ 和 ‘31’ 应该认为是fatal 错误。

33 XELEMENT RECORD

33.1 一个XELEMENT记录允许后向兼容的扩展OASIS文件中的<element>记录。它格式如下:

‘32’ xelement-attribute xelement-string

33.2xelement-attribute是一个无符号整型数据, 把XELEMENT和一个用户定义的类关联在一起。

xelement-string是一个b-string的数据类型,它是用户自定义的数据。

34 XGEOMETRY RECORD

34.1 一个XGEOMETRY允许后向兼容的扩展OASIS的<geometry>记录,它有下面的格式:

‘33’ xgeometry-info-byte xgeometry-attribute

[ layer-number ] [ datatype-number ] xgeometry-string [ x ] [ y ] [ repetition ]

34.2 其中xgeometry-info-byte包含的是一个bit模式: ‘000XYRDL’.

34.3 当R是 1 表示后面提供了repetition的数据。当L是 1时表示后面提供了layer -number的数据. 当D是 1 时表示后面提供了datatype -number的数据。layer-numberdatatype-number都是无符号的整型数据。当layer -number或者datatype-number没有指定的时候,分别使用模态变量layer和datatype的值替代。

34.4xy都是有符号的整型数据,表示绝对坐标或者相对坐标位置(x,y)。

X1时表示后面提供了x的值Y是 1 时表示后面提供了y的值。当x或者y没有指定的时候,使用对应的模态变量geometry-x或者geometry-y替代。可以参考第21节中的关于相对模式和绝对模式下对于x和y的解释。

34.5xgeometry-attribute是一个整数,把XGEOMETRY和一个用户定义的类关联在一起。xgeometry-string是一个b-string类型的数据,里面是用户自定义的几何数据。

34.6 每一个XGEOMETRY记录都会更新所有跟XGEOMETRY相关的模态数据。

34.7 异常处理:隐式的使用未定义的模态变量layer或者datatype是一个fatal错误.

35 CBLOCK RECORD

35.1 一个CBLOCK记录提供了一个机制,它允许在一个OASIS文件的结构中嵌入压缩后的数据, 从而提供进一步的压缩。它有下面的格式:

‘34’ comp-type uncomp-byte-count comp-byte-count comp-bytes

35.2 其中comp-type是一个无符号的整数,描述这个记录的压缩类型。uncomp-byte-count

是一个无符号的整数描述压缩前的数据的长度有多少个bytes。comp-byte-count是一个无符号整型数据表示压缩后的数据长度是多少bytes。comp-bytes是一个byte序列表示压缩后的字节序列。

35.3 当comp-type=0 时,压缩方案时无损的DEFLATE Compressed Data Format ,Version 1.3,

在RFC 1951 (1996)中描述。其它的comp-type值在OASIS中保留到以后使用, 目的时在同一个OASIS文件中可以支持混合的压缩方式以达到最大的压缩率。

35.3.1 一个兼容 RFC 1951 压缩/解压方式的软件例子是 ZLIB version 1.1.4 (March 2002)。 这个软件版本可以不需要license和其它授权自由使用。可以期待将来的ZLIB软件也会兼容RFC-1951。用户使用未来版本的ZLIB需要自己注意检查RFC1951的兼容性和用户条款。

35.3.2 并不需要强制使用ZLIB以满足OASIS的协议标准。任何压缩/解压软件,只要满足RFC 1951 都是OASIS兼容的。应当注意将来可能会出现CBLOCK的替代记录,支持其它的压缩方式。并不排除在一个OASIS文件中支持多种压缩方式。

35.4START,END,CELL, 和嵌套的CBLOCK记录不能存放在压缩的记录里面。这可以使得在一个OASIS文件中保证对cell一级数据的随机访问能力。一个CBLOCK记录不能封装多于一个的“strictmode” 名称表(name table,这部分内容参考第13 和 14 节)。 其它所有记录序列,包括任何长度,都可以存放在CBLOCK记录里面。

35.5 异常处理:当读取CBLOCK记录时,如果解压缩以后的数据长度不匹配uncomp-byte-count认为时一个致命错误。

36 DETAILED BNF SYNTAX

这个如果翻译就不准确了。直接看协议原文吧。

附录1计算验证签名

A1-1 CRC32验证签名的C语言源代码

A1-2 CHECKSUM32验证签名的C语言源代码

附录2OASIS标准属性

A2-1文件一级的标准属性

A2-1.1 Any file-level standard properties must appear immediately after theSTARTrecord in an OASIS file. Use of

file-level standard properties is optional—OASIS processors may omit/ignore any or all of them.

A2-1.2S_MAX_SIGNED_INTEGER_WIDTH

This property declares the maximum number of bytes required to represent anysigned-integerin the file, after all

continuation bits have been removed and the integer has been expressed in twos-complement form. Its value list consists of a singleunsigned-integer.

A2-1.3S_MAX_UNSIGNED_INTEGER_WIDTH

This property declares the maximum number of bytes required to represent anyunsigned-integerin the file, after all

continuation bits have been removed. Its value list consists of a singleunsigned-integer.

A2-1.4S_MAX_STRING_LENGTH

This property declares the maximum number of bytes permitted in any string within the file. Its value list consists of

a singleunsigned-integer.

A2-1.5S_POLYGON_MAX_VERTICES

This property declares the maximum number of vertices permitted in any polygon within the file, including any

implicit vertices, but counting the initial vertex only once. Its value list consists of a singleunsigned-integer.

A2-1.6S_PATH_MAX_VERTICES

This property declares the maximum number of vertices permitted in any path within the file. Its value list consists of

a singleunsigned-integer.

A2-1.7S_TOP_CELL

This property is used to declare the name of the “top cell” of a cell hierarchy. Its value list consists of a singlenstring. It may be repeated if more than one distinct cell hierarchy exists within the OASIS file in which it appears.

A2-1.8S_BOUNDING_BOXES_AVAILABLE

This property indicates whether or not S_BOUNDING_BOX properties appear inCELLNAMErecords. Its value

list consists of a singleunsigned-integer. A value of 0 means that S_BOUNDING_BOX properties are not provided.

A value of 1 means that at least some S_BOUNDING_BOX properties are provided. A value of 2 means that an

S_BOUNDING_BOX property is provided for everyCELLNAMErecord.

A2-2 Cell一级的标准属性

A2-2.1 Any cell-level standard properties must appear immediately after the correspondingCELLNAMErecord in

an OASIS file. Use of cell-level standard properties is optional—OASIS processors may omit/ignore any or all of

them.

A2-2.2S_BOUNDING_BOX

This property may occur once after eachCELLNAMErecord, and declares the bounding box of that cell. Its value

list consists of the following 5 fields: <flags> <lower-left-x> <lower-left-y> <width> <height>. The lower-left-x and

lower-left-y fields aresigned-integersrepresenting the lower-left corner of the cell’s bounding box. The width and

height fields areunsigned-integersrepresenting the width and height of the cell’s bounding box. The bounding box

should be calculated to cover the full extent of all geometric figures and text element (x,y) points within that cell and

all of its subcells after a full expansion of any hierarchy beneath the cell.

The flags field is anunsigned-integer. Only the least-significant 3 bits are presently defined, and have the following

meanings:

flags.bit.0: 0 = bounding box is known

1 = bounding box is unknown

flags.bit.1: 0 = bounding box is non-empty

1 = bounding box is empty

flags.bit.2: 0 = bounding box depends on no external cells

1 = bounding box depends on one or more external cells

A2-2.3S_CELL_OFFSET

This property may occur once after eachCELLNAMErecord. Its value list consists of a singleunsigned-integer

which declares the byte offset from the beginning of the file (byte 0) to where the correspondingCELLrecord

appears in the file. An offset value of 0 denotes anexternalcell, with no correspondingCELLrecord in the same

OASIS file.

A2-3元素一级的属性

A2-3.1S_GDS_PROPERTY

This property is intended exclusively for compatibility with GDSII Stream properties. It may occur one or more times after any element within aCELLdefinition. Its value list contains exactly two values in sequence: <attribute>, anunsigned-integer, and <propvalue-string>, ab-string. These values correspond to GDSII Stream PROPATTR and

PROPVALUE records, respectively.

文末提醒:

这里是版权责任相关的说明。就是如果文中的技术涉及到相关专利和版权,需要使用者自己去处理。不再翻译。

至此,协议翻译完毕。后面是一些自己的理解。

译者的其它一些说明

下一步的计划是写一个开源的oasis协议分析器,这个不知能否完成。后面是自己的一些想法。

实践的一些经验,为了保持可靠稳健性,以便大部分的软件都能兼容,推荐遵循以下准则:

只要有可能,都使用严格模式(strict mode), 并且只要有可能,所有引用都使用引用号,而不是名称。 用CBlocks来压缩数据,而不要压缩整个文件。使用 CRC验证方法来校验完整性。当不确定的时候,对于使用类型8的repetitions (for arrays) 或者类型 10的repetitions (for random repetitions) : 它们更通用。旋转的时候尽可能使用90度角的倍数,任意角度的旋转在实际中没有太大的意义(EUV中freeform可能除外)。

oasis文件的解析

oasis文件的解析应该分成两层的结构来进行解析。

第一层结构:

START, CBLOCK, PAD, PROPERTY, CELLNAME, TESTSTRING, LAYERNAME, PROPNAME, PROPSTRING, XNAME, CELL

第二层结构,是对CELL进行解析:

CBLOCK, PAD, PROPERTY, XYRELATIVE, XYABSOLUTE, PLACEMENT, TEXT, XELEMENT, RECTANGLE, POLYGON, PATH, TRAPEZOID, CTRAPEZOID, CIRCLE, XGEOMETRY.

其解析结构如下图所示。说明如下:

其中红色的是一个oasis文件中必须出现的项目。而且只能出现一次。黄色的部分是第一层和第二层冲突的部分,也就是说当出现的时候,你无法确定是出现在第一层还是第二层,是该在第一层解析还是该在第二层解析?现在对于冲突部分,程序的做法是当冲突出现的时候,当前在第一层就在第一层解析;当前在第二层就在第二层解析。首先应该在第一层进行解析,当出现CELL的时候,进入第二层解析。当第二层解析到不能识别的关键字的时候,返回到第一层解析。特别注意<geometry>、<element>和<name>字段中的大括号中的域是不能重复出现的,而<cell>和<oasis-file>中的大括号中的字段是可以重复出现的。

OASIS文件例子说明

这里随便找了一个oasis文件根据协议进行解读分析。

开始部分

00000000h:25 53 45 4D 49 2D 4F 41 53 49 53 0D 0A01 0331 ; %SEMI-OASIS....1

magic-bytes start record

00000010h: 2E 3007 00 00 00 00 00 40 9F 400000 00 00 00; .0......@烜.....

unit ,ieee-8-byte-float

00000020h:00 0000 00 00 00 00 000B 04 50 4C 5F 46 03 00 ; ..........PL_F..

talbe-offset layername record

00000030h: 03 00 0B 07 50 4C 5F 53 42 5F 46 03 03 03 00 04 ; ....PL_SB_F.....

layername record cellname record

00000040h: 09 76 65 72 74 5F 63 65 6C 6C 00 0D 00 15 3B 00 ; .vert_cell....;.

cell record polygon record

00000050h: 0002 1BA0 0D DD 04 9A 01 91 03 08 E1 03 22 A9 ; ...????.?"?

第2类point-list,有27个点。1-8个

00000060h: AB 04 20 E1 03 0A 91 03 98 01 DD 04 A2 0DDF 04; ? ?.?????

8 9 10 11 12 13 14 15 16

00000070h: 98 0193 03 0E E3 03 24 AB AB 04 26 E3 03 0C 93 ; ??.?$.&?.?

17 18 19 20 21 22 23 24 25 26

00000080h: 03 9A 01 8C 91 17 8D D9 09 15 30 02 1BA0 0D DD ; .?寫.嵸..0..??

26 27 x y polygon record

00000090h: 04 9A 01 91 03 0C E1 03 26 A9 AB 04 24 E1 03 0E ; .??.?&┇.$?.

2 3 4 5 6 7 8 9 10 11

000000a0h: 91 03 98 01 DD 04 A2 0D DF 04 98 01 93 03 0A E3 ; ???????.?

12 20

000000b0h: 03 20 AB AB 04 22 E3 03 08 93 03 9A 01 CC D2 16 ; . ."?.??桃.

20 21 22 27 x

000000c0h: 15 38 02 0F DC 04 A1 0B 3A E9 8B 02 18 C9 0B BE ; .8..??:閶..??

polygon record 后面类似,就不一一分析了

000000d0h: 04 DB 04 5C 93 03 1A EB 8B 02 2E E3 03 1A F8 9C ; .?\?.雼..?.鴾

000000e0h: 2B 93 88 19 15 38 02 93 01 7C 93 03 06 E3 03 28 ; +搱..8.?|?.?(

000000f0h: CB 0B 26 E3 03 04 93 03 7E 87 05 88 05 7D 90 03 ; ?&?.?~??}?

00000100h: 0F E0 03 3D 88 4A 3F E0 03 09 90 03 7B 88 05 85 ; .?=圝??.?{??

00000110h: 05 76 91 03 04 E1 03 2E C9 88 01 2C E1 03 0A 91 ; .v?.?.蓤.,?.?

结尾部分

00090ec0h: 14 54 5A F6 E0 7F 00 14 14 86 B9 80 01 01 00 00 ; .TZ鲟...喒€....

00090ed0h: DE 02 FC 48 14 14 BA A3 81 01 00 14 14 86 B6 81 ; ?麳..海?...喍?

00090ee0h: 01 00 14 14 DA C2 81 01 00 14 14 A6 D5 81 01 00 ; ....诼?...φ?.

00090ef0h: 14 14 FA E1 81 01 00 14 14 C6 F4 81 01 00 14 14 ; ..?...启?...

00090f00h: 9A 81 82 01 00 14 14 E6 93 82 01 00 14 3C 8E 4D ; 殎?...鎿?..<嶮

00090f10h: BA A0 82 01 87 82 3C 01 00 00 DE 02 9C 4F 14 14 ; 籂?噦<...?淥..

00090f20h: 86 B3 82 01 00 14 3C EE 46 DA BF 82 01 C7 F5 3B ; 喅?..<頕诳?酋;

00090f30h: 01 00 00 DE 02 FC 48 14 14 A6 D2 82 01 00 14 14 ; ...?麳..σ?...

00090f40h: FA DE 82 01 00 14 14 C6 F1 82 01 00 14 14 9A FE ; ?...岂?...汘

00090f50h: 82 01 00 14 14 E6 90 83 01 00 14 14 BA 9D 83 01 ; ?...鎼?...簼?

00090f60h: 00 14 14 86 B0 83 01 00 14 14 FA A6 84 01 00 14 ; ...啺?...?..

00090f70h: 14 C6 B9 84 01 00 14 14 BA CC 84 01 00 14 14 86 ; .乒?...禾?...?

00090f80h: DF 84 01 00 14 14 FA F1 84 01 00 14 14 C6 84 85 ; 邉....?...苿?

00090f90h: 01 00 14 3C 8E 4D BA 97 85 01 87 82 3C 01 00 00 ; ...<嶮簵?噦<...

00090fa0h: DE 02 9C 4F 14 14 86 AA 85 01 00 14 3C EE 46 FA ; ?淥..啰?..<頕?

00090fb0h: BC 85 01 C7 F5 3B 01 00 00 DE 02 FC 48 14 14 C6 ; 紖.酋;...?麳..?

end record,后面是padding-string,

使得end record总长度为256(16×16),padding-string是一个b-string,那么第一个byte应该表示长度256-4=252,也就是FC。

00090fc0h: CF 85 01 00 14 14 BA E2 85 01 00 14 14 86 F5 85 ; 蠀....衡?...嗸?

00090fd0h: 01 00 14 14 FA 87 86 01 00 14 14 C6 9A 86 01 00 ; ....鷩?...茪?.

00090fe0h: 02 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ; .€€€€€€€€€€€€€€€

00090ff0h: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ; €€€€€€€€€€€€€€€€

00091000h: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ; €€€€€€€€€€€€€€€€

00091010h: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ; €€€€€€€€€€€€€€€€

00091020h: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ; €€€€€€€€€€€€€€€€

00091030h: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ; €€€€€€€€€€€€€€€€

00091040h: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ; €€€€€€€€€€€€€€€€

00091050h: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ; €€€€€€€€€€€€€€€€

00091060h: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ; €€€€€€€€€€€€€€€€

00091070h: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ; €€€€€€€€€€€€€€€€

00091080h: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ; €€€€€€€€€€€€€€€€

00091090h: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ; €€€€€€€€€€€€€€€€

000910a0h: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ; €€€€€€€€€€€€€€€€

000910b0h: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ; €€€€€€€€€€€€€€€€

000910c0h: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 ; €€€€€€€€€€€€€€€€

000910d0h: 80 80 80 80 80 80 80 80 80 80 80 80 80 80 00 00 ; €€€€€€€€€€€€€€..

这里没有严格按照标准,严格按照标准的话,这里应该是只有一个00,表示validation-scheme。而且长度也只有256个字节的长度。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。