home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************/
- /* Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991 */
- /* By MicroSim Corporation, All Rights Reserved */
- /****************************************************************************/
- /* noise.c
- * $Revision: 1.10 $
- * $Author: sv $
- * $Date: 14 Feb 1991 15:42:04 $ */
-
- /* noise.c */
-
- #include "option1.h"
- #ifdef USE_DECL_ARGS
- void Noise( int, struct gen_ *, double, double *, double *, double *,
- double *, double *, double *, double * );
- #else
- void Noise();
- #endif
-
- void Noise( /* Calculate noise components for each semiconductor device */
- Id, /* device type */
- Dev, /* device */
- Freq, /* frequency (omega) */
- VTot, /* return: total noise */
- V1, V2, V3, /* return: noise components */
- V4, V5, V6
- )
- int Id;
- struct gen_ *Dev;
- double Freq, *VTot, *V1, *V2, *V3, *V4, *V5, *V6;
-
- /*
- whjb 27 Sep 86 creation
- muw 19 Feb 87 added Switches
- sv 20 Aug 87 deleted non-semiconductor devices
- pwt 05 Jan 88 change M_tox to be oxide thickness, not Cox
- pwt 07 Jan 88 housekeeping (add VNOISE macro)
- sv 12 Feb 90 add local temperatures to models.
- */
- {
- double vr, vi, vn, vshot, vflck,
- fourkt = 4*CHARGE*VT,
- twoq = 2*CHARGE;
- #define vt VT
-
- #define MIN_I 1e-20 /* lower limit of device noise currents */
-
- /* macro for repetitious magnitude calculation
- * (sequential calc. using vr and vi, result is sum of squares)
- */
- #define VMAG(node1,node2) (\
- vr = VltVct[ dev->node1] - VltVct[ dev->node2],\
- vi = VltVctI[dev->node1] - VltVctI[dev->node2],\
- vr*vr + vi*vi )
-
- switch (Id) {
- default: {
- *VTot = 0.0;
- break;
- }
-
- /* Diode */
-
- #define dev ((struct d_ *)Dev)
- #define mod ((struct D_ *)Dev->gen_model)
- case 'D': {
- double
- ij = fabs(dev->dcv_ij),
- vrs = VMAG(d_P,d_p) * fourkt * fabs(mod->D_rs) * dev->d_area;
-
- ij = MAX(ij,MIN_I);
- vn = VMAG(d_p,d_N);
- vshot = vn * twoq * ij;
- vflck = vn * mod->D_kf * pow(ij,mod->D_af) / Freq;
-
- *VTot = vrs + vshot + vflck;
- *V1 = vrs;
- *V2 = vshot;
- *V3 = vflck;
- }
- #undef dev
- #undef mod
- break;
-
- /* BJT */
-
- #define dev ((struct q_ *)Dev)
- #define mod ((struct Q_ *)Dev->gen_model)
- case 'Q': {
- double vcsht,
- ib = fabs(dev->qcv_ib),
- ic = fabs(dev->qcv_ic),
- vb = VMAG(q_B,q_b) * fourkt * fabs(dev->qcv_gx),
- ve = VMAG(q_E,q_e) * fourkt * fabs(mod->Q_re) * dev->q_area,
- vc = VMAG(q_C,q_c) * fourkt * fabs(mod->Q_rc) * dev->q_area;
-
- ib = MAX(ib,MIN_I);
- vn = VMAG(q_b,q_e);
- vshot = vn * twoq * ib;
- vflck = vn * mod->Q_kf * pow(ib,mod->Q_af) / Freq;
-
- ic = MAX(ic,MIN_I);
- vn = VMAG(q_c,q_e);
- vcsht = vn * twoq * ic;
-
- *VTot = vb + ve + vc + vshot + vflck + vcsht;
- *V1 = vb;
- *V2 = vc;
- *V3 = ve;
- *V4 = vshot;
- *V5 = vcsht;
- *V6 = vflck;
- }
- #undef dev
- #undef mod
- break;
-
- /* JFET */
-
- #define dev ((struct j_ *)Dev)
- #define mod ((struct J_ *)Dev->gen_model)
- case 'J': {
- double
- ichnl = fabs(dev->jcv_id),
- gm = fabs(dev->jcv_gm),
- vd = VMAG(j_D,j_d) * fourkt * fabs(mod->J_rd) * dev->j_area,
- vs = VMAG(j_S,j_s) * fourkt * fabs(mod->J_rs) * dev->j_area;
-
- ichnl = MAX(ichnl,MIN_I);
- vn = VMAG(j_d,j_s);
- vshot = vn * fourkt * 2.0/3.0 * gm;
- vflck = vn * mod->J_kf * pow(ichnl,mod->J_af) / Freq;
-
- *VTot = vd + vs + vshot + vflck;
- *V1 = vd;
- *V2 = vs;
- *V3 = vshot;
- *V4 = vflck;
- }
- #undef dev
- #undef mod
- break;
-
- /* MOSFET */
-
- #define dev ((struct m_ *)Dev)
- #define mod ((struct M_ *)Dev->gen_model)
- case 'M': {
- double
- ichnl = fabs(dev->mcv_id),
- gm = fabs(dev->mcv_gm),
- cox = EPSOX/( (double)mod->M_tox==0. ? 1e-7 : mod->M_tox ),
- l = dev->m_l - mod->M_ld*( (double)mod->M_level==4. ? 1e-6 : 2.),
- vd = VMAG(m_D,m_d) * fourkt * fabs(mod->M_rd),
- vs = VMAG(m_S,m_s) * fourkt * fabs(mod->M_rs),
- vg = VMAG(m_G,m_g) * fourkt * fabs(mod->M_rg),
- vb = VMAG(m_B,m_b) * fourkt * fabs(mod->M_rb);
-
- ichnl = MAX(ichnl,MIN_I);
- vn = VMAG(m_d,m_s);
- vshot = vn * fourkt * 2.0/3.0 * gm;
- vflck = vn * mod->M_kf * pow(ichnl,mod->M_af)/(Freq*cox*l*l);
-
- *VTot = vd + vs + vg + vb + vshot + vflck;
- *V1 = vd;
- *V2 = vs;
- *V3 = vg;
- *V4 = vb;
- *V5 = vshot;
- *V6 = vflck;
- }
- #undef dev
- #undef mod
- break;
-
- /* GaAsFET */
-
- #define dev ((struct b_ *)Dev)
- #define mod ((struct B_ *)Dev->gen_model)
- case 'B': {
- double
- ichnl = fabs(dev->bcv_id),
- gm = fabs(dev->bcv_gm),
- vd = VMAG(b_D,b_d) * fourkt * fabs(mod->B_rd) * dev->b_area,
- vs = VMAG(b_S,b_s) * fourkt * fabs(mod->B_rs) * dev->b_area,
- vg = VMAG(b_G,b_g) * fourkt * fabs(mod->B_rg);
-
- ichnl = MAX(ichnl,MIN_I);
- vn = VMAG(b_d,b_s);
- vshot = vn * fourkt * 2.0/3.0 * gm;
- vflck = vn * mod->B_kf * pow(ichnl,mod->B_af) / Freq;
-
- *VTot = vd + vs + vg + vshot + vflck;
- *V1 = vd;
- *V2 = vs;
- *V3 = vg;
- *V4 = vshot;
- *V5 = vflck;
- }
- #undef dev
- #undef mod
- break;
- } /* end of switch(Id) */
- } /* Noise */