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 Thomas L. Quarles
5          1989 Takayasu Sakurai
6          1993 Stephen R. Whiteley
7 ****************************************************************************/
8 
9 #ifndef MOS
10 #define MOS
11 
12 #include "devdefs.h"
13 
14     /* declarations for analytical MOSFETs */
15 
16 /* information needed for each instance */
17 
18 typedef struct sMOSinstance {
19     struct sMOSmodel *MOSmodPtr;  /* backpointer to model */
20     struct sMOSinstance *MOSnextInstance;  /* pointer to next instance of
21                                             * current model */
22     IFuid MOSname; /* pointer to character string naming this instance */
23     int MOSstates; /* index into state table for this device */
24 
25     int MOSdNode;  /* number of the gate node of the mosfet */
26     int MOSgNode;  /* number of the gate node of the mosfet */
27     int MOSsNode;  /* number of the source node of the mosfet */
28     int MOSbNode;  /* number of the bulk node of the mosfet */
29     int MOSdNodePrime; /* number of the internal drain node of the mosfet */
30     int MOSsNodePrime; /* number of the internal source node of the mosfet */
31 
32     int MOSmode;   /* device mode : 1 = normal, -1 = inverse */
33 
34     double MOSl;                 /* the length of the channel region */
35     double MOSw;                 /* the width of the channel region */
36     double MOSdrainArea;         /* the area of the drain diffusion */
37     double MOSsourceArea;        /* the area of the source diffusion */
38     double MOSdrainSquares;      /* the length of the drain in squares */
39     double MOSsourceSquares;     /* the length of the source in squares */
40     double MOSdrainPerimeter;
41     double MOSsourcePerimeter;
42     double MOSsourceConductance; /* conductance of source, set in setup */
43     double MOSdrainConductance;  /* conductance of drain, set in setup */
44     double MOStemp;              /* operating temperature of this instance */
45 
46     /* temperature corrected ... */
47     double MOStTransconductance; /* transconductance */
48     double MOStSurfMob;    /* surface mobility */
49     double MOStPhi;        /* Phi */
50     double MOStVto;        /* Vto */
51     double MOStSatCur;     /* saturation Cur. */
52     double MOStSatCurDens; /* saturation Cur. density*/
53     double MOStCbd;        /* B-D Capacitance */
54     double MOStCbs;        /* B-S Capacitance */
55     double MOStCj;         /* Bulk bottom Capacitance */
56     double MOStCjsw;       /* Bulk side Capacitance */
57     double MOStBulkPot;    /* Bulk potential */
58     double MOStDepCap;     /* transition point in the curve matching Fc*Vj */
59     double MOStVbi;        /* Vbi */
60     double MOStDrainSatCur;
61     double MOStSourceSatCur;
62 
63     double MOSicVBS;       /* initial condition B-S voltage */
64     double MOSicVDS;       /* initial condition D-S voltage */
65     double MOSicVGS;       /* initial condition G-S voltage */
66     double MOSvon;
67     double MOSvdsat;
68     double MOSsourceVcrit; /* vcrit for pos. vds */
69     double MOSdrainVcrit;  /* vcrit for neg. vds */
70     double MOScd;
71     double MOScbs;
72     double MOScbd;
73     double MOSgmbs;
74     double MOSgm;
75     double MOSgds;
76     double MOSgbd;
77     double MOSgbs;
78     double MOScapbd;
79     double MOScapbs;
80     double MOSCbd;
81     double MOSCbdsw;
82     double MOSCbs;
83     double MOSCbssw;
84     double MOSf2d;
85     double MOSf3d;
86     double MOSf4d;
87     double MOSf2s;
88     double MOSf3s;
89     double MOSf4s;
90 
91     double MOSeffectiveLength;
92     double MOSgateSourceOverlapCap;
93     double MOSgateDrainOverlapCap;
94     double MOSgateBulkOverlapCap;
95     double MOSbeta;
96     double MOSoxideCap;
97 
98     double *MOSDdPtr;      /* pointer to sparse matrix element at
99                             * (Drain node,drain node) */
100     double *MOSGgPtr;      /* pointer to sparse matrix element at
101                             * (gate node,gate node) */
102     double *MOSSsPtr;      /* pointer to sparse matrix element at
103                             * (source node,source node) */
104     double *MOSBbPtr;      /* pointer to sparse matrix element at
105                             * (bulk node,bulk node) */
106     double *MOSDPdpPtr;    /* pointer to sparse matrix element at
107                             * (drain prime node,drain prime node) */
108     double *MOSSPspPtr;    /* pointer to sparse matrix element at
109                             * (source prime node,source prime node) */
110     double *MOSDdpPtr;     /* pointer to sparse matrix element at
111                             * (drain node,drain prime node) */
112     double *MOSGbPtr;      /* pointer to sparse matrix element at
113                             * (gate node,bulk node) */
114     double *MOSGdpPtr;     /* pointer to sparse matrix element at
115                             * (gate node,drain prime node) */
116     double *MOSGspPtr;     /* pointer to sparse matrix element at
117                             * (gate node,source prime node) */
118     double *MOSSspPtr;     /* pointer to sparse matrix element at
119                             * (source node,source prime node) */
120     double *MOSBdpPtr;     /* pointer to sparse matrix element at
121                             * (bulk node,drain prime node) */
122     double *MOSBspPtr;     /* pointer to sparse matrix element at
123                             * (bulk node,source prime node) */
124     double *MOSDPspPtr;    /* pointer to sparse matrix element at
125                             * (drain prime node,source prime node) */
126     double *MOSDPdPtr;     /* pointer to sparse matrix element at
127                             * (drain prime node,drain node) */
128     double *MOSBgPtr;      /* pointer to sparse matrix element at
129                             * (bulk node,gate node) */
130     double *MOSDPgPtr;     /* pointer to sparse matrix element at
131                             * (drain prime node,gate node) */
132 
133     double *MOSSPgPtr;     /* pointer to sparse matrix element at
134                             * (source prime node,gate node) */
135     double *MOSSPsPtr;     /* pointer to sparse matrix element at
136                             * (source prime node,source node) */
137     double *MOSDPbPtr;     /* pointer to sparse matrix element at
138                             * (drain prime node,bulk node) */
139     double *MOSSPbPtr;     /* pointer to sparse matrix element at
140                             * (source prime node,bulk node) */
141     double *MOSSPdpPtr;    /* pointer to sparse matrix element at
142                             * (source prime node,drain prime node) */
143 
144     /* distortion stuff */
145 /*
146  * naming convention:
147  * x = vgs
148  * y = vbs
149  * z = vds
150  * cdr = cdrain
151  */
152 
153 
154 #define MOSNDCOEFFS 30
155 
156 #ifndef NODISTO
157     double MOSdCoeffs[MOSNDCOEFFS];
158 #else /* NODISTO */
159     double *MOSdCoeffs;
160 #endif /* NODISTO */
161 
162 #ifndef CONFIG
163 
164 #define capbs2   MOSdCoeffs[0]
165 #define capbs3   MOSdCoeffs[1]
166 #define capbd2   MOSdCoeffs[2]
167 #define capbd3   MOSdCoeffs[3]
168 #define gbs2     MOSdCoeffs[4]
169 #define gbs3     MOSdCoeffs[5]
170 #define gbd2     MOSdCoeffs[6]
171 #define gbd3     MOSdCoeffs[7]
172 #define capgb2   MOSdCoeffs[8]
173 #define capgb3   MOSdCoeffs[9]
174 #define cdr_x2   MOSdCoeffs[10]
175 #define cdr_y2   MOSdCoeffs[11]
176 #define cdr_z2   MOSdCoeffs[12]
177 #define cdr_xy   MOSdCoeffs[13]
178 #define cdr_yz   MOSdCoeffs[14]
179 #define cdr_xz   MOSdCoeffs[15]
180 #define cdr_x3   MOSdCoeffs[16]
181 #define cdr_y3   MOSdCoeffs[17]
182 #define cdr_z3   MOSdCoeffs[18]
183 #define cdr_x2z  MOSdCoeffs[19]
184 #define cdr_x2y  MOSdCoeffs[20]
185 #define cdr_y2z  MOSdCoeffs[21]
186 #define cdr_xy2  MOSdCoeffs[22]
187 #define cdr_xz2  MOSdCoeffs[23]
188 #define cdr_yz2  MOSdCoeffs[24]
189 #define cdr_xyz  MOSdCoeffs[25]
190 #define capgs2   MOSdCoeffs[26]
191 #define capgs3   MOSdCoeffs[27]
192 #define capgd2   MOSdCoeffs[28]
193 #define capgd3   MOSdCoeffs[29]
194 
195 #endif
196 
197     /*  end distortion coeffs. */
198 
199 /* indices to the array of MOSFET(3) noise sources */
200 
201 #define MOSRDNOIZ  0
202 #define MOSRSNOIZ  1
203 #define MOSIDNOIZ  2
204 #define MOSFLNOIZ  3
205 #define MOSTOTNOIZ 4
206 
207 #define MOSNSRCS   5     /* the number of MOSFET(3) noise sources */
208 
209 #ifndef NONOISE
210     double MOSnVar[NSTATVARS][MOSNSRCS];
211 #else /* NONOISE */
212     double **MOSnVar;
213 #endif /* NONOISE */
214 
215     unsigned MOSoff :1;        /* device is off for dc analysis */
216     unsigned MOStempGiven :1;  /* instance temperature specified */
217     unsigned MOSlGiven :1;
218     unsigned MOSwGiven :1;
219     unsigned MOSdrainAreaGiven :1;
220     unsigned MOSsourceAreaGiven :1;
221     unsigned MOSdrainSquaresGiven :1;
222     unsigned MOSsourceSquaresGiven :1;
223     unsigned MOSdrainPerimeterGiven :1;
224     unsigned MOSsourcePerimeterGiven :1;
225     unsigned MOSdNodePrimeSet :1;
226     unsigned MOSsNodePrimeSet :1;
227     unsigned MOSicVBSGiven :1;
228     unsigned MOSicVDSGiven :1;
229     unsigned MOSicVGSGiven :1;
230     unsigned MOSvonGiven :1;
231     unsigned MOSvdsatGiven :1;
232     unsigned MOSmodeGiven :1;
233 
234 } MOSinstance ;
235 
236 #define MOSvbd   MOSstates
237 #define MOSvbs   MOSstates + 1
238 #define MOSvgs   MOSstates + 2
239 #define MOSvds   MOSstates + 3
240 
241 /* meyer capacitances */
242 #define MOScapgs MOSstates + 4   /* gate-source capacitor value */
243 #define MOSqgs   MOSstates + 5   /* gate-source capacitor charge */
244 #define MOScqgs  MOSstates + 6   /* gate-source capacitor current */
245 
246 #define MOScapgd MOSstates + 7   /* gate-drain capacitor value */
247 #define MOSqgd   MOSstates + 8   /* gate-drain capacitor charge */
248 #define MOScqgd  MOSstates + 9   /* gate-drain capacitor current */
249 
250 #define MOScapgb MOSstates + 10  /* gate-bulk capacitor value */
251 #define MOSqgb   MOSstates + 11  /* gate-bulk capacitor charge */
252 #define MOScqgb  MOSstates + 12  /* gate-bulk capacitor current */
253 
254 /* diode capacitances */
255 #define MOSqbd   MOSstates + 13  /* bulk-drain capacitor charge */
256 #define MOScqbd  MOSstates + 14  /* bulk-drain capacitor current */
257 
258 #define MOSqbs   MOSstates + 15  /* bulk-source capacitor charge */
259 #define MOScqbs  MOSstates + 16  /* bulk-source capacitor current */
260 
261 #define MOSnumStates 17
262 
263 
264 /* per model data */
265 
266     /* NOTE:  parameters marked 'input - use xxxx' are paramters for
267      * which a temperature correction is applied in MOStemp, thus
268      * the MOSxxxx value in the per-instance structure should be used
269      * instead in all calculations
270      */
271 
272 typedef struct sMOSmodel {      /* model structure for a resistor */
273     int MOSmodType;             /* type index of this device type */
274     struct sMOSmodel *MOSnextModel; /* pointer to next possible model
275                                      * in linked list */
276     MOSinstance * MOSinstances; /* pointer to list of instances
277                                  * that have this model */
278     IFuid MOSmodName;  /* pointer to character string naming this model */
279     int MOStype;       /* device type : 1 = nmos,  -1 = pmos */
280     int MOSlevel;      /* UCB model complexity level, 1-3 */
281     int MOSgateType;
282     double MOSoxideCapFactor;
283     double MOStnom;    /* temperature at which parameters measured */
284     double MOSvt0;               /* input - use tVto */
285     double MOStransconductance;  /* input - use tTransconductance */
286     double MOSgamma;
287     double MOSphi;               /* input - use tPhi */
288     double MOSdrainResistance;
289     double MOSsourceResistance;
290     double MOScapBD;             /* input - use tCbs */
291     double MOScapBS;             /* input - use tCbd */
292     double MOSjctSatCur;         /* input - use tSatCur instead */
293     double MOSbulkJctPotential;  /* input - use tBulkPot */
294     double MOSgateSourceOverlapCapFactor;
295     double MOSgateDrainOverlapCapFactor;
296     double MOSgateBulkOverlapCapFactor;
297     double MOSbulkCapFactor;     /* input - use tCj */
298     double MOSbulkJctBotGradingCoeff;
299     double MOSsideWallCapFactor; /* input - use tCjsw */
300     double MOSbulkJctSideGradingCoeff;
301     double MOSjctSatCurDensity;  /* input - use tSatCurDens*/
302     double MOSoxideThickness;
303     double MOSlatDiff;
304     double MOSsheetResistance;
305     double MOSsurfaceMobility;   /* input - use tSurfMob */
306     double MOSfwdCapDepCoeff;
307     double MOSsurfaceStateDensity;
308     double MOSsubstrateDoping;
309     double MOSfNcoef;
310     double MOSfNexp;
311 
312     /* levels 1,2 and 6 */
313     double MOSlambda;
314 
315     /* level 2 */
316     double MOScritFieldExp;      /* uexp */
317     double MOSchannelCharge;     /* neff */
318     double MOScritField;         /* ucrit */
319 
320     /* levels 2 and 3 */
321     double MOSfastSurfaceStateDensity; /* nfs */
322     double MOSnarrowFactor;      /* delta */
323     double MOSmaxDriftVel;       /* vmax */
324     double MOSjunctionDepth;
325     double MOSxd;
326 
327     /* level 3 */
328     double MOSeta;
329     double MOStheta;             /* theta */
330     double MOSkappa;             /* kappa */
331     double MOSdelta;             /* input delta */
332     double MOSalpha;             /* alpha */
333 
334     /* level 6 */
335     double MOSkv;       /* input - use tKv */
336     double MOSnv;       /* drain linear conductance factor*/
337     double MOSkc;       /* input - use tKc */
338     double MOSnc;       /* saturation current coeff.*/
339     double MOSgamma1;   /* secondary back-gate effect parametr */
340     double MOSsigma;
341     double MOSlamda0;
342     double MOSlamda1;
343 
344     /* level 8, CryoMOS by Luong Huynh 1/19/95 */
345     double MOSa1;
346     double MOSa2;
347     double MOSk1;
348     double MOSk2;
349     double MOSk3;
350     double MOSk4;
351     double MOSpclm;
352     double MOSem;
353 
354     unsigned MOStypeGiven :1;
355     unsigned MOSgateTypeGiven :1;
356     unsigned MOSlevelGiven :1;
357     unsigned MOStnomGiven :1;
358     unsigned MOSvt0Given :1;
359     unsigned MOStransconductanceGiven :1;
360     unsigned MOSgammaGiven :1;
361     unsigned MOSphiGiven :1;
362     unsigned MOSdrainResistanceGiven :1;
363     unsigned MOSsourceResistanceGiven :1;
364     unsigned MOScapBDGiven :1;
365     unsigned MOScapBSGiven :1;
366     unsigned MOSjctSatCurGiven :1;
367     unsigned MOSbulkJctPotentialGiven :1;
368     unsigned MOSgateSourceOverlapCapFactorGiven :1;
369     unsigned MOSgateDrainOverlapCapFactorGiven :1;
370     unsigned MOSgateBulkOverlapCapFactorGiven :1;
371     unsigned MOSbulkCapFactorGiven :1;
372     unsigned MOSbulkJctBotGradingCoeffGiven :1;
373     unsigned MOSsideWallCapFactorGiven :1;
374     unsigned MOSbulkJctSideGradingCoeffGiven :1;
375     unsigned MOSjctSatCurDensityGiven :1;
376     unsigned MOSoxideThicknessGiven :1;
377     unsigned MOSlatDiffGiven :1;
378     unsigned MOSsheetResistanceGiven :1;
379     unsigned MOSsurfaceMobilityGiven :1;
380     unsigned MOSfwdCapDepCoeffGiven :1;
381     unsigned MOSsurfaceStateDensityGiven :1;
382     unsigned MOSsubstrateDopingGiven :1;
383     unsigned MOSfNcoefGiven :1;
384     unsigned MOSfNexpGiven :1;
385 
386     /* levels 1,2, and 6 */
387     unsigned MOSlambdaGiven :1;
388 
389     /* level 2 */
390     unsigned MOScritFieldExpGiven :1;   /* uexp */
391     unsigned MOSchannelChargeGiven :1;  /* neff */
392     unsigned MOScritFieldGiven :1;      /* ucrit */
393 
394     /* levels 2 and 3 */
395     unsigned MOSfastSurfaceStateDensityGiven :1; /* nfs */
396     unsigned MOSnarrowFactorGiven :1;   /* delta */
397     unsigned MOSmaxDriftVelGiven :1;    /* vmax */
398     unsigned MOSjunctionDepthGiven :1;
399 
400     /* level 3 */
401     unsigned MOSetaGiven :1;
402     unsigned MOSthetaGiven :1;          /* theta */
403     unsigned MOSkappaGiven :1;          /* kappa */
404     unsigned MOSdeltaGiven :1;          /* delta */
405 
406     /* level 6 */
407     unsigned MOSkvGiven :1;
408     unsigned MOSnvGiven :1;
409     unsigned MOSkcGiven :1;
410     unsigned MOSncGiven :1;
411     unsigned MOSgamma1Given :1;
412     unsigned MOSsigmaGiven :1;
413     unsigned MOSlamda0Given :1;
414     unsigned MOSlamda1Given :1;
415 
416     /* level 8, CryoMOS by Luong Huynh 1/19/95 */
417     unsigned MOSa1Given :1;
418     unsigned MOSa2Given :1;
419     unsigned MOSk1Given :1;
420     unsigned MOSk2Given :1;
421     unsigned MOSk3Given :1;
422     unsigned MOSk4Given :1;
423     unsigned MOSpclmGiven :1;
424     unsigned MOSemGiven :1;
425 
426 } MOSmodel;
427 
428 #ifndef NMOS
429 #define NMOS 1
430 #define PMOS -1
431 #endif /*NMOS*/
432 
433 /* device parameters */
434 #define MOS_TEMP            1
435 #define MOS_L               2
436 #define MOS_W               3
437 #define MOS_AD              4
438 #define MOS_AS              5
439 #define MOS_PD              6
440 #define MOS_PS              7
441 #define MOS_NRD             8
442 #define MOS_NRS             9
443 #define MOS_OFF             10
444 #define MOS_IC_VDS          11
445 #define MOS_IC_VGS          12
446 #define MOS_IC_VBS          13
447 #define MOS_IC              14
448 #define MOS_CGD             15
449 #define MOS_CGS             16
450 #define MOS_DNODE           17
451 #define MOS_GNODE           18
452 #define MOS_SNODE           19
453 #define MOS_BNODE           20
454 #define MOS_DNODEPRIME      21
455 #define MOS_SNODEPRIME      22
456 #define MOS_DRAINCONDUCT    23
457 #define MOS_SOURCECONDUCT   24
458 #define MOS_VON             25
459 #define MOS_VDSAT           26
460 #define MOS_DRAINVCRIT      27
461 #define MOS_SOURCEVCRIT     28
462 #define MOS_CD              29
463 #define MOS_CBD             30
464 #define MOS_CBS             31
465 #define MOS_GMBS            32
466 #define MOS_GM              33
467 #define MOS_GDS             34
468 #define MOS_GBD             35
469 #define MOS_GBS             36
470 #define MOS_CAPBD           37
471 #define MOS_CAPBS           38
472 #define MOS_CAPZEROBIASBD   39
473 #define MOS_CAPZEROBIASBDSW 40
474 #define MOS_CAPZEROBIASBS   41
475 #define MOS_CAPZEROBIASBSSW 42
476 #define MOS_VBD             43
477 #define MOS_VBS             44
478 #define MOS_VGS             45
479 #define MOS_VDS             46
480 #define MOS_CAPGD           47
481 #define MOS_QGD             48
482 #define MOS_CQGD            49
483 #define MOS_CAPGS           50
484 #define MOS_QGS             51
485 #define MOS_CQGS            52
486 #define MOS_CAPGB           53
487 #define MOS_QGB             54
488 #define MOS_CQGB            55
489 #define MOS_QBD             56
490 #define MOS_CQBD            57
491 #define MOS_QBS             58
492 #define MOS_CQBS            59
493 #define MOS_CG              60
494 #define MOS_CS              61
495 #define MOS_CB              62
496 #define MOS_POWER           63
497 #define MOS_DRAINRESIST     64
498 #define MOS_SOURCERESIST    65
499 
500 /* model parameters */
501 #define MOS_MOD_TYPE        100
502 #define MOS_MOD_LEVEL       101
503 #define MOS_MOD_TNOM        102
504 #define MOS_MOD_VTO         103
505 #define MOS_MOD_KP          104
506 #define MOS_MOD_GAMMA       105
507 #define MOS_MOD_PHI         106
508 #define MOS_MOD_RD          107
509 #define MOS_MOD_RS          108
510 #define MOS_MOD_CBD         109
511 #define MOS_MOD_CBS         110
512 #define MOS_MOD_IS          111
513 #define MOS_MOD_PB          112
514 #define MOS_MOD_CGSO        113
515 #define MOS_MOD_CGDO        114
516 #define MOS_MOD_CGBO        115
517 #define MOS_MOD_CJ          116
518 #define MOS_MOD_MJ          117
519 #define MOS_MOD_CJSW        118
520 #define MOS_MOD_MJSW        119
521 #define MOS_MOD_JS          120
522 #define MOS_MOD_TOX         121
523 #define MOS_MOD_LD          122
524 #define MOS_MOD_RSH         123
525 #define MOS_MOD_U0          124
526 #define MOS_MOD_FC          125
527 #define MOS_MOD_NSS         126
528 #define MOS_MOD_NSUB        127
529 #define MOS_MOD_TPG         128
530 #define MOS_MOD_NMOS        129
531 #define MOS_MOD_PMOS        130
532 #define MOS_MOD_KF          131
533 #define MOS_MOD_AF          132
534 #define MOS_MOD_LAMBDA      133
535 #define MOS_MOD_UEXP        134
536 #define MOS_MOD_NEFF        135
537 #define MOS_MOD_UCRIT       136
538 #define MOS_MOD_NFS         137
539 #define MOS_MOD_DELTA       138
540 #define MOS_MOD_VMAX        139
541 #define MOS_MOD_XJ          140
542 #define MOS_MOD_ETA         141
543 #define MOS_MOD_THETA       142
544 #define MOS_MOD_ALPHA       143
545 #define MOS_MOD_KAPPA       144
546 #define MOS_MOD_XD          145
547 #define MOS_DELTA           146
548 #define MOS_MOD_KV          147
549 #define MOS_MOD_NV          148
550 #define MOS_MOD_KC          149
551 #define MOS_MOD_NC          150
552 #define MOS_MOD_GAMMA1      151
553 #define MOS_MOD_SIGMA       152
554 #define MOS_MOD_LAMDA0      153
555 #define MOS_MOD_LAMDA1      154
556 /* level 8, CryoMOS by Luong Huynh, 1/19/95 */
557 #define MOS_MOD_A1          155
558 #define MOS_MOD_A2          156
559 #define MOS_MOD_K1          157
560 #define MOS_MOD_K2          158
561 #define MOS_MOD_K3          159
562 #define MOS_MOD_K4          160
563 #define MOS_MOD_PCLM        161
564 #define MOS_MOD_EM          162
565 
566 
567 #ifdef __STDC__
568 
569 extern int  MOSacLoad(GENmodel*,CKTcircuit*);
570 extern int  MOSask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*);
571 extern int  MOSconvTest(GENmodel*,CKTcircuit*);
572 extern int  MOSdisto(int,GENmodel*,CKTcircuit*);
573 extern int  MOSgetic(GENmodel*,CKTcircuit*);
574 extern int  MOSload(GENmodel*,CKTcircuit*);
575 extern int  MOSmAsk(CKTcircuit*,GENmodel*,int,IFvalue*);
576 extern int  MOSmParam(int,IFvalue*,GENmodel*);
577 extern int  MOSnoise(int,int,GENmodel*,CKTcircuit*,GENERIC*,double*);
578 extern int  MOSparam(CKTcircuit*,int,IFvalue*,GENinstance*,IFvalue*);
579 extern int  MOSpzLoad(GENmodel*,CKTcircuit*,SPcomplex*);
580 extern int  MOSsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
581 extern int  MOStemp(GENmodel*,CKTcircuit*);
582 extern int  MOStrunc(GENmodel*,CKTcircuit*,double*);
583 
584 #else /* stdc */
585 
586 extern int  MOSacLoad();
587 extern int  MOSask();
588 extern int  MOSconvTest();
589 extern int  MOSdisto();
590 extern int  MOSgetic();
591 extern int  MOSload();
592 extern int  MOSmAsk();
593 extern int  MOSmParam();
594 extern int  MOSnoise();
595 extern int  MOSparam();
596 extern int  MOSpzLoad();
597 extern int  MOSsetup();
598 extern int  MOStemp();
599 extern int  MOStrunc();
600 
601 #endif /* stdc */
602 
603 
604 /* store some things to pass to functions */
605 struct mosstuff {
606     double ms_vt;
607     double ms_von;
608     double ms_vdsat;
609     double ms_vgs;
610     double ms_vds;
611     double ms_vbs;
612     double ms_vbd;
613     double ms_vgb;
614     double ms_vgd;
615     double ms_ceqgs;
616     double ms_ceqgd;
617     double ms_ceqgb;
618     double ms_cdrain;
619     double ms_gcgs;
620     double ms_gcgd;
621     double ms_gcgb;
622     double ms_capgs;
623     double ms_capgd;
624     double ms_capgb;
625 };
626 
627 /* semi-private functions... */
628 #ifdef __STDC__
629 extern void MOSfd(MOSmodel*,MOSinstance*);
630 extern void MOSfs(MOSmodel*,MOSinstance*);
631 extern double MOSeq1(MOSmodel*,MOSinstance*,struct mosstuff*);
632 extern double MOSeq2(MOSmodel*,MOSinstance*,struct mosstuff*);
633 extern double MOSeq3(MOSmodel*,MOSinstance*,struct mosstuff*);
634 extern double MOSeq6(MOSmodel*,MOSinstance*,struct mosstuff*);
635 /* level 8, CryoMOS by Luong Huynh 1/19/95 */
636 extern double cryoMOSeq(MOSmodel*,MOSinstance*,struct mosstuff*);
637 /**/
638 #else
639 extern void MOSfd();
640 extern void MOSfs();
641 extern double MOSeq1();
642 extern double MOSeq2();
643 extern double MOSeq3();
644 extern double MOSeq6();
645 /* level 8, CryoMOS by Luong Huynh 1/19/95 */
646 extern double cryoMOSeq();
647 /**/
648 #endif
649 
650 /* ...and a macro */
651 #define SARGS(arg,bot,side,sarg,sargsw) { \
652   if(bot==side) \
653     { if(bot==.5) sarg=sargsw=1/sqrt(arg); \
654     else sarg=sargsw=exp(-bot*log(arg)); } \
655   else \
656     { if(bot==.5) sarg=1/sqrt(arg); \
657     else sarg=exp(-bot*log(arg)); \
658     if(side==.5) sargsw=1/sqrt(arg); \
659     else sargsw=exp(-side*log(arg)); } \
660 }
661 
662 #endif /*MOS*/
663