home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 13 / 13.iso / p / p064 / 3.ddi / NOISE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-07-01  |  5.5 KB  |  205 lines

  1. /****************************************************************************/
  2. /*        Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991                  */
  3. /*          By MicroSim Corporation, All Rights Reserved                    */
  4. /****************************************************************************/
  5. /* noise.c
  6.  *   $Revision:   1.10  $
  7.  *   $Author:   sv  $
  8.  *   $Date:   14 Feb 1991 15:42:04  $ */
  9.  
  10. /* noise.c */
  11.  
  12. #include "option1.h"
  13. #ifdef USE_DECL_ARGS
  14. void Noise(    int, struct gen_ *, double, double *, double *, double *,
  15.                               double *, double *, double *, double * );
  16. #else
  17. void Noise();
  18. #endif
  19.  
  20. void Noise(    /* Calculate noise components for each semiconductor device */
  21.   Id,        /* device type */
  22.   Dev,        /* device */
  23.   Freq,        /* frequency (omega) */
  24.   VTot,        /* return: total noise */
  25.   V1, V2, V3,    /* return: noise components */
  26.   V4, V5, V6
  27.   )
  28.   int Id;
  29.   struct gen_ *Dev;
  30.   double Freq, *VTot, *V1, *V2, *V3, *V4, *V5, *V6;
  31.  
  32. /*
  33. whjb    27 Sep 86    creation 
  34. muw    19 Feb 87    added Switches
  35. sv    20 Aug 87    deleted non-semiconductor devices
  36. pwt    05 Jan 88    change M_tox to be oxide thickness, not Cox
  37. pwt    07 Jan 88    housekeeping (add VNOISE macro)
  38. sv      12 Feb 90    add local temperatures to models.
  39. */
  40. {
  41.   double vr, vi, vn, vshot, vflck,
  42.     fourkt = 4*CHARGE*VT,
  43.     twoq   = 2*CHARGE;
  44. #define    vt    VT
  45.  
  46. #define MIN_I    1e-20    /* lower limit of device noise currents */
  47.  
  48. /* macro for repetitious magnitude calculation
  49.  * (sequential calc. using vr and vi, result is sum of squares)
  50.  */
  51. #define VMAG(node1,node2)    (\
  52.     vr = VltVct[ dev->node1] - VltVct[ dev->node2],\
  53.     vi = VltVctI[dev->node1] - VltVctI[dev->node2],\
  54.     vr*vr + vi*vi    )
  55.  
  56.   switch (Id) {
  57.     default: {
  58.       *VTot = 0.0;
  59.       break;
  60.       }
  61.  
  62. /* Diode */
  63.  
  64. #define dev    ((struct d_ *)Dev)
  65. #define mod    ((struct D_ *)Dev->gen_model)
  66.     case 'D': {
  67.       double
  68.         ij  = fabs(dev->dcv_ij),
  69.         vrs = VMAG(d_P,d_p) * fourkt * fabs(mod->D_rs) * dev->d_area;
  70.  
  71.       ij    = MAX(ij,MIN_I);
  72.       vn    = VMAG(d_p,d_N);
  73.       vshot = vn * twoq * ij;
  74.       vflck = vn * mod->D_kf * pow(ij,mod->D_af) / Freq;
  75.  
  76.       *VTot = vrs + vshot + vflck;
  77.       *V1   = vrs;
  78.       *V2   = vshot;
  79.       *V3   = vflck;
  80.       }
  81. #undef dev
  82. #undef mod
  83.     break;
  84.  
  85. /* BJT */
  86.  
  87. #define dev    ((struct q_ *)Dev)
  88. #define mod    ((struct Q_ *)Dev->gen_model)
  89.     case 'Q': {
  90.       double vcsht,
  91.         ib = fabs(dev->qcv_ib),
  92.         ic = fabs(dev->qcv_ic),
  93.         vb = VMAG(q_B,q_b) * fourkt * fabs(dev->qcv_gx),
  94.         ve = VMAG(q_E,q_e) * fourkt * fabs(mod->Q_re) * dev->q_area,
  95.         vc = VMAG(q_C,q_c) * fourkt * fabs(mod->Q_rc) * dev->q_area;
  96.  
  97.       ib = MAX(ib,MIN_I);
  98.       vn = VMAG(q_b,q_e);
  99.       vshot = vn * twoq * ib;
  100.       vflck = vn * mod->Q_kf * pow(ib,mod->Q_af) / Freq;
  101.  
  102.       ic = MAX(ic,MIN_I);
  103.       vn = VMAG(q_c,q_e);
  104.       vcsht = vn * twoq * ic;
  105.  
  106.       *VTot = vb + ve + vc + vshot + vflck + vcsht;
  107.       *V1   = vb;
  108.       *V2   = vc;
  109.       *V3   = ve;
  110.       *V4   = vshot;
  111.       *V5   = vcsht;
  112.       *V6   = vflck;
  113.       }
  114. #undef dev
  115. #undef mod
  116.     break;
  117.  
  118. /* JFET */
  119.  
  120. #define dev    ((struct j_ *)Dev)
  121. #define mod    ((struct J_ *)Dev->gen_model)
  122.     case 'J': {
  123.       double
  124.         ichnl = fabs(dev->jcv_id), 
  125.         gm = fabs(dev->jcv_gm),
  126.         vd = VMAG(j_D,j_d) * fourkt * fabs(mod->J_rd) * dev->j_area,
  127.         vs = VMAG(j_S,j_s) * fourkt * fabs(mod->J_rs) * dev->j_area;
  128.  
  129.       ichnl = MAX(ichnl,MIN_I);
  130.       vn    = VMAG(j_d,j_s);
  131.       vshot = vn * fourkt * 2.0/3.0 * gm;
  132.       vflck = vn * mod->J_kf * pow(ichnl,mod->J_af) / Freq;
  133.  
  134.       *VTot = vd + vs + vshot + vflck;
  135.       *V1   = vd;
  136.       *V2   = vs;
  137.       *V3   = vshot;
  138.       *V4   = vflck;
  139.       }
  140. #undef dev
  141. #undef mod
  142.     break;
  143.  
  144. /* MOSFET */
  145.  
  146. #define dev    ((struct m_ *)Dev)
  147. #define mod    ((struct M_ *)Dev->gen_model)
  148.     case 'M': {
  149.       double
  150.         ichnl = fabs(dev->mcv_id),
  151.         gm    = fabs(dev->mcv_gm),
  152.         cox   = EPSOX/( (double)mod->M_tox==0. ? 1e-7 : mod->M_tox ),
  153.         l     = dev->m_l - mod->M_ld*( (double)mod->M_level==4. ? 1e-6 : 2.),
  154.         vd = VMAG(m_D,m_d) * fourkt * fabs(mod->M_rd),
  155.         vs = VMAG(m_S,m_s) * fourkt * fabs(mod->M_rs),
  156.         vg = VMAG(m_G,m_g) * fourkt * fabs(mod->M_rg),
  157.         vb = VMAG(m_B,m_b) * fourkt * fabs(mod->M_rb);
  158.  
  159.       ichnl = MAX(ichnl,MIN_I);
  160.       vn    = VMAG(m_d,m_s);
  161.       vshot = vn * fourkt * 2.0/3.0 * gm;
  162.       vflck = vn * mod->M_kf * pow(ichnl,mod->M_af)/(Freq*cox*l*l);
  163.  
  164.       *VTot = vd + vs + vg + vb + vshot + vflck;
  165.       *V1   = vd;
  166.       *V2   = vs;
  167.       *V3   = vg;
  168.       *V4   = vb;
  169.       *V5   = vshot;
  170.       *V6   = vflck;
  171.       }
  172. #undef dev
  173. #undef mod
  174.     break;
  175.  
  176. /* GaAsFET */
  177.  
  178. #define dev    ((struct b_ *)Dev)
  179. #define mod    ((struct B_ *)Dev->gen_model)
  180.     case 'B': {
  181.       double
  182.         ichnl = fabs(dev->bcv_id),
  183.         gm    = fabs(dev->bcv_gm),
  184.         vd = VMAG(b_D,b_d) * fourkt * fabs(mod->B_rd) * dev->b_area,
  185.         vs = VMAG(b_S,b_s) * fourkt * fabs(mod->B_rs) * dev->b_area,
  186.         vg = VMAG(b_G,b_g) * fourkt * fabs(mod->B_rg);
  187.  
  188.       ichnl = MAX(ichnl,MIN_I);
  189.       vn    = VMAG(b_d,b_s);
  190.       vshot = vn * fourkt * 2.0/3.0 * gm;
  191.       vflck = vn * mod->B_kf * pow(ichnl,mod->B_af) / Freq;
  192.  
  193.       *VTot = vd + vs + vg + vshot + vflck;
  194.       *V1   = vd;
  195.       *V2   = vs;
  196.       *V3   = vg;
  197.       *V4   = vshot;
  198.       *V5   = vflck;
  199.       }
  200. #undef dev
  201. #undef mod
  202.     break;
  203.     } /* end of switch(Id) */
  204.   } /* Noise */
  205.