Jspice3
b2cvtest.c File Reference
#include "spice.h"
#include <stdio.h>
#include <math.h>
#include "bsim2def.h"
#include "const.h"
#include "sperror.h"
#include "util.h"
Include dependency graph for b2cvtest.c:

Go to the source code of this file.

Functions

int B2convTest (GENmodel *inModel, CKTcircuit *ckt)
 

Function Documentation

int B2convTest ( GENmodel inModel,
CKTcircuit ckt 
)

Definition at line 18 of file b2cvtest.c.

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 }
B2instance * B2instances
Definition: bsim2def.h:226
struct sBSIM2instance * B2nextInstance
Definition: bsim2def.h:19
GENinstance * CKTtroubleElt
Definition: cktdefs.h:229
#define MAX(a, b)
Definition: spdefs.h:135
double CKTreltol
Definition: cktdefs.h:183
int B2type
Definition: bsim2def.h:229
double CKTabstol
Definition: cktdefs.h:180
#define OK
Definition: iferrmsg.h:17
double * CKTrhsOld
Definition: cktdefs.h:98
#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 CKTnoncon
Definition: cktdefs.h:203
long CKTmode
Definition: cktdefs.h:139
int B2sNodePrime
Definition: bsim2def.h:29
int B2dNodePrime
Definition: bsim2def.h:28