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

  1. /****************************************************************************/
  2. /*        Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991                  */
  3. /*          By MicroSim Corporation, All Rights Reserved                    */
  4. /****************************************************************************/
  5. /* acjfet.c
  6.  *   $Revision:   1.6  $
  7.  *   $Author:   pwt  $
  8.  *   $Date:   15 Aug 1990 14:42:54  $ */
  9.  
  10. /******************* USERS OF DEVICE EQUATIONS OPTION ***********************/
  11. /******** The procedure for changing the JFET model parameters     **********/
  12. /******** and device equations is the same as for the MOSFET.  See **********/
  13. /******** the comments in the files mos.c and m.h for details.     **********/
  14.  
  15. #include "option1.h"
  16. #ifdef USE_DECL_ARGS
  17. void ACLoad_J(    struct j_ *, double );
  18. _complex ACPrb_J(    struct j_ *, double, int, int);
  19. #else
  20. void ACLoad_J();
  21. _complex ACPrb_J();
  22. #endif
  23.  
  24. #define AREA    (Instance->j_area)    /* device area */
  25. #define GM    (Instance->jcv_gm)    /* active conductances */
  26. #define GDS    (Instance->jcv_gds)
  27. #define GGS    (Instance->jcv_ggs)
  28. #define GGD    (Instance->jcv_ggd)
  29. #define GGDS    (Instance->jcv_ggds)
  30. #define GGGS    (Instance->jcv_gggs)
  31.  
  32. #define CGS    (Instance->j_sda.j_ac.jac_cgs)    /* capacitances */
  33. #define CGD    (Instance->j_sda.j_ac.jac_cgd)
  34.  
  35. #define RD    (Instance->j_model->J_rd)    /* passive conductances */
  36. #define RS    (Instance->j_model->J_rs)
  37.  
  38. void ACLoad_J(    /* Process JFET for AC analysis */
  39.   Instance,    /* device to evaluate */
  40.   Omega        /* 2*pi*frequency */
  41.   )
  42. struct j_ *Instance;
  43. double Omega;
  44.  
  45. /*
  46. 26 Mar 87 whjb    created (from code taken from ACLoad)
  47. 16 Jul 87 pwt    correct for forward/reverse device operation
  48. 06 Aug 87 pwt    re-written
  49. 04 Mar 88 pwt    rename from JfetAC
  50. 20 Sep 88 pwt    include changes to JFET.C ("copy" matrix load from JFET.C)
  51. */
  52. { struct jsv_def *sv[1];        /* state vector */
  53.   double gdpr, gspr, xgd, xgs;
  54.   int fwd;                /* forward/reverse mode */
  55.  
  56.   EVAL_SV0(sv,Instance,j_sda.j_sv);
  57.  
  58.   fwd = J_VGS(0) > J_VGD(0) ? YES : NO;
  59.  
  60. /* load matrix */
  61.  
  62.   AC_MAT_I(j_Gd) = AC_MAT_I(j_dG) = -( AC_MAT_I(j_dd) = xgd = Omega*CGD );
  63.   AC_MAT_I(j_Gs) = AC_MAT_I(j_sG) = -( AC_MAT_I(j_ss) = xgs = Omega*CGS );
  64.  
  65.   AC_MAT_I(j_GG) = xgd+xgs;
  66.  
  67.   AC_MAT_R(j_dD) = AC_MAT_R(j_Dd) = -( AC_MAT_R(j_DD) = gdpr = AREA*RD );
  68.   AC_MAT_R(j_ds) = ( fwd ? -GM - GGGS - GGDS :  0. ) - GDS;
  69.   AC_MAT_R(j_dG) = ( fwd ?  GM + GGGS        : -GM ) - GGD;
  70.   AC_MAT_R(j_dd) = ( fwd ?              GGDS :  GM ) + GDS + GGD + gdpr;
  71.  
  72.   AC_MAT_R(j_sS) = AC_MAT_R(j_Ss) = -( AC_MAT_R(j_SS) = gspr = AREA*RS );
  73.   AC_MAT_R(j_sd) = ( fwd ?  0. : -GM - GGGS - GGDS ) - GDS;
  74.   AC_MAT_R(j_sG) = ( fwd ? -GM :  GM + GGGS        ) - GGS;
  75.   AC_MAT_R(j_ss) = ( fwd ?  GM :              GGDS ) + GDS + GGS + gspr;
  76.  
  77.   AC_MAT_R(j_Gd) = ( fwd ? -GGDS        : GGGS + GGDS ) - GGD;
  78.   AC_MAT_R(j_Gs) = ( fwd ?  GGDS + GGGS :      - GGDS ) - GGS;
  79.   AC_MAT_R(j_GG) = GGD + GGS - GGGS;
  80.  
  81.   } /* End of ACLoad_J */
  82.  
  83.  
  84.  
  85.  
  86. _complex ACPrb_J(    /* Calc. JFET current (for Probe) for AC analysis */
  87.   Instance,    /* device to evaluate */
  88.   Omega,    /* 2*pi*frequency */
  89.   Pin,        /* pin designator: 'd'|'g'|'s' (case insensitive) */
  90.   ForceRecalc
  91.   )        /* return: complex current */
  92. struct j_ *Instance;
  93. double Omega;
  94. int Pin, ForceRecalc;
  95.  
  96. /*
  97. pwt    04 Mar 88    creation
  98. pwt    20 Sep 88    add changes to JFET.C
  99. pwt    16 Aug 90    add ForceRecalc argument for report speed-up
  100. */
  101. {
  102.   static _complex            /* calculated branch currents */
  103.     igd, igs, ids;
  104.  
  105.   static struct j_ *instance;        /* "previous call" argument values */
  106.   static double omega;
  107.  
  108.   if ( ForceRecalc ||
  109.        Instance != instance ||
  110.        Omega    != omega ) {
  111.  
  112.     _complex
  113.       vgd, vgs, vds,        /* node voltages */
  114.       ygd, ygs, yds, ygm,    /* branch admittances */
  115.       ygds, yggs;
  116.  
  117.     struct jsv_def *sv[1];
  118.  
  119.     EVAL_SV0(sv,Instance,j_sda.j_sv);
  120.  
  121.     instance = Instance;
  122.     omega    = Omega;
  123.  
  124.     vgd.re = VltVct [Instance->j_G] - VltVct [Instance->j_d];
  125.     vgd.im = VltVctI[Instance->j_G] - VltVctI[Instance->j_d];
  126.  
  127.     vgs.re = VltVct [Instance->j_G] - VltVct [Instance->j_s];
  128.     vgs.im = VltVctI[Instance->j_G] - VltVctI[Instance->j_s];
  129.  
  130.     vds.re = VltVct [Instance->j_d] - VltVct [Instance->j_s];
  131.     vds.im = VltVctI[Instance->j_d] - VltVctI[Instance->j_s];
  132.  
  133.     ygd.re = GGD; ygd.im = Omega*CGD;
  134.     ygs.re = GGS; ygs.im = Omega*CGS;
  135.     yds.re = GDS; yds.im = 0.;
  136.     ygm.re = GM;  ygm.im = 0.;
  137.  
  138.     ygds.re = GGDS; ygds.im = 0.;
  139.     yggs.re = GGGS; yggs.im = 0.;
  140.  
  141.     if ( J_VGS(0) > J_VGD(0) ) {    /* forward mode */
  142.       igd = csub( cmul(ygd,vgd), cadd( cmul(yggs,vgs), cmul(ygds,vds) ) );
  143.       igs = cmul(ygs,vgs);
  144.       ids = cadd( cmul(yds,vds), cmul(ygm,vgs) );
  145.       }
  146.     else {                /* reverse mode */
  147.       igd = cmul(ygd,vgd);
  148.       igs = csub( cmul(ygs,vgs), csub( cmul(yggs,vgd), cmul(ygds,vds) ) );
  149.       ids = csub( cmul(yds,vds), cmul(ygm,vgd) );
  150.       }
  151.     }
  152.  
  153.   switch ( toupper(Pin) ) {        /* select pin and combine currents */
  154.     case 'D': return csub(ids,igd);
  155.     case 'G': return cadd(igd,igs);
  156.     case 'S': return cadi(ids,igs);
  157.     }
  158.  
  159.   } /* end of ACPrb_J */
  160.