📄 bjtsacl.c
字号:
*(here->BJTsenGo + 3)= *(ckt->CKTstate0 + here->BJTgo); *(here->BJTsenGx + 3)= *(ckt->CKTstate0 + here->BJTgx); *(here->BJTsenCpi + 3)= *(ckt->CKTstate0 + here->BJTcqbe); *(here->BJTsenCmu + 3)= *(ckt->CKTstate0 + here->BJTcqbc); *(here->BJTsenCbx + 3)= *(ckt->CKTstate0 + here->BJTcqbx); *(here->BJTsenCcs + 3)= *(ckt->CKTstate0 + here->BJTcqcs); *(here->BJTsenCmcb + 3)= *(ckt->CKTstate0 + here->BJTcexbc); } flag = 2; goto load;pertvbc: /* Perturbation of vbc */#ifdef SENSDEBUG printf("\nPerturbation of vbc\n");#endif /* SENSDEBUG */ *(ckt->CKTstate0 + here->BJTvbe) = A0; A0 = vbcOp; DELA = info->SENpertfac * vte ; Apert = A0 + DELA; DELAinv = 1.0/DELA; *(ckt->CKTstate0 + here->BJTvbc) = Apert; *(ckt->CKTstate0 + here->BJTvbe) = vbeOp; if(info->SENacpertflag == 1){ /* store the small signal parameters * corresponding to perturbed vbc */ if(error = BJTload((GENmodel*)model,ckt)) return(error); *(here->BJTsenGpi + 4)= *(ckt->CKTstate0 + here->BJTgpi); *(here->BJTsenGmu + 4)= *(ckt->CKTstate0 + here->BJTgmu); *(here->BJTsenGm + 4)= *(ckt->CKTstate0 + here->BJTgm); *(here->BJTsenGo + 4)= *(ckt->CKTstate0 + here->BJTgo); *(here->BJTsenGx + 4)= *(ckt->CKTstate0 + here->BJTgx); *(here->BJTsenCpi + 4)= *(ckt->CKTstate0 + here->BJTcqbe); *(here->BJTsenCmu + 4)= *(ckt->CKTstate0 + here->BJTcqbc); *(here->BJTsenCbx + 4)= *(ckt->CKTstate0 + here->BJTcqbx); *(here->BJTsenCcs + 4)= *(ckt->CKTstate0 + here->BJTcqcs); *(here->BJTsenCmcb + 4)= *(ckt->CKTstate0 + here->BJTcexbc); } flag = 3; goto load;pertvcs: /* Perturbation of vcs */#ifdef SENSDEBUG printf("\nPerturbation of vcs\n");#endif /* SENSDEBUG */ *(ckt->CKTstate0 + here->BJTvbc) = A0; A0 = model->BJTtype * (*(ckt->CKTrhsOp + here->BJTsubstNode) - *(ckt->CKTrhsOp + here->BJTcolPrimeNode)); DELA = info->SENpertfac * A0 + 1e-8; Apert = A0 + DELA; DELAinv = model->BJTtype * 1.0/DELA; *(ckt->CKTrhsOp + here->BJTsubstNode) += DELA; *(ckt->CKTstate0 + here->BJTvbe) = vbeOp; *(ckt->CKTstate0 + here->BJTvbc) = vbcOp; if(info->SENacpertflag == 1){ /* store the small signal parameters * corresponding to perturbed vcs */ if(error = BJTload((GENmodel*)model,ckt)) return(error); *(here->BJTsenCcs + 5)= *(ckt->CKTstate0 + here->BJTcqcs); } flag = 4; *(ckt->CKTrhsOp + here->BJTsubstNode) -= DELA; xccs= *(here->BJTsenCcs + 5) * ckt->CKTomega; ccs=( -xccs * ivcs) ; iccs= xccs * vcs ; cs = -ccs; ics = -iccs; ccprm = ccprm0 + cs0 - cs; iccprm = iccprm0 + ics0 - ics; cbprm = cbprm0; icbprm = icbprm0; ceprm = ceprm0; iceprm = iceprm0; cc = cc0; icc = icc0; ce = ce0; ice = ice0; cb = cb0; icb = icb0; goto next2;load: gcpr=model->BJTcollectorConduct * here->BJTarea; gepr=model->BJTemitterConduct * here->BJTarea; gpi= *(here->BJTsenGpi + flag+1); gmu= *(here->BJTsenGmu + flag+1); gm= *(here->BJTsenGm + flag+1); go= *(here->BJTsenGo + flag+1); gx= *(here->BJTsenGx + flag+1); xgm=0; td=model->BJTexcessPhase; if(td != 0) { arg = td*ckt->CKTomega; gm = gm+go; xgm = -gm * sin(arg); gm = gm * cos(arg)-go; } xcpi= *(here->BJTsenCpi + flag+1) * ckt->CKTomega; xcmu= *(here->BJTsenCmu + flag+1) * ckt->CKTomega; xcbx= *(here->BJTsenCbx + flag+1) * ckt->CKTomega; xccs= *(here->BJTsenCcs + flag+1) * ckt->CKTomega; xcmcb= *(here->BJTsenCmcb + flag+1) * ckt->CKTomega; cc=gcpr * vcpr ; icc=gcpr * ivcpr ; ce=gepr * vepr; ice=gepr * ivepr ; cx=gx * vx ; icx=gx * ivx; cbx=( -xcbx * ivbx) ; icbx= xcbx * vbx ; ccs=( -xccs * ivcs) ; iccs= xccs * vcs ; cbc=(gmu * vbc -xcmu * ivbc) ; icbc=xcmu * vbc + gmu * ivbc ; cbe=gpi * vbe -xcpi * ivbe - xcmcb * ivbc ; icbe=xcpi * vbe + gpi * ivbe + xcmcb * vbc; cce= go * vce + gm * vbe - xgm * ivbe; icce=go * ivce + gm * ivbe + xgm * vbe ; cb= cx + cbx; icb= icx + icbx; if(here->BJTbaseNode != here->BJTbasePrimeNode){ cbprm=(- cx + cbe + cbc); icbprm=(- icx + icbe + icbc); } else{ cbprm=( cbx + cbe + cbc); icbprm=(icbx + icbe + icbc); } ccprm=(- cbx - cc + ccs + cce - cbc); iccprm=(- icbx - icc + iccs + icce - icbc); ceprm=(- cbe - cce - ce); iceprm=(- icbe - icce - ice); cs= (- ccs) ; ics= (- iccs) ;#ifdef SENSDEBUG printf("A0 = %.7e , Apert = %.7e , DELA = %.7e\n" ,A0,Apert,DELA); printf("gepr = %.7e , gcpr = %.7e , gmu = %.7e, gpi = %.7e\n" ,gepr,gcpr,gmu,gpi); printf("gm = %.7e , go = %.7e , gx = %.7e, xcpi = %.7e\n" ,gm,go,gx,xcpi); printf("xcmu = %.7e , xcbx = %.7e , xccs = %.7e, xcmcb = %.7e\n" ,xcmu,xcbx,xccs,xcmcb); printf("cx = %.7e + j%.7e , cbx = %.7e + j%.7e\n" ,cx,icx,cbx,icbx); printf("ccs %.7e + j%.7e , cbc = %.7e + j%.7e" ,ccs,iccs,cbc,icbc); printf("cbe %.7e + j%.7e , cce = %.7e + j%.7e\n" ,cbe,icbe,cce,icce); printf("cc = %.7e + j%.7e , ce = %.7e + j%.7e,", ,cc,icc,ce,ice); printf("ccprm = %.7e + j%.7e , ceprm = %.7e + j%.7e", ccprm,iccprm,ceprm,iceprm); printf("cb = %.7e + j%.7e , cbprm = %.7e + j%.7e , ", cb,icb,cbprm,icbprm) printf("cs = %.7e + j%.7e\n", cs,ics);#endif /* SENSDEBUG */ /* load the RHS matrix */next2: for(iparmno = 1;iparmno<=info->SENparms;iparmno++){ if( (!flag) && (iparmno != here->BJTsenParmNo) ) continue; switch(flag){ case 0: /* area : so no DC sensitivity term involved */ DvDp = 1.0; break; /* calculate the DC sensitivities of operating points */ case 1: DvDp = model->BJTtype * (info->SEN_Sap[here->BJTbaseNode][iparmno] - info->SEN_Sap[here->BJTcolPrimeNode][iparmno]); break; case 2: DvDp = model->BJTtype * (info->SEN_Sap[here->BJTbasePrimeNode][iparmno] - info->SEN_Sap[here->BJTemitPrimeNode][iparmno]); break; case 3: DvDp = model->BJTtype * (info->SEN_Sap[here->BJTbasePrimeNode][iparmno] - info->SEN_Sap[here->BJTcolPrimeNode][iparmno]); break; case 4: DvDp = model->BJTtype * (info->SEN_Sap[here->BJTsubstNode][iparmno] - info->SEN_Sap[here->BJTcolPrimeNode][iparmno]); break; }#ifdef SENSDEBUG printf("before loading\n"); printf("BJTtype = %d\n",model->BJTtype); printf("DvDp = %.7e , flag = %d , iparmno = %d,senparmno = %d\n" ,DvDp,flag,iparmno,here->BJTsenParmNo); printf("senb = %.7e + j%.7e\n " ,*(info->SEN_RHS[here->BJTbaseNode] + iparmno), *(info->SEN_iRHS[here->BJTbaseNode] + iparmno)); printf("senbrm = %.7e + j%.7e\n " ,*(info->SEN_RHS[here->BJTbasePrimeNode] + iparmno), *(info->SEN_iRHS[here->BJTbasePrimeNode] + iparmno)); printf("senc = %.7e + j%.7e\n " ,*(info->SEN_RHS[here->BJTcolNode] + iparmno), *(info->SEN_iRHS[here->BJTcolNode] + iparmno)); printf("sencprm = %.7e + j%.7e\n " ,*(info->SEN_RHS[here->BJTcolPrimeNode] + iparmno), *(info->SEN_iRHS[here->BJTcolPrimeNode] + iparmno)); printf("sene = %.7e + j%.7e\n " ,*(info->SEN_RHS[here->BJTemitNode] + iparmno), *(info->SEN_iRHS[here->BJTemitNode] + iparmno)); printf("seneprm = %.7e + j%.7e\n " ,*(info->SEN_RHS[here->BJTemitPrimeNode] + iparmno), *(info->SEN_iRHS[here->BJTemitPrimeNode] + iparmno)); printf("sens = %.7e + j%.7e\n " ,*(info->SEN_RHS[here->BJTsubstNode] + iparmno), *(info->SEN_iRHS[here->BJTsubstNode] + iparmno));#endif /* SENSDEBUG */ if(here->BJTbaseNode != here->BJTbasePrimeNode){ *(info->SEN_RHS[here->BJTbaseNode] + iparmno) -= ( cb - cb0) * DELAinv * DvDp; *(info->SEN_iRHS[here->BJTbaseNode] + iparmno) -= ( icb - icb0) * DELAinv * DvDp; } *(info->SEN_RHS[here->BJTbasePrimeNode] + iparmno) -= ( cbprm - cbprm0) * DELAinv * DvDp; *(info->SEN_iRHS[here->BJTbasePrimeNode] + iparmno) -= ( icbprm - icbprm0) * DELAinv * DvDp; if(here->BJTcolNode != here->BJTcolPrimeNode){ *(info->SEN_RHS[here->BJTcolNode] + iparmno) -= ( cc - cc0) * DELAinv * DvDp; *(info->SEN_iRHS[here->BJTcolNode] + iparmno) -= ( icc - icc0) * DELAinv * DvDp; } *(info->SEN_RHS[here->BJTcolPrimeNode] + iparmno) -= ( ccprm - ccprm0) * DELAinv * DvDp; *(info->SEN_iRHS[here->BJTcolPrimeNode] + iparmno) -= ( iccprm - iccprm0) * DELAinv * DvDp; if(here->BJTemitNode != here->BJTemitPrimeNode){ *(info->SEN_RHS[here->BJTemitNode] + iparmno) -= ( ce - ce0) * DELAinv * DvDp; *(info->SEN_iRHS[here->BJTemitNode] + iparmno) -= ( ice - ice0) * DELAinv * DvDp; } *(info->SEN_RHS[here->BJTemitPrimeNode] + iparmno) -= ( ceprm - ceprm0) * DELAinv * DvDp; *(info->SEN_iRHS[here->BJTemitPrimeNode] + iparmno) -= ( iceprm - iceprm0) * DELAinv * DvDp; *(info->SEN_RHS[here->BJTsubstNode] + iparmno) -= ( cs - cs0) * DELAinv * DvDp; *(info->SEN_iRHS[here->BJTsubstNode] + iparmno) -= ( ics - ics0) * DELAinv * DvDp;#ifdef SENSDEBUG printf("after loading\n"); printf("senb = %.7e + j%.7e\n " ,*(info->SEN_RHS[here->BJTbaseNode] + iparmno), *(info->SEN_iRHS[here->BJTbaseNode] + iparmno)); printf("senbrm = %.7e + j%.7e\n " ,*(info->SEN_RHS[here->BJTbasePrimeNode] + iparmno), *(info->SEN_iRHS[here->BJTbasePrimeNode] + iparmno)); printf("senc = %.7e + j%.7e\n " ,*(info->SEN_RHS[here->BJTcolNode] + iparmno), *(info->SEN_iRHS[here->BJTcolNode] + iparmno)); printf("sencprm = %.7e + j%.7e\n " ,*(info->SEN_RHS[here->BJTcolPrimeNode] + iparmno), *(info->SEN_iRHS[here->BJTcolPrimeNode] + iparmno)); printf("sene = %.7e + j%.7e\n " ,*(info->SEN_RHS[here->BJTemitNode] + iparmno), *(info->SEN_iRHS[here->BJTemitNode] + iparmno)); printf("seneprm = %.7e + j%.7e\n " ,*(info->SEN_RHS[here->BJTemitPrimeNode] + iparmno), *(info->SEN_iRHS[here->BJTemitPrimeNode] + iparmno)); printf("sens = %.7e + j%.7e\n " ,*(info->SEN_RHS[here->BJTsubstNode] + iparmno), *(info->SEN_iRHS[here->BJTsubstNode] + iparmno));#endif /* SENSDEBUG */ }next1: switch(flag){ case 0: if (*(here->BJTsenCbx) == 0){ here->BJTarea = A0; goto pertvbe ; } else{ goto pertvbx; } case 1: goto pertvbe ; case 2: goto pertvbc ; case 3: goto pertvcs ; case 4: break; } /* put the unperturbed values back into the state vector */ for(i=0; i <= 20; i++) { *(ckt->CKTstate0 + here->BJTstate + i) = *(SaveState + i); } here->BJTsenPertFlag = OFF; } } info->SENstatus = NORMAL;#ifdef SENSDEBUG printf("BJTsenacload end\n");#endif /* SENSDEBUG */ return(OK);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -