📄 bjtdset.c
字号:
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;/* check this point: where is the f2(vbe) contribution to ic ? */ /* 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); /* 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; DivDeriv(&d_z, &d_dummy2, &d_dummy); TanDeriv(&d_tanz, &d_z); /*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_dummy2, &d_tanz, &d_tanz); MultDeriv(&d_dummy2, &d_dummy2, &d_z); DivDeriv(&d_rbb , &d_dummy, &d_dummy2); TimesDeriv(&d_rbb,&d_rbb, 3.0*rbpi); d_rbb.value += rbpr; 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 { 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; } /* formulae for base spread resistance over! */ /* ib term */ EqualDeriv(&d_ib, &d_p); d_ib.d1_p = 0.0; d_ib.value = cb; d_ib.d1_p = gbe/here->BJTtBetaF + gben; d_ib.d2_p2 = gbe2/here->BJTtBetaF + gben2; d_ib.d3_p3 = gbe3/here->BJTtBetaF + gben3; d_ib.d1_q = gbc/here->BJTtBetaR + gbcn; d_ib.d2_q2 = gbc2/here->BJTtBetaR + gbcn2; 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) { /* 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 { 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; } 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 *//* 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 = 0.5*czbe*xme*sarg/(arg*pe); 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.; 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 = 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 = 0.5*czbx*xmc*sarg/(arg*pc); 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 = 0.5*czcs*xms*sarg/(arg*ps); 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; } /* * 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->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->capbc1 = lcapbc1;here->capbc2 = lcapbc2;here->capbc3 = lcapbc3;here->capbx1 = lcapbx1;here->capbx2 = lcapbx2;here->capbx3 = lcapbx3;here->capsc1 = lcapsc1;here->capsc2 = lcapsc2;here->capsc3 = lcapsc3; } } return(OK); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -