📄 mos6load.c
字号:
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*/ }/**/#ifdef DETAILPROFasm(" .globl mospth");asm("mospth:");#endif /*DETAILPROF*/ 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); } }/**/#ifdef DETAILPROFasm(" .globl mospti");asm("mospti:");#endif /*DETAILPROF*/ if(SenCond) goto next2; /* * check convergence */ if ( (here->MOS6off == 0) || (!(ckt->CKTmode & (MODEINITFIX|MODEINITSMSIG))) ){ if (Check == 1) { ckt->CKTnoncon++; ckt->CKTtroubleElt = (GENinstance *) here;#ifndef NEWCONV } else { tol=ckt->CKTreltol*MAX(FABS(cdhat), FABS(here->MOS6cd))+ckt->CKTabstol; if (FABS(cdhat-here->MOS6cd) >= tol) { ckt->CKTnoncon++; ckt->CKTtroubleElt = (GENinstance *) here; } else { tol=ckt->CKTreltol*MAX(FABS(cbhat), FABS(here->MOS6cbs+here->MOS6cbd))+ ckt->CKTabstol; if (FABS(cbhat-(here->MOS6cbs+here->MOS6cbd)) > tol) { ckt->CKTnoncon++; ckt->CKTtroubleElt = (GENinstance *) here; } }#endif /*NEWCONV*/ } }/**/#ifdef DETAILPROFasm(" .globl mosptj");asm("mosptj:");#endif /*DETAILPROF*/ /* 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;/**/#ifdef DETAILPROFasm(" .globl mosptk");asm("mosptk:");#endif /*DETAILPROF*/ /* * 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; }/**/#ifdef DETAILPROFasm(" .globl mosptl");asm("mosptl:");#endif /*DETAILPROF*/ /* * 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 */ ceqbs = model->MOS6type * (here->MOS6cbs-(here->MOS6gbs-ckt->CKTgmin)*vbs); ceqbd = model->MOS6type * (here->MOS6cbd-(here->MOS6gbd-ckt->CKTgmin)*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) -= (model->MOS6type * (ceqgs + ceqgb + ceqgd)); *(ckt->CKTrhs + here->MOS6bNode) -= (ceqbs + ceqbd - model->MOS6type * ceqgb); *(ckt->CKTrhs + here->MOS6dNodePrime) += (ceqbd - cdreq + model->MOS6type * ceqgd); *(ckt->CKTrhs + here->MOS6sNodePrime) += cdreq + ceqbs + model->MOS6type * ceqgs; /* * load y matrix */ *(here->MOS6DdPtr) += (here->MOS6drainConductance); *(here->MOS6GgPtr) += ((gcgd+gcgs+gcgb)); *(here->MOS6SsPtr) += (here->MOS6sourceConductance); *(here->MOS6BbPtr) += (here->MOS6gbd+here->MOS6gbs+gcgb); *(here->MOS6DPdpPtr) += (here->MOS6drainConductance+here->MOS6gds+ here->MOS6gbd+xrev*(here->MOS6gm+here->MOS6gmbs)+gcgd); *(here->MOS6SPspPtr) += (here->MOS6sourceConductance+here->MOS6gds+ here->MOS6gbs+xnrm*(here->MOS6gm+here->MOS6gmbs)+gcgs); *(here->MOS6DdpPtr) += (-here->MOS6drainConductance); *(here->MOS6GbPtr) -= gcgb; *(here->MOS6GdpPtr) -= gcgd; *(here->MOS6GspPtr) -= gcgs; *(here->MOS6SspPtr) += (-here->MOS6sourceConductance); *(here->MOS6BgPtr) -= gcgb; *(here->MOS6BdpPtr) -= here->MOS6gbd; *(here->MOS6BspPtr) -= here->MOS6gbs; *(here->MOS6DPdPtr) += (-here->MOS6drainConductance); *(here->MOS6DPgPtr) += ((xnrm-xrev)*here->MOS6gm-gcgd); *(here->MOS6DPbPtr) += (-here->MOS6gbd+(xnrm-xrev)*here->MOS6gmbs); *(here->MOS6DPspPtr) += (-here->MOS6gds-xnrm* (here->MOS6gm+here->MOS6gmbs)); *(here->MOS6SPgPtr) += (-(xnrm-xrev)*here->MOS6gm-gcgs); *(here->MOS6SPsPtr) += (-here->MOS6sourceConductance); *(here->MOS6SPbPtr) += (-here->MOS6gbs-(xnrm-xrev)*here->MOS6gmbs); *(here->MOS6SPdpPtr) += (-here->MOS6gds-xrev* (here->MOS6gm+here->MOS6gmbs)); } } return(OK);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -