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 "mesdefs.h"
9 #include "ngspice/sperror.h"
10 #include "ngspice/distodef.h"
11 #include "ngspice/suffix.h"
12
13 int
MESdisto(int mode,GENmodel * genmodel,CKTcircuit * ckt)14 MESdisto(int mode,GENmodel *genmodel, CKTcircuit *ckt)
15 /* assuming here that ckt->CKTomega has been initialised to
16 * the correct value
17 */
18 {
19 MESmodel *model = (MESmodel *) 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 MESinstance *here;
34
35 if (mode == D_SETUP)
36 return(MESdSetup(genmodel,ckt)); /* AFN: Oh what a wonderful thing!!! */
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 MES models */
43 for( ; model != NULL; model = MESnextModel(model)) {
44
45 /* loop through all the instances of the model */
46 for (here = MESinstances(model); here != NULL ;
47 here=MESnextInstance(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->MESgateNode)) -
57 *(job->r1H1ptr + (here->MESsourcePrimeNode));
58 i1h1x = *(job->i1H1ptr + (here->MESgateNode)) -
59 *(job->i1H1ptr + (here->MESsourcePrimeNode));
60
61 r1h1y = *(job->r1H1ptr + (here->MESdrainPrimeNode)) -
62 *(job->r1H1ptr + (here->MESsourcePrimeNode));
63 i1h1y = *(job->i1H1ptr + (here->MESdrainPrimeNode)) -
64 *(job->i1H1ptr + (here->MESsourcePrimeNode));
65
66
67 /* loading starts here */
68 /* loading cdrain term */
69
70 temp = DFn2F1(here->cdr_x2,
71 here->cdr_z2,
72 0.0,
73 here->cdr_xz,
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_z2,
85 0.0,
86 here->cdr_xz,
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->MESdrainPrimeNode)) -= temp;
97 *(ckt->CKTirhs + (here->MESdrainPrimeNode)) -= itemp;
98 *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
99 *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += 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->MESgateNode)) -= temp;
115 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
116 *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
117 *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += 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->MESgateNode)) -= temp;
133 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
134 *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
135 *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
136
137 /* ggd over */
138
139 /* loading qgs term */
140
141 temp = -ckt->CKTomega *
142 DFi2F1(here->qgs_x2,
143 here->qgs_y2,
144 0.0,
145 here->qgs_xy,
146 0.0,
147 0.0,
148 r1h1x,
149 i1h1x,
150 r1h1x - r1h1y,
151 i1h1x - i1h1y,
152 0.0,
153 0.0);
154
155 itemp = ckt->CKTomega*
156 DFn2F1(here->qgs_x2,
157 here->qgs_y2,
158 0.0,
159 here->qgs_xy,
160 0.0,
161 0.0,
162 r1h1x,
163 i1h1x,
164 r1h1x - r1h1y,
165 i1h1x - i1h1y,
166 0.0,
167 0.0);
168
169 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
170 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
171 *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
172 *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
173
174 /* qgs term over */
175
176 /* loading qgd term */
177
178 temp = -ckt->CKTomega *
179 DFi2F1(here->qgd_x2,
180 here->qgd_y2,
181 0.0,
182 here->qgd_xy,
183 0.0,
184 0.0,
185 r1h1x,
186 i1h1x,
187 r1h1x - r1h1y,
188 i1h1x - i1h1y,
189 0.0,
190 0.0);
191
192 itemp = ckt->CKTomega*
193 DFn2F1(here->qgd_x2,
194 here->qgd_y2,
195 0.0,
196 here->qgd_xy,
197 0.0,
198 0.0,
199 r1h1x,
200 i1h1x,
201 r1h1x - r1h1y,
202 i1h1x - i1h1y,
203 0.0,
204 0.0);
205
206 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
207 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
208 *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
209 *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
210
211 /* qgd term over */
212 /* all done */
213
214 break;
215
216 case D_THRF1:
217 /* x = vgs, y = vds */
218
219 /* getting first order (linear) Volterra kernel */
220 r1h1x = *(job->r1H1ptr + (here->MESgateNode)) -
221 *(job->r1H1ptr + (here->MESsourcePrimeNode));
222 i1h1x = *(job->i1H1ptr + (here->MESgateNode)) -
223 *(job->i1H1ptr + (here->MESsourcePrimeNode));
224
225 r1h1y = *(job->r1H1ptr + (here->MESdrainPrimeNode)) -
226 *(job->r1H1ptr + (here->MESsourcePrimeNode));
227 i1h1y = *(job->i1H1ptr + (here->MESdrainPrimeNode)) -
228 *(job->i1H1ptr + (here->MESsourcePrimeNode));
229
230 r2h11x = *(job->r2H11ptr + (here->MESgateNode)) -
231 *(job->r2H11ptr + (here->MESsourcePrimeNode));
232 i2h11x = *(job->i2H11ptr + (here->MESgateNode)) -
233 *(job->i2H11ptr + (here->MESsourcePrimeNode));
234
235 r2h11y = *(job->r2H11ptr + (here->MESdrainPrimeNode)) -
236 *(job->r2H11ptr + (here->MESsourcePrimeNode));
237 i2h11y = *(job->i2H11ptr + (here->MESdrainPrimeNode)) -
238 *(job->i2H11ptr + (here->MESsourcePrimeNode));
239
240 /* loading starts here */
241 /* loading cdrain term */
242
243 temp = DFn3F1(here->cdr_x2,
244 here->cdr_z2,
245 0.0,
246 here->cdr_xz,
247 0.0,
248 0.0,
249 here->cdr_x3,
250 here->cdr_z3,
251 0.0,
252 here->cdr_x2z,
253 0.0,
254 here->cdr_xz2,
255 0.0,
256 0.0,
257 0.0,
258 0.0,
259 r1h1x,
260 i1h1x,
261 r1h1y,
262 i1h1y,
263 0.0,
264 0.0,
265 r2h11x,
266 i2h11x,
267 r2h11y,
268 i2h11y,
269 0.0,
270 0.0);
271
272 itemp = DFi3F1(here->cdr_x2,
273 here->cdr_z2,
274 0.0,
275 here->cdr_xz,
276 0.0,
277 0.0,
278 here->cdr_x3,
279 here->cdr_z3,
280 0.0,
281 here->cdr_x2z,
282 0.0,
283 here->cdr_xz2,
284 0.0,
285 0.0,
286 0.0,
287 0.0,
288 r1h1x,
289 i1h1x,
290 r1h1y,
291 i1h1y,
292 0.0,
293 0.0,
294 r2h11x,
295 i2h11x,
296 r2h11y,
297 i2h11y,
298 0.0,
299 0.0);
300
301 *(ckt->CKTrhs + (here->MESdrainPrimeNode)) -= temp;
302 *(ckt->CKTirhs + (here->MESdrainPrimeNode)) -= itemp;
303 *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
304 *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
305
306 /* cdrain term over */
307
308 /* loading ggs term */
309
310 temp = D1n3F1(here->ggs2,
311 here->ggs3,
312 r1h1x,
313 i1h1x,
314 r2h11x,
315 i2h11x);
316
317 itemp = D1i3F1(here->ggs2,
318 here->ggs3,
319 r1h1x,
320 i1h1x,
321 r2h11x,
322 i2h11x);
323
324
325 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
326 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
327 *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
328 *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
329
330 /* ggs over */
331
332 /* loading ggd term */
333
334 temp = D1n3F1(here->ggd2,
335 here->ggd3,
336 r1h1x - r1h1y,
337 i1h1x - i1h1y,
338 r2h11x - r2h11y,
339 i2h11x - i2h11y);
340
341 itemp = D1i3F1(here->ggd2,
342 here->ggd3,
343 r1h1x - r1h1y,
344 i1h1x - i1h1y,
345 r2h11x - r2h11y,
346 i2h11x - i2h11y);
347
348
349
350 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
351 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
352 *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
353 *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
354
355 /* ggd over */
356
357 /* loading qgs term */
358
359 temp = -ckt->CKTomega*
360 DFi3F1(here->qgs_x2,
361 here->qgs_y2,
362 0.0,
363 here->qgs_xy,
364 0.0,
365 0.0,
366 here->qgs_x3,
367 here->qgs_y3,
368 0.0,
369 here->qgs_x2y,
370 0.0,
371 here->qgs_xy2,
372 0.0,
373 0.0,
374 0.0,
375 0.0,
376 r1h1x,
377 i1h1x,
378 r1h1x - r1h1y,
379 i1h1x - i1h1y,
380 0.0,
381 0.0,
382 r2h11x,
383 i2h11x,
384 r2h11x - r2h11y,
385 i2h11x - i2h11y,
386 0.0,
387 0.0);
388
389 itemp =ckt->CKTomega*
390 DFn3F1(here->qgs_x2,
391 here->qgs_y2,
392 0.0,
393 here->qgs_xy,
394 0.0,
395 0.0,
396 here->qgs_x3,
397 here->qgs_y3,
398 0.0,
399 here->qgs_x2y,
400 0.0,
401 here->qgs_xy2,
402 0.0,
403 0.0,
404 0.0,
405 0.0,
406 r1h1x,
407 i1h1x,
408 r1h1x - r1h1y,
409 i1h1x - i1h1y,
410 0.0,
411 0.0,
412 r2h11x,
413 i2h11x,
414 r2h11x - r2h11y,
415 i2h11x - i2h11y,
416 0.0,
417 0.0);
418
419 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
420 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
421 *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
422 *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
423
424 /* qgs term over */
425
426 /* loading qgd term */
427
428 temp = -ckt->CKTomega*
429 DFi3F1(here->qgd_x2,
430 here->qgd_y2,
431 0.0,
432 here->qgd_xy,
433 0.0,
434 0.0,
435 here->qgd_x3,
436 here->qgd_y3,
437 0.0,
438 here->qgd_x2y,
439 0.0,
440 here->qgd_xy2,
441 0.0,
442 0.0,
443 0.0,
444 0.0,
445 r1h1x,
446 i1h1x,
447 r1h1x - r1h1y,
448 i1h1x - i1h1y,
449 0.0,
450 0.0,
451 r2h11x,
452 i2h11x,
453 r2h11x - r2h11y,
454 i2h11x - i2h11y,
455 0.0,
456 0.0);
457
458 itemp =ckt->CKTomega*
459 DFn3F1(here->qgd_x2,
460 here->qgd_y2,
461 0.0,
462 here->qgd_xy,
463 0.0,
464 0.0,
465 here->qgd_x3,
466 here->qgd_y3,
467 0.0,
468 here->qgd_x2y,
469 0.0,
470 here->qgd_xy2,
471 0.0,
472 0.0,
473 0.0,
474 0.0,
475 r1h1x,
476 i1h1x,
477 r1h1x - r1h1y,
478 i1h1x - i1h1y,
479 0.0,
480 0.0,
481 r2h11x,
482 i2h11x,
483 r2h11x - r2h11y,
484 i2h11x - i2h11y,
485 0.0,
486 0.0);
487
488 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
489 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
490 *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
491 *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
492
493 /* qgd term over */
494 /* all done */
495
496 break;
497 case D_F1PF2:
498 /* x = vgs, y = vds */
499
500 /* getting first order (linear) Volterra transform */
501 r1h1x = *(job->r1H1ptr + (here->MESgateNode)) -
502 *(job->r1H1ptr + (here->MESsourcePrimeNode));
503 i1h1x = *(job->i1H1ptr + (here->MESgateNode)) -
504 *(job->i1H1ptr + (here->MESsourcePrimeNode));
505
506 r1h1y = *(job->r1H1ptr + (here->MESdrainPrimeNode)) -
507 *(job->r1H1ptr + (here->MESsourcePrimeNode));
508 i1h1y = *(job->i1H1ptr + (here->MESdrainPrimeNode)) -
509 *(job->i1H1ptr + (here->MESsourcePrimeNode));
510
511 r1h2x = *(job->r1H2ptr + (here->MESgateNode)) -
512 *(job->r1H2ptr + (here->MESsourcePrimeNode));
513 i1h2x = *(job->i1H2ptr + (here->MESgateNode)) -
514 *(job->i1H2ptr + (here->MESsourcePrimeNode));
515
516 r1h2y = *(job->r1H2ptr + (here->MESdrainPrimeNode)) -
517 *(job->r1H2ptr + (here->MESsourcePrimeNode));
518 i1h2y = *(job->i1H2ptr + (here->MESdrainPrimeNode)) -
519 *(job->i1H2ptr + (here->MESsourcePrimeNode));
520
521 /* loading starts here */
522 /* loading cdrain term */
523
524 temp = DFnF12(here->cdr_x2,
525 here->cdr_z2,
526 0.0,
527 here->cdr_xz,
528 0.0,
529 0.0,
530 r1h1x,
531 i1h1x,
532 r1h1y,
533 i1h1y,
534 0.0,
535 0.0,
536 r1h2x,
537 i1h2x,
538 r1h2y,
539 i1h2y,
540 0.0,
541 0.0);
542
543 itemp = DFiF12(here->cdr_x2,
544 here->cdr_z2,
545 0.0,
546 here->cdr_xz,
547 0.0,
548 0.0,
549 r1h1x,
550 i1h1x,
551 r1h1y,
552 i1h1y,
553 0.0,
554 0.0,
555 r1h2x,
556 i1h2x,
557 r1h2y,
558 i1h2y,
559 0.0,
560 0.0);
561
562 *(ckt->CKTrhs + (here->MESdrainPrimeNode)) -= temp;
563 *(ckt->CKTirhs + (here->MESdrainPrimeNode)) -= itemp;
564 *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
565 *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
566
567 /* cdrain term over */
568
569 /* loading ggs term */
570
571 temp = D1nF12(here->ggs2,
572 r1h1x,
573 i1h1x,
574 r1h2x,
575 i1h2x);
576
577 itemp = D1iF12(here->ggs2,
578 r1h1x,
579 i1h1x,
580 r1h2x,
581 i1h2x);
582
583
584 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
585 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
586 *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
587 *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
588
589 /* ggs over */
590
591 /* loading ggd term */
592
593 temp = D1nF12(here->ggd2,
594 r1h1x - r1h1y,
595 i1h1x - i1h1y,
596 r1h2x - r1h2y,
597 i1h2x - i1h2y);
598
599 itemp = D1iF12(here->ggd2,
600 r1h1x - r1h1y,
601 i1h1x - i1h1y,
602 r1h2x - r1h2y,
603 i1h2x - i1h2y);
604
605
606 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
607 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
608 *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
609 *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
610
611 /* ggd over */
612
613 /* loading qgs term */
614
615 temp = -ckt->CKTomega*
616 DFiF12(here->qgs_x2,
617 here->qgs_y2,
618 0.0,
619 here->qgs_xy,
620 0.0,
621 0.0,
622 r1h1x,
623 i1h1x,
624 r1h1x - r1h1y,
625 i1h1x - i1h1y,
626 0.0,
627 0.0,
628 r1h2x,
629 i1h2x,
630 r1h2x - r1h2y,
631 i1h2x - i1h2y,
632 0.0,
633 0.0);
634
635 itemp =ckt->CKTomega*
636 DFnF12(here->qgs_x2,
637 here->qgs_y2,
638 0.0,
639 here->qgs_xy,
640 0.0,
641 0.0,
642 r1h1x,
643 i1h1x,
644 r1h1x - r1h1y,
645 i1h1x - i1h1y,
646 0.0,
647 0.0,
648 r1h2x,
649 i1h2x,
650 r1h2x - r1h2y,
651 i1h2x - i1h2y,
652 0.0,
653 0.0);
654
655 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
656 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
657 *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
658 *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
659
660 /* qgs term over */
661
662 /* loading qgd term */
663
664 temp = -ckt->CKTomega*
665 DFiF12(here->qgd_x2,
666 here->qgd_y2,
667 0.0,
668 here->qgd_xy,
669 0.0,
670 0.0,
671 r1h1x,
672 i1h1x,
673 r1h1x - r1h1y,
674 i1h1x - i1h1y,
675 0.0,
676 0.0,
677 r1h2x,
678 i1h2x,
679 r1h2x - r1h2y,
680 i1h2x - i1h2y,
681 0.0,
682 0.0);
683
684 itemp =ckt->CKTomega*
685 DFnF12(here->qgd_x2,
686 here->qgd_y2,
687 0.0,
688 here->qgd_xy,
689 0.0,
690 0.0,
691 r1h1x,
692 i1h1x,
693 r1h1x - r1h1y,
694 i1h1x - i1h1y,
695 0.0,
696 0.0,
697 r1h2x,
698 i1h2x,
699 r1h2x - r1h2y,
700 i1h2x - i1h2y,
701 0.0,
702 0.0);
703
704 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
705 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
706 *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
707 *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
708
709 /* qgd term over */
710 /* all done */
711
712 break;
713 case D_F1MF2:
714 /* x = vgs, y = vds */
715
716 /* getting first order (linear) Volterra kernel */
717 r1h1x = *(job->r1H1ptr + (here->MESgateNode)) -
718 *(job->r1H1ptr + (here->MESsourcePrimeNode));
719 i1h1x = *(job->i1H1ptr + (here->MESgateNode)) -
720 *(job->i1H1ptr + (here->MESsourcePrimeNode));
721
722 r1h1y = *(job->r1H1ptr + (here->MESdrainPrimeNode)) -
723 *(job->r1H1ptr + (here->MESsourcePrimeNode));
724 i1h1y = *(job->i1H1ptr + (here->MESdrainPrimeNode)) -
725 *(job->i1H1ptr + (here->MESsourcePrimeNode));
726
727 r1hm2x = *(job->r1H2ptr + (here->MESgateNode)) -
728 *(job->r1H2ptr + (here->MESsourcePrimeNode));
729 i1hm2x = -(*(job->i1H2ptr + (here->MESgateNode)) -
730 *(job->i1H2ptr + (here->MESsourcePrimeNode)));
731
732 r1hm2y = *(job->r1H2ptr + (here->MESdrainPrimeNode)) -
733 *(job->r1H2ptr + (here->MESsourcePrimeNode));
734 i1hm2y = -(*(job->i1H2ptr + (here->MESdrainPrimeNode)) -
735 *(job->i1H2ptr + (here->MESsourcePrimeNode)));
736
737 /* loading starts here */
738 /* loading cdrain term */
739
740 temp = DFnF12(here->cdr_x2,
741 here->cdr_z2,
742 0.0,
743 here->cdr_xz,
744 0.0,
745 0.0,
746 r1h1x,
747 i1h1x,
748 r1h1y,
749 i1h1y,
750 0.0,
751 0.0,
752 r1hm2x,
753 i1hm2x,
754 r1hm2y,
755 i1hm2y,
756 0.0,
757 0.0);
758
759 itemp = DFiF12(here->cdr_x2,
760 here->cdr_z2,
761 0.0,
762 here->cdr_xz,
763 0.0,
764 0.0,
765 r1h1x,
766 i1h1x,
767 r1h1y,
768 i1h1y,
769 0.0,
770 0.0,
771 r1hm2x,
772 i1hm2x,
773 r1hm2y,
774 i1hm2y,
775 0.0,
776 0.0);
777
778 *(ckt->CKTrhs + (here->MESdrainPrimeNode)) -= temp;
779 *(ckt->CKTirhs + (here->MESdrainPrimeNode)) -= itemp;
780 *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
781 *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
782
783 /* cdrain term over */
784
785 /* loading ggs term */
786
787 temp = D1nF12(here->ggs2,
788 r1h1x,
789 i1h1x,
790 r1hm2x,
791 i1hm2x);
792
793 itemp = D1iF12(here->ggs2,
794 r1h1x,
795 i1h1x,
796 r1hm2x,
797 i1hm2x);
798
799
800 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
801 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
802 *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
803 *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
804
805 /* ggs over */
806
807 /* loading ggd term */
808
809 temp = D1nF12(here->ggd2,
810 r1h1x - r1h1y,
811 i1h1x - i1h1y,
812 r1hm2x - r1hm2y,
813 i1hm2x - i1hm2y);
814
815 itemp = D1iF12(here->ggd2,
816 r1h1x - r1h1y,
817 i1h1x - i1h1y,
818 r1hm2x - r1hm2y,
819 i1hm2x - i1hm2y);
820
821
822 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
823 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
824 *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
825 *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
826
827 /* ggd over */
828
829 /* loading qgs term */
830
831 temp = -ckt->CKTomega*
832 DFiF12(here->qgs_x2,
833 here->qgs_y2,
834 0.0,
835 here->qgs_xy,
836 0.0,
837 0.0,
838 r1h1x,
839 i1h1x,
840 r1h1x - r1h1y,
841 i1h1x - i1h1y,
842 0.0,
843 0.0,
844 r1hm2x,
845 i1hm2x,
846 r1hm2x - r1hm2y,
847 i1hm2x - i1hm2y,
848 0.0,
849 0.0);
850
851 itemp = ckt->CKTomega*
852 DFnF12(here->qgs_x2,
853 here->qgs_y2,
854 0.0,
855 here->qgs_xy,
856 0.0,
857 0.0,
858 r1h1x,
859 i1h1x,
860 r1h1x - r1h1y,
861 i1h1x - i1h1y,
862 0.0,
863 0.0,
864 r1hm2x,
865 i1hm2x,
866 r1hm2x - r1hm2y,
867 i1hm2x - i1hm2y,
868 0.0,
869 0.0);
870
871 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
872 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
873 *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
874 *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
875
876 /* qgs term over */
877
878 /* loading qgd term */
879
880 temp = -ckt->CKTomega*
881 DFiF12(here->qgd_x2,
882 here->qgd_y2,
883 0.0,
884 here->qgd_xy,
885 0.0,
886 0.0,
887 r1h1x,
888 i1h1x,
889 r1h1x - r1h1y,
890 i1h1x - i1h1y,
891 0.0,
892 0.0,
893 r1hm2x,
894 i1hm2x,
895 r1hm2x - r1hm2y,
896 i1hm2x - i1hm2y,
897 0.0,
898 0.0);
899
900 itemp = ckt->CKTomega*
901 DFnF12(here->qgd_x2,
902 here->qgd_y2,
903 0.0,
904 here->qgd_xy,
905 0.0,
906 0.0,
907 r1h1x,
908 i1h1x,
909 r1h1x - r1h1y,
910 i1h1x - i1h1y,
911 0.0,
912 0.0,
913 r1hm2x,
914 i1hm2x,
915 r1hm2x - r1hm2y,
916 i1hm2x - i1hm2y,
917 0.0,
918 0.0);
919
920 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
921 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
922 *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
923 *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
924
925 /* qgd term over */
926 /* all done */
927
928 break;
929 case D_2F1MF2:
930 /* x = vgs, y = vds */
931
932 /* getting first order (linear) Volterra kernel */
933 r1h1x = *(job->r1H1ptr + (here->MESgateNode)) -
934 *(job->r1H1ptr + (here->MESsourcePrimeNode));
935 i1h1x = *(job->i1H1ptr + (here->MESgateNode)) -
936 *(job->i1H1ptr + (here->MESsourcePrimeNode));
937
938 r1h1y = *(job->r1H1ptr + (here->MESdrainPrimeNode)) -
939 *(job->r1H1ptr + (here->MESsourcePrimeNode));
940 i1h1y = *(job->i1H1ptr + (here->MESdrainPrimeNode)) -
941 *(job->i1H1ptr + (here->MESsourcePrimeNode));
942
943 r2h11x = *(job->r2H11ptr + (here->MESgateNode)) -
944 *(job->r2H11ptr + (here->MESsourcePrimeNode));
945 i2h11x = *(job->i2H11ptr + (here->MESgateNode)) -
946 *(job->i2H11ptr + (here->MESsourcePrimeNode));
947
948 r2h11y = *(job->r2H11ptr + (here->MESdrainPrimeNode)) -
949 *(job->r2H11ptr + (here->MESsourcePrimeNode));
950 i2h11y = *(job->i2H11ptr + (here->MESdrainPrimeNode)) -
951 *(job->i2H11ptr + (here->MESsourcePrimeNode));
952
953 r1hm2x = *(job->r1H2ptr + (here->MESgateNode)) -
954 *(job->r1H2ptr + (here->MESsourcePrimeNode));
955 i1hm2x = -(*(job->i1H2ptr + (here->MESgateNode)) -
956 *(job->i1H2ptr + (here->MESsourcePrimeNode)));
957
958 r1hm2y = *(job->r1H2ptr + (here->MESdrainPrimeNode)) -
959 *(job->r1H2ptr + (here->MESsourcePrimeNode));
960 i1hm2y = -(*(job->i1H2ptr + (here->MESdrainPrimeNode)) -
961 *(job->i1H2ptr + (here->MESsourcePrimeNode)));
962
963 r2h1m2x = *(job->r2H1m2ptr + (here->MESgateNode)) -
964 *(job->r2H1m2ptr + (here->MESsourcePrimeNode));
965 i2h1m2x = *(job->i2H1m2ptr + (here->MESgateNode)) -
966 *(job->i2H1m2ptr + (here->MESsourcePrimeNode));
967
968 r2h1m2y = *(job->r2H1m2ptr + (here->MESdrainPrimeNode)) -
969 *(job->r2H1m2ptr + (here->MESsourcePrimeNode));
970 i2h1m2y = *(job->i2H1m2ptr + (here->MESdrainPrimeNode))
971 - *(job->i2H1m2ptr + (here->MESsourcePrimeNode));
972
973 /* loading starts here */
974 /* loading cdrain term */
975
976 pass.cxx = here->cdr_x2;
977 pass.cyy = here->cdr_z2;
978 pass.czz = 0.0;
979 pass.cxy = here->cdr_xz;
980 pass.cyz = 0.0;
981 pass.cxz = 0.0;
982 pass.cxxx = here->cdr_x3;
983 pass.cyyy = here->cdr_z3;
984 pass.czzz = 0.0;
985 pass.cxxy = here->cdr_x2z;
986 pass.cxxz = 0.0;
987 pass.cxyy = here->cdr_xz2;
988 pass.cyyz = 0.0;
989 pass.cxzz = 0.0;
990 pass.cyzz = 0.0;
991 pass.cxyz = 0.0;
992 pass.r1h1x = r1h1x;
993 pass.i1h1x = i1h1x;
994 pass.r1h1y = r1h1y;
995 pass.i1h1y = i1h1y;
996 pass.r1h1z = 0.0;
997 pass.i1h1z = 0.0;
998 pass.r1h2x = r1hm2x;
999 pass.i1h2x = i1hm2x;
1000 pass.r1h2y = r1hm2y;
1001 pass.i1h2y = i1hm2y;
1002 pass.r1h2z = 0.0;
1003 pass.i1h2z = 0.0;
1004 pass.r2h11x = r2h11x;
1005 pass.i2h11x = i2h11x;
1006 pass.r2h11y = r2h11y;
1007 pass.i2h11y = i2h11y;
1008 pass.r2h11z = 0.0;
1009 pass.i2h11z = 0.0;
1010 pass.h2f1f2x = r2h1m2x;
1011 pass.ih2f1f2x = i2h1m2x;
1012 pass.h2f1f2y = r2h1m2y;
1013 pass.ih2f1f2y = i2h1m2y;
1014 pass.h2f1f2z = 0.0;
1015 pass.ih2f1f2z = 0.0;
1016 temp = DFn2F12(&pass);
1017
1018 itemp = DFi2F12(&pass);
1019
1020 *(ckt->CKTrhs + (here->MESdrainPrimeNode)) -= temp;
1021 *(ckt->CKTirhs + (here->MESdrainPrimeNode)) -= itemp;
1022 *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
1023 *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
1024
1025 /* cdrain term over */
1026
1027 /* loading ggs term */
1028
1029 temp = D1n2F12(here->ggs2,
1030 here->ggs3,
1031 r1h1x,
1032 i1h1x,
1033 r1hm2x,
1034 i1hm2x,
1035 r2h11x,
1036 i2h11x,
1037 r2h1m2x,
1038 i2h1m2x);
1039
1040 itemp = D1i2F12(here->ggs2,
1041 here->ggs3,
1042 r1h1x,
1043 i1h1x,
1044 r1hm2x,
1045 i1hm2x,
1046 r2h11x,
1047 i2h11x,
1048 r2h1m2x,
1049 i2h1m2x);
1050
1051
1052 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
1053 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
1054 *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
1055 *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
1056
1057 /* ggs over */
1058
1059 /* loading ggd term */
1060
1061 temp = D1n2F12(here->ggd2,
1062 here->ggd3,
1063 r1h1x - r1h1y,
1064 i1h1x - i1h1y,
1065 r1hm2x - r1hm2y,
1066 i1hm2x - i1hm2y,
1067 r2h11x - r2h11y,
1068 i2h11x - i2h11y,
1069 r2h1m2x - r2h1m2y,
1070 i2h1m2x - i2h1m2y);
1071
1072 itemp = D1i2F12(here->ggd2,
1073 here->ggd3,
1074 r1h1x - r1h1y,
1075 i1h1x - i1h1y,
1076 r1hm2x - r1hm2y,
1077 i1hm2x - i1hm2y,
1078 r2h11x - r2h11y,
1079 i2h11x - i2h11y,
1080 r2h1m2x - r2h1m2y,
1081 i2h1m2x - i2h1m2y);
1082
1083
1084
1085 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
1086 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
1087 *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
1088 *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
1089
1090 /* ggd over */
1091
1092 /* loading qgs term */
1093
1094 pass.cxx = here->qgs_x2;
1095 pass.cyy = here->qgs_y2;
1096 pass.czz = 0.0;
1097 pass.cxy = here->qgs_xy;
1098 pass.cyz = 0.0;
1099 pass.cxz = 0.0;
1100 pass.cxxx = here->qgs_x3;
1101 pass.cyyy = here->qgs_y3;
1102 pass.czzz = 0.0;
1103 pass.cxxy = here->qgs_x2y;
1104 pass.cxxz = 0.0;
1105 pass.cxyy = here->qgs_xy2;
1106 pass.cyyz = 0.0;
1107 pass.cxzz = 0.0;
1108 pass.cyzz = 0.0;
1109 pass.cxyz = 0.0;
1110 pass.r1h1x = r1h1x;
1111 pass.i1h1x = i1h1x;
1112 pass.r1h1y = r1h1x - r1h1y;
1113 pass.i1h1y = i1h1x - i1h1y;
1114 pass.r1h1z = 0.0;
1115 pass.i1h1z = 0.0;
1116 pass.r1h2x = r1hm2x;
1117 pass.i1h2x = i1hm2x;
1118 pass.r1h2y = r1hm2x - r1hm2y;
1119 pass.i1h2y = i1hm2x - i1hm2y;
1120 pass.r1h2z = 0.0;
1121 pass.i1h2z = 0.0;
1122 pass.r2h11x = r2h11x;
1123 pass.i2h11x = i2h11x;
1124 pass.r2h11y = r2h11x - r2h11y;
1125 pass.i2h11y = i2h11x - i2h11y;
1126 pass.r2h11z = 0.0;
1127 pass.i2h11z = 0.0;
1128 pass.h2f1f2x = r2h1m2x;
1129 pass.ih2f1f2x = i2h1m2x;
1130 pass.h2f1f2y = r2h1m2x - r2h1m2y;
1131 pass.ih2f1f2y = i2h1m2x - i2h1m2y;
1132 pass.h2f1f2z = 0.0;
1133 pass.ih2f1f2z = 0.0;
1134 temp = -ckt->CKTomega*DFi2F12(&pass);
1135
1136 itemp = ckt->CKTomega*DFn2F12(&pass);
1137
1138 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
1139 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
1140 *(ckt->CKTrhs + (here->MESsourcePrimeNode)) += temp;
1141 *(ckt->CKTirhs + (here->MESsourcePrimeNode)) += itemp;
1142
1143 /* qgs term over */
1144
1145 /* loading qgd term */
1146
1147 pass.cxx = here->qgd_x2;
1148 pass.cyy = here->qgd_y2;
1149 pass.czz = 0.0;
1150 pass.cxy = here->qgd_xy;
1151 pass.cyz = 0.0;
1152 pass.cxz = 0.0;
1153 pass.cxxx = here->qgd_x3;
1154 pass.cyyy = here->qgd_y3;
1155 pass.czzz = 0.0;
1156 pass.cxxy = here->qgd_x2y;
1157 pass.cxxz = 0.0;
1158 pass.cxyy = here->qgd_xy2;
1159 pass.cyyz = 0.0;
1160 pass.cxzz = 0.0;
1161 pass.cyzz = 0.0;
1162 pass.cxyz = 0.0;
1163 pass.r1h1x = r1h1x;
1164 pass.i1h1x = i1h1x;
1165 pass.r1h1y = r1h1x - r1h1y;
1166 pass.i1h1y = i1h1x - i1h1y;
1167 pass.r1h1z = 0.0;
1168 pass.i1h1z = 0.0;
1169 pass.r1h2x = r1hm2x;
1170 pass.i1h2x = i1hm2x;
1171 pass.r1h2y = r1hm2x - r1hm2y;
1172 pass.i1h2y = i1hm2x - i1hm2y;
1173 pass.r1h2z = 0.0;
1174 pass.i1h2z = 0.0;
1175 pass.r2h11x = r2h11x;
1176 pass.i2h11x = i2h11x;
1177 pass.r2h11y = r2h11x - r2h11y;
1178 pass.i2h11y = i2h11x - i2h11y;
1179 pass.r2h11z = 0.0;
1180 pass.i2h11z = 0.0;
1181 pass.h2f1f2x = r2h1m2x;
1182 pass.ih2f1f2x = i2h1m2x;
1183 pass.h2f1f2y = r2h1m2x - r2h1m2y;
1184 pass.ih2f1f2y = i2h1m2x - i2h1m2y;
1185 pass.h2f1f2z = 0.0;
1186 pass.ih2f1f2z = 0.0;
1187 temp = -ckt->CKTomega*DFi2F12(&pass);
1188
1189 itemp = ckt->CKTomega*DFn2F12(&pass);
1190
1191 *(ckt->CKTrhs + (here->MESgateNode)) -= temp;
1192 *(ckt->CKTirhs + (here->MESgateNode)) -= itemp;
1193 *(ckt->CKTrhs + (here->MESdrainPrimeNode)) += temp;
1194 *(ckt->CKTirhs + (here->MESdrainPrimeNode)) += itemp;
1195
1196 /* qgd term over */
1197 /* all done */
1198
1199 break;
1200 default:
1201 ;
1202 }
1203 }
1204 }
1205 return(OK);
1206 }
1207 else
1208 return(E_BADPARM);
1209 }
1210