* bjtdset.c: reformatted.

This commit is contained in:
arno 2000-09-01 23:17:27 +00:00
parent 2462eb7b01
commit 37fe87bb96
2 changed files with 412 additions and 408 deletions

View File

@ -1,8 +1,12 @@
1999-09-07 Arno <A.W.Peters@ieee.org>
2000-09-02 Arno W. Peters <A.W.Peters@ieee.org>
* bjtdset.c: reformatted
1999-09-07 Arno W. Peters <A.W.Peters@ieee.org>
* bjtnoise.c: removed unused variable `error'.
1999-09-06 Arno Peters <A.W.Peters@ieee.org>
1999-09-06 Arno W. Peters <A.W.Peters@ieee.org>
* bjtnoise.c: Reformatted comment.

View File

@ -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);
}