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