diff --git a/src/spicelib/devices/bjt/ChangeLog b/src/spicelib/devices/bjt/ChangeLog index bc1d9061c..e9e419883 100644 --- a/src/spicelib/devices/bjt/ChangeLog +++ b/src/spicelib/devices/bjt/ChangeLog @@ -1,8 +1,12 @@ -1999-09-07 Arno +2000-09-02 Arno W. Peters + + * bjtdset.c: reformatted + +1999-09-07 Arno W. Peters * bjtnoise.c: removed unused variable `error'. -1999-09-06 Arno Peters +1999-09-06 Arno W. Peters * bjtnoise.c: Reformatted comment. diff --git a/src/spicelib/devices/bjt/bjtdset.c b/src/spicelib/devices/bjt/bjtdset.c index 62742a6bb..884c95390 100644 --- a/src/spicelib/devices/bjt/bjtdset.c +++ b/src/spicelib/devices/bjt/bjtdset.c @@ -96,57 +96,57 @@ BJTdSetup(GENmodel *inModel, CKTcircuit *ckt) double vbed; double vbb; -double lcapbc1 = 0.0; -double lcapbc2 = 0.0; -double lcapbc3 = 0.0; + double lcapbc1 = 0.0; + double lcapbc2 = 0.0; + double lcapbc3 = 0.0; -double lcapsc1 = 0.0; -double lcapsc2 = 0.0; -double lcapsc3 = 0.0; -double ic; -double dummy; -Dderivs d_p, d_q, d_r; -Dderivs d_dummy, d_q1, d_qb, d_dummy2; -Dderivs d_arg, d_sqarg, d_ic, d_q2; -Dderivs d_z, d_tanz, d_vbb, d_ibb, d_rbb; -Dderivs d_ib, d_cbe, d_tff, d_qbe; + double lcapsc1 = 0.0; + double lcapsc2 = 0.0; + double lcapsc3 = 0.0; + double ic; + double dummy; + Dderivs d_p, d_q, d_r; + Dderivs d_dummy, d_q1, d_qb, d_dummy2; + Dderivs d_arg, d_sqarg, d_ic, d_q2; + Dderivs d_z, d_tanz, d_vbb, d_ibb, d_rbb; + Dderivs d_ib, d_cbe, d_tff, d_qbe; -d_p.value = 0.0; -d_p.d1_p = 1.0; -d_p.d1_q = 0.0; -d_p.d1_r = 0.0; -d_p.d2_p2 = 0.0; -d_p.d2_q2 = 0.0; -d_p.d2_r2 = 0.0; -d_p.d2_pq = 0.0; -d_p.d2_qr = 0.0; -d_p.d2_pr = 0.0; -d_p.d3_p3 = 0.0; -d_p.d3_q3 = 0.0; -d_p.d3_r3 = 0.0; -d_p.d3_p2q = 0.0; -d_p.d3_p2r = 0.0; -d_p.d3_pq2 = 0.0; -d_p.d3_q2r = 0.0; -d_p.d3_pr2 = 0.0; -d_p.d3_qr2 = 0.0; -d_p.d3_pqr = 0.0; + d_p.value = 0.0; + d_p.d1_p = 1.0; + d_p.d1_q = 0.0; + d_p.d1_r = 0.0; + d_p.d2_p2 = 0.0; + d_p.d2_q2 = 0.0; + d_p.d2_r2 = 0.0; + d_p.d2_pq = 0.0; + d_p.d2_qr = 0.0; + d_p.d2_pr = 0.0; + d_p.d3_p3 = 0.0; + d_p.d3_q3 = 0.0; + d_p.d3_r3 = 0.0; + d_p.d3_p2q = 0.0; + d_p.d3_p2r = 0.0; + d_p.d3_pq2 = 0.0; + d_p.d3_q2r = 0.0; + d_p.d3_pr2 = 0.0; + d_p.d3_qr2 = 0.0; + d_p.d3_pqr = 0.0; -EqualDeriv(&d_q, &d_p); -d_q.d1_q = 1.0; -d_q.d1_p = 0.0; + EqualDeriv(&d_q, &d_p); + d_q.d1_q = 1.0; + d_q.d1_p = 0.0; -EqualDeriv(&d_r, &d_p); -d_r.d1_r = 1.0; -d_r.d1_p = 0.0; + EqualDeriv(&d_r, &d_p); + d_r.d1_r = 1.0; + d_r.d1_p = 0.0; -/* loop through all the models */ -for( ; model != NULL; model = model->BJTnextModel ) { + /* loop through all the models */ + for( ; model != NULL; model = model->BJTnextModel ) { /* loop through all the instances of the model */ for (here = model->BJTinstances; here != NULL ; - here=here->BJTnextInstance) { + here=here->BJTnextInstance) { vt = here->BJTtemp * CONSTKoverQ; @@ -169,60 +169,56 @@ for( ; model != NULL; model = model->BJTnextModel ) { /* * initialization */ - vbe= model->BJTtype*(*(ckt->CKTrhsOld + here->BJTbasePrimeNode) - - *(ckt->CKTrhsOld + here->BJTemitPrimeNode)); - vbc= model->BJTtype*(*(ckt->CKTrhsOld + here->BJTbaseNode) - - *(ckt->CKTrhsOld + here->BJTcolPrimeNode)); - vbx=model->BJTtype*( - *(ckt->CKTrhsOld+here->BJTbaseNode)- - *(ckt->CKTrhsOld+here->BJTcolPrimeNode)); - vsc=model->BJTtype*( - *(ckt->CKTrhsOld+here->BJTsubstNode)- - *(ckt->CKTrhsOld+here->BJTcolPrimeNode)); + vbe= model->BJTtype*(*(ckt->CKTrhsOld + here->BJTbasePrimeNode) - + *(ckt->CKTrhsOld + here->BJTemitPrimeNode)); + vbc= model->BJTtype*(*(ckt->CKTrhsOld + here->BJTbaseNode) - + *(ckt->CKTrhsOld + here->BJTcolPrimeNode)); + vbx=model->BJTtype*( + *(ckt->CKTrhsOld+here->BJTbaseNode)- + *(ckt->CKTrhsOld+here->BJTcolPrimeNode)); + vsc=model->BJTtype*( + *(ckt->CKTrhsOld+here->BJTsubstNode)- + *(ckt->CKTrhsOld+here->BJTcolPrimeNode)); - vbb=model->BJTtype*( - *(ckt->CKTrhsOld+here->BJTbaseNode) - - *(ckt->CKTrhsOld+here->BJTbasePrimeNode)); + vbb=model->BJTtype*( + *(ckt->CKTrhsOld+here->BJTbaseNode) - + *(ckt->CKTrhsOld+here->BJTbasePrimeNode)); - vbed = vbe; /* this is just a dummy variable - * it is the delayed vbe to be - * used in the delayed gm generator - */ + vbed = vbe; /* this is just a dummy variable + * it is the delayed vbe to be + * used in the delayed gm generator + */ - /* ic = f1(vbe,vbc,vbed) + f2(vbc) + f3(vbc) - * - * we shall calculate the taylor coeffs of - * ic wrt vbe, vbed, and vbc and store them away. - * the equations f1 f2 and f3 are given elsewhere; - * we shall start off with f1, compute - * derivs. upto third order and then do f2 and - * f3 and add their derivatives. - * - * Since f1 above is a function of three variables, it - * will be convenient to use derivative structures - * to compute the derivatives of f1. For this - * computation, p=vbe, q=vbc, r=vbed. - * - * ib = f1(vbe) + f2(vbc) (not the same f's as - * above, in case you are - * wondering!) - * the gbe's gbc's gben's and gbcn's are - * convenient subsidiary variables. - * - * irb = f(vbe, vbc, vbb) - the vbe & vbc - * dependencies arise from the - * qb term. - * qbe = f1(vbe,vbc) + f2(vbe) - * - * derivative structures will be used again in the - * above two equations. p=vbe, q=vbc, r=vbb. - * - * qbc = f(vbc) ; qbx = f(vbx) - * - * qss = f(vsc) - */ + /* ic = f1(vbe,vbc,vbed) + f2(vbc) + f3(vbc) + * + * we shall calculate the taylor coeffs of ic wrt vbe, + * vbed, and vbc and store them away. the equations f1 f2 + * and f3 are given elsewhere; we shall start off with f1, + * compute derivs. upto third order and then do f2 and f3 + * and add their derivatives. + * + * Since f1 above is a function of three variables, it + * will be convenient to use derivative structures to + * compute the derivatives of f1. For this computation, + * p=vbe, q=vbc, r=vbed. + * + * ib = f1(vbe) + f2(vbc) (not the same f's as above, in + * case you are wondering!) the gbe's gbc's gben's and + * gbcn's are convenient subsidiary variables. + * + * irb = f(vbe, vbc, vbb) - the vbe & vbc dependencies + * arise from the qb term. + * + * qbe = f1(vbe,vbc) + f2(vbe) + * + * derivative structures will be used again in the above + * two equations. p=vbe, q=vbc, r=vbb. + * + * qbc = f(vbc) ; qbx = f(vbx) + * + * qss = f(vsc) */ /* * determine dc current and derivitives */ @@ -283,19 +279,21 @@ for( ; model != NULL; model = model->BJTnextModel ) { /* * determine base charge terms */ - /* q1 is a function of 2 variables p=vbe and q=vbc. r= - * anything - */ + /* q1 is a function of 2 variables p=vbe and q=vbc. r= + * anything + */ q1=1/(1-model->BJTinvEarlyVoltF*vbc-model->BJTinvEarlyVoltR*vbe); dummy = (1-model->BJTinvEarlyVoltF*vbc- - model->BJTinvEarlyVoltR*vbe); - EqualDeriv(&d_dummy, &d_p); - d_dummy.value = dummy; - d_dummy.d1_p = - model->BJTinvEarlyVoltR; - d_dummy.d1_q = - model->BJTinvEarlyVoltF; - /* q1 = 1/dummy */ - InvDeriv(&d_q1, &d_dummy); /* now q1 and its derivatives are - set up */ + model->BJTinvEarlyVoltR*vbe); + EqualDeriv(&d_dummy, &d_p); + d_dummy.value = dummy; + d_dummy.d1_p = - model->BJTinvEarlyVoltR; + d_dummy.d1_q = - model->BJTinvEarlyVoltF; + + /* q1 = 1/dummy */ + InvDeriv(&d_q1, &d_dummy); + + /* now q1 and its derivatives are set up */ if(oik == 0 && oikr == 0) { qb=q1; EqualDeriv(&d_qb, &d_q1); @@ -312,21 +310,21 @@ for( ; model != NULL; model = model->BJTnextModel ) { arg=MAX(0,1+4*q2); if (arg == 0.) { - EqualDeriv(&d_arg,&d_p); - d_arg.d1_p = 0.0; + EqualDeriv(&d_arg,&d_p); + d_arg.d1_p = 0.0; } else { - TimesDeriv(&d_arg,&d_q2,4.0); - d_arg.value += 1.; + TimesDeriv(&d_arg,&d_q2,4.0); + d_arg.value += 1.; } sqarg=1; EqualDeriv(&d_sqarg,&d_p); d_sqarg.value = 1.0; d_sqarg.d1_p = 0.0; if(arg != 0){ - sqarg=sqrt(arg); - SqrtDeriv(&d_sqarg, &d_arg); + sqarg=sqrt(arg); + SqrtDeriv(&d_sqarg, &d_arg); } qb=q1*(1+sqarg)/2; @@ -337,129 +335,131 @@ for( ; model != NULL; model = model->BJTnextModel ) { TimesDeriv(&d_qb, &d_qb, 0.5); } -ic = (cbe - cbc)/qb; -/* cbe is a fn of vbed only; cbc of vbc; and qb of vbe and vbc */ -/* p=vbe, q=vbc, r=vbed; now dummy = cbe - cbc */ -EqualDeriv(&d_dummy, &d_p); -d_dummy.d1_p = 0.0; -d_dummy.value = cbe-cbc; -d_dummy.d1_r = gbe; -d_dummy.d2_r2 = gbe2; -d_dummy.d3_r3 = gbe3; -d_dummy.d1_q = -gbc; -d_dummy.d2_q2 = -gbc2; -d_dummy.d3_q3 = -gbc3; + ic = (cbe - cbc)/qb; + /* cbe is a fn of vbed only; cbc of vbc; and qb of vbe and vbc */ + /* p=vbe, q=vbc, r=vbed; now dummy = cbe - cbc */ + EqualDeriv(&d_dummy, &d_p); + d_dummy.d1_p = 0.0; + d_dummy.value = cbe-cbc; + d_dummy.d1_r = gbe; + d_dummy.d2_r2 = gbe2; + d_dummy.d3_r3 = gbe3; + d_dummy.d1_q = -gbc; + d_dummy.d2_q2 = -gbc2; + d_dummy.d3_q3 = -gbc3; -DivDeriv(&d_ic, &d_dummy, &d_qb); + DivDeriv(&d_ic, &d_dummy, &d_qb); -d_ic.value -= cbc/here->BJTtBetaR + cbcn; -d_ic.d1_q -= gbc/here->BJTtBetaR + gbcn; -d_ic.d2_q2 -= gbc2/here->BJTtBetaR + gbcn2; -d_ic.d3_q3 -= gbc3/here->BJTtBetaR + gbcn3; + d_ic.value -= cbc/here->BJTtBetaR + cbcn; + d_ic.d1_q -= gbc/here->BJTtBetaR + gbcn; + d_ic.d2_q2 -= gbc2/here->BJTtBetaR + gbcn2; + d_ic.d3_q3 -= gbc3/here->BJTtBetaR + gbcn3; -/* check this point: where is the f2(vbe) contribution to ic ? */ + /* check this point: where is the f2(vbe) contribution to ic ? */ - /* ic derivatives all set up now */ + /* ic derivatives all set up now */ /* base spread resistance */ - if ( !((rbpr == 0.0) && (rbpi == 0.0))) - { - cb=cbe/here->BJTtBetaF+cben+cbc/here->BJTtBetaR+cbcn; - /* we are calculating derivatives w.r.t cb itself */ - /* - gx=rbpr+rbpi/qb; - */ - - if (cb != 0.0) { - if((xjrb != 0.0) && (rbpi != 0.0)) { - /* p = ib, q, r = anything */ - dummy=MAX(cb/xjrb,1e-9); - EqualDeriv(&d_dummy, &d_p); - d_dummy.value = dummy; - d_dummy.d1_p = 1/xjrb; - SqrtDeriv(&d_dummy, &d_dummy); - TimesDeriv(&d_dummy, &d_dummy, 2.4317); - + if ( !((rbpr == 0.0) && (rbpi == 0.0))) + { + cb=cbe/here->BJTtBetaF+cben+cbc/here->BJTtBetaR+cbcn; + /* we are calculating derivatives w.r.t cb itself */ /* - dummy2=(-1+sqrt(1+14.59025*MAX(cb/xjrb,1e-9))); + gx=rbpr+rbpi/qb; */ - EqualDeriv(&d_dummy2, &d_p); - d_dummy2.value = 1+14.59025*MAX(cb/xjrb,1e-9); - d_dummy2.d1_p = 14.59025/xjrb; - SqrtDeriv(&d_dummy2, &d_dummy2); - d_dummy2.value -= 1.0; - DivDeriv(&d_z, &d_dummy2, &d_dummy); - TanDeriv(&d_tanz, &d_z); + if (cb != 0.0) { + if((xjrb != 0.0) && (rbpi != 0.0)) { + /* p = ib, q, r = anything */ + dummy=MAX(cb/xjrb,1e-9); + EqualDeriv(&d_dummy, &d_p); + d_dummy.value = dummy; + d_dummy.d1_p = 1/xjrb; + SqrtDeriv(&d_dummy, &d_dummy); + TimesDeriv(&d_dummy, &d_dummy, 2.4317); - /*now using dummy = tanz - z and dummy2 = z*tanz*tanz */ - TimesDeriv(&d_dummy, &d_z, -1.0); - PlusDeriv(&d_dummy, &d_dummy, &d_tanz); + /* + dummy2=(-1+sqrt(1+14.59025*MAX(cb/xjrb,1e-9))); + */ + EqualDeriv(&d_dummy2, &d_p); + d_dummy2.value = 1+14.59025*MAX(cb/xjrb,1e-9); + d_dummy2.d1_p = 14.59025/xjrb; + SqrtDeriv(&d_dummy2, &d_dummy2); + d_dummy2.value -= 1.0; - MultDeriv(&d_dummy2, &d_tanz, &d_tanz); - MultDeriv(&d_dummy2, &d_dummy2, &d_z); + DivDeriv(&d_z, &d_dummy2, &d_dummy); + TanDeriv(&d_tanz, &d_z); - DivDeriv(&d_rbb , &d_dummy, &d_dummy2); - TimesDeriv(&d_rbb,&d_rbb, 3.0*rbpi); - d_rbb.value += rbpr; + /* now using dummy = tanz - z and dummy2 = + z*tanz*tanz */ + TimesDeriv(&d_dummy, &d_z, -1.0); + PlusDeriv(&d_dummy, &d_dummy, &d_tanz); - MultDeriv(&d_vbb, &d_rbb, &d_p); + MultDeriv(&d_dummy2, &d_tanz, &d_tanz); + MultDeriv(&d_dummy2, &d_dummy2, &d_z); - /* power series inversion to get the conductance derivatives */ + DivDeriv(&d_rbb , &d_dummy, &d_dummy2); + TimesDeriv(&d_rbb,&d_rbb, 3.0*rbpi); + d_rbb.value += rbpr; - if (d_vbb.d1_p != 0) { - gbb1 = 1/d_vbb.d1_p; - gbb2 = -(d_vbb.d2_p2*0.5)*gbb1*gbb1; - gbb3 = gbb1*gbb1*gbb1*gbb1*(-(d_vbb.d3_p3/6.0) - + 2*(d_vbb.d2_p2*0.5)*(d_vbb.d2_p2*0.5)*gbb1); + MultDeriv(&d_vbb, &d_rbb, &d_p); + + /* power series inversion to get the + conductance derivatives */ + + if (d_vbb.d1_p != 0) { + gbb1 = 1/d_vbb.d1_p; + gbb2 = -(d_vbb.d2_p2*0.5)*gbb1*gbb1; + gbb3 = gbb1*gbb1*gbb1*gbb1*(-(d_vbb.d3_p3/6.0) + + 2*(d_vbb.d2_p2*0.5)*(d_vbb.d2_p2*0.5)*gbb1); + } + else + printf("\nd_vbb.d1_p = 0 in base spread resistance calculations\n"); + + + /* r = vbb */ + EqualDeriv(&d_ibb, &d_r); + d_ibb.value = cb; + d_ibb.d1_r = gbb1; + d_ibb.d2_r2 = 2*gbb2; + d_ibb.d3_r3 = 6.0*gbb3; + } + else + { + /* + rbb = rbpr + rbpi/qb; + ibb = vbb /rbb; = f(vbe, vbc, vbb) + */ + + EqualDeriv(&d_rbb,&d_p); + d_rbb.d1_p = 0.0; + if (rbpi != 0.0) { + InvDeriv(&d_rbb, &d_qb); + TimesDeriv(&d_rbb, &d_rbb,rbpi); + } + d_rbb.value += rbpr; + + EqualDeriv(&d_ibb,&d_r); + d_ibb.value = vbb; + DivDeriv(&d_ibb,&d_ibb,&d_rbb); + + } } else - printf("\nd_vbb.d1_p = 0 in base spread resistance calculations\n"); - - -/* r = vbb */ -EqualDeriv(&d_ibb, &d_r); -d_ibb.value = cb; -d_ibb.d1_r = gbb1; -d_ibb.d2_r2 = 2*gbb2; -d_ibb.d3_r3 = 6.0*gbb3; - } - else - { - /* - rbb = rbpr + rbpi/qb; - ibb = vbb /rbb; = f(vbe, vbc, vbb) - */ - - EqualDeriv(&d_rbb,&d_p); - d_rbb.d1_p = 0.0; - if (rbpi != 0.0) { - InvDeriv(&d_rbb, &d_qb); - TimesDeriv(&d_rbb, &d_rbb,rbpi); - } - d_rbb.value += rbpr; - - EqualDeriv(&d_ibb,&d_r); - d_ibb.value = vbb; - DivDeriv(&d_ibb,&d_ibb,&d_rbb); - - } + { + EqualDeriv(&d_ibb,&d_r); + if (rbpr != 0.0) + d_ibb.d1_r = 1/rbpr; + } } else { - EqualDeriv(&d_ibb,&d_r); - if (rbpr != 0.0) - d_ibb.d1_r = 1/rbpr; - } - } - else - { - EqualDeriv(&d_ibb,&d_p); - d_ibb.d1_p = 0.0; + EqualDeriv(&d_ibb,&d_p); + d_ibb.d1_p = 0.0; } - /* formulae for base spread resistance over! */ + /* formulae for base spread resistance over! */ /* ib term */ @@ -475,233 +475,233 @@ d_ibb.d3_r3 = 6.0*gbb3; d_ib.d3_q3 = gbc3/here->BJTtBetaR + gbcn3; /* ib term over */ - /* - * charge storage elements - */ - tf=model->BJTtransitTimeF; - tr=model->BJTtransitTimeR; - czbe=here->BJTtBEcap*here->BJTarea; - pe=here->BJTtBEpot; - xme=model->BJTjunctionExpBE; - cdis=model->BJTbaseFractionBCcap; - ctot=here->BJTtBCcap*here->BJTarea; - czbc=ctot*cdis; - czbx=ctot-czbc; - pc=here->BJTtBCpot; - xmc=model->BJTjunctionExpBC; - fcpe=here->BJTtDepCap; - czcs=model->BJTcapCS*here->BJTarea; - ps=model->BJTpotentialSubstrate; - xms=model->BJTexponentialSubstrate; - xtf=model->BJTtransitTimeBiasCoeffF; - ovtf=model->BJTtransitTimeVBCFactor; - xjtf=model->BJTtransitTimeHighCurrentF*here->BJTarea; - if(tf != 0 && vbe >0) { - EqualDeriv(&d_cbe, &d_p); - d_cbe.value = cbe; - d_cbe.d1_p = gbe; - d_cbe.d2_p2 = gbe2; - d_cbe.d3_p3 = gbe3; - if(xtf != 0){ - if(ovtf != 0) { + /* + * charge storage elements + */ + tf=model->BJTtransitTimeF; + tr=model->BJTtransitTimeR; + czbe=here->BJTtBEcap*here->BJTarea; + pe=here->BJTtBEpot; + xme=model->BJTjunctionExpBE; + cdis=model->BJTbaseFractionBCcap; + ctot=here->BJTtBCcap*here->BJTarea; + czbc=ctot*cdis; + czbx=ctot-czbc; + pc=here->BJTtBCpot; + xmc=model->BJTjunctionExpBC; + fcpe=here->BJTtDepCap; + czcs=model->BJTcapCS*here->BJTarea; + ps=model->BJTpotentialSubstrate; + xms=model->BJTexponentialSubstrate; + xtf=model->BJTtransitTimeBiasCoeffF; + ovtf=model->BJTtransitTimeVBCFactor; + xjtf=model->BJTtransitTimeHighCurrentF*here->BJTarea; + if(tf != 0 && vbe >0) { + EqualDeriv(&d_cbe, &d_p); + d_cbe.value = cbe; + d_cbe.d1_p = gbe; + d_cbe.d2_p2 = gbe2; + d_cbe.d3_p3 = gbe3; + if(xtf != 0){ + if(ovtf != 0) { /* dummy = exp ( vbc*ovtf) */ EqualDeriv(&d_dummy, &d_q); d_dummy.value = vbc*ovtf; d_dummy.d1_q = ovtf; ExpDeriv(&d_dummy, &d_dummy); - } - else - { + } + else + { EqualDeriv(&d_dummy,&d_p); d_dummy.value = 1.0; d_dummy.d1_p = 0.0; - } - if(xjtf != 0) { - EqualDeriv(&d_dummy2, &d_cbe); - d_dummy2.value += xjtf; - DivDeriv(&d_dummy2, &d_cbe, &d_dummy2); - MultDeriv (&d_dummy2, &d_dummy2, &d_dummy2); - } - else - { - EqualDeriv(&d_dummy2,&d_p); - d_dummy2.value = 1.0; - d_dummy2.d1_p = 0.0; - } + } + if(xjtf != 0) { + EqualDeriv(&d_dummy2, &d_cbe); + d_dummy2.value += xjtf; + DivDeriv(&d_dummy2, &d_cbe, &d_dummy2); + MultDeriv (&d_dummy2, &d_dummy2, &d_dummy2); + } + else + { + EqualDeriv(&d_dummy2,&d_p); + d_dummy2.value = 1.0; + d_dummy2.d1_p = 0.0; + } - MultDeriv(&d_tff, &d_dummy, &d_dummy2); - TimesDeriv(&d_tff, &d_tff, tf*xtf); - d_tff.value += tf; - } - else - { - EqualDeriv(&d_tff,&d_p); - d_tff.value = tf; - d_tff.d1_p = 0.0; - } + MultDeriv(&d_tff, &d_dummy, &d_dummy2); + TimesDeriv(&d_tff, &d_tff, tf*xtf); + d_tff.value += tf; + } + else + { + EqualDeriv(&d_tff,&d_p); + d_tff.value = tf; + d_tff.d1_p = 0.0; + } - /* qbe = tff/qb*cbe */ + /* qbe = tff/qb*cbe */ -/* - dummy = tff/qb; - */ - /* these are the cbe coeffs */ -DivDeriv(&d_dummy, &d_tff, &d_qb); -MultDeriv(&d_qbe, &d_dummy, &d_cbe); + /* + dummy = tff/qb; + */ + /* these are the cbe coeffs */ + DivDeriv(&d_dummy, &d_tff, &d_qb); + MultDeriv(&d_qbe, &d_dummy, &d_cbe); - } - else - { - EqualDeriv(&d_qbe, &d_p); - d_qbe.value = 0.0; - d_qbe.d1_p = 0.0; - } - if (vbe < fcpe) { - arg=1-vbe/pe; - sarg=exp(-xme*log(arg)); - lcapbe1 = czbe*sarg; - lcapbe2 = + } + else + { + EqualDeriv(&d_qbe, &d_p); + d_qbe.value = 0.0; + d_qbe.d1_p = 0.0; + } + if (vbe < fcpe) { + arg=1-vbe/pe; + sarg=exp(-xme*log(arg)); + lcapbe1 = czbe*sarg; + lcapbe2 = 0.5*czbe*xme*sarg/(arg*pe); - lcapbe3 = + lcapbe3 = czbe*xme*(xme+1)*sarg/(arg*arg*pe*pe*6); - } else { - f1=here->BJTtf1; - f2=model->BJTf2; - f3=model->BJTf3; - czbef2=czbe/f2; - lcapbe1 = czbef2*(f3+xme*vbe/pe); - lcapbe2 = 0.5*xme*czbef2/pe; - lcapbe3 = 0.0; - } - d_qbe.d1_p += lcapbe1; - d_qbe.d2_p2 += lcapbe2*2.; - d_qbe.d3_p3 += lcapbe3*6.; + } else { + f1=here->BJTtf1; + f2=model->BJTf2; + f3=model->BJTf3; + czbef2=czbe/f2; + lcapbe1 = czbef2*(f3+xme*vbe/pe); + lcapbe2 = 0.5*xme*czbef2/pe; + lcapbe3 = 0.0; + } + d_qbe.d1_p += lcapbe1; + d_qbe.d2_p2 += lcapbe2*2.; + d_qbe.d3_p3 += lcapbe3*6.; - fcpc=here->BJTtf4; - f1=here->BJTtf5; - f2=model->BJTf6; - f3=model->BJTf7; - if (vbc < fcpc) { - arg=1-vbc/pc; - sarg=exp(-xmc*log(arg)); - lcapbc1 = czbc*sarg; - lcapbc2 = + fcpc=here->BJTtf4; + f1=here->BJTtf5; + f2=model->BJTf6; + f3=model->BJTf7; + if (vbc < fcpc) { + arg=1-vbc/pc; + sarg=exp(-xmc*log(arg)); + lcapbc1 = czbc*sarg; + lcapbc2 = 0.5*czbc*xmc*sarg/(arg*pc); - lcapbc3 = + lcapbc3 = czbc*xmc*(xmc+1)*sarg/(arg*arg*pc*pc*6); - } else { - czbcf2=czbc/f2; - lcapbc1 = czbcf2*(f3+xmc*vbc/pc); - lcapbc2 = 0.5*xmc*czbcf2/pc; - lcapbc3 = 0; - } - if(vbx < fcpc) { - arg=1-vbx/pc; - sarg=exp(-xmc*log(arg)); - lcapbx1 = czbx*sarg; - lcapbx2 = + } else { + czbcf2=czbc/f2; + lcapbc1 = czbcf2*(f3+xmc*vbc/pc); + lcapbc2 = 0.5*xmc*czbcf2/pc; + lcapbc3 = 0; + } + if(vbx < fcpc) { + arg=1-vbx/pc; + sarg=exp(-xmc*log(arg)); + lcapbx1 = czbx*sarg; + lcapbx2 = 0.5*czbx*xmc*sarg/(arg*pc); - lcapbx3 = + lcapbx3 = czbx*xmc*(xmc+1)*sarg/(arg*arg*pc*pc*6); - } else { - czbxf2=czbx/f2; - lcapbx1 = czbxf2*(f3+xmc*vbx/pc); - lcapbx2 = 0.5*xmc*czbxf2/pc; - lcapbx3 = 0; - } - if(vsc < 0){ - arg=1-vsc/ps; - sarg=exp(-xms*log(arg)); - lcapsc1 = czcs*sarg; - lcapsc2 = + } else { + czbxf2=czbx/f2; + lcapbx1 = czbxf2*(f3+xmc*vbx/pc); + lcapbx2 = 0.5*xmc*czbxf2/pc; + lcapbx3 = 0; + } + if(vsc < 0){ + arg=1-vsc/ps; + sarg=exp(-xms*log(arg)); + lcapsc1 = czcs*sarg; + lcapsc2 = 0.5*czcs*xms*sarg/(arg*ps); - lcapsc3 = + lcapsc3 = czcs*xms*(xms+1)*sarg/(arg*arg*ps*ps*6); - } else { - lcapsc1 = czcs*(1+xms*vsc/ps); - lcapsc2 = czcs*0.5*xms/ps; - lcapsc3 = 0; - } + } else { + lcapsc1 = czcs*(1+xms*vsc/ps); + lcapsc2 = czcs*0.5*xms/ps; + lcapsc3 = 0; + } - /* - * store small-signal parameters - */ -here->ic_x = d_ic.d1_p; -here->ic_y = d_ic.d1_q; -here->ic_xd = d_ic.d1_r; -here->ic_x2 = 0.5*model->BJTtype*d_ic.d2_p2; -here->ic_y2 = 0.5*model->BJTtype*d_ic.d2_q2; -here->ic_w2 = 0.5*model->BJTtype*d_ic.d2_r2; -here->ic_xy = model->BJTtype*d_ic.d2_pq; -here->ic_yw = model->BJTtype*d_ic.d2_qr; -here->ic_xw = model->BJTtype*d_ic.d2_pr; -here->ic_x3 = d_ic.d3_p3/6.; -here->ic_y3 = d_ic.d3_q3/6.; -here->ic_w3 = d_ic.d3_r3/6.; -here->ic_x2w = 0.5*d_ic.d3_p2r; -here->ic_x2y = 0.5*d_ic.d3_p2q; -here->ic_y2w = 0.5*d_ic.d3_q2r; -here->ic_xy2 = 0.5*d_ic.d3_pq2; -here->ic_xw2 = 0.5*d_ic.d3_pr2; -here->ic_yw2 = 0.5*d_ic.d3_qr2; -here->ic_xyw = d_ic.d3_pqr; + /* + * store small-signal parameters + */ + here->ic_x = d_ic.d1_p; + here->ic_y = d_ic.d1_q; + here->ic_xd = d_ic.d1_r; + here->ic_x2 = 0.5*model->BJTtype*d_ic.d2_p2; + here->ic_y2 = 0.5*model->BJTtype*d_ic.d2_q2; + here->ic_w2 = 0.5*model->BJTtype*d_ic.d2_r2; + here->ic_xy = model->BJTtype*d_ic.d2_pq; + here->ic_yw = model->BJTtype*d_ic.d2_qr; + here->ic_xw = model->BJTtype*d_ic.d2_pr; + here->ic_x3 = d_ic.d3_p3/6.; + here->ic_y3 = d_ic.d3_q3/6.; + here->ic_w3 = d_ic.d3_r3/6.; + here->ic_x2w = 0.5*d_ic.d3_p2r; + here->ic_x2y = 0.5*d_ic.d3_p2q; + here->ic_y2w = 0.5*d_ic.d3_q2r; + here->ic_xy2 = 0.5*d_ic.d3_pq2; + here->ic_xw2 = 0.5*d_ic.d3_pr2; + here->ic_yw2 = 0.5*d_ic.d3_qr2; + here->ic_xyw = d_ic.d3_pqr; -here->ib_x = d_ib.d1_p; -here->ib_y = d_ib.d1_q; -here->ib_x2 = 0.5*model->BJTtype*d_ib.d2_p2; -here->ib_y2 = 0.5*model->BJTtype*d_ib.d2_q2; -here->ib_xy = model->BJTtype*d_ib.d2_pq; -here->ib_x3 = d_ib.d3_p3/6.; -here->ib_y3 = d_ib.d3_q3/6.; -here->ib_x2y = 0.5*d_ib.d3_p2q; -here->ib_xy2 = 0.5*d_ib.d3_pq2; + here->ib_x = d_ib.d1_p; + here->ib_y = d_ib.d1_q; + here->ib_x2 = 0.5*model->BJTtype*d_ib.d2_p2; + here->ib_y2 = 0.5*model->BJTtype*d_ib.d2_q2; + here->ib_xy = model->BJTtype*d_ib.d2_pq; + here->ib_x3 = d_ib.d3_p3/6.; + here->ib_y3 = d_ib.d3_q3/6.; + here->ib_x2y = 0.5*d_ib.d3_p2q; + here->ib_xy2 = 0.5*d_ib.d3_pq2; -here->ibb_x = d_ibb.d1_p; -here->ibb_y = d_ibb.d1_q; -here->ibb_z = d_ibb.d1_r; -here->ibb_x2 = 0.5*model->BJTtype*d_ibb.d2_p2; -here->ibb_y2 = 0.5*model->BJTtype*d_ibb.d2_q2; -here->ibb_z2 = 0.5*model->BJTtype*d_ibb.d2_r2; -here->ibb_xy = model->BJTtype*d_ibb.d2_pq; -here->ibb_yz = model->BJTtype*d_ibb.d2_qr; -here->ibb_xz = model->BJTtype*d_ibb.d2_pr; -here->ibb_x3 = d_ibb.d3_p3/6.; -here->ibb_y3 = d_ibb.d3_q3/6.; -here->ibb_z3 = d_ibb.d3_r3/6.; -here->ibb_x2z = 0.5*d_ibb.d3_p2r; -here->ibb_x2y = 0.5*d_ibb.d3_p2q; -here->ibb_y2z = 0.5*d_ibb.d3_q2r; -here->ibb_xy2 = 0.5*d_ibb.d3_pq2; -here->ibb_xz2 = 0.5*d_ibb.d3_pr2; -here->ibb_yz2 = 0.5*d_ibb.d3_qr2; -here->ibb_xyz = d_ibb.d3_pqr; + here->ibb_x = d_ibb.d1_p; + here->ibb_y = d_ibb.d1_q; + here->ibb_z = d_ibb.d1_r; + here->ibb_x2 = 0.5*model->BJTtype*d_ibb.d2_p2; + here->ibb_y2 = 0.5*model->BJTtype*d_ibb.d2_q2; + here->ibb_z2 = 0.5*model->BJTtype*d_ibb.d2_r2; + here->ibb_xy = model->BJTtype*d_ibb.d2_pq; + here->ibb_yz = model->BJTtype*d_ibb.d2_qr; + here->ibb_xz = model->BJTtype*d_ibb.d2_pr; + here->ibb_x3 = d_ibb.d3_p3/6.; + here->ibb_y3 = d_ibb.d3_q3/6.; + here->ibb_z3 = d_ibb.d3_r3/6.; + here->ibb_x2z = 0.5*d_ibb.d3_p2r; + here->ibb_x2y = 0.5*d_ibb.d3_p2q; + here->ibb_y2z = 0.5*d_ibb.d3_q2r; + here->ibb_xy2 = 0.5*d_ibb.d3_pq2; + here->ibb_xz2 = 0.5*d_ibb.d3_pr2; + here->ibb_yz2 = 0.5*d_ibb.d3_qr2; + here->ibb_xyz = d_ibb.d3_pqr; -here->qbe_x = d_qbe.d1_p; -here->qbe_y = d_qbe.d1_q; -here->qbe_x2 = 0.5*model->BJTtype*d_qbe.d2_p2; -here->qbe_y2 = 0.5*model->BJTtype*d_qbe.d2_q2; -here->qbe_xy = model->BJTtype*d_qbe.d2_pq; -here->qbe_x3 = d_qbe.d3_p3/6.; -here->qbe_y3 = d_qbe.d3_q3/6.; -here->qbe_x2y = 0.5*d_qbe.d3_p2q; -here->qbe_xy2 = 0.5*d_qbe.d3_pq2; + here->qbe_x = d_qbe.d1_p; + here->qbe_y = d_qbe.d1_q; + here->qbe_x2 = 0.5*model->BJTtype*d_qbe.d2_p2; + here->qbe_y2 = 0.5*model->BJTtype*d_qbe.d2_q2; + here->qbe_xy = model->BJTtype*d_qbe.d2_pq; + here->qbe_x3 = d_qbe.d3_p3/6.; + here->qbe_y3 = d_qbe.d3_q3/6.; + here->qbe_x2y = 0.5*d_qbe.d3_p2q; + here->qbe_xy2 = 0.5*d_qbe.d3_pq2; -here->capbc1 = lcapbc1; -here->capbc2 = lcapbc2; -here->capbc3 = lcapbc3; + here->capbc1 = lcapbc1; + here->capbc2 = lcapbc2; + here->capbc3 = lcapbc3; -here->capbx1 = lcapbx1; -here->capbx2 = lcapbx2; -here->capbx3 = lcapbx3; + here->capbx1 = lcapbx1; + here->capbx2 = lcapbx2; + here->capbx3 = lcapbx3; -here->capsc1 = lcapsc1; -here->capsc2 = lcapsc2; -here->capsc3 = lcapsc3; - } - } - return(OK); - } + here->capsc1 = lcapsc1; + here->capsc2 = lcapsc2; + here->capsc3 = lcapsc3; + } + } + return(OK); +}