1 /**********
2 Copyright 1999 Regents of the University of California.  All rights reserved.
3 Author: Weidong Liu and Pin Su         Feb 1999
4 Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen Tang
5 File: b3soiddpzld.c          98/5/01
6 Modified by Paolo Nenzi 2002
7 **********/
8 
9 /*
10  * Revision 2.1  99/9/27 Pin Su
11  * BSIMDD2.1 release
12  */
13 
14 #include "ngspice/ngspice.h"
15 #include "ngspice/cktdefs.h"
16 #include "ngspice/complex.h"
17 #include "ngspice/sperror.h"
18 #include "b3soidddef.h"
19 #include "ngspice/suffix.h"
20 
21 int
B3SOIDDpzLoad(GENmodel * inModel,CKTcircuit * ckt,SPcomplex * s)22 B3SOIDDpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
23 {
24 B3SOIDDmodel *model = (B3SOIDDmodel*)inModel;
25 B3SOIDDinstance *here;
26 double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb;
27 double gdpr, gspr, gds, gbd, gbs, capbd = 0.0, capbs = 0.0;
28 double xcsgb, xcdsb, xcsdb;
29 double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb;
30 double GSoverlapCap, GDoverlapCap, GBoverlapCap = 0.0;
31 double FwdSum, RevSum, Gm, Gmbs;
32 
33 double m;
34 
35     NG_IGNORE(ckt);
36 
37     for (; model != NULL; model = B3SOIDDnextModel(model))
38     {    for (here = B3SOIDDinstances(model); here!= NULL;
39               here = B3SOIDDnextInstance(here))
40 	 {
41             if (here->B3SOIDDmode >= 0)
42 	    {   Gm = here->B3SOIDDgm;
43 		Gmbs = here->B3SOIDDgmbs;
44 		FwdSum = Gm + Gmbs;
45 		RevSum = 0.0;
46                 cggb = here->B3SOIDDcggb;
47                 cgsb = here->B3SOIDDcgsb;
48                 cgdb = here->B3SOIDDcgdb;
49 
50                 cbgb = here->B3SOIDDcbgb;
51                 cbsb = here->B3SOIDDcbsb;
52                 cbdb = here->B3SOIDDcbdb;
53 
54                 cdgb = here->B3SOIDDcdgb;
55                 cdsb = here->B3SOIDDcdsb;
56                 cddb = here->B3SOIDDcddb;
57             }
58 	    else
59 	    {   Gm = -here->B3SOIDDgm;
60 		Gmbs = -here->B3SOIDDgmbs;
61 		FwdSum = 0.0;
62 		RevSum = -Gm - Gmbs;
63                 cggb = here->B3SOIDDcggb;
64                 cgsb = here->B3SOIDDcgdb;
65                 cgdb = here->B3SOIDDcgsb;
66 
67                 cbgb = here->B3SOIDDcbgb;
68                 cbsb = here->B3SOIDDcbdb;
69                 cbdb = here->B3SOIDDcbsb;
70 
71                 cdgb = -(here->B3SOIDDcdgb + cggb + cbgb);
72                 cdsb = -(here->B3SOIDDcddb + cgsb + cbsb);
73                 cddb = -(here->B3SOIDDcdsb + cgdb + cbdb);
74             }
75             gdpr=here->B3SOIDDdrainConductance;
76             gspr=here->B3SOIDDsourceConductance;
77             gds= here->B3SOIDDgds;
78             gbd= here->B3SOIDDgjdb;
79             gbs= here->B3SOIDDgjsb;
80 #ifdef BULKCODE
81             capbd= here->B3SOIDDcapbd;
82             capbs= here->B3SOIDDcapbs;
83 #endif
84 	    GSoverlapCap = here->B3SOIDDcgso;
85 	    GDoverlapCap = here->B3SOIDDcgdo;
86 #ifdef BULKCODE
87 	    GBoverlapCap = here->pParam->B3SOIDDcgbo;
88 #endif
89 
90             xcdgb = (cdgb - GDoverlapCap);
91             xcddb = (cddb + capbd + GDoverlapCap);
92             xcdsb = cdsb;
93             xcsgb = -(cggb + cbgb + cdgb + GSoverlapCap);
94             xcsdb = -(cgdb + cbdb + cddb);
95             xcssb = (capbs + GSoverlapCap - (cgsb+cbsb+cdsb));
96             xcggb = (cggb + GDoverlapCap + GSoverlapCap + GBoverlapCap);
97             xcgdb = (cgdb - GDoverlapCap);
98             xcgsb = (cgsb - GSoverlapCap);
99             xcbgb = (cbgb - GBoverlapCap);
100             xcbdb = (cbdb - capbd);
101             xcbsb = (cbsb - capbs);
102 
103             m = here->B3SOIDDm;
104 
105             *(here->B3SOIDDGgPtr ) += m * (xcggb * s->real);
106             *(here->B3SOIDDGgPtr +1) += m * (xcggb * s->imag);
107             *(here->B3SOIDDBbPtr ) += m * ((-xcbgb-xcbdb-xcbsb) * s->real);
108             *(here->B3SOIDDBbPtr +1) += m * ((-xcbgb-xcbdb-xcbsb) * s->imag);
109             *(here->B3SOIDDDPdpPtr ) += m * (xcddb * s->real);
110             *(here->B3SOIDDDPdpPtr +1) += m * (xcddb * s->imag);
111             *(here->B3SOIDDSPspPtr ) += m * (xcssb * s->real);
112             *(here->B3SOIDDSPspPtr +1) += m * (xcssb * s->imag);
113             *(here->B3SOIDDGbPtr ) += m * ((-xcggb-xcgdb-xcgsb) * s->real);
114             *(here->B3SOIDDGbPtr +1) += m * ((-xcggb-xcgdb-xcgsb) * s->imag);
115             *(here->B3SOIDDGdpPtr ) += m * (xcgdb * s->real);
116             *(here->B3SOIDDGdpPtr +1) += m * (xcgdb * s->imag);
117             *(here->B3SOIDDGspPtr ) += m * (xcgsb * s->real);
118             *(here->B3SOIDDGspPtr +1) += m * (xcgsb * s->imag);
119             *(here->B3SOIDDBgPtr ) += m * (xcbgb * s->real);
120             *(here->B3SOIDDBgPtr +1) += m * (xcbgb * s->imag);
121             *(here->B3SOIDDBdpPtr ) += m * (xcbdb * s->real);
122             *(here->B3SOIDDBdpPtr +1) += m * (xcbdb * s->imag);
123             *(here->B3SOIDDBspPtr ) += m * (xcbsb * s->real);
124             *(here->B3SOIDDBspPtr +1) += (xcbsb * s->imag);
125             *(here->B3SOIDDDPgPtr ) += m * (xcdgb * s->real);
126             *(here->B3SOIDDDPgPtr +1) += m * (xcdgb * s->imag);
127             *(here->B3SOIDDDPbPtr ) += m * ((-xcdgb-xcddb-xcdsb) * s->real);
128             *(here->B3SOIDDDPbPtr +1) += m * ((-xcdgb-xcddb-xcdsb) * s->imag);
129             *(here->B3SOIDDDPspPtr ) += m * (xcdsb * s->real);
130             *(here->B3SOIDDDPspPtr +1) += m * (xcdsb * s->imag);
131             *(here->B3SOIDDSPgPtr ) += m * (xcsgb * s->real);
132             *(here->B3SOIDDSPgPtr +1) += m * (xcsgb * s->imag);
133             *(here->B3SOIDDSPbPtr ) += m * ((-xcsgb-xcsdb-xcssb) * s->real);
134             *(here->B3SOIDDSPbPtr +1) += m * ((-xcsgb-xcsdb-xcssb) * s->imag);
135             *(here->B3SOIDDSPdpPtr ) += m * (xcsdb * s->real);
136             *(here->B3SOIDDSPdpPtr +1) += m * (xcsdb * s->imag);
137             *(here->B3SOIDDDdPtr) += m * gdpr;
138             *(here->B3SOIDDSsPtr) += m * gspr;
139             *(here->B3SOIDDBbPtr) += m * (gbd + gbs);
140             *(here->B3SOIDDDPdpPtr) += m * (gdpr + gds + gbd + RevSum);
141             *(here->B3SOIDDSPspPtr) += m * (gspr + gds + gbs + FwdSum);
142             *(here->B3SOIDDDdpPtr) -= m * gdpr;
143             *(here->B3SOIDDSspPtr) -= m * gspr;
144             *(here->B3SOIDDBdpPtr) -= m * gbd;
145             *(here->B3SOIDDBspPtr) -= m * gbs;
146             *(here->B3SOIDDDPdPtr) -= m * gdpr;
147             *(here->B3SOIDDDPgPtr) += m * Gm;
148             *(here->B3SOIDDDPbPtr) -= m * (gbd - Gmbs);
149             *(here->B3SOIDDDPspPtr) -= m * (gds + FwdSum);
150             *(here->B3SOIDDSPgPtr) -= m * Gm;
151             *(here->B3SOIDDSPsPtr) -= m * gspr;
152             *(here->B3SOIDDSPbPtr) -= m * (gbs + Gmbs);
153             *(here->B3SOIDDSPdpPtr) -= m * (gds + RevSum);
154 
155         }
156     }
157     return(OK);
158 }
159 
160 
161