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)17B1pzLoad(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