1 /***************************************************************************
2 JSPICE3 adaptation of Spice3f2 - Copyright (c) Stephen R. Whiteley 1992
3 Copyright 1990 Regents of the University of California.  All rights reserved.
4 Authors: 1985 S. Hwang
5          1993 Stephen R. Whiteley
6 ****************************************************************************/
7 
8 #ifndef MES
9 #define MES
10 
11 #include "devdefs.h"
12 
13 #define MESnumStates 13
14 
15     /* structures used to describe MESFET Transistors */
16 
17 
18 /* information used to describe a single instance */
19 
20 typedef struct sMESinstance {
21     struct sMESmodel *MESmodPtr;    /* backpointer to model */
22     struct sMESinstance *MESnextInstance; /* pointer to next instance of
23                                              * current model*/
24     IFuid MESname; /* pointer to character string naming this instance */
25     int MESstate; /* pointer to start of state vector for mesfet */
26 
27     int MESdrainNode;  /* number of drain node of mesfet */
28     int MESgateNode;   /* number of gate node of mesfet */
29     int MESsourceNode; /* number of source node of mesfet */
30     int MESdrainPrimeNode; /* number of internal drain node of mesfet */
31     int MESsourcePrimeNode;    /* number of internal source node of mesfet */
32     double MESarea;    /* area factor for the mesfet */
33     double MESicVDS;   /* initial condition voltage D-S*/
34     double MESicVGS;   /* initial condition voltage G-S*/
35     double *MESdrainDrainPrimePtr; /* pointer to sparse matrix at
36                                      * (drain,drain prime) */
37     double *MESgateDrainPrimePtr;  /* pointer to sparse matrix at
38                                      * (gate,drain prime) */
39     double *MESgateSourcePrimePtr; /* pointer to sparse matrix at
40                                      * (gate,source prime) */
41     double *MESsourceSourcePrimePtr;   /* pointer to sparse matrix at
42                                          * (source,source prime) */
43     double *MESdrainPrimeDrainPtr; /* pointer to sparse matrix at
44                                      * (drain prime,drain) */
45     double *MESdrainPrimeGatePtr;  /* pointer to sparse matrix at
46                                      * (drain prime,gate) */
47     double *MESdrainPrimeSourcePrimePtr;   /* pointer to sparse matrix
48                                              * (drain prime,source prime) */
49     double *MESsourcePrimeGatePtr; /* pointer to sparse matrix at
50                                      * (source prime,gate) */
51     double *MESsourcePrimeSourcePtr;   /* pointer to sparse matrix at
52                                          * (source prime,source) */
53     double *MESsourcePrimeDrainPrimePtr;   /* pointer to sparse matrix
54                                              * (source prime,drain prime) */
55     double *MESdrainDrainPtr;  /* pointer to sparse matrix at
56                                  * (drain,drain) */
57     double *MESgateGatePtr;    /* pointer to sparse matrix at
58                                  * (gate,gate) */
59     double *MESsourceSourcePtr;    /* pointer to sparse matrix at
60                                      * (source,source) */
61     double *MESdrainPrimeDrainPrimePtr;    /* pointer to sparse matrix
62                                              * (drain prime,drain prime) */
63     double *MESsourcePrimeSourcePrimePtr;  /* pointer to sparse matrix
64                                              * (source prime,source prime) */
65 
66     int MESoff;   /* 'off' flag for mesfet */
67     unsigned MESareaGiven : 1;   /* flag to indicate area was specified */
68     unsigned MESicVDSGiven : 1;   /* initial condition given flag for V D-S*/
69     unsigned MESicVGSGiven : 1;   /* initial condition given flag for V G-S*/
70 
71 int MESmode;
72 
73 /*
74  * naming convention:
75  * x = vgs
76  * y = vgd
77  * z = vds
78  * cdr = cdrain
79  */
80 
81 #define MESNDCOEFFS  27
82 
83 #ifndef NODISTO
84     double MESdCoeffs[MESNDCOEFFS];
85 #else /* NODISTO */
86     double *MESdCoeffs;
87 #endif /* NODISTO */
88 
89 #ifndef CONFIG
90 
91 #define    cdr_x       MESdCoeffs[0]
92 #define    cdr_z       MESdCoeffs[1]
93 #define    cdr_x2      MESdCoeffs[2]
94 #define    cdr_z2      MESdCoeffs[3]
95 #define    cdr_xz      MESdCoeffs[4]
96 #define    cdr_x3      MESdCoeffs[5]
97 #define    cdr_z3      MESdCoeffs[6]
98 #define    cdr_x2z     MESdCoeffs[7]
99 #define    cdr_xz2     MESdCoeffs[8]
100 
101 #define    ggs3        MESdCoeffs[9]
102 #define    ggd3        MESdCoeffs[10]
103 #define    ggs2        MESdCoeffs[11]
104 #define    ggd2        MESdCoeffs[12]
105 
106 #define    qgs_x2      MESdCoeffs[13]
107 #define    qgs_y2      MESdCoeffs[14]
108 #define    qgs_xy      MESdCoeffs[15]
109 #define    qgs_x3      MESdCoeffs[16]
110 #define    qgs_y3      MESdCoeffs[17]
111 #define    qgs_x2y     MESdCoeffs[18]
112 #define    qgs_xy2     MESdCoeffs[19]
113 
114 #define    qgd_x2      MESdCoeffs[20]
115 #define    qgd_y2      MESdCoeffs[21]
116 #define    qgd_xy      MESdCoeffs[22]
117 #define    qgd_x3      MESdCoeffs[23]
118 #define    qgd_y3      MESdCoeffs[24]
119 #define    qgd_x2y     MESdCoeffs[25]
120 #define    qgd_xy2     MESdCoeffs[26]
121 
122 #endif
123 
124 /* indices to the array of MESFET noise sources */
125 
126 #define MESRDNOIZ       0
127 #define MESRSNOIZ       1
128 #define MESIDNOIZ       2
129 #define MESFLNOIZ 3
130 #define MESTOTNOIZ    4
131 
132 #define MESNSRCS     5     /* the number of MESFET noise sources */
133 
134 #ifndef NONOISE
135     double MESnVar[NSTATVARS][MESNSRCS];
136 #else /* NONOISE */
137     double **MESnVar;
138 #endif /* NONOISE */
139 
140 } MESinstance ;
141 
142 #define MESvgs MESstate
143 #define MESvgd MESstate+1
144 #define MEScg MESstate+2
145 #define MEScd MESstate+3
146 #define MEScgd MESstate+4
147 #define MESgm MESstate+5
148 #define MESgds MESstate+6
149 #define MESggs MESstate+7
150 #define MESggd MESstate+8
151 #define MESqgs MESstate+9
152 #define MEScqgs MESstate+10
153 #define MESqgd MESstate+11
154 #define MEScqgd MESstate+12
155 
156 
157 /* per model data */
158 
159 typedef struct sMESmodel {       /* model structure for a mesfet */
160     int MESmodType; /* type index of this device type */
161     struct sMESmodel *MESnextModel;   /* pointer to next possible model in
162                                          * linked list */
163     MESinstance * MESinstances; /* pointer to list of instances
164                                    * that have this model */
165     IFuid MESmodName; /* pointer to character string naming this model */
166     int MEStype;
167 
168     double MESthreshold;
169     double MESalpha;
170     double MESbeta;
171     double MESlModulation;
172     double MESb;
173     double MESdrainResist;
174     double MESsourceResist;
175     double MEScapGS;
176     double MEScapGD;
177     double MESgatePotential;
178     double MESgateSatCurrent;
179     double MESdepletionCapCoeff;
180     double MESfNcoef;
181     double MESfNexp;
182 
183     double MESdrainConduct;
184     double MESsourceConduct;
185     double MESdepletionCap;
186     double MESf1;
187     double MESf2;
188     double MESf3;
189     double MESvcrit;
190 
191     unsigned MESthresholdGiven : 1;
192     unsigned MESalphaGiven : 1;
193     unsigned MESbetaGiven : 1;
194     unsigned MESlModulationGiven : 1;
195     unsigned MESbGiven : 1;
196     unsigned MESdrainResistGiven : 1;
197     unsigned MESsourceResistGiven : 1;
198     unsigned MEScapGSGiven : 1;
199     unsigned MEScapGDGiven : 1;
200     unsigned MESgatePotentialGiven : 1;
201     unsigned MESgateSatCurrentGiven : 1;
202     unsigned MESdepletionCapCoeffGiven : 1;
203     unsigned MESfNcoefGiven : 1;
204     unsigned MESfNexpGiven : 1;
205 
206 
207 } MESmodel;
208 
209 #ifndef NMF
210 
211 #define NMF 1
212 #define PMF -1
213 
214 #endif /*NMF*/
215 
216 /* device parameters */
217 #define MES_AREA    1
218 #define MES_IC_VDS  2
219 #define MES_IC_VGS  3
220 #define MES_IC      4
221 #define MES_OFF     5
222 #define MES_CS      6
223 #define MES_POWER   7
224 
225 /* model parameters */
226 #define MES_MOD_VTO     101
227 #define MES_MOD_ALPHA   102
228 #define MES_MOD_BETA    103
229 #define MES_MOD_LAMBDA  104
230 #define MES_MOD_B       105
231 #define MES_MOD_RD      106
232 #define MES_MOD_RS      107
233 #define MES_MOD_CGS     108
234 #define MES_MOD_CGD     109
235 #define MES_MOD_PB      110
236 #define MES_MOD_IS      111
237 #define MES_MOD_FC      112
238 #define MES_MOD_NMF     113
239 #define MES_MOD_PMF     114
240 #define MES_MOD_KF      115
241 #define MES_MOD_AF      116
242 
243 /* device questions */
244 
245 #define MES_DRAINNODE       201
246 #define MES_GATENODE        202
247 #define MES_SOURCENODE      203
248 #define MES_DRAINPRIMENODE  204
249 #define MES_SOURCEPRIMENODE 205
250 #define MES_VGS             206
251 #define MES_VGD             207
252 #define MES_CG              208
253 #define MES_CD              209
254 #define MES_CGD             210
255 #define MES_GM              211
256 #define MES_GDS             212
257 #define MES_GGS             213
258 #define MES_GGD             214
259 #define MES_QGS             215
260 #define MES_CQGS            216
261 #define MES_QGD             217
262 #define MES_CQGD            218
263 
264 /* model questions */
265 
266 #define MES_MOD_DRAINCONDUCT    301
267 #define MES_MOD_SOURCECONDUCT   302
268 #define MES_MOD_DEPLETIONCAP    303
269 #define MES_MOD_VCRIT           304
270 #define MES_MOD_TYPE            305
271 
272 
273 #ifdef __STDC__
274 
275 extern int  MESacLoad(GENmodel*,CKTcircuit*);
276 extern int  MESask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*);
277 extern int  MESdelete(GENmodel*,IFuid,GENinstance**);
278 extern void MESdestroy(GENmodel**);
279 extern int  MESdisto(int,GENmodel*,CKTcircuit*);
280 extern int  MESgetic(GENmodel*,CKTcircuit*);
281 extern int  MESload(GENmodel*,CKTcircuit*);
282 extern int  MESmAsk(CKTcircuit*,GENmodel*,int,IFvalue*);
283 extern int  MESmDelete(GENmodel**,IFuid,GENmodel*);
284 extern int  MESmParam(int,IFvalue*,GENmodel*);
285 extern int  MESnoise(int,int,GENmodel*,CKTcircuit*,GENERIC*,double*);
286 extern int  MESparam(CKTcircuit*,int,IFvalue*,GENinstance*,IFvalue*);
287 extern void MESparse(int,GENERIC*,GENERIC*,GENERIC*);
288 extern int  MESpzLoad(GENmodel*,CKTcircuit*,SPcomplex*);
289 extern int  MESsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
290 extern int  MEStemp(GENmodel*,CKTcircuit*);
291 extern int  MEStrunc(GENmodel*,CKTcircuit*,double*);
292 
293 #else /* stdc */
294 
295 extern int  MESacLoad();
296 extern int  MESask();
297 extern int  MESdelete();
298 extern void MESdestroy();
299 extern int  MESdisto();
300 extern int  MESgetic();
301 extern int  MESload();
302 extern int  MESmAsk();
303 extern int  MESmDelete();
304 extern int  MESmParam();
305 extern int  MESnoise();
306 extern int  MESparam();
307 extern void MESparse();
308 extern int  MESpzLoad();
309 extern int  MESsetup();
310 extern int  MEStemp();
311 extern int  MEStrunc();
312 
313 #endif /* stdc */
314 
315 
316 #endif /*MES*/
317