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