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)16B2acLoad(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