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

Go to the source code of this file.

Functions

int MOSconvTest (GENmodel *inModel, CKTcircuit *ckt)
 

Function Documentation

int MOSconvTest ( GENmodel inModel,
CKTcircuit ckt 
)

Definition at line 18 of file mosconv.c.

22 {
23  MOSmodel *model = (MOSmodel *)inModel;
24  MOSinstance *here;
25  double delvbs, delvbd, delvgs, delvds, delvgd;
26  double cbhat, cdhat;
27  double vbs, vbd, vgs, vds, vgd;
28  double tol, A1, A2, A3;
29 
30  if (ckt->CKTnoncon > 0)
31  /* something else didn't converge, bypass */
32  return (OK);
33 
34  for ( ; model != NULL; model = model->MOSnextModel) {
35  for (here = model->MOSinstances; here!= NULL;
36  here = here->MOSnextInstance) {
37 
38  if (model->MOStype > 0) {
39  vbs = *(ckt->CKTrhs + here->MOSbNode) -
40  *(ckt->CKTrhs + here->MOSsNodePrime);
41  vgs = *(ckt->CKTrhs + here->MOSgNode) -
42  *(ckt->CKTrhs + here->MOSsNodePrime);
43  vds = *(ckt->CKTrhs + here->MOSdNodePrime) -
44  *(ckt->CKTrhs + here->MOSsNodePrime);
45  }
46  else {
47  vbs = *(ckt->CKTrhs + here->MOSsNodePrime) -
48  *(ckt->CKTrhs + here->MOSbNode);
49  vgs = *(ckt->CKTrhs + here->MOSsNodePrime) -
50  *(ckt->CKTrhs + here->MOSgNode);
51  vds = *(ckt->CKTrhs + here->MOSsNodePrime) -
52  *(ckt->CKTrhs + here->MOSdNodePrime);
53  }
54  vbd = vbs - vds;
55  vgd = vgs - vds;
56 
57  delvbs = vbs - *(ckt->CKTstate0 + here->MOSvbs);
58  delvbd = vbd - *(ckt->CKTstate0 + here->MOSvbd);
59  delvgs = vgs - *(ckt->CKTstate0 + here->MOSvgs);
60  delvds = vds - *(ckt->CKTstate0 + here->MOSvds);
61  delvgd = vgd - (*(ckt->CKTstate0 + here->MOSvgs) -
62  *(ckt->CKTstate0 + here->MOSvds));
63 
64  if (here->MOSmode >= 0) {
65  cdhat = here->MOScd -
66  here->MOSgbd*delvbd + here->MOSgmbs*delvbs +
67  here->MOSgm*delvgs + here->MOSgds*delvds;
68  }
69  else {
70  cdhat = here->MOScd -
71  (here->MOSgbd - here->MOSgmbs)*delvbd -
72  here->MOSgm*delvgd + here->MOSgds*delvds;
73  }
74 
75  /*
76  * check convergence
77  */
78  A1 = FABS(cdhat);
79  A2 = FABS(here->MOScd);
80  A3 = cdhat - here->MOScd;
81  A3 = FABS(A3);
82  tol = ckt->CKTreltol*MAX(A1,A2) + ckt->CKTabstol;
83  if (A3 >= tol) {
84  ckt->CKTnoncon++;
85  ckt->CKTtroubleElt = (GENinstance *) here;
86  /* no reason to continue, we haven't converged */
87  return (OK);
88  }
89 
90  cbhat = here->MOScbs + here->MOScbd +
91  here->MOSgbd*delvbd + here->MOSgbs*delvbs;
92 
93  A1 = FABS(cbhat);
94  A2 = here->MOScbs + here->MOScbd;
95  A2 = FABS(A2);
96  A3 = cbhat - (here->MOScbs + here->MOScbd);
97  A3 = FABS(A3);
98  tol = ckt->CKTreltol*MAX(A1,A2) + ckt->CKTabstol;
99  if (A3 > tol) {
100  ckt->CKTnoncon++;
101  ckt->CKTtroubleElt = (GENinstance *) here;
102  /* no reason to continue, we haven't converged*/
103  return (OK);
104  }
105  }
106  }
107  return (OK);
108 }
struct sMOSmodel * MOSnextModel
Definition: mosdefs.h:274
MOSinstance * MOSinstances
Definition: mosdefs.h:276
double MOSgm
Definition: mosdefs.h:74
double MOSgmbs
Definition: mosdefs.h:73
GENinstance * CKTtroubleElt
Definition: cktdefs.h:229
double MOScd
Definition: mosdefs.h:70
#define MAX(a, b)
Definition: spdefs.h:135
double MOSgds
Definition: mosdefs.h:75
double MOScbd
Definition: mosdefs.h:72
int MOStype
Definition: mosdefs.h:279
double CKTreltol
Definition: cktdefs.h:183
int MOSdNodePrime
Definition: mosdefs.h:29
double CKTabstol
Definition: cktdefs.h:180
#define OK
Definition: iferrmsg.h:17
int MOSgNode
Definition: mosdefs.h:26
double MOSgbs
Definition: mosdefs.h:77
#define NULL
Definition: spdefs.h:121
double MOSgbd
Definition: mosdefs.h:76
int MOSsNodePrime
Definition: mosdefs.h:30
static char model[32]
Definition: subckt.c:76
int MOSmode
Definition: mosdefs.h:32
#define FABS(a)
Definition: util.h:41
int MOSbNode
Definition: mosdefs.h:28
double MOScbs
Definition: mosdefs.h:71
int CKTnoncon
Definition: cktdefs.h:203
struct sMOSinstance * MOSnextInstance
Definition: mosdefs.h:20
double * CKTrhs
Definition: cktdefs.h:97