1 /**********
2 Copyright 1990 Regents of the University of California. All rights reserved.
3 Author: 1988 Jaijeet S Roychowdhury
4 **********/
5
6 #include "ngspice/ngspice.h"
7 #include "ngspice/cktdefs.h"
8 #include "jfetdefs.h"
9 #include "ngspice/sperror.h"
10 #include "ngspice/distodef.h"
11 #include "ngspice/suffix.h"
12
13 int
JFETdisto(int mode,GENmodel * genmodel,CKTcircuit * ckt)14 JFETdisto(int mode, GENmodel *genmodel, CKTcircuit *ckt)
15 /* assuming here that ckt->CKTomega has been initialised to
16 * the correct value
17 */
18 {
19 JFETmodel *model = (JFETmodel *) genmodel;
20 DISTOAN* job = (DISTOAN*) ckt->CKTcurJob;
21 DpassStr pass;
22 double r1h1x,i1h1x;
23 double r1h1y,i1h1y;
24 double r1h2x, i1h2x;
25 double r1h2y, i1h2y;
26 double r1hm2x,i1hm2x;
27 double r1hm2y,i1hm2y;
28 double r2h11x,i2h11x;
29 double r2h11y,i2h11y;
30 double r2h1m2x,i2h1m2x;
31 double r2h1m2y,i2h1m2y;
32 double temp, itemp;
33 JFETinstance *here;
34
35 if (mode == D_SETUP)
36 return(JFETdSetup(genmodel,ckt)); /* another hack from similar structures */
37
38 if ((mode == D_TWOF1) || (mode == D_THRF1) ||
39 (mode == D_F1PF2) || (mode == D_F1MF2) ||
40 (mode == D_2F1MF2)) {
41
42 /* loop through all the JFET models */
43 for( ; model != NULL; model = JFETnextModel(model)) {
44
45 /* loop through all the instances of the model */
46 for (here = JFETinstances(model); here != NULL ;
47 here=JFETnextInstance(here)) {
48
49 /* loading starts here */
50
51 switch (mode) {
52 case D_TWOF1:
53 /* x = vgs, y = vds */
54
55 /* getting first order (linear) Volterra kernel */
56 r1h1x = *(job->r1H1ptr + (here->JFETgateNode)) -
57 *(job->r1H1ptr + (here->JFETsourcePrimeNode));
58 i1h1x = *(job->i1H1ptr + (here->JFETgateNode)) -
59 *(job->i1H1ptr + (here->JFETsourcePrimeNode));
60
61 r1h1y = *(job->r1H1ptr + (here->JFETdrainPrimeNode)) -
62 *(job->r1H1ptr + (here->JFETsourcePrimeNode));
63 i1h1y = *(job->i1H1ptr + (here->JFETdrainPrimeNode)) -
64 *(job->i1H1ptr + (here->JFETsourcePrimeNode));
65
66
67 /* loading starts here */
68 /* loading cdrain term */
69
70 temp = DFn2F1(here->cdr_x2,
71 here->cdr_y2,
72 0.0,
73 here->cdr_xy,
74 0.0,
75 0.0,
76 r1h1x,
77 i1h1x,
78 r1h1y,
79 i1h1y,
80 0.0,
81 0.0);
82
83 itemp = DFi2F1(here->cdr_x2,
84 here->cdr_y2,
85 0.0,
86 here->cdr_xy,
87 0.0,
88 0.0,
89 r1h1x,
90 i1h1x,
91 r1h1y,
92 i1h1y,
93 0.0,
94 0.0);
95
96 *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) -= temp;
97 *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) -= itemp;
98 *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp;
99 *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp;
100
101 /* cdrain term over */
102
103 /* loading ggs term */
104
105 temp = D1n2F1(here->ggs2,
106 r1h1x,
107 i1h1x);
108
109 itemp = D1i2F1(here->ggs2,
110 r1h1x,
111 i1h1x);
112
113
114 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
115 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
116 *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp;
117 *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp;
118
119 /* ggs over */
120
121 /* loading ggd term */
122
123 temp = D1n2F1(here->ggd2,
124 r1h1x - r1h1y,
125 i1h1x - i1h1y);
126
127 itemp = D1i2F1(here->ggd2,
128 r1h1x - r1h1y,
129 i1h1x - i1h1y);
130
131
132 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
133 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
134 *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp;
135 *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp;
136
137 /* ggd over */
138
139 /* loading capgs term */
140
141 temp = -ckt->CKTomega *
142 D1i2F1(here->capgs2,
143 r1h1x,
144 i1h1x);
145
146 itemp = ckt->CKTomega *
147 D1n2F1(here->capgs2,
148 r1h1x,
149 i1h1x);
150
151
152 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
153 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
154 *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp;
155 *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp;
156
157 /* capgs over */
158
159 /* loading capgd term */
160
161 temp = -ckt->CKTomega *
162 D1i2F1(here->capgd2,
163 r1h1x - r1h1y,
164 i1h1x - i1h1y);
165
166 itemp = ckt->CKTomega *
167 D1n2F1(here->capgd2,
168 r1h1x - r1h1y,
169 i1h1x - i1h1y);
170
171
172 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
173 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
174 *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp;
175 *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp;
176
177 /* capgd over */
178
179 /* all done */
180
181 break;
182
183 case D_THRF1:
184 /* x = vgs, y = vds */
185
186 /* getting first order (linear) Volterra kernel */
187 r1h1x = *(job->r1H1ptr + (here->JFETgateNode)) -
188 *(job->r1H1ptr + (here->JFETsourcePrimeNode));
189 i1h1x = *(job->i1H1ptr + (here->JFETgateNode)) -
190 *(job->i1H1ptr + (here->JFETsourcePrimeNode));
191
192 r1h1y = *(job->r1H1ptr + (here->JFETdrainPrimeNode)) -
193 *(job->r1H1ptr + (here->JFETsourcePrimeNode));
194 i1h1y = *(job->i1H1ptr + (here->JFETdrainPrimeNode)) -
195 *(job->i1H1ptr + (here->JFETsourcePrimeNode));
196
197 r2h11x = *(job->r2H11ptr + (here->JFETgateNode)) -
198 *(job->r2H11ptr + (here->JFETsourcePrimeNode));
199 i2h11x = *(job->i2H11ptr + (here->JFETgateNode)) -
200 *(job->i2H11ptr + (here->JFETsourcePrimeNode));
201
202 r2h11y = *(job->r2H11ptr + (here->JFETdrainPrimeNode)) -
203 *(job->r2H11ptr + (here->JFETsourcePrimeNode));
204 i2h11y = *(job->i2H11ptr + (here->JFETdrainPrimeNode)) -
205 *(job->i2H11ptr + (here->JFETsourcePrimeNode));
206
207 /* loading starts here */
208 /* loading cdrain term */
209
210 temp = DFn3F1(here->cdr_x2,
211 here->cdr_y2,
212 0.0,
213 here->cdr_xy,
214 0.0,
215 0.0,
216 here->cdr_x3,
217 here->cdr_y3,
218 0.0,
219 here->cdr_x2y,
220 0.0,
221 here->cdr_xy2,
222 0.0,
223 0.0,
224 0.0,
225 0.0,
226 r1h1x,
227 i1h1x,
228 r1h1y,
229 i1h1y,
230 0.0,
231 0.0,
232 r2h11x,
233 i2h11x,
234 r2h11y,
235 i2h11y,
236 0.0,
237 0.0);
238
239 itemp = DFi3F1(here->cdr_x2,
240 here->cdr_y2,
241 0.0,
242 here->cdr_xy,
243 0.0,
244 0.0,
245 here->cdr_x3,
246 here->cdr_y3,
247 0.0,
248 here->cdr_x2y,
249 0.0,
250 here->cdr_xy2,
251 0.0,
252 0.0,
253 0.0,
254 0.0,
255 r1h1x,
256 i1h1x,
257 r1h1y,
258 i1h1y,
259 0.0,
260 0.0,
261 r2h11x,
262 i2h11x,
263 r2h11y,
264 i2h11y,
265 0.0,
266 0.0);
267
268 *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) -= temp;
269 *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) -= itemp;
270 *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp;
271 *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp;
272
273 /* cdrain term over */
274
275 /* loading ggs term */
276
277 temp = D1n3F1(here->ggs2,
278 here->ggs3,
279 r1h1x,
280 i1h1x,
281 r2h11x,
282 i2h11x);
283
284 itemp = D1i3F1(here->ggs2,
285 here->ggs3,
286 r1h1x,
287 i1h1x,
288 r2h11x,
289 i2h11x);
290
291
292 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
293 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
294 *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp;
295 *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp;
296
297 /* ggs over */
298
299 /* loading ggd term */
300
301 temp = D1n3F1(here->ggd2,
302 here->ggd3,
303 r1h1x - r1h1y,
304 i1h1x - i1h1y,
305 r2h11x - r2h11y,
306 i2h11x - i2h11y);
307
308 itemp = D1i3F1(here->ggd2,
309 here->ggd3,
310 r1h1x - r1h1y,
311 i1h1x - i1h1y,
312 r2h11x - r2h11y,
313 i2h11x - i2h11y);
314
315
316
317 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
318 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
319 *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp;
320 *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp;
321
322 /* ggd over */
323
324 /* loading capgs term */
325
326 temp = -ckt->CKTomega *
327 D1i3F1(here->capgs2,
328 here->capgs3,
329 r1h1x,
330 i1h1x,
331 r2h11x,
332 i2h11x);
333
334 itemp = ckt->CKTomega *
335 D1n3F1(here->capgs2,
336 here->capgs3,
337 r1h1x,
338 i1h1x,
339 r2h11x,
340 i2h11x);
341
342
343 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
344 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
345 *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp;
346 *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp;
347
348 /* capgs over */
349
350 /* loading capgd term */
351
352 temp = -ckt->CKTomega *
353 D1i3F1(here->capgd2,
354 here->capgd3,
355 r1h1x - r1h1y,
356 i1h1x - i1h1y,
357 r2h11x - r2h11y,
358 i2h11x - i2h11y);
359
360 itemp = ckt->CKTomega *
361 D1n3F1(here->capgd2,
362 here->capgd3,
363 r1h1x - r1h1y,
364 i1h1x - i1h1y,
365 r2h11x - r2h11y,
366 i2h11x - i2h11y);
367
368
369 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
370 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
371 *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp;
372 *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp;
373
374 /* capgd over */
375
376 /* all done */
377
378 break;
379 case D_F1PF2:
380 /* x = vgs, y = vds */
381
382 /* getting first order (linear) Volterra kernel */
383 r1h1x = *(job->r1H1ptr + (here->JFETgateNode)) -
384 *(job->r1H1ptr + (here->JFETsourcePrimeNode));
385 i1h1x = *(job->i1H1ptr + (here->JFETgateNode)) -
386 *(job->i1H1ptr + (here->JFETsourcePrimeNode));
387
388 r1h1y = *(job->r1H1ptr + (here->JFETdrainPrimeNode)) -
389 *(job->r1H1ptr + (here->JFETsourcePrimeNode));
390 i1h1y = *(job->i1H1ptr + (here->JFETdrainPrimeNode)) -
391 *(job->i1H1ptr + (here->JFETsourcePrimeNode));
392
393 r1h2x = *(job->r1H2ptr + (here->JFETgateNode)) -
394 *(job->r1H2ptr + (here->JFETsourcePrimeNode));
395 i1h2x = *(job->i1H2ptr + (here->JFETgateNode)) -
396 *(job->i1H2ptr + (here->JFETsourcePrimeNode));
397
398 r1h2y = *(job->r1H2ptr + (here->JFETdrainPrimeNode)) -
399 *(job->r1H2ptr + (here->JFETsourcePrimeNode));
400 i1h2y = *(job->i1H2ptr + (here->JFETdrainPrimeNode)) -
401 *(job->i1H2ptr + (here->JFETsourcePrimeNode));
402
403 /* loading starts here */
404 /* loading cdrain term */
405
406 temp = DFnF12(here->cdr_x2,
407 here->cdr_y2,
408 0.0,
409 here->cdr_xy,
410 0.0,
411 0.0,
412 r1h1x,
413 i1h1x,
414 r1h1y,
415 i1h1y,
416 0.0,
417 0.0,
418 r1h2x,
419 i1h2x,
420 r1h2y,
421 i1h2y,
422 0.0,
423 0.0);
424
425 itemp = DFiF12(here->cdr_x2,
426 here->cdr_y2,
427 0.0,
428 here->cdr_xy,
429 0.0,
430 0.0,
431 r1h1x,
432 i1h1x,
433 r1h1y,
434 i1h1y,
435 0.0,
436 0.0,
437 r1h2x,
438 i1h2x,
439 r1h2y,
440 i1h2y,
441 0.0,
442 0.0);
443
444 *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) -= temp;
445 *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) -= itemp;
446 *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp;
447 *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp;
448
449 /* cdrain term over */
450
451 /* loading ggs term */
452
453 temp = D1nF12(here->ggs2,
454 r1h1x,
455 i1h1x,
456 r1h2x,
457 i1h2x);
458
459 itemp = D1iF12(here->ggs2,
460 r1h1x,
461 i1h1x,
462 r1h2x,
463 i1h2x);
464
465
466 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
467 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
468 *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp;
469 *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp;
470
471 /* ggs over */
472
473 /* loading ggd term */
474
475 temp = D1nF12(here->ggd2,
476 r1h1x - r1h1y,
477 i1h1x - i1h1y,
478 r1h2x - r1h2y,
479 i1h2x - i1h2y);
480
481 itemp = D1iF12(here->ggd2,
482 r1h1x - r1h1y,
483 i1h1x - i1h1y,
484 r1h2x - r1h2y,
485 i1h2x - i1h2y);
486
487
488 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
489 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
490 *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp;
491 *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp;
492
493 /* ggd over */
494
495 /* loading capgs term */
496
497 temp = -ckt->CKTomega *
498 D1iF12(here->capgs2,
499 r1h1x,
500 i1h1x,
501 r1h2x,
502 i1h2x);
503
504 itemp = ckt->CKTomega *
505 D1nF12(here->capgs2,
506 r1h1x,
507 i1h1x,
508 r1h2x,
509 i1h2x);
510
511
512 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
513 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
514 *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp;
515 *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp;
516
517 /* capgs over */
518
519 /* loading capgd term */
520
521 temp = -ckt->CKTomega *
522 D1iF12(here->capgd2,
523 r1h1x - r1h1y,
524 i1h1x - i1h1y,
525 r1h2x - r1h2y,
526 i1h2x - i1h2y);
527
528 itemp = ckt->CKTomega *
529 D1nF12(here->capgd2,
530 r1h1x - r1h1y,
531 i1h1x - i1h1y,
532 r1h2x - r1h2y,
533 i1h2x - i1h2y);
534
535
536 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
537 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
538 *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp;
539 *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp;
540
541 /* capgd over */
542
543 /* all done */
544
545 break;
546 case D_F1MF2:
547 /* x = vgs, y = vds */
548
549 /* getting first order (linear) Volterra kernel */
550 r1h1x = *(job->r1H1ptr + (here->JFETgateNode)) -
551 *(job->r1H1ptr + (here->JFETsourcePrimeNode));
552 i1h1x = *(job->i1H1ptr + (here->JFETgateNode)) -
553 *(job->i1H1ptr + (here->JFETsourcePrimeNode));
554
555 r1h1y = *(job->r1H1ptr + (here->JFETdrainPrimeNode)) -
556 *(job->r1H1ptr + (here->JFETsourcePrimeNode));
557 i1h1y = *(job->i1H1ptr + (here->JFETdrainPrimeNode)) -
558 *(job->i1H1ptr + (here->JFETsourcePrimeNode));
559
560 r1hm2x = *(job->r1H2ptr + (here->JFETgateNode)) -
561 *(job->r1H2ptr + (here->JFETsourcePrimeNode));
562 i1hm2x = -(*(job->i1H2ptr + (here->JFETgateNode)) -
563 *(job->i1H2ptr + (here->JFETsourcePrimeNode)));
564
565 r1hm2y = *(job->r1H2ptr + (here->JFETdrainPrimeNode)) -
566 *(job->r1H2ptr + (here->JFETsourcePrimeNode));
567 i1hm2y = -(*(job->i1H2ptr + (here->JFETdrainPrimeNode)) -
568 *(job->i1H2ptr + (here->JFETsourcePrimeNode)));
569
570 /* loading starts here */
571 /* loading cdrain term */
572
573 temp = DFnF12(here->cdr_x2,
574 here->cdr_y2,
575 0.0,
576 here->cdr_xy,
577 0.0,
578 0.0,
579 r1h1x,
580 i1h1x,
581 r1h1y,
582 i1h1y,
583 0.0,
584 0.0,
585 r1hm2x,
586 i1hm2x,
587 r1hm2y,
588 i1hm2y,
589 0.0,
590 0.0);
591
592 itemp = DFiF12(here->cdr_x2,
593 here->cdr_y2,
594 0.0,
595 here->cdr_xy,
596 0.0,
597 0.0,
598 r1h1x,
599 i1h1x,
600 r1h1y,
601 i1h1y,
602 0.0,
603 0.0,
604 r1hm2x,
605 i1hm2x,
606 r1hm2y,
607 i1hm2y,
608 0.0,
609 0.0);
610
611 *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) -= temp;
612 *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) -= itemp;
613 *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp;
614 *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp;
615
616 /* cdrain term over */
617
618 /* loading ggs term */
619
620 temp = D1nF12(here->ggs2,
621 r1h1x,
622 i1h1x,
623 r1hm2x,
624 i1hm2x);
625
626 itemp = D1iF12(here->ggs2,
627 r1h1x,
628 i1h1x,
629 r1hm2x,
630 i1hm2x);
631
632
633 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
634 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
635 *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp;
636 *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp;
637
638 /* ggs over */
639
640 /* loading ggd term */
641
642 temp = D1nF12(here->ggd2,
643 r1h1x - r1h1y,
644 i1h1x - i1h1y,
645 r1hm2x - r1hm2y,
646 i1hm2x - i1hm2y);
647
648 itemp = D1iF12(here->ggd2,
649 r1h1x - r1h1y,
650 i1h1x - i1h1y,
651 r1hm2x - r1hm2y,
652 i1hm2x - i1hm2y);
653
654
655 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
656 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
657 *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp;
658 *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp;
659
660 /* ggd over */
661
662 /* loading capgs term */
663
664 temp = -ckt->CKTomega *
665 D1iF12(here->capgs2,
666 r1h1x,
667 i1h1x,
668 r1hm2x,
669 i1hm2x);
670
671 itemp = ckt->CKTomega *
672 D1nF12(here->capgs2,
673 r1h1x,
674 i1h1x,
675 r1hm2x,
676 i1hm2x);
677
678
679 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
680 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
681 *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp;
682 *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp;
683
684 /* capgs over */
685
686 /* loading capgd term */
687
688 temp = -ckt->CKTomega *
689 D1iF12(here->capgd2,
690 r1h1x - r1h1y,
691 i1h1x - i1h1y,
692 r1hm2x - r1hm2y,
693 i1hm2x - i1hm2y);
694
695 itemp = ckt->CKTomega *
696 D1nF12(here->capgd2,
697 r1h1x - r1h1y,
698 i1h1x - i1h1y,
699 r1hm2x - r1hm2y,
700 i1hm2x - i1hm2y);
701
702
703 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
704 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
705 *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp;
706 *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp;
707
708 /* capgd over */
709
710 /* all done */
711
712 break;
713 case D_2F1MF2:
714 /* x = vgs, y = vds */
715
716 /* getting first order (linear) Volterra kernel */
717 r1h1x = *(job->r1H1ptr + (here->JFETgateNode)) -
718 *(job->r1H1ptr + (here->JFETsourcePrimeNode));
719 i1h1x = *(job->i1H1ptr + (here->JFETgateNode)) -
720 *(job->i1H1ptr + (here->JFETsourcePrimeNode));
721
722 r1h1y = *(job->r1H1ptr + (here->JFETdrainPrimeNode)) -
723 *(job->r1H1ptr + (here->JFETsourcePrimeNode));
724 i1h1y = *(job->i1H1ptr + (here->JFETdrainPrimeNode)) -
725 *(job->i1H1ptr + (here->JFETsourcePrimeNode));
726
727 r2h11x = *(job->r2H11ptr + (here->JFETgateNode)) -
728 *(job->r2H11ptr + (here->JFETsourcePrimeNode));
729 i2h11x = *(job->i2H11ptr + (here->JFETgateNode)) -
730 *(job->i2H11ptr + (here->JFETsourcePrimeNode));
731
732 r2h11y = *(job->r2H11ptr + (here->JFETdrainPrimeNode)) -
733 *(job->r2H11ptr + (here->JFETsourcePrimeNode));
734 i2h11y = *(job->i2H11ptr + (here->JFETdrainPrimeNode)) -
735 *(job->i2H11ptr + (here->JFETsourcePrimeNode));
736
737 r1hm2x = *(job->r1H2ptr + (here->JFETgateNode)) -
738 *(job->r1H2ptr + (here->JFETsourcePrimeNode));
739 i1hm2x = -(*(job->i1H2ptr + (here->JFETgateNode)) -
740 *(job->i1H2ptr + (here->JFETsourcePrimeNode)));
741
742 r1hm2y = *(job->r1H2ptr + (here->JFETdrainPrimeNode)) -
743 *(job->r1H2ptr + (here->JFETsourcePrimeNode));
744 i1hm2y = -(*(job->i1H2ptr + (here->JFETdrainPrimeNode)) -
745 *(job->i1H2ptr + (here->JFETsourcePrimeNode)));
746
747 r2h1m2x = *(job->r2H1m2ptr + (here->JFETgateNode)) -
748 *(job->r2H1m2ptr + (here->JFETsourcePrimeNode));
749 i2h1m2x = *(job->i2H1m2ptr + (here->JFETgateNode)) -
750 *(job->i2H1m2ptr + (here->JFETsourcePrimeNode));
751
752 r2h1m2y = *(job->r2H1m2ptr + (here->JFETdrainPrimeNode)) -
753 *(job->r2H1m2ptr + (here->JFETsourcePrimeNode));
754 i2h1m2y = *(job->i2H1m2ptr + (here->JFETdrainPrimeNode))
755 - *(job->i2H1m2ptr + (here->JFETsourcePrimeNode));
756
757 /* loading starts here */
758 /* loading cdrain term */
759
760 pass.cxx = here->cdr_x2;
761 pass.cyy = here->cdr_y2;
762 pass.czz = 0.0;
763 pass.cxy = here->cdr_xy;
764 pass.cyz = 0.0;
765 pass.cxz = 0.0;
766 pass.cxxx = here->cdr_x3;
767 pass.cyyy = here->cdr_y3;
768 pass.czzz = 0.0;
769 pass.cxxy = here->cdr_x2y;
770 pass.cxxz = 0.0;
771 pass.cxyy = here->cdr_xy2;
772 pass.cyyz = 0.0;
773 pass.cxzz = 0.0;
774 pass.cyzz = 0.0;
775 pass.cxyz = 0.0;
776 pass.r1h1x = r1h1x;
777 pass.i1h1x = i1h1x;
778 pass.r1h1y = r1h1y;
779 pass.i1h1y = i1h1y;
780 pass.r1h1z = 0.0;
781 pass.i1h1z = 0.0;
782 pass.r1h2x = r1hm2x;
783 pass.i1h2x = i1hm2x;
784 pass.r1h2y = r1hm2y;
785 pass.i1h2y = i1hm2y;
786 pass.r1h2z = 0.0;
787 pass.i1h2z = 0.0;
788 pass.r2h11x = r2h11x;
789 pass.i2h11x = i2h11x;
790 pass.r2h11y = r2h11y;
791 pass.i2h11y = i2h11y;
792 pass.r2h11z = 0.0;
793 pass.i2h11z = 0.0;
794 pass.h2f1f2x = r2h1m2x;
795 pass.ih2f1f2x = i2h1m2x;
796 pass.h2f1f2y = r2h1m2y;
797 pass.ih2f1f2y = i2h1m2y;
798 pass.h2f1f2z = 0.0;
799 pass.ih2f1f2z = 0.0;
800 temp = DFn2F12(&pass);
801
802 itemp = DFi2F12(&pass);
803
804 *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) -= temp;
805 *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) -= itemp;
806 *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp;
807 *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp;
808
809 /* cdrain term over */
810
811 /* loading ggs term */
812
813 temp = D1n2F12(here->ggs2,
814 here->ggs3,
815 r1h1x,
816 i1h1x,
817 r1hm2x,
818 i1hm2x,
819 r2h11x,
820 i2h11x,
821 r2h1m2x,
822 i2h1m2x);
823
824 itemp = D1i2F12(here->ggs2,
825 here->ggs3,
826 r1h1x,
827 i1h1x,
828 r1hm2x,
829 i1hm2x,
830 r2h11x,
831 i2h11x,
832 r2h1m2x,
833 i2h1m2x);
834
835
836 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
837 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
838 *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp;
839 *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp;
840
841 /* ggs over */
842
843 /* loading ggd term */
844
845 temp = D1n2F12(here->ggd2,
846 here->ggd3,
847 r1h1x - r1h1y,
848 i1h1x - i1h1y,
849 r1hm2x - r1hm2y,
850 i1hm2x - i1hm2y,
851 r2h11x - r2h11y,
852 i2h11x - i2h11y,
853 r2h1m2x - r2h1m2y,
854 i2h1m2x - i2h1m2y);
855
856 itemp = D1i2F12(here->ggd2,
857 here->ggd3,
858 r1h1x - r1h1y,
859 i1h1x - i1h1y,
860 r1hm2x - r1hm2y,
861 i1hm2x - i1hm2y,
862 r2h11x - r2h11y,
863 i2h11x - i2h11y,
864 r2h1m2x - r2h1m2y,
865 i2h1m2x - i2h1m2y);
866
867
868
869 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
870 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
871 *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp;
872 *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp;
873
874 /* ggd over */
875
876 /* loading capgs term */
877
878 temp = -ckt->CKTomega *
879 D1i2F12(here->capgs2,
880 here->capgs3,
881 r1h1x,
882 i1h1x,
883 r1hm2x,
884 i1hm2x,
885 r2h11x,
886 i2h11x,
887 r2h1m2x,
888 i2h1m2x);
889
890 itemp = ckt->CKTomega *
891 D1n2F12(here->capgs2,
892 here->capgs3,
893 r1h1x,
894 i1h1x,
895 r1hm2x,
896 i1hm2x,
897 r2h11x,
898 i2h11x,
899 r2h1m2x,
900 i2h1m2x);
901
902
903 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
904 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
905 *(ckt->CKTrhs + (here->JFETsourcePrimeNode)) += temp;
906 *(ckt->CKTirhs + (here->JFETsourcePrimeNode)) += itemp;
907
908 /* capgs over */
909
910 /* loading capgd term */
911
912 temp = -ckt->CKTomega *
913 D1i2F12(here->capgd2,
914 here->capgd3,
915 r1h1x - r1h1y,
916 i1h1x - i1h1y,
917 r1hm2x - r1hm2y,
918 i1hm2x - i1hm2y,
919 r2h11x - r2h11y,
920 i2h11x - i2h11y,
921 r2h1m2x - r2h1m2y,
922 i2h1m2x - i2h1m2y);
923
924 itemp = ckt->CKTomega *
925 D1n2F12(here->capgd2,
926 here->capgd3,
927 r1h1x - r1h1y,
928 i1h1x - i1h1y,
929 r1hm2x - r1hm2y,
930 i1hm2x - i1hm2y,
931 r2h11x - r2h11y,
932 i2h11x - i2h11y,
933 r2h1m2x - r2h1m2y,
934 i2h1m2x - i2h1m2y);
935
936
937 *(ckt->CKTrhs + (here->JFETgateNode)) -= temp;
938 *(ckt->CKTirhs + (here->JFETgateNode)) -= itemp;
939 *(ckt->CKTrhs + (here->JFETdrainPrimeNode)) += temp;
940 *(ckt->CKTirhs + (here->JFETdrainPrimeNode)) += itemp;
941
942 /* capgd over */
943
944 /* all done */
945
946 break;
947 default:
948 ;
949 }
950 }
951 }
952 return(OK);
953 }
954 else
955 return(E_BADPARM);
956 }
957