⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bjtdset.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
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 + -