📄 mos3sacl.c
字号:
+ here->MOS3Cbssw*(1-model->MOS3fwdCapDepCoeff* (1+model->MOS3bulkJctSideGradingCoeff))* sargsw/arg; here->MOS3f3s = here->MOS3Cbs * model->MOS3bulkJctBotGradingCoeff * sarg/arg/ model->MOS3bulkJctPotential + here->MOS3Cbssw * model->MOS3bulkJctSideGradingCoeff * sargsw/arg / model->MOS3bulkJctPotential; here->MOS3f4s = here->MOS3Cbs*model->MOS3bulkJctPotential* (1-arg*sarg)/ (1-model->MOS3bulkJctBotGradingCoeff) + here->MOS3Cbssw*model->MOS3bulkJctPotential* (1-arg*sargsw)/ (1-model->MOS3bulkJctSideGradingCoeff) -here->MOS3f3s/2* (here->MOS3tBulkPot*here->MOS3tBulkPot) -here->MOS3tBulkPot * here->MOS3f2s; } *(ckt->CKTstate0 + here->MOS3vbs) = vbsOp; *(ckt->CKTstate0 + here->MOS3vbd) = vbdOp; if(error = MOS3load((GENmodel*)model,ckt)) return(error); *(here->MOS3senCgs + 5) = here->MOS3cgs; *(here->MOS3senCgd + 5) = here->MOS3cgd; *(here->MOS3senCgb + 5) = here->MOS3cgb; *(here->MOS3senCbd + 5) = here->MOS3capbd; *(here->MOS3senCbs + 5) = here->MOS3capbs; *(here->MOS3senGds + 5) = here->MOS3gds; *(here->MOS3senGbs + 5) = here->MOS3gbs; *(here->MOS3senGbd + 5) = here->MOS3gbd; *(here->MOS3senGm + 5) = here->MOS3gm; *(here->MOS3senGmbs + 5) = here->MOS3gmbs; here->MOS3w = A0; here->MOS3drainArea /= (1 + info->SENpertfac); here->MOS3sourceArea /= (1 + info->SENpertfac); }load: gds= *(here->MOS3senGds + flag); gbs= *(here->MOS3senGbs + flag); gbd= *(here->MOS3senGbd + flag); gm= *(here->MOS3senGm + flag); gmbs= *(here->MOS3senGmbs + flag); if(flag == 5){ gdpr = here->MOS3drainConductance * Apert/A0; gspr = here->MOS3sourceConductance * Apert/A0; } else{ gdpr = here->MOS3drainConductance; gspr = here->MOS3sourceConductance; } xcgs= *(here->MOS3senCgs + flag) * ckt->CKTomega; xcgd= *(here->MOS3senCgd + flag) * ckt->CKTomega; xcgb= *(here->MOS3senCgb + flag) * ckt->CKTomega; xbd= *(here->MOS3senCbd + flag) * ckt->CKTomega; xbs= *(here->MOS3senCbs + flag) * ckt->CKTomega;#ifdef SENSDEBUG printf("flag = %d \n",flag); printf("gspr = %.7e , gdpr = %.7e , gds = %.7e, gbs = %.7e\n", gspr,gdpr,gds,gbs); printf("gbd = %.7e , gm = %.7e , gmbs = %.7e\n",gbd,gm,gmbs); printf("xcgs = %.7e , xcgd = %.7e , xcgb = %.7e,", xcgs,xcgd,xcgb); printf("xbd = %.7e,xbs = %.7e\n" ,xbd,xbs);#endif /* SENSDEBUG */ cspr = gspr * vspr ; icspr = gspr * ivspr ; cdpr = gdpr * vdpr ; icdpr = gdpr * ivdpr ; cgs = ( - xcgs * ivgs ); icgs = xcgs * vgs ; cgd = ( - xcgd * ivgd ); icgd = xcgd * vgd ; cgb = ( - xcgb * ivgb ); icgb = xcgb * vgb ; cbs = ( gbs * vbs - xbs * ivbs ); icbs = ( xbs * vbs + gbs * ivbs ); cbd = ( gbd * vbd - xbd * ivbd ); icbd = ( xbd * vbd + gbd * ivbd ); cds = ( gds * vds + xnrm * (gm * vgs + gmbs * vbs) - xrev * (gm * vgd + gmbs * vbd) ); icds = ( gds * ivds + xnrm * (gm * ivgs + gmbs * ivbs) - xrev * (gm * ivgd + gmbs * ivbd) ); cs = cspr; ics = icspr; csprm = ( -cspr - cgs - cbs - cds ) ; icsprm = ( -icspr - icgs - icbs - icds ) ; cd = cdpr; icd = icdpr; cdprm = ( -cdpr - cgd - cbd + cds ) ; icdprm = ( -icdpr - icgd - icbd + icds ) ; cg = cgs + cgd + cgb ; icg = icgs + icgd + icgb ; cb = cbs + cbd - cgb ; icb = icbs + icbd - icgb ;#ifdef SENSDEBUG printf("vbs = %.7e , vbd = %.7e , vgb = %.7e\n",vbs,vbd,vgb); printf("ivbs = %.7e , ivbd = %.7e , ivgb = %.7e\n",ivbs,ivbd,ivgb); printf("cbs = %.7e , cbd = %.7e , cgb = %.7e\n",cbs,cbd,cgb); printf("cb = %.7e , cg = %.7e , cs = %.7e\n",cb,cg,cs); printf("csprm = %.7e, cd = %.7e, cdprm = %.7e\n",csprm,cd,cdprm); printf("icb = %.7e , icg = %.7e , ics = %.7e\n",icb,icg,ics); printf("icsprm = %.7e, icd = %.7e, icdprm = %.7e\n", icsprm,icd,icdprm);#endif /* SENSDEBUG */ for(iparmno = 1;iparmno<=info->SENparms;iparmno++){ if( (flag == 4) && (iparmno != here->MOS3senParmNo) ) continue; if( (flag == 5) && (iparmno != (here->MOS3senParmNo + here->MOS3sens_l)) ) continue; switch(flag){ case 1: DvDp = model->MOS3type * (info->SEN_Sap[here->MOS3bNode][iparmno] - info->SEN_Sap[here->MOS3sNodePrime][iparmno]); break; case 2: DvDp = model->MOS3type * ( info->SEN_Sap[here->MOS3bNode][iparmno] - info->SEN_Sap[here->MOS3dNodePrime][iparmno]); break; case 3: DvDp = model->MOS3type * ( info->SEN_Sap[here->MOS3gNode][iparmno] - info->SEN_Sap[here->MOS3bNode][iparmno]); break; case 4: DvDp = 1; break; case 5: DvDp = 1; break; } *(info->SEN_RHS[here->MOS3bNode] + iparmno) -= ( cb - cb0) * DELAinv * DvDp; *(info->SEN_iRHS[here->MOS3bNode] + iparmno) -= ( icb - icb0) * DELAinv * DvDp; *(info->SEN_RHS[here->MOS3gNode] + iparmno) -= ( cg - cg0) * DELAinv * DvDp; *(info->SEN_iRHS[here->MOS3gNode] + iparmno) -= ( icg - icg0) * DELAinv * DvDp; if(here->MOS3sNode != here->MOS3sNodePrime){ *(info->SEN_RHS[here->MOS3sNode] + iparmno) -= ( cs - cs0) * DELAinv * DvDp; *(info->SEN_iRHS[here->MOS3sNode] + iparmno) -= ( ics - ics0) * DELAinv * DvDp; } *(info->SEN_RHS[here->MOS3sNodePrime] + iparmno) -= ( csprm - csprm0) * DELAinv * DvDp; *(info->SEN_iRHS[here->MOS3sNodePrime] + iparmno) -= ( icsprm - icsprm0) * DELAinv * DvDp; if(here->MOS3dNode != here->MOS3dNodePrime){ *(info->SEN_RHS[here->MOS3dNode] + iparmno) -= ( cd - cd0) * DELAinv * DvDp; *(info->SEN_iRHS[here->MOS3dNode] + iparmno) -= ( icd - icd0) * DELAinv * DvDp; } *(info->SEN_RHS[here->MOS3dNodePrime] + iparmno) -= ( cdprm - cdprm0) * DELAinv * DvDp; *(info->SEN_iRHS[here->MOS3dNodePrime] + iparmno) -= ( icdprm - icdprm0) * DELAinv * DvDp;#ifdef SENSDEBUG printf("after loading\n"); printf("DvDp = %.5e , DELAinv = %.5e ,flag = %d ,", DvDp,DELAinv,flag); printf("iparmno = %d,senparmno = %d\n", iparmno,here->MOS3senParmNo); printf("A0 = %.5e , Apert = %.5e ,CONSTvt0 = %.5e \n", A0,Apert,CONSTvt0); printf("senb = %.7e + j%.7e ", *(info->SEN_RHS[here->MOS3bNode] + iparmno), *(info->SEN_iRHS[here->MOS3bNode] + iparmno)); printf("seng = %.7e + j%.7e ", *(info->SEN_RHS[here->MOS3gNode] + iparmno), *(info->SEN_iRHS[here->MOS3gNode] + iparmno)); printf("sens = %.7e + j%.7e ", *(info->SEN_RHS[here->MOS3sNode] + iparmno), *(info->SEN_iRHS[here->MOS3sNode] + iparmno)); printf("sensprm = %.7e + j%.7e ", *(info->SEN_RHS[here->MOS3sNodePrime] + iparmno), *(info->SEN_iRHS[here->MOS3sNodePrime] + iparmno)); printf("send = %.7e + j%.7e ", *(info->SEN_RHS[here->MOS3dNode] + iparmno), *(info->SEN_iRHS[here->MOS3dNode] + iparmno)); printf("sendprm = %.7e + j%.7e ", *(info->SEN_RHS[here->MOS3dNodePrime] + iparmno), *(info->SEN_iRHS[here->MOS3dNodePrime] + iparmno));#endif /* SENSDEBUG */ } switch(flag){ case 1: goto pertvbd ; case 2: goto pertvgb ; case 3: goto pertl ; case 4: goto pertw ; case 5: break; }next: ; /* put the unperturbed values back into the state vector */ for(i=0; i <= 16; i++) *(ckt->CKTstate0 + here->MOS3states + i) = *(SaveState + i); here->MOS3sourceConductance = *(SaveState + 17) ; here->MOS3drainConductance = *(SaveState + 18) ; here->MOS3cd = *(SaveState + 19) ; here->MOS3cbs = *(SaveState + 20) ; here->MOS3cbd = *(SaveState + 21) ; here->MOS3gmbs = *(SaveState + 22) ; here->MOS3gm = *(SaveState + 23) ; here->MOS3gds = *(SaveState + 24) ; here->MOS3gbd = *(SaveState + 25) ; here->MOS3gbs = *(SaveState + 26) ; here->MOS3capbd = *(SaveState + 27) ; here->MOS3capbs = *(SaveState + 28) ; here->MOS3Cbd = *(SaveState + 29) ; here->MOS3Cbdsw = *(SaveState + 30) ; here->MOS3Cbs = *(SaveState + 31) ; here->MOS3Cbssw = *(SaveState + 32) ; here->MOS3f2d = *(SaveState + 33) ; here->MOS3f3d = *(SaveState + 34) ; here->MOS3f4d = *(SaveState + 35) ; here->MOS3f2s = *(SaveState + 36) ; here->MOS3f3s = *(SaveState + 37) ; here->MOS3f4s = *(SaveState + 38) ; here->MOS3cgs = *(SaveState + 39) ; here->MOS3cgd = *(SaveState + 40) ; here->MOS3cgb = *(SaveState + 41) ; here->MOS3vdsat = *(SaveState + 42) ; here->MOS3von = *(SaveState + 43) ; here->MOS3mode = save_mode ; here->MOS3senPertFlag = OFF; } } info->SENstatus = NORMAL;#ifdef SENSDEBUG printf("MOS3senacload end\n");#endif /* SENSDEBUG */ return(OK);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -