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.5 table-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 (a b-string) 必须是由OASIS写者计算和写入的,它的目的是使整个END记录,包括record-ID, 正好是256个字节。这样,OASIS的读者就可以从文件的末尾开始寻找,正确找到END记录(以及相关的table-offsets和validation-signature), 从而避免存一个指向START记录的前向指针。padding-string的内容必须初始化成NUL字符。
14.3 validation-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.2 cellname-string 是一个n-string类型的数据,存放着cell的名称。Reference-number是一个无符号整数,它显式或者隐式的赋值给一个cell。如果记录类型是’3’, 那么它是非明显的赋值,它从0开始赋值,每个CELLNAME记录都递增1来赋值。如果记录类型是’4’,那它是明显赋值,对应的reference-number就是记录中赋值的无符号整数
15.3 两个标准的属性: S_BOUNDING_BOX 和 S_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.2 text-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.2 propname-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.2 prop-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.3 layername-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.1 XYABSOLUTE 和XYRELATIVE 记录 控制模态变量(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 模式中,如果显式的提供了x 和 y 的值, 那么他们就是实际的 (x,y) 坐标值。
21.4 在relative 模式中,如果显式的提供了x 和 y 的值,那么需要根据对应的记录类型,将他们解释成对应模态变量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, or text-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.5 x 和y 是有符号整型的坐标数据,表示放置位置的绝对或者相对坐标的(x,y)值。X is 1 表示后面提供了 x的值,而 Y is 1 则表示后面提供了 y 的值。当任何一个x 或者 y 没有指定的时候,就使用模态变量
placement-x 或者 placement-y 来替代对应的x或者y的值。参考21节关于绝对和相对模式对x和y的解释。
22.6 R 是 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度(不需要调整角度)。 M is 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-offset 和 y-offset 的相关讨论)
(译者注:这个就是图形视觉计算的相关公式,任何一本视觉计算的书都会提到这个计算矩阵)
24 TEXT RECORD
24.1 TEXT 记录表示一个文本元素,由一个 (x,y) 坐标点和注解字符串(annotation string)组成。它有下列格式:
‘19’ text-info-byte [ reference-number | text-string] [ textlayer-number ] [ texttype-number ]
[ x ] [ y ] [ repetition ]
24.2 text-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.4 x 和y 是有符号的整型数据, 表示文本元素的绝对或者相对坐标(x,y)。当X 是1时表示后面提供了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-number 和 texttype-number 都是无符号的整型数据。当 textlayer-number 或者 texttype-number 没有指定的时候,分别使用模态变量textlayer 和 texttype 的值替代。
24.6 每一个TEXT 记录都需要更新所有的文本相关的(text-related)模态变量。
24.7 异常处理:如果TEXT记录中reference-number 在同一个OASIS文件中没有对应的TEXTSTRING 记录 认为是fatal错误。当模态变量 textlayer or texttype在隐式状态下使用的时候,它们还处于未定义的状态,认为是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-number 和 datatype-number 都是无符号的整型数据。当 layer-number 或者 datatype-number 没有指定的时候,使用对应模态变量layer 和 datatype的值替代。如果W 是 1 表示后面有 width 的数据。 当 H 是 1 表示后面有 height 的数据。width 和 height 都是无符号整型数据。当 width 或者 height 没有指定的时候,使用对应的模态变量 geometry-w 和geometry-h的值替代。
25.4 当S 是 1 表示这个矩形是一个正方形。在这种情况下, H 必须是 0。 如果提供了width 的值,则将其作为长和宽的值。当width 没有指定的时候,使用模态变量geometry-w 的值替代。
25.5 x 和y 都是有符号的整型数据,表示坐标数据。绝对坐标或者相对坐标(x,y)表示的是矩形左下角顶点的坐标。
当X 是1时表示后面提供了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.3 x 和 y 都是表示坐标的有符号整型数据。(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-number 和 datatype-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.3 x 和 y 是表示坐标的有符号的整数, 它表示的是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-number 和 datatype-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-extension和 end-extension 都没有数据,而使用模态变量path-start-extension 和 path-end-extension 来替代。
27.8 当提供了extension-scheme (一个无符号整型) 的数据的时候,它是一个bit模式: ‘0000SSEE’。 The SS 两个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, or datatype ,如果此时它们还没有初始化,处于未定义状态,则认为是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-number 和 datatype-number 都是无符号的整型数据。当 layer -number 或者 datatype-number 没有指定的时候,分别使用模态变量layer 和 datatype的值替代。
如果W 是 1 表示后面有 width 的数据。 当 H 是 1 表示后面有 height 的数据。width 和 height 都是无符号整型数据,用来描述梯形的边界范围(见Figure 28-1)。当 width 或者 height 没有指定的时候,使用对应的模态变量 geometry-w 和geometry-h的值替代。
28.4 x 和y 都是有符号的整型数据,表示坐标数据。绝对坐标或者相对坐标(x,y)表示的是梯形边界框(bounding box)左下角顶点的坐标(参考Figure 28-1)。
当X 是1时表示后面提供了x的值; 当 Y 是 1 时表示后面提供了 y 的值。当x 或者 y 没有指定的时候,使用对应的模态变量geometry-x 或者 geometry-y替代。可以参考第21节中的关于相对模式和绝对模式下对于x和y的解释。
28.5 delta-a 和delta-b 是 1-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.1 CTRAPEZOID (Compact 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-number 和 datatype-number 都是无符号的整型数据。当 layer -number 或者 datatype-number 没有指定的时候,分别使用模态变量layer 和 datatype的值替代。
如果W 是 1 表示后面有 width 的数据。 当 H 是 1 表示后面有 height 的数据。width 和 height 都是无符号整型数据,用来描述梯形的边界范围(见Figure 29-1)。当 width 或者 height 没有指定的时候,使用对应的模态变量 geometry-w 和geometry-h的值替代。
29.4 x 和y 都是有符号的整型数据,表示坐标数据。绝对坐标或者相对坐标(x,y)表示的是梯形边界框(bounding box)左下角顶点的坐标(参考Figure 29-1)。
当X 是1时表示后面提供了x的值; 当 Y 是 1 时表示后面提供了 y 的值。当x 或者 y 没有指定的时候,使用对应的模态变量geometry-x 或者 geometry-y替代。可以参考第21节中的关于相对模式和绝对模式下对于x和y的解释。
29.5 T 是 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-number 和 datatype-number 都是无符号的整型数据。当 layer -number 或者 datatype-number 没有指定的时候,分别使用模态变量layer 和 datatype的值替代。
30.4 x 和y 都是有符号的整型数据,表示圆心的绝对坐标或者相对坐标(x,y)。
当X 是1时表示后面提供了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, or datatype 认为是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.9 PROPERTY 记录不跟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.2 xelement-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-number 和 datatype-number 都是无符号的整型数据。当 layer -number 或者 datatype-number 没有指定的时候,分别使用模态变量layer 和 datatype的值替代。
34.4 x 和y 都是有符号的整型数据,表示绝对坐标或者相对坐标位置(x,y)。
当X 是1时表示后面提供了x的值; 当 Y 是 1 时表示后面提供了 y 的值。当x 或者 y 没有指定的时候,使用对应的模态变量geometry-x 或者 geometry-y替代。可以参考第21节中的关于相对模式和绝对模式下对于x和y的解释。
34.5 xgeometry-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.4 START, END, CELL, 和嵌套的 CBLOCK 记录不能存放在压缩的记录里面。这可以使得在一个OASIS文件中保证对cell一级数据的随机访问能力。一个 CBLOCK 记录不能封装多于一个的“strict mode” 名称表(name table,这部分内容参考第13 和 14 节)。 其它所有记录序列,包括任何长度,都可以存放在CBLOCK 记录里面。
35.5 异常处理:当读取CBLOCK 记录时,如果解压缩以后的数据长度不匹配uncomp-byte-count 认为时一个致命错误。
36 DETAILED BNF SYNTAX
这个如果翻译就不准确了。直接看协议原文吧。
附录1: 计算验证签名
A1-1 CRC32验证签名的C语言源代码
略
A1-2 CHECKSUM32 验证签名的C语言源代码
略
附录2: OASIS 标准属性
A2-1 文件一级的标准属性
A2-1.1 Any file-level standard properties must appear immediately after the START record in an OASIS file. Use of
file-level standard properties is optional—OASIS processors may omit/ignore any or all of them.
A2-1.2 S_MAX_SIGNED_INTEGER_WIDTH
This property declares the maximum number of bytes required to represent any signed-integer in 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 single unsigned-integer.
A2-1.3 S_MAX_UNSIGNED_INTEGER_WIDTH
This property declares the maximum number of bytes required to represent any unsigned-integer in the file, after all
continuation bits have been removed. Its value list consists of a single unsigned-integer.
A2-1.4 S_MAX_STRING_LENGTH
This property declares the maximum number of bytes permitted in any string within the file. Its value list consists of
a single unsigned-integer.
A2-1.5 S_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 single unsigned-integer.
A2-1.6 S_PATH_MAX_VERTICES
This property declares the maximum number of vertices permitted in any path within the file. Its value list consists of
a single unsigned-integer.
A2-1.7 S_TOP_CELL
This property is used to declare the name of the “top cell” of a cell hierarchy. Its value list consists of a single nstring. It may be repeated if more than one distinct cell hierarchy exists within the OASIS file in which it appears.
A2-1.8 S_BOUNDING_BOXES_AVAILABLE
This property indicates whether or not S_BOUNDING_BOX properties appear in CELLNAME records. Its value
list consists of a single unsigned-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 every CELLNAME record.
A2-2 Cell一级的标准属性
A2-2.1 Any cell-level standard properties must appear immediately after the corresponding CELLNAME record in
an OASIS file. Use of cell-level standard properties is optional—OASIS processors may omit/ignore any or all of
them.
A2-2.2 S_BOUNDING_BOX
This property may occur once after each CELLNAME record, 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 are signed-integers representing the lower-left corner of the cell’s bounding box. The width and
height fields are unsigned-integers representing 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 an unsigned-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.3 S_CELL_OFFSET
This property may occur once after each CELLNAME record. Its value list consists of a single unsigned-integer
which declares the byte offset from the beginning of the file (byte 0) to where the corresponding CELL record
appears in the file. An offset value of 0 denotes an external cell, with no corresponding CELL record in the same
OASIS file.
A2-3 元素一级的属性
A2-3.1 S_GDS_PROPERTY
This property is intended exclusively for compatibility with GDSII Stream properties. It may occur one or more times after any element within a CELL definition. Its value list contains exactly two values in sequence: <attribute>, an unsigned-integer, and <propvalue-string>, a b-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 0A 01 03 31 ; %SEMI-OASIS....1
magic-bytes start record
00000010h: 2E 30 07 00 00 00 00 00 40 9F 40 00 00 00 00 00 ; .0......@烜.....
unit ,ieee-8-byte-float
00000020h: 00 00 00 00 00 00 00 00 0B 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: 00 02 1B A0 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 0D DF 04 ; ? ?.?????
8 9 10 11 12 13 14 15 16
00000070h: 98 01 93 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 1B A0 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个字节的长度。