Jspice3
bjtdisto.c
Go to the documentation of this file.
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
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 }
int BJTdSetup(GENmodel *inModel, CKTcircuit *ckt)
Definition: bjtdset.c:26
BJTinstance * BJTinstances
Definition: bjtdefs.h:259
double DFnF12()
int BJTdisto(int mode, GENmodel *genmodel, CKTcircuit *ckt)
Definition: bjtdisto.c:21
#define D_SETUP
Definition: distodef.h:158
double D1n2F1()
struct sBJTmodel * BJTnextModel
Definition: bjtdefs.h:257
double * i1H2ptr
Definition: distodef.h:116
if(TDesc==NULL)
Definition: cd.c:1326
double DFn2F12()
IFfrontEnd * SPfrontEnd
Definition: main.c:917
double D1n3F1()
#define E_BADPARM
Definition: iferrmsg.h:26
double * r1H1ptr
Definition: distodef.h:109
double DFi2F1()
double DFn3F1()
double * r2H1m2ptr
Definition: distodef.h:119
double * r1H2ptr
Definition: distodef.h:115
#define OK
Definition: iferrmsg.h:17
double BJTexcessPhaseFactor
Definition: bjtdefs.h:313
#define D_2F1MF2
Definition: distodef.h:165
#define NULL
Definition: spdefs.h:121
double * i2H1m2ptr
Definition: distodef.h:120
double cos()
double D1i2F12()
double Domega2
Definition: distodef.h:107
double D1i2F1()
double sin()
double DFiF12()
double * r2H11ptr
Definition: distodef.h:111
double * i2H11ptr
Definition: distodef.h:112
double DFi2F12()
static char model[32]
Definition: subckt.c:76
double BJTbaseResist
Definition: bjtdefs.h:278
double D1iF12()
double DFi3F1()
double DFn2F1()
#define D_TWOF1
Definition: distodef.h:161
#define D_F1PF2
Definition: distodef.h:163
double * i1H1ptr
Definition: distodef.h:110
#define D_F1MF2
Definition: distodef.h:164
double Domega1
Definition: distodef.h:106
double BJTminBaseResist
Definition: bjtdefs.h:280
#define D_THRF1
Definition: distodef.h:162
double D1nF12()
double D1n2F12()
double D1i3F1()