Jspice3
b2cvtest.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 Hong June Park, Thomas L. Quarles
5  1993 Stephen R. Whiteley
6 ****************************************************************************/
7 
8 #include "spice.h"
9 #include <stdio.h>
10 #include <math.h>
11 #include "bsim2def.h"
12 #include "const.h"
13 #include "sperror.h"
14 #include "util.h"
15 
16 
17 int
18 B2convTest(inModel,ckt)
19 
20  GENmodel *inModel;
21  register CKTcircuit *ckt;
22 
23  /* actually load the current value into the
24  * sparse matrix previously provided
25  */
26 {
27  register B2model *model = (B2model*)inModel;
28  register B2instance *here;
29  double cbd;
30  double cbhat;
31  double cbs;
32  double cd;
33  double cdhat;
34  double delvbd;
35  double delvbs;
36  double delvds;
37  double delvgd;
38  double delvgs;
39  double tol;
40  double vbd;
41  double vbs;
42  double vds;
43  double vgd;
44  double vgdo;
45  double vgs;
46 
47 
48  /* loop through all the B2 device models */
49  for( ; model != NULL; model = model->B2nextModel ) {
50 
51  /* loop through all the instances of the model */
52  for (here = model->B2instances; here != NULL ;
53  here=here->B2nextInstance) {
54 
55  vbs = model->B2type * (
56  *(ckt->CKTrhsOld+here->B2bNode) -
57  *(ckt->CKTrhsOld+here->B2sNodePrime));
58  vgs = model->B2type * (
59  *(ckt->CKTrhsOld+here->B2gNode) -
60  *(ckt->CKTrhsOld+here->B2sNodePrime));
61  vds = model->B2type * (
62  *(ckt->CKTrhsOld+here->B2dNodePrime) -
63  *(ckt->CKTrhsOld+here->B2sNodePrime));
64  vbd=vbs-vds;
65  vgd=vgs-vds;
66  vgdo = *(ckt->CKTstate0 + here->B2vgs) -
67  *(ckt->CKTstate0 + here->B2vds);
68  delvbs = vbs - *(ckt->CKTstate0 + here->B2vbs);
69  delvbd = vbd - *(ckt->CKTstate0 + here->B2vbd);
70  delvgs = vgs - *(ckt->CKTstate0 + here->B2vgs);
71  delvds = vds - *(ckt->CKTstate0 + here->B2vds);
72  delvgd = vgd-vgdo;
73 
74  if (here->B2mode >= 0) {
75  cdhat=
76  *(ckt->CKTstate0 + here->B2cd) -
77  *(ckt->CKTstate0 + here->B2gbd) * delvbd +
78  *(ckt->CKTstate0 + here->B2gmbs) * delvbs +
79  *(ckt->CKTstate0 + here->B2gm) * delvgs +
80  *(ckt->CKTstate0 + here->B2gds) * delvds ;
81  } else {
82  cdhat=
83  *(ckt->CKTstate0 + here->B2cd) -
84  ( *(ckt->CKTstate0 + here->B2gbd) -
85  *(ckt->CKTstate0 + here->B2gmbs)) * delvbd -
86  *(ckt->CKTstate0 + here->B2gm) * delvgd +
87  *(ckt->CKTstate0 + here->B2gds) * delvds;
88  }
89  cbhat=
90  *(ckt->CKTstate0 + here->B2cbs) +
91  *(ckt->CKTstate0 + here->B2cbd) +
92  *(ckt->CKTstate0 + here->B2gbd) * delvbd +
93  *(ckt->CKTstate0 + here->B2gbs) * delvbs ;
94 
95  cd = *(ckt->CKTstate0 + here->B2cd);
96  cbs = *(ckt->CKTstate0 + here->B2cbs);
97  cbd = *(ckt->CKTstate0 + here->B2cbd);
98  /*
99  * check convergence
100  */
101  /* troubleElts new in 3f2 */
102  if ( (here->B2off == 0) || (!(ckt->CKTmode & MODEINITFIX)) ){
103  tol=ckt->CKTreltol*MAX(FABS(cdhat),FABS(cd))+ckt->CKTabstol;
104  if (FABS(cdhat-cd) >= tol) {
105  ckt->CKTnoncon++;
106  ckt->CKTtroubleElt = (GENinstance *) here;
107  return(OK);
108  }
109  tol=ckt->CKTreltol*MAX(FABS(cbhat),FABS(cbs+cbd))+
110  ckt->CKTabstol;
111  if (FABS(cbhat-(cbs+cbd)) > tol) {
112  ckt->CKTnoncon++;
113  ckt->CKTtroubleElt = (GENinstance *) here;
114  return(OK);
115  }
116  }
117  }
118  }
119  return(OK);
120 }
121 
B2instance * B2instances
Definition: bsim2def.h:226
struct sBSIM2instance * B2nextInstance
Definition: bsim2def.h:19
#define MAX(a, b)
Definition: spdefs.h:135
int B2type
Definition: bsim2def.h:229
#define OK
Definition: iferrmsg.h:17
#define NULL
Definition: spdefs.h:121
static char model[32]
Definition: subckt.c:76
#define MODEINITFIX
Definition: cktdefs.h:158
struct sBSIM2model * B2nextModel
Definition: bsim2def.h:224
#define FABS(a)
Definition: util.h:41
int B2convTest(GENmodel *inModel, CKTcircuit *ckt)
Definition: b2cvtest.c:18
int B2sNodePrime
Definition: bsim2def.h:29
int B2dNodePrime
Definition: bsim2def.h:28