📄 mos9load.c
字号:
if(((ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) || fabs(delvbd) >= ckt->CKTreltol * MAX(fabs(vbd), fabs(*(ckt->CKTstate0+here->MOS9vbd)))+ ckt->CKTvoltTol)|| senflag )#endif /*CAPBYPASS*/ /* can't bypass the diode capacitance calculations */ {#ifdef CAPZEROBYPASS if(here->MOS9Cbd != 0 || here->MOS9Cbdsw != 0 ) {#endif /*CAPZEROBYPASS*/ if (vbd < here->MOS9tDepCap) { arg=1-vbd/here->MOS9tBulkPot; /* * the following block looks somewhat long and messy, * but since most users use the default grading * coefficients of .5, and sqrt is MUCH faster than an * exp(log()) we use this special case code to buy time. * (as much as 10% of total job time!) */#ifndef NOSQRT if(model->MOS9bulkJctBotGradingCoeff == .5 && model->MOS9bulkJctSideGradingCoeff == .5) { sarg = sargsw = 1/sqrt(arg); } else { if(model->MOS9bulkJctBotGradingCoeff == .5) { sarg = 1/sqrt(arg); } else {#endif /*NOSQRT*/ sarg = exp(-model->MOS9bulkJctBotGradingCoeff* log(arg));#ifndef NOSQRT } if(model->MOS9bulkJctSideGradingCoeff == .5) { sargsw = 1/sqrt(arg); } else {#endif /*NOSQRT*/ sargsw =exp(-model->MOS9bulkJctSideGradingCoeff* log(arg));#ifndef NOSQRT } }#endif /*NOSQRT*/ *(ckt->CKTstate0 + here->MOS9qbd) = here->MOS9tBulkPot*(here->MOS9Cbd* (1-arg*sarg) /(1-model->MOS9bulkJctBotGradingCoeff) +here->MOS9Cbdsw* (1-arg*sargsw) /(1-model->MOS9bulkJctSideGradingCoeff)); here->MOS9capbd=here->MOS9Cbd*sarg+ here->MOS9Cbdsw*sargsw; } else { *(ckt->CKTstate0 + here->MOS9qbd) = here->MOS9f4d + vbd * (here->MOS9f2d + vbd * here->MOS9f3d/2); here->MOS9capbd=here->MOS9f2d + vbd * here->MOS9f3d; }#ifdef CAPZEROBYPASS } else { *(ckt->CKTstate0 + here->MOS9qbd) = 0; here->MOS9capbd = 0; }#endif /*CAPZEROBYPASS*/ } if(SenCond && (ckt->CKTsenInfo->SENmode==TRANSEN)) goto next2; if ( ckt->CKTmode & MODETRAN ) { /* (above only excludes tranop, since we're only at this * point if tran or tranop ) */ /* * calculate equivalent conductances and currents for * depletion capacitors */ /* integrate the capacitors and save results */ error = NIintegrate(ckt,&geq,&ceq,here->MOS9capbd, here->MOS9qbd); if(error) return(error); here->MOS9gbd += geq; here->MOS9cbd += *(ckt->CKTstate0 + here->MOS9cqbd); here->MOS9cd -= *(ckt->CKTstate0 + here->MOS9cqbd); error = NIintegrate(ckt,&geq,&ceq,here->MOS9capbs, here->MOS9qbs); if(error) return(error); here->MOS9gbs += geq; here->MOS9cbs += *(ckt->CKTstate0 + here->MOS9cqbs); } } if(SenCond) goto next2; /* * check convergence */ if ( (here->MOS9off == 0) || (!(ckt->CKTmode & (MODEINITFIX|MODEINITSMSIG))) ){ if (Check == 1) { ckt->CKTnoncon++; ckt->CKTtroubleElt = (GENinstance *) here; } } /* save things away for next time */next2: *(ckt->CKTstate0 + here->MOS9vbs) = vbs; *(ckt->CKTstate0 + here->MOS9vbd) = vbd; *(ckt->CKTstate0 + here->MOS9vgs) = vgs; *(ckt->CKTstate0 + here->MOS9vds) = vds; /* * meyer's capacitor model */ if ( ckt->CKTmode & (MODETRAN | MODETRANOP | MODEINITSMSIG) ) { /* * calculate meyer's capacitors */ /* * new cmeyer - this just evaluates at the current time, * expects you to remember values from previous time * returns 1/2 of non-constant portion of capacitance * you must add in the other half from previous time * and the constant part */ if (here->MOS9mode > 0){ DEVqmeyer (vgs,vgd,vgb,von,vdsat, (ckt->CKTstate0 + here->MOS9capgs), (ckt->CKTstate0 + here->MOS9capgd), (ckt->CKTstate0 + here->MOS9capgb), here->MOS9tPhi,OxideCap); } else { DEVqmeyer (vgd,vgs,vgb,von,vdsat, (ckt->CKTstate0 + here->MOS9capgd), (ckt->CKTstate0 + here->MOS9capgs), (ckt->CKTstate0 + here->MOS9capgb), here->MOS9tPhi,OxideCap); } vgs1 = *(ckt->CKTstate1 + here->MOS9vgs); vgd1 = vgs1 - *(ckt->CKTstate1 + here->MOS9vds); vgb1 = vgs1 - *(ckt->CKTstate1 + here->MOS9vbs); if(ckt->CKTmode & MODETRANOP) { capgs = 2 * *(ckt->CKTstate0+here->MOS9capgs)+ GateSourceOverlapCap ; capgd = 2 * *(ckt->CKTstate0+here->MOS9capgd)+ GateDrainOverlapCap ; capgb = 2 * *(ckt->CKTstate0+here->MOS9capgb)+ GateBulkOverlapCap ; } else { capgs = ( *(ckt->CKTstate0+here->MOS9capgs)+ *(ckt->CKTstate1+here->MOS9capgs) + GateSourceOverlapCap ); capgd = ( *(ckt->CKTstate0+here->MOS9capgd)+ *(ckt->CKTstate1+here->MOS9capgd) + GateDrainOverlapCap ); capgb = ( *(ckt->CKTstate0+here->MOS9capgb)+ *(ckt->CKTstate1+here->MOS9capgb) + GateBulkOverlapCap ); } if(ckt->CKTsenInfo){ here->MOS9cgs = capgs; here->MOS9cgd = capgd; here->MOS9cgb = capgb; } /* * store small-signal parameters (for meyer's model) * all parameters already stored, so done... */ if(SenCond){ if(ckt->CKTsenInfo->SENmode & (DCSEN|ACSEN)) { continue; } }#ifndef PREDICTOR if (ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) { *(ckt->CKTstate0 + here->MOS9qgs) = (1+xfact) * *(ckt->CKTstate1 + here->MOS9qgs) - xfact * *(ckt->CKTstate2 + here->MOS9qgs); *(ckt->CKTstate0 + here->MOS9qgd) = (1+xfact) * *(ckt->CKTstate1 + here->MOS9qgd) - xfact * *(ckt->CKTstate2 + here->MOS9qgd); *(ckt->CKTstate0 + here->MOS9qgb) = (1+xfact) * *(ckt->CKTstate1 + here->MOS9qgb) - xfact * *(ckt->CKTstate2 + here->MOS9qgb); } else {#endif /*PREDICTOR*/ if(ckt->CKTmode & MODETRAN) { *(ckt->CKTstate0 + here->MOS9qgs) = (vgs-vgs1)*capgs + *(ckt->CKTstate1 + here->MOS9qgs) ; *(ckt->CKTstate0 + here->MOS9qgd) = (vgd-vgd1)*capgd + *(ckt->CKTstate1 + here->MOS9qgd) ; *(ckt->CKTstate0 + here->MOS9qgb) = (vgb-vgb1)*capgb + *(ckt->CKTstate1 + here->MOS9qgb) ; } else { /* TRANOP only */ *(ckt->CKTstate0 + here->MOS9qgs) = vgs*capgs; *(ckt->CKTstate0 + here->MOS9qgd) = vgd*capgd; *(ckt->CKTstate0 + here->MOS9qgb) = vgb*capgb; }#ifndef PREDICTOR }#endif /*PREDICTOR*/ }bypass: if(SenCond) continue; if ( (ckt->CKTmode & (MODEINITTRAN)) || (! (ckt->CKTmode & (MODETRAN)) ) ) { /* * initialize to zero charge conductances * and current */ gcgs=0; ceqgs=0; gcgd=0; ceqgd=0; gcgb=0; ceqgb=0; } else { if(capgs == 0) *(ckt->CKTstate0 + here->MOS9cqgs) =0; if(capgd == 0) *(ckt->CKTstate0 + here->MOS9cqgd) =0; if(capgb == 0) *(ckt->CKTstate0 + here->MOS9cqgb) =0; /* * calculate equivalent conductances and currents for * meyer"s capacitors */ error = NIintegrate(ckt,&gcgs,&ceqgs,capgs,here->MOS9qgs); if(error) return(error); error = NIintegrate(ckt,&gcgd,&ceqgd,capgd,here->MOS9qgd); if(error) return(error); error = NIintegrate(ckt,&gcgb,&ceqgb,capgb,here->MOS9qgb); if(error) return(error); ceqgs=ceqgs-gcgs*vgs+ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOS9qgs); ceqgd=ceqgd-gcgd*vgd+ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOS9qgd); ceqgb=ceqgb-gcgb*vgb+ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOS9qgb); } /* * store charge storage info for meyer's cap in lx table */ /* * load current vector */ ceqbs = model->MOS9type * (here->MOS9cbs-(here->MOS9gbs)*vbs); ceqbd = model->MOS9type * (here->MOS9cbd-(here->MOS9gbd)*vbd); if (here->MOS9mode >= 0) { xnrm=1; xrev=0; cdreq=model->MOS9type*(cdrain-here->MOS9gds*vds- here->MOS9gm*vgs-here->MOS9gmbs*vbs); } else { xnrm=0; xrev=1; cdreq = -(model->MOS9type)*(cdrain-here->MOS9gds*(-vds)- here->MOS9gm*vgd-here->MOS9gmbs*vbd); } *(ckt->CKTrhs + here->MOS9gNode) -= (model->MOS9type * (ceqgs + ceqgb + ceqgd)); *(ckt->CKTrhs + here->MOS9bNode) -= (ceqbs + ceqbd - model->MOS9type * ceqgb); *(ckt->CKTrhs + here->MOS9dNodePrime) += (ceqbd - cdreq + model->MOS9type * ceqgd); *(ckt->CKTrhs + here->MOS9sNodePrime) += cdreq + ceqbs + model->MOS9type * ceqgs; /* * load y matrix *//*printf(" loading %s at time %g\n",here->MOS9name,ckt->CKTtime);*//*printf("%g %g %g %g %g\n", here->MOS9drainConductance,gcgd+gcgs+gcgb, here->MOS9sourceConductance,here->MOS9gbd,here->MOS9gbs);*//*printf("%g %g %g %g %g\n",-gcgb,0.0,0.0,here->MOS9gds,here->MOS9gm);*//*printf("%g %g %g %g %g\n", here->MOS9gds,here->MOS9gmbs,gcgd,-gcgs,-gcgd);*//*printf("%g %g %g %g %g\n", -gcgs,-gcgd,0.0,-gcgs,0.0);*/ *(here->MOS9DdPtr) += (here->MOS9drainConductance); *(here->MOS9GgPtr) += ((gcgd+gcgs+gcgb)); *(here->MOS9SsPtr) += (here->MOS9sourceConductance); *(here->MOS9BbPtr) += (here->MOS9gbd+here->MOS9gbs+gcgb); *(here->MOS9DPdpPtr) += (here->MOS9drainConductance+here->MOS9gds+ here->MOS9gbd+xrev*(here->MOS9gm+here->MOS9gmbs)+gcgd); *(here->MOS9SPspPtr) += (here->MOS9sourceConductance+here->MOS9gds+ here->MOS9gbs+xnrm*(here->MOS9gm+here->MOS9gmbs)+gcgs); *(here->MOS9DdpPtr) += (-here->MOS9drainConductance); *(here->MOS9GbPtr) -= gcgb; *(here->MOS9GdpPtr) -= gcgd; *(here->MOS9GspPtr) -= gcgs; *(here->MOS9SspPtr) += (-here->MOS9sourceConductance); *(here->MOS9BgPtr) -= gcgb; *(here->MOS9BdpPtr) -= here->MOS9gbd; *(here->MOS9BspPtr) -= here->MOS9gbs; *(here->MOS9DPdPtr) += (-here->MOS9drainConductance); *(here->MOS9DPgPtr) += ((xnrm-xrev)*here->MOS9gm-gcgd); *(here->MOS9DPbPtr) += (-here->MOS9gbd+(xnrm-xrev)*here->MOS9gmbs); *(here->MOS9DPspPtr) += (-here->MOS9gds- xnrm*(here->MOS9gm+here->MOS9gmbs)); *(here->MOS9SPgPtr) += (-(xnrm-xrev)*here->MOS9gm-gcgs); *(here->MOS9SPsPtr) += (-here->MOS9sourceConductance); *(here->MOS9SPbPtr) += (-here->MOS9gbs-(xnrm-xrev)*here->MOS9gmbs); *(here->MOS9SPdpPtr) += (-here->MOS9gds- xrev*(here->MOS9gm+here->MOS9gmbs)); } } return(OK);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -