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: 1985 Thomas L. Quarles
5          1993 Stephen R. Whiteley
6 ****************************************************************************/
7 
8 /*
9  * This routine performs the device convergence test for
10  * BJTs in the circuit.
11  */
12 
13 #include "spice.h"
14 #include <stdio.h>
15 #include "bjtdefs.h"
16 #include "sperror.h"
17 #include "util.h"
18 
19 
20 int
BJTconvTest(inModel,ckt)21 BJTconvTest(inModel,ckt)
22 
23 GENmodel *inModel;
24 CKTcircuit *ckt;
25 {
26     BJTinstance *here;
27     BJTmodel *model = (BJTmodel *) inModel;
28     double tol;
29     double c0;
30     double chat;
31     double vbe;
32     double vbc;
33     double delvbe;
34     double delvbc;
35     double A1, A2;
36 
37     for ( ; model != NULL; model = model->BJTnextModel) {
38         for (here = model->BJTinstances; here != NULL;
39                 here = here->BJTnextInstance) {
40 
41             if (model->BJTtype > 0) {
42                 vbe = *(ckt->CKTrhsOld + here->BJTbasePrimeNode) -
43                     *(ckt->CKTrhsOld + here->BJTemitPrimeNode);
44                 vbc = *(ckt->CKTrhsOld + here->BJTbasePrimeNode) -
45                     *(ckt->CKTrhsOld + here->BJTcolPrimeNode);
46             }
47             else {
48                 vbe = *(ckt->CKTrhsOld + here->BJTemitPrimeNode) -
49                     *(ckt->CKTrhsOld + here->BJTbasePrimeNode);
50                 vbc = *(ckt->CKTrhsOld + here->BJTcolPrimeNode) -
51                     *(ckt->CKTrhsOld + here->BJTbasePrimeNode);
52             }
53             delvbe = vbe - *(ckt->CKTstate0 + here->BJTvbe);
54             delvbc = vbc - *(ckt->CKTstate0 + here->BJTvbc);
55 
56             /*
57              *   check convergence, collector current
58              */
59             c0 = here->BJTcc;
60             chat = c0 +
61                 (here->BJTgm + here->BJTgo)*delvbe -
62                 (here->BJTgo + here->BJTgmu)*delvbc;
63 
64             A1 = FABS(chat);
65             A2 = FABS(c0);
66             tol = ckt->CKTreltol*MAX(A1,A2) + ckt->CKTabstol;
67 
68             A1 = chat - c0;
69             if (FABS(A1) > tol) {
70                 ckt->CKTnoncon++;
71                 ckt->CKTtroubleElt = (GENinstance *) here;
72                 return (OK); /* no reason to continue - we've failed... */
73             }
74 
75             /*
76              *   check convergence, base current
77              */
78             c0 = here->BJTcb;
79             chat = c0 +
80                 here->BJTgpi*delvbe +
81                 here->BJTgmu*delvbc;
82 
83             A1 = FABS(chat);
84             A2 = FABS(c0);
85             tol = ckt->CKTreltol*MAX(A1,A2) + ckt->CKTabstol;
86 
87             A1 = chat - c0;
88             if (FABS(A1) > tol) {
89                 ckt->CKTnoncon++;
90                 ckt->CKTtroubleElt = (GENinstance *) here;
91                 return (OK); /* no reason to continue - we've failed... */
92             }
93         }
94     }
95     return (OK);
96 }
97