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

Go to the source code of this file.

Functions

int B1disto (int mode, GENmodel *genmodel, CKTcircuit *ckt)
 

Function Documentation

int B1disto ( int  mode,
GENmodel genmodel,
CKTcircuit ckt 
)

Definition at line 18 of file b1disto.c.

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 }
int B1dSetup(GENmodel *inModel, CKTcircuit *ckt)
Definition: b1dset.c:19
double * CKTirhs
Definition: cktdefs.h:100
double DFnF12()
#define D_SETUP
Definition: distodef.h:158
double D1n2F1()
double * i1H2ptr
Definition: distodef.h:116
if(TDesc==NULL)
Definition: cd.c:1326
double DFn2F12()
double D1n3F1()
#define E_BADPARM
Definition: iferrmsg.h:26
double * r1H1ptr
Definition: distodef.h:109
double DFi2F1()
double DFn3F1()
double * r2H1m2ptr
Definition: distodef.h:119
double * r1H2ptr
Definition: distodef.h:115
#define OK
Definition: iferrmsg.h:17
#define D_2F1MF2
Definition: distodef.h:165
#define NULL
Definition: spdefs.h:121
double * i2H1m2ptr
Definition: distodef.h:120
B1instance * B1instances
Definition: bsim1def.h:303
double D1i2F12()
double CKTomega
Definition: cktdefs.h:198
double D1i2F1()
double DFiF12()
double * r2H11ptr
Definition: distodef.h:111
double * i2H11ptr
Definition: distodef.h:112
double DFi2F12()
static char model[32]
Definition: subckt.c:76
struct sBSIM1model * B1nextModel
Definition: bsim1def.h:301
double D1iF12()
double DFi3F1()
double DFn2F1()
#define D_TWOF1
Definition: distodef.h:161
#define D_F1PF2
Definition: distodef.h:163
double * i1H1ptr
Definition: distodef.h:110
#define D_F1MF2
Definition: distodef.h:164
JOB * CKTcurJob
Definition: cktdefs.h:216
double * CKTrhs
Definition: cktdefs.h:97
#define D_THRF1
Definition: distodef.h:162
double D1nF12()
double D1n2F12()
double D1i3F1()