📄 mos6load.c
字号:
#endif /*CAPZEROBYPASS*/ if (vbd < here->MOS6tDepCap) { arg=1-vbd/here->MOS6tBulkPot; /* * 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->MOS6bulkJctBotGradingCoeff == .5 && model->MOS6bulkJctSideGradingCoeff == .5) { sarg = sargsw = 1/sqrt(arg); } else { if(model->MOS6bulkJctBotGradingCoeff == .5) { sarg = 1/sqrt(arg); } else {#endif /*NOSQRT*/ sarg = exp(-model->MOS6bulkJctBotGradingCoeff* log(arg));#ifndef NOSQRT } if(model->MOS6bulkJctSideGradingCoeff == .5) { sargsw = 1/sqrt(arg); } else {#endif /*NOSQRT*/ sargsw =exp(-model->MOS6bulkJctSideGradingCoeff* log(arg));#ifndef NOSQRT } }#endif /*NOSQRT*/ *(ckt->CKTstate0 + here->MOS6qbd) = here->MOS6tBulkPot*(here->MOS6Cbd* (1-arg*sarg) /(1-model->MOS6bulkJctBotGradingCoeff) +here->MOS6Cbdsw* (1-arg*sargsw) /(1-model->MOS6bulkJctSideGradingCoeff)); here->MOS6capbd=here->MOS6Cbd*sarg+ here->MOS6Cbdsw*sargsw; } else { *(ckt->CKTstate0 + here->MOS6qbd) = here->MOS6f4d + vbd * (here->MOS6f2d + vbd * here->MOS6f3d/2); here->MOS6capbd=here->MOS6f2d + vbd * here->MOS6f3d; }#ifdef CAPZEROBYPASS } else { *(ckt->CKTstate0 + here->MOS6qbd) = 0; here->MOS6capbd = 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->MOS6capbd, here->MOS6qbd); if(error) return(error); here->MOS6gbd += geq; here->MOS6cbd += *(ckt->CKTstate0 + here->MOS6cqbd); here->MOS6cd -= *(ckt->CKTstate0 + here->MOS6cqbd); error = NIintegrate(ckt,&geq,&ceq,here->MOS6capbs, here->MOS6qbs); if(error) return(error); here->MOS6gbs += geq; here->MOS6cbs += *(ckt->CKTstate0 + here->MOS6cqbs); } }/**/ if(SenCond) goto next2; /* * check convergence */ if ( (here->MOS6off == 0) || (!(ckt->CKTmode & (MODEINITFIX|MODEINITSMSIG))) ){ if (Check == 1) { ckt->CKTnoncon++; ckt->CKTtroubleElt = (GENinstance *) here; } }/**/ /* save things away for next time */next2: *(ckt->CKTstate0 + here->MOS6vbs) = vbs; *(ckt->CKTstate0 + here->MOS6vbd) = vbd; *(ckt->CKTstate0 + here->MOS6vgs) = vgs; *(ckt->CKTstate0 + here->MOS6vds) = 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->MOS6mode > 0){ DEVqmeyer (vgs,vgd,vgb,von,vdsat, (ckt->CKTstate0 + here->MOS6capgs), (ckt->CKTstate0 + here->MOS6capgd), (ckt->CKTstate0 + here->MOS6capgb), here->MOS6tPhi,OxideCap); } else { DEVqmeyer (vgd,vgs,vgb,von,vdsat, (ckt->CKTstate0 + here->MOS6capgd), (ckt->CKTstate0 + here->MOS6capgs), (ckt->CKTstate0 + here->MOS6capgb), here->MOS6tPhi,OxideCap); } vgs1 = *(ckt->CKTstate1 + here->MOS6vgs); vgd1 = vgs1 - *(ckt->CKTstate1 + here->MOS6vds); vgb1 = vgs1 - *(ckt->CKTstate1 + here->MOS6vbs); if(ckt->CKTmode & (MODETRANOP|MODEINITSMSIG)) { capgs = 2 * *(ckt->CKTstate0+here->MOS6capgs)+ GateSourceOverlapCap ; capgd = 2 * *(ckt->CKTstate0+here->MOS6capgd)+ GateDrainOverlapCap ; capgb = 2 * *(ckt->CKTstate0+here->MOS6capgb)+ GateBulkOverlapCap ; } else { capgs = ( *(ckt->CKTstate0+here->MOS6capgs)+ *(ckt->CKTstate1+here->MOS6capgs) + GateSourceOverlapCap ); capgd = ( *(ckt->CKTstate0+here->MOS6capgd)+ *(ckt->CKTstate1+here->MOS6capgd) + GateDrainOverlapCap ); capgb = ( *(ckt->CKTstate0+here->MOS6capgb)+ *(ckt->CKTstate1+here->MOS6capgb) + GateBulkOverlapCap ); } if(ckt->CKTsenInfo){ here->MOS6cgs = capgs; here->MOS6cgd = capgd; here->MOS6cgb = capgb; }/**/ /* * store small-signal parameters (for meyer's model) * all parameters already stored, so done... */ if(SenCond){ if((ckt->CKTsenInfo->SENmode == DCSEN)|| (ckt->CKTsenInfo->SENmode == ACSEN)){ continue; } }#ifndef PREDICTOR if (ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) { *(ckt->CKTstate0 + here->MOS6qgs) = (1+xfact) * *(ckt->CKTstate1 + here->MOS6qgs) - xfact * *(ckt->CKTstate2 + here->MOS6qgs); *(ckt->CKTstate0 + here->MOS6qgd) = (1+xfact) * *(ckt->CKTstate1 + here->MOS6qgd) - xfact * *(ckt->CKTstate2 + here->MOS6qgd); *(ckt->CKTstate0 + here->MOS6qgb) = (1+xfact) * *(ckt->CKTstate1 + here->MOS6qgb) - xfact * *(ckt->CKTstate2 + here->MOS6qgb); } else {#endif /*PREDICTOR*/ if(ckt->CKTmode & MODETRAN) { *(ckt->CKTstate0 + here->MOS6qgs) = (vgs-vgs1)*capgs + *(ckt->CKTstate1 + here->MOS6qgs) ; *(ckt->CKTstate0 + here->MOS6qgd) = (vgd-vgd1)*capgd + *(ckt->CKTstate1 + here->MOS6qgd) ; *(ckt->CKTstate0 + here->MOS6qgb) = (vgb-vgb1)*capgb + *(ckt->CKTstate1 + here->MOS6qgb) ; } else { /* TRANOP only */ *(ckt->CKTstate0 + here->MOS6qgs) = vgs*capgs; *(ckt->CKTstate0 + here->MOS6qgd) = vgd*capgd; *(ckt->CKTstate0 + here->MOS6qgb) = 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->MOS6cqgs) =0; if(capgd == 0) *(ckt->CKTstate0 + here->MOS6cqgd) =0; if(capgb == 0) *(ckt->CKTstate0 + here->MOS6cqgb) =0; /* * calculate equivalent conductances and currents for * meyer"s capacitors */ error = NIintegrate(ckt,&gcgs,&ceqgs,capgs,here->MOS6qgs); if(error) return(error); error = NIintegrate(ckt,&gcgd,&ceqgd,capgd,here->MOS6qgd); if(error) return(error); error = NIintegrate(ckt,&gcgb,&ceqgb,capgb,here->MOS6qgb); if(error) return(error); ceqgs=ceqgs-gcgs*vgs+ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOS6qgs); ceqgd=ceqgd-gcgd*vgd+ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOS6qgd); ceqgb=ceqgb-gcgb*vgb+ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOS6qgb); } /* * store charge storage info for meyer's cap in lx table */ /* * load current vector */ m = here->MOS6m; ceqbs = model->MOS6type * (here->MOS6cbs-(here->MOS6gbs)*vbs); ceqbd = model->MOS6type * (here->MOS6cbd-(here->MOS6gbd)*vbd); if (here->MOS6mode >= 0) { xnrm=1; xrev=0; cdreq=model->MOS6type*(cdrain-here->MOS6gds*vds- here->MOS6gm*vgs-here->MOS6gmbs*vbs); } else { xnrm=0; xrev=1; cdreq = -(model->MOS6type)*(cdrain-here->MOS6gds*(-vds)- here->MOS6gm*vgd-here->MOS6gmbs*vbd); } *(ckt->CKTrhs + here->MOS6gNode) -= m * (model->MOS6type * (ceqgs + ceqgb + ceqgd)); *(ckt->CKTrhs + here->MOS6bNode) -= m * (ceqbs + ceqbd - model->MOS6type * ceqgb); *(ckt->CKTrhs + here->MOS6dNodePrime) += m * (ceqbd - cdreq + model->MOS6type * ceqgd); *(ckt->CKTrhs + here->MOS6sNodePrime) += m * (cdreq + ceqbs + model->MOS6type * ceqgs); /* * load y matrix */ *(here->MOS6DdPtr) += m * (here->MOS6drainConductance); *(here->MOS6GgPtr) += m * ((gcgd+gcgs+gcgb)); *(here->MOS6SsPtr) += m * (here->MOS6sourceConductance); *(here->MOS6BbPtr) += m * (here->MOS6gbd+here->MOS6gbs+gcgb); *(here->MOS6DPdpPtr) += m * (here->MOS6drainConductance+here->MOS6gds+ here->MOS6gbd+xrev*(here->MOS6gm+here->MOS6gmbs)+gcgd); *(here->MOS6SPspPtr) += m * (here->MOS6sourceConductance+here->MOS6gds+ here->MOS6gbs+xnrm*(here->MOS6gm+here->MOS6gmbs)+gcgs); *(here->MOS6DdpPtr) += m * (-here->MOS6drainConductance); *(here->MOS6GbPtr) -= m * gcgb; *(here->MOS6GdpPtr) -= m * gcgd; *(here->MOS6GspPtr) -= m * gcgs; *(here->MOS6SspPtr) += m * (-here->MOS6sourceConductance); *(here->MOS6BgPtr) -= m * gcgb; *(here->MOS6BdpPtr) -= m * (here->MOS6gbd); *(here->MOS6BspPtr) -= m * (here->MOS6gbs); *(here->MOS6DPdPtr) += m * (-here->MOS6drainConductance); *(here->MOS6DPgPtr) += m * ((xnrm-xrev)*here->MOS6gm-gcgd); *(here->MOS6DPbPtr) += m * (-here->MOS6gbd+(xnrm-xrev)*here->MOS6gmbs); *(here->MOS6DPspPtr) += m * (-here->MOS6gds-xnrm* (here->MOS6gm+here->MOS6gmbs)); *(here->MOS6SPgPtr) += m * (-(xnrm-xrev)*here->MOS6gm-gcgs); *(here->MOS6SPsPtr) += m * (-here->MOS6sourceConductance); *(here->MOS6SPbPtr) += m * (-here->MOS6gbs-(xnrm-xrev)*here->MOS6gmbs); *(here->MOS6SPdpPtr) += m * (-here->MOS6gds-xrev* (here->MOS6gm+here->MOS6gmbs)); } } return(OK);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -