📄 mos1sld.c
字号:
if(gdpr0) DcdprDp = cdpr0 * (gdpr - gdpr0)/gdpr0 * DELAinv; if(here->MOS1sNode != here->MOS1sNodePrime) if(gspr0) DcsprDp = cspr0 * (gspr - gspr0)/gspr0 * DELAinv; DcdprmDp = ( - DcdprDp + DcdDp); DcsprmDp = ( - DcbsDp - DcdDp - DcbdDp - DcsprDp); if(flag == 0){ EffectiveLength = here->MOS1l - 2*model->MOS1latDiff; if(EffectiveLength == 0){ DqgsDp = 0; DqgdDp = 0; DqgbDp = 0; } else{ DqgsDp = model->MOS1type * qgs0 / EffectiveLength; DqgdDp = model->MOS1type * qgd0 / EffectiveLength; DqgbDp = model->MOS1type * qgb0 / EffectiveLength; } } else{ DqgsDp = model->MOS1type * qgs0 / here->MOS1w; DqgdDp = model->MOS1type * qgd0 / here->MOS1w; DqgbDp = model->MOS1type * qgb0 / here->MOS1w; } qbd = *(ckt->CKTstate0 + here->MOS1qbd); qbs = *(ckt->CKTstate0 + here->MOS1qbs); DqbsDp = model->MOS1type * (qbs - qbs0)*DELAinv; DqbdDp = model->MOS1type * (qbd - qbd0)*DELAinv; if(flag == 0){ *(here->MOS1dphigs_dl) = DqgsDp; *(here->MOS1dphigd_dl) = DqgdDp; *(here->MOS1dphibs_dl) = DqbsDp; *(here->MOS1dphibd_dl) = DqbdDp; *(here->MOS1dphigb_dl) = DqgbDp; } else{ *(here->MOS1dphigs_dw) = DqgsDp; *(here->MOS1dphigd_dw) = DqgdDp; *(here->MOS1dphibs_dw) = DqbsDp; *(here->MOS1dphibd_dw) = DqbdDp; *(here->MOS1dphigb_dw) = DqgbDp; }#ifdef SENSDEBUG printf("CKTag[0]=%.7e,CKTag[1]=%.7e,flag= %d\n", ckt->CKTag[0],ckt->CKTag[1],flag); printf("cd0 = %.7e ,cd = %.7e,\n",cd0,cd); printf("cbs0 = %.7e ,cbs = %.7e,\n",cbs0,cbs); printf("cbd0 = %.7e ,cbd = %.7e,\n",cbd0,cbd); printf("DcdprmDp = %.7e,\n",DcdprmDp); printf("DcsprmDp = %.7e,\n",DcsprmDp); printf("DcdprDp = %.7e,\n",DcdprDp); printf("DcsprDp = %.7e,\n",DcsprDp); printf("qgs0 = %.7e \n",qgs0); printf("qgd0 = %.7e \n",qgd0); printf("qgb0 = %.7e \n",qgb0); printf("qbs0 = %.7e ,qbs = %.7e,\n",qbs0,qbs); printf("qbd0 = %.7e ,qbd = %.7e,\n",qbd0,qbd); printf("DqgsDp = %.7e \n",DqgsDp); printf("DqgdDp = %.7e \n",DqgdDp); printf("DqgbDp = %.7e \n",DqgbDp); printf("DqbsDp = %.7e \n",DqbsDp); printf("DqbdDp = %.7e \n",DqbdDp); printf("EffectiveLength = %.7e \n",EffectiveLength); printf("tdepCap = %.7e \n",here->MOS1tDepCap); printf("\n");#endif /* SENSDEBUG*/ if((info->SENmode == TRANSEN) && (ckt->CKTmode & MODEINITTRAN)) goto next2; /* * load RHS matrix */ if(flag == 0){ *(info->SEN_RHS[here->MOS1bNode] + here->MOS1senParmNo) -= model->MOS1type * DcbDp; *(info->SEN_RHS[here->MOS1dNode] + here->MOS1senParmNo) -= model->MOS1type * DcdprDp; *(info->SEN_RHS[here->MOS1dNodePrime] + here->MOS1senParmNo) -= model->MOS1type * DcdprmDp; *(info->SEN_RHS[here->MOS1sNode] + here->MOS1senParmNo) -= model->MOS1type * DcsprDp; *(info->SEN_RHS[here->MOS1sNodePrime] + here->MOS1senParmNo) -= model->MOS1type * DcsprmDp; } else{ offset = here->MOS1sens_l; *(info->SEN_RHS[here->MOS1bNode] + here->MOS1senParmNo + offset) -= model->MOS1type * DcbDp; *(info->SEN_RHS[here->MOS1dNode] + here->MOS1senParmNo + offset) -= model->MOS1type * DcdprDp; *(info->SEN_RHS[here->MOS1dNodePrime] + here->MOS1senParmNo + offset) -= model->MOS1type * DcdprmDp; *(info->SEN_RHS[here->MOS1sNode] + here->MOS1senParmNo + offset) -= model->MOS1type * DcsprDp; *(info->SEN_RHS[here->MOS1sNodePrime] + here->MOS1senParmNo + offset) -= model->MOS1type * DcsprmDp; }#ifdef SENSDEBUG printf("after loading\n"); if(flag == 0){ printf("DcbDp=%.7e\n", *(info->SEN_RHS[here->MOS1bNode] + here->MOS1senParmNo)); printf("DcdprDp=%.7e\n", *(info->SEN_RHS[here->MOS1dNode] + here->MOS1senParmNo)); printf("DcsprDp=%.7e\n", *(info->SEN_RHS[here->MOS1sNode] + here->MOS1senParmNo)); printf("DcdprmDp=%.7e\n", *(info->SEN_RHS[here->MOS1dNodePrime] + here->MOS1senParmNo)); printf("DcsprmDp=%.7e\n", *(info->SEN_RHS[here->MOS1sNodePrime] + here->MOS1senParmNo)); printf("\n"); } else{ printf("DcbDp=%.7e\n", *(info->SEN_RHS[here->MOS1bNode] + here->MOS1senParmNo + here->MOS1sens_l)); printf("DcdprDp=%.7e\n", *(info->SEN_RHS[here->MOS1dNode] + here->MOS1senParmNo + here->MOS1sens_l)); printf("DcsprDp=%.7e\n", *(info->SEN_RHS[here->MOS1sNode] + here->MOS1senParmNo + here->MOS1sens_l)); printf("DcdprmDp=%.7e\n", *(info->SEN_RHS[here->MOS1dNodePrime] + here->MOS1senParmNo + here->MOS1sens_l)); printf("DcsprmDp=%.7e\n", *(info->SEN_RHS[here->MOS1sNodePrime] + here->MOS1senParmNo + here->MOS1sens_l)); }#endif /* SENSDEBUG*/next2: ; }next1: if((info->SENmode == DCSEN) || (ckt->CKTmode&MODETRANOP) ) goto restore; if((info->SENmode == TRANSEN) && (ckt->CKTmode & MODEINITTRAN)) goto restore; for(iparmno = 1;iparmno<=info->SENparms;iparmno++){#ifdef SENSDEBUG printf("after conductive currents\n"); printf("iparmno = %d\n",iparmno); printf("DcbDp=%.7e\n", *(info->SEN_RHS[here->MOS1bNode] + iparmno)); printf("DcdprDp=%.7e\n", *(info->SEN_RHS[here->MOS1dNode] + iparmno)); printf("DcdprmDp=%.7e\n", *(info->SEN_RHS[here->MOS1dNodePrime] + iparmno)); printf("DcsprDp=%.7e\n", *(info->SEN_RHS[here->MOS1sNode] + iparmno)); printf("DcsprmDp=%.7e\n", *(info->SEN_RHS[here->MOS1sNodePrime] + iparmno)); printf("\n");#endif /* SENSDEBUG */ Osxpgs = tag0 * *(ckt->CKTstate1 + here->MOS1sensxpgs + 10*(iparmno - 1)) + tag1 * *(ckt->CKTstate1 + here->MOS1sensxpgs + 10*(iparmno - 1) + 1); Osxpgd = tag0 * *(ckt->CKTstate1 + here->MOS1sensxpgd + 10*(iparmno - 1)) + tag1 * *(ckt->CKTstate1 + here->MOS1sensxpgd + 10*(iparmno - 1) + 1); Osxpbs = tag0 * *(ckt->CKTstate1 + here->MOS1sensxpbs + 10*(iparmno - 1)) + tag1 * *(ckt->CKTstate1 + here->MOS1sensxpbs + 10*(iparmno - 1) + 1); Osxpbd =tag0 * *(ckt->CKTstate1 + here->MOS1sensxpbd + 10*(iparmno - 1)) + tag1 * *(ckt->CKTstate1 + here->MOS1sensxpbd + 10*(iparmno - 1) + 1); Osxpgb = tag0 * *(ckt->CKTstate1 + here->MOS1sensxpgb + 10*(iparmno - 1)) + tag1 * *(ckt->CKTstate1 + here->MOS1sensxpgb + 10*(iparmno - 1) + 1);#ifdef SENSDEBUG printf("iparmno=%d\n",iparmno); printf("sxpgs=%.7e,sdgs=%.7e\n", *(ckt->CKTstate1 + here->MOS1sensxpgs + 10*(iparmno - 1)), *(ckt->CKTstate1 + here->MOS1sensxpgs + 10*(iparmno - 1) + 1)); printf("sxpgd=%.7e,sdgd=%.7e\n", *(ckt->CKTstate1 + here->MOS1sensxpgd + 10*(iparmno - 1)), *(ckt->CKTstate1 + here->MOS1sensxpgd + 10*(iparmno - 1) + 1)); printf("sxpbs=%.7e,sdbs=%.7e\n", *(ckt->CKTstate1 + here->MOS1sensxpbs + 10*(iparmno - 1)), *(ckt->CKTstate1 + here->MOS1sensxpbs + 10*(iparmno - 1) + 1)); printf("sxpbd=%.7e,sdbd=%.7e\n", *(ckt->CKTstate1 + here->MOS1sensxpbd + 10*(iparmno - 1)), *(ckt->CKTstate1 + here->MOS1sensxpbd + 10*(iparmno - 1) + 1)); printf("sxpgb=%.7e,sdgb=%.7e\n", *(ckt->CKTstate1 + here->MOS1sensxpgb + 10*(iparmno - 1)), *(ckt->CKTstate1 + here->MOS1sensxpgb + 10*(iparmno - 1) + 1)); printf("before loading DqDp\n"); printf("Osxpgs=%.7e,Osxpgd=%.7e\n",Osxpgs,Osxpgd); printf("Osxpbs=%.7e,Osxpbd=%.7e,Osxpgb=%.7e\n", Osxpbs,Osxpbd,Osxpgb); printf("\n");#endif /* SENSDEBUG */ if(here->MOS1sens_l && (iparmno == here->MOS1senParmNo)){ Osxpgs -= tag0 * *(here->MOS1dphigs_dl); Osxpgd -= tag0 * *(here->MOS1dphigd_dl); Osxpbs -= tag0 * *(here->MOS1dphibs_dl); Osxpbd -= tag0 * *(here->MOS1dphibd_dl); Osxpgb -= tag0 * *(here->MOS1dphigb_dl); } if(here->MOS1sens_w && (iparmno == (here->MOS1senParmNo + here->MOS1sens_l))){ Osxpgs -= tag0 * *(here->MOS1dphigs_dw); Osxpgd -= tag0 * *(here->MOS1dphigd_dw); Osxpbs -= tag0 * *(here->MOS1dphibs_dw); Osxpbd -= tag0 * *(here->MOS1dphibd_dw); Osxpgb -= tag0 * *(here->MOS1dphigb_dw); }#ifdef SENSDEBUG printf("after loading DqDp\n"); printf("DqgsDp=%.7e",DqgsDp); printf("Osxpgs=%.7e,Osxpgd=%.7e\n",Osxpgs,Osxpgd); printf("Osxpbs=%.7e,Osxpbd=%.7e,Osxpgb=%.7e\n", Osxpbs,Osxpbd,Osxpgb);#endif /* SENSDEBUG */ *(info->SEN_RHS[here->MOS1bNode] + iparmno) += Osxpbs + Osxpbd -Osxpgb; *(info->SEN_RHS[here->MOS1gNode] + iparmno) += Osxpgs + Osxpgd + Osxpgb; *(info->SEN_RHS[here->MOS1dNodePrime] + iparmno) -= Osxpgd + Osxpbd ; *(info->SEN_RHS[here->MOS1sNodePrime] + iparmno) -= Osxpgs + Osxpbs;#ifdef SENSDEBUG printf("after capacitive currents\n"); printf("DcbDp=%.7e\n", *(info->SEN_RHS[here->MOS1bNode] + iparmno)); printf("DcdprDp=%.7e\n", *(info->SEN_RHS[here->MOS1dNode] + iparmno)); printf("DcdprmDp=%.7e\n", *(info->SEN_RHS[here->MOS1dNodePrime] + iparmno)); printf("DcsprDp=%.7e\n", *(info->SEN_RHS[here->MOS1sNode] + iparmno)); printf("DcsprmDp=%.7e\n", *(info->SEN_RHS[here->MOS1sNodePrime] + iparmno));#endif /* SENSDEBUG */ }restore: /* 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("MOS1senload end\n");#endif /* SENSDEBUG */ return(OK);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -