gds_curr gds; → カレント情報を入れる環境を定義
gds_init(); → 一部のパラメータを初期化
gds_input(); → streamの読み込み(リンクはしない)
gds_link(); → 階層構造のリンク
sailによるLDデータの読み込み(リンクはしない)
gds_link(); → 階層構造リンク
gds_tran_scell(); → SCELL展開(SXデータの場合のみ)
gds_output(); → rootのリンクを辿って順に出力
/* gds2 element type */ → GDS2ライブラリで使用するエレメントタイプ
#define BOUN 0x08 → BOUN〜TEXTはstreamの内部表現を流用
#define PATH 0x09
#define SREF 0x0a
#define AREF 0x0b
#define TEXT 0x0c
#define SSREF 0x8a → SX9000のSCELLを表す
#define SAREF 0x8b → SX9000のアレイがSCELLである場合を表す
/* gds2 data structure */
typedef char str43[44];
typedef struct prop {
short type; → atype,プロパティ番号
char *value; → プロパティ文字列
struct prop *next; → 次のプロパティへのポインタ
} *propptr;
typedef struct elem { → 全てのエレメントはこの構造を最初に持つ
short type; → エレメントタイプ
struct elem *next; → 次のエレメントへのポインタ
struct prop *prop; → プロパティへのポインタ
} *elemptr;
typedef struct cell { → セル構造体
short type; → 汎用だがSXデータの場合、CKINDの値を持つ
struct elem *next;
struct prop *prop; → セルはプロパティを持たないので汎用に使える
struct ptxy *xy; → 汎用だが、SCELLの場合は第2原点を表す
struct cell *link; → セルリストを構成するリンク
char *name; → セル名
str17 create; → 作成日(emptyの場合、undefセルとみなす)
str17 modify; → 修正日
} *cellptr;
typedef struct pathref { → Pathで端の突き出しや、線幅を表す
short type; → 線種
long width; → 線幅
} *pathrefptr;
typedef struct dirref { → Sref,Aref,Textで方向や倍率を表す
short mir; → 反転指定(strans,MSBが1のときreflect)
double mag; → 倍率指定
double ang; → 角度
} *dirrefptr;
typedef struct ptxy { → 座標を表す構造体
long x;
long y;
struct ptxy *next;
} *xyptr;
typedef struct path { → Path構造体
short type;
struct elem *next;
struct prop *prop;
struct ptxy *xy;
short layer;
short dtype;
struct pathref path;
} *pathptr;
typedef struct boun { → Boundary構造体
short type;
struct elem *next;
struct prop *prop;
struct ptxy *xy;
short layer;
short dtype;
short rtype; →矩形のストレッチ属性(SXのみ、矩形以外は-1)
} *bounptr;
typedef struct text { → Text構造体
short type;
struct elem *next;
struct prop *prop;
struct ptxy *xy;
short layer;
short ttype;
struct dirref text;
short present;→ フォント情報
char *string;
} *textptr;
typedef struct sref { → Cell引用構造体
short type;
struct elem *next;
struct prop *prop;
struct ptxy *xy; → 通常1点だが、SCELLの場合は第2原点含め2点
struct cell *down; → NULLの場合は、undefセルを表す
char *name; → セル名(gds_linkする際に使用する)
struct dirref cell;
} *srefptr;
typedef struct aref { → Array引用構造体
short type;
struct elem *next;
struct prop *prop;
struct ptxy *xy; → 通常原点とピッチ情報の3点だが、SCELLの場合は第2原点が2点目の位置に割り込む
struct cell *down; → NULLの場合は、undefセルを表す
char *name; → セル名(gds_linkする際に使用する)
struct dirref cell;
short col;
short row;
} *arefptr;
/* global parameter structure */
typedef struct g_crr {
FILE *ifp,*ofp,*lfp;
unsigned char head[4],data[2048]; → データ入出力用バッファ
short data_n; → データbyte数
str255 file_name; → streamファイル名
str43 lib_name; → streamライブラリ名
elemptr tail; → Work用ポインタ
str17 ccre; → Work用セル作成日
str17 cmod; → Work用セル修正日
str17 create; → ライブラリ作成日
str17 modify; → ライブラリ修正日
stringptr namestring; → セル名等の文字列へのリンク
cellptr root; → セルリストへのリンク
cellptr common; → Commonセル用リンク(未使用)
short version; → streamバージョン
str43 font[4]; → streamフォントライブラリ
double bunit; → データベースユニット
double bgrid; → Basicグリッド
/* layer parameter */
short layer; → カレントlayer
short dtype; → カレントdtype
/* ptext parameter */
short present; → カレントFont,Text原点
struct dirref text; → カレントTextパラメータ
/* line parameter */
struct pathref path; → カレントPathパラメータ
/* cell placement parameter */
struct dirref cell; → カレントCellパラメータ
} gds_curr;
void gds_init() → GDS2構造の初期化
FILE *gds_input() → streamファイルの読み込み
void gds_output() → streamファイルへの書き出し
cellptr gds_link_cell() → 指定名称のセルを生成してポインタを返す
void gds_crea_lib() → GDS2構造にライブラリ名、作成日を設定
cellptr gds_find_cell() → 指定名称のセルを捜してポインタを返す
void gds_set_cell() → カレントのCell設定
void gds_set_path() → カレントのPath設定
void gds_set_text() → カレントのText,Font設定
bounptr gds_rect() → 矩形の生成(Boundary)
bounptr gds_boundary() → Boundaryの生成
pathptr gds_path() → Pathの生成
textptr gds_text() → Textの生成
srefptr gds_sref() → セル引用の生成
arefptr gds_aref() → アレイ引用の生成
xyptr gds_link_xy() → 座標列をリンクする
void gds_tran_scell() → SXのSCELLを展開する
void gds_link() → GDS2階層構造のリンクを行なう
propptr gds_set_prop() → エレメントにプロパティ付加
propptr gds_set_iprop() → プロパティ付加(数値専用)
char *gds_prop() → エレメントのプロパティを取得
long gds_iprop() → プロパティを取得(数値専用)
#include "npc_std.h" /* 汎用の定義 読み込み */
#include "chara.h" /* 文字列操作用ライブラリの使用 */
#include "gds2.h" /* gds操作用ライブラリの使用 */
#define Fdummy 0
gds_curr gds; /* gdsライブラリ用の入れものを確保 */
int flag = Fdummy; /* 動作モード用のフラグ(例では未使用) */
/************************* print usage ***************************/
print_usage() { /* コマンドの使い方を表示してストップする */
printf("\ngds2test2 v.990129 --- GDSII stream utility\n");
printf(" Usage : gds2test2 stream_file\n\n");
exit(-1);
}
/************************* get args **************************/
get_args(argc,argv) /* コマンドの引数を調べる */
int argc; /* argc : 引数の数 */
char *argv[]; /* argv[] : 引数のある場所を示す */
{
char *logf; /* 表示用のポインタ */
while(--argc > 0) { /* 全ての引数を調べる */
if(**(++argv) == '-') { /* -がついていたら */
if(!strcmp(*argv,"-dummy")) { /* -dummy の処理 */
}
else if(!strcmp(*argv,"-dummy2")) { /* -dummy2 の処理 */
}
else if (!strcmp(*argv,"-out")) { /* -out の処理 */
logf = *++argv; /* 次の引数をfileとして */
argc--; /* 1引数を調査済とする */
gds.lfp = fopen(logf,"w"); /* 出力をファイルにする */
}
else {
print_usage(); /* それ以外はusage表示 */
}
}
else {
strcpy(gds.file_name,*argv); /* -なしはstreamファイル名 */
}
}
if (!strlen(gds.file_name)) print_usage(); /* str名なしはusage表示 */
}
/************************* cell print **************************/
cellptr cell_print(link,nest) /* リンクで指定されたセルの情報を表示 */
cellptr link; /* link : セル情報の場所を示す */
int nest; /* nest : セルの階層(最上位は0) */
{
extern gds_curr gds; /* gdsライブラリ用の場所を使うという意味 */
srefptr next;
if (link == NULL) return(NULL); /* セルが存在しないなら戻る */
printf ("%d>%s\n",nest,link->name); /* セル階層>セル名表示 */
next = (srefptr)link->next; /* next←下位のセル(1つ目) */
while (next != NULL) { /* セルが無くなるまで繰返す */
switch (next->type) { /* セルtypeで処理を変える */
case SREF:
case AREF: /* セル、アレイならば、*/
cell_print(next->down,nest+1); /* 下位表示 */
break;
case BOUN:
case PATH:
case TEXT: /* Rect,Line,Textならば、*/
break; /* なにもしない */
}
next = (srefptr)next->next; /* next←次のセル */
}
return(link->link); /* 次のセルの場所を返す */
}
/************************* main start ***************************/
main(argc,argv) /* メイン ルーチン */
int argc;
char *argv[];
{
cellptr link;
gds.lfp = stdout; /* 出力は標準出力(画面)へ */
gds_init(); /* gdsライブラリ初期化 */
get_args(argc,argv); /* 引数の取得 */
gds_input(gds.file_name); /* streamファイル読み込み */
gds_link(); /* gds構造の階層リンク */
fprintf(gds.lfp,"library name : %s\n",gds.lib_name);
fprintf(gds.lfp,"create date : %s\n",gds.create);
fprintf(gds.lfp,"modify date : %s\n",gds.modify);
link = gds.root; /* link ← 最初のセルの場所 */
while (link != NULL) { /* セルが無くなるまで繰り返し */
link = cell_print(link,0); /* セル表示(link←次のセルの場所) */
}
exit(0);
}