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