Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / yagle / genius / gen_model_transistor.c
1 /****************************************************************************/
2 /* */
3 /* Chaine de CAO & VLSI Alliance */
4 /* */
5 /* Produit : GENIUS v1.00 */
6 /* Fichier : gen_model_transistor.c */
7 /* */
8 /* (c) copyright 1999 Laboratoire MASI equipe CAO & VLSI */
9 /* Tous droits reserves */
10 /* Support : e-mail alliance-support@asim.lip6.fr */
11 /* */
12 /* Auteur(s) : Francois DONNET le : 23/06/1999 */
13 /* */
14 /* Modifie par : le : ../../.... */
15 /* Modifie par : le : ../../.... */
16 /* Modifie par : le : ../../.... */
17 /* */
18 /****************************************************************************/
19
20 #include <stdio.h>
21 #include <string.h>
22 #include MUT_H
23 #include MLO_H
24 #include MLU_H
25 #include MSL_H
26 #include API_H
27 #include "gen_model_utils.h"
28 #include "gen_model_transistor.h"
29 #include "gen_env.h"
30
31
32
33
34 /****************************************************************************/
35 /* build the model for a transistor X */
36 /****************************************************************************/
37 extern lofig_list *Build_Transistor(char* name) {
38 lofig_list *fig_t;
39 chain_list *namechain;
40 losig_list *source,*drain,*grid,*bulk;
41 locon_list *con;
42 int index;
43 char type;
44 long x=1,y=1; /*no extraction->no location*/
45 /*put to quite reasonable values*/
46 unsigned short width=120, length=10, ps=280, pd=280, xs=20, xd=20;
47 int lineno=0; /* for PUT_ATO() */
48 char* file=NULL; /* for PUT_ATO() */
49
50 /* transistor X*/
51 name=namealloc(name);
52 fig_t=addlofig(name);
53
54 index=INDEX_START;
55
56 /*bulk*/
57 namechain=addchain(NULL,MBK_BULK_NAME);
58 bulk=addlosig(fig_t,index++,namechain,EXTERNAL); /*WARN:no more capa*/
59 con=addlocon(fig_t,MBK_BULK_NAME,bulk,INOUT);/*default addlocon set EXTERNAL*/
60 /*for GENIUS*/
61 con->USER=addptype(con->USER,GENCONCHAIN,NULL);
62 con->USER->DATA=addgenconchain(NULL, PUT_ATO(GEN_TOKEN_DIGIT,-1),
63 bulk, PUT_ATO(GEN_TOKEN_DIGIT,-1));
64
65 /*drain*/
66 namechain=addchain(NULL,MBK_DRAIN_NAME);
67 drain=addlosig(fig_t,index++,namechain,EXTERNAL); /*WARN:no more capa*/
68 con=addlocon(fig_t,MBK_DRAIN_NAME,drain,INOUT);/*default addlocon set EXTERNAL*/
69 /*for GENIUS*/
70 con->USER=addptype(con->USER,GENCONCHAIN,NULL);
71 con->USER->DATA=addgenconchain(NULL, PUT_ATO(GEN_TOKEN_DIGIT,-1),
72 drain, PUT_ATO(GEN_TOKEN_DIGIT,-1));
73
74 /*source*/
75 namechain=addchain(NULL,MBK_SOURCE_NAME);
76 source=addlosig(fig_t,index++,namechain,EXTERNAL); /*WARN:no more capa*/
77 con=addlocon(fig_t,MBK_SOURCE_NAME,source,INOUT);/*default addlocon set to EXTERNAL*/
78 /*for GENIUS*/
79 con->USER=addptype(con->USER,GENCONCHAIN,NULL);
80 con->USER->DATA=addgenconchain(NULL, PUT_ATO(GEN_TOKEN_DIGIT,-1),
81 source, PUT_ATO(GEN_TOKEN_DIGIT,-1));
82
83 /*grid*/
84 namechain=addchain(NULL,MBK_GRID_NAME);
85 grid=addlosig(fig_t,index++,namechain,EXTERNAL); /*WARN:no more capa*/
86 con=addlocon(fig_t,MBK_GRID_NAME,grid,INOUT); /*default addlocon set EXTERNAL*/
87 /*for GENIUS*/
88 con->USER=addptype(con->USER,GENCONCHAIN,NULL);
89 con->USER->DATA=addgenconchain(NULL, PUT_ATO(GEN_TOKEN_DIGIT,-1),
90 grid, PUT_ATO(GEN_TOKEN_DIGIT,-1));
91
92 type = mbk_istransn(name)?TRANSN:TRANSP;
93 fig_t->LOTRS=addlotrs(fig_t, type, /*MBK data*/
94 x,y,width,length,ps,pd,xs,xd,/*physical data*/
95 grid,source,drain,bulk,/*connexion data*/
96 namealloc("transistor") /*MBK data*/);
97 addlotrsmodel(fig_t->LOTRS, name) ;
98 return fig_t;
99 }
100
101
102 locon_list *myaddlocon(char *name, losig_list *ptsig, char dir, void *root)
103 {
104 locon_list *ptcon;
105
106 ptcon = (locon_list *)mbkalloc(sizeof(locon_list));
107 ptcon->NAME = name;
108 ptcon->TYPE = 'T';
109 ptcon->SIG = ptsig;
110 ptcon->ROOT = root;
111 ptcon->DIRECTION = dir;
112 ptcon->USER = NULL;
113 ptcon->PNODE = NULL;
114 ptcon->NEXT=NULL;
115 return ptcon;
116 }
117
118
119 extern lotrs_list *BuildFakeTransistor(char type, losig_list *grid, losig_list *drain, losig_list *source, losig_list *bulk)
120 {
121 locon_list *con;
122 lotrs_list *tr;
123
124 tr=(lotrs_list *)mbkalloc(sizeof(lotrs_list));
125 /*drain*/
126 con=myaddlocon(MBK_DRAIN_NAME, drain, INOUT, tr);
127 tr->DRAIN=con;
128
129 con=myaddlocon(MBK_DRAIN_NAME, source, INOUT, tr);
130 tr->SOURCE=con;
131
132 con=myaddlocon(MBK_DRAIN_NAME, grid, INOUT, tr);
133 tr->GRID=con;
134
135 /*bulk*/
136 if (SPI_IGNORE_BULK=='N')
137 {
138 con=myaddlocon(MBK_BULK_NAME, bulk, INOUT, tr);
139 tr->BULK=con;
140 }
141 else
142 tr->BULK=NULL;
143
144 tr->TRNAME=FAKE_TRAN_NAME;
145 tr->NEXT=NULL;
146 tr->MODINDEX = EMPTYHT;
147 tr->TYPE=type;
148 tr->USER=NULL;
149
150 ClearLOTRSLoconFlags(tr);
151
152 return tr;
153 }