1 /**********
2 Copyright 1990 Regents of the University of California.  All rights reserved.
3 Author: 1985 Thomas L. Quarles
4 **********/
5 /*
6  */
7 
8 #include "ngspice/ngspice.h"
9 #include "ngspice/cktdefs.h"
10 #include "ngspice/complex.h"
11 #include "ngspice/sperror.h"
12 #include "bsim1def.h"
13 #include "ngspice/suffix.h"
14 
15 
16 int
B1pzLoad(GENmodel * inModel,CKTcircuit * ckt,SPcomplex * s)17 B1pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
18 {
19     B1model *model = (B1model*)inModel;
20     B1instance *here;
21     int xnrm;
22     int xrev;
23     double gdpr;
24     double gspr;
25     double gm;
26     double gds;
27     double gmbs;
28     double gbd;
29     double gbs;
30     double capbd;
31     double capbs;
32     double xcggb;
33     double xcgdb;
34     double xcgsb;
35     double xcbgb;
36     double xcbdb;
37     double xcbsb;
38     double xcddb;
39     double xcssb;
40     double xcdgb;
41     double xcsgb;
42     double xcdsb;
43     double xcsdb;
44     double cggb;
45     double cgdb;
46     double cgsb;
47     double cbgb;
48     double cbdb;
49     double cbsb;
50     double cddb;
51     double cdgb;
52     double cdsb;
53 
54     double m;
55 
56     for( ; model != NULL; model = B1nextModel(model)) {
57         for(here = B1instances(model); here!= NULL;
58                 here = B1nextInstance(here)) {
59 
60             if (here->B1mode >= 0) {
61                 xnrm=1;
62                 xrev=0;
63             } else {
64                 xnrm=0;
65                 xrev=1;
66             }
67             gdpr=here->B1drainConductance;
68             gspr=here->B1sourceConductance;
69             gm= *(ckt->CKTstate0 + here->B1gm);
70             gds= *(ckt->CKTstate0 + here->B1gds);
71             gmbs= *(ckt->CKTstate0 + here->B1gmbs);
72             gbd= *(ckt->CKTstate0 + here->B1gbd);
73             gbs= *(ckt->CKTstate0 + here->B1gbs);
74             capbd= *(ckt->CKTstate0 + here->B1capbd);
75             capbs= *(ckt->CKTstate0 + here->B1capbs);
76             /*
77              *    charge oriented model parameters
78              */
79 
80             cggb = *(ckt->CKTstate0 + here->B1cggb);
81             cgsb = *(ckt->CKTstate0 + here->B1cgsb);
82             cgdb = *(ckt->CKTstate0 + here->B1cgdb);
83 
84             cbgb = *(ckt->CKTstate0 + here->B1cbgb);
85             cbsb = *(ckt->CKTstate0 + here->B1cbsb);
86             cbdb = *(ckt->CKTstate0 + here->B1cbdb);
87 
88             cdgb = *(ckt->CKTstate0 + here->B1cdgb);
89             cdsb = *(ckt->CKTstate0 + here->B1cdsb);
90             cddb = *(ckt->CKTstate0 + here->B1cddb);
91 
92             xcdgb = (cdgb - here->B1GDoverlapCap) ;
93             xcddb = (cddb + capbd + here->B1GDoverlapCap) ;
94             xcdsb = cdsb ;
95             xcsgb = -(cggb + cbgb + cdgb + here->B1GSoverlapCap ) ;
96             xcsdb = -(cgdb + cbdb + cddb) ;
97             xcssb = (capbs + here->B1GSoverlapCap - (cgsb+cbsb+cdsb)) ;
98             xcggb = (cggb + here->B1GDoverlapCap + here->B1GSoverlapCap +
99                     here->B1GBoverlapCap) ;
100             xcgdb = (cgdb - here->B1GDoverlapCap ) ;
101             xcgsb = (cgsb - here->B1GSoverlapCap) ;
102             xcbgb = (cbgb - here->B1GBoverlapCap) ;
103             xcbdb = (cbdb - capbd ) ;
104             xcbsb = (cbsb - capbs ) ;
105 
106             m = here->B1m;
107 
108             *(here->B1GgPtr   ) +=   m * (xcggb * s->real);
109             *(here->B1GgPtr +1) +=   m * (xcggb * s->imag);
110             *(here->B1BbPtr   ) +=   m * ((-xcbgb-xcbdb-xcbsb) * s->real);
111             *(here->B1BbPtr +1) +=   m * ((-xcbgb-xcbdb-xcbsb) * s->imag);
112             *(here->B1DPdpPtr   ) += m * (xcddb * s->real);
113             *(here->B1DPdpPtr +1) += m * (xcddb * s->imag);
114             *(here->B1SPspPtr   ) += m * (xcssb * s->real);
115             *(here->B1SPspPtr +1) += m * (xcssb * s->imag);
116             *(here->B1GbPtr   ) +=   m * ((-xcggb-xcgdb-xcgsb) * s->real);
117             *(here->B1GbPtr +1) +=   m * ((-xcggb-xcgdb-xcgsb) * s->imag);
118             *(here->B1GdpPtr   ) +=  m * (xcgdb * s->real);
119             *(here->B1GdpPtr +1) +=  m * (xcgdb * s->imag);
120             *(here->B1GspPtr   ) +=  m * (xcgsb * s->real);
121             *(here->B1GspPtr +1) +=  m * (xcgsb * s->imag);
122             *(here->B1BgPtr   ) +=   m * (xcbgb * s->real);
123             *(here->B1BgPtr +1) +=   m * (xcbgb * s->imag);
124             *(here->B1BdpPtr   ) +=  m * (xcbdb * s->real);
125             *(here->B1BdpPtr +1) +=  m * (xcbdb * s->imag);
126             *(here->B1BspPtr   ) +=  m * (xcbsb * s->real);
127             *(here->B1BspPtr +1) +=  m * (xcbsb * s->imag);
128             *(here->B1DPgPtr   ) +=  m * (xcdgb * s->real);
129             *(here->B1DPgPtr +1) +=  m * (xcdgb * s->imag);
130             *(here->B1DPbPtr   ) +=  m * ((-xcdgb-xcddb-xcdsb) * s->real);
131             *(here->B1DPbPtr +1) +=  m * ((-xcdgb-xcddb-xcdsb) * s->imag);
132             *(here->B1DPspPtr   ) += m * (xcdsb * s->real);
133             *(here->B1DPspPtr +1) += m * (xcdsb * s->imag);
134             *(here->B1SPgPtr   ) +=  m * (xcsgb * s->real);
135             *(here->B1SPgPtr +1) +=  m * (xcsgb * s->imag);
136             *(here->B1SPbPtr   ) +=  m * ((-xcsgb-xcsdb-xcssb) * s->real);
137             *(here->B1SPbPtr +1) +=  m * ((-xcsgb-xcsdb-xcssb) * s->imag);
138             *(here->B1SPdpPtr   ) += m * (xcsdb * s->real);
139             *(here->B1SPdpPtr +1) += m * (xcsdb * s->imag);
140             *(here->B1DdPtr) +=      m * (gdpr);
141             *(here->B1SsPtr) +=      m * (gspr);
142             *(here->B1BbPtr) +=      m * (gbd+gbs);
143             *(here->B1DPdpPtr) +=    m * (gdpr+gds+gbd+xrev*(gm+gmbs));
144             *(here->B1SPspPtr) +=    m * (gspr+gds+gbs+xnrm*(gm+gmbs));
145             *(here->B1DdpPtr) -=     m * (gdpr);
146             *(here->B1SspPtr) -=     m * (gspr);
147             *(here->B1BdpPtr) -=     m * (gbd);
148             *(here->B1BspPtr) -=     m * (gbs);
149             *(here->B1DPdPtr) -=     m * (gdpr);
150             *(here->B1DPgPtr) +=     m * ((xnrm-xrev)*gm);
151             *(here->B1DPbPtr) +=     m * (-gbd+(xnrm-xrev)*gmbs);
152             *(here->B1DPspPtr) +=    m * (-gds-xnrm*(gm+gmbs));
153             *(here->B1SPgPtr) +=     m * (-(xnrm-xrev)*gm);
154             *(here->B1SPsPtr) -=     m * (gspr);
155             *(here->B1SPbPtr) +=     m * (-gbs-(xnrm-xrev)*gmbs);
156             *(here->B1SPdpPtr) +=    m * (-gds-xrev*(gm+gmbs));
157 
158         }
159     }
160     return(OK);
161 }
162