From 3e9022cdaf442a2873dcea867839bc74f37a8140 Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 12 Nov 2020 17:59:06 +0100 Subject: [PATCH] HICUM2 removed from adms tree --- configure.ac | 5 +- .../devices/adms/admst/ngspiceVersion.xml | 6 - .../devices/adms/hicum2/admsva/hicum2.va | 2127 ----------------- 3 files changed, 1 insertion(+), 2137 deletions(-) delete mode 100644 src/spicelib/devices/adms/hicum2/admsva/hicum2.va diff --git a/configure.ac b/configure.ac index 1692d1ccd..0835c7406 100644 --- a/configure.ac +++ b/configure.ac @@ -1103,14 +1103,12 @@ if test "x$enable_adms" = xyes ; then VLADEVDIR=" adms/ekv \ adms/hicum0 \ - adms/hicum2 \ adms/mextram \ adms/psp102 " # The makefiles for adms (to be added to AC_CONFIG_FILES by ./autogen.sh --adms) #VLAMKF src/spicelib/devices/adms/ekv/Makefile #VLAMKF src/spicelib/devices/adms/hicum0/Makefile -#VLAMKF src/spicelib/devices/adms/hicum2/Makefile #VLAMKF src/spicelib/devices/adms/mextram/Makefile #VLAMKF src/spicelib/devices/adms/psp102/Makefile @@ -1118,8 +1116,7 @@ if test "x$enable_adms" = xyes ; then VLADEV=" spicelib/devices/adms/ekv/libekv.la \ spicelib/devices/adms/hicum0/libhicum0.la \ - spicelib/devices/adms/hicum2/libhicum2.la \ - spicelib/devices/adms/mextram/libbjt504t.la \ + spicelib/devices/adms/mextram/libbjt504t.la \ spicelib/devices/adms/psp102/libpsp102.la " else diff --git a/src/spicelib/devices/adms/admst/ngspiceVersion.xml b/src/spicelib/devices/adms/admst/ngspiceVersion.xml index c4c08c022..a0f7b2b18 100644 --- a/src/spicelib/devices/adms/admst/ngspiceVersion.xml +++ b/src/spicelib/devices/adms/admst/ngspiceVersion.xml @@ -1899,12 +1899,6 @@ - - - - - - diff --git a/src/spicelib/devices/adms/hicum2/admsva/hicum2.va b/src/spicelib/devices/adms/hicum2/admsva/hicum2.va deleted file mode 100644 index 276825d96..000000000 --- a/src/spicelib/devices/adms/hicum2/admsva/hicum2.va +++ /dev/null @@ -1,2127 +0,0 @@ -/* ****************************************************************************** - **************** COPYRIGHT NOTICE(Originator: Michael Schroter)*************** - ****************************************************************************** - -The terms under which the HICUM/L2 software is provided are as follows: - -Software is distributed as is, completely without warranty or service -support. Michael Schroter and his team members are not liable for the -condition or performance of the software. - -Michael Schroter owns the copyright and grants users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Michael Schroter hereby disclaims all implied warranties. - -Michael Schroter grants the users the right to modify, copy, and -redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions. - -1. The users agree not to charge for the model owner's code itself but may - charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge - Michael Schroter who developed the model and software. This - acknowledgment shall appear in the product documentation. - -3. Redistributions to others of source code and documentation must retain - the copyright notice, disclaimer, and list of conditions. - -4. Redistributions to others in binary form must reproduce the copyright - notice, disclaimer, and list of conditions in the documentation - and/or other materials provided with the distribution -*/ - -//****************************************************************************** -//****************************************************************************** - -//dw 04/19: Modifications for ngspice and adms: -// all V(...) <+ 0.0; are replaced by I(...) < V(...)/`MIN_R; -// using GMIN from ngspice: _circuit_gmin -// don't like local variable declaration - -//HICUM Level/2 Version 2.4.0: A Verilog-A Description - -/* ****** 28-03-2017, update to HICUM/L2 v2.4.0 ******************************* - -01/17 (AP): Increased the maximum values of ibets and ahc. - Replaced calculation of Vciei by Vbiei and Vbici to avoid the - dependence on the ci-ei branch. -03/17 (AP): Increased ranges for the parameters ahc and ibets. - Added Gmin to all operating point conductances. Futher added a - conditional statement for BETAAC to prevent division by zero - Added new model for avalanche breakdown for high-voltages - Changed conditional statement for avalanche breakdown calculation - Changed versioning scheme - -*/ - -/* ****** 31-08-2015, update to HICUM/L2 v2.34 ******************************** - -03/15 (AP): Added Qbf=0 to transit time calculation for low currents. - Changed parameter range for grading factors of capacitances - (excluding 1). - Added parameter aick for smoothing the ICK(VCEi) curve. -08/15 (AP): Fixed wrong calculation of go when including avalanche breakdown - Changed conditional statement for NQS effects (is now enabled only - if both alit AND alqf are greater than zero). - Implementation of the peripheral substrate capacitance. - Added a term to avoid numerical issues in the QJCMOD macro. - -*/ - -/* ****** 11-06-2013, update to HICUM/L2 v2.33 ******************************** - -05/13 (AP): Moved OP-value calculation out of noise block. - Added TK and DTSH to the operating point values. - Avoided division by zero for BETADC and BETAAC. - Added an additional compiler flag for enabling operating point - values also during transient simulations. - -08/13 (AP): Simplified betadc section for noise calculations. - -09/13 (AP): Changed ranges of alit and alqf back to including 0. Altered the - conditional statements for correlated noise and NQS accordingly. - Also, added correct backward compatibility for NQS effects in 2.1. - Moved assignment of voltage variables after the Model_Initialization - block. - Added check for ibets > 0 to all blocks using tunneling current. - Added more descriptive names for noise sources. - Added abs() to all white-noise sources. - -*/ - -/* ****** 27-03-2013, update to HICUM/L2 v2.32 ******************************** - -11/12 (AP): Calculation of operating point values inside the VA-code. - Calculation can be removed completely from the code by removing the - compiler flag CALC_OP. -03/13 (AP): Change of the conditional statement for turning barrier effects on - and off. -04/13 (AP): Corrected the bug for the flicker noise calculation. - -*/ - -//******** 11-05-2012, update to HICUM/L2 v2.31 ******************************** - -//03/12: Introduction of "type" model parameter to switch between "NPN" & "PNP" -// type of devices -//03/12: Correlated Noise: Conditional loop for preventing negative values under -// square root -//02/12: Correlated Noise implementation but without Filter approach (small code) -// Changed to temperature dependence of Rth now using alrth -// Simplification of the lateral NQS modeling in order to reduce the number of -// calculated derivatives. -// Changed to default values of the vertical NQS effect parameters. - -//********** Update to HICUM/L2 v2.30 ****************************************** -// The code contains the following new implementation compared to v2.24: - -// Accurate modeling of transfer current and gm in medium current range with. -// Bias dependent weight factor hjEi. -// Weight factor hf0 for low current minority charge. -// Explicit physics-based formulation for BC barrier effect on minority charge. -// Improved formulation for the critical current. -// Added flicker noise across emitter resistance. -// Added temperature dependence of RTH. -// Use of mrei and mrep for temperature dependence of IREIs and IREPs. -// Added Gmin also between internal collector and emitter node. -// Usage of "ddx" operator only for determination of capacitances from the -// corresponding diffusion charges (Qdei, Qdci). -// The following effects are turned on by setting flcomp = 2.3 (as larger) -// * Temperature dependence of tef0 has been turned off. -// * Temperature dependence of hfe and hfc is turned on. -// * Modified formulation of temperature dependent internal BE recombination current & -// peripheral current - -//*********End Update Hicum/L2 v2.30******************************************** - -//****************************************************************************** -//This code contains a Verilog-A implementation of Vertical Non-Quasi-Static(NQS) -//Effects using adjunct gyrator networks. To turn on this effect please set FLNQS=1. -//Although Vertical NQS effects have been taken into account in HICUM from the very -//beginning (see original FTN code and built-in v2.1 HICUM model inside most of the -//existing circuit simulators) their implementation has been based on Weil's approach. -//However, using Verilog, it is presently not possible to implement Weil's approach, -//since there does not exist access to previous time-steps of the simulator. -//The nearly available Verilog-A solution reproduces the results of previous -//HICUM versions (cf. documentation). -//****************************************************************************** - -// ***************Bug fix and optimization************* -// 04/08: New range has been defined for FDQR0. -// 11/07: Bugs have been fixed in macro HICFCI and HICQFC -// 10/06: in @(initial_model), external if-block for HICTUN_T removed -// 11/06: within HICQFC, minor changes made for LATB<=0.01; -// also HICFCI and HICFCT are changed accordingly -// to ensure correct derivatives -// Upper limit of FGEO parameter was changed to infinity. -// 12/06: expressions for Cdei and Cdci are corrected not to include -// Ccdei and Cbdci respectively (used in Crbi expression). - -// 01/06: FCdf1_dw assigned expression (missing in v2.21) -// FCa and FCa1 are found to have same expression: FCa is omitted in those cases -// FCa1 written instead of FCa in the expression for FCf_ci -// Thermal node "tnode" set as external -// zetasct = mg+1-2.5 changed to zetasct = mg-1.5; -// Code optimization: Temperature dependent parts are modeled in two separate blocks: -// within @(initial_model) when self-heating is OFF -// outside @(initial_model) when self-heating is ON -// 03/06 : Further fix -// vlim_t,ibcis_t,ibcxs_t,itss_t,iscs_t considered in compatibility block -// ddt() operators are separated in contribution expressions. -// FLCOMP parameter is given different values -// 05/06: -// all if-else blocks marked with begin-end -// unused variables deleted -// all series resistors and RTH are allowed to have a minimum value MIN_R -// only tunneling current source contribution within if-then-else -// 06/06: HICRBI deleted and instead the code changed (hyperbolic smoothing in -// conductivity modulation part) and put in relevant portion of the code. -// 07/06: ddx() operator used to find out capacitances from charges: -// QJMODF,QJMOD,HICJQ changed accordingly -// Lateral NQS effect modified with ddx() operator. -// HICFCT included for downward compatibility reason. -// Few macros are taken inside the code: HICICK, HICAVL, HICTUN (more optimized), -// internal base resistance (Qjci included under conductivity modulation, hyperbolic smoothing used) -// Gmin added at (bi,ei) and (bi,ci) branches. -// 08/06: Units added in the parameter descriptions. - -// ********************************************************************************* -// 06/06: Comment on NODE COLLAPSING: -// Presently this verilog code permits a minimum of 1 milli-Ohm resistance for any -// series resistance as well as for thermal resistance RTH. If any of the resistance -// values drops below this minimum value, the corresponding nodes are shorted with -// zero voltage contribution. We want the model compilers/simulators deal this -// situation in such a manner that the corresponding node is COLLAPSED. -// We expect that the simulators should permit current contribution statement -// for any branch with resistance value more than (or equal to) 1 milli-Ohm without -// any convergence problem. In fact, we wish NOT to have to use a voltage contribution -// statement in our Verilog code, except as an indication for the model compiler/simulator -// to interpret a zero branch voltage as NODE-COLLAPSING action. -// ********************************************************************************** - -`ifdef insideADMS - `define MODEL @(initial_model) - `define NOISE @(noise) - `define ATTR(txt) (*txt*) -`else - `define MODEL - `define NOISE - `define ATTR(txt) -`endif - -// Comment this line, if calculation of operating point values should be omitted -//`define CALC_OP -// Uncomment this line to reduce calculation of OP values only for DC simulations -//`define OP_STATIC - -`define VPT_thresh 1.0e2 -`define Dexp_lim 80.0 -`define Cexp_lim 80.0 -`define DFa_fj 1.921812 -`define RTOLC 1.0e-5 -`define l_itmax 100 -`define TMAX 326.85 -`define TMIN -100.0 -`define LN_EXP_LIMIT 11.0 -`define MIN_R 0.001 -//`define Gmin 1.0e-12 -//`define Gmin $simparam("gmin",1e-12) //suggested by L.L -`define Gmin _circuit_gmin - -//ADS -//`include "constants.vams" -//`include "disciplines.vams" -//`include "compact.vams" - -//Spectre -`include "constants.h" -`include "discipline.h" - -//////////////Explicit Capacitance and Charge Expression/////////////// - -// DEPLETION CHARGE CALCULATION -// Hyperbolic smoothing used; no punch-through -// INPUT: -// c_0 : zero-bias capacitance -// u_d : built-in voltage -// z : exponent coefficient -// a_j : control parameter for C peak value at high forward bias -// U_cap : voltage across junction -// IMPLICIT INPUT: -// VT : thermal voltage -// OUTPUT: -// Qz : depletion Charge -// C : depletion capacitance -`define QJMODF(c_0,u_d,z,a_j,U_cap,C,Qz)\ - if(c_0 > 0.0) begin\ - DFV_f = u_d*(1.0-exp(-ln(a_j)/z));\ - DFv_e = (DFV_f-U_cap)/VT;\ - DFs_q = sqrt(DFv_e*DFv_e+`DFa_fj);\ - DFs_q2 = (DFv_e+DFs_q)*0.5;\ - DFv_j = DFV_f-VT*DFs_q2;\ - DFdvj_dv = DFs_q2/DFs_q;\ - DFb = ln(1.0-DFv_j/u_d);\ - DFC_j1 = c_0*exp(-z*DFb)*DFdvj_dv;\ - C = DFC_j1+a_j*c_0*(1.0-DFdvj_dv);\ - DFQ_j = c_0*u_d*(1.0-exp(DFb*(1.0-z)))/(1.0-z);\ - Qz = DFQ_j+a_j*c_0*(U_cap-DFv_j);\ - end else begin\ - C = 0.0;\ - Qz = 0.0;\ - end - -//////////////////////////////////////////////////////////////// - - -//////////////Explicit Capacitance and Charge Expression/////////////// - - -// DEPLETION CHARGE CALCULATION CONSIDERING PUNCH THROUGH -// smoothing of reverse bias region (punch-through) -// and limiting to a_j=Cj,max/Cj0 for forward bias. -// Important for base-collector and collector-substrate junction -// INPUT: -// c_0 : zero-bias capacitance -// u_d : built-in voltage -// z : exponent coefficient -// a_j : control parameter for C peak value at high forward bias -// v_pt : punch-through voltage (defined as qNw^2/2e) -// U_cap : voltage across junction -// IMPLICIT INPUT: -// VT : thermal voltage -// OUTPUT: -// Qz : depletion charge -// C : depletion capacitance -`define QJMOD(c_0,u_d,z,a_j,v_pt,U_cap,C,Qz)\ - if(c_0 > 0.0) begin\ - Dz_r = z/4.0;\ - Dv_p = v_pt-u_d;\ - DV_f = u_d*(1.0-exp(-ln(a_j)/z));\ - DC_max = a_j*c_0;\ - DC_c = c_0*exp((Dz_r-z)*ln(v_pt/u_d));\ - Dv_e = (DV_f-U_cap)/VT;\ - if(Dv_e < `Cexp_lim) begin\ - De = exp(Dv_e);\ - De_1 = De/(1.0+De);\ - Dv_j1 = DV_f-VT*ln(1.0+De);\ - end else begin\ - De_1 = 1.0;\ - Dv_j1 = U_cap;\ - end\ - Da = 0.1*Dv_p+4.0*VT;\ - Dv_r = (Dv_p+Dv_j1)/Da;\ - if(Dv_r < `Cexp_lim) begin\ - De = exp(Dv_r);\ - De_2 = De/(1.0+De);\ - Dv_j2 = -Dv_p+Da*(ln(1.0+De)-exp(-(Dv_p+DV_f)/Da));\ - end else begin\ - De_2 = 1.0;\ - Dv_j2 = Dv_j1;\ - end\ - Dv_j4 = U_cap-Dv_j1;\ - DCln1 = ln(1.0-Dv_j1/u_d);\ - DCln2 = ln(1.0-Dv_j2/u_d);\ - Dz1 = 1.0-z;\ - Dzr1 = 1.0-Dz_r;\ - DC_j1 = c_0*exp(DCln2*(-z))*De_1*De_2;\ - DC_j2 = DC_c*exp(DCln1*(-Dz_r))*(1.0-De_2);\ - DC_j3 = DC_max*(1.0-De_1);\ - C = DC_j1+DC_j2+DC_j3;\ - DQ_j1 = c_0*(1.0-exp(DCln2*Dz1))/Dz1;\ - DQ_j2 = DC_c*(1.0-exp(DCln1*Dzr1))/Dzr1;\ - DQ_j3 = DC_c*(1.0-exp(DCln2*Dzr1))/Dzr1;\ - Qz = (DQ_j1+DQ_j2-DQ_j3)*u_d+DC_max*Dv_j4;\ - end else begin\ - C = 0.0;\ - Qz = 0.0;\ - end - - -// DEPLETION CHARGE & CAPACITANCE CALCULATION SELECTOR -// Dependent on junction punch-through voltage -// Important for collector related junctions -`define HICJQ(c_0,u_d,z,v_pt,U_cap,C,Qz)\ - if(v_pt < `VPT_thresh) begin\ - `QJMOD(c_0,u_d,z,2.4,v_pt,U_cap,C,Qz)\ - end else begin\ - `QJMODF(c_0,u_d,z,2.4,U_cap,C,Qz)\ - end - - -// A CALCULATION NEEDED FOR COLLECTOR MINORITY CHARGE FORMULATION -// INPUT: -// zb,zl : zeta_b and zeta_l (model parameters, TED 10/96) -// w : normalized injection width -// OUTPUT: -// hicfcio : function of equation (2.1.17-10) -`define HICFCI(zb,zl,w,hicfcio,dhicfcio_dw)\ - z = zb*w;\ - lnzb = ln(1+zb*w);\ - if(z > 1.0e-6) begin\ - x = 1.0+z;\ - a = x*x;\ - a2 = 0.250*(a*(2.0*lnzb-1.0)+1.0);\ - a3 = (a*x*(3.0*lnzb-1.0)+1.0)/9.0;\ - r = zl/zb;\ - hicfcio = ((1.0-r)*a2+r*a3)/zb;\ - dhicfcio_dw = ((1.0-r)*x+r*a)*lnzb;\ - end else begin\ - a = z*z;\ - a2 = 3.0+z-0.25*a+0.10*z*a;\ - a3 = 2.0*z+0.75*a-0.20*a*z;\ - hicfcio = (zb*a2+zl*a3)*w*w/6.0;\ - dhicfcio_dw = (1+zl*w)*(1+z)*lnzb;\ - end - - -// NEEDED TO CALCULATE WEIGHTED ICCR COLLECTOR MINORITY CHARGE -// INPUT: -// z : zeta_b or zeta_l -// w : normalized injection width -// OUTPUT: -// hicfcto : output -// dhicfcto_dw : derivative of output wrt w -`define HICFCT(z,w,hicfcto,dhicfcto_dw)\ - a = z*w;\ - lnz = ln(1+z*w);\ - if (a > 1.0e-6) begin\ - hicfcto = (a - lnz)/z;\ - dhicfcto_dw = a / (1.0 + a);\ - end else begin\ - hicfcto = 0.5 * a * w;\ - dhicfcto_dw = a;\ - end - - -// COLLECTOR CURRENT SPREADING CALCULATION -// collector minority charge incl. 2D/3D current spreading (TED 10/96) -// INPUT: -// Ix : forward transport current component (itf) -// I_CK : critical current -// FFT_pcS : dependent on fthc and thcs (parameters) -// IMPLICIT INPUT: -// ahc, latl, latb : model parameters -// VT : thermal voltage -// OUTPUT: -// Q_fC, Q_CT: actual and ICCR (weighted) hole charge -// T_fC, T_cT: actual and ICCR (weighted) transit time -// Derivative dfCT_ditf not properly implemented yet -`define HICQFC(Ix,I_CK,FFT_pcS,Q_fC,Q_CT,T_fC,T_cT)\ - Q_fC = FFT_pcS*Ix;\ - FCa = 1.0-I_CK/Ix;\ - FCrt = sqrt(FCa*FCa+ahc);\ - FCa_ck = 1.0-(FCa+FCrt)/(1.0+sqrt(1.0+ahc));\ - FCdaick_ditf = (FCa_ck-1.0)*(1-FCa)/(FCrt*Ix);\ - if(latb > latl) begin\ - FCz = latb-latl;\ - FCxl = 1.0+latl;\ - FCxb = 1.0+latb;\ - if(latb > 0.01) begin\ - FCln = ln(FCxb/FCxl);\ - FCa1 = exp((FCa_ck-1.0)*FCln);\ - FCd_a = 1.0/(latl-FCa1*latb);\ - FCw = (FCa1-1.0)*FCd_a;\ - FCdw_daick = -FCz*FCa1*FCln*FCd_a*FCd_a;\ - FCa1 = ln((1.0+latb*FCw)/(1.0+latl*FCw));\ - FCda1_dw = latb/(1.0+latb*FCw) - latl/(1.0+latl*FCw);\ - end else begin\ - FCf1 = 1.0-FCa_ck;\ - FCd_a = 1.0/(1.0+FCa_ck*latb);\ - FCw = FCf1*FCd_a;\ - FCdw_daick = -1.0*FCd_a*FCd_a*FCxb*FCd_a;\ - FCa1 = FCz*FCw;\ - FCda1_dw = FCz;\ - end\ - FCf_CT = 2.0/FCz;\ - FCw2 = FCw*FCw;\ - FCf1 = latb*latl*FCw*FCw2/3.0+(latb+latl)*FCw2/2.0+FCw;\ - FCdf1_dw = latb*latl*FCw2 + (latb+latl)*FCw + 1.0;\ - `HICFCI(latb,latl,FCw,FCf2,FCdf2_dw)\ - `HICFCI(latl,latb,FCw,FCf3,FCdf3_dw)\ - FCf_ci = FCf_CT*(FCa1*FCf1-FCf2+FCf3);\ - FCdfc_dw = FCf_CT*(FCa1*FCdf1_dw+FCda1_dw*FCf1-FCdf2_dw+FCdf3_dw);\ - FCdw_ditf = FCdw_daick*FCdaick_ditf;\ - FCdfc_ditf = FCdfc_dw*FCdw_ditf;\ - if(flcomp == 0.0 || flcomp == 2.1) begin\ - `HICFCT(latb,FCw,FCf2,FCdf2_dw)\ - `HICFCT(latl,FCw,FCf3,FCdf3_dw)\ - FCf_CT = FCf_CT*(FCf2-FCf3);\ - FCdfCT_dw = FCf_CT*(FCdf2_dw-FCdf3_dw);\ - FCdfCT_ditf = FCdfCT_dw*FCdw_ditf;\ - end else begin\ - FCf_CT = FCf_ci;\ - FCdfCT_ditf = FCdfc_ditf;\ - end\ - end else begin\ - if(latb > 0.01) begin\ - FCd_a = 1.0/(1.0+FCa_ck*latb);\ - FCw = (1.0-FCa_ck)*FCd_a;\ - FCdw_daick = -(1.0+latb)*FCd_a*FCd_a;\ - end else begin\ - FCw = 1.0-FCa_ck-FCa_ck*latb;\ - FCdw_daick = -(1.0+latb);\ - end\ - FCw2 = FCw*FCw;\ - FCz = latb*FCw;\ - FCz_1 = 1.0+FCz;\ - FCd_f = 1.0/(FCz_1);\ - FCf_ci = FCw2*(1.0+FCz/3.0)*FCd_f;\ - FCdfc_dw = 2.0*FCw*(FCz_1+FCz*FCz/3.0)*FCd_f*FCd_f;\ - FCdw_ditf = FCdw_daick*FCdaick_ditf;\ - FCdfc_ditf = FCdfc_dw*FCdw_ditf;\ - if(flcomp == 0.0 || flcomp == 2.1) begin\ - if (FCz > 0.001) begin\ - FCf_CT = 2.0*(FCz_1*ln(FCz_1)-FCz)/(latb*latb*FCz_1);\ - FCdfCT_dw = 2.0*FCw*FCd_f*FCd_f;\ - end else begin\ - FCf_CT = FCw2*(1.0-FCz/3.0)*FCd_f;\ - FCdfCT_dw = 2.0*FCw*(1.0-FCz*FCz/3.0)*FCd_f*FCd_f;\ - end\ - FCdfCT_ditf = FCdfCT_dw*FCdw_ditf;\ - end else begin\ - FCf_CT = FCf_ci;\ - FCdfCT_ditf = FCdfc_ditf;\ - end\ - end\ - Q_CT = Q_fC*FCf_CT*exp((FFdVc-vcbar)/VT);\ - Q_fC = Q_fC*FCf_ci*exp((FFdVc-vcbar)/VT);\ - T_fC = FFT_pcS*exp((FFdVc-vcbar)/VT)*(FCf_ci+Ix*FCdfc_ditf)+Q_fC/VT*FFdVc_ditf;\ - T_cT = FFT_pcS*exp((FFdVc-vcbar)/VT)*(FCf_CT+Ix*FCdfCT_ditf)+Q_CT/VT*FFdVc_ditf; - -// TRANSIT-TIME AND STORED MINORITY CHARGE -// INPUT: -// itf : forward transport current -// I_CK : critical current -// T_f : transit time \ -// Q_f : minority charge / for low current -// IMPLICIT INPUT: -// tef0, gtfe, fthc, thcs, ahc, latl, latb : model parameters -// OUTPUT: -// T_f : transit time \ -// Q_f : minority charge / transient analysis -// T_fT : transit time \ -// Q_fT : minority charge / ICCR (transfer current) -// Q_bf : excess base charge -`define HICQFF(itf,I_CK,T_f,Q_f,T_fT,Q_fT,Q_bf)\ - if(itf < 1.0e-6*I_CK) begin\ - Q_fT = Q_f;\ - T_fT = T_f;\ - Q_bf = 0;\ - end else begin\ - FFitf_ick = itf/I_CK;\ - FFdTef = tef0_t*exp(gtfe*ln(FFitf_ick));\ - FFdQef = FFdTef*itf/(1+gtfe);\ - if (icbar<0.05*(vlim/rci0)) begin\ - FFdVc = 0;\ - FFdVc_ditf = 0;\ - end else begin\ - FFib = (itf-I_CK)/icbar;\ - if (FFib < -1.0e10) begin\ - FFib = -1.0e10;\ - end\ - FFfcbar = (FFib+sqrt(FFib*FFib+acbar))/2.0;\ - FFdib_ditf = FFfcbar/sqrt(FFib*FFib+acbar)/icbar;\ - FFdVc = vcbar*exp(-1.0/FFfcbar);\ - FFdVc_ditf = FFdVc/(FFfcbar*FFfcbar)*FFdib_ditf;\ - end\ - FFdQbfb = (1-fthc)*thcs_t*itf*(exp(FFdVc/VT)-1);\ - FFdTbfb = FFdQbfb/itf+(1-fthc)*thcs_t*itf*exp(FFdVc/VT)/VT*FFdVc_ditf;\ - FFic = 1-1.0/FFitf_ick;\ - FFw = (FFic+sqrt(FFic*FFic+ahc))/(1+sqrt(1+ahc));\ - FFdQfhc = thcs_t*itf*FFw*FFw*exp((FFdVc-vcbar)/VT);\ - FFdTfhc = FFdQfhc*(1.0/itf*(1.0+2.0/(FFitf_ick*sqrt(FFic*FFic+ahc)))+1.0/VT*FFdVc_ditf);\ - if(latb <= 0.0 && latl <= 0.0) begin\ - FFdQcfc = fthc*FFdQfhc;\ - FFdTcfc = fthc*FFdTfhc;\ - FFdQcfcT = FFdQcfc;\ - FFdTcfcT = FFdTcfc;\ - end else begin\ - `HICQFC(itf,I_CK,fthc*thcs_t,FFdQcfc,FFdQcfcT,FFdTcfc,FFdTcfcT)\ - end\ - FFdQbfc = (1-fthc)*FFdQfhc;\ - FFdTbfc = (1-fthc)*FFdTfhc;\ - Q_fT = hf0_t*Q_f+FFdQbfb+FFdQbfc+hfe_t*FFdQef+hfc_t*FFdQcfcT;\ - T_fT = hf0_t*T_f+FFdTbfb+FFdTbfc+hfe_t*FFdTef+hfc_t*FFdTcfcT;\ - Q_f = Q_f+(FFdQbfb+FFdQbfc)+FFdQef+FFdQcfc;\ - T_f = T_f+(FFdTbfb+FFdTbfc)+FFdTef+FFdTcfc;\ - Q_bf = FFdQbfb+FFdQbfc;\ - end - - - - -// IDEAL DIODE (WITHOUT CAPACITANCE): -// conductance calculation not required -// INPUT: -// IS, IST : saturation currents (model parameter related) -// UM1 : ideality factor -// U : branch voltage -// IMPLICIT INPUT: -// VT : thermal voltage -// OUTPUT: -// Iz : diode current -`define HICDIO(IS,IST,UM1,U,Iz)\ - DIOY = U/(UM1*VT);\ - if (IS > 0.0) begin\ - if (DIOY > `Dexp_lim) begin\ - le = (1 + (DIOY - `Dexp_lim));\ - DIOY = `Dexp_lim;\ - end else begin\ - le = 1;\ - end\ - le = le*limexp(DIOY);\ - Iz = IST*(le-1.0);\ - if(DIOY <= -14.0) begin\ - Iz = -IST;\ - end\ - end else begin\ - Iz = 0.0;\ - end - - - -// TEMPERATURE UPDATE OF JUNCTION CAPACITANCE RELATED PARAMETERS -// INPUT: -// mostly model parameters -// x : zero bias junction capacitance -// y : junction built-in potential -// z : grading co-efficient -// w : ratio of maximum to zero-bias value of capacitance or punch-through voltage -// is_al : condition factor to check what "w" stands for -// vgeff : band-gap voltage -// IMPLICIT INPUT: -// VT : thermal voltage -// vt0,qtt0,ln_qtt0,mg : other model variables -// OUTPUT: -// c_j_t : temperature update of "c_j" -// vd_t : temperature update of "vd0" -// w_t : temperature update of "w" -`define TMPHICJ(c_j,vd0,z,w,is_al,vgeff,c_j_t,vd_t,w_t)\ - if (c_j > 0.0) begin\ - vdj0 = 2*vt0*ln(exp(vd0*0.5/vt0)-exp(-0.5*vd0/vt0));\ - vdjt = vdj0*qtt0+vgeff*(1-qtt0)-mg*VT*ln_qtt0;\ - vdt = vdjt+2*VT*ln(0.5*(1+sqrt(1+4*exp(-vdjt/VT))));\ - vd_t = vdt;\ - c_j_t = c_j*exp(z*ln(vd0/vd_t));\ - if (is_al == 1) begin\ - w_t = w*vd_t/vd0;\ - end else begin\ - w_t = w;\ - end\ - end else begin\ - c_j_t = c_j;\ - vd_t = vd0;\ - w_t = w;\ - end - - - -module hic2_full (c,b,e,s,tnode); - -//Node definitions - -inout c,b,e,s,tnode; -electrical c,b,e,s,ci,ei,bp,bi,si; -electrical xf1,xf2; -electrical xf; //RC nw - -electrical tnode; - -electrical n1,n2; - - -//Branch definitions -branch (b,bp) br_bbp_i; -branch (b,bp) br_bbp_v; -branch (ci,c) br_cic_i; -branch (ci,c) br_cic_v; -branch (ei,e) br_eie_i; -branch (ei,e) br_eie_v; -branch (bp,bi) br_bpbi_i; -branch (bp,bi) br_bpbi_v; -branch (si,s) br_sis_i; -branch (si,s) br_sis_v; -branch (bi,ei) br_biei; -branch (bi,ci) br_bici; -branch (ci,bi) br_cibi; -branch (ci,ei) br_ciei; -branch (ei,ci) br_eici; -branch (bp,e) br_bpe; -branch (b,e) br_be; -branch (bp,ei) br_bpei; -branch (bp,ci) br_bpci; -branch (b,ci) br_bci; -branch (si,ci) br_sici; -branch (s,c) br_sc; // External SC branch required for CSCp -branch (bp,si) br_bpsi; -branch (tnode ) br_sht; - -//Excess phase network for ITF -branch (xf1 ) br_bxf1; -branch (xf1 ) br_cxf1; -branch (xf2 ) br_bxf2; -branch (xf2 ) br_cxf2; - -//Excess phase network for QF - -branch (xf ) br_bxf; //for RC nw -branch (xf ) br_cxf; //for RC nw -branch (n1 ) b_n1; -branch (n2 ) b_n2; - -// -- ########################################################### -// -- ########### Parameters initialization ################ -// -- ########################################################### - - -//Transfer current -parameter real c10 = 2.0E-30 from [0:1] `ATTR(info="GICCR constant" unit="A^2s"); -parameter real qp0 = 2.0E-14 from (0:1] `ATTR(info="Zero-bias hole charge" unit="Coul"); -parameter real ich = 0.0 from [0:inf) `ATTR(info="High-current correction for 2D and 3D effects" unit="A"); //`0' signifies infinity -parameter real hf0 = 1.0 from [0:inf) `ATTR(info="Weight factor for the low current minority charge"); -parameter real hfe = 1.0 from [0:inf] `ATTR(info="Emitter minority charge weighting factor in HBTs"); -parameter real hfc = 1.0 from [0:inf] `ATTR(info="Collector minority charge weighting factor in HBTs"); -parameter real hjei = 1.0 from [0:100] `ATTR(info="B-E depletion charge weighting factor in HBTs"); -parameter real ahjei = 0.0 from [0:100] `ATTR(info="Parameter describing the slope of hjEi(VBE)"); -parameter real rhjei = 1.0 from (0:10] `ATTR(info="Smoothing parameter for hjEi(VBE) at high voltage"); -parameter real hjci = 1.0 from [0:100] `ATTR(info="B-C depletion charge weighting factor in HBTs"); - -//Base-Emitter diode currents -parameter real ibeis = 1.0E-18 from [0:1] `ATTR(info="Internal B-E saturation current" unit="A"); -parameter real mbei = 1.0 from (0:10] `ATTR(info="Internal B-E current ideality factor"); -parameter real ireis = 0.0 from [0:1] `ATTR(info="Internal B-E recombination saturation current" unit="A"); -parameter real mrei = 2.0 from (0:10] `ATTR(info="Internal B-E recombination current ideality factor"); -parameter real ibeps = 0.0 from [0:1] `ATTR(info="Peripheral B-E saturation current" unit="A"); -parameter real mbep = 1.0 from (0:10] `ATTR(info="Peripheral B-E current ideality factor"); -parameter real ireps = 0.0 from [0:1] `ATTR(info="Peripheral B-E recombination saturation current" unit="A"); -parameter real mrep = 2.0 from (0:10] `ATTR(info="Peripheral B-E recombination current ideality factor"); -parameter real mcf = 1.0 from (0:10] `ATTR(info="Non-ideality factor for III-V HBTs"); - -//Transit time for excess recombination current at b-c barrier -parameter real tbhrec = 0.0 from [0:inf) `ATTR(info="Base current recombination time constant at B-C barrier for high forward injection" unit="s"); - -//Base-Collector diode currents -parameter real ibcis = 1.0E-16 from [0:1.0] `ATTR(info="Internal B-C saturation current" unit="A"); -parameter real mbci = 1.0 from (0:10] `ATTR(info="Internal B-C current ideality factor"); -parameter real ibcxs = 0.0 from [0:1.0] `ATTR(info="External B-C saturation current" unit="A"); -parameter real mbcx = 1.0 from (0:10] `ATTR(info="External B-C current ideality factor"); - -//Base-Emitter tunneling current -parameter real ibets = 0.0 from [0:50] `ATTR(info="B-E tunneling saturation current" unit="A"); -parameter real abet = 40 from [0:inf) `ATTR(info="Exponent factor for tunneling current"); -parameter integer tunode= 1 from [0:1] `ATTR(info="Specifies the base node connection for the tunneling current"); // =1 signifies perimeter node - -//Base-Collector avalanche current -parameter real favl = 0.0 from [0:inf) `ATTR(info="Avalanche current factor" unit="1/V"); -parameter real qavl = 0.0 from [0:inf) `ATTR(info="Exponent factor for avalanche current" unit="Coul"); -parameter real kavl = 0.0 from [0:3] `ATTR(info="Flag/factor for turning strong avalanche on"); -parameter real alfav = 0.0 `ATTR(info="Relative TC for FAVL" unit="1/K"); -parameter real alqav = 0.0 `ATTR(info="Relative TC for QAVL" unit="1/K"); -parameter real alkav = 0.0 `ATTR(info="Relative TC for KAVL" unit="1/K"); - -//Series resistances -parameter real rbi0 = 0.0 from [0:inf) `ATTR(info="Zero bias internal base resistance" unit="Ohm"); -parameter real rbx = 0.0 from [0:inf) `ATTR(info="External base series resistance" unit="Ohm"); -parameter real fgeo = 0.6557 from [0:inf] `ATTR(info="Factor for geometry dependence of emitter current crowding"); -parameter real fdqr0 = 0.0 from [-0.5:100] `ATTR(info="Correction factor for modulation by B-E and B-C space charge layer"); -parameter real fcrbi = 0.0 from [0:1] `ATTR(info="Ratio of HF shunt to total internal capacitance (lateral NQS effect)"); -parameter real fqi = 1.0 from [0:1] `ATTR(info="Ration of internal to total minority charge"); -parameter real re = 0.0 from [0:inf) `ATTR(info="Emitter series resistance" unit="Ohm"); -parameter real rcx = 0.0 from [0:inf) `ATTR(info="External collector series resistance" unit="Ohm"); - -//Substrate transistor -parameter real itss = 0.0 from [0:1.0] `ATTR(info="Substrate transistor transfer saturation current" unit="A"); -parameter real msf = 1.0 from (0:10] `ATTR(info="Forward ideality factor of substrate transfer current"); -parameter real iscs = 0.0 from [0:1.0] `ATTR(info="C-S diode saturation current" unit="A"); -parameter real msc = 1.0 from (0:10] `ATTR(info="Ideality factor of C-S diode current"); -parameter real tsf = 0.0 from [0:inf) `ATTR(info="Transit time for forward operation of substrate transistor" unit="s"); - -//Intra-device substrate coupling -parameter real rsu = 0.0 from [0:inf) `ATTR(info="Substrate series resistance" unit="Ohm"); -parameter real csu = 0.0 from [0:inf) `ATTR(info="Substrate shunt capacitance" unit="F"); - -//Depletion Capacitances -parameter real cjei0 = 1.0E-20 from [0:inf) `ATTR(info="Internal B-E zero-bias depletion capacitance" unit="F"); -parameter real vdei = 0.9 from (0:10] `ATTR(info="Internal B-E built-in potential" unit="V"); -parameter real zei = 0.5 from (0:1) `ATTR(info="Internal B-E grading coefficient"); -parameter real ajei = 2.5 from [1:inf) `ATTR(info="Ratio of maximum to zero-bias value of internal B-E capacitance"); -parameter real cjep0 = 1.0E-20 from [0:inf) `ATTR(info="Peripheral B-E zero-bias depletion capacitance" unit="F"); -parameter real vdep = 0.9 from (0:10] `ATTR(info="Peripheral B-E built-in potential" unit="V"); -parameter real zep = 0.5 from (0:1) `ATTR(info="Peripheral B-E grading coefficient"); -parameter real ajep = 2.5 from [1:inf) `ATTR(info="Ratio of maximum to zero-bias value of peripheral B-E capacitance"); -parameter real cjci0 = 1.0E-20 from [0:inf) `ATTR(info="Internal B-C zero-bias depletion capacitance" unit="F"); -parameter real vdci = 0.7 from (0:10] `ATTR(info="Internal B-C built-in potential" unit="V"); -parameter real zci = 0.4 from (0:1) `ATTR(info="Internal B-C grading coefficient"); -parameter real vptci = 100 from (0:100] `ATTR(info="Internal B-C punch-through voltage" unit="V"); -parameter real cjcx0 = 1.0E-20 from [0:inf) `ATTR(info="External B-C zero-bias depletion capacitance" unit="F"); -parameter real vdcx = 0.7 from (0:10] `ATTR(info="External B-C built-in potential" unit="V"); -parameter real zcx = 0.4 from (0:1) `ATTR(info="External B-C grading coefficient"); -parameter real vptcx = 100 from (0:100] `ATTR(info="External B-C punch-through voltage" unit="V"); -parameter real fbcpar = 0.0 from [0:1] `ATTR(info="Partitioning factor of parasitic B-C cap"); -parameter real fbepar = 1.0 from [0:1] `ATTR(info="Partitioning factor of parasitic B-E cap"); -parameter real cjs0 = 0.0 from [0:inf) `ATTR(info="C-S zero-bias depletion capacitance" unit="F"); -parameter real vds = 0.6 from (0:10] `ATTR(info="C-S built-in potential" unit="V"); -parameter real zs = 0.5 from (0:1) `ATTR(info="C-S grading coefficient"); -parameter real vpts = 100 from (0:100] `ATTR(info="C-S punch-through voltage" unit="V"); -parameter real cscp0 = 0.0 from [0:inf) `ATTR(info="Perimeter S-C zero-bias depletion capacitance" unit="F"); -parameter real vdsp = 0.6 from [0:10] `ATTR(info="Perimeter S-C built-in potential" unit="V"); -parameter real zsp = 0.5 from (0:1) `ATTR(info="Perimeter S-C grading coefficient"); -parameter real vptsp = 100 from (0:100] `ATTR(info="Perimeter S-C punch-through voltage" unit="V"); - -//Diffusion Capacitances -parameter real t0 = 0.0 from [0:inf) `ATTR(info="Low current forward transit time at VBC=0V" unit="s"); -parameter real dt0h = 0.0 from (-inf:inf) `ATTR(info="Time constant for base and B-C space charge layer width modulation" unit="s"); -parameter real tbvl = 0.0 from (-inf:inf) `ATTR(info="Time constant for modeling carrier jam at low VCE" unit="s"); -parameter real tef0 = 0.0 from [0:inf) `ATTR(info="Neutral emitter storage time" unit="s"); -parameter real gtfe = 1.0 from (0:10] `ATTR(info="Exponent factor for current dependence of neutral emitter storage time"); -parameter real thcs = 0.0 from [0:inf) `ATTR(info="Saturation time constant at high current densities" unit="s"); -parameter real ahc = 0.1 from (0:50] `ATTR(info="Smoothing factor for current dependence of base and collector transit time"); -parameter real fthc = 0.0 from [0:1] `ATTR(info="Partitioning factor for base and collector portion"); -parameter real rci0 = 150 from (0:inf) `ATTR(info="Internal collector resistance at low electric field" unit="Ohm"); -parameter real vlim = 0.5 from (0:10] `ATTR(info="Voltage separating ohmic and saturation velocity regime" unit="V"); -parameter real vces = 0.1 from [0:1] `ATTR(info="Internal C-E saturation voltage" unit="V"); -parameter real vpt = 100.0 from (0:inf] `ATTR(info="Collector punch-through voltage" unit="V"); // `0' signifies infinity -parameter real aick = 1e-3 from (0:10] `ATTR(info="Smoothing term for ICK"); -parameter real delck = 2.0 from (0:10] `ATTR(info="Fitting factor for critical current"); -parameter real tr = 0.0 from [0:inf) `ATTR(info="Storage time for inverse operation" unit="s"); -parameter real vcbar = 0.0 from [0:1] `ATTR(info="Barrier voltage" unit="V"); -parameter real icbar = 0.0 from [0:1] `ATTR(info="Normalization parameter" unit="A"); -parameter real acbar = 0.01 from (0:10] `ATTR(info="Smoothing parameter for barrier voltage"); - -//Isolation Capacitances -parameter real cbepar = 0.0 from [0:inf) `ATTR(info="Total parasitic B-E capacitance" unit="F"); -parameter real cbcpar = 0.0 from [0:inf) `ATTR(info="Total parasitic B-C capacitance" unit="F"); - -//Non-quasi-static Effect -parameter real alqf = 0.167 from [0:1] `ATTR(info="Factor for additional delay time of minority charge"); -parameter real alit = 0.333 from [0:1] `ATTR(info="Factor for additional delay time of transfer current"); -parameter integer flnqs = 0 from [0:1] `ATTR(info="Flag for turning on and off of vertical NQS effect"); - -//Noise -parameter real kf = 0.0 from [0:inf) `ATTR(info="Flicker noise coefficient"); -parameter real af = 2.0 from (0:10] `ATTR(info="Flicker noise exponent factor"); -parameter integer cfbe = -1 from [-2:-1] `ATTR(info="Flag for determining where to tag the flicker noise source"); -parameter integer flcono = 0 from [0:1] `ATTR(info="Flag for turning on and off of correlated noise implementation"); - - -parameter real kfre = 0.0 from [0:inf) `ATTR(info="Emitter resistance flicker noise coefficient"); -parameter real afre = 2.0 from (0:10] `ATTR(info="Emitter resistance flicker noise exponent factor"); - - -//Lateral Geometry Scaling (at high current densities) -parameter real latb = 0.0 from [0:inf) `ATTR(info="Scaling factor for collector minority charge in direction of emitter width"); -parameter real latl = 0.0 from [0:inf) `ATTR(info="Scaling factor for collector minority charge in direction of emitter length"); - -//Temperature dependence -parameter real vgb = 1.17 from (0:10] `ATTR(info="Bandgap voltage extrapolated to 0 K" unit="V"); -parameter real alt0 = 0.0 `ATTR(info="First order relative TC of parameter T0" unit="1/K"); -parameter real kt0 = 0.0 `ATTR(info="Second order relative TC of parameter T0"); -parameter real zetaci = 0.0 from [-10:10] `ATTR(info="Temperature exponent for RCI0"); -parameter real alvs = 0.0 `ATTR(info="Relative TC of saturation drift velocity" unit="1/K"); -parameter real alces = 0.0 `ATTR(info="Relative TC of VCES" unit="1/K"); -parameter real zetarbi = 0.0 from [-10:10] `ATTR(info="Temperature exponent of internal base resistance"); -parameter real zetarbx = 0.0 from [-10:10] `ATTR(info="Temperature exponent of external base resistance"); -parameter real zetarcx = 0.0 from [-10:10] `ATTR(info="Temperature exponent of external collector resistance"); -parameter real zetare = 0.0 from [-10:10] `ATTR(info="Temperature exponent of emitter resistance"); -parameter real zetacx = 1.0 from [-10:10] `ATTR(info="Temperature exponent of mobility in substrate transistor transit time"); -parameter real vge = 1.17 from (0:10] `ATTR(info="Effective emitter bandgap voltage" unit="V"); -parameter real vgc = 1.17 from (0:10] `ATTR(info="Effective collector bandgap voltage" unit="V"); -parameter real vgs = 1.17 from (0:10] `ATTR(info="Effective substrate bandgap voltage" unit="V"); -parameter real f1vg =-1.02377e-4 `ATTR(info="Coefficient K1 in T-dependent band-gap equation"); -parameter real f2vg = 4.3215e-4 `ATTR(info="Coefficient K2 in T-dependent band-gap equation"); -parameter real zetact = 3.0 from [-10:10] `ATTR(info="Exponent coefficient in transfer current temperature dependence"); -parameter real zetabet = 3.5 from [-10:10] `ATTR(info="Exponent coefficient in B-E junction current temperature dependence"); -parameter real alb = 0.0 `ATTR(info="Relative TC of forward current gain for V2.1 model" unit="1/K"); -parameter real dvgbe = 0 from [-10:10] `ATTR(info="Bandgap difference between B and B-E junction used for hjEi0 and hf0" unit="V"); -parameter real zetahjei = 1 from [-10:10] `ATTR(info="Temperature coefficient for ahjEi"); -parameter real zetavgbe = 1 from [-10:10] `ATTR(info="Temperature coefficient for hjEi0"); - -//Self-Heating -parameter integer flsh = 0 from [0:2] `ATTR(info="Flag for turning on and off self-heating effect"); -parameter real rth = 0.0 from [0:inf) `ATTR(info="Thermal resistance" unit="K/W"); -parameter real zetarth = 0.0 from [-10:10] `ATTR(info="Temperature coefficient for Rth"); -parameter real alrth = 0.0 from [-10:10] `ATTR(info="First order relative TC of parameter Rth" unit="1/K"); -parameter real cth = 0.0 from [0:inf) `ATTR(info="Thermal capacitance" unit="J/W"); - -//Compatibility with V2.1 -parameter real flcomp = 0.0 from [0:inf) `ATTR(info="Flag for compatibility with v2.1 model (0=v2.1)"); - -//Circuit simulator specific parameters -parameter real tnom = 27.0 `ATTR(info="Temperature at which parameters are specified" unit="C"); -parameter real dt = 0.0 `ATTR(info="Temperature change w.r.t. chip temperature for particular transistor" unit="K"); -parameter integer type = 1 from [-1:1] exclude 0 `ATTR(info="For transistor type NPN(+1) or PNP (-1)"); - -// -//======================== Transistor model formulation =================== -// - - //Declaration of variables - - real _circuit_gmin; - - //Temperature and drift - real VT,Tdev,qtt0,ln_qtt0,r_VgVT,V_gT,dT,k; - real ireis_t,ibeis_t,ibcxs_t,ibcis_t,iscs_t,cjci0_t; - real cjs0_t,cscp0_t,rci0_t,vlim_t,vces_t,thcs_t,tef0_t,rbi0_t; - real t0_t,vdei_t,vdci_t,vpts_t,vptsp_t,itss_t,tsf_t; - real c10_t,cjei0_t,qp0_t,vdcx_t,vptcx_t,cjcx01_t,cjcx02_t; - real qjcx0_t_i,qjcx0_t_ii,cratio_t; - real ibeps_t,ireps_t,cjep0_t; - real ajei_t,qavl_t,favl_t,kavl_t,ibets_t,abet_t,vptci_t,vdep_t,ajep_t,zetatef; - real k1,k2,dvg0,vge_t,vgb_t,vgbe_t,vds_t,vdsp_t,vt0,Tnom,Tamb,a,avs; - real zetabci,zetabcxt,zetasct,vgbe0,mg,vgb_t0,vge_t0,vgbe_t0,vgbc0,vgsc0; - - real cbcpar1,cbcpar2,cbepar2,cbepar1,Oich,Ovpt,Otbhrec; - - //Charges, capacitances and currents - real Qjci,Qjei,Qjep; - real it,ibei,irei,ibci,ibep,irep,ibh_rec; - real Qdei,Qdci,qrbi; - real ibet,iavl; - real ijbcx,ijsc,Qjs,Qscp,HSUM,HSI_Tsu,Qdsu; - - //Base resistance and self-heating power - real pterm,rth_t; - - //Variables for macro TMPHICJ - real vdj0,vdjt,vdt; - - //Model initialization - real k10,k20,C_1; - - //Model evaluation - real Cjci,Cjcit,cc,Cjei,Cjep,CjCx_i,CjCx_ii,Cjs,Cscp; - real itf,itr,Tf,Tr,VT_f,i_0f,i_0r,a_bpt,Q_0,Q_p,Q_bpt; - real Orci0_t,b_q,I_Tf1,T_f0,Q_fT,T_fT,Q_bf; - real ICKa,d1,a1,a11,Odelck,ick1,ick2; - real A,a_h,Q_pT,d_Q,d_Q0; - real Qf,Cdei,Qr,Cdci,Crbi; - real ick,vc,vceff,cjcx01,cjcx02,HSa,HSb; - integer l_it; - - //Variables for macros - real DIOY,le;//HICDIO - real FFfcbar,FFitf_ick,FFdQef,FFdTef,FFdQbfb,FFdTbfb,FFdQfhc,FFdTfhc,FFdQbfc,FFdTbfc,FFdQcfc,FFdTcfc,FFdQcfcT,FFdTcfcT,FFib,FFic,FFw,FFdVc,FFdVc_ditf,FFdib_ditf;//HICQFF - real FCz,FCw2,FCf1,FCf2,FCf3,FCf_ci,FCz_1,FCa1,FCa_ck,FCxl,FCxb;//HICQFC - real FCd_a,FCdaick_ditf,FCa,FCw,FCdw_daick,FCdfc_dw,FCdw_ditf,FCdfc_ditf,FCf_CT,FCdfCT_ditf,FCrt,FCln,lnz,FCda1_dw,FCdf1_dw,FCdf2_dw,FCdf3_dw,FCd_f,FCdfCT_dw;//HICQFC - real Dz_r,Dv_p,DV_f,DC_max,DC_c,Da,Dv_e,De,De_1,Dv_j1,Dv_r,De_2,Dv_j2,Dv_j4,DQ_j1,DQ_j2,DQ_j3,DCln1,DCln2,Dz1,Dzr1,DC_j1,DC_j2,DC_j3;//QJMOD - real DFV_f,DFv_e,DFv_j,DFb,DFQ_j,DFs_q,DFs_q2,DFdvj_dv,DFC_j1;//QJMODF - real z,a2,a3,r,x;//HICFCI - real lnzb; //HICFCT - - //Noise - real fourkt,twoq,flicker_Pwr; - real betadc; - real n_w,n_1,n_2,sqrt_n2; - //NQS - real Ixf1,Ixf2,Qxf1,Qxf2,Vxf1,Vxf2,Itxf,Qdeix; - real Vxf, Ixf, Qxf,fact; - - real hjei_vbe,vj,vj_z; - real hjei0_t, ahjei_t, hf0_t, hfe_t, hfc_t; - - real i_re; - - real Vbiei, Vbici, Vciei, Vbpei, Vbpci, Vbci, Vsici, Vsc; - - // Model flags - integer use_aval; - - real rbx_t; - - real a_eg,ab,aa; - real cV_f,cv_e,cs_q,cs_q2,cv_j,cdvj_dv; - real v_bord,v_q,U0,av,avl; - real Qz_nom,f_QR,ETA,Qz0,fQz; - real pocce,czz; - real denom,sq_smooth,hl; - - `ifdef CALC_OP - (* desc="External (saturated) collector series resistance", units="Ohm" *) real rcx_t; - (* desc="Emitter series resistance", units="Ohm" *) real re_t; - (* desc="Internal base resistance as calculated in the model", units="Ohm" *) real rbi; - (* desc="Total base resistance as calculated in the model", units="Ohm" *) real rb; - `else - real rcx_t, re_t, rbi; - `endif - - `ifdef CALC_OP - (* desc="Base terminal current", units="A" *) real IB; - (* desc="Collector terminal current", units="A" *) real IC; - (* desc="Substrate terminal current", units="A" *) real IS; - (* desc="Avalanche current", units="A" *) real IAVL; - - (* desc="External BE voltage", units="V" *) real VBE; - (* desc="External BC voltage", units="V" *) real VBC; - (* desc="External CE voltage", units="V" *) real VCE; - (* desc="External SC voltage", units="V" *) real VSC; - - (* desc="Common emitter forward current gain" *) real BETADC; - (* desc="Internal transconductance", units="A/V" *) real GMi; - (* desc="Transconductance of the parasitic substrate PNP", units="A/V" *) real GMS; - (* desc="Internal base-emitter (input) resistance", units="Ohm" *) real RPIi; - (* desc="External base-emitter (input) resistance", units="Ohm" *) real RPIx; - (* desc="Internal feedback resistance", units="Ohm" *) real RMUi; - (* desc="External feedback resistance", units="Ohm" *) real RMUx; - (* desc="Output resistance", units="Ohm" *) real ROi; - (* desc="Total internal BE capacitance", units="F" *) real CPIi; - (* desc="Total external BE capacitance", units="F" *) real CPIx; - (* desc="Total internal BC capacitance", units="F" *) real CMUi; - (* desc="Total external BC capacitance", units="F" *) real CMUx; - (* desc="CS junction capacitance", units="F" *) real CCS; - (* desc="Small signal current gain" *) real BETAAC; - (* desc="Shunt capacitance across RBI as calculated in the model", units="F" *) real CRBI; - (* desc="Forward transit time", units="s" *) real TF; - (* desc="Transit frequency", units="Hz" *) real FT; - - (* desc="Actual device temperature", units="K" *) real TK; - (* desc="Temperature increase due to self-heating", units="K" *) real DTSH; - `endif - - - //end of variables - -analog begin - -`MODEL begin : Model_initialization - - Tnom = tnom+`P_CELSIUS0; - Tamb = $temperature; - vt0 = `P_K*Tnom /`P_Q; - k10 = f1vg*Tnom*ln(Tnom); - k20 = f2vg*Tnom; - avs = alvs*Tnom; - vgb_t0 = vgb+k10+k20; - vge_t0 = vge+k10+k20; - vgbe_t0 = (vgb_t0+vge_t0)/2; - vgbe0 = (vgb+vge)/2; - vgbc0 = (vgb+vgc)/2; - vgsc0 = (vgs+vgc)/2; - mg = 3-`P_Q*f1vg/`P_K; - zetabci = mg+1-zetaci; - zetabcxt= mg+1-zetacx; - zetasct = mg-1.5; - - //Depletion capacitance splitting at b-c junction - //Capacitances at peripheral and external base node - C_1 = (1.0-fbcpar)*(cjcx0+cbcpar); - if (C_1 >= cbcpar) begin - cbcpar1 = cbcpar; - cbcpar2 = 0.0; - cjcx01 = C_1-cbcpar; - cjcx02 = cjcx0-cjcx01; - end else begin - cbcpar1 = C_1; - cbcpar2 = cbcpar-cbcpar1; - cjcx01 = 0.0; - cjcx02 = cjcx0; - end - - //Parasitic b-e capacitance partitioning: No temperature dependence - cbepar2 = fbepar*cbepar; - cbepar1 = cbepar-cbepar2; - - //Avoid divide-by-zero and define infinity other way - //High current correction for 2D and 3D effects - if (ich != 0.0) begin - Oich = 1.0/ich; - end else begin - Oich = 0.0; - end - - //Base current recombination time constant at b-c barrier - if (tbhrec != 0.0) begin - Otbhrec = 1.0/tbhrec; - end else begin - Otbhrec = 0.0; - end - - // Turn avalanche calculation on depending of parameters - if ((favl > 0.0) && (cjci0 > 0.0)) begin - use_aval = 1; - end else begin - use_aval = 0; - iavl = 0.0; // Set iavl to zero in this case here, this avoids the else block later - end - - // Temperature and resulting parameter drift - if (flsh==0 || rth < `MIN_R) begin : Thermal_updat_without_self_heating - Tdev = Tamb+dt; - if(Tdev < `TMIN + 273.15) begin - Tdev = `TMIN + 273.15; - end else begin - if (Tdev > `TMAX + 273.15) begin - Tdev = `TMAX + 273.15; - end - end - VT = `P_K*Tdev /`P_Q; - dT = Tdev-Tnom; - qtt0 = Tdev/Tnom; - ln_qtt0 = ln(qtt0); - k1 = f1vg*Tdev*ln(Tdev); - k2 = f2vg*Tdev; - vgb_t = vgb+k1+k2; - vge_t = vge+k1+k2; - vgbe_t = (vgb_t+vge_t)/2; - - //Internal b-e junction capacitance - `TMPHICJ(cjei0,vdei,zei,ajei,1,vgbe0,cjei0_t,vdei_t,ajei_t) - - if (flcomp == 0.0 || flcomp == 2.1) begin - V_gT = 3.0*VT*ln_qtt0 + vgb*(qtt0-1.0); - r_VgVT = V_gT/VT; - //Internal b-e diode saturation currents - a = mcf*r_VgVT/mbei - alb*dT; - ibeis_t = ibeis*exp(a); - a = mcf*r_VgVT/mrei - alb*dT; - ireis_t = ireis*exp(a); - a = mcf*r_VgVT/mbep - alb*dT; - //Peripheral b-e diode saturation currents - ibeps_t = ibeps*exp(a); - a = mcf*r_VgVT/mrep - alb*dT; - ireps_t = ireps*exp(a); - //Internal b-c diode saturation current - a = r_VgVT/mbci; - ibcis_t = ibcis*exp(a); - //External b-c diode saturation currents - a = r_VgVT/mbcx; - ibcxs_t = ibcxs*exp(a); - //Saturation transfer current for substrate transistor - a = r_VgVT/msf; - itss_t = itss*exp(a); - //Saturation current for c-s diode - a = r_VgVT/msc; - iscs_t = iscs*exp(a); - //Zero bias hole charge - a = vdei_t/vdei; - qp0_t = qp0*(1.0+0.5*zei*(1.0-a)); - //Voltage separating ohmic and saturation velocity regime - a = vlim*(1.0-alvs*dT)*exp(zetaci*ln_qtt0); - k = (a-VT)/VT; - if (k < `LN_EXP_LIMIT) begin - vlim_t = VT + VT*ln(1.0+exp(k)); - end else begin - vlim_t = a; - end - //Neutral emitter storage time - a = 1.0+alb*dT; - k = 0.5*(a+sqrt(a*a+0.01)); - tef0_t = tef0*qtt0/k; - end else begin - //Internal b-e diode saturation currents - ibeis_t = ibeis*exp(zetabet*ln_qtt0+vge/VT*(qtt0-1)); - if (flcomp>=2.3) begin - ireis_t = ireis*exp(mg/mrei*ln_qtt0+vgbe0/(mrei*VT)*(qtt0-1)); - end else begin - ireis_t = ireis*exp(0.5*mg*ln_qtt0+0.5*vgbe0/VT*(qtt0-1)); - end - //Peripheral b-e diode saturation currents - ibeps_t = ibeps*exp(zetabet*ln_qtt0+vge/VT*(qtt0-1)); - if (flcomp>=2.3) begin - ireps_t = ireps*exp(mg/mrep*ln_qtt0+vgbe0/(mrep*VT)*(qtt0-1)); - end else begin - ireps_t = ireps*exp(0.5*mg*ln_qtt0+0.5*vgbe0/VT*(qtt0-1)); - end - //Internal b-c diode saturation currents - ibcis_t = ibcis*exp(zetabci*ln_qtt0+vgc/VT*(qtt0-1)); - //External b-c diode saturation currents - ibcxs_t = ibcxs*exp(zetabcxt*ln_qtt0+vgc/VT*(qtt0-1)); - //Saturation transfer current for substrate transistor - itss_t = itss*exp(zetasct*ln_qtt0+vgc/VT*(qtt0-1)); - //Saturation current for c-s diode - iscs_t = iscs*exp(zetasct*ln_qtt0+vgs/VT*(qtt0-1)); - //Zero bias hole charge - a = exp(zei*ln(vdei_t/vdei)); - qp0_t = qp0*(2.0-a); - //Voltage separating ohmic and saturation velocity regime - vlim_t = vlim*exp((zetaci-avs)*ln_qtt0); - //Neutral emitter storage time - if (flcomp >= 2.3) begin - tef0_t = tef0; - end else begin - zetatef = zetabet-zetact-0.5; - dvg0 = vgb-vge; - tef0_t = tef0*exp(zetatef*ln_qtt0-dvg0/VT*(qtt0-1)); - end - end - - //GICCR prefactor - c10_t = c10*exp(zetact*ln_qtt0+vgb/VT*(qtt0-1)); - - // Low-field internal collector resistance - rci0_t = rci0*exp(zetaci*ln_qtt0); - - //Voltage separating ohmic and saturation velocity regime - //vlim_t = vlim*exp((zetaci-avs)*ln_qtt0); - - //Internal c-e saturation voltage - vces_t = vces*(1+alces*dT); - - //Internal b-c diode saturation current - //ibcis_t = ibcis*exp(zetabci*ln_qtt0+vgc/VT*(qtt0-1)); - - //Internal b-c junction capacitance - `TMPHICJ(cjci0,vdci,zci,vptci,0,vgbc0,cjci0_t,vdci_t,vptci_t) - - //Low-current forward transit time - t0_t = t0*(1+alt0*dT+kt0*dT*dT); - - //Saturation time constant at high current densities - thcs_t = thcs*exp((zetaci-1)*ln_qtt0); - - - //Avalanche current factors - favl_t = favl*exp(alfav*dT); - qavl_t = qavl*exp(alqav*dT); - kavl_t = kavl*exp(alkav*dT); - - //Zero bias internal base resistance - rbi0_t = rbi0*exp(zetarbi*ln_qtt0); - - - //Peripheral b-e junction capacitance - `TMPHICJ(cjep0,vdep,zep,ajep,1,vgbe0,cjep0_t,vdep_t,ajep_t) - - //Tunneling current factors - if (ibets > 0) begin : HICTUN_T - ab = 1.0; - aa = 1.0; - a_eg=vgbe_t0/vgbe_t; - if(tunode==1 && cjep0 > 0.0 && vdep >0.0) begin - ab = (cjep0_t/cjep0)*sqrt(a_eg)*vdep_t*vdep_t/(vdep*vdep); - aa = (vdep/vdep_t)*(cjep0/cjep0_t)*pow(a_eg,-1.5); - end else if (tunode==0 && cjei0 > 0.0 && vdei >0.0) begin - ab = (cjei0_t/cjei0)*sqrt(a_eg)*vdei_t*vdei_t/(vdei*vdei); - aa = (vdei/vdei_t)*(cjei0/cjei0_t)*pow(a_eg,-1.5); - end - ibets_t = ibets*ab; - abet_t = abet*aa; - end else begin - ibets_t = 0; - abet_t = 1; - end - - - //Temperature mapping for tunneling current is done inside HICTUN - - `TMPHICJ(1.0,vdcx,zcx,vptcx,0,vgbc0,cratio_t,vdcx_t,vptcx_t) - cjcx01_t=cratio_t*cjcx01; - cjcx02_t=cratio_t*cjcx02; - - - //External b-c diode saturation currents - //ibcxs_t = ibcxs*exp(zetabcxt*ln_qtt0+vgc/VT*(qtt0-1)); - - - //Constant external series resistances - rcx_t = rcx*exp(zetarcx*ln_qtt0); - rbx_t = rbx*exp(zetarbx*ln_qtt0); - re_t = re*exp(zetare*ln_qtt0); - - //Forward transit time in substrate transistor - tsf_t = tsf*exp((zetacx-1.0)*ln_qtt0); - - //Capacitance for c-s junction - `TMPHICJ(cjs0,vds,zs,vpts,0,vgsc0,cjs0_t,vds_t,vpts_t) - /*Peripheral s-c capacitance - * Note, thermal update only required for vds > 0 - * Save computional effort otherwise - */ - if (vdsp > 0) begin - `TMPHICJ(cscp0,vdsp,zsp,vptsp,0,vgsc0,cscp0_t,vdsp_t,vptsp_t) - end else begin - // Avoid uninitialized variables - cscp0_t = cscp0; - vdsp_t = vdsp; - vptsp_t = vptsp; - end - - ahjei_t = ahjei*exp(zetahjei*ln_qtt0); - hjei0_t = hjei*exp(dvgbe/VT*(exp(zetavgbe*ln(qtt0))-1)); - hf0_t = hf0*exp(dvgbe/VT*(qtt0-1)); - if (flcomp >= 2.3) begin - hfe_t = hfe*exp((vgb-vge)/VT*(qtt0-1)); - hfc_t = hfc*exp((vgb-vgc)/VT*(qtt0-1)); - end else begin - hfe_t = hfe; - hfc_t = hfc; - end - - rth_t = rth*exp(zetarth*ln_qtt0)*(1+alrth*dT); - - end // of Thermal_update_without_self_heating - -end //of Model_initialization - -Vbiei = type*V(br_biei); -Vbici = type*V(br_bici); -Vciei = Vbiei-Vbici; -Vbpei = type*V(br_bpei); -Vbpci = type*V(br_bpci); -Vbci = type*V(br_bci); -Vsici = type*V(br_sici); -Vsc = type*V(br_sc); - -if (flsh!=0 && rth >= `MIN_R) begin : Thermal_update_with_self_heating - Tdev = Tamb+dt+V(br_sht); - // Limit temperature to avoid FPEs in equations - if(Tdev < `TMIN + 273.15) begin - Tdev = `TMIN + 273.15; - end else begin - if (Tdev > `TMAX + 273.15) begin - Tdev = `TMAX + 273.15; - end - end - VT = `P_K*Tdev /`P_Q; - dT = Tdev-Tnom; - qtt0 = Tdev/Tnom; - ln_qtt0 = ln(qtt0); - k1 = f1vg*Tdev*ln(Tdev); - k2 = f2vg*Tdev; - vgb_t = vgb+k1+k2; - vge_t = vge+k1+k2; - vgbe_t = (vgb_t+vge_t)/2; - - //Internal b-e junction capacitance - `TMPHICJ(cjei0,vdei,zei,ajei,1,vgbe0,cjei0_t,vdei_t,ajei_t) - - if (flcomp == 0.0 || flcomp == 2.1) begin - V_gT = 3.0*VT*ln_qtt0 + vgb*(qtt0-1.0); - r_VgVT = V_gT/VT; - //Internal b-e diode saturation currents - a = mcf*r_VgVT/mbei - alb*dT; - ibeis_t = ibeis*exp(a); - a = mcf*r_VgVT/mrei - alb*dT; - ireis_t = ireis*exp(a); - a = mcf*r_VgVT/mbep - alb*dT; - //Peripheral b-e diode saturation currents - ibeps_t = ibeps*exp(a); - a = mcf*r_VgVT/mrep - alb*dT; - ireps_t = ireps*exp(a); - //Internal b-c diode saturation current - a = r_VgVT/mbci; - ibcis_t = ibcis*exp(a); - //External b-c diode saturation currents - a = r_VgVT/mbcx; - ibcxs_t = ibcxs*exp(a); - //Saturation transfer current for substrate transistor - a = r_VgVT/msf; - itss_t = itss*exp(a); - //Saturation current for c-s diode - a = r_VgVT/msc; - iscs_t = iscs*exp(a); - //Zero bias hole charge - a = vdei_t/vdei; - qp0_t = qp0*(1.0+0.5*zei*(1.0-a)); - //Voltage separating ohmic and saturation velocity regime - a = vlim*(1.0-alvs*dT)*exp(zetaci*ln_qtt0); - k = (a-VT)/VT; - if (k < `LN_EXP_LIMIT) begin - vlim_t = VT + VT*ln(1.0+exp(k)); - end else begin - vlim_t = a; - end - //Neutral emitter storage time - a = 1.0+alb*dT; - k = 0.5*(a+sqrt(a*a+0.01)); - tef0_t = tef0*qtt0/k; - end else begin - //Internal b-e diode saturation currents - ibeis_t = ibeis*exp(zetabet*ln_qtt0+vge/VT*(qtt0-1)); - if (flcomp>=2.3) begin - ireis_t = ireis*exp(mg/mrei*ln_qtt0+vgbe0/(mrei*VT)*(qtt0-1)); - end else begin - ireis_t = ireis*exp(0.5*mg*ln_qtt0+0.5*vgbe0/VT*(qtt0-1)); - end - //Peripheral b-e diode saturation currents - ibeps_t = ibeps*exp(zetabet*ln_qtt0+vge/VT*(qtt0-1)); - if (flcomp>=2.3) begin - ireps_t = ireps*exp(mg/mrep*ln_qtt0+vgbe0/(mrep*VT)*(qtt0-1)); - end else begin - ireps_t = ireps*exp(0.5*mg*ln_qtt0+0.5*vgbe0/VT*(qtt0-1)); - end - //Internal b-c diode saturation currents - ibcis_t = ibcis*exp(zetabci*ln_qtt0+vgc/VT*(qtt0-1)); - //External b-c diode saturation currents - ibcxs_t = ibcxs*exp(zetabcxt*ln_qtt0+vgc/VT*(qtt0-1)); - //Saturation transfer current for substrate transistor - itss_t = itss*exp(zetasct*ln_qtt0+vgc/VT*(qtt0-1)); - //Saturation current for c-s diode - iscs_t = iscs*exp(zetasct*ln_qtt0+vgs/VT*(qtt0-1)); - //Zero bias hole charge - a = exp(zei*ln(vdei_t/vdei)); - qp0_t = qp0*(2.0-a); - //Voltage separating ohmic and saturation velocity regime - vlim_t = vlim*exp((zetaci-avs)*ln_qtt0); - //Neutral emitter storage time - if (flcomp >= 2.3) begin - tef0_t = tef0; - end else begin - zetatef = zetabet-zetact-0.5; - dvg0 = vgb-vge; - tef0_t = tef0*exp(zetatef*ln_qtt0-dvg0/VT*(qtt0-1)); - end - end - - //GICCR prefactor - c10_t = c10*exp(zetact*ln_qtt0+vgb/VT*(qtt0-1)); - - // Low-field internal collector resistance - rci0_t = rci0*exp(zetaci*ln_qtt0); - - //Voltage separating ohmic and saturation velocity regime - //vlim_t = vlim*exp((zetaci-avs)*ln_qtt0); - - //Internal c-e saturation voltage - vces_t = vces*(1+alces*dT); - - //Internal b-c diode saturation current - //ibcis_t = ibcis*exp(zetabci*ln_qtt0+vgc/VT*(qtt0-1)); - - //Internal b-c junction capacitance - `TMPHICJ(cjci0,vdci,zci,vptci,0,vgbc0,cjci0_t,vdci_t,vptci_t) - - //Low-current forward transit time - t0_t = t0*(1+alt0*dT+kt0*dT*dT); - - //Saturation time constant at high current densities - thcs_t = thcs*exp((zetaci-1)*ln_qtt0); - - - //Avalanche current factors - favl_t = favl*exp(alfav*dT); - qavl_t = qavl*exp(alqav*dT); - kavl_t = kavl*exp(alkav*dT); - - //Zero bias internal base resistance - rbi0_t = rbi0*exp(zetarbi*ln_qtt0); - - - //Peripheral b-e junction capacitance - `TMPHICJ(cjep0,vdep,zep,ajep,1,vgbe0,cjep0_t,vdep_t,ajep_t) - - //Tunneling current factors - if (ibets > 0 && (Vbpei < 0.0 || Vbiei < 0.0)) begin : HICTUN_T - ab = 1.0; - aa = 1.0; - a_eg=vgbe_t0/vgbe_t; - if(tunode==1 && cjep0 > 0.0 && vdep >0.0) begin - ab = (cjep0_t/cjep0)*sqrt(a_eg)*vdep_t*vdep_t/(vdep*vdep); - aa = (vdep/vdep_t)*(cjep0/cjep0_t)*pow(a_eg,-1.5); - end else if (tunode==0 && cjei0 > 0.0 && vdei >0.0) begin - ab = (cjei0_t/cjei0)*sqrt(a_eg)*vdei_t*vdei_t/(vdei*vdei); - aa = (vdei/vdei_t)*(cjei0/cjei0_t)*pow(a_eg,-1.5); - end - ibets_t = ibets*ab; - abet_t = abet*aa; - end else begin - ibets_t = 0; - abet_t = 1; - end - - - //Temperature mapping for tunneling current is done inside HICTUN - - `TMPHICJ(1.0,vdcx,zcx,vptcx,0,vgbc0,cratio_t,vdcx_t,vptcx_t) - cjcx01_t=cratio_t*cjcx01; - cjcx02_t=cratio_t*cjcx02; - - - //External b-c diode saturation currents - //ibcxs_t = ibcxs*exp(zetabcxt*ln_qtt0+vgc/VT*(qtt0-1)); - - - //Constant external series resistances - rcx_t = rcx*exp(zetarcx*ln_qtt0); - rbx_t = rbx*exp(zetarbx*ln_qtt0); - re_t = re*exp(zetare*ln_qtt0); - - //Forward transit time in substrate transistor - tsf_t = tsf*exp((zetacx-1.0)*ln_qtt0); - - //Capacitance for c-s junction - `TMPHICJ(cjs0,vds,zs,vpts,0,vgsc0,cjs0_t,vds_t,vpts_t) - /*Peripheral s-c capacitance - * Note, thermal update only required for vds > 0 - * Save computional effort otherwise - */ - if (vdsp > 0) begin - `TMPHICJ(cscp0,vdsp,zsp,vptsp,0,vgsc0,cscp0_t,vdsp_t,vptsp_t) - end else begin - // Avoid uninitialized variables - cscp0_t = cscp0; - vdsp_t = vdsp; - vptsp_t = vptsp; - end - - ahjei_t = ahjei*exp(zetahjei*ln_qtt0); - hjei0_t = hjei*exp(dvgbe/VT*(exp(zetavgbe*ln(qtt0))-1)); - hf0_t = hf0*exp(dvgbe/VT*(qtt0-1)); - if (flcomp >= 2.3) begin - hfe_t = hfe*exp((vgb-vge)/VT*(qtt0-1)); - hfc_t = hfc*exp((vgb-vgc)/VT*(qtt0-1)); - end else begin - hfe_t = hfe; - hfc_t = hfc; - end - - rth_t = rth*exp(zetarth*ln_qtt0)*(1+alrth*dT); - -end //of Thermal_update_with_self_heating - - -begin : Model_evaluation - - //Intrinsic transistor - //Internal base currents across b-e junction - `HICDIO(ibeis,ibeis_t,mbei,Vbiei,ibei) - `HICDIO(ireis,ireis_t,mrei,Vbiei,irei) - - //HICCR: begin - - //Inverse of low-field internal collector resistance: needed in HICICK - Orci0_t = 1.0/rci0_t; - - //Initialization - //Transfer current, minority charges and transit times - - Tr = tr; - VT_f = mcf*VT; - i_0f = c10_t * limexp(Vbiei/VT_f); - i_0r = c10_t * limexp(Vbici/VT); - - //Internal b-e and b-c junction capacitances and charges - //`QJMODF(cjei0_t,vdei_t,zei,ajei_t,V(br_biei),Qjei) - //Cjei = ddx(Qjei,V(bi)); - `QJMODF(cjei0_t,vdei_t,zei,ajei_t,Vbiei,Cjei,Qjei) - if (ahjei == 0.0) begin - hjei_vbe = hjei; - end else begin - //vendhjei = vdei_t*(1.0-exp(-ln(ajei_t)/z_h)); - vj = (vdei_t-Vbiei)/(rhjei*VT); - vj = vdei_t-rhjei*VT*(vj+sqrt(vj*vj+`DFa_fj))*0.5; - vj = (vj-VT)/VT; - vj = VT*(1.0+(vj+sqrt(vj*vj+`DFa_fj))*0.5); - vj_z = (1.0-exp(zei*ln(1.0-vj/vdei_t)))*ahjei_t; - hjei_vbe = hjei0_t*(exp(vj_z)-1.0)/vj_z; - end - - - - //`HICJQ(cjci0_t,vdci_t,zci,vptci_t,V(br_bici),Qjci) - //Cjci = ddx(Qjci,V(bi)); - `HICJQ(cjci0_t,vdci_t,zci,vptci_t,Vbici,Cjci,Qjci) - - //Hole charge at low bias - a_bpt = 0.05; - Q_0 = qp0_t + hjei_vbe*Qjei + hjci*Qjci; - Q_bpt = a_bpt*qp0_t; - b_q = Q_0/Q_bpt-1; - Q_0 = Q_bpt*(1+(b_q +sqrt(b_q*b_q+1.921812))/2); - - //Transit time calculation at low current density - if(cjci0_t > 0.0) begin : CJMODF - cV_f = vdci_t*(1.0-exp(-ln(2.4)/zci)); - cv_e = (cV_f-Vbici)/VT; - cs_q = sqrt(cv_e*cv_e+1.921812); - cs_q2 = (cv_e+cs_q)*0.5; - cv_j = cV_f-VT*cs_q2; - cdvj_dv = cs_q2/cs_q; - Cjcit = cjci0_t*exp(-zci*ln(1.0-cv_j/vdci_t))*cdvj_dv+2.4*cjci0_t*(1.0-cdvj_dv); - end else begin - Cjcit = 0.0; - end - if(Cjcit > 0.0) begin - cc = cjci0_t/Cjcit; - end else begin - cc = 1.0; - end - T_f0 = t0_t+dt0h*(cc-1.0)+tbvl*(1/cc-1.0); - - //Effective collector voltage - vc = Vciei-vces_t; - - //Critical current for onset of high-current effects - begin : HICICK - Ovpt = 1.0/vpt; - a = vc/VT; - d1 = a-1; - vceff = (1.0+((d1+sqrt(d1*d1+1.921812))/2))*VT; - // a = vceff/vlim_t; - // ick = vceff*Orci0_t/sqrt(1.0+a*a); - // ICKa = (vceff-vlim_t)*Ovpt; - // ick = ick*(1.0+0.5*(ICKa+sqrt(ICKa*ICKa+1.0e-3))); - - a1 = vceff/vlim_t; - a11 = vceff*Orci0_t; - Odelck = 1/delck; - ick1 = exp(Odelck*ln(1+exp(delck*ln(a1)))); - ick2 = a11/ick1; - ICKa = (vceff-vlim_t)*Ovpt; - ick = ick2*(1.0+0.5*(ICKa+sqrt(ICKa*ICKa+aick))); - - end - - //Initial formulation of forward and reverse component of transfer current - Q_p = Q_0; - if (T_f0 > 0.0 || Tr > 0.0) begin - A = 0.5*Q_0; - Q_p = A+sqrt(A*A+T_f0*i_0f+Tr*i_0r); - end - I_Tf1 =i_0f/Q_p; - a_h = Oich*I_Tf1; - itf = I_Tf1*(1.0+a_h); - itr = i_0r/Q_p; - - //Initial formulation of forward transit time, diffusion, GICCR and excess b-c charge - Q_bf = 0.0; - Tf = T_f0; - Qf = T_f0*itf; - `HICQFF(itf,ick,Tf,Qf,T_fT,Q_fT,Q_bf) - - //Initial formulation of reverse diffusion charge - Qr = Tr*itr; - - //Preparation for iteration to get total hole charge and related variables - l_it = 0; - if(Qf > `RTOLC*Q_p || a_h > `RTOLC) begin - //Iteration for Q_pT is required for improved initial solution - Qf = sqrt(T_f0*itf*Q_fT); - Q_pT = Q_0+Qf+Qr; - d_Q = Q_pT; - while (abs(d_Q) >= `RTOLC*abs(Q_pT) && l_it <= `l_itmax) begin - d_Q0 = d_Q; - I_Tf1 = i_0f/Q_pT; - a_h = Oich*I_Tf1; - itf = I_Tf1*(1.0+a_h); - itr = i_0r/Q_pT; - Tf = T_f0; - Qf = T_f0*itf; - `HICQFF(itf,ick,Tf,Qf,T_fT,Q_fT,Q_bf) - Qr = Tr*itr; - if(Oich == 0.0) begin - a = 1.0+(T_fT*itf+Qr)/Q_pT; - end else begin - a = 1.0+(T_fT*I_Tf1*(1.0+2.0*a_h)+Qr)/Q_pT; - end - d_Q = -(Q_pT-(Q_0+Q_fT+Qr))/a; - //Limit maximum change of Q_pT - a = abs(0.3*Q_pT); - if(abs(d_Q) > a) begin - if (d_Q>=0) begin - d_Q = a; - end else begin - d_Q = -a; - end - end - Q_pT = Q_pT+d_Q; - l_it = l_it+1; - end //while - - I_Tf1 = i_0f/Q_pT; - a_h = Oich*I_Tf1; - itf = I_Tf1*(1.0+a_h); - itr = i_0r/Q_pT; - - //Final transit times, charges and transport current components - Tf = T_f0; - Qf = T_f0*itf; - `HICQFF(itf,ick,Tf,Qf,T_fT,Q_fT,Q_bf) - Qr = Tr*itr; - - end //if - - //NQS effect implemented with LCR networks - //Once the delay in ITF is considered, IT_NQS is calculated afterwards - - it = itf-itr; - - //Diffusion charges for further use - Qdei = Qf; - Qdci = Qr; - - - //High-frequency emitter current crowding (lateral NQS) - Cdei = T_f0*itf/VT; - Cdci = tr*itr/VT; - Crbi = fcrbi*(Cjei+Cjci+Cdei+Cdci); - qrbi = Crbi*V(br_bpbi_v); - - // qrbi = fcrbi*(Qjei+Qjci+Qdei+Qdci); - - //HICCR: end - - //Internal base current across b-c junction - `HICDIO(ibcis,ibcis_t,mbci,Vbici,ibci) - - //Avalanche current - if (use_aval == 1) begin : HICAVL - v_bord = vdci_t-Vbici; - if (v_bord > 0) begin - v_q = qavl_t/Cjci; - U0 = qavl_t/cjci0_t; - if(v_bord > U0) begin - av = favl_t*exp(-v_q/U0); - avl = av*(U0+(1.0+v_q/U0)*(v_bord-U0)); - end else begin - avl = favl_t*v_bord*exp(-v_q/v_bord); - end - /* This model turns strong avalanche on. The parameter kavl can turn this - * model extension off (kavl = 0). Although this is numerically stable, a - * conditional statement is applied in order to reduce the numerical over- - * head for simulations without the new model. - */ - if (kavl > 0) begin : HICAVLHIGH - denom = 1-kavl_t*avl; - // Avoid denom < 0 using a smoothing function - sq_smooth = sqrt(denom*denom+0.01); - hl = 0.5*(denom+sq_smooth); - iavl = itf*avl/hl; - end else begin - iavl = itf*avl; - end - end else begin - iavl = 0.0; - end - end - // Note that iavl = 0.0 is already set in the initialization block for use_aval == 0 - - //Excess base current from recombination at the b-c barrier - ibh_rec = Q_bf*Otbhrec; - - //Internal base resistance - if(rbi0_t > 0.0) begin : HICRBI - // Consideration of conductivity modulation - // To avoid convergence problem hyperbolic smoothing used - f_QR = (1+fdqr0)*qp0_t; - Qz0 = Qjei+Qjci+Qf; - Qz_nom = 1+Qz0/f_QR; - fQz = 0.5*(Qz_nom+sqrt(Qz_nom*Qz_nom+0.01)); - rbi = rbi0_t/fQz; - // Consideration of emitter current crowding - if( ibei > 0.0) begin - ETA = rbi*ibei*fgeo/VT; - if(ETA < 1.0e-6) begin - rbi = rbi*(1.0-0.5*ETA); - end else begin - rbi = rbi*ln(1.0+ETA)/ETA; - end - end - // Consideration of peripheral charge - if(Qf > 0.0) begin - rbi = rbi*(Qjei+Qf*fqi)/(Qjei+Qf); - end - end else begin - rbi = 0.0; - end - - //Base currents across peripheral b-e junction - `HICDIO(ibeps,ibeps_t,mbep,Vbpei,ibep) - `HICDIO(ireps,ireps_t,mrep,Vbpei,irep) - - //Peripheral b-e junction capacitance and charge - `QJMODF(cjep0_t,vdep_t,zep,ajep_t,Vbpei,Cjep,Qjep) - - //Tunneling current - if (ibets > 0 && (Vbpei <0.0 || Vbiei < 0.0)) begin : HICTUN - if(tunode==1 && cjep0_t > 0.0 && vdep_t >0.0) begin - pocce = exp((1-1/zep)*ln(Cjep/cjep0_t)); - czz = -(Vbpei/vdep_t)*ibets_t*pocce; - ibet = czz*exp(-abet_t/pocce); - end else if (tunode==0 && cjei0_t > 0.0 && vdei_t >0.0) begin - pocce = exp((1-1/zei)*ln(Cjei/cjei0_t)); - czz = -(Vbiei/vdei_t)*ibets_t*pocce; - ibet = czz*exp(-abet_t/pocce); - end else begin - ibet = 0.0; - end - end else begin - ibet = 0.0; - end - - - //Depletion capacitance and charge at peripheral b-c junction (bp,ci) - `HICJQ(cjcx02_t,vdcx_t,zcx,vptcx_t,Vbpci,CjCx_ii,qjcx0_t_ii) - - //Base currents across peripheral b-c junction (bp,ci) - `HICDIO(ibcxs,ibcxs_t,mbcx,Vbpci,ijbcx) - - //Depletion capacitance and charge at external b-c junction (b,ci) - `HICJQ(cjcx01_t,vdcx_t,zcx,vptcx_t,Vbci,CjCx_i,qjcx0_t_i) - - //Depletion substrate capacitance and charge at s-c junction (si,ci) - `HICJQ(cjs0_t,vds_t,zs,vpts_t,Vsici,Cjs,Qjs) - /* Peripheral substrate capacitance and charge at s-c junction (s,c) - * Bias dependent only if vdsp > 0 - */ - if (vdsp > 0) begin - `HICJQ(cscp0_t,vdsp_t,zsp,vptsp_t,Vsc,Cscp,Qscp) - end else begin - // Constant, temperature independent capacitance - Cscp = cscp0; - Qscp = cscp0*Vsc; - end - - //Parasitic substrate transistor transfer current and diffusion charge - if(itss > 0.0) begin : Sub_Transfer - HSUM = msf*VT; - HSa = limexp(Vbpci/HSUM); - HSb = limexp(Vsici/HSUM); - HSI_Tsu = itss_t*(HSa-HSb); - if(tsf > 0.0) begin - Qdsu = tsf_t*itss_t*HSa; - end else begin - Qdsu = 0.0; - end - end else begin - HSI_Tsu = 0.0; - Qdsu = 0.0; - end - - // Current gain computation for correlated noise implementation - if (ibei > 0.0) begin - betadc=it/ibei; - end else begin - betadc=0.0; - end - - //Diode current for s-c junction (si,ci) - `HICDIO(iscs,iscs_t,msc,Vsici,ijsc) - - //Self-heating calculation - if (flsh == 1 && rth >= `MIN_R) begin - pterm = Vciei*it + (vdci_t-Vbici)*iavl; - end else if (flsh == 2 && rth >= `MIN_R) begin - pterm = Vciei*it + (vdci_t-Vbici)*iavl + ibei*Vbiei + ibci*Vbici + ibep*Vbpei + ijbcx*Vbpci + ijsc*Vsici; - if (rbi >= `MIN_R) begin - pterm = pterm + V(br_bpbi_i)*V(br_bpbi_i)/rbi; - end - if (re_t >= `MIN_R) begin - pterm = pterm + V(br_eie_i)*V(br_eie_i)/re_t; - end - if (rcx_t >= `MIN_R) begin - pterm = pterm + V(br_cic_i)*V(br_cic_i)/rcx_t; - end - if (rbx_t >= `MIN_R) begin - pterm = pterm + V(br_bbp_i)*V(br_bbp_i)/rbx_t; - end - end - - Itxf = itf; - Qdeix = Qdei; - // Excess Phase calculation - - if ((flnqs != 0 || flcomp == 0.0 || flcomp == 2.1) && Tf != 0 && (alit > 0 || alqf > 0)) begin - Vxf1 = V(br_bxf1); - Vxf2 = V(br_bxf2); - - Ixf1 = (Vxf2-itf)/Tf*t0; - Ixf2 = (Vxf2-Vxf1)/Tf*t0; - Qxf1 = alit*Vxf1*t0; - Qxf2 = alit*Vxf2/3*t0; - Itxf = Vxf2; - - Vxf = V(br_bxf); //for RC nw - fact = t0/Tf; //for RC nw - Ixf = (Vxf - Qdei)*fact; //for RC nw - Qxf = alqf*Vxf*t0; //for RC nw - Qdeix = Vxf; //for RC nw - end else begin - Ixf1 = V(br_bxf1); - Ixf2 = V(br_bxf2); - Qxf1 = 0; - Qxf2 = 0; - - Ixf = V(br_bxf); - Qxf = 0; - end - -end //of Model_evaluation - -begin : Load_sources - - I(br_biei) <+ `Gmin*V(br_biei); - I(br_bici) <+ `Gmin*V(br_bici); - I(br_ciei) <+ `Gmin*V(br_ciei); - - I(br_bci) <+ ddt(type*qjcx0_t_i); - I(br_bci) <+ ddt(cbcpar1*V(br_bci)); - I(br_bpci) <+ ddt(cbcpar2*V(br_bpci)); - if (rbx >= `MIN_R) begin - I(br_bbp_i) <+ V(br_bbp_i)/rbx_t; - end else begin - V(br_bbp_v) <+ 0.0; - end - if(rbi0 >= `MIN_R) begin - I(br_bpbi_i) <+ V(br_bpbi_i)/rbi; - I(br_bpbi_i) <+ ddt(qrbi); - end else begin - V(br_bpbi_v) <+ 0.0; - end - if (tunode==1.0) begin - I(br_bpei) <+ -type*ibet; - end else begin - I(br_biei) <+ -type*ibet; - end - I(br_bpei) <+ type*ibep; - I(br_bpei) <+ type*irep; - I(br_bpei) <+ ddt(type*Qjep); - I(br_biei) <+ type*ibei; - I(br_biei) <+ type*irei; - I(br_biei) <+ type*ibh_rec; - I(br_biei) <+ ddt(type*(Qdeix+Qjei)); - I(br_bpsi) <+ type*HSI_Tsu; - I(br_bpci) <+ type*ijbcx; - I(br_bpci) <+ ddt(type*(qjcx0_t_ii+Qdsu)); - I(br_be) <+ ddt(cbepar1*V(br_be)); - I(br_bpe) <+ ddt(cbepar2*V(br_bpe)); - I(br_bici) <+ type*(ibci-iavl); - I(br_bici) <+ ddt(type*(Qdci+Qjci)); - I(br_sici) <+ type*ijsc; - I(br_sici) <+ ddt(type*Qjs); - I(br_sc) <+ ddt(type*Qscp); - I(br_ciei) <+ type*Itxf; - I(br_eici) <+ type*itr; - if (rcx >= `MIN_R) begin - I(br_cic_i) <+ V(br_cic_i)/rcx_t; - end else begin -// V(br_cic_v) <+ 0.0; - I(br_cic_i) <+ V(br_cic_i)/`MIN_R; - end - if (re >= `MIN_R) begin - I(br_eie_i) <+ V(br_eie_i)/re_t; - end else begin -// V(br_eie_v) <+ 0.0; - I(br_eie_i) <+ V(br_eie_i)/`MIN_R; - end - if(rsu >= `MIN_R) begin - I(br_sis_i) <+ V(br_sis_i)/rsu; - I(br_sis_i) <+ ddt(csu*V(br_sis_i)); - end else begin -// V(br_sis_v) <+ 0.0; - I(br_sis_i) <+ V(br_sis_i)/`MIN_R; - end - - // Following code is an intermediate solution (if branch contribution is not supported): - // ****************************************** - if(flsh == 0 || rth < `MIN_R) begin - I(br_sht) <+ V(br_sht)/`MIN_R; - end else begin - I(br_sht) <+ V(br_sht)/rth_t-pterm; - I(br_sht) <+ ddt(cth*V(br_sht)); - end - - // ****************************************** - - // For simulators having no problem with V(br_sht) <+ 0.0 - // with external thermal node, following code may be used. - // Note that external thermal node should remain accessible - // even without self-heating. - // ******************************************** - //if(flsh == 0 || rth < `MIN_R) begin - // V(br_sht) <+ 0.0; - //end else begin - // I(br_sht) <+ V(br_sht)/rth_t-pterm; - // I(br_sht) <+ ddt(cth*V(br_sht)); - //end - // ******************************************** - - // NQS effect - I(br_bxf1) <+ Ixf1; - I(br_cxf1) <+ ddt(Qxf1); - I(br_bxf2) <+ Ixf2; - I(br_cxf2) <+ ddt(Qxf2); - - I(br_bxf) <+ Ixf; //for RC nw - I(br_cxf) <+ ddt(Qxf); //for RC nw - -end //of Load_sources - - -`NOISE begin : Noise_sources - - //Thermal noise - fourkt = 4.0 * `P_K * Tdev; - if(rbx >= `MIN_R) begin - I(br_bbp_i) <+ white_noise(fourkt/rbx_t, "rbx"); - end - if(rbi0 >= `MIN_R) begin - I(br_bpbi_i) <+ white_noise(fourkt/rbi, "rbi"); - end - if(rcx >= `MIN_R) begin - I(br_cic_i) <+ white_noise(fourkt/rcx_t, "rcx"); - end - if(re >= `MIN_R) begin - I(br_eie_i) <+ white_noise(fourkt/re_t, "re"); - end - if(rsu >= `MIN_R) begin - I(br_sis_i) <+ white_noise(fourkt/rsu, "rsu"); - end - - //Flicker noise : Fully correlated between the perimeter and internal base-node - flicker_Pwr = kf*pow(abs(ibei+ibep),af); - if (cfbe == -1) begin - I(br_biei) <+ flicker_noise(flicker_Pwr,1.0, "flicker"); - end else begin - I(br_bpei) <+ flicker_noise(flicker_Pwr,1.0, "flicker"); - end - - if (re >= `MIN_R) begin - i_re = V(br_eie_i)/re_t; - flicker_Pwr = kfre*pow(abs(i_re),afre); - I(br_eie_i) <+ flicker_noise(flicker_Pwr,1.0, "flicker_re"); - end - - //Shot noise - - twoq = 2.0 * `P_Q; - I(br_cibi) <+ white_noise(twoq*iavl, "iavl"); - - I(br_bici) <+ white_noise(twoq*abs(ibci), "ibci"); - - I(br_bpei) <+ white_noise(twoq*abs(ibep), "ibep"); - - I(br_bpci) <+ white_noise(twoq*abs(ijbcx), "ijbcx"); - - I(br_sici) <+ white_noise(twoq*abs(ijsc), "ijsc"); - - // Code section for correlated noise - - if ( flcono==1 && (alit > 0 && alqf > 0)) begin - - // parameter definition - n_w = 1; - n_1 = Tf*alit; - sqrt_n2 = betadc*(2*alqf-alit*alit); - - if (sqrt_n2 > 0.0) begin - n_2 = Tf*sqrt(sqrt_n2); - end else begin - n_2 = 0; - end - - - // realization of modified base shot noise source I1(bi,ei) - I(b_n1) <+ white_noise(2*`P_Q*abs(ibei),"ibei"); - I(b_n1) <+ -V(b_n1); - I(bi,ei) <+ V(b_n1)+n_2/n_w*ddt(n_w*V(b_n1)); - - // realization of controlled base noise source I2(bi,ei) - - I(bi,ei) <+ n_1/n_w*ddt(n_w*V(b_n2)); - - // realization of modified collector shot noise source I(ci,ei) (uncontrolled) - - I(b_n2) <+ white_noise(2*`P_Q*abs(it),"it"); - I(b_n2) <+ -V(b_n2); - I(ci,ei) <+ V(b_n2); - - - // end "Correlated noise in BJT" - - - end else begin - - // Applying the base & collector shot noise sources to appropriate branches - - I(br_ciei) <+ white_noise(twoq*abs(it), "it"); - I(br_biei) <+ white_noise(twoq*abs(ibei), "ibei"); - I(b_n1) <+ V(b_n1); - I(b_n2) <+ V(b_n2); - - end // end of flcono section - -end //of Noise_sources - -// Operating point calculations -`ifdef CALC_OP - `ifdef OP_STATIC - if (analysis("static")) begin: OPERATING_POINT - `else - begin: OPERATING_POINT - `endif - real gPIi, gPIx, gBt; - real gMUi, gMUx, gAVL; - real gOi; - real CdEi_ddx, CdCi_ddx, CdS_ddx; - - IB = I(); - IC = I(); - IS = I(); - IAVL = type*iavl; - - VBE = V(b,e); - VBC = V(b,c); - VCE = V(c,e); - VSC = V(s,c); - - if (IB != 0) begin - BETADC = IC/IB; - end else begin - BETADC = 0; - end - - GMi = type*ddx(it,V(bi))+`Gmin; - GMS = -type*ddx(HSI_Tsu,V(ci))+`Gmin; - - gPIi = type*ddx(ibei,V(bi))+type*ddx(irei,V(bi))+`Gmin; - gPIx = type*ddx(ibep,V(bp))+type*ddx(irep,V(bp))+`Gmin; - - if (tunode == 1) begin - gBt = type*ddx(ibet,V(bp)); - - RPIi = 1.0/gPIi; - RPIx = 1.0/(gPIx-gBt); - end else begin - gBt = type*ddx(ibet,V(bi)); - - RPIi = 1.0/(gPIi-gBt); - RPIx = 1.0/gPIx; - end - - gMUi = -type*ddx(ibci, V(ci))+`Gmin; - gMUx = -type*ddx(ijbcx,V(ci))+`Gmin; - gAVL = type*ddx(iavl, V(ci))+`Gmin; - - RMUi = 1/(gMUi-gAVL); - RMUx = 1/gMUx; - - gOi = type*ddx(it,V(ci)); - ROi = 1/(gOi+gAVL); - - CdEi_ddx = -type*ddx(Qdei,V(ei)); - CdCi_ddx = -type*ddx(Qdci,V(ci)); - - CPIi = Cjei+CdEi_ddx; - CPIx = Cjep+cbepar; - - CdS_ddx = -type*ddx(Qdsu,V(ci)); - - CMUi = Cjci+CdCi_ddx; - CMUx = CjCx_i+CjCx_ii+cbcpar+CdS_ddx; - - CCS = Cjs+Cscp; - - rb = rbi+rbx_t; - - if (gPIi+gPIx > 0.0) begin - BETAAC = GMi/(gPIi+gPIx); - end else begin - BETAAC = 0.0; - end - - CRBI = Crbi; - TF = Tf; - - FT = GMi/(2*`M_PI*(CPIi+CPIx+CMUi+CMUx+(rcx_t+re_t+(re_t+rb)/BETAAC)*GMi*(CMUi+CMUx))); - - TK = Tdev; - DTSH = V(br_sht); - end -`endif - -end //analog -endmodule