1 /**********
2 Copyright 1999 Regents of the University of California. All rights reserved.
3 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
4 File: b3soiddcvtest.c 98/5/01
5 Modified by Paolo Nenzi 2002
6 **********/
7
8 /*
9 * Revision 2.1 99/9/27 Pin Su
10 * BSIMDD2.1 release
11 */
12
13 #include "ngspice/ngspice.h"
14 #include "ngspice/cktdefs.h"
15 #include "b3soidddef.h"
16 #include "ngspice/trandefs.h"
17 #include "ngspice/const.h"
18 #include "ngspice/devdefs.h"
19 #include "ngspice/sperror.h"
20 #include "ngspice/suffix.h"
21
22
23 int
B3SOIDDconvTest(GENmodel * inModel,CKTcircuit * ckt)24 B3SOIDDconvTest(GENmodel *inModel, CKTcircuit *ckt)
25 {
26 B3SOIDDmodel *model = (B3SOIDDmodel*)inModel;
27 B3SOIDDinstance *here;
28 double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds;
29 double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs;
30
31 /* loop through all the B3SOIDD device models */
32 for (; model != NULL; model = B3SOIDDnextModel(model))
33 { /* loop through all the instances of the model */
34 for (here = B3SOIDDinstances(model); here != NULL ;
35 here=B3SOIDDnextInstance(here))
36 {
37 vbs = model->B3SOIDDtype
38 * (*(ckt->CKTrhsOld+here->B3SOIDDbNode)
39 - *(ckt->CKTrhsOld+here->B3SOIDDsNodePrime));
40 vgs = model->B3SOIDDtype
41 * (*(ckt->CKTrhsOld+here->B3SOIDDgNode)
42 - *(ckt->CKTrhsOld+here->B3SOIDDsNodePrime));
43 vds = model->B3SOIDDtype
44 * (*(ckt->CKTrhsOld+here->B3SOIDDdNodePrime)
45 - *(ckt->CKTrhsOld+here->B3SOIDDsNodePrime));
46 vbd = vbs - vds;
47 vgd = vgs - vds;
48 vgdo = *(ckt->CKTstate0 + here->B3SOIDDvgs)
49 - *(ckt->CKTstate0 + here->B3SOIDDvds);
50 delvbs = vbs - *(ckt->CKTstate0 + here->B3SOIDDvbs);
51 delvbd = vbd - *(ckt->CKTstate0 + here->B3SOIDDvbd);
52 delvgs = vgs - *(ckt->CKTstate0 + here->B3SOIDDvgs);
53 delvds = vds - *(ckt->CKTstate0 + here->B3SOIDDvds);
54 delvgd = vgd-vgdo;
55
56 cd = here->B3SOIDDcd;
57 if (here->B3SOIDDmode >= 0)
58 { cdhat = cd - here->B3SOIDDgjdb * delvbd
59 + here->B3SOIDDgmbs * delvbs + here->B3SOIDDgm * delvgs
60 + here->B3SOIDDgds * delvds;
61 }
62 else
63 { cdhat = cd - (here->B3SOIDDgjdb - here->B3SOIDDgmbs) * delvbd
64 - here->B3SOIDDgm * delvgd + here->B3SOIDDgds * delvds;
65 }
66
67 /*
68 * check convergence
69 */
70 if ((here->B3SOIDDoff == 0) || (!(ckt->CKTmode & MODEINITFIX)))
71 { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd))
72 + ckt->CKTabstol;
73 if (fabs(cdhat - cd) >= tol)
74 { ckt->CKTnoncon++;
75 return(OK);
76 }
77 cbs = here->B3SOIDDcjs;
78 cbd = here->B3SOIDDcjd;
79 cbhat = cbs + cbd + here->B3SOIDDgjdb * delvbd
80 + here->B3SOIDDgjsb * delvbs;
81 tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(cbs + cbd))
82 + ckt->CKTabstol;
83 if (fabs(cbhat - (cbs + cbd)) > tol)
84 { ckt->CKTnoncon++;
85 return(OK);
86 }
87 }
88 }
89 }
90 return(OK);
91 }
92
93