📄 mos1sacl.c
字号:
+ here->MOS1Cbssw*(1-model->MOS1fwdCapDepCoeff* (1+model->MOS1bulkJctSideGradingCoeff))* sargsw/arg; here->MOS1f3s = here->MOS1Cbs * model->MOS1bulkJctBotGradingCoeff * sarg/arg/ here->MOS1tBulkPot + here->MOS1Cbssw * model->MOS1bulkJctSideGradingCoeff * sargsw/arg / here->MOS1tBulkPot; here->MOS1f4s = here->MOS1Cbs* here->MOS1tBulkPot*(1-arg*sarg)/ (1-model->MOS1bulkJctBotGradingCoeff) + here->MOS1Cbssw*here->MOS1tBulkPot*(1-arg*sargsw)/ (1-model->MOS1bulkJctSideGradingCoeff) -here->MOS1f3s/2* (here->MOS1tDepCap*here->MOS1tDepCap) -here->MOS1tDepCap * here->MOS1f2s; } *(ckt->CKTstate0 + here->MOS1vbs) = vbsOp; *(ckt->CKTstate0 + here->MOS1vbd) = vbdOp; if(error = MOS1load((GENmodel*)model,ckt)) return(error); *(here->MOS1senCgs + 5) = here->MOS1cgs; *(here->MOS1senCgd + 5) = here->MOS1cgd; *(here->MOS1senCgb + 5) = here->MOS1cgb; *(here->MOS1senCbd + 5) = here->MOS1capbd; *(here->MOS1senCbs + 5) = here->MOS1capbs; *(here->MOS1senGds + 5) = here->MOS1gds; *(here->MOS1senGbs + 5) = here->MOS1gbs; *(here->MOS1senGbd + 5) = here->MOS1gbd; *(here->MOS1senGm + 5) = here->MOS1gm; *(here->MOS1senGmbs + 5) = here->MOS1gmbs; here->MOS1w = A0; here->MOS1drainArea /= (1 + info->SENpertfac); here->MOS1sourceArea /= (1 + info->SENpertfac); }load: gds= *(here->MOS1senGds + flag); gbs= *(here->MOS1senGbs + flag); gbd= *(here->MOS1senGbd + flag); gm= *(here->MOS1senGm + flag); gmbs= *(here->MOS1senGmbs + flag); if(flag == 5){ gdpr = here->MOS1drainConductance * Apert/A0; gspr = here->MOS1sourceConductance * Apert/A0; } else{ gdpr = here->MOS1drainConductance; gspr = here->MOS1sourceConductance; } xcgs= *(here->MOS1senCgs + flag) * ckt->CKTomega; xcgd= *(here->MOS1senCgd + flag) * ckt->CKTomega; xcgb= *(here->MOS1senCgb + flag) * ckt->CKTomega; xbd= *(here->MOS1senCbd + flag) * ckt->CKTomega; xbs= *(here->MOS1senCbs + 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->MOS1senParmNo)) continue; if( (flag == 5) && (iparmno != (here->MOS1senParmNo + here->MOS1sens_l))) continue; switch(flag){ case 1: DvDp = model->MOS1type * (info->SEN_Sap[here->MOS1bNode][iparmno] - info->SEN_Sap[here->MOS1sNodePrime][iparmno]); break; case 2: DvDp = model->MOS1type * ( info->SEN_Sap[here->MOS1bNode][iparmno] - info->SEN_Sap[here->MOS1dNodePrime][iparmno]); break; case 3: DvDp = model->MOS1type * ( info->SEN_Sap[here->MOS1gNode][iparmno] - info->SEN_Sap[here->MOS1bNode][iparmno]); break; case 4: DvDp = 1; break; case 5: DvDp = 1; break; } *(info->SEN_RHS[here->MOS1bNode] + iparmno) -= ( cb - cb0) * DELAinv * DvDp; *(info->SEN_iRHS[here->MOS1bNode] + iparmno) -= ( icb - icb0) * DELAinv * DvDp; *(info->SEN_RHS[here->MOS1gNode] + iparmno) -= ( cg - cg0) * DELAinv * DvDp; *(info->SEN_iRHS[here->MOS1gNode] + iparmno) -= ( icg - icg0) * DELAinv * DvDp; if(here->MOS1sNode != here->MOS1sNodePrime){ *(info->SEN_RHS[here->MOS1sNode] + iparmno) -= ( cs - cs0) * DELAinv * DvDp; *(info->SEN_iRHS[here->MOS1sNode] + iparmno) -= ( ics - ics0) * DELAinv * DvDp; } *(info->SEN_RHS[here->MOS1sNodePrime] + iparmno) -= ( csprm - csprm0) * DELAinv * DvDp; *(info->SEN_iRHS[here->MOS1sNodePrime] + iparmno) -= ( icsprm - icsprm0) * DELAinv * DvDp; if(here->MOS1dNode != here->MOS1dNodePrime){ *(info->SEN_RHS[here->MOS1dNode] + iparmno) -= ( cd - cd0) * DELAinv * DvDp; *(info->SEN_iRHS[here->MOS1dNode] + iparmno) -= ( icd - icd0) * DELAinv * DvDp; } *(info->SEN_RHS[here->MOS1dNodePrime] + iparmno) -= ( cdprm - cdprm0) * DELAinv * DvDp; *(info->SEN_iRHS[here->MOS1dNodePrime] + 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->MOS1senParmNo); printf("A0 = %.5e , Apert = %.5e ,CONSTvt = %.5e \n", A0,Apert,here->MOS1tVto); printf("senb = %.7e + j%.7e ", *(info->SEN_RHS[here->MOS1bNode] + iparmno), *(info->SEN_iRHS[here->MOS1bNode] + iparmno)); printf("seng = %.7e + j%.7e ", *(info->SEN_RHS[here->MOS1gNode] + iparmno), *(info->SEN_iRHS[here->MOS1gNode] + iparmno)); printf("sens = %.7e + j%.7e ", *(info->SEN_RHS[here->MOS1sNode] + iparmno), *(info->SEN_iRHS[here->MOS1sNode] + iparmno)); printf("sensprm = %.7e + j%.7e ", *(info->SEN_RHS[here->MOS1sNodePrime] + iparmno), *(info->SEN_iRHS[here->MOS1sNodePrime] + iparmno)); printf("send = %.7e + j%.7e ", *(info->SEN_RHS[here->MOS1dNode] + iparmno), *(info->SEN_iRHS[here->MOS1dNode] + iparmno)); printf("sendprm = %.7e + j%.7e ", *(info->SEN_RHS[here->MOS1dNodePrime] + iparmno), *(info->SEN_iRHS[here->MOS1dNodePrime] + 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->MOS1states + i) = *(SaveState + i); here->MOS1sourceConductance = *(SaveState + 17) ; here->MOS1drainConductance = *(SaveState + 18) ; here->MOS1cd = *(SaveState + 19) ; here->MOS1cbs = *(SaveState + 20) ; here->MOS1cbd = *(SaveState + 21) ; here->MOS1gmbs = *(SaveState + 22) ; here->MOS1gm = *(SaveState + 23) ; here->MOS1gds = *(SaveState + 24) ; here->MOS1gbd = *(SaveState + 25) ; here->MOS1gbs = *(SaveState + 26) ; here->MOS1capbd = *(SaveState + 27) ; here->MOS1capbs = *(SaveState + 28) ; here->MOS1Cbd = *(SaveState + 29) ; here->MOS1Cbdsw = *(SaveState + 30) ; here->MOS1Cbs = *(SaveState + 31) ; here->MOS1Cbssw = *(SaveState + 32) ; here->MOS1f2d = *(SaveState + 33) ; here->MOS1f3d = *(SaveState + 34) ; here->MOS1f4d = *(SaveState + 35) ; here->MOS1f2s = *(SaveState + 36) ; here->MOS1f3s = *(SaveState + 37) ; here->MOS1f4s = *(SaveState + 38) ; here->MOS1cgs = *(SaveState + 39) ; here->MOS1cgd = *(SaveState + 40) ; here->MOS1cgb = *(SaveState + 41) ; here->MOS1vdsat = *(SaveState + 42) ; here->MOS1von = *(SaveState + 43) ; here->MOS1mode = save_mode ; here->MOS1senPertFlag = OFF; } } info->SENstatus = NORMAL;#ifdef SENSDEBUG printf("MOS1senacload end\n");#endif /* SENSDEBUG */ return(OK);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -