home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************/
- /* Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991 */
- /* By MicroSim Corporation, All Rights Reserved */
- /****************************************************************************/
- /* acjfet.c
- * $Revision: 1.6 $
- * $Author: pwt $
- * $Date: 15 Aug 1990 14:42:54 $ */
-
- /******************* USERS OF DEVICE EQUATIONS OPTION ***********************/
- /******** The procedure for changing the JFET model parameters **********/
- /******** and device equations is the same as for the MOSFET. See **********/
- /******** the comments in the files mos.c and m.h for details. **********/
-
- #include "option1.h"
- #ifdef USE_DECL_ARGS
- void ACLoad_J( struct j_ *, double );
- _complex ACPrb_J( struct j_ *, double, int, int);
- #else
- void ACLoad_J();
- _complex ACPrb_J();
- #endif
-
- #define AREA (Instance->j_area) /* device area */
- #define GM (Instance->jcv_gm) /* active conductances */
- #define GDS (Instance->jcv_gds)
- #define GGS (Instance->jcv_ggs)
- #define GGD (Instance->jcv_ggd)
- #define GGDS (Instance->jcv_ggds)
- #define GGGS (Instance->jcv_gggs)
-
- #define CGS (Instance->j_sda.j_ac.jac_cgs) /* capacitances */
- #define CGD (Instance->j_sda.j_ac.jac_cgd)
-
- #define RD (Instance->j_model->J_rd) /* passive conductances */
- #define RS (Instance->j_model->J_rs)
-
- void ACLoad_J( /* Process JFET for AC analysis */
- Instance, /* device to evaluate */
- Omega /* 2*pi*frequency */
- )
- struct j_ *Instance;
- double Omega;
-
- /*
- 26 Mar 87 whjb created (from code taken from ACLoad)
- 16 Jul 87 pwt correct for forward/reverse device operation
- 06 Aug 87 pwt re-written
- 04 Mar 88 pwt rename from JfetAC
- 20 Sep 88 pwt include changes to JFET.C ("copy" matrix load from JFET.C)
- */
- { struct jsv_def *sv[1]; /* state vector */
- double gdpr, gspr, xgd, xgs;
- int fwd; /* forward/reverse mode */
-
- EVAL_SV0(sv,Instance,j_sda.j_sv);
-
- fwd = J_VGS(0) > J_VGD(0) ? YES : NO;
-
- /* load matrix */
-
- AC_MAT_I(j_Gd) = AC_MAT_I(j_dG) = -( AC_MAT_I(j_dd) = xgd = Omega*CGD );
- AC_MAT_I(j_Gs) = AC_MAT_I(j_sG) = -( AC_MAT_I(j_ss) = xgs = Omega*CGS );
-
- AC_MAT_I(j_GG) = xgd+xgs;
-
- AC_MAT_R(j_dD) = AC_MAT_R(j_Dd) = -( AC_MAT_R(j_DD) = gdpr = AREA*RD );
- AC_MAT_R(j_ds) = ( fwd ? -GM - GGGS - GGDS : 0. ) - GDS;
- AC_MAT_R(j_dG) = ( fwd ? GM + GGGS : -GM ) - GGD;
- AC_MAT_R(j_dd) = ( fwd ? GGDS : GM ) + GDS + GGD + gdpr;
-
- AC_MAT_R(j_sS) = AC_MAT_R(j_Ss) = -( AC_MAT_R(j_SS) = gspr = AREA*RS );
- AC_MAT_R(j_sd) = ( fwd ? 0. : -GM - GGGS - GGDS ) - GDS;
- AC_MAT_R(j_sG) = ( fwd ? -GM : GM + GGGS ) - GGS;
- AC_MAT_R(j_ss) = ( fwd ? GM : GGDS ) + GDS + GGS + gspr;
-
- AC_MAT_R(j_Gd) = ( fwd ? -GGDS : GGGS + GGDS ) - GGD;
- AC_MAT_R(j_Gs) = ( fwd ? GGDS + GGGS : - GGDS ) - GGS;
- AC_MAT_R(j_GG) = GGD + GGS - GGGS;
-
- } /* End of ACLoad_J */
-
-
-
-
- _complex ACPrb_J( /* Calc. JFET current (for Probe) for AC analysis */
- Instance, /* device to evaluate */
- Omega, /* 2*pi*frequency */
- Pin, /* pin designator: 'd'|'g'|'s' (case insensitive) */
- ForceRecalc
- ) /* return: complex current */
- struct j_ *Instance;
- double Omega;
- int Pin, ForceRecalc;
-
- /*
- pwt 04 Mar 88 creation
- pwt 20 Sep 88 add changes to JFET.C
- pwt 16 Aug 90 add ForceRecalc argument for report speed-up
- */
- {
- static _complex /* calculated branch currents */
- igd, igs, ids;
-
- static struct j_ *instance; /* "previous call" argument values */
- static double omega;
-
- if ( ForceRecalc ||
- Instance != instance ||
- Omega != omega ) {
-
- _complex
- vgd, vgs, vds, /* node voltages */
- ygd, ygs, yds, ygm, /* branch admittances */
- ygds, yggs;
-
- struct jsv_def *sv[1];
-
- EVAL_SV0(sv,Instance,j_sda.j_sv);
-
- instance = Instance;
- omega = Omega;
-
- vgd.re = VltVct [Instance->j_G] - VltVct [Instance->j_d];
- vgd.im = VltVctI[Instance->j_G] - VltVctI[Instance->j_d];
-
- vgs.re = VltVct [Instance->j_G] - VltVct [Instance->j_s];
- vgs.im = VltVctI[Instance->j_G] - VltVctI[Instance->j_s];
-
- vds.re = VltVct [Instance->j_d] - VltVct [Instance->j_s];
- vds.im = VltVctI[Instance->j_d] - VltVctI[Instance->j_s];
-
- ygd.re = GGD; ygd.im = Omega*CGD;
- ygs.re = GGS; ygs.im = Omega*CGS;
- yds.re = GDS; yds.im = 0.;
- ygm.re = GM; ygm.im = 0.;
-
- ygds.re = GGDS; ygds.im = 0.;
- yggs.re = GGGS; yggs.im = 0.;
-
- if ( J_VGS(0) > J_VGD(0) ) { /* forward mode */
- igd = csub( cmul(ygd,vgd), cadd( cmul(yggs,vgs), cmul(ygds,vds) ) );
- igs = cmul(ygs,vgs);
- ids = cadd( cmul(yds,vds), cmul(ygm,vgs) );
- }
- else { /* reverse mode */
- igd = cmul(ygd,vgd);
- igs = csub( cmul(ygs,vgs), csub( cmul(yggs,vgd), cmul(ygds,vds) ) );
- ids = csub( cmul(yds,vds), cmul(ygm,vgd) );
- }
- }
-
- switch ( toupper(Pin) ) { /* select pin and combine currents */
- case 'D': return csub(ids,igd);
- case 'G': return cadd(igd,igs);
- case 'S': return cadi(ids,igs);
- }
-
- } /* end of ACPrb_J */