📄 mos2sld.c
字号:
/**********Copyright 1990 Regents of the University of California. All rights reserved.Author: 1985 Thomas L. Quarles**********//* actually load the current sensitivity * information into the array previously provided */#include "spice.h"#include <stdio.h>#include "smpdefs.h"#include "cktdefs.h"#include "mos2defs.h"#include "util.h"#include "sperror.h"#include "suffix.h"intMOS2sLoad(inModel,ckt)GENmodel *inModel;CKTcircuit *ckt;{ register MOS2model *model = (MOS2model *)inModel; register MOS2instance *here; double SaveState[44]; int save_mode; int i; int iparmno; int error; int flag; double A0; double DELA; double Apert; double DELAinv; double gspr0; double gspr; double gdpr0; double gdpr; double cdpr0; double cspr0; double cd0; double cbd0; double cbs0; double cd; double cbd; double cbs; double DcdprDp; double DcsprDp; double DcbDp; double DcdDp; double DcbsDp; double DcbdDp; double DcdprmDp; double DcsprmDp; double qgs0; double qgd0; double qgb0; double qbd0; double qbd; double qbs0; double qbs; double DqgsDp; double DqgdDp; double DqgbDp; double DqbdDp; double DqbsDp; double Osxpgs; double Osxpgd; double Osxpgb; double Osxpbd; double Osxpbs; double tag0; double tag1; double arg; double sarg; double sargsw; int offset; double EffectiveLength; SENstruct *info;#ifdef SENSDEBUG printf("MOS2senload \n"); printf("CKTtime = %.5e\n",ckt->CKTtime); printf("CKTorder = %d\n",ckt->CKTorder);#endif /* SENSDEBUG */ info = ckt->CKTsenInfo; info->SENstatus = PERTURBATION; tag0 = ckt->CKTag[0]; tag1 = ckt->CKTag[1]; if(ckt->CKTorder == 1){ tag1 = 0; } /* loop through all the models */ for( ; model != NULL; model = model->MOS2nextModel ) { /* loop through all the instances of the model */ for (here = model->MOS2instances; here != NULL ; here=here->MOS2nextInstance) { if (here->MOS2owner != ARCHme) continue;#ifdef SENSDEBUG printf("senload instance name %s\n",here->MOS2name); printf("gate = %d ,drain = %d, drainprm = %d\n", here->MOS2gNode,here->MOS2dNode,here->MOS2dNodePrime); printf("source = %d , sourceprm = %d ,body = %d, senparmno = %d\n", here->MOS2sNode ,here->MOS2sNodePrime, here->MOS2bNode,here->MOS2senParmNo);#endif /* SENSDEBUG */ /* save the unperturbed values in the state vector */ for(i=0; i <= 16; i++){ *(SaveState + i) = *(ckt->CKTstate0 + here->MOS2states + i); } *(SaveState + 17) = here->MOS2sourceConductance; *(SaveState + 18) = here->MOS2drainConductance; *(SaveState + 19) = here->MOS2cd; *(SaveState + 20) = here->MOS2cbs; *(SaveState + 21) = here->MOS2cbd; *(SaveState + 22) = here->MOS2gmbs; *(SaveState + 23) = here->MOS2gm; *(SaveState + 24) = here->MOS2gds; *(SaveState + 25) = here->MOS2gbd; *(SaveState + 26) = here->MOS2gbs; *(SaveState + 27) = here->MOS2capbd; *(SaveState + 28) = here->MOS2capbs; *(SaveState + 29) = here->MOS2Cbd; *(SaveState + 30) = here->MOS2Cbdsw; *(SaveState + 31) = here->MOS2Cbs; *(SaveState + 32) = here->MOS2Cbssw; *(SaveState + 33) = here->MOS2f2d; *(SaveState + 34) = here->MOS2f3d; *(SaveState + 35) = here->MOS2f4d; *(SaveState + 36) = here->MOS2f2s; *(SaveState + 37) = here->MOS2f3s; *(SaveState + 38) = here->MOS2f4s; *(SaveState + 39) = here->MOS2cgs; *(SaveState + 40) = here->MOS2cgd; *(SaveState + 41) = here->MOS2cgb; *(SaveState + 42) = here->MOS2vdsat; *(SaveState + 43) = here->MOS2von; save_mode = here->MOS2mode; if(here->MOS2senParmNo == 0) goto next1;#ifdef SENSDEBUG printf("without perturbation \n"); printf("gbd =%.5e\n",here->MOS2gbd); printf("satCur =%.5e\n",here->MOS2tSatCur); printf("satCurDens =%.5e\n",here->MOS2tSatCurDens); printf("vbd =%.5e\n",*(ckt->CKTstate0 + here->MOS2vbd));#endif /* SENSDEBUG */ cdpr0= here->MOS2cd; cspr0= -(here->MOS2cd + here->MOS2cbd + here->MOS2cbs); if((info->SENmode == TRANSEN) && (ckt->CKTmode & MODEINITTRAN)){ qgs0 = *(ckt->CKTstate1 + here->MOS2qgs); qgd0 = *(ckt->CKTstate1 + here->MOS2qgd); qgb0 = *(ckt->CKTstate1 + here->MOS2qgb); } else{ qgs0 = *(ckt->CKTstate0 + here->MOS2qgs); qgd0 = *(ckt->CKTstate0 + here->MOS2qgd); qgb0 = *(ckt->CKTstate0 + here->MOS2qgb); } here->MOS2senPertFlag = ON; error = MOS2load((GENmodel*)model,ckt); if(error) return(error); cd0 = here->MOS2cd ; cbd0 = here->MOS2cbd ; cbs0 = here->MOS2cbs ; gspr0= here->MOS2sourceConductance ; gdpr0= here->MOS2drainConductance ; qbs0 = *(ckt->CKTstate0 + here->MOS2qbs); qbd0 = *(ckt->CKTstate0 + here->MOS2qbd); for( flag = 0 ; flag <= 1 ; flag++){ if(here->MOS2sens_l == 0) if(flag == 0) goto next2; if(here->MOS2sens_w == 0) if(flag == 1) goto next2; if(flag == 0){ A0 = here->MOS2l; DELA = info->SENpertfac * A0; DELAinv = 1.0/DELA; Apert = A0 + DELA; here->MOS2l = Apert; } else{ A0 = here->MOS2w; DELA = info->SENpertfac * A0; DELAinv = 1.0/DELA; Apert = A0 + DELA; here->MOS2w = Apert; here->MOS2drainArea *= (1 + info->SENpertfac); here->MOS2sourceArea *= (1 + info->SENpertfac); here->MOS2Cbd *= (1 + info->SENpertfac); here->MOS2Cbs *= (1 + info->SENpertfac); if(here->MOS2drainPerimiter){ here->MOS2Cbdsw += here->MOS2Cbdsw * DELA/here->MOS2drainPerimiter; } if(here->MOS2sourcePerimiter){ here->MOS2Cbssw += here->MOS2Cbssw * DELA/here->MOS2sourcePerimiter; } if(*(ckt->CKTstate0 + here->MOS2vbd) >= here->MOS2tDepCap){ arg = 1-model->MOS2fwdCapDepCoeff; sarg = exp( (-model->MOS2bulkJctBotGradingCoeff) * log(arg) ); sargsw = exp( (-model->MOS2bulkJctSideGradingCoeff) * log(arg) ); here->MOS2f2d = here->MOS2Cbd* (1-model->MOS2fwdCapDepCoeff* (1+model->MOS2bulkJctBotGradingCoeff))* sarg/arg + here->MOS2Cbdsw*(1-model->MOS2fwdCapDepCoeff* (1+model->MOS2bulkJctSideGradingCoeff))* sargsw/arg; here->MOS2f3d = here->MOS2Cbd * model->MOS2bulkJctBotGradingCoeff * sarg/arg/ here->MOS2tBulkPot + here->MOS2Cbdsw * model->MOS2bulkJctSideGradingCoeff * sargsw/arg / here->MOS2tBulkPot; here->MOS2f4d = here->MOS2Cbd* here->MOS2tBulkPot*(1-arg*sarg)/ (1-model->MOS2bulkJctBotGradingCoeff) + here->MOS2Cbdsw*here->MOS2tBulkPot* (1-arg*sargsw)/ (1-model->MOS2bulkJctSideGradingCoeff) -here->MOS2f3d/2* (here->MOS2tDepCap*here->MOS2tDepCap) -here->MOS2tDepCap * here->MOS2f2d; } if(*(ckt->CKTstate0 + here->MOS2vbs) >= here->MOS2tDepCap){ arg = 1-model->MOS2fwdCapDepCoeff; sarg = exp( (-model->MOS2bulkJctBotGradingCoeff) * log(arg) ); sargsw = exp( (-model->MOS2bulkJctSideGradingCoeff) * log(arg) ); here->MOS2f2s = here->MOS2Cbs* (1-model->MOS2fwdCapDepCoeff* (1+model->MOS2bulkJctBotGradingCoeff))* sarg/arg + here->MOS2Cbssw*(1-model->MOS2fwdCapDepCoeff* (1+model->MOS2bulkJctSideGradingCoeff))* sargsw/arg; here->MOS2f3s = here->MOS2Cbs * model->MOS2bulkJctBotGradingCoeff * sarg/arg/ here->MOS2tBulkPot + here->MOS2Cbssw * model->MOS2bulkJctSideGradingCoeff *sargsw/arg / here->MOS2tBulkPot; here->MOS2f4s = here->MOS2Cbs*here->MOS2tBulkPot* (1-arg*sarg)/ (1-model->MOS2bulkJctBotGradingCoeff) + here->MOS2Cbssw*here->MOS2tBulkPot* (1-arg*sargsw)/ (1-model->MOS2bulkJctSideGradingCoeff) -here->MOS2f3s/2* (here->MOS2tDepCap*here->MOS2tDepCap) -here->MOS2tDepCap * here->MOS2f2s; } here->MOS2drainConductance *= Apert/A0; here->MOS2sourceConductance *= Apert/A0; }#ifdef SENSDEBUG if(flag == 0) printf("perturbation of l\n"); if(flag == 1) printf("perturbation of w\n");#endif /* SENSDEBUG */ error = MOS2load((GENmodel*)model,ckt); if(error) return(error); if(flag == 0){ here->MOS2l = A0; } else{ here->MOS2w = A0; here->MOS2drainArea /= (1 + info->SENpertfac); here->MOS2sourceArea /= (1 + info->SENpertfac); here->MOS2drainConductance *= A0/Apert; here->MOS2sourceConductance *= A0/Apert; } cd = here->MOS2cd ; cbd = here->MOS2cbd ; cbs = here->MOS2cbs ; gspr= here->MOS2sourceConductance ; gdpr= here->MOS2drainConductance ; DcdDp = (cd - cd0) * DELAinv; DcbsDp = (cbs - cbs0) * DELAinv; DcbdDp = (cbd - cbd0) * DELAinv; DcbDp = ( DcbsDp + DcbdDp ); DcdprDp = 0; DcsprDp = 0; if(here->MOS2dNode != here->MOS2dNodePrime) if(gdpr0) DcdprDp = cdpr0 * (gdpr - gdpr0)/gdpr0 * DELAinv;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -