Jspice3
mosask.c
Go to the documentation of this file.
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: 1987 Mathew Lew and Thomas L. Quarles
5  1989 Takayasu Sakurai
6  1993 Stephen R. Whiteley
7 ****************************************************************************/
8 
9 #include "spice.h"
10 #include <stdio.h>
11 #include <math.h>
12 #include "mosdefs.h"
13 #include "tskdefs.h"
14 #include "const.h"
15 #include "sperror.h"
16 #include "util.h"
17 
18 
19 /*ARGSUSED*/
20 int
21 MOSask(ckt,inst,which,value,select)
22 
23 CKTcircuit *ckt;
24 GENinstance *inst;
25 int which;
26 IFvalue *value;
27 IFvalue *select;
28 {
29  MOSinstance *here = (MOSinstance *)inst;
30  static char *msg = "Current and power not available for ac analysis";
31 
32  switch (which) {
33 
34  case MOS_TEMP:
35  value->rValue = here->MOStemp-CONSTCtoK;
36  break;
37  case MOS_L:
38  value->rValue = here->MOSl;
39  break;
40  case MOS_W:
41  value->rValue = here->MOSw;
42  break;
43  case MOS_AD:
44  value->rValue = here->MOSdrainArea;
45  break;
46  case MOS_AS:
47  value->rValue = here->MOSsourceArea;
48  break;
49  case MOS_PD:
50  value->rValue = here->MOSdrainPerimeter;
51  break;
52  case MOS_PS:
53  value->rValue = here->MOSsourcePerimeter;
54  break;
55  case MOS_NRD:
56  value->rValue = here->MOSdrainSquares;
57  break;
58  case MOS_NRS:
59  value->rValue = here->MOSsourceSquares;
60  break;
61  case MOS_OFF:
62  value->rValue = here->MOSoff;
63  break;
64  case MOS_IC_VDS:
65  value->rValue = here->MOSicVDS;
66  break;
67  case MOS_IC_VGS:
68  value->rValue = here->MOSicVGS;
69  break;
70  case MOS_IC_VBS:
71  value->rValue = here->MOSicVBS;
72  break;
73  case MOS_CGD:
74  if (ckt->CKTstate0)
75  value->rValue = *(ckt->CKTstate0 + here->MOScapgd);
76  break;
77  case MOS_CGS:
78  if (ckt->CKTstate0)
79  value->rValue = *(ckt->CKTstate0 + here->MOScapgs);
80  break;
81  case MOS_DNODE:
82  value->iValue = here->MOSdNode;
83  break;
84  case MOS_GNODE:
85  value->iValue = here->MOSgNode;
86  break;
87  case MOS_SNODE:
88  value->iValue = here->MOSsNode;
89  break;
90  case MOS_BNODE:
91  value->iValue = here->MOSbNode;
92  break;
93  case MOS_DNODEPRIME:
94  value->iValue = here->MOSdNodePrime;
95  break;
96  case MOS_SNODEPRIME:
97  value->iValue = here->MOSsNodePrime;
98  break;
99  case MOS_DRAINCONDUCT:
100  value->rValue = here->MOSdrainConductance;
101  break;
102  case MOS_SOURCECONDUCT:
103  value->rValue = here->MOSsourceConductance;
104  break;
105  case MOS_VON:
106  value->rValue = here->MOSvon;
107  break;
108  case MOS_VDSAT:
109  value->rValue = here->MOSvdsat;
110  break;
111  case MOS_DRAINVCRIT:
112  value->rValue = here->MOSdrainVcrit;
113  break;
114  case MOS_SOURCEVCRIT:
115  value->rValue = here->MOSsourceVcrit;
116  break;
117  case MOS_CD:
118  value->rValue = here->MOScd;
119  break;
120  case MOS_CBD:
121  value->rValue = here->MOScbd;
122  break;
123  case MOS_CBS:
124  value->rValue = here->MOScbs;
125  break;
126  case MOS_GMBS:
127  value->rValue = here->MOSgmbs;
128  break;
129  case MOS_GM:
130  value->rValue = here->MOSgm;
131  break;
132  case MOS_GDS:
133  value->rValue = here->MOSgds;
134  break;
135  case MOS_GBD:
136  value->rValue = here->MOSgbd;
137  break;
138  case MOS_GBS:
139  value->rValue = here->MOSgbs;
140  break;
141  case MOS_CAPBD:
142  value->rValue = here->MOScapbd;
143  break;
144  case MOS_CAPBS:
145  value->rValue = here->MOScapbs;
146  break;
147  case MOS_CAPZEROBIASBD:
148  value->rValue = here->MOSCbd;
149  break;
150  case MOS_CAPZEROBIASBDSW:
151  value->rValue = here->MOSCbdsw;
152  break;
153  case MOS_CAPZEROBIASBS:
154  value->rValue = here->MOSCbs;
155  break;
156  case MOS_CAPZEROBIASBSSW:
157  value->rValue = here->MOSCbssw;
158  break;
159  case MOS_VBD:
160  if (ckt->CKTstate0)
161  value->rValue = *(ckt->CKTstate0 + here->MOSvbd);
162  break;
163  case MOS_VBS:
164  if (ckt->CKTstate0)
165  value->rValue = *(ckt->CKTstate0 + here->MOSvbs);
166  break;
167  case MOS_VGS:
168  if (ckt->CKTstate0)
169  value->rValue = *(ckt->CKTstate0 + here->MOSvgs);
170  break;
171  case MOS_VDS:
172  if (ckt->CKTstate0)
173  value->rValue = *(ckt->CKTstate0 + here->MOSvds);
174  break;
175  case MOS_CAPGD:
176  if (ckt->CKTstate0)
177  value->rValue = *(ckt->CKTstate0 + here->MOScapgd);
178  break;
179  case MOS_QGD:
180  if (ckt->CKTstate0)
181  value->rValue = *(ckt->CKTstate0 + here->MOSqgd);
182  break;
183  case MOS_CQGD:
184  if (ckt->CKTstate0)
185  value->rValue = *(ckt->CKTstate0 + here->MOScqgd);
186  break;
187  case MOS_CAPGS:
188  if (ckt->CKTstate0)
189  value->rValue = *(ckt->CKTstate0 + here->MOScapgs);
190  break;
191  case MOS_QGS:
192  if (ckt->CKTstate0)
193  value->rValue = *(ckt->CKTstate0 + here->MOSqgs);
194  break;
195  case MOS_CQGS:
196  if (ckt->CKTstate0)
197  value->rValue = *(ckt->CKTstate0 + here->MOScqgs);
198  break;
199  case MOS_CAPGB:
200  if (ckt->CKTstate0)
201  value->rValue = *(ckt->CKTstate0 + here->MOScapgb);
202  break;
203  case MOS_QGB:
204  if (ckt->CKTstate0)
205  value->rValue = *(ckt->CKTstate0 + here->MOSqgb);
206  break;
207  case MOS_CQGB:
208  if (ckt->CKTstate0)
209  value->rValue = *(ckt->CKTstate0 + here->MOScqgb);
210  break;
211  case MOS_QBD:
212  if (ckt->CKTstate0)
213  value->rValue = *(ckt->CKTstate0 + here->MOSqbd);
214  break;
215  case MOS_CQBD:
216  if (ckt->CKTstate0)
217  value->rValue = *(ckt->CKTstate0 + here->MOScqbd);
218  break;
219  case MOS_QBS:
220  if (ckt->CKTstate0)
221  value->rValue = *(ckt->CKTstate0 + here->MOSqbs);
222  break;
223  case MOS_CQBS:
224  if (ckt->CKTstate0)
225  value->rValue = *(ckt->CKTstate0 + here->MOScqbs);
226  break;
227  case MOS_CG:
228  if (ckt->CKTcurrentAnalysis & DOING_AC) {
229  errMsg = MALLOC(strlen(msg)+1);
230  errRtn = "MOSask.c";
231  strcpy(errMsg,msg);
232  return (E_ASKCURRENT);
233  }
234  if (ckt->CKTcurrentAnalysis & DOING_TRAN) {
235  if (!(ckt->CKTmode & MODETRANOP)) {
236  if (ckt->CKTstate0)
237  value->rValue =
238  *(ckt->CKTstate0 + here->MOScqgb) +
239  *(ckt->CKTstate0 + here->MOScqgd) +
240  *(ckt->CKTstate0 + here->MOScqgs);
241  }
242  }
243  break;
244  case MOS_CS:
245  if (ckt->CKTcurrentAnalysis & DOING_AC) {
246  errMsg = MALLOC(strlen(msg)+1);
247  errRtn = "MOSask.c";
248  strcpy(errMsg,msg);
249  return (E_ASKCURRENT);
250  }
251  if (ckt->CKTstate0) {
252  value->rValue = -here->MOScd;
253  value->rValue -= here->MOScbd + here->MOScbs -
254  *(ckt->CKTstate0 + here->MOScqgb);
255  if ((ckt->CKTcurrentAnalysis & DOING_TRAN) &&
256  !(ckt->CKTmode & MODETRANOP)) {
257  value->rValue -= *(ckt->CKTstate0 + here->MOScqgb) +
258  *(ckt->CKTstate0 + here->MOScqgd) +
259  *(ckt->CKTstate0 + here->MOScqgs);
260  }
261  }
262  break;
263  case MOS_CB:
264  if (ckt->CKTcurrentAnalysis & DOING_AC) {
265  errMsg = MALLOC(strlen(msg)+1);
266  errRtn = "MOSask.c";
267  strcpy(errMsg,msg);
268  return (E_ASKCURRENT);
269  }
270  if (ckt->CKTstate0) {
271  value->rValue = here->MOScbd + here->MOScbs -
272  *(ckt->CKTstate0 + here->MOScqgb);
273  }
274  break;
275  case MOS_POWER:
276  if (ckt->CKTcurrentAnalysis & DOING_AC) {
277  errMsg = MALLOC(strlen(msg)+1);
278  errRtn = "MOSask.c";
279  strcpy(errMsg,msg);
280  return (E_ASKPOWER);
281  }
282  if (ckt->CKTstate0 && ckt->CKTrhsOld) {
283  double temp;
284 
285  value->rValue = here->MOScd *
286  *(ckt->CKTrhsOld + here->MOSdNode);
287  value->rValue += (here->MOScbd + here->MOScbs -
288  *(ckt->CKTstate0 + here->MOScqgb)) *
289  *(ckt->CKTrhsOld + here->MOSbNode);
290  if ((ckt->CKTcurrentAnalysis & DOING_TRAN) &&
291  !(ckt->CKTmode & MODETRANOP)) {
292  value->rValue += (*(ckt->CKTstate0 + here->MOScqgb) +
293  *(ckt->CKTstate0 + here->MOScqgd) +
294  *(ckt->CKTstate0 + here->MOScqgs)) *
295  *(ckt->CKTrhsOld + here->MOSgNode);
296  }
297  temp = -here->MOScd;
298  temp -= here->MOScbd + here->MOScbs ;
299  if ((ckt->CKTcurrentAnalysis & DOING_TRAN) &&
300  !(ckt->CKTmode & MODETRANOP)) {
301  temp -= *(ckt->CKTstate0 + here->MOScqgb) +
302  *(ckt->CKTstate0 + here->MOScqgd) +
303  *(ckt->CKTstate0 + here->MOScqgs);
304  }
305  value->rValue += temp * *(ckt->CKTrhsOld + here->MOSsNode);
306  }
307  break;
308  case MOS_DRAINRESIST:
309  if (here->MOSdNodePrime != here->MOSdNode &&
310  here->MOSdrainConductance != 0)
311  value->rValue = 1.0 / here->MOSdrainConductance;
312  else
313  value->rValue = 0.0;
314  break;
315  case MOS_SOURCERESIST:
316  if (here->MOSsNodePrime != here->MOSsNode &&
317  here->MOSsourceConductance != 0)
318  value->rValue = 1.0 / here->MOSsourceConductance;
319  else
320  value->rValue = 0.0;
321  break;
322  default:
323  return (E_BADPARM);
324  }
325  return (OK);
326 }
327 
#define MOS_GDS
Definition: mosdefs.h:467
double MOSdrainArea
Definition: mosdefs.h:36
#define MOS_QGS
Definition: mosdefs.h:484
double MOStemp
Definition: mosdefs.h:44
double MOSgm
Definition: mosdefs.h:74
#define E_ASKCURRENT
Definition: sperror.h:26
#define MOS_IC_VDS
Definition: mosdefs.h:444
#define MOS_QGB
Definition: mosdefs.h:487
#define MOS_VGS
Definition: mosdefs.h:478
#define MOS_VON
Definition: mosdefs.h:458
double MOSgmbs
Definition: mosdefs.h:73
#define MOS_SOURCERESIST
Definition: mosdefs.h:498
#define MOS_CQBS
Definition: mosdefs.h:492
char * strcpy()
#define MOS_SOURCECONDUCT
Definition: mosdefs.h:457
double MOScd
Definition: mosdefs.h:70
#define MOS_QGD
Definition: mosdefs.h:481
#define MOS_CAPGD
Definition: mosdefs.h:480
#define MOS_QBS
Definition: mosdefs.h:491
#define CONSTCtoK
Definition: const.h:11
char * errMsg
Definition: main.c:42
double MOSgds
Definition: mosdefs.h:75
double MOScbd
Definition: mosdefs.h:72
double MOScapbd
Definition: mosdefs.h:78
#define MOS_CQBD
Definition: mosdefs.h:490
#define MOS_AD
Definition: mosdefs.h:437
double MOSsourcePerimeter
Definition: mosdefs.h:41
double MOSCbs
Definition: mosdefs.h:82
#define MOS_VDS
Definition: mosdefs.h:479
#define E_BADPARM
Definition: iferrmsg.h:26
#define MOS_W
Definition: mosdefs.h:436
double MOSl
Definition: mosdefs.h:34
#define MOS_CQGD
Definition: mosdefs.h:482
unsigned MOSoff
Definition: mosdefs.h:215
int MOSdNodePrime
Definition: mosdefs.h:29
double MOSCbdsw
Definition: mosdefs.h:81
#define MOS_CAPZEROBIASBS
Definition: mosdefs.h:474
#define MOS_NRD
Definition: mosdefs.h:441
#define MOS_CBS
Definition: mosdefs.h:464
#define MOS_CD
Definition: mosdefs.h:462
int iValue
Definition: ifsim.h:232
#define MOS_AS
Definition: mosdefs.h:438
double rValue
Definition: ifsim.h:233
#define MOS_CB
Definition: mosdefs.h:495
int MOSsNode
Definition: mosdefs.h:27
#define MOS_CAPZEROBIASBSSW
Definition: mosdefs.h:475
#define MOS_CS
Definition: mosdefs.h:494
#define MOS_IC_VGS
Definition: mosdefs.h:445
#define DOING_AC
Definition: tskdefs.h:24
#define MOS_CGD
Definition: mosdefs.h:448
double MOSw
Definition: mosdefs.h:35
#define MOS_SNODE
Definition: mosdefs.h:452
#define MOS_OFF
Definition: mosdefs.h:443
#define OK
Definition: iferrmsg.h:17
#define MOS_DNODEPRIME
Definition: mosdefs.h:454
#define MOS_VDSAT
Definition: mosdefs.h:459
#define MOS_DRAINCONDUCT
Definition: mosdefs.h:456
double MOSvon
Definition: mosdefs.h:66
#define MOS_CAPZEROBIASBDSW
Definition: mosdefs.h:473
#define MOS_QBD
Definition: mosdefs.h:489
#define MALLOC(x)
Definition: util.h:9
double MOSdrainVcrit
Definition: mosdefs.h:69
int MOSgNode
Definition: mosdefs.h:26
double MOSgbs
Definition: mosdefs.h:77
#define MOS_CG
Definition: mosdefs.h:493
double MOSicVBS
Definition: mosdefs.h:63
#define MOS_VBD
Definition: mosdefs.h:476
double MOSgbd
Definition: mosdefs.h:76
double MOSCbd
Definition: mosdefs.h:80
#define MOS_L
Definition: mosdefs.h:435
double MOSdrainPerimeter
Definition: mosdefs.h:40
#define MOS_SNODEPRIME
Definition: mosdefs.h:455
#define MOS_CQGS
Definition: mosdefs.h:485
double MOSsourceVcrit
Definition: mosdefs.h:68
#define MOS_CBD
Definition: mosdefs.h:463
int MOSdNode
Definition: mosdefs.h:25
#define MOS_CAPBS
Definition: mosdefs.h:471
#define MOS_CAPZEROBIASBD
Definition: mosdefs.h:472
double MOSCbssw
Definition: mosdefs.h:83
#define MODETRANOP
Definition: cktdefs.h:151
#define MOS_VBS
Definition: mosdefs.h:477
#define MOS_GNODE
Definition: mosdefs.h:451
int MOSsNodePrime
Definition: mosdefs.h:30
#define DOING_TRAN
Definition: tskdefs.h:25
#define MOS_NRS
Definition: mosdefs.h:442
#define MOS_TEMP
Definition: mosdefs.h:434
#define MOS_GMBS
Definition: mosdefs.h:465
double MOSicVGS
Definition: mosdefs.h:65
#define MOS_IC_VBS
Definition: mosdefs.h:446
#define MOS_GBS
Definition: mosdefs.h:469
#define MOS_CAPGS
Definition: mosdefs.h:483
#define MOS_DRAINRESIST
Definition: mosdefs.h:497
#define MOS_BNODE
Definition: mosdefs.h:453
#define MOS_GBD
Definition: mosdefs.h:468
double MOSdrainSquares
Definition: mosdefs.h:38
int MOSask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select)
Definition: mosask.c:21
char * errRtn
Definition: main.c:41
double MOSsourceConductance
Definition: mosdefs.h:42
#define E_ASKPOWER
Definition: sperror.h:27
int MOSbNode
Definition: mosdefs.h:28
#define MOS_PD
Definition: mosdefs.h:439
#define MOS_PS
Definition: mosdefs.h:440
#define MOS_DNODE
Definition: mosdefs.h:450
#define MOS_SOURCEVCRIT
Definition: mosdefs.h:461
double MOScbs
Definition: mosdefs.h:71
#define MOS_GM
Definition: mosdefs.h:466
double MOScapbs
Definition: mosdefs.h:79
#define MOS_CQGB
Definition: mosdefs.h:488
double MOSsourceSquares
Definition: mosdefs.h:39
double MOSsourceArea
Definition: mosdefs.h:37
#define MOS_CAPBD
Definition: mosdefs.h:470
#define MOS_CAPGB
Definition: mosdefs.h:486
#define MOS_POWER
Definition: mosdefs.h:496
double MOSvdsat
Definition: mosdefs.h:67
#define MOS_CGS
Definition: mosdefs.h:449
double MOSdrainConductance
Definition: mosdefs.h:43
double MOSicVDS
Definition: mosdefs.h:64
#define MOS_DRAINVCRIT
Definition: mosdefs.h:460