本文虽说是介绍用C语言程序来编辑GDSII文件,其实用什么程序语言来写都是可以,只不过选择C语言,有利用大家交流和应用,而且无论你使用的是windows,还是其他操作系统都可以运行该程序。
从这篇文章中,本人并不希望读者仅看到程序的本身,最终目的是希望大家能够初步了解到GDSII file的格式。
首先,将如图所示的版图,通过工具输出名字m2t.DB GDSII格式的database。
在unix系统用使用
%od -x m2t.DB
查看文件的十六进制格式,显示如下:
0000000 0006 0002 0005 001c 0102 0068 0002 001b 0000020 000b 0015 001b 0068 0002 001b 000b 0026 0000040 0030 0010 0206 464c 4154 3034 4f46 2e44 0000060 4200 0014 0305 3e41 8937 4bc6 a7ef 3944 0000100 b82f a09b 5a51 001c 0502 0046 0001 0001 0000120 0008 0000 0000 0068 0002 0017 000f 001c 0000140 0008 0008 0606 6d32 7400 0004 0800 0006 0000160 0d02 0006 0006 0e02 0000 002c 1003 ffff 0000200 fdf8 ffff fdf8 0000 0208 ffff fdf8 0000 0000220 0208 0000 0208 ffff fdf8 0000 0208 ffff 0000240 fdf8 ffff fdf8 0004 1100 0004 0700 0004 0000260 0400 0000 0000 0000 0000 0000 0000 0000 0000300 0000 0000 0000 0000 0000 0000 0000 0000
显示第一段表明字符的位置,可以忽略,其他将依次向大家解释。
0006 0002 0005
其中0006表示这段所用的字节数为6(0006h)个字节,0002表示一个代码HEADER,常见的如:
0102:BGNLIB,0206:LIBNAME,0900:PATH,0D02:LAYER等共69种,0002中00是HEADER记录类型,02则表示
这个记录的类型,此类型称为datatype共有6种:
0:no data present;
1:bit array;
2:two-byte signed integer;
3:four-byte signed integer;
4:four-byte real;
5:eight-byte real;
6:ascii string
最后两个字节0005表示文件格式的版本5(0005h)
001c 0102 0068 0002 001b 000b 0015 001b 0068 0002 001b 000b 0026 0030
001c表示本段字节数28(001c),0102为BGNLIB,datatype为02。0068-0030表示database最终访问
时间,格式为年、月、日。注意年份要加上1900,如0068h=104,104+1900=2004以此计算时间为
2004.2.27 11:21 27秒到2004.2.27 11:38 48秒。
0010 0206 464c 4154 3034 4f46 2e44 4200
本段字节数16(0010h),0206表示LIBNAME,datatype为06字符型。46h ASCII码为F,以此类推库的名称为
FLAT04OF.DB
0014 0305 3e41 8937 4bc6 a7ef 3944 b82f a09b 5a51
本段字节数20(0014h),0305表示UNITS,datatype为5为八字节实数,3e41-5a51表示1E-3即.001
001c 0502 0046 0001 0001 0008 0000 0000 0068 0002 0017 000f 001c 0008
这段表示库的时间为1970.1.1 8:00 0--2004.2.23 15:28 8
0008 0606 6d32 7400
这段字节数8,0606为STRNAME,datatype为06字符型,表示structure name为m2t
0004 0800
本字段4字节,0800为BOUNDARY
0006 0d02 0006
本字段6字节,0d02为LAYER,layer number为6
0006 0e02 0000
本字段6字节,0e02为DATATYPE,datatype为0,即是drawing
002c 1003 ffff fdf8 ffff fdf8 0000 0208 ffff fdf8 0000
0208 0000 0208 ffff fdf8 0000 0208 ffff fdf8 ffff fdf8
本字段44(2ch)字节,1003为XY即是坐标值。图形坐标值见上图
ffff 表示为负数,0000 表示为正数;
0208h=0520, 520/units=0.520
fdf8 求补码即反码+1-->1111 1101 1111 1000取反-->0000 0010 0000 0111 + 1
-->0000 0010 0000 1000 = 520
0004 1100
本字段4字节,1100为ENDEL
0004 0700
本字段4字节,0700为ENDSTR
0004 0400
本字段4字节,0400为ENDLIB
在了解了GDSII 格式以后,用C 语言写就简单多了,因为只要利用文件操作函数
就可以搞定了。
下面是个范例,写入HEADER部份到gdsii 文件中
#include <stdion.h>
FILE *fp;
WrHEADER() {char strCode[6]; strCode[0]=0; strCode[1]=6; strCode[2]=0; strCode[3]=2; strCode[4]=0; strCode[5]=5;
Wr2GDS(strCode,6); }
Wr2GDS(wp,n) int n; char *wp; { fwrite(wp,1,n,fp); }
main() {fp=fopen("test.gds","wb"); WrHEADER(); fclose(fp); }
写入到test.c,然后编译出来运行
%cc -o test.exe test.c
%test.exe
这样就将HEARDER部分0006 0002 0005写入到test.gds文件中
其他部分依此类推,就可以用c语言创造或编辑GDSII格式的文件了。
当然在细节部分,还需要进行适当改正,以保证程序应付更多的情况。 如有疑问,请与nfmao联系 [参考文献] 《stream format》--cadance openbook |