home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************/
- /* Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991 */
- /* By MicroSim Corporation, All Rights Reserved */
- /****************************************************************************/
- /* acbjt.c
- * $Revision: 1.7 $
- * $Author: pwt $
- * $Date: 15 Aug 1990 14:44:04 $ */
-
- /******************* USERS OF DEVICE EQUATIONS OPTION ***********************/
- /******** The procedure for changing the bipolar 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_Q( struct q_ *, double );
- _complex ACPrb_Q( struct q_ *, double, int, int);
- #else
- void ACLoad_Q();
- _complex ACPrb_Q();
- #endif
-
- #define GBE (Instance->qcv_gpi) /* active conductances */
- #define GMU (Instance->qcv_gmu)
- #define GM (Instance->qcv_gm)
- #define GCE (Instance->qcv_go)
- #define GX (Instance->qcv_gx)
- #define GJS (Instance->qcv_gjs)
- #define GNBN (Instance->qcv_gnbn)
- #define GNBC (Instance->qcv_gnbc)
-
- #define AREA (Instance->q_area)
-
- #define CBN (Instance->q_sda.q_ac.qac_cbn) /* device capacitances */
- #define CBC (Instance->q_sda.q_ac.qac_cbc)
- #define CBE (Instance->q_sda.q_ac.qac_cbe)
- #define CJS (Instance->q_sda.q_ac.qac_cjs)
- #define CBX (Instance->q_sda.q_ac.qac_cBc)
-
- #define RC ((double)Instance->q_model->Q_rc)
- #define RE ((double)Instance->q_model->Q_re)
- #define TD ((double)Instance->q_model->Q_ptf)
-
- #define LPNP (Instance->q_model->Q_lpnp)
-
- void ACLoad_Q( /* Process BJT for AC analysis */
- Instance, /* device to evaluate */
- Omega /* 2*pi*frequency */
- )
- struct q_ *Instance;
- double Omega;
-
- /*
- whjb 25 Mar 87 created (from code taken from ACLoad)
- pwt 27 Oct 87 re-written for lateral devices
- pwt 02 Mar 88 add full diode treatment for substrate diode
- pwt 02 Mar 88 BJT resistances Q_re and Q_rc now stored as resistance
- pwt 04 Mar 88 rename from BjtAC
- pwt 15 Oct 89 add quasi-saturation enhancements
- */
- { double gcpr, gepr, xjs, xBc, xbn,
- gm = GM, /* active conductance */
- xbc = Omega*CBC, /* reactances */
- xbe = Omega*CBE,
- xteq = Omega*Instance->qcv_gcbeq,
- xgm = 0.;
-
- if ( TD != 0.) {
- gm += GCE;
- xgm = -gm*sin(Omega*TD);
- gm = gm*cos(Omega*TD) - GCE;
- }
-
- /* Stuff terms into matrix */
-
- AC_MAT_I(q_Bc) = AC_MAT_I(q_cB) = -( AC_MAT_I(q_BB) = xBc = Omega*CBX );
- AC_MAT_I(q_Sj) = AC_MAT_I(q_jS) = -( AC_MAT_I(q_SS) = xjs = Omega*CJS );
- AC_MAT_I(q_nb) = AC_MAT_I(q_bn) = -( AC_MAT_I(q_nn) = xbn = Omega*CBN );
-
- AC_MAT_I(q_bb) = ( LPNP ? xjs : 0.) + xbc + xbe + xteq + xbn;
- AC_MAT_I(q_cc) = ( LPNP ? 0.: xjs ) + xbc + xBc;
- AC_MAT_I(q_ee) = xbe + xgm;
- AC_MAT_I(q_ec) = xteq;
- AC_MAT_I(q_ce) = -xgm;
- AC_MAT_I(q_cb) = xgm - xbc;
- AC_MAT_I(q_bc) = -xbc - xteq;
- AC_MAT_I(q_eb) = -xbe - xgm - xteq;
- AC_MAT_I(q_be) = -xbe;
-
- AC_MAT_R(q_Bb) = AC_MAT_R(q_bB) = -( AC_MAT_R(q_BB) = GX );
- AC_MAT_R(q_Sj) = AC_MAT_R(q_jS) = -( AC_MAT_R(q_SS) = GJS);
- AC_MAT_R(q_Cn) = AC_MAT_R(q_nC) = -( AC_MAT_R(q_CC) = gcpr = AREA*RC );
- AC_MAT_R(q_Ee) = AC_MAT_R(q_eE) = -( AC_MAT_R(q_EE) = gepr = AREA*RE );
-
- AC_MAT_R(q_bb) = ( LPNP ? GJS : 0.) + GX + GMU + GBE;
- AC_MAT_R(q_cc) = ( LPNP ? 0.: GJS ) + GMU + GCE + GNBC;
- AC_MAT_R(q_ee) = gepr + GBE + GCE + gm;
-
- AC_MAT_R(q_eb) = ( AC_MAT_R(q_be) = -GBE ) - gm;
- AC_MAT_R(q_ce) = ( AC_MAT_R(q_ec) = -GCE ) - gm;
- AC_MAT_R(q_cb) = ( AC_MAT_R(q_bc) = -GMU ) + gm - GNBN - GNBC;
-
- AC_MAT_R(q_cn) = GNBN;
- AC_MAT_R(q_nb) = GNBN + GNBC;
- AC_MAT_R(q_nc) = -GNBC;
- AC_MAT_R(q_nn) = gcpr - GNBN;
-
- } /* End ACLoad_Q */
-
-
-
-
- _complex ACPrb_Q( /* Calc. BJT current (for Probe) for AC analysis */
- Instance, /* device to evaluate */
- Omega, /* 2*pi*frequency */
- Pin, /* pin designator: 'c'|'b'|'e'|'s' (case insensitive) */
- ForceRecalc
- )
- struct q_ *Instance;
- double Omega;
- int Pin, ForceRecalc;
-
- /*
- pwt 04 Mar 88 creation
- pwt 15 Oct 89 add quasi-saturation enhancements
- pwt 16 Aug 90 add ForceRecalc argument for report speed-up
- */
- {
- static _complex /* calculated branch currents */
- ibn, ibe, ibc, ice, ijs;
-
- static struct q_ *instance; /* "previous call" argument values */
- static double omega;
-
- if ( ForceRecalc ||
- Instance != instance ||
- Omega != omega ) {
-
- _complex
- vbe, vbc, vbx, vjs, vbn, /* node voltages */
- ybe, ybc, ybx, yjs, ybn, /* branch admittances */
- ygm, yce, yeq_cb;
-
- instance = Instance;
- omega = Omega;
-
- vbe.re = VltVct [Instance->q_b] - VltVct [Instance->q_e];
- vbe.im = VltVctI[Instance->q_b] - VltVctI[Instance->q_e];
-
- vbc.re = VltVct [Instance->q_b] - VltVct [Instance->q_c];
- vbc.im = VltVctI[Instance->q_b] - VltVctI[Instance->q_c];
-
- vbx.re = VltVct [Instance->q_B] - VltVct [Instance->q_c];
- vbx.im = VltVctI[Instance->q_B] - VltVctI[Instance->q_c];
-
- vjs.re = VltVct [Instance->q_S] - ( LPNP ? VltVct [Instance->q_b] : VltVct [Instance->q_c] );
- vjs.im = VltVctI[Instance->q_S] - ( LPNP ? VltVctI[Instance->q_b] : VltVctI[Instance->q_c] );
-
- vbn.re = VltVct [Instance->q_b] - VltVct [Instance->q_n];
- vbn.im = VltVctI[Instance->q_b] - VltVctI[Instance->q_n];
-
- ybe.re = GBE; ybe.im = Omega*CBE;
- ybc.re = GMU; ybc.im = Omega*CBC;
- yjs.re = GJS; yjs.im = Omega*CJS;
- ybx.re = 0.; ybx.im = Omega*CBX;
- ybn.re = 0.; ybn.im = Omega*CBN;
- ygm.re = GM; ygm.im = 0.;
- yce.re = GCE; yce.im = 0.;
- yeq_cb.re=0.; yeq_cb.im = Omega*Instance->qcv_gcbeq;
-
- if ( TD != 0.) {
- ygm.re += yce.re;
- ygm.im = -ygm.re*sin(Omega*TD);
- ygm.re = ygm.re*cos(Omega*TD) - yce.re;
- }
- ibn = cmul(ybn,vbn);
- ibe = cadd( cmul(ybe,vbe), cmul(yeq_cb,vbc) );
- ibc = cadd( cmul(ybc,vbc), cmul(ybx,vbx) );
- ice = cadd( cmul(ygm,vbe), cmul(yce,csub(vbe,vbc)) );
- ijs = cmul(yjs,vjs);
- }
-
- switch ( toupper(Pin) ) { /* select pin and combine currents */
- _complex tmp;
-
- case 'C':
- tmp = csub(csub(ice,ibc),ibn);
- return LPNP ? tmp : csub(tmp,ijs);
-
- case 'B':
- tmp = cadd(cadd(ibe,ibc),ibn);
- return LPNP ? csub(tmp,ijs) : tmp;
-
- case 'E':
- return cadi(ibe,ice);
-
- case 'S':
- return ijs;
- }
-
- } /* end of ACPrb_Q */