📄 bjt2load.c
字号:
czsub=here->BJT2tSubcap*here->BJT2areac; else czsub=here->BJT2tSubcap*here->BJT2areab; ps=here->BJT2tSubpot; xms=model->BJT2exponentialSubstrate; xtf=model->BJT2transitTimeBiasCoeffF; ovtf=model->BJT2transitTimeVBCFactor; xjtf=model->BJT2transitTimeHighCurrentF*here->BJT2area; if(tf != 0 && vbe >0) { argtf=0; arg2=0; arg3=0; if(xtf != 0){ argtf=xtf; if(ovtf != 0) { argtf=argtf*exp(vbc*ovtf); } arg2=argtf; if(xjtf != 0) { temp=cbe/(cbe+xjtf); argtf=argtf*temp*temp; arg2=argtf*(3-temp-temp); } arg3=cbe*argtf*ovtf; } cbe=cbe*(1+argtf)/qb; gbe=(gbe*(1+arg2)-cbe*dqbdve)/qb; geqcb=tf*(arg3-cbe*dqbdvc)/qb; } if (vbe < fcpe) { arg=1-vbe/pe; sarg=exp(-xme*log(arg)); *(ckt->CKTstate0 + here->BJT2qbe)=tf*cbe+pe*czbe* (1-arg*sarg)/(1-xme); capbe=tf*gbe+czbe*sarg; } else { f1=here->BJT2tf1; f2=model->BJT2f2; f3=model->BJT2f3; czbef2=czbe/f2; *(ckt->CKTstate0 + here->BJT2qbe) = tf*cbe+czbe*f1+czbef2* (f3*(vbe-fcpe) +(xme/(pe+pe))*(vbe*vbe-fcpe*fcpe)); capbe=tf*gbe+czbef2*(f3+xme*vbe/pe); } fcpc=here->BJT2tf4; f1=here->BJT2tf5; f2=model->BJT2f6; f3=model->BJT2f7; if (vbc < fcpc) { arg=1-vbc/pc; sarg=exp(-xmc*log(arg)); *(ckt->CKTstate0 + here->BJT2qbc) = tr*cbc+pc*czbc*( 1-arg*sarg)/(1-xmc); capbc=tr*gbc+czbc*sarg; } else { czbcf2=czbc/f2; *(ckt->CKTstate0 + here->BJT2qbc) = tr*cbc+czbc*f1+czbcf2* (f3*(vbc-fcpc) +(xmc/(pc+pc))*(vbc*vbc-fcpc*fcpc)); capbc=tr*gbc+czbcf2*(f3+xmc*vbc/pc); } if(vbx < fcpc) { arg=1-vbx/pc; sarg=exp(-xmc*log(arg)); *(ckt->CKTstate0 + here->BJT2qbx)= pc*czbx* (1-arg*sarg)/(1-xmc); capbx=czbx*sarg; } else { czbxf2=czbx/f2; *(ckt->CKTstate0 + here->BJT2qbx)=czbx*f1+czbxf2* (f3*(vbx-fcpc)+(xmc/(pc+pc))*(vbx*vbx-fcpc*fcpc)); capbx=czbxf2*(f3+xmc*vbx/pc); } if(vsub < 0){ arg=1-vsub/ps; sarg=exp(-xms*log(arg)); *(ckt->CKTstate0 + here->BJT2qsub) = ps*czsub*(1-arg*sarg)/ (1-xms); capsub=czsub*sarg; } else { *(ckt->CKTstate0 + here->BJT2qsub) = vsub*czsub*(1+xms*vsub/ (2*ps)); capsub=czsub*(1+xms*vsub/ps); } here->BJT2capbe = capbe; here->BJT2capbc = capbc; here->BJT2capsub = capsub; here->BJT2capbx = capbx; /* * store small-signal parameters */ if ( (!(ckt->CKTmode & MODETRANOP))|| (!(ckt->CKTmode & MODEUIC)) ) { if(ckt->CKTmode & MODEINITSMSIG) { *(ckt->CKTstate0 + here->BJT2cqbe) = capbe; *(ckt->CKTstate0 + here->BJT2cqbc) = capbc; *(ckt->CKTstate0 + here->BJT2cqsub) = capsub; *(ckt->CKTstate0 + here->BJT2cqbx) = capbx; *(ckt->CKTstate0 + here->BJT2cexbc) = geqcb; if(SenCond){ *(ckt->CKTstate0 + here->BJT2cc) = cc; *(ckt->CKTstate0 + here->BJT2cb) = cb; *(ckt->CKTstate0 + here->BJT2gpi) = gpi; *(ckt->CKTstate0 + here->BJT2gmu) = gmu; *(ckt->CKTstate0 + here->BJT2gm) = gm; *(ckt->CKTstate0 + here->BJT2go) = go; *(ckt->CKTstate0 + here->BJT2gx) = gx; *(ckt->CKTstate0 + here->BJT2gcsub) = gcsub; *(ckt->CKTstate0 + here->BJT2geqbx) = geqbx; }#ifdef SENSDEBUG printf("storing small signal parameters for op\n"); printf("capbe = %.7e ,capbc = %.7e\n",capbe,capbc); printf("capsub = %.7e ,capbx = %.7e\n",capsub,capbx); printf("geqcb = %.7e ,gpi = %.7e\n",geqcb,gpi); printf("gmu = %.7e ,gm = %.7e\n",gmu,gm); printf("go = %.7e ,gx = %.7e\n",go,gx); printf("gcsub = %.7e ,geqbx = %.7e\n",gcsub,geqbx); printf("cc = %.7e ,cb = %.7e\n",cc,cb);#endif /* SENSDEBUG */ continue; /* go to 1000 */ } /* * transient analysis */ if(SenCond && ckt->CKTsenInfo->SENmode == TRANSEN){ *(ckt->CKTstate0 + here->BJT2cc) = cc; *(ckt->CKTstate0 + here->BJT2cb) = cb; *(ckt->CKTstate0 + here->BJT2gx) = gx; continue; } if(ckt->CKTmode & MODEINITTRAN) { *(ckt->CKTstate1 + here->BJT2qbe) = *(ckt->CKTstate0 + here->BJT2qbe) ; *(ckt->CKTstate1 + here->BJT2qbc) = *(ckt->CKTstate0 + here->BJT2qbc) ; *(ckt->CKTstate1 + here->BJT2qbx) = *(ckt->CKTstate0 + here->BJT2qbx) ; *(ckt->CKTstate1 + here->BJT2qsub) = *(ckt->CKTstate0 + here->BJT2qsub) ; } error = NIintegrate(ckt,&geq,&ceq,capbe,here->BJT2qbe); if(error) return(error); geqcb=geqcb*ckt->CKTag[0]; gpi=gpi+geq; cb=cb+*(ckt->CKTstate0 + here->BJT2cqbe); error = NIintegrate(ckt,&geq,&ceq,capbc,here->BJT2qbc); if(error) return(error); gmu=gmu+geq; cb=cb+*(ckt->CKTstate0 + here->BJT2cqbc); cc=cc-*(ckt->CKTstate0 + here->BJT2cqbc); if(ckt->CKTmode & MODEINITTRAN) { *(ckt->CKTstate1 + here->BJT2cqbe) = *(ckt->CKTstate0 + here->BJT2cqbe); *(ckt->CKTstate1 + here->BJT2cqbc) = *(ckt->CKTstate0 + here->BJT2cqbc); } } } if(SenCond) goto next2; /* * check convergence */ if ( (!(ckt->CKTmode & MODEINITFIX))||(!(here->BJT2off))) { if (icheck == 1) { ckt->CKTnoncon++; ckt->CKTtroubleElt = (GENinstance *) here; } } /* * charge storage for c-s and b-x junctions */ if(ckt->CKTmode & (MODETRAN | MODEAC)) { error = NIintegrate(ckt,&gcsub,&ceq,capsub,here->BJT2qsub); if(error) return(error); error = NIintegrate(ckt,&geqbx,&ceq,capbx,here->BJT2qbx); if(error) return(error); if(ckt->CKTmode & MODEINITTRAN) { *(ckt->CKTstate1 + here->BJT2cqbx) = *(ckt->CKTstate0 + here->BJT2cqbx); *(ckt->CKTstate1 + here->BJT2cqsub) = *(ckt->CKTstate0 + here->BJT2cqsub); } }next2: *(ckt->CKTstate0 + here->BJT2vbe) = vbe; *(ckt->CKTstate0 + here->BJT2vbc) = vbc; *(ckt->CKTstate0 + here->BJT2cc) = cc; *(ckt->CKTstate0 + here->BJT2cb) = cb; *(ckt->CKTstate0 + here->BJT2gpi) = gpi; *(ckt->CKTstate0 + here->BJT2gmu) = gmu; *(ckt->CKTstate0 + here->BJT2gm) = gm; *(ckt->CKTstate0 + here->BJT2go) = go; *(ckt->CKTstate0 + here->BJT2gx) = gx; *(ckt->CKTstate0 + here->BJT2geqcb) = geqcb; *(ckt->CKTstate0 + here->BJT2gcsub) = gcsub; *(ckt->CKTstate0 + here->BJT2geqbx) = geqbx; *(ckt->CKTstate0 + here->BJT2vsub) = vsub; *(ckt->CKTstate0 + here->BJT2gdsub) = gdsub; *(ckt->CKTstate0 + here->BJT2cdsub) = cdsub; /* Do not load the Jacobian and the rhs if perturbation is being carried out */ if(SenCond)continue;load: m = here->BJT2m; /* * load current excitation vector */ geqsub = gcsub + gdsub; ceqsub=model->BJT2type * model->BJT2subs * (*(ckt->CKTstate0 + here->BJT2cqsub) + cdsub - vsub*geqsub);/* ceqsub=model->BJT2type * (*(ckt->CKTstate0 + here->BJT2cqsub) + model->BJT2subs*cdsub - vsub*geqsub);*/ ceqbx=model->BJT2type * (*(ckt->CKTstate0 + here->BJT2cqbx) - vbx * geqbx); ceqbe=model->BJT2type * (cc + cb - vbe * (gm + go + gpi) + vbc * (go - geqcb)); ceqbc=model->BJT2type * (-cc + vbe * (gm + go) - vbc * (gmu + go)); *(ckt->CKTrhs + here->BJT2baseNode) += m * (-ceqbx); *(ckt->CKTrhs + here->BJT2colPrimeNode) += m * (ceqbx+ceqbc); *(ckt->CKTrhs + here->BJT2substConNode) += m * ceqsub; *(ckt->CKTrhs + here->BJT2basePrimeNode) += m * (-ceqbe-ceqbc); *(ckt->CKTrhs + here->BJT2emitPrimeNode) += m * (ceqbe); *(ckt->CKTrhs + here->BJT2substNode) += m * (-ceqsub); /* * load y matrix */ *(here->BJT2colColPtr) += m * (gcpr); *(here->BJT2baseBasePtr) += m * (gx+geqbx); *(here->BJT2emitEmitPtr) += m * (gepr); *(here->BJT2colPrimeColPrimePtr) += m * (gmu+go+gcpr+geqbx); *(here->BJT2substConSubstConPtr) += m * (geqsub); *(here->BJT2basePrimeBasePrimePtr) += m * (gx +gpi+gmu+geqcb); *(here->BJT2emitPrimeEmitPrimePtr) += m * (gpi+gepr+gm+go); *(here->BJT2colColPrimePtr) += m * (-gcpr); *(here->BJT2baseBasePrimePtr) += m * (-gx); *(here->BJT2emitEmitPrimePtr) += m * (-gepr); *(here->BJT2colPrimeColPtr) += m * (-gcpr); *(here->BJT2colPrimeBasePrimePtr) += m * (-gmu+gm); *(here->BJT2colPrimeEmitPrimePtr) += m * (-gm-go); *(here->BJT2basePrimeBasePtr) += m * (-gx); *(here->BJT2basePrimeColPrimePtr) += m * (-gmu-geqcb); *(here->BJT2basePrimeEmitPrimePtr) += m * (-gpi); *(here->BJT2emitPrimeEmitPtr) += m * (-gepr); *(here->BJT2emitPrimeColPrimePtr) += m * (-go+geqcb); *(here->BJT2emitPrimeBasePrimePtr) += m * (-gpi-gm-geqcb); *(here->BJT2substSubstPtr) += m * (geqsub); *(here->BJT2substConSubstPtr) += m * (-geqsub); *(here->BJT2substSubstConPtr) += m * (-geqsub); *(here->BJT2baseColPrimePtr) += m * (-geqbx); *(here->BJT2colPrimeBasePtr) += m * (-geqbx); } } return(OK);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -