1 /**********
2 Copyright 1990 Regents of the University of California.  All rights reserved.
3 Author: 1985 Hong J. Park, Thomas L. Quarles
4 **********/
5 /*
6  */
7 
8 #include "ngspice/ngspice.h"
9 #include "ngspice/cktdefs.h"
10 #include "bsim2def.h"
11 #include "ngspice/sperror.h"
12 #include "ngspice/suffix.h"
13 
14 
15 int
B2acLoad(GENmodel * inModel,CKTcircuit * ckt)16 B2acLoad(GENmodel *inModel, CKTcircuit *ckt)
17 {
18     B2model *model = (B2model*)inModel;
19     B2instance *here;
20     int xnrm;
21     int xrev;
22     double gdpr;
23     double gspr;
24     double gm;
25     double gds;
26     double gmbs;
27     double gbd;
28     double gbs;
29     double capbd;
30     double capbs;
31     double xcggb;
32     double xcgdb;
33     double xcgsb;
34     double xcbgb;
35     double xcbdb;
36     double xcbsb;
37     double xcddb;
38     double xcssb;
39     double xcdgb;
40     double xcsgb;
41     double xcdsb;
42     double xcsdb;
43     double cggb;
44     double cgdb;
45     double cgsb;
46     double cbgb;
47     double cbdb;
48     double cbsb;
49     double cddb;
50     double cdgb;
51     double cdsb;
52     double omega; /* angular fequency of the signal */
53 
54     double m;     /* parallel multiplier */
55 
56     omega = ckt->CKTomega;
57     for( ; model != NULL; model = B2nextModel(model)) {
58         for(here = B2instances(model); here!= NULL;
59                 here = B2nextInstance(here)) {
60 
61             if (here->B2mode >= 0) {
62                 xnrm=1;
63                 xrev=0;
64             } else {
65                 xnrm=0;
66                 xrev=1;
67             }
68             gdpr=here->B2drainConductance;
69             gspr=here->B2sourceConductance;
70             gm= *(ckt->CKTstate0 + here->B2gm);
71             gds= *(ckt->CKTstate0 + here->B2gds);
72             gmbs= *(ckt->CKTstate0 + here->B2gmbs);
73             gbd= *(ckt->CKTstate0 + here->B2gbd);
74             gbs= *(ckt->CKTstate0 + here->B2gbs);
75             capbd= *(ckt->CKTstate0 + here->B2capbd);
76             capbs= *(ckt->CKTstate0 + here->B2capbs);
77             /*
78              *    charge oriented model parameters
79              */
80 
81             cggb = *(ckt->CKTstate0 + here->B2cggb);
82             cgsb = *(ckt->CKTstate0 + here->B2cgsb);
83             cgdb = *(ckt->CKTstate0 + here->B2cgdb);
84 
85             cbgb = *(ckt->CKTstate0 + here->B2cbgb);
86             cbsb = *(ckt->CKTstate0 + here->B2cbsb);
87             cbdb = *(ckt->CKTstate0 + here->B2cbdb);
88 
89             cdgb = *(ckt->CKTstate0 + here->B2cdgb);
90             cdsb = *(ckt->CKTstate0 + here->B2cdsb);
91             cddb = *(ckt->CKTstate0 + here->B2cddb);
92 
93             xcdgb = (cdgb - here->pParam->B2GDoverlapCap) * omega;
94             xcddb = (cddb + capbd + here->pParam->B2GDoverlapCap) * omega;
95             xcdsb = cdsb * omega;
96             xcsgb = -(cggb + cbgb + cdgb + here->pParam->B2GSoverlapCap)
97 		  * omega;
98             xcsdb = -(cgdb + cbdb + cddb) * omega;
99             xcssb = (capbs + here->pParam->B2GSoverlapCap
100 		  - (cgsb+cbsb+cdsb)) * omega;
101             xcggb = (cggb + here->pParam->B2GDoverlapCap
102 		  + here->pParam->B2GSoverlapCap
103 		  + here->pParam->B2GBoverlapCap) * omega;
104             xcgdb = (cgdb - here->pParam->B2GDoverlapCap ) * omega;
105             xcgsb = (cgsb - here->pParam->B2GSoverlapCap) * omega;
106             xcbgb = (cbgb - here->pParam->B2GBoverlapCap) * omega;
107             xcbdb = (cbdb - capbd ) * omega;
108             xcbsb = (cbsb - capbs ) * omega;
109 
110             m = here->B2m;
111 
112             *(here->B2GgPtr +1) +=   m * (xcggb);
113             *(here->B2BbPtr +1) +=   m * (-xcbgb-xcbdb-xcbsb);
114             *(here->B2DPdpPtr +1) += m * (xcddb);
115             *(here->B2SPspPtr +1) += m * (xcssb);
116             *(here->B2GbPtr +1) +=   m * (-xcggb-xcgdb-xcgsb);
117             *(here->B2GdpPtr +1) +=  m * (xcgdb);
118             *(here->B2GspPtr +1) +=  m * (xcgsb);
119             *(here->B2BgPtr +1) +=   m * (xcbgb);
120             *(here->B2BdpPtr +1) +=  m * (xcbdb);
121             *(here->B2BspPtr +1) +=  m * (xcbsb);
122             *(here->B2DPgPtr +1) +=  m * (xcdgb);
123             *(here->B2DPbPtr +1) +=  m * (-xcdgb-xcddb-xcdsb);
124             *(here->B2DPspPtr +1) += m * (xcdsb);
125             *(here->B2SPgPtr +1) +=  m * (xcsgb);
126             *(here->B2SPbPtr +1) +=  m * (-xcsgb-xcsdb-xcssb);
127             *(here->B2SPdpPtr +1) += m * (xcsdb);
128             *(here->B2DdPtr) +=      m * (gdpr);
129             *(here->B2SsPtr) +=      m * (gspr);
130             *(here->B2BbPtr) +=      m * (gbd+gbs);
131             *(here->B2DPdpPtr) +=    m * (gdpr+gds+gbd+xrev*(gm+gmbs));
132             *(here->B2SPspPtr) +=    m * (gspr+gds+gbs+xnrm*(gm+gmbs));
133             *(here->B2DdpPtr) -=     m * (gdpr);
134             *(here->B2SspPtr) -=     m * (gspr);
135             *(here->B2BdpPtr) -=     m * (gbd);
136             *(here->B2BspPtr) -=     m * (gbs);
137             *(here->B2DPdPtr) -=     m * (gdpr);
138             *(here->B2DPgPtr) +=     m * ((xnrm-xrev)*gm);
139             *(here->B2DPbPtr) +=     m * (-gbd+(xnrm-xrev)*gmbs);
140             *(here->B2DPspPtr) +=    m * (-gds-xnrm*(gm+gmbs));
141             *(here->B2SPgPtr) +=     m * (-(xnrm-xrev)*gm);
142             *(here->B2SPsPtr) -=     m * (gspr);
143             *(here->B2SPbPtr) +=     m * (-gbs-(xnrm-xrev)*gmbs);
144             *(here->B2SPdpPtr) +=    m * (-gds-xrev*(gm+gmbs));
145 
146         }
147     }
148 return(OK);
149 }
150 
151 
152 
153