Jspice3
bjtconv.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: 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
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 }
BJTinstance * BJTinstances
Definition: bjtdefs.h:259
int BJTemitPrimeNode
Definition: bjtdefs.h:30
double BJTcc
Definition: bjtdefs.h:54
GENinstance * CKTtroubleElt
Definition: cktdefs.h:229
int BJTtype
Definition: bjtdefs.h:262
struct sBJTmodel * BJTnextModel
Definition: bjtdefs.h:257
#define MAX(a, b)
Definition: spdefs.h:135
double CKTreltol
Definition: cktdefs.h:183
int BJTbasePrimeNode
Definition: bjtdefs.h:29
struct sBJTinstance * BJTnextInstance
Definition: bjtdefs.h:20
int BJTconvTest(GENmodel *inModel, CKTcircuit *ckt)
Definition: bjtconv.c:21
double CKTabstol
Definition: cktdefs.h:180
#define OK
Definition: iferrmsg.h:17
double * CKTrhsOld
Definition: cktdefs.h:98
double BJTgmu
Definition: bjtdefs.h:57
int BJTcolPrimeNode
Definition: bjtdefs.h:28
#define NULL
Definition: spdefs.h:121
double BJTgo
Definition: bjtdefs.h:59
double BJTgpi
Definition: bjtdefs.h:56
double BJTgm
Definition: bjtdefs.h:58
static char model[32]
Definition: subckt.c:76
#define FABS(a)
Definition: util.h:41
double BJTcb
Definition: bjtdefs.h:55
int CKTnoncon
Definition: cktdefs.h:203