GDS2操作用ライブラリ

by K.I
1998/9/16

Index


概要


[top]

使用方法


[top]

データ構造

データ構造の例


[top]

構造体の定義

/* 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;

[top]

GDS2グローバル構造体

/*      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;

[top]

各ルーチンの説明

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()        → プロパティを取得(数値専用)

[top]

メモ


[top]

プログラム例

#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);
}

[top]

改訂記録

を行うルーチンを作成した。(ld2gds用に作成、xlistに使用時に整理)
[top] [Homeに戻る]

comments powered by Disqus