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: 1988 Jaijeet S Roychowdhury
5          1993 Stephen R. Whiteley
6 ****************************************************************************/
7 
8 #include "spice.h"
9 #include <math.h>
10 #include <stdio.h>
11 #include "bsim1def.h"
12 #include "distodef.h"
13 #include "sperror.h"
14 #include "util.h"
15 #include "distoext.h"
16 
17 int
B1disto(mode,genmodel,ckt)18 B1disto(mode,genmodel,ckt)
19  GENmodel *genmodel;
20  register CKTcircuit *ckt;
21  int mode;
22 
23 /* assuming here that ckt->CKTomega has been initialised to
24  * the correct value
25  */
26 {
27  B1model *model = (B1model *) genmodel;
28  DISTOAN* job = (DISTOAN*) ckt->CKTcurJob;
29  double td;
30  DpassStr pass;
31  double r1h1x,i1h1x;
32  double r1h1y,i1h1y;
33  double r1h1z, i1h1z;
34  double r1h2x, i1h2x;
35  double r1h2y, i1h2y;
36  double r1h2z, i1h2z;
37  double r1hm2x,i1hm2x;
38  double r1hm2y,i1hm2y;
39  double r1hm2z, i1hm2z;
40  double r2h11x,i2h11x;
41  double r2h11y,i2h11y;
42  double r2h11z, i2h11z;
43  double r2h1m2x,i2h1m2x;
44  double r2h1m2y,i2h1m2y;
45  double r2h1m2z, i2h1m2z;
46  double temp, itemp;
47  register B1instance *here;
48 
49 if (mode == D_SETUP)
50  return(B1dSetup(model,ckt));
51 
52 if ((mode == D_TWOF1) || (mode == D_THRF1) ||
53  (mode == D_F1PF2) || (mode == D_F1MF2) ||
54  (mode == D_2F1MF2)) {
55 
56  /* loop through all the B1 models */
57 for( ; model != NULL; model = model->B1nextModel ) {
58 
59   /* loop through all the instances of the model */
60   for (here = model->B1instances; here != NULL ;
61  here=here->B1nextInstance) {
62 
63 
64 
65     /* loading starts here */
66 
67     switch (mode) {
68     case D_TWOF1:
69       /* from now on, in the 3-var case, x=vgs,y=vbs,z=vds */
70 
71       {
72         /* draincurrent term */
73         r1h1x = *(job->r1H1ptr + here->B1gNode) -
74             *(job->r1H1ptr + here->B1sNodePrime);
75         i1h1x = *(job->i1H1ptr + here->B1gNode) -
76             *(job->i1H1ptr + here->B1sNodePrime);
77 
78         r1h1y = *(job->r1H1ptr + here->B1bNode) -
79             *(job->r1H1ptr + here->B1sNodePrime);
80         i1h1y = *(job->i1H1ptr + here->B1bNode) -
81             *(job->i1H1ptr + here->B1sNodePrime);
82 
83         r1h1z = *(job->r1H1ptr + here->B1dNodePrime) -
84             *(job->r1H1ptr + here->B1sNodePrime);
85 
86         i1h1z = *(job->i1H1ptr + here->B1dNodePrime) -
87             *(job->i1H1ptr + here->B1sNodePrime);
88 
89         /* draincurrent is a function of vgs,vbs,and vds;
90          * have got their linear kernels; now to call
91          * load functions
92          */
93 
94          temp = DFn2F1(here->DrC_x2,
95          here->DrC_y2,
96          here->DrC_z2,
97          here->DrC_xy,
98          here->DrC_yz,
99          here->DrC_xz,
100          r1h1x,
101          i1h1x,
102          r1h1y,
103          i1h1y,
104          r1h1z,
105          i1h1z);
106 
107          itemp = DFi2F1(here->DrC_x2,
108          here->DrC_y2,
109          here->DrC_z2,
110          here->DrC_xy,
111          here->DrC_yz,
112          here->DrC_xz,
113          r1h1x,
114          i1h1x,
115          r1h1y,
116          i1h1y,
117          r1h1z,
118          i1h1z);
119 
120          *(ckt->CKTrhs + here->B1dNodePrime) -= temp;
121          *(ckt->CKTirhs + here->B1dNodePrime) -= itemp;
122 
123          *(ckt->CKTrhs + here->B1sNodePrime) += temp;
124          *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
125 
126          /* draincurrent term loading over */
127 
128 
129 
130         /* loading qg term */
131 
132         /* kernels for vgs,vbs and vds already set up */
133 
134         temp = -ckt->CKTomega * DFi2F1(here->qg_x2,
135         here->qg_y2,
136         here->qg_z2,
137         here->qg_xy,
138         here->qg_yz,
139         here->qg_xz,
140         r1h1x,
141         i1h1x,
142         r1h1y,
143         i1h1y,
144         r1h1z,
145         i1h1z);
146 
147         itemp = ckt->CKTomega * DFn2F1(here->qg_x2,
148         here->qg_y2,
149         here->qg_z2,
150         here->qg_xy,
151         here->qg_yz,
152         here->qg_xz,
153         r1h1x,
154         i1h1x,
155         r1h1y,
156         i1h1y,
157         r1h1z,
158         i1h1z);
159 
160         *(ckt->CKTrhs + here->B1gNode) -= temp;
161         *(ckt->CKTirhs + here->B1gNode) -= itemp;
162 
163         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
164         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
165 
166         /* qg term over */
167 
168         /* loading qb term */
169 
170         /* kernels for vgs,vbs and vds already set up */
171 
172         temp = -ckt->CKTomega * DFi2F1(here->qb_x2,
173         here->qb_y2,
174         here->qb_z2,
175         here->qb_xy,
176         here->qb_yz,
177         here->qb_xz,
178         r1h1x,
179         i1h1x,
180         r1h1y,
181         i1h1y,
182         r1h1z,
183         i1h1z);
184 
185         itemp = ckt->CKTomega * DFn2F1(here->qb_x2,
186         here->qb_y2,
187         here->qb_z2,
188         here->qb_xy,
189         here->qb_yz,
190         here->qb_xz,
191         r1h1x,
192         i1h1x,
193         r1h1y,
194         i1h1y,
195         r1h1z,
196         i1h1z);
197 
198         *(ckt->CKTrhs + here->B1bNode) -= temp;
199         *(ckt->CKTirhs + here->B1bNode) -= itemp;
200 
201         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
202         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
203 
204         /* qb term over */
205 
206         /* loading qd term */
207 
208         /* kernels for vgs,vbs and vds already set up */
209 
210         temp = -ckt->CKTomega * DFi2F1(here->qd_x2,
211         here->qd_y2,
212         here->qd_z2,
213         here->qd_xy,
214         here->qd_yz,
215         here->qd_xz,
216         r1h1x,
217         i1h1x,
218         r1h1y,
219         i1h1y,
220         r1h1z,
221         i1h1z);
222 
223         itemp = ckt->CKTomega * DFn2F1(here->qd_x2,
224         here->qd_y2,
225         here->qd_z2,
226         here->qd_xy,
227         here->qd_yz,
228         here->qd_xz,
229         r1h1x,
230         i1h1x,
231         r1h1y,
232         i1h1y,
233         r1h1z,
234         i1h1z);
235 
236         *(ckt->CKTrhs + here->B1dNodePrime) -= temp;
237         *(ckt->CKTirhs + here->B1dNodePrime) -= itemp;
238 
239         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
240         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
241 
242         /* qd term over */
243 
244         /* loading here->B1gbs term */
245 
246         r1h1x = *(job->r1H1ptr + here->B1bNode) -
247             *(job->r1H1ptr + here->B1sNodePrime);
248         i1h1x = *(job->i1H1ptr + here->B1bNode) -
249             *(job->i1H1ptr + here->B1sNodePrime);
250 
251         /* now r1h1x = vbs */
252 
253         temp = D1n2F1(here->gbs2,
254         r1h1x,
255         i1h1x);
256 
257         itemp = D1i2F1(here->gbs2,
258         r1h1x,
259         i1h1x);
260 
261         *(ckt->CKTrhs + here->B1bNode) -= temp;
262         *(ckt->CKTirhs + here->B1bNode) -= itemp;
263 
264         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
265         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
266 
267         /* here->B1gbs term over */
268 
269         /* loading here->B1gbd term */
270 
271         r1h1x = *(job->r1H1ptr + here->B1bNode) -
272             *(job->r1H1ptr + here->B1dNodePrime);
273         i1h1x = *(job->i1H1ptr + here->B1bNode) -
274             *(job->i1H1ptr + here->B1dNodePrime);
275 
276         /* now r1h1x = vbd */
277 
278         temp = D1n2F1(here->gbd2,
279         r1h1x,
280         i1h1x);
281 
282         itemp = D1i2F1(here->gbd2,
283         r1h1x,
284         i1h1x);
285 
286         *(ckt->CKTrhs + here->B1gNode) -= temp;
287         *(ckt->CKTirhs + here->B1gNode) -= itemp;
288 
289         *(ckt->CKTrhs + here->B1dNodePrime) += temp;
290         *(ckt->CKTirhs + here->B1dNodePrime) += itemp;
291 
292         /* here->B1gbd term over */
293 
294         /* all done */
295       }
296 
297       break;
298 
299     case D_THRF1:
300       /* from now on, in the 3-var case, x=vgs,y=vbs,z=vds */
301 
302       {
303         /* draincurrent term */
304         r1h1x = *(job->r1H1ptr + here->B1gNode) -
305             *(job->r1H1ptr + here->B1sNodePrime);
306         i1h1x = *(job->i1H1ptr + here->B1gNode) -
307             *(job->i1H1ptr + here->B1sNodePrime);
308 
309         r1h1y = *(job->r1H1ptr + here->B1bNode) -
310             *(job->r1H1ptr + here->B1sNodePrime);
311         i1h1y = *(job->i1H1ptr + here->B1bNode) -
312             *(job->i1H1ptr + here->B1sNodePrime);
313 
314         r1h1z = *(job->r1H1ptr + here->B1dNodePrime) -
315             *(job->r1H1ptr + here->B1sNodePrime);
316 
317         i1h1z = *(job->i1H1ptr + here->B1dNodePrime) -
318             *(job->i1H1ptr + here->B1sNodePrime);
319 
320         r2h11x = *(job->r2H11ptr + here->B1gNode) -
321             *(job->r2H11ptr + here->B1sNodePrime);
322         i2h11x = *(job->i2H11ptr + here->B1gNode) -
323             *(job->i2H11ptr + here->B1sNodePrime);
324 
325         r2h11y = *(job->r2H11ptr + here->B1bNode) -
326             *(job->r2H11ptr + here->B1sNodePrime);
327         i2h11y = *(job->i2H11ptr + here->B1bNode) -
328             *(job->i2H11ptr + here->B1sNodePrime);
329 
330         r2h11z = *(job->r2H11ptr + here->B1dNodePrime) -
331             *(job->r2H11ptr + here->B1sNodePrime);
332 
333         i2h11z = *(job->i2H11ptr + here->B1dNodePrime) -
334             *(job->i2H11ptr + here->B1sNodePrime);
335 
336         /* draincurrent is a function of vgs,vbs,and vds;
337          * have got their linear kernels; now to call
338          * load functions
339          */
340 
341          temp = DFn3F1(here->DrC_x2,
342          here->DrC_y2,
343          here->DrC_z2,
344          here->DrC_xy,
345          here->DrC_yz,
346          here->DrC_xz,
347          here->DrC_x3,
348          here->DrC_y3,
349          here->DrC_z3,
350          here->DrC_x2y,
351          here->DrC_x2z,
352          here->DrC_xy2,
353          here->DrC_y2z,
354          here->DrC_xz2,
355          here->DrC_yz2,
356          here->DrC_xyz,
357          r1h1x,
358          i1h1x,
359          r1h1y,
360          i1h1y,
361          r1h1z,
362          i1h1z,
363          r2h11x,
364          i2h11x,
365          r2h11y,
366          i2h11y,
367          r2h11z,
368          i2h11z);
369 
370          itemp = DFi3F1(here->DrC_x2,
371          here->DrC_y2,
372          here->DrC_z2,
373          here->DrC_xy,
374          here->DrC_yz,
375          here->DrC_xz,
376          here->DrC_x3,
377          here->DrC_y3,
378          here->DrC_z3,
379          here->DrC_x2y,
380          here->DrC_x2z,
381          here->DrC_xy2,
382          here->DrC_y2z,
383          here->DrC_xz2,
384          here->DrC_yz2,
385          here->DrC_xyz,
386          r1h1x,
387          i1h1x,
388          r1h1y,
389          i1h1y,
390          r1h1z,
391          i1h1z,
392          r2h11x,
393          i2h11x,
394          r2h11y,
395          i2h11y,
396          r2h11z,
397          i2h11z);
398 
399          *(ckt->CKTrhs + here->B1dNodePrime) -= temp;
400          *(ckt->CKTirhs + here->B1dNodePrime) -= itemp;
401 
402          *(ckt->CKTrhs + here->B1sNodePrime) += temp;
403          *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
404 
405          /* draincurrent term loading over */
406 
407 
408 
409         /* loading qg term */
410 
411         /* kernels for vgs,vbs and vds already set up */
412 
413         temp = -ckt->CKTomega * DFi3F1(here->qg_x2,
414         here->qg_y2,
415         here->qg_z2,
416         here->qg_xy,
417         here->qg_yz,
418         here->qg_xz,
419         here->qg_x3,
420         here->qg_y3,
421         here->qg_z3,
422         here->qg_x2y,
423         here->qg_x2z,
424         here->qg_xy2,
425         here->qg_y2z,
426         here->qg_xz2,
427         here->qg_yz2,
428         here->qg_xyz,
429         r1h1x,
430         i1h1x,
431         r1h1y,
432         i1h1y,
433         r1h1z,
434         i1h1z,
435         r2h11x,
436         i2h11x,
437         r2h11y,
438         i2h11y,
439         r2h11z,
440         i2h11z);
441 
442         itemp = ckt->CKTomega * DFn3F1(here->qg_x2,
443         here->qg_y2,
444         here->qg_z2,
445         here->qg_xy,
446         here->qg_yz,
447         here->qg_xz,
448         here->qg_x3,
449         here->qg_y3,
450         here->qg_z3,
451         here->qg_x2y,
452         here->qg_x2z,
453         here->qg_xy2,
454         here->qg_y2z,
455         here->qg_xz2,
456         here->qg_yz2,
457         here->qg_xyz,
458         r1h1x,
459         i1h1x,
460         r1h1y,
461         i1h1y,
462         r1h1z,
463         i1h1z,
464         r2h11x,
465         i2h11x,
466         r2h11y,
467         i2h11y,
468         r2h11z,
469         i2h11z);
470 
471         *(ckt->CKTrhs + here->B1gNode) -= temp;
472         *(ckt->CKTirhs + here->B1gNode) -= itemp;
473 
474         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
475         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
476 
477         /* qg term over */
478 
479         /* loading qb term */
480 
481         /* kernels for vgs,vbs and vds already set up */
482 
483         temp = -ckt->CKTomega * DFi3F1(here->qb_x2,
484         here->qb_y2,
485         here->qb_z2,
486         here->qb_xy,
487         here->qb_yz,
488         here->qb_xz,
489         here->qb_x3,
490         here->qb_y3,
491         here->qb_z3,
492         here->qb_x2y,
493         here->qb_x2z,
494         here->qb_xy2,
495         here->qb_y2z,
496         here->qb_xz2,
497         here->qb_yz2,
498         here->qb_xyz,
499         r1h1x,
500         i1h1x,
501         r1h1y,
502         i1h1y,
503         r1h1z,
504         i1h1z,
505         r2h11x,
506         i2h11x,
507         r2h11y,
508         i2h11y,
509         r2h11z,
510         i2h11z);
511 
512         itemp = ckt->CKTomega * DFn3F1(here->qb_x2,
513         here->qb_y2,
514         here->qb_z2,
515         here->qb_xy,
516         here->qb_yz,
517         here->qb_xz,
518         here->qb_x3,
519         here->qb_y3,
520         here->qb_z3,
521         here->qb_x2y,
522         here->qb_x2z,
523         here->qb_xy2,
524         here->qb_y2z,
525         here->qb_xz2,
526         here->qb_yz2,
527         here->qb_xyz,
528         r1h1x,
529         i1h1x,
530         r1h1y,
531         i1h1y,
532         r1h1z,
533         i1h1z,
534         r2h11x,
535         i2h11x,
536         r2h11y,
537         i2h11y,
538         r2h11z,
539         i2h11z);
540 
541         *(ckt->CKTrhs + here->B1bNode) -= temp;
542         *(ckt->CKTirhs + here->B1bNode) -= itemp;
543 
544         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
545         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
546 
547         /* qb term over */
548 
549         /* loading qd term */
550 
551         /* kernels for vgs,vbs and vds already set up */
552 
553         temp = -ckt->CKTomega * DFi3F1(here->qd_x2,
554         here->qd_y2,
555         here->qd_z2,
556         here->qd_xy,
557         here->qd_yz,
558         here->qd_xz,
559         here->qd_x3,
560         here->qd_y3,
561         here->qd_z3,
562         here->qd_x2y,
563         here->qd_x2z,
564         here->qd_xy2,
565         here->qd_y2z,
566         here->qd_xz2,
567         here->qd_yz2,
568         here->qd_xyz,
569         r1h1x,
570         i1h1x,
571         r1h1y,
572         i1h1y,
573         r1h1z,
574         i1h1z,
575         r2h11x,
576         i2h11x,
577         r2h11y,
578         i2h11y,
579         r2h11z,
580         i2h11z);
581 
582         itemp = ckt->CKTomega * DFn3F1(here->qd_x2,
583         here->qd_y2,
584         here->qd_z2,
585         here->qd_xy,
586         here->qd_yz,
587         here->qd_xz,
588         here->qd_x3,
589         here->qd_y3,
590         here->qd_z3,
591         here->qd_x2y,
592         here->qd_x2z,
593         here->qd_xy2,
594         here->qd_y2z,
595         here->qd_xz2,
596         here->qd_yz2,
597         here->qd_xyz,
598         r1h1x,
599         i1h1x,
600         r1h1y,
601         i1h1y,
602         r1h1z,
603         i1h1z,
604         r2h11x,
605         i2h11x,
606         r2h11y,
607         i2h11y,
608         r2h11z,
609         i2h11z);
610 
611         *(ckt->CKTrhs + here->B1dNodePrime) -= temp;
612         *(ckt->CKTirhs + here->B1dNodePrime) -= itemp;
613 
614         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
615         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
616 
617         /* qd term over */
618 
619         /* loading here->B1gbs term */
620 
621         r1h1x = *(job->r1H1ptr + here->B1bNode) -
622             *(job->r1H1ptr + here->B1sNodePrime);
623         i1h1x = *(job->i1H1ptr + here->B1bNode) -
624             *(job->i1H1ptr + here->B1sNodePrime);
625 
626         r2h11x = *(job->r2H11ptr + here->B1bNode) -
627             *(job->r2H11ptr + here->B1sNodePrime);
628         i2h11x = *(job->i2H11ptr + here->B1bNode) -
629             *(job->i2H11ptr + here->B1sNodePrime);
630 
631         /* now r1h1x = vbs */
632 
633         temp = D1n3F1(here->gbs2,
634         here->gbs3,
635         r1h1x,
636         i1h1x,
637         r2h11x,
638         i2h11x);
639 
640         itemp = D1i3F1(here->gbs2,
641         here->gbs3,
642         r1h1x,
643         i1h1x,
644         r2h11x,
645         i2h11x);
646 
647 
648         *(ckt->CKTrhs + here->B1bNode) -= temp;
649         *(ckt->CKTirhs + here->B1bNode) -= itemp;
650 
651         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
652         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
653 
654         /* here->B1gbs term over */
655 
656         /* loading here->B1gbd term */
657 
658         r1h1x = *(job->r1H1ptr + here->B1bNode) -
659             *(job->r1H1ptr + here->B1dNodePrime);
660         i1h1x = *(job->i1H1ptr + here->B1bNode) -
661             *(job->i1H1ptr + here->B1dNodePrime);
662 
663         r2h11x = *(job->r2H11ptr + here->B1bNode) -
664             *(job->r2H11ptr + here->B1dNodePrime);
665         i2h11x = *(job->i2H11ptr + here->B1bNode) -
666             *(job->i2H11ptr + here->B1dNodePrime);
667 
668         /* now r1h1x = vbd */
669 
670         temp = D1n3F1(here->gbd2,
671         here->gbd3,
672         r1h1x,
673         i1h1x,
674         r2h11x,
675         i2h11x);
676 
677         itemp = D1i3F1(here->gbd2,
678         here->gbd3,
679         r1h1x,
680         i1h1x,
681         r2h11x,
682         i2h11x);
683 
684 
685         *(ckt->CKTrhs + here->B1bNode) -= temp;
686         *(ckt->CKTirhs + here->B1bNode) -= itemp;
687 
688         *(ckt->CKTrhs + here->B1dNodePrime) += temp;
689         *(ckt->CKTirhs + here->B1dNodePrime) += itemp;
690 
691         /* here->B1gbd term over */
692 
693         /* all done */
694       }
695 
696       break;
697     case D_F1PF2:
698       /* from now on, in the 3-var case, x=vgs,y=vbs,z=vds */
699 
700       {
701         /* draincurrent term */
702         r1h1x = *(job->r1H1ptr + here->B1gNode) -
703             *(job->r1H1ptr + here->B1sNodePrime);
704         i1h1x = *(job->i1H1ptr + here->B1gNode) -
705             *(job->i1H1ptr + here->B1sNodePrime);
706 
707         r1h1y = *(job->r1H1ptr + here->B1bNode) -
708             *(job->r1H1ptr + here->B1sNodePrime);
709         i1h1y = *(job->i1H1ptr + here->B1bNode) -
710             *(job->i1H1ptr + here->B1sNodePrime);
711 
712         r1h1z = *(job->r1H1ptr + here->B1dNodePrime) -
713             *(job->r1H1ptr + here->B1sNodePrime);
714 
715         i1h1z = *(job->i1H1ptr + here->B1dNodePrime) -
716             *(job->i1H1ptr + here->B1sNodePrime);
717 
718         r1h2x = *(job->r1H2ptr + here->B1gNode) -
719             *(job->r1H2ptr + here->B1sNodePrime);
720         i1h2x = (*(job->i1H2ptr + here->B1gNode) -
721             *(job->i1H2ptr + here->B1sNodePrime));
722 
723         r1h2y = *(job->r1H2ptr + here->B1bNode) -
724             *(job->r1H2ptr + here->B1sNodePrime);
725         i1h2y = (*(job->i1H2ptr + here->B1bNode) -
726             *(job->i1H2ptr + here->B1sNodePrime));
727 
728         r1h2z = *(job->r1H2ptr + here->B1dNodePrime) -
729             *(job->r1H2ptr + here->B1sNodePrime);
730 
731         i1h2z = (*(job->i1H2ptr + here->B1dNodePrime) -
732             *(job->i1H2ptr + here->B1sNodePrime));
733 
734         /* draincurrent is a function of vgs,vbs,and vds;
735          * have got their linear kernels; now to call
736          * load functions
737          */
738 
739          temp = DFnF12(here->DrC_x2,
740          here->DrC_y2,
741          here->DrC_z2,
742          here->DrC_xy,
743          here->DrC_yz,
744          here->DrC_xz,
745          r1h1x,
746          i1h1x,
747          r1h1y,
748          i1h1y,
749          r1h1z,
750          i1h1z,
751          r1h2x,
752          i1h2x,
753          r1h2y,
754          i1h2y,
755          r1h2z,
756          i1h2z);
757 
758          itemp = DFiF12(here->DrC_x2,
759          here->DrC_y2,
760          here->DrC_z2,
761          here->DrC_xy,
762          here->DrC_yz,
763          here->DrC_xz,
764          r1h1x,
765          i1h1x,
766          r1h1y,
767          i1h1y,
768          r1h1z,
769          i1h1z,
770          r1h2x,
771          i1h2x,
772          r1h2y,
773          i1h2y,
774          r1h2z,
775          i1h2z);
776 
777          *(ckt->CKTrhs + here->B1dNodePrime) -= temp;
778          *(ckt->CKTirhs + here->B1dNodePrime) -= itemp;
779 
780          *(ckt->CKTrhs + here->B1sNodePrime) += temp;
781          *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
782 
783          /* draincurrent term loading over */
784 
785 
786 
787         /* loading qg term */
788 
789         /* kernels for vgs,vbs and vds already set up */
790 
791         temp = -ckt->CKTomega * DFiF12(here->qg_x2,
792         here->qg_y2,
793         here->qg_z2,
794         here->qg_xy,
795         here->qg_yz,
796         here->qg_xz,
797         r1h1x,
798         i1h1x,
799         r1h1y,
800         i1h1y,
801         r1h1z,
802         i1h1z,
803         r1h2x,
804         i1h2x,
805         r1h2y,
806         i1h2y,
807         r1h2z,
808         i1h2z);
809 
810         itemp = ckt->CKTomega * DFnF12(here->qg_x2,
811         here->qg_y2,
812         here->qg_z2,
813         here->qg_xy,
814         here->qg_yz,
815         here->qg_xz,
816         r1h1x,
817         i1h1x,
818         r1h1y,
819         i1h1y,
820         r1h1z,
821         i1h1z,
822         r1h2x,
823         i1h2x,
824         r1h2y,
825         i1h2y,
826         r1h2z,
827         i1h2z);
828 
829         *(ckt->CKTrhs + here->B1gNode) -= temp;
830         *(ckt->CKTirhs + here->B1gNode) -= itemp;
831 
832         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
833         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
834 
835         /* qg term over */
836 
837         /* loading qb term */
838 
839         /* kernels for vgs,vbs and vds already set up */
840 
841         temp = -ckt->CKTomega * DFiF12(here->qb_x2,
842         here->qb_y2, /* XXX Bug fixed: fewer arguments passed than declared */
843         here->qb_z2,
844         here->qb_xy,
845         here->qb_yz,
846         here->qb_xz,
847         r1h1x,
848         i1h1x,
849         r1h1y,
850         i1h1y,
851         r1h1z,
852         i1h1z,
853         r1h2x,
854         i1h2x,
855         r1h2y,
856         i1h2y,
857         r1h2z,
858         i1h2z);
859 
860         itemp = ckt->CKTomega * DFnF12(here->qb_x2,
861         here->qb_y2,
862         here->qb_z2,
863         here->qb_xy,
864         here->qb_yz,
865         here->qb_xz,
866         r1h1x,
867         i1h1x,
868         r1h1y,
869         i1h1y,
870         r1h1z,
871         i1h1z,
872         r1h2x,
873         i1h2x,
874         r1h2y,
875         i1h2y,
876         r1h2z,
877         i1h2z);
878 
879         *(ckt->CKTrhs + here->B1bNode) -= temp;
880         *(ckt->CKTirhs + here->B1bNode) -= itemp;
881 
882         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
883         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
884 
885         /* qb term over */
886 
887         /* loading qd term */
888 
889         /* kernels for vgs,vbs and vds already set up */
890 
891         temp = -ckt->CKTomega * DFiF12(here->qd_x2,
892         here->qd_y2,
893         here->qd_z2,
894         here->qd_xy,
895         here->qd_yz,
896         here->qd_xz,
897         r1h1x,
898         i1h1x,
899         r1h1y,
900         i1h1y,
901         r1h1z,
902         i1h1z,
903         r1h2x,
904         i1h2x,
905         r1h2y,
906         i1h2y,
907         r1h2z,
908         i1h2z);
909 
910         itemp = ckt->CKTomega * DFnF12(here->qd_x2,
911         here->qd_y2,
912         here->qd_z2,
913         here->qd_xy,
914         here->qd_yz,
915         here->qd_xz,
916         r1h1x,
917         i1h1x,
918         r1h1y,
919         i1h1y,
920         r1h1z,
921         i1h1z,
922         r1h2x,
923         i1h2x,
924         r1h2y,
925         i1h2y,
926         r1h2z,
927         i1h2z);
928 
929         *(ckt->CKTrhs + here->B1dNodePrime) -= temp;
930         *(ckt->CKTirhs + here->B1dNodePrime) -= itemp;
931 
932         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
933         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
934 
935         /* qd term over */
936 
937         /* loading here->B1gbs term */
938 
939         r1h1x = *(job->r1H1ptr + here->B1bNode) -
940             *(job->r1H1ptr + here->B1sNodePrime);
941         i1h1x = *(job->i1H1ptr + here->B1bNode) -
942             *(job->i1H1ptr + here->B1sNodePrime);
943 
944         r1h2x = *(job->r1H2ptr + here->B1bNode) -
945             *(job->r1H2ptr + here->B1sNodePrime);
946         i1h2x = *(job->i1H2ptr + here->B1bNode) -
947             *(job->i1H2ptr + here->B1sNodePrime);
948 
949         /* now r1h1x = vbs */
950 
951         temp = D1nF12(here->gbs2,
952         r1h1x,
953         i1h1x,
954         r1h2x,
955         i1h2x);
956 
957         itemp = D1iF12(here->gbs2,
958         r1h1x,
959         i1h1x,
960         r1h2x,
961         i1h2x);
962 
963         *(ckt->CKTrhs + here->B1bNode) -= temp;
964         *(ckt->CKTirhs + here->B1bNode) -= itemp;
965 
966         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
967         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
968 
969         /* here->B1gbs term over */
970 
971         /* loading here->B1gbd term */
972 
973         r1h1x = *(job->r1H1ptr + here->B1bNode) -
974             *(job->r1H1ptr + here->B1dNodePrime);
975         i1h1x = *(job->i1H1ptr + here->B1bNode) -
976             *(job->i1H1ptr + here->B1dNodePrime);
977 
978         r1h2x = *(job->r1H2ptr + here->B1bNode) -
979             *(job->r1H2ptr + here->B1dNodePrime);
980         i1h2x = *(job->i1H2ptr + here->B1bNode) -
981             *(job->i1H2ptr + here->B1dNodePrime);
982 
983         /* now r1h1x = vbd */
984 
985         temp = D1nF12(here->gbd2,
986         r1h1x,
987         i1h1x,
988         r1h2x,
989         i1h2x);
990 
991         itemp = D1iF12(here->gbd2,
992         r1h1x,
993         i1h1x,
994         r1h2x,
995         i1h2x);
996 
997         *(ckt->CKTrhs + here->B1gNode) -= temp;
998         *(ckt->CKTirhs + here->B1gNode) -= itemp;
999 
1000         *(ckt->CKTrhs + here->B1dNodePrime) += temp;
1001         *(ckt->CKTirhs + here->B1dNodePrime) += itemp;
1002 
1003         /* here->B1gbd term over */
1004 
1005         /* all done */
1006       }
1007 
1008       break;
1009     case D_F1MF2:
1010       /* from now on, in the 3-var case, x=vgs,y=vbs,z=vds */
1011 
1012       {
1013         /* draincurrent term */
1014         r1h1x = *(job->r1H1ptr + here->B1gNode) -
1015             *(job->r1H1ptr + here->B1sNodePrime);
1016         i1h1x = *(job->i1H1ptr + here->B1gNode) -
1017             *(job->i1H1ptr + here->B1sNodePrime);
1018 
1019         r1h1y = *(job->r1H1ptr + here->B1bNode) -
1020             *(job->r1H1ptr + here->B1sNodePrime);
1021         i1h1y = *(job->i1H1ptr + here->B1bNode) -
1022             *(job->i1H1ptr + here->B1sNodePrime);
1023 
1024         r1h1z = *(job->r1H1ptr + here->B1dNodePrime) -
1025             *(job->r1H1ptr + here->B1sNodePrime);
1026 
1027         i1h1z = *(job->i1H1ptr + here->B1dNodePrime) -
1028             *(job->i1H1ptr + here->B1sNodePrime);
1029 
1030         r1hm2x = *(job->r1H2ptr + here->B1gNode) -
1031             *(job->r1H2ptr + here->B1sNodePrime);
1032         i1hm2x = -(*(job->i1H2ptr + here->B1gNode) -
1033             *(job->i1H2ptr + here->B1sNodePrime));
1034 
1035         r1hm2y = *(job->r1H2ptr + here->B1bNode) -
1036             *(job->r1H2ptr + here->B1sNodePrime);
1037         i1hm2y = -(*(job->i1H2ptr + here->B1bNode) -
1038             *(job->i1H2ptr + here->B1sNodePrime));
1039 
1040         r1hm2z = *(job->r1H2ptr + here->B1dNodePrime) -
1041             *(job->r1H2ptr + here->B1sNodePrime);
1042 
1043         i1hm2z = -(*(job->i1H2ptr + here->B1dNodePrime) -
1044             *(job->i1H2ptr + here->B1sNodePrime));
1045 
1046         /* draincurrent is a function of vgs,vbs,and vds;
1047          * have got their linear kernels; now to call
1048          * load functions
1049          */
1050 
1051          temp = DFnF12(here->DrC_x2,
1052          here->DrC_y2,
1053          here->DrC_z2,
1054          here->DrC_xy,
1055          here->DrC_yz,
1056          here->DrC_xz,
1057          r1h1x,
1058          i1h1x,
1059          r1h1y,
1060          i1h1y,
1061          r1h1z,
1062          i1h1z,
1063          r1hm2x,
1064          i1hm2x,
1065          r1hm2y,
1066          i1hm2y,
1067          r1hm2z,
1068          i1hm2z);
1069 
1070          itemp = DFiF12(here->DrC_x2,
1071          here->DrC_y2,
1072          here->DrC_z2,
1073          here->DrC_xy,
1074          here->DrC_yz,
1075          here->DrC_xz,
1076          r1h1x,
1077          i1h1x,
1078          r1h1y,
1079          i1h1y,
1080          r1h1z,
1081          i1h1z,
1082          r1hm2x,
1083          i1hm2x,
1084          r1hm2y,
1085          i1hm2y,
1086          r1hm2z,
1087          i1hm2z);
1088 
1089          *(ckt->CKTrhs + here->B1dNodePrime) -= temp;
1090          *(ckt->CKTirhs + here->B1dNodePrime) -= itemp;
1091 
1092          *(ckt->CKTrhs + here->B1sNodePrime) += temp;
1093          *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
1094 
1095          /* draincurrent term loading over */
1096 
1097 
1098 
1099         /* loading qg term */
1100 
1101         /* kernels for vgs,vbs and vds already set up */
1102 
1103         temp = -ckt->CKTomega * DFiF12(here->qg_x2,
1104         here->qg_y2,
1105         here->qg_z2,
1106         here->qg_xy,
1107         here->qg_yz,
1108         here->qg_xz,
1109         r1h1x,
1110         i1h1x,
1111         r1h1y,
1112         i1h1y,
1113         r1h1z,
1114         i1h1z,
1115         r1hm2x,
1116         i1hm2x,
1117         r1hm2y,
1118         i1hm2y,
1119         r1hm2z,
1120         i1hm2z);
1121 
1122         itemp = ckt->CKTomega * DFnF12(here->qg_x2,
1123         here->qg_y2,
1124         here->qg_z2,
1125         here->qg_xy,
1126         here->qg_yz,
1127         here->qg_xz,
1128         r1h1x,
1129         i1h1x,
1130         r1h1y,
1131         i1h1y,
1132         r1h1z,
1133         i1h1z,
1134         r1hm2x,
1135         i1hm2x,
1136         r1hm2y,
1137         i1hm2y,
1138         r1hm2z,
1139         i1hm2z);
1140 
1141         *(ckt->CKTrhs + here->B1gNode) -= temp;
1142         *(ckt->CKTirhs + here->B1gNode) -= itemp;
1143 
1144         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
1145         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
1146 
1147         /* qg term over */
1148 
1149         /* loading qb term */
1150 
1151         /* kernels for vgs,vbs and vds already set up */
1152 
1153         temp = -ckt->CKTomega * DFiF12(here->qb_x2,
1154         here->qb_y2, /* XXX Bug fixed: fewer arguments passed than declared */
1155         here->qb_z2,
1156         here->qb_xy,
1157         here->qb_yz,
1158         here->qb_xz,
1159         r1h1x,
1160         i1h1x,
1161         r1h1y,
1162         i1h1y,
1163         r1h1z,
1164         i1h1z,
1165         r1hm2x,
1166         i1hm2x,
1167         r1hm2y,
1168         i1hm2y,
1169         r1hm2z,
1170         i1hm2z);
1171 
1172         itemp = ckt->CKTomega * DFnF12(here->qb_x2,
1173         here->qb_y2,
1174         here->qb_z2,
1175         here->qb_xy,
1176         here->qb_yz,
1177         here->qb_xz,
1178         r1h1x,
1179         i1h1x,
1180         r1h1y,
1181         i1h1y,
1182         r1h1z,
1183         i1h1z,
1184         r1hm2x,
1185         i1hm2x,
1186         r1hm2y,
1187         i1hm2y,
1188         r1hm2z,
1189         i1hm2z);
1190 
1191         *(ckt->CKTrhs + here->B1bNode) -= temp;
1192         *(ckt->CKTirhs + here->B1bNode) -= itemp;
1193 
1194         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
1195         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
1196 
1197         /* qb term over */
1198 
1199         /* loading qd term */
1200 
1201         /* kernels for vgs,vbs and vds already set up */
1202 
1203         temp = -ckt->CKTomega * DFiF12(here->qd_x2,
1204         here->qd_y2,
1205         here->qd_z2,
1206         here->qd_xy,
1207         here->qd_yz,
1208         here->qd_xz,
1209         r1h1x,
1210         i1h1x,
1211         r1h1y,
1212         i1h1y,
1213         r1h1z,
1214         i1h1z,
1215         r1hm2x,
1216         i1hm2x,
1217         r1hm2y,
1218         i1hm2y,
1219         r1hm2z,
1220         i1hm2z);
1221 
1222         itemp = ckt->CKTomega * DFnF12(here->qd_x2,
1223         here->qd_y2,
1224         here->qd_z2,
1225         here->qd_xy,
1226         here->qd_yz,
1227         here->qd_xz,
1228         r1h1x,
1229         i1h1x,
1230         r1h1y,
1231         i1h1y,
1232         r1h1z,
1233         i1h1z,
1234         r1hm2x,
1235         i1hm2x,
1236         r1hm2y,
1237         i1hm2y,
1238         r1hm2z,
1239         i1hm2z);
1240 
1241         *(ckt->CKTrhs + here->B1dNodePrime) -= temp;
1242         *(ckt->CKTirhs + here->B1dNodePrime) -= itemp;
1243 
1244         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
1245         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
1246 
1247         /* qd term over */
1248 
1249         /* loading here->B1gbs term */
1250 
1251         r1h1x = *(job->r1H1ptr + here->B1bNode) -
1252             *(job->r1H1ptr + here->B1sNodePrime);
1253         i1h1x = *(job->i1H1ptr + here->B1bNode) -
1254             *(job->i1H1ptr + here->B1sNodePrime);
1255 
1256         r1hm2x = *(job->r1H2ptr + here->B1bNode) -
1257             *(job->r1H2ptr + here->B1sNodePrime);
1258         i1hm2x = -(*(job->i1H2ptr + here->B1bNode) -
1259             *(job->i1H2ptr + here->B1sNodePrime));
1260 
1261         /* now r1h1x = vbs */
1262 
1263         temp = D1nF12(here->gbs2,
1264         r1h1x,
1265         i1h1x,
1266         r1hm2x,
1267         i1hm2x);
1268 
1269         itemp = D1iF12(here->gbs2,
1270         r1h1x,
1271         i1h1x,
1272         r1hm2x,
1273         i1hm2x);
1274 
1275         *(ckt->CKTrhs + here->B1bNode) -= temp;
1276         *(ckt->CKTirhs + here->B1bNode) -= itemp;
1277 
1278         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
1279         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
1280 
1281         /* here->B1gbs term over */
1282 
1283         /* loading here->B1gbd term */
1284 
1285         r1h1x = *(job->r1H1ptr + here->B1bNode) -
1286             *(job->r1H1ptr + here->B1dNodePrime);
1287         i1h1x = *(job->i1H1ptr + here->B1bNode) -
1288             *(job->i1H1ptr + here->B1dNodePrime);
1289 
1290         r1hm2x = *(job->r1H2ptr + here->B1bNode) -
1291             *(job->r1H2ptr + here->B1dNodePrime);
1292         i1hm2x = -(*(job->i1H2ptr + here->B1bNode) -
1293             *(job->i1H2ptr + here->B1dNodePrime));
1294 
1295         /* now r1h1x = vbd */
1296 
1297         temp = D1nF12(here->gbd2,
1298         r1h1x,
1299         i1h1x,
1300         r1hm2x,
1301         i1hm2x);
1302 
1303         itemp = D1iF12(here->gbd2,
1304         r1h1x,
1305         i1h1x,
1306         r1hm2x,
1307         i1hm2x);
1308 
1309         *(ckt->CKTrhs + here->B1gNode) -= temp;
1310         *(ckt->CKTirhs + here->B1gNode) -= itemp;
1311 
1312         *(ckt->CKTrhs + here->B1dNodePrime) += temp;
1313         *(ckt->CKTirhs + here->B1dNodePrime) += itemp;
1314 
1315         /* here->B1gbd term over */
1316 
1317         /* all done */
1318       }
1319 
1320       break;
1321     case D_2F1MF2:
1322       /* from now on, in the 3-var case, x=vgs,y=vbs,z=vds */
1323 
1324       {
1325         /* draincurrent term */
1326         r1h1x = *(job->r1H1ptr + here->B1gNode) -
1327             *(job->r1H1ptr + here->B1sNodePrime);
1328         i1h1x = *(job->i1H1ptr + here->B1gNode) -
1329             *(job->i1H1ptr + here->B1sNodePrime);
1330 
1331         r1h1y = *(job->r1H1ptr + here->B1bNode) -
1332             *(job->r1H1ptr + here->B1sNodePrime);
1333         i1h1y = *(job->i1H1ptr + here->B1bNode) -
1334             *(job->i1H1ptr + here->B1sNodePrime);
1335 
1336         r1h1z = *(job->r1H1ptr + here->B1dNodePrime) -
1337             *(job->r1H1ptr + here->B1sNodePrime);
1338 
1339         i1h1z = *(job->i1H1ptr + here->B1dNodePrime) -
1340             *(job->i1H1ptr + here->B1sNodePrime);
1341 
1342         r1hm2x = *(job->r1H2ptr + here->B1gNode) -
1343             *(job->r1H2ptr + here->B1sNodePrime);
1344         i1hm2x = -(*(job->i1H2ptr + here->B1gNode) -
1345             *(job->i1H2ptr + here->B1sNodePrime));
1346 
1347         r1hm2y = *(job->r1H2ptr + here->B1bNode) -
1348             *(job->r1H2ptr + here->B1sNodePrime);
1349         i1hm2y = -(*(job->i1H2ptr + here->B1bNode) -
1350             *(job->i1H2ptr + here->B1sNodePrime));
1351 
1352         r1hm2z = *(job->r1H2ptr + here->B1dNodePrime) -
1353             *(job->r1H2ptr + here->B1sNodePrime);
1354 
1355         i1hm2z = -(*(job->i1H2ptr + here->B1dNodePrime) -
1356             *(job->i1H2ptr + here->B1sNodePrime));
1357 
1358         r2h11x = *(job->r2H11ptr + here->B1gNode) -
1359             *(job->r2H11ptr + here->B1sNodePrime);
1360         i2h11x = *(job->i2H11ptr + here->B1gNode) -
1361             *(job->i2H11ptr + here->B1sNodePrime);
1362 
1363         r2h11y = *(job->r2H11ptr + here->B1bNode) -
1364             *(job->r2H11ptr + here->B1sNodePrime);
1365         i2h11y = *(job->i2H11ptr + here->B1bNode) -
1366             *(job->i2H11ptr + here->B1sNodePrime);
1367 
1368         r2h11z = *(job->r2H11ptr + here->B1dNodePrime) -
1369             *(job->r2H11ptr + here->B1sNodePrime);
1370 
1371         i2h11z = *(job->i2H11ptr + here->B1dNodePrime) -
1372             *(job->i2H11ptr + here->B1sNodePrime);
1373 
1374         r2h1m2x = *(job->r2H1m2ptr + here->B1gNode) -
1375             *(job->r2H1m2ptr + here->B1sNodePrime);
1376         i2h1m2x = *(job->i2H1m2ptr + here->B1gNode) -
1377             *(job->i2H1m2ptr + here->B1sNodePrime);
1378 
1379         r2h1m2y = *(job->r2H1m2ptr + here->B1bNode) -
1380             *(job->r2H1m2ptr + here->B1sNodePrime);
1381         i2h1m2y = *(job->i2H1m2ptr + here->B1bNode) -
1382             *(job->i2H1m2ptr + here->B1sNodePrime);
1383 
1384         r2h1m2z = *(job->r2H1m2ptr + here->B1dNodePrime) -
1385             *(job->r2H1m2ptr + here->B1sNodePrime);
1386 
1387         i2h1m2z = *(job->i2H1m2ptr + here->B1dNodePrime) -
1388             *(job->i2H1m2ptr + here->B1sNodePrime);
1389 
1390         /* draincurrent is a function of vgs,vbs,and vds;
1391          * have got their linear kernels; now to call
1392          * load functions
1393          */
1394 
1395         pass.cxx = here->DrC_x2;
1396         pass.cyy = here->DrC_y2;
1397         pass.czz = here->DrC_z2;
1398         pass.cxy = here->DrC_xy;
1399         pass.cyz = here->DrC_yz;
1400         pass.cxz = here->DrC_xz;
1401         pass.cxxx = here->DrC_x3;
1402         pass.cyyy = here->DrC_y3;
1403         pass.czzz = here->DrC_z3;
1404         pass.cxxy = here->DrC_x2y;
1405         pass.cxxz = here->DrC_x2z;
1406         pass.cxyy = here->DrC_xy2;
1407         pass.cyyz = here->DrC_y2z;
1408         pass.cxzz = here->DrC_xz2;
1409         pass.cyzz = here->DrC_yz2;
1410         pass.cxyz = here->DrC_xyz;
1411         pass.r1h1x = r1h1x;
1412         pass.i1h1x = i1h1x;
1413         pass.r1h1y = r1h1y;
1414         pass.i1h1y = i1h1y;
1415         pass.r1h1z = r1h1z;
1416         pass.i1h1z = i1h1z;
1417         pass.r1h2x = r1hm2x;
1418         pass.i1h2x = i1hm2x;
1419         pass.r1h2y = r1hm2y;
1420         pass.i1h2y = i1hm2y;
1421         pass.r1h2z = r1hm2z;
1422         pass.i1h2z = i1hm2z;
1423         pass.r2h11x = r2h11x;
1424         pass.i2h11x = i2h11x;
1425         pass.r2h11y = r2h11y;
1426         pass.i2h11y = i2h11y;
1427         pass.r2h11z = r2h11z;
1428         pass.i2h11z = i2h11z;
1429         pass.h2f1f2x = r2h1m2x;
1430         pass.ih2f1f2x = i2h1m2x;
1431         pass.h2f1f2y = r2h1m2y;
1432         pass.ih2f1f2y = i2h1m2y;
1433         pass.h2f1f2z = r2h1m2z;
1434         pass.ih2f1f2z = i2h1m2z;
1435          temp = DFn2F12(&pass);
1436          itemp = DFi2F12(&pass);
1437 
1438          *(ckt->CKTrhs + here->B1dNodePrime) -= temp;
1439          *(ckt->CKTirhs + here->B1dNodePrime) -= itemp;
1440 
1441          *(ckt->CKTrhs + here->B1sNodePrime) += temp;
1442          *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
1443 
1444          /* draincurrent term loading over */
1445 
1446 
1447 
1448         /* loading qg term */
1449 
1450         /* kernels for vgs,vbs and vds already set up */
1451 
1452         pass.cxx = here->qg_x2;
1453         pass.cyy = here->qg_y2;
1454         pass.czz = here->qg_z2;
1455         pass.cxy = here->qg_xy;
1456         pass.cyz = here->qg_yz;
1457         pass.cxz = here->qg_xz;
1458         pass.cxxx = here->qg_x3;
1459         pass.cyyy = here->qg_y3;
1460         pass.czzz = here->qg_z3;
1461         pass.cxxy = here->qg_x2y;
1462         pass.cxxz = here->qg_x2z;
1463         pass.cxyy = here->qg_xy2;
1464         pass.cyyz = here->qg_y2z;
1465         pass.cxzz = here->qg_xz2;
1466         pass.cyzz = here->qg_yz2;
1467         pass.cxyz = here->qg_xyz;
1468         pass.r1h1x = r1h1x;
1469         pass.i1h1x = i1h1x;
1470         pass.r1h1y = r1h1y;
1471         pass.i1h1y = i1h1y;
1472         pass.r1h1z = r1h1z;
1473         pass.i1h1z = i1h1z;
1474         pass.r1h2x = r1hm2x;
1475         pass.i1h2x = i1hm2x;
1476         pass.r1h2y = r1hm2y;
1477         pass.i1h2y = i1hm2y;
1478         pass.r1h2z = r1hm2z;
1479         pass.i1h2z = i1hm2z;
1480         pass.r2h11x = r2h11x;
1481         pass.i2h11x = i2h11x;
1482         pass.r2h11y = r2h11y;
1483         pass.i2h11y = i2h11y;
1484         pass.r2h11z = r2h11z;
1485         pass.i2h11z = i2h11z;
1486         pass.h2f1f2x = r2h1m2x;
1487         pass.ih2f1f2x = i2h1m2x;
1488         pass.h2f1f2y = r2h1m2y;
1489         pass.ih2f1f2y = i2h1m2y;
1490         pass.h2f1f2z = r2h1m2z;
1491         pass.ih2f1f2z = i2h1m2z;
1492         temp = -ckt->CKTomega * DFi2F12(&pass);
1493 
1494         itemp = ckt->CKTomega * DFn2F12(&pass);
1495 
1496         *(ckt->CKTrhs + here->B1gNode) -= temp;
1497         *(ckt->CKTirhs + here->B1gNode) -= itemp;
1498 
1499         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
1500         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
1501 
1502         /* qg term over */
1503 
1504         /* loading qb term */
1505 
1506         /* kernels for vgs,vbs and vds already set up */
1507 
1508         pass.cxx = here->qb_x2;
1509         pass.cyy = here->qb_y2;
1510         pass.czz = here->qb_z2;
1511         pass.cxy = here->qb_xy;
1512         pass.cyz = here->qb_yz;
1513         pass.cxz = here->qb_xz;
1514         pass.cxxx = here->qb_x3;
1515         pass.cyyy = here->qb_y3;
1516         pass.czzz = here->qb_z3;
1517         pass.cxxy = here->qb_x2y;
1518         pass.cxxz = here->qb_x2z;
1519         pass.cxyy = here->qb_xy2;
1520         pass.cyyz = here->qb_y2z;
1521         pass.cxzz = here->qb_xz2;
1522         pass.cyzz = here->qb_yz2;
1523         pass.cxyz = here->qb_xyz;
1524         pass.r1h1x = r1h1x;
1525         pass.i1h1x = i1h1x;
1526         pass.r1h1y = r1h1y;
1527         pass.i1h1y = i1h1y;
1528         pass.r1h1z = r1h1z;
1529         pass.i1h1z = i1h1z;
1530         pass.r1h2x = r1hm2x;
1531         pass.i1h2x = i1hm2x;
1532         pass.r1h2y = r1hm2y;
1533         pass.i1h2y = i1hm2y;
1534         pass.r1h2z = r1hm2z;
1535         pass.i1h2z = i1hm2z;
1536         pass.r2h11x = r2h11x;
1537         pass.i2h11x = i2h11x;
1538         pass.r2h11y = r2h11y;
1539         pass.i2h11y = i2h11y;
1540         pass.r2h11z = r2h11z;
1541         pass.i2h11z = i2h11z;
1542         pass.h2f1f2x = r2h1m2x;
1543         pass.ih2f1f2x = i2h1m2x;
1544         pass.h2f1f2y = r2h1m2y;
1545         pass.ih2f1f2y = i2h1m2y;
1546         pass.h2f1f2z = r2h1m2z;
1547         pass.ih2f1f2z = i2h1m2z;
1548         temp = -ckt->CKTomega * DFi2F12(&pass);
1549 
1550         itemp = ckt->CKTomega * DFn2F12(&pass);
1551 
1552         *(ckt->CKTrhs + here->B1bNode) -= temp;
1553         *(ckt->CKTirhs + here->B1bNode) -= itemp;
1554 
1555         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
1556         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
1557 
1558         /* qb term over */
1559 
1560         /* loading qd term */
1561 
1562         /* kernels for vgs,vbs and vds already set up */
1563 
1564         pass.cxx = here->qd_x2;
1565         pass.cyy = here->qd_y2;
1566         pass.czz = here->qd_z2;
1567         pass.cxy = here->qd_xy;
1568         pass.cyz = here->qd_yz;
1569         pass.cxz = here->qd_xz;
1570         pass.cxxx = here->qd_x3;
1571         pass.cyyy = here->qd_y3;
1572         pass.czzz = here->qd_z3;
1573         pass.cxxy = here->qd_x2y;
1574         pass.cxxz = here->qd_x2z;
1575         pass.cxyy = here->qd_xy2;
1576         pass.cyyz = here->qd_y2z;
1577         pass.cxzz = here->qd_xz2;
1578         pass.cyzz = here->qd_yz2;
1579         pass.cxyz = here->qd_xyz;
1580         pass.r1h1x = r1h1x;
1581         pass.i1h1x = i1h1x;
1582         pass.r1h1y = r1h1y;
1583         pass.i1h1y = i1h1y;
1584         pass.r1h1z = r1h1z;
1585         pass.i1h1z = i1h1z;
1586         pass.r1h2x = r1hm2x;
1587         pass.i1h2x = i1hm2x;
1588         pass.r1h2y = r1hm2y;
1589         pass.i1h2y = i1hm2y;
1590         pass.r1h2z = r1hm2z;
1591         pass.i1h2z = i1hm2z;
1592         pass.r2h11x = r2h11x;
1593         pass.i2h11x = i2h11x;
1594         pass.r2h11y = r2h11y;
1595         pass.i2h11y = i2h11y;
1596         pass.r2h11z = r2h11z;
1597         pass.i2h11z = i2h11z;
1598         pass.h2f1f2x = r2h1m2x;
1599         pass.ih2f1f2x = i2h1m2x;
1600         pass.h2f1f2y = r2h1m2y;
1601         pass.ih2f1f2y = i2h1m2y;
1602         pass.h2f1f2z = r2h1m2z;
1603         pass.ih2f1f2z = i2h1m2z;
1604         temp = -ckt->CKTomega * DFi2F12(&pass);
1605 
1606         itemp = ckt->CKTomega * DFn2F12(&pass);
1607 
1608         *(ckt->CKTrhs + here->B1dNodePrime) -= temp;
1609         *(ckt->CKTirhs + here->B1dNodePrime) -= itemp;
1610 
1611         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
1612         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
1613 
1614         /* qd term over */
1615 
1616         /* loading here->B1gbs term */
1617 
1618         r1h1x = *(job->r1H1ptr + here->B1bNode) -
1619             *(job->r1H1ptr + here->B1sNodePrime);
1620         i1h1x = *(job->i1H1ptr + here->B1bNode) -
1621             *(job->i1H1ptr + here->B1sNodePrime);
1622 
1623         r2h11x = *(job->r2H11ptr + here->B1bNode) -
1624             *(job->r2H11ptr + here->B1sNodePrime);
1625         i2h11x = *(job->i2H11ptr + here->B1bNode) -
1626             *(job->i2H11ptr + here->B1sNodePrime);
1627 
1628         r1hm2x = *(job->r1H2ptr + here->B1bNode) -
1629             *(job->r1H2ptr + here->B1sNodePrime);
1630         i1hm2x = -(*(job->i1H2ptr + here->B1bNode) -
1631             *(job->i1H2ptr + here->B1sNodePrime));
1632 
1633         r2h1m2x = *(job->r2H1m2ptr + here->B1bNode) -
1634             *(job->r2H1m2ptr + here->B1sNodePrime);
1635         i2h1m2x = *(job->i2H1m2ptr + here->B1bNode) -
1636             *(job->i2H1m2ptr + here->B1sNodePrime);
1637 
1638         /* now r1h1x = vbs */
1639 
1640         temp = D1n2F12(here->gbs2,
1641         here->gbs3,
1642         r1h1x,
1643         i1h1x,
1644         r1hm2x,
1645         i1hm2x,
1646         r2h11x,
1647         i2h11x,
1648         r2h1m2x,
1649         i2h1m2x);
1650 
1651         itemp = D1i2F12(here->gbs2,
1652         here->gbs3,
1653         r1h1x,
1654         i1h1x,
1655         r1hm2x,
1656         i1hm2x,
1657         r2h11x,
1658         i2h11x,
1659         r2h1m2x,
1660         i2h1m2x);
1661 
1662 
1663         *(ckt->CKTrhs + here->B1bNode) -= temp;
1664         *(ckt->CKTirhs + here->B1bNode) -= itemp;
1665 
1666         *(ckt->CKTrhs + here->B1sNodePrime) += temp;
1667         *(ckt->CKTirhs + here->B1sNodePrime) += itemp;
1668 
1669         /* here->B1gbs term over */
1670 
1671         /* loading here->B1gbd term */
1672 
1673         r1h1x = *(job->r1H1ptr + here->B1bNode) -
1674             *(job->r1H1ptr + here->B1dNodePrime);
1675         i1h1x = *(job->i1H1ptr + here->B1bNode) -
1676             *(job->i1H1ptr + here->B1dNodePrime);
1677 
1678         r2h11x = *(job->r2H11ptr + here->B1bNode) -
1679             *(job->r2H11ptr + here->B1dNodePrime);
1680         i2h11x = *(job->i2H11ptr + here->B1bNode) -
1681             *(job->i2H11ptr + here->B1dNodePrime);
1682 
1683         r1hm2x = *(job->r1H2ptr + here->B1bNode) -
1684             *(job->r1H2ptr + here->B1dNodePrime);
1685         i1hm2x = -(*(job->i1H2ptr + here->B1bNode) -
1686             *(job->i1H2ptr + here->B1dNodePrime));
1687 
1688         r2h1m2x = *(job->r2H1m2ptr + here->B1bNode) -
1689             *(job->r2H1m2ptr + here->B1dNodePrime);
1690         i2h1m2x = *(job->i2H1m2ptr + here->B1bNode) -
1691             *(job->i2H1m2ptr + here->B1dNodePrime);
1692 
1693         /* now r1h1x = vbd */
1694 
1695         temp = D1n2F12(here->gbd2,
1696         here->gbd3,
1697         r1h1x,
1698         i1h1x,
1699         r1hm2x,
1700         i1hm2x,
1701         r2h11x,
1702         i2h11x,
1703         r2h1m2x,
1704         i2h1m2x);
1705 
1706         itemp = D1i2F12(here->gbd2,
1707         here->gbd3,
1708         r1h1x,
1709         i1h1x,
1710         r1hm2x,
1711         i1hm2x,
1712         r2h11x,
1713         i2h11x,
1714         r2h1m2x,
1715         i2h1m2x);
1716 
1717 
1718         *(ckt->CKTrhs + here->B1bNode) -= temp;
1719         *(ckt->CKTirhs + here->B1bNode) -= itemp;
1720 
1721         *(ckt->CKTrhs + here->B1dNodePrime) += temp;
1722         *(ckt->CKTirhs + here->B1dNodePrime) += itemp;
1723 
1724         /* here->B1gbd term over */
1725 
1726         /* all done */
1727       }
1728 
1729       break;
1730     default:
1731 ;
1732     ;
1733     }
1734   }
1735 }
1736 return(OK);
1737 }
1738 else
1739   return(E_BADPARM);
1740 }
1741