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