Jspice3
jfetdset.c File Reference
#include "spice.h"
#include <stdio.h>
#include <math.h>
#include "jfetdefs.h"
#include "distodef.h"
#include "const.h"
#include "util.h"
#include "sperror.h"
#include "distoext.h"
Include dependency graph for jfetdset.c:

Go to the source code of this file.

Functions

int JFETdSetup (GENmodel *inModel, CKTcircuit *ckt)
 

Function Documentation

int JFETdSetup ( GENmodel inModel,
CKTcircuit ckt 
)

Definition at line 24 of file jfetdset.c.

30 {
31  register JFETmodel *model = (JFETmodel*)inModel;
32  register JFETinstance *here;
33  double beta;
34  double betap;
35  double lcapgd1;
36  double lcapgd2;
37  double lcapgd3;
38  double lcapgs2;
39  double lcapgs3;
40  double lcapgs1;
41  double cd;
42  double cdrain;
43  double temp;
44  double cg;
45  double cgd;
46  double csat;
47  double czgd;
48  double czgdf2;
49  double czgs;
50  double czgsf2;
51  double evgd;
52  double evgs;
53  double fcpb2;
54  double gdpr;
55  double gds1;
56  double gds2;
57  double gds3;
58  double lggd1;
59  double lggd2;
60  double lggd3;
61  double lggs1;
62  double lggs2;
63  double lggs3;
64  double gm1;
65  double gm2;
66  double gm3;
67  double gmds;
68  double gm2ds;
69  double gmds2;
70  double gspr;
71  double sarg;
72  double twob;
73  double twop;
74  double vds;
75  double vgd;
76  double vgs;
77  double vgst;
78 
79  /* loop through all the models */
80  for( ; model != NULL; model = model->JFETnextModel ) {
81 
82  /* loop through all the instances of the model */
83  for (here = model->JFETinstances; here != NULL ;
84  here=here->JFETnextInstance) {
85 
86  /*
87  * dc model parameters
88  */
89  beta = model->JFETbeta * here->JFETarea;
90  gdpr=model->JFETdrainConduct*here->JFETarea;
91  gspr=model->JFETsourceConduct*here->JFETarea;
92  csat=here->JFETtSatCur*here->JFETarea;
93  /*
94  * initialization
95  */
96  vgs= model->JFETtype*(*(ckt->CKTrhsOld + here->JFETgateNode)
97  - *(ckt->CKTrhsOld + here->JFETsourcePrimeNode));
98  vgd= model->JFETtype*(*(ckt->CKTrhsOld + here->JFETgateNode)
99  - *(ckt->CKTrhsOld + here->JFETdrainPrimeNode));
100  /*
101  * determine dc current and derivatives
102  */
103  vds=vgs-vgd;
104 
105  if (vds < 0.0) {
106  vds = -vds;
107  temp = vgs;
108  vgs = vgd;
109  vgd = temp; /* so now these have become the
110  local variables */
111  here->JFETmode = -1;
112  } else {
113  here->JFETmode = 1;
114  }
115 
116  if (vgs <= -5*here->JFETtemp*CONSTKoverQ) {
117  lggs1 = -csat/vgs+ckt->CKTgmin;
118  lggs2=lggs3=0;
119  cg = lggs1*vgs;
120  } else {
121  evgs = exp(vgs/(here->JFETtemp*CONSTKoverQ));
122  lggs1 = csat*evgs/(here->JFETtemp*CONSTKoverQ)+ckt->CKTgmin;
123  lggs2 = (lggs1-ckt->CKTgmin)/((here->JFETtemp*CONSTKoverQ)*2);
124  lggs3 = lggs2/(3*(here->JFETtemp*CONSTKoverQ));
125  cg = csat*(evgs-1)+ckt->CKTgmin*vgs;
126  }
127  if (vgd <= -5*(here->JFETtemp*CONSTKoverQ)) {
128  lggd1 = -csat/vgd+ckt->CKTgmin;
129  lggd2=lggd3=0;
130  cgd = lggd1*vgd;
131  } else {
132  evgd = exp(vgd/(here->JFETtemp*CONSTKoverQ));
133  lggd1 = csat*evgd/(here->JFETtemp*CONSTKoverQ)+ckt->CKTgmin;
134  lggd2 = (lggd1-ckt->CKTgmin)/((here->JFETtemp*CONSTKoverQ)*2);
135  lggd3 = lggd2/(3*(here->JFETtemp*CONSTKoverQ));
136  cgd = csat*(evgd-1)+ckt->CKTgmin*vgd;
137  }
138  cg = cg+cgd;
139  /*
140  * compute drain current and derivatives
141  */
142  vgst=vgs-model->JFETthreshold;
143  /*
144  * cutoff region
145  */
146  if (vgst <= 0) {
147  cdrain=0;
148  gm1=gm2=gm3=0;
149  gds1=gds2=gds3=0;
150  gmds=gm2ds=gmds2=0;
151  } else {
152  betap=beta*(1+model->JFETlModulation*vds);
153  twob=betap+betap;
154  if (vgst <= vds) {
155  /*
156  * normal mode, saturation region
157  */
158 
159  /* note - for cdrain, all the g's refer to the
160  * derivatives which have not been divided to
161  * become Taylor coeffs. A notational
162  * inconsistency but simplifies processing later.
163  */
164  cdrain=betap*vgst*vgst;
165  gm1=twob*vgst;
166  gm2=twob;
167  gm3=0;
168  gds1=model->JFETlModulation*beta*vgst*vgst;
169  gds2=gds3=gmds2=0;
170  gm2ds=2*model->JFETlModulation*beta;
171  gmds=gm2ds*vgst;
172  } else {
173  /*
174  * normal mode, linear region
175  */
176  cdrain=betap*vds*(vgst+vgst-vds);
177  gm1=twob*vds;
178  gm2=0;
179  gm3=0;
180  gmds=(beta+beta)*(1+2*model->JFETlModulation*vds);
181  gm2ds=0;
182  gds2=2*beta*(2*model->JFETlModulation*vgst - 1 -
183  3*model->JFETlModulation*vds);
184  gds1=beta*(2*(vgst-vds) + 4*vgst*vds*
185  model->JFETlModulation - 3*model->JFETlModulation*vds*vds);
186  gmds2=4*beta*model->JFETlModulation;
187  gds3= -6*beta*model->JFETlModulation;
188  }
189  }
190  /*
191  * compute equivalent drain current source
192  */
193  cd=cdrain-cgd;
194  /*
195  * charge storage elements
196  */
197  czgs=here->JFETtCGS*here->JFETarea;
198  czgd=here->JFETtCGD*here->JFETarea;
199  twop=here->JFETtGatePot+here->JFETtGatePot;
200  fcpb2=here->JFETcorDepCap*here->JFETcorDepCap;
201  czgsf2=czgs/model->JFETf2;
202  czgdf2=czgd/model->JFETf2;
203  if (vgs < here->JFETcorDepCap) {
204  sarg=sqrt(1-vgs/here->JFETtGatePot);
205  lcapgs1=czgs/sarg;
206  lcapgs2=lcapgs1/(here->JFETtGatePot*4*sarg*sarg);
207  lcapgs3=lcapgs2/(here->JFETtGatePot*2*sarg*sarg);
208  } else {
209  lcapgs1=czgsf2*(model->JFETf3+vgs/twop);
210  lcapgs2=czgsf2/twop*0.5;
211  lcapgs3=0;
212  }
213  if (vgd < here->JFETcorDepCap) {
214  sarg=sqrt(1-vgd/here->JFETtGatePot);
215  lcapgd1=czgd/sarg;
216  lcapgd2=lcapgd1/(here->JFETtGatePot*4*sarg*sarg);
217  lcapgd3=lcapgd2/(here->JFETtGatePot*2*sarg*sarg);
218  } else {
219  lcapgd1=czgdf2*(model->JFETf3+vgd/twop);
220  lcapgd2=czgdf2/twop*0.5;
221  lcapgd3=0;
222  }
223  /*
224  * process to get Taylor coefficients, taking into
225  * account type and mode.
226  */
227 
228  if (here->JFETmode == 1)
229  {
230  /* normal mode - no source-drain interchange */
231 here->cdr_x = gm1;
232 here->cdr_y = gds1;
233 here->cdr_x2 = gm2;
234 here->cdr_y2 = gds2;
235 here->cdr_xy = gmds;
236 here->cdr_x3 = gm3;
237 here->cdr_y3 = gds3;
238 here->cdr_x2y = gm2ds;
239 here->cdr_xy2 = gmds2;
240 
241 here->ggs1 = lggs1;
242 here->ggd1 = lggd1;
243 here->ggs2 = lggs2;
244 here->ggd2 = lggd2;
245 here->ggs3 = lggs3;
246 here->ggd3 = lggd3;
247 here->capgs1 = lcapgs1;
248 here->capgd1 = lcapgd1;
249 here->capgs2 = lcapgs2;
250 here->capgd2 = lcapgd2;
251 here->capgs3 = lcapgs3;
252 here->capgd3 = lcapgd3;
253 } else {
254  /*
255  * inverse mode - source and drain interchanged
256  */
257 
258 
259 here->cdr_x = -gm1;
260 here->cdr_y = gm1 + gds1;
261 here->cdr_x2 = -gm2;
262 here->cdr_y2 = -(gm2 + gds2 + 2*gmds);
263 here->cdr_xy = gm2 + gmds;
264 here->cdr_x3 = -gm3;
265 here->cdr_y3 = gm3 + gds3 + 3*(gm2ds + gmds2 ) ;
266 here->cdr_x2y = gm3 + gm2ds;
267 here->cdr_xy2 = -(gm3 + 2*gm2ds + gmds2);
268 
269 here->ggs1 = lggd1;
270 here->ggd1 = lggs1;
271 
272 here->ggs2 = lggd2;
273 here->ggd2 = lggs2;
274 
275 here->ggs3 = lggd3;
276 here->ggd3 = lggs3;
277 
278 here->capgs1 = lcapgd1;
279 here->capgd1 = lcapgs1;
280 
281 here->capgs2 = lcapgd2;
282 here->capgd2 = lcapgs2;
283 
284 here->capgs3 = lcapgd3;
285 here->capgd3 = lcapgs3;
286 }
287 
288 /* now to adjust for type and multiply by factors to convert to Taylor coeffs. */
289 
290 here->cdr_x2 = 0.5*model->JFETtype*here->cdr_x2;
291 here->cdr_y2 = 0.5*model->JFETtype*here->cdr_y2;
292 here->cdr_xy = model->JFETtype*here->cdr_xy;
293 here->cdr_x3 = here->cdr_x3/6.;
294 here->cdr_y3 = here->cdr_y3/6.;
295 here->cdr_x2y = 0.5*here->cdr_x2y;
296 here->cdr_xy2 = 0.5*here->cdr_xy2;
297 
298 
299 here->ggs2 = model->JFETtype*lggs2;
300 here->ggd2 = model->JFETtype*lggd2;
301 
302 here->capgs2 = model->JFETtype*lcapgs2;
303 here->capgd2 = model->JFETtype*lcapgd2;
304 
305  }
306  }
307  return(OK);
308  }
double JFETtCGD
Definition: jfetdefs.h:141
double JFETcorDepCap
Definition: jfetdefs.h:142
double JFETbeta
Definition: jfetdefs.h:175
double JFETthreshold
Definition: jfetdefs.h:174
int JFETtype
Definition: jfetdefs.h:172
double JFETdrainConduct
Definition: jfetdefs.h:188
int JFETdrainPrimeNode
Definition: jfetdefs.h:32
int JFETgateNode
Definition: jfetdefs.h:30
JFETinstance * JFETinstances
Definition: jfetdefs.h:169
double CONSTKoverQ
Definition: main.c:915
double JFETtSatCur
Definition: jfetdefs.h:138
int JFETtemp()
double JFETarea
Definition: jfetdefs.h:134
double JFETtemp
Definition: jfetdefs.h:137
double JFETf2
Definition: jfetdefs.h:190
#define OK
Definition: iferrmsg.h:17
double * CKTrhsOld
Definition: cktdefs.h:98
#define NULL
Definition: spdefs.h:121
double JFETsourceConduct
Definition: jfetdefs.h:189
double JFETtCGS
Definition: jfetdefs.h:140
struct sJFETmodel * JFETnextModel
Definition: jfetdefs.h:167
int JFETmode
Definition: jfetdefs.h:66
static char model[32]
Definition: subckt.c:76
struct sJFETinstance * JFETnextInstance
Definition: jfetdefs.h:25
int JFETsourcePrimeNode
Definition: jfetdefs.h:33
double JFETtGatePot
Definition: jfetdefs.h:139
double CKTgmin
Definition: cktdefs.h:190
double JFETf3
Definition: jfetdefs.h:191
double JFETlModulation
Definition: jfetdefs.h:176