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