* 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'. * 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. * bjtnoise.c: Reformatted comment.

View File

@ -96,53 +96,53 @@ BJTdSetup(GENmodel *inModel, CKTcircuit *ckt)
double vbed; double vbed;
double vbb; double vbb;
double lcapbc1 = 0.0; double lcapbc1 = 0.0;
double lcapbc2 = 0.0; double lcapbc2 = 0.0;
double lcapbc3 = 0.0; double lcapbc3 = 0.0;
double lcapsc1 = 0.0; double lcapsc1 = 0.0;
double lcapsc2 = 0.0; double lcapsc2 = 0.0;
double lcapsc3 = 0.0; double lcapsc3 = 0.0;
double ic; double ic;
double dummy; double dummy;
Dderivs d_p, d_q, d_r; Dderivs d_p, d_q, d_r;
Dderivs d_dummy, d_q1, d_qb, d_dummy2; Dderivs d_dummy, d_q1, d_qb, d_dummy2;
Dderivs d_arg, d_sqarg, d_ic, d_q2; Dderivs d_arg, d_sqarg, d_ic, d_q2;
Dderivs d_z, d_tanz, d_vbb, d_ibb, d_rbb; Dderivs d_z, d_tanz, d_vbb, d_ibb, d_rbb;
Dderivs d_ib, d_cbe, d_tff, d_qbe; Dderivs d_ib, d_cbe, d_tff, d_qbe;
d_p.value = 0.0; d_p.value = 0.0;
d_p.d1_p = 1.0; d_p.d1_p = 1.0;
d_p.d1_q = 0.0; d_p.d1_q = 0.0;
d_p.d1_r = 0.0; d_p.d1_r = 0.0;
d_p.d2_p2 = 0.0; d_p.d2_p2 = 0.0;
d_p.d2_q2 = 0.0; d_p.d2_q2 = 0.0;
d_p.d2_r2 = 0.0; d_p.d2_r2 = 0.0;
d_p.d2_pq = 0.0; d_p.d2_pq = 0.0;
d_p.d2_qr = 0.0; d_p.d2_qr = 0.0;
d_p.d2_pr = 0.0; d_p.d2_pr = 0.0;
d_p.d3_p3 = 0.0; d_p.d3_p3 = 0.0;
d_p.d3_q3 = 0.0; d_p.d3_q3 = 0.0;
d_p.d3_r3 = 0.0; d_p.d3_r3 = 0.0;
d_p.d3_p2q = 0.0; d_p.d3_p2q = 0.0;
d_p.d3_p2r = 0.0; d_p.d3_p2r = 0.0;
d_p.d3_pq2 = 0.0; d_p.d3_pq2 = 0.0;
d_p.d3_q2r = 0.0; d_p.d3_q2r = 0.0;
d_p.d3_pr2 = 0.0; d_p.d3_pr2 = 0.0;
d_p.d3_qr2 = 0.0; d_p.d3_qr2 = 0.0;
d_p.d3_pqr = 0.0; d_p.d3_pqr = 0.0;
EqualDeriv(&d_q, &d_p); EqualDeriv(&d_q, &d_p);
d_q.d1_q = 1.0; d_q.d1_q = 1.0;
d_q.d1_p = 0.0; d_q.d1_p = 0.0;
EqualDeriv(&d_r, &d_p); EqualDeriv(&d_r, &d_p);
d_r.d1_r = 1.0; d_r.d1_r = 1.0;
d_r.d1_p = 0.0; d_r.d1_p = 0.0;
/* loop through all the models */ /* loop through all the models */
for( ; model != NULL; model = model->BJTnextModel ) { for( ; model != NULL; model = model->BJTnextModel ) {
/* loop through all the instances of the model */ /* loop through all the instances of the model */
for (here = model->BJTinstances; here != NULL ; for (here = model->BJTinstances; here != NULL ;
@ -193,36 +193,32 @@ for( ; model != NULL; model = model->BJTnextModel ) {
/* ic = f1(vbe,vbc,vbed) + f2(vbc) + f3(vbc) /* ic = f1(vbe,vbc,vbed) + f2(vbc) + f3(vbc)
* *
* we shall calculate the taylor coeffs of * we shall calculate the taylor coeffs of ic wrt vbe,
* ic wrt vbe, vbed, and vbc and store them away. * vbed, and vbc and store them away. the equations f1 f2
* the equations f1 f2 and f3 are given elsewhere; * and f3 are given elsewhere; we shall start off with f1,
* we shall start off with f1, compute * compute derivs. upto third order and then do f2 and f3
* derivs. upto third order and then do f2 and * and add their derivatives.
* f3 and add their derivatives.
* *
* Since f1 above is a function of three variables, it * Since f1 above is a function of three variables, it
* will be convenient to use derivative structures * will be convenient to use derivative structures to
* to compute the derivatives of f1. For this * compute the derivatives of f1. For this computation,
* computation, p=vbe, q=vbc, r=vbed. * p=vbe, q=vbc, r=vbed.
* *
* ib = f1(vbe) + f2(vbc) (not the same f's as * ib = f1(vbe) + f2(vbc) (not the same f's as above, in
* above, in case you are * case you are wondering!) the gbe's gbc's gben's and
* wondering!) * gbcn's are convenient subsidiary variables.
* 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.
* *
* irb = f(vbe, vbc, vbb) - the vbe & vbc
* dependencies arise from the
* qb term.
* qbe = f1(vbe,vbc) + f2(vbe) * qbe = f1(vbe,vbc) + f2(vbe)
* *
* derivative structures will be used again in the * derivative structures will be used again in the above
* above two equations. p=vbe, q=vbc, r=vbb. * two equations. p=vbe, q=vbc, r=vbb.
* *
* qbc = f(vbc) ; qbx = f(vbx) * qbc = f(vbc) ; qbx = f(vbx)
* *
* qss = f(vsc) * qss = f(vsc) */
*/
/* /*
* determine dc current and derivitives * determine dc current and derivitives
*/ */
@ -293,9 +289,11 @@ for( ; model != NULL; model = model->BJTnextModel ) {
d_dummy.value = dummy; d_dummy.value = dummy;
d_dummy.d1_p = - model->BJTinvEarlyVoltR; d_dummy.d1_p = - model->BJTinvEarlyVoltR;
d_dummy.d1_q = - model->BJTinvEarlyVoltF; d_dummy.d1_q = - model->BJTinvEarlyVoltF;
/* q1 = 1/dummy */ /* q1 = 1/dummy */
InvDeriv(&d_q1, &d_dummy); /* now q1 and its derivatives are InvDeriv(&d_q1, &d_dummy);
set up */
/* now q1 and its derivatives are set up */
if(oik == 0 && oikr == 0) { if(oik == 0 && oikr == 0) {
qb=q1; qb=q1;
EqualDeriv(&d_qb, &d_q1); EqualDeriv(&d_qb, &d_q1);
@ -337,28 +335,28 @@ for( ; model != NULL; model = model->BJTnextModel ) {
TimesDeriv(&d_qb, &d_qb, 0.5); TimesDeriv(&d_qb, &d_qb, 0.5);
} }
ic = (cbe - cbc)/qb; ic = (cbe - cbc)/qb;
/* cbe is a fn of vbed only; cbc of vbc; and qb of vbe and vbc */ /* 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 */ /* p=vbe, q=vbc, r=vbed; now dummy = cbe - cbc */
EqualDeriv(&d_dummy, &d_p); EqualDeriv(&d_dummy, &d_p);
d_dummy.d1_p = 0.0; d_dummy.d1_p = 0.0;
d_dummy.value = cbe-cbc; d_dummy.value = cbe-cbc;
d_dummy.d1_r = gbe; d_dummy.d1_r = gbe;
d_dummy.d2_r2 = gbe2; d_dummy.d2_r2 = gbe2;
d_dummy.d3_r3 = gbe3; d_dummy.d3_r3 = gbe3;
d_dummy.d1_q = -gbc; d_dummy.d1_q = -gbc;
d_dummy.d2_q2 = -gbc2; d_dummy.d2_q2 = -gbc2;
d_dummy.d3_q3 = -gbc3; 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.value -= cbc/here->BJTtBetaR + cbcn;
d_ic.d1_q -= gbc/here->BJTtBetaR + gbcn; d_ic.d1_q -= gbc/here->BJTtBetaR + gbcn;
d_ic.d2_q2 -= gbc2/here->BJTtBetaR + gbcn2; d_ic.d2_q2 -= gbc2/here->BJTtBetaR + gbcn2;
d_ic.d3_q3 -= gbc3/here->BJTtBetaR + gbcn3; 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 */ /* base spread resistance */
@ -393,7 +391,8 @@ d_ic.d3_q3 -= gbc3/here->BJTtBetaR + gbcn3;
DivDeriv(&d_z, &d_dummy2, &d_dummy); DivDeriv(&d_z, &d_dummy2, &d_dummy);
TanDeriv(&d_tanz, &d_z); TanDeriv(&d_tanz, &d_z);
/*now using dummy = tanz - z and dummy2 = z*tanz*tanz */ /* now using dummy = tanz - z and dummy2 =
z*tanz*tanz */
TimesDeriv(&d_dummy, &d_z, -1.0); TimesDeriv(&d_dummy, &d_z, -1.0);
PlusDeriv(&d_dummy, &d_dummy, &d_tanz); PlusDeriv(&d_dummy, &d_dummy, &d_tanz);
@ -406,7 +405,8 @@ d_ic.d3_q3 -= gbc3/here->BJTtBetaR + gbcn3;
MultDeriv(&d_vbb, &d_rbb, &d_p); MultDeriv(&d_vbb, &d_rbb, &d_p);
/* power series inversion to get the conductance derivatives */ /* power series inversion to get the
conductance derivatives */
if (d_vbb.d1_p != 0) { if (d_vbb.d1_p != 0) {
gbb1 = 1/d_vbb.d1_p; gbb1 = 1/d_vbb.d1_p;
@ -418,12 +418,12 @@ d_ic.d3_q3 -= gbc3/here->BJTtBetaR + gbcn3;
printf("\nd_vbb.d1_p = 0 in base spread resistance calculations\n"); printf("\nd_vbb.d1_p = 0 in base spread resistance calculations\n");
/* r = vbb */ /* r = vbb */
EqualDeriv(&d_ibb, &d_r); EqualDeriv(&d_ibb, &d_r);
d_ibb.value = cb; d_ibb.value = cb;
d_ibb.d1_r = gbb1; d_ibb.d1_r = gbb1;
d_ibb.d2_r2 = 2*gbb2; d_ibb.d2_r2 = 2*gbb2;
d_ibb.d3_r3 = 6.0*gbb3; d_ibb.d3_r3 = 6.0*gbb3;
} }
else else
{ {
@ -545,12 +545,12 @@ d_ibb.d3_r3 = 6.0*gbb3;
/* qbe = tff/qb*cbe */ /* qbe = tff/qb*cbe */
/* /*
dummy = tff/qb; dummy = tff/qb;
*/ */
/* these are the cbe coeffs */ /* these are the cbe coeffs */
DivDeriv(&d_dummy, &d_tff, &d_qb); DivDeriv(&d_dummy, &d_tff, &d_qb);
MultDeriv(&d_qbe, &d_dummy, &d_cbe); MultDeriv(&d_qbe, &d_dummy, &d_cbe);
} }
else else
@ -630,78 +630,78 @@ MultDeriv(&d_qbe, &d_dummy, &d_cbe);
/* /*
* store small-signal parameters * store small-signal parameters
*/ */
here->ic_x = d_ic.d1_p; here->ic_x = d_ic.d1_p;
here->ic_y = d_ic.d1_q; here->ic_y = d_ic.d1_q;
here->ic_xd = d_ic.d1_r; here->ic_xd = d_ic.d1_r;
here->ic_x2 = 0.5*model->BJTtype*d_ic.d2_p2; here->ic_x2 = 0.5*model->BJTtype*d_ic.d2_p2;
here->ic_y2 = 0.5*model->BJTtype*d_ic.d2_q2; here->ic_y2 = 0.5*model->BJTtype*d_ic.d2_q2;
here->ic_w2 = 0.5*model->BJTtype*d_ic.d2_r2; here->ic_w2 = 0.5*model->BJTtype*d_ic.d2_r2;
here->ic_xy = model->BJTtype*d_ic.d2_pq; here->ic_xy = model->BJTtype*d_ic.d2_pq;
here->ic_yw = model->BJTtype*d_ic.d2_qr; here->ic_yw = model->BJTtype*d_ic.d2_qr;
here->ic_xw = model->BJTtype*d_ic.d2_pr; here->ic_xw = model->BJTtype*d_ic.d2_pr;
here->ic_x3 = d_ic.d3_p3/6.; here->ic_x3 = d_ic.d3_p3/6.;
here->ic_y3 = d_ic.d3_q3/6.; here->ic_y3 = d_ic.d3_q3/6.;
here->ic_w3 = d_ic.d3_r3/6.; here->ic_w3 = d_ic.d3_r3/6.;
here->ic_x2w = 0.5*d_ic.d3_p2r; here->ic_x2w = 0.5*d_ic.d3_p2r;
here->ic_x2y = 0.5*d_ic.d3_p2q; here->ic_x2y = 0.5*d_ic.d3_p2q;
here->ic_y2w = 0.5*d_ic.d3_q2r; here->ic_y2w = 0.5*d_ic.d3_q2r;
here->ic_xy2 = 0.5*d_ic.d3_pq2; here->ic_xy2 = 0.5*d_ic.d3_pq2;
here->ic_xw2 = 0.5*d_ic.d3_pr2; here->ic_xw2 = 0.5*d_ic.d3_pr2;
here->ic_yw2 = 0.5*d_ic.d3_qr2; here->ic_yw2 = 0.5*d_ic.d3_qr2;
here->ic_xyw = d_ic.d3_pqr; here->ic_xyw = d_ic.d3_pqr;
here->ib_x = d_ib.d1_p; here->ib_x = d_ib.d1_p;
here->ib_y = d_ib.d1_q; here->ib_y = d_ib.d1_q;
here->ib_x2 = 0.5*model->BJTtype*d_ib.d2_p2; here->ib_x2 = 0.5*model->BJTtype*d_ib.d2_p2;
here->ib_y2 = 0.5*model->BJTtype*d_ib.d2_q2; here->ib_y2 = 0.5*model->BJTtype*d_ib.d2_q2;
here->ib_xy = model->BJTtype*d_ib.d2_pq; here->ib_xy = model->BJTtype*d_ib.d2_pq;
here->ib_x3 = d_ib.d3_p3/6.; here->ib_x3 = d_ib.d3_p3/6.;
here->ib_y3 = d_ib.d3_q3/6.; here->ib_y3 = d_ib.d3_q3/6.;
here->ib_x2y = 0.5*d_ib.d3_p2q; here->ib_x2y = 0.5*d_ib.d3_p2q;
here->ib_xy2 = 0.5*d_ib.d3_pq2; here->ib_xy2 = 0.5*d_ib.d3_pq2;
here->ibb_x = d_ibb.d1_p; here->ibb_x = d_ibb.d1_p;
here->ibb_y = d_ibb.d1_q; here->ibb_y = d_ibb.d1_q;
here->ibb_z = d_ibb.d1_r; here->ibb_z = d_ibb.d1_r;
here->ibb_x2 = 0.5*model->BJTtype*d_ibb.d2_p2; here->ibb_x2 = 0.5*model->BJTtype*d_ibb.d2_p2;
here->ibb_y2 = 0.5*model->BJTtype*d_ibb.d2_q2; here->ibb_y2 = 0.5*model->BJTtype*d_ibb.d2_q2;
here->ibb_z2 = 0.5*model->BJTtype*d_ibb.d2_r2; here->ibb_z2 = 0.5*model->BJTtype*d_ibb.d2_r2;
here->ibb_xy = model->BJTtype*d_ibb.d2_pq; here->ibb_xy = model->BJTtype*d_ibb.d2_pq;
here->ibb_yz = model->BJTtype*d_ibb.d2_qr; here->ibb_yz = model->BJTtype*d_ibb.d2_qr;
here->ibb_xz = model->BJTtype*d_ibb.d2_pr; here->ibb_xz = model->BJTtype*d_ibb.d2_pr;
here->ibb_x3 = d_ibb.d3_p3/6.; here->ibb_x3 = d_ibb.d3_p3/6.;
here->ibb_y3 = d_ibb.d3_q3/6.; here->ibb_y3 = d_ibb.d3_q3/6.;
here->ibb_z3 = d_ibb.d3_r3/6.; here->ibb_z3 = d_ibb.d3_r3/6.;
here->ibb_x2z = 0.5*d_ibb.d3_p2r; here->ibb_x2z = 0.5*d_ibb.d3_p2r;
here->ibb_x2y = 0.5*d_ibb.d3_p2q; here->ibb_x2y = 0.5*d_ibb.d3_p2q;
here->ibb_y2z = 0.5*d_ibb.d3_q2r; here->ibb_y2z = 0.5*d_ibb.d3_q2r;
here->ibb_xy2 = 0.5*d_ibb.d3_pq2; here->ibb_xy2 = 0.5*d_ibb.d3_pq2;
here->ibb_xz2 = 0.5*d_ibb.d3_pr2; here->ibb_xz2 = 0.5*d_ibb.d3_pr2;
here->ibb_yz2 = 0.5*d_ibb.d3_qr2; here->ibb_yz2 = 0.5*d_ibb.d3_qr2;
here->ibb_xyz = d_ibb.d3_pqr; here->ibb_xyz = d_ibb.d3_pqr;
here->qbe_x = d_qbe.d1_p; here->qbe_x = d_qbe.d1_p;
here->qbe_y = d_qbe.d1_q; here->qbe_y = d_qbe.d1_q;
here->qbe_x2 = 0.5*model->BJTtype*d_qbe.d2_p2; here->qbe_x2 = 0.5*model->BJTtype*d_qbe.d2_p2;
here->qbe_y2 = 0.5*model->BJTtype*d_qbe.d2_q2; here->qbe_y2 = 0.5*model->BJTtype*d_qbe.d2_q2;
here->qbe_xy = model->BJTtype*d_qbe.d2_pq; here->qbe_xy = model->BJTtype*d_qbe.d2_pq;
here->qbe_x3 = d_qbe.d3_p3/6.; here->qbe_x3 = d_qbe.d3_p3/6.;
here->qbe_y3 = d_qbe.d3_q3/6.; here->qbe_y3 = d_qbe.d3_q3/6.;
here->qbe_x2y = 0.5*d_qbe.d3_p2q; here->qbe_x2y = 0.5*d_qbe.d3_p2q;
here->qbe_xy2 = 0.5*d_qbe.d3_pq2; here->qbe_xy2 = 0.5*d_qbe.d3_pq2;
here->capbc1 = lcapbc1; here->capbc1 = lcapbc1;
here->capbc2 = lcapbc2; here->capbc2 = lcapbc2;
here->capbc3 = lcapbc3; here->capbc3 = lcapbc3;
here->capbx1 = lcapbx1; here->capbx1 = lcapbx1;
here->capbx2 = lcapbx2; here->capbx2 = lcapbx2;
here->capbx3 = lcapbx3; here->capbx3 = lcapbx3;
here->capsc1 = lcapsc1; here->capsc1 = lcapsc1;
here->capsc2 = lcapsc2; here->capsc2 = lcapsc2;
here->capsc3 = lcapsc3; here->capsc3 = lcapsc3;
} }
} }
return(OK); return(OK);
} }