Revert "verilog-a files in adms removed"

This reverts commit 9c5a2d0810.
This commit is contained in:
Holger Vogt 2018-05-01 11:39:29 +02:00
parent f31f1f6471
commit 241be03cfa
40 changed files with 19853 additions and 0 deletions

View File

@ -0,0 +1,42 @@
# -*- makefile -*-
# (compile "make -i -f my.mak to")
CFLAGS=-I ../../../../../include -I ../../../../../../../w32/src/include
SRCS = \
r2_cmcacld.c r2_cmc.analogfunction.c r2_cmcask.c r2_cmc.c r2_cmcdel.c r2_cmcdest.c r2_cmcguesstopology.c r2_cmcinit.c r2_cmcload.c r2_cmcmask.c r2_cmcmdel.c r2_cmcmpar.c r2_cmcnoise.c r2_cmcpar.c r2_cmcpzld.c r2_cmcsetup.c r2_cmctemp.c r2_cmctrunc.c
to : $(SRCS:%.c=%.o)
scripts = \
-x \
-e ../../admst/adms.implicit.xml \
-e ../../admst/ngspiceVersion.xml \
-e ../../admst/analogfunction.xml \
-e ../../admst/ngspiceMODULEitf.h.xml \
-e ../../admst/ngspiceMODULEinit.c.xml \
-e ../../admst/ngspiceMODULEinit.h.xml \
-e ../../admst/ngspiceMODULEext.h.xml \
-e ../../admst/ngspiceMODULEdefs.h.xml \
-e ../../admst/ngspiceMODULEask.c.xml \
-e ../../admst/ngspiceMODULEmask.c.xml \
-e ../../admst/ngspiceMODULEpar.c.xml \
-e ../../admst/ngspiceMODULEmpar.c.xml \
-e ../../admst/ngspiceMODULEload.c.xml \
-e ../../admst/ngspiceMODULEacld.c.xml \
-e ../../admst/ngspiceMODULEpzld.c.xml \
-e ../../admst/ngspiceMODULEtemp.c.xml \
-e ../../admst/ngspiceMODULEtrunc.c.xml \
-e ../../admst/ngspiceMODULEsetup.c.xml \
-e ../../admst/ngspiceMODULEdel.c.xml \
-e ../../admst/ngspiceMODULEmdel.c.xml \
-e ../../admst/ngspiceMODULEdest.c.xml \
-e ../../admst/ngspiceMODULEnoise.c.xml \
-e ../../admst/ngspiceMODULEguesstopology.c.xml \
-e ../../admst/ngspiceMODULE.hxx.xml \
-e ../../admst/ngspiceMODULE.c.xml
$(SRCS) : do
do : r2_cmc.va
../../../../../../adms/ADMS/admsXml/admsXml $(scripts) $<

View File

@ -0,0 +1,26 @@
`include "constants.vams"
`include "disciplines.vams"
module r2_cmc(d, s);
inout d, s;
electrical d, s;
real Taa, Txx;
analog begin
Taa = 0;
// Txx = 0;
Txx = Taa;
Taa = V(d,s);
Taa = Txx;
Taa = 0;
I(d,s) <+ Taa;
end
endmodule

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,117 @@
// ********************************************************
// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 *****/
// * BSIM Common Multi-Gate Model Equations (Verilog-A)
// ********************************************************
//
// ********************************************************
// * Copyright 2016 Regents of the University of California.
// * All rights reserved.
// *
// * Project Director: Prof. Chenming Hu.
// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal
// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
// * Ali Niknejad, Chenming Hu
// ********************************************************
// ********************************************************
// * NONDISCLOSURE STATEMENT
// Software is distributed as is, completely without warranty or service
// support. The University of California and its employees are not liable
// for the condition or performance of the software.
// The University of California owns the copyright and grants users a perpetual,
// irrevocable, worldwide, non-exclusive, royalty-free license with
// respect to the software as set forth below.
// The University of California hereby disclaims all implied warranties.
// The University of California 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 University of California code
// itself but may charge for additions, extensions, or support.
// 2. In any product based on the software, the users agree to acknowledge
// the University of California that developed the software. This
// acknowledgment shall appear in the product documentation.
// 3. The users agree to obey all U.S. Government restrictions governing
// redistribution or export of the software.
// 4. The users agree to reproduce any copyright notice which appears on
// the software on any copy or modification of such made available
// to others
// Agreed to on __Jan 01, 2016__________________
// By: ___University of California, Berkeley____
// ___Chenming Hu_____________________
// ___Professor in Graduate School _______
// ********************************************************
`include "constants.vams"
`include "disciplines.vams"
/**************************************************************/
/* SHMOD is a model parameter */
/* SHMOD = 1 : Self-heating turned on */
/* SHMOD = 0 : Self-heating turned off */
/* */
/* RDSMOD is a model parameter */
/* RDSMOD = 1 : External source/drain resistance model */
/* RDSMOD = 0 : Internal source/drain resistance model */
/* RDSMOD = 2 : Internal Bias Dependent and Bias Independent part of source/drain resistance */
/* */
/* NQSMOD is a model parameter */
/* NQSMOD = 1 : NQS Resistance / gi node turned on */
/* NQSMOD = 0 : NQS Resistance / gi node turned off */
/* */
/* RGATEMOD is a model parameter */
/* RGATEMOD = 1 : Gate Resistance / ge node turned on */
/* RGATEMOD = 0 : Gate Resistance / ge node turned off */
/**************************************************************/
//
// In Verilog-A the number of internal nodes cannot be controlled by
// a model parameter. Therefore we use `define statements
// to control it. Comment the following lines whenever
// possible for best computational efficiency.
`define __OPINFO__
`define __DEBUG__
`define __SHMOD__
`define __RDSMOD__
//`define __NQSMOD1__
//`define __NQSMOD2__
`define __RGATEMOD__
`define __TNOIMOD1__ //Correlated Thermal Noise Switch
`include "common_defs.include"
`include "bsimcmg_cfringe.include"
module bsimcmg(d, g, s, e, t);
inout g, d, s, e, t;
electrical g, d, s, e;
electrical si, di;
`ifdef __NQSMOD1__
electrical gi;
`endif
`ifdef __NQSMOD2__
electrical q;
`endif
`ifdef __RGATEMOD__
electrical ge;
`endif
`ifdef __SHMOD__
thermal t;
branch (t) rth_branch;
branch (t) ith_branch;
`else
thermal t;
`endif
// Internal node controlled by Correlated Thermal Noise Switch
`ifdef __TNOIMOD1__
electrical N;
`endif
`include "bsimcmg_body.include"
endmodule

View File

@ -0,0 +1,756 @@
// ********************************************************
// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/
// * BSIM Common Multi-Gate Model Equations (Verilog-A)
// ********************************************************
//
// ********************************************************
// * Copyright 2016 Regents of the University of California.
// * All rights reserved.
// *
// * Project Director: Prof. Chenming Hu.
// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal
// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
// * Ali Niknejad, Chenming Hu
// ********************************************************
// ********************************************************
// * NONDISCLOSURE STATEMENT
// Software is distributed as is, completely without warranty or service
// support. The University of California and its employees are not liable
// for the condition or performance of the software.
// The University of California owns the copyright and grants users a perpetual,
// irrevocable, worldwide, non-exclusive, royalty-free license with
// respect to the software as set forth below.
// The University of California hereby disclaims all implied warranties.
// The University of California 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 University of California code
// itself but may charge for additions, extensions, or support.
// 2. In any product based on the software, the users agree to acknowledge
// the University of California that developed the software. This
// acknowledgment shall appear in the product documentation.
// 3. The users agree to obey all U.S. Government restrictions governing
// redistribution or export of the software.
// 4. The users agree to reproduce any copyright notice which appears on
// the software on any copy or modification of such made available
// to others
// Agreed to on __Jan 01, 2016_________________
// By: ___University of California, Berkeley____
// ___Chenming Hu_____________________
// ___Professor in Graduate School _______
// ********************************************************
`MPRnb( LNBODY ,0.0 ,"m^-2" ,"" )
`MPRnb( NNBODY ,0.0 ,"m^-2" ,"" )
`MPRnb( PNBODY ,0.0 ,"m^-1" ,"" )
`MPRnb( LPHIG ,0.0 ,"m*eV" ,"" )
`MPRnb( NPHIG ,0.0 ,"m*eV" ,"" )
`MPRnb( PPHIG ,0.0 ,"(m^2)*eV" ,"" )
`MPRnb( LNGATE ,0.0 ,"m^-2" ,"" )
`MPRnb( NNGATE ,0.0 ,"m^-2" ,"" )
`MPRnb( PNGATE ,0.0 ,"m^-1" ,"" )
`MPRnb( LCIT ,0.0 ,"F/m" ,"" )
`MPRnb( NCIT ,0.0 ,"F/m" ,"" )
`MPRnb( PCIT ,0.0 ,"F" ,"" )
`MPRnb( LCITR ,LCIT ,"" ,"" )
`MPRnb( NCITR ,NCIT ,"" ,"" )
`MPRnb( PCITR ,PCIT ,"" ,"" )
`MPRnb( LCDSC ,0.0 ,"F/m" ,"" )
`MPRnb( NCDSC ,0.0 ,"F/m" ,"" )
`MPRnb( PCDSC ,0.0 ,"F" ,"" )
`MPRnb( LCDSCD ,0.0 ,"F/m" ,"" )
`MPRnb( NCDSCD ,0.0 ,"F/m" ,"" )
`MPRnb( PCDSCD ,0.0 ,"F" ,"" )
`MPRnb( LCDSCDR ,LCDSCD ,"F/m" ,"" )
`MPRnb( NCDSCDR ,NCDSCD ,"F/m" ,"" )
`MPRnb( PCDSCDR ,PCDSCD ,"F" ,"" )
`MPRnb( LDVT0 ,0.0 ,"" ,"" )
`MPRnb( NDVT0 ,0.0 ,"" ,"" )
`MPRnb( PDVT0 ,0.0 ,"" ,"" )
`MPRnb( LDVT1 ,0.0 ,"" ,"" )
`MPRnb( NDVT1 ,0.0 ,"" ,"" )
`MPRnb( PDVT1 ,0.0 ,"" ,"" )
`MPRnb( LDVT1SS ,LDVT1 ,"" ,"" )
`MPRnb( NDVT1SS ,NDVT1 ,"" ,"" )
`MPRnb( PDVT1SS ,PDVT1 ,"" ,"" )
`MPRnb( LPHIN ,0.0 ,"m*V" ,"" )
`MPRnb( NPHIN ,0.0 ,"m*V" ,"" )
`MPRnb( PPHIN ,0.0 ,"(m^2)*V" ,"" )
`MPRnb( LETA0 ,0.0 ,"" ,"" )
`MPRnb( NETA0 ,0.0 ,"" ,"" )
`MPRnb( PETA0 ,0.0 ,"" ,"" )
`MPRnb( LETA0R ,LETA0 ,"" ,"" )
`MPRnb( NETA0R ,NETA0 ,"" ,"" )
`MPRnb( PETA0R ,PETA0 ,"" ,"" )
`MPRnb( LDSUB ,0.0 ,"" ,"" )
`MPRnb( NDSUB ,0.0 ,"" ,"" )
`MPRnb( PDSUB ,0.0 ,"" ,"" )
`MPRnb( LK1RSCE ,0.0 ,"m*V^(1/2)" ,"" )
`MPRnb( NK1RSCE ,0.0 ,"m*V^(1/2)" ,"" )
`MPRnb( PK1RSCE ,0.0 ,"(m^2)*V^(1/2)" ,"" )
`MPRnb( LLPE0 ,0.0 ,"m^2" ,"" )
`MPRnb( NLPE0 ,0.0 ,"m^2" ,"" )
`MPRnb( PLPE0 ,0.0 ,"m^3" ,"" )
`MPRnb( LDVTSHIFT ,0.0 ,"m*V" ,"" )
`MPRnb( NDVTSHIFT ,0.0 ,"m*V" ,"" )
`MPRnb( PDVTSHIFT ,0.0 ,"(m^2)*V" ,"" )
`MPRnb( LDVTSHIFTR ,LDVTSHIFT ,"" ,"" )
`MPRnb( NDVTSHIFTR ,NDVTSHIFT ,"" ,"" )
`MPRnb( PDVTSHIFTR ,PDVTSHIFT ,"" ,"" )
`MPRnb( LPHIBE ,0.0 ,"m*V" ,"" )
`MPRnb( NPHIBE ,0.0 ,"m*V" ,"" )
`MPRnb( PPHIBE ,0.0 ,"(m^2)*V" ,"" )
`MPRnb( LK0 ,0.0 ,"m*V" ,"" )
`MPRnb( NK0 ,0.0 ,"m*V" ,"" )
`MPRnb( PK0 ,0.0 ,"(m^2)*V" ,"" )
`MPRnb( LK01 ,0.0 ,"(m*V)/K" ,"" )
`MPRnb( NK01 ,0.0 ,"(m*V)/K" ,"" )
`MPRnb( PK01 ,0.0 ,"(m^2*V)/K" ,"" )
`MPRnb( LK0SI ,0.0 ,"" ,"" )
`MPRnb( NK0SI ,0.0 ,"" ,"" )
`MPRnb( PK0SI ,0.0 ,"" ,"" )
`MPRnb( LK0SI1 ,0.0 ,"m/K" ,"" )
`MPRnb( NK0SI1 ,0.0 ,"m/K" ,"" )
`MPRnb( PK0SI1 ,0.0 ,"(m^2)/K" ,"" )
`MPRnb( LK1 ,0.0 ,"m*V^(1/2)" ,"" )
`MPRnb( NK1 ,0.0 ,"m*V^(1/2)" ,"" )
`MPRnb( PK1 ,0.0 ,"(m^2)*V^(1/2)" ,"" )
`MPRnb( LK11 ,0.0 ,"(m*V^(-1/2))/K" ,"" )
`MPRnb( NK11 ,0.0 ,"(m*V^(-1/2))/K" ,"" )
`MPRnb( PK11 ,0.0 ,"(m^2*V^(-1/2))/K" ,"" )
`MPRnb( LK2SI ,LK0SI ,"" ,"" )
`MPRnb( NK2SI ,NK0SI ,"" ,"" )
`MPRnb( PK2SI ,PK0SI ,"" ,"" )
`MPRnb( LK2SI1 ,LK0SI1 ,"" ,"" )
`MPRnb( NK2SI1 ,NK0SI1 ,"" ,"" )
`MPRnb( PK2SI1 ,PK0SI1 ,"" ,"" )
`MPRnb( LK0SISAT ,0.0 ,"" ,"" )
`MPRnb( NK0SISAT ,0.0 ,"" ,"" )
`MPRnb( PK0SISAT ,0.0 ,"" ,"" )
`MPRnb( LK0SISAT1 ,0.0 ,"" ,"" )
`MPRnb( NK0SISAT1 ,0.0 ,"" ,"" )
`MPRnb( PK0SISAT1 ,0.0 ,"" ,"" )
`MPRnb( LK2SISAT ,LK0SISAT ,"" ,"" )
`MPRnb( NK2SISAT ,NK0SISAT ,"" ,"" )
`MPRnb( PK2SISAT ,PK0SISAT ,"" ,"" )
`MPRnb( LK2SISAT1 ,LK0SISAT1 ,"" ,"" )
`MPRnb( NK2SISAT1 ,NK0SISAT1 ,"" ,"" )
`MPRnb( PK2SISAT1 ,PK0SISAT1 ,"" ,"" )
`MPRnb( LK2SAT ,0.0 ,"" ,"" )
`MPRnb( NK2SAT ,0.0 ,"" ,"" )
`MPRnb( PK2SAT ,0.0 ,"" ,"" )
`MPRnb( LK2SAT1 ,0.0 ,"" ,"" )
`MPRnb( NK2SAT1 ,0.0 ,"" ,"" )
`MPRnb( PK2SAT1 ,0.0 ,"" ,"" )
`MPRnb( LK2 ,0.0 ,"" ,"" )
`MPRnb( NK2 ,0.0 ,"" ,"" )
`MPRnb( PK2 ,0.0 ,"" ,"" )
`MPRnb( LK21 ,0.0 ,"" ,"" )
`MPRnb( NK21 ,0.0 ,"" ,"" )
`MPRnb( PK21 ,0.0 ,"" ,"" )
`MPRnb( LDVTB ,0.0 ,"" ,"" )
`MPRnb( NDVTB ,0.0 ,"" ,"" )
`MPRnb( PDVTB ,0.0 ,"" ,"" )
`MPRnb( LLPEB ,0.0 ,"" ,"" )
`MPRnb( NLPEB ,0.0 ,"" ,"" )
`MPRnb( PLPEB ,0.0 ,"" ,"" )
`MPRnb( LQMFACTOR ,0.0 ,"" ,"" )
`MPRnb( NQMFACTOR ,0.0 ,"" ,"" )
`MPRnb( PQMFACTOR ,0.0 ,"" ,"" )
`MPRnb( LQMTCENCV ,0.0 ,"" ,"" )
`MPRnb( NQMTCENCV ,0.0 ,"" ,"" )
`MPRnb( PQMTCENCV ,0.0 ,"" ,"" )
`MPRnb( LQMTCENCVA ,0.0 ,"" ,"" )
`MPRnb( NQMTCENCVA ,0.0 ,"" ,"" )
`MPRnb( PQMTCENCVA ,0.0 ,"" ,"" )
`MPRnb( LVSAT ,0.0 ,"(m^2)/s" ,"" )
`MPRnb( NVSAT ,0.0 ,"(m^2)/s" ,"" )
`MPRnb( PVSAT ,0.0 ,"(m^3)/s" ,"" )
`MPRnb( LVSATR ,LVSAT ,"" ,"" )
`MPRnb( NVSATR ,NVSAT ,"" ,"" )
`MPRnb( PVSATR ,PVSAT ,"" ,"" )
`MPRnb( LVSAT1 ,LVSAT ,"" ,"" )
`MPRnb( NVSAT1 ,NVSAT ,"" ,"" )
`MPRnb( PVSAT1 ,PVSAT ,"" ,"" )
`MPRnb( LVSAT1R ,LVSAT1 ,"(m^2)/s" ,"" )
`MPRnb( NVSAT1R ,NVSAT1 ,"(m^2)/s" ,"" )
`MPRnb( PVSAT1R ,PVSAT1 ,"(m^3)/s" ,"" )
`MPRnb( LPSAT ,0.0 ,"" ,"" )
`MPRnb( NPSAT ,0.0 ,"" ,"" )
`MPRnb( PPSAT ,0.0 ,"" ,"" )
`MPRnb( LDELTAVSAT ,0.0 ,"" ,"" )
`MPRnb( NDELTAVSAT ,0.0 ,"" ,"" )
`MPRnb( PDELTAVSAT ,0.0 ,"" ,"" )
`MPRnb( LKSATIV ,0.0 ,"" ,"" )
`MPRnb( NKSATIV ,0.0 ,"" ,"" )
`MPRnb( PKSATIV ,0.0 ,"" ,"" )
`MPRnb( LKSATIVR ,LKSATIV ,"" ,"" )
`MPRnb( NKSATIVR ,NKSATIV ,"" ,"" )
`MPRnb( PKSATIVR ,PKSATIV ,"" ,"" )
`MPRnb( LVSATCV ,0.0 ,"(m^2)/s" ,"" )
`MPRnb( NVSATCV ,0.0 ,"(m^2)/s" ,"" )
`MPRnb( PVSATCV ,0.0 ,"(m^3)/s" ,"" )
`MPRnb( LPSATCV ,0.0 ,"" ,"" )
`MPRnb( NPSATCV ,0.0 ,"" ,"" )
`MPRnb( PPSATCV ,0.0 ,"" ,"" )
`MPRnb( LDELTAVSATCV ,0.0 ,"" ,"" )
`MPRnb( NDELTAVSATCV ,0.0 ,"" ,"" )
`MPRnb( PDELTAVSATCV ,0.0 ,"" ,"" )
`MPRnb( LMEXP ,0.0 ,"" ,"" )
`MPRnb( NMEXP ,0.0 ,"" ,"" )
`MPRnb( PMEXP ,0.0 ,"" ,"" )
`MPRnb( LMEXPR ,LMEXP ,"" ,"" )
`MPRnb( NMEXPR ,NMEXP ,"" ,"" )
`MPRnb( PMEXPR ,PMEXP ,"" ,"" )
`MPRnb( LPTWG ,0.0 ,"m*(V^-2)" ,"" )
`MPRnb( NPTWG ,0.0 ,"m*(V^-2)" ,"" )
`MPRnb( PPTWG ,0.0 ,"m^2*(V^-2)" ,"" )
`MPRnb( LPTWGR ,LPTWG ,"m*(V^-2)" ,"" )
`MPRnb( NPTWGR ,NPTWG ,"m*(V^-2)" ,"" )
`MPRnb( PPTWGR ,PPTWG ,"m^2*(V^-2)" ,"" )
`MPRnb( LU0 ,0.0 ,"(m^3)/V*s" ,"" )
`MPRnb( NU0 ,0.0 ,"(m^3)/V*s" ,"" )
`MPRnb( PU0 ,0.0 ,"(m^4)/V*s" ,"" )
`MPRnb( LU0R ,LU0 ,"" ,"" )
`MPRnb( NU0R ,NU0 ,"" ,"" )
`MPRnb( PU0R ,PU0 ,"" ,"" )
`MPRnb( LETAMOB ,0.0 ,"" ,"" )
`MPRnb( NETAMOB ,0.0 ,"" ,"" )
`MPRnb( PETAMOB ,0.0 ,"" ,"" )
`MPRnb( LUP ,0.0 ,"m*(um^LPA)" ,"" )
`MPRnb( NUP ,0.0 ,"m*(um^LPA)" ,"" )
`MPRnb( PUP ,0.0 ,"m^2*(um^LPA)" ,"" )
`MPRnb( LUPR ,LUP ,"" ,"" )
`MPRnb( NUPR ,NUP ,"" ,"" )
`MPRnb( PUPR ,PUP ,"" ,"" )
`MPRnb( LUA ,0.0 ,"m*((cm/MV)^EU)" ,"" )
`MPRnb( NUA ,0.0 ,"m*((cm/MV)^EU)" ,"" )
`MPRnb( PUA ,0.0 ,"m^2*((cm/MV)^EU)" ,"" )
`MPRnb( LUAR ,LUA ,"" ,"" )
`MPRnb( NUAR ,NUA ,"" ,"" )
`MPRnb( PUAR ,PUA ,"" ,"" )
`MPRnb( LUC ,0.0 ,"" ,"" )
`MPRnb( NUC ,0.0 ,"" ,"" )
`MPRnb( PUC ,0.0 ,"" ,"" )
`MPRnb( LUCR ,LUC ,"" ,"" )
`MPRnb( NUCR ,NUC ,"" ,"" )
`MPRnb( PUCR ,PUC ,"" ,"" )
`MPRnb( LEU ,0.0 ,"m*(cm/MV)" ,"" )
`MPRnb( NEU ,0.0 ,"m*(cm/MV)" ,"" )
`MPRnb( PEU ,0.0 ,"m^2*(cm/MV)" ,"" )
`MPRnb( LEUR ,LEU ,"" ,"" )
`MPRnb( NEUR ,NEU ,"" ,"" )
`MPRnb( PEUR ,PEU ,"" ,"" )
`MPRnb( LUD ,0.0 ,"m*(cm/MV)" ,"" )
`MPRnb( NUD ,0.0 ,"m*(cm/MV)" ,"" )
`MPRnb( PUD ,0.0 ,"m^2*(cm/MV)" ,"" )
`MPRnb( LUDR ,LUD ,"" ,"" )
`MPRnb( NUDR ,NUD ,"" ,"" )
`MPRnb( PUDR ,PUD ,"" ,"" )
`MPRnb( LUCS ,0.0 ,"" ,"" )
`MPRnb( NUCS ,0.0 ,"" ,"" )
`MPRnb( PUCS ,0.0 ,"" ,"" )
`MPRnb( LPCLM ,0.0 ,"" ,"" )
`MPRnb( NPCLM ,0.0 ,"" ,"" )
`MPRnb( PPCLM ,0.0 ,"" ,"" )
`MPRnb( LPCLMR ,LPCLM ,"" ,"" )
`MPRnb( NPCLMR ,NPCLM ,"" ,"" )
`MPRnb( PPCLMR ,PPCLM ,"" ,"" )
`MPRnb( LPCLMG ,0.0 ,"" ,"" )
`MPRnb( NPCLMG ,0.0 ,"" ,"" )
`MPRnb( PPCLMG ,0.0 ,"" ,"" )
`MPRnb( LPCLMCV ,LPCLM ,"" ,"" )
`MPRnb( NPCLMCV ,NPCLM ,"" ,"" )
`MPRnb( PPCLMCV ,PPCLM ,"" ,"" )
`MPRnb( LA1 ,0.0 ,"m*(V^-2)" ,"" )
`MPRnb( NA1 ,0.0 ,"m*(V^-2)" ,"" )
`MPRnb( PA1 ,0.0 ,"m^2*(V^-2)" ,"" )
`MPRnb( LA11 ,0.0 ,"m*(V^-2/K)" ,"" )
`MPRnb( NA11 ,0.0 ,"m*(V^-2/K)" ,"" )
`MPRnb( PA11 ,0.0 ,"m^2*(V^-2/K)" ,"" )
`MPRnb( LA2 ,0.0 ,"m*(V^-1)" ,"" )
`MPRnb( NA2 ,0.0 ,"m*(V^-1)" ,"" )
`MPRnb( PA2 ,0.0 ,"m^2*(V^-1)" ,"" )
`MPRnb( LA21 ,0.0 ,"m*(V^-1/K)" ,"" )
`MPRnb( NA21 ,0.0 ,"m*(V^-1/K)" ,"" )
`MPRnb( PA21 ,0.0 ,"m^2*(V^-1/K)" ,"" )
`MPRnb( LRDSW ,0.0 ,"m*(ohm-um^WR)" ,"" )
`MPRnb( NRDSW ,0.0 ,"m*(ohm-um^WR)" ,"" )
`MPRnb( PRDSW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" )
`MPRnb( LRSW ,0.0 ,"m*(ohm-um^WR)" ,"" )
`MPRnb( NRSW ,0.0 ,"m*(ohm-um^WR)" ,"" )
`MPRnb( PRSW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" )
`MPRnb( LRDW ,0.0 ,"m*(ohm-um^WR)" ,"" )
`MPRnb( NRDW ,0.0 ,"m*(ohm-um^WR)" ,"" )
`MPRnb( PRDW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" )
`MPRnb( LPRWGS ,0.0 ,"m/V" ,"" )
`MPRnb( NPRWGS ,0.0 ,"m/V" ,"" )
`MPRnb( PPRWGS ,0.0 ,"(m^2)/V" ,"" )
`MPRnb( LPRWGD ,0.0 ,"m/V" ,"" )
`MPRnb( NPRWGD ,0.0 ,"m/V" ,"" )
`MPRnb( PPRWGD ,0.0 ,"(m^2)/V" ,"" )
`MPRnb( LWR ,0.0 ,"" ,"" )
`MPRnb( NWR ,0.0 ,"" ,"" )
`MPRnb( PWR ,0.0 ,"" ,"" )
`MPRnb( LPDIBL1 ,0.0 ,"" ,"" )
`MPRnb( NPDIBL1 ,0.0 ,"" ,"" )
`MPRnb( PPDIBL1 ,0.0 ,"" ,"" )
`MPRnb( LPDIBL1R ,LPDIBL1 ,"" ,"" )
`MPRnb( NPDIBL1R ,NPDIBL1 ,"" ,"" )
`MPRnb( PPDIBL1R ,PPDIBL1 ,"" ,"" )
`MPRnb( LPDIBL2 ,0.0 ,"" ,"" )
`MPRnb( NPDIBL2 ,0.0 ,"" ,"" )
`MPRnb( PPDIBL2 ,0.0 ,"" ,"" )
`MPRnb( LPDIBL2R ,LPDIBL2 ,"" ,"" )
`MPRnb( NPDIBL2R ,NPDIBL2 ,"" ,"" )
`MPRnb( PPDIBL2R ,PPDIBL2 ,"" ,"" )
`MPRnb( LDROUT ,0.0 ,"" ,"" )
`MPRnb( NDROUT ,0.0 ,"" ,"" )
`MPRnb( PDROUT ,0.0 ,"" ,"" )
`MPRnb( LPVAG ,0.0 ,"" ,"" )
`MPRnb( NPVAG ,0.0 ,"" ,"" )
`MPRnb( PPVAG ,0.0 ,"" ,"" )
`MPRnb( LAIGBINV ,0.0 ,"(F*s^2/g)^0.5" ,"" )
`MPRnb( NAIGBINV ,0.0 ,"(F*s^2/g)^0.5" ,"" )
`MPRnb( PAIGBINV ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" )
`MPRnb( LAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
`MPRnb( NAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
`MPRnb( PAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" )
`MPRnb( LBIGBINV ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
`MPRnb( NBIGBINV ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
`MPRnb( PBIGBINV ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" )
`MPRnb( LCIGBINV ,0.0 ,"m/V" ,"" )
`MPRnb( NCIGBINV ,0.0 ,"m/V" ,"" )
`MPRnb( PCIGBINV ,0.0 ,"(m^2)/V" ,"" )
`MPRnb( LEIGBINV ,0.0 ,"m*V" ,"" )
`MPRnb( NEIGBINV ,0.0 ,"m*V" ,"" )
`MPRnb( PEIGBINV ,0.0 ,"(m^2)*V" ,"" )
`MPRnb( LNIGBINV ,0.0 ,"" ,"" )
`MPRnb( NNIGBINV ,0.0 ,"" ,"" )
`MPRnb( PNIGBINV ,0.0 ,"" ,"" )
`MPRnb( LAIGBACC ,0.0 ,"(F*s^2/g)^0.5" ,"" )
`MPRnb( NAIGBACC ,0.0 ,"(F*s^2/g)^0.5" ,"" )
`MPRnb( PAIGBACC ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" )
`MPRnb( LAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
`MPRnb( NAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
`MPRnb( PAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" )
`MPRnb( LBIGBACC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
`MPRnb( NBIGBACC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
`MPRnb( PBIGBACC ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" )
`MPRnb( LCIGBACC ,0.0 ,"m/V" ,"" )
`MPRnb( NCIGBACC ,0.0 ,"m/V" ,"" )
`MPRnb( PCIGBACC ,0.0 ,"(m^2)/V" ,"" )
`MPRnb( LNIGBACC ,0.0 ,"" ,"" )
`MPRnb( NNIGBACC ,0.0 ,"" ,"" )
`MPRnb( PNIGBACC ,0.0 ,"" ,"" )
`MPRnb( LAIGC ,0.0 ,"(F*s^2/g)^0.5" ,"" )
`MPRnb( NAIGC ,0.0 ,"(F*s^2/g)^0.5" ,"" )
`MPRnb( PAIGC ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" )
`MPRnb( LAIGC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
`MPRnb( NAIGC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
`MPRnb( PAIGC1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" )
`MPRnb( LBIGC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
`MPRnb( NBIGC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
`MPRnb( PBIGC ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" )
`MPRnb( LCIGC ,0.0 ,"m/V" ,"" )
`MPRnb( NCIGC ,0.0 ,"m/V" ,"" )
`MPRnb( PCIGC ,0.0 ,"(m^2)/V" ,"" )
`MPRnb( LPIGCD ,0.0 ,"" ,"" )
`MPRnb( NPIGCD ,0.0 ,"" ,"" )
`MPRnb( PPIGCD ,0.0 ,"" ,"" )
`MPRnb( LAIGS ,0.0 ,"(F*s^2/g)^0.5" ,"" )
`MPRnb( NAIGS ,0.0 ,"(F*s^2/g)^0.5" ,"" )
`MPRnb( PAIGS ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" )
`MPRnb( LAIGS1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
`MPRnb( NAIGS1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" )
`MPRnb( PAIGS1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" )
`MPRnb( LBIGS ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
`MPRnb( NBIGS ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" )
`MPRnb( PBIGS ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" )
`MPRnb( LCIGS ,0.0 ,"m/V" ,"" )
`MPRnb( NCIGS ,0.0 ,"m/V" ,"" )
`MPRnb( PCIGS ,0.0 ,"(m^2)/V" ,"" )
`MPRnb( LAIGD ,LAIGS ,"(F*s^2/g)^0.5" ,"" )
`MPRnb( NAIGD ,NAIGS ,"(F*s^2/g)^0.5" ,"" )
`MPRnb( PAIGD ,PAIGS ,"((F*s^2/g)^0.5)*m" ,"" )
`MPRnb( LAIGD1 ,LAIGS1 ,"((F*s^2/g)^0.5)/K" ,"" )
`MPRnb( NAIGD1 ,NAIGS1 ,"((F*s^2/g)^0.5)/K" ,"" )
`MPRnb( PAIGD1 ,PAIGS1 ,"((F*s^2/g)^0.5)*(m/K)" ,"" )
`MPRnb( LBIGD ,LBIGS ,"((F*s^2/g)^0.5)/V" ,"" )
`MPRnb( NBIGD ,NBIGS ,"((F*s^2/g)^0.5)/V" ,"" )
`MPRnb( PBIGD ,PBIGS ,"((F*s^2/g)^0.5)*(m/V)" ,"" )
`MPRnb( LCIGD ,LCIGS ,"m/V" ,"" )
`MPRnb( NCIGD ,NCIGS ,"m/V" ,"" )
`MPRnb( PCIGD ,PCIGS ,"(m^2)/V" ,"" )
`MPRnb( LNTOX ,0.0 ,"" ,"" )
`MPRnb( NNTOX ,0.0 ,"" ,"" )
`MPRnb( PNTOX ,0.0 ,"" ,"" )
`MPRnb( LPOXEDGE ,0.0 ,"" ,"" )
`MPRnb( NPOXEDGE ,0.0 ,"" ,"" )
`MPRnb( PPOXEDGE ,0.0 ,"" ,"" )
`MPRnb( LAGISL ,0.0 ,"m/ohm" ,"" )
`MPRnb( NAGISL ,0.0 ,"m/ohm" ,"" )
`MPRnb( PAGISL ,0.0 ,"(m^2)/ohm" ,"" )
`MPRnb( LBGISL ,0.0 ,"V" ,"" )
`MPRnb( NBGISL ,0.0 ,"V" ,"" )
`MPRnb( PBGISL ,0.0 ,"m*V" ,"" )
`MPRnb( LCGISL ,0.0 ,"m*(V^3)" ,"" )
`MPRnb( NCGISL ,0.0 ,"m*(V^3)" ,"" )
`MPRnb( PCGISL ,0.0 ,"(m^2)*(V^3)" ,"" )
`MPRnb( LEGISL ,0.0 ,"m*V" ,"" )
`MPRnb( NEGISL ,0.0 ,"m*V" ,"" )
`MPRnb( PEGISL ,0.0 ,"(m^2)*V" ,"" )
`MPRnb( LPGISL ,0.0 ,"" ,"" )
`MPRnb( NPGISL ,0.0 ,"" ,"" )
`MPRnb( PPGISL ,0.0 ,"" ,"" )
`MPRnb( LAGIDL ,LAGISL ,"m/ohm" ,"" )
`MPRnb( NAGIDL ,NAGISL ,"m/ohm" ,"" )
`MPRnb( PAGIDL ,PAGISL ,"(m^2)/ohm" ,"" )
`MPRnb( LBGIDL ,LBGISL ,"V" ,"" )
`MPRnb( NBGIDL ,NBGISL ,"V" ,"" )
`MPRnb( PBGIDL ,PBGISL ,"m*V" ,"" )
`MPRnb( LCGIDL ,LCGISL ,"m*(V^3)" ,"" )
`MPRnb( NCGIDL ,NCGISL ,"m*(V^3)" ,"" )
`MPRnb( PCGIDL ,PCGISL ,"(m^2)*(V^3)" ,"" )
`MPRnb( LEGIDL ,LEGISL ,"m*V" ,"" )
`MPRnb( NEGIDL ,NEGISL ,"m*V" ,"" )
`MPRnb( PEGIDL ,PEGISL ,"(m^2)*V" ,"" )
`MPRnb( LPGIDL ,LPGISL ,"" ,"" )
`MPRnb( NPGIDL ,NPGISL ,"" ,"" )
`MPRnb( PPGIDL ,PPGISL ,"" ,"" )
`MPRnb( LALPHA0 ,0.0 ,"(m^2)/V" ,"" )
`MPRnb( NALPHA0 ,0.0 ,"(m^2)/V" ,"" )
`MPRnb( PALPHA0 ,0.0 ,"(m^3)/V" ,"" )
`MPRnb( LALPHA1 ,0.0 ,"m/V" ,"" )
`MPRnb( NALPHA1 ,0.0 ,"m/V" ,"" )
`MPRnb( PALPHA1 ,0.0 ,"(m^2)/V" ,"" )
`MPRnb( LALPHAII0 ,0.0 ,"(m^2)/V" ,"" )
`MPRnb( NALPHAII0 ,0.0 ,"(m^2)/V" ,"" )
`MPRnb( PALPHAII0 ,0.0 ,"(m^3)/V" ,"" )
`MPRnb( LALPHAII1 ,0.0 ,"m/V" ,"" )
`MPRnb( NALPHAII1 ,0.0 ,"m/V" ,"" )
`MPRnb( PALPHAII1 ,0.0 ,"(m^2)/V" ,"" )
`MPRnb( LBETA0 ,0.0 ,"m/V" ,"" )
`MPRnb( NBETA0 ,0.0 ,"m/V" ,"" )
`MPRnb( PBETA0 ,0.0 ,"(m^2)/V" ,"" )
`MPRnb( LBETAII0 ,0.0 ,"m/V" ,"" )
`MPRnb( NBETAII0 ,0.0 ,"m/V" ,"" )
`MPRnb( PBETAII0 ,0.0 ,"(m^2)/V" ,"" )
`MPRnb( LBETAII1 ,0.0 ,"" ,"" )
`MPRnb( NBETAII1 ,0.0 ,"" ,"" )
`MPRnb( PBETAII1 ,0.0 ,"" ,"" )
`MPRnb( LBETAII2 ,0.0 ,"m*V" ,"" )
`MPRnb( NBETAII2 ,0.0 ,"m*V" ,"" )
`MPRnb( PBETAII2 ,0.0 ,"(m^2)*V" ,"" )
`MPRnb( LESATII ,0.0 ,"V" ,"" )
`MPRnb( NESATII ,0.0 ,"V" ,"" )
`MPRnb( PESATII ,0.0 ,"m*V" ,"" )
`MPRnb( LLII ,0.0 ,"(m^2)*V" ,"" )
`MPRnb( NLII ,0.0 ,"(m^2)*V" ,"" )
`MPRnb( PLII ,0.0 ,"(m^3)*V" ,"" )
`MPRnb( LSII0 ,0.0 ,"m/V" ,"" )
`MPRnb( NSII0 ,0.0 ,"m/V" ,"" )
`MPRnb( PSII0 ,0.0 ,"(m^2)/V" ,"" )
`MPRnb( LSII1 ,0.0 ,"" ,"" )
`MPRnb( NSII1 ,0.0 ,"" ,"" )
`MPRnb( PSII1 ,0.0 ,"" ,"" )
`MPRnb( LSII2 ,0.0 ,"m*V" ,"" )
`MPRnb( NSII2 ,0.0 ,"m*V" ,"" )
`MPRnb( PSII2 ,0.0 ,"(m^2)*V" ,"" )
`MPRnb( LSIID ,0.0 ,"m*V" ,"" )
`MPRnb( NSIID ,0.0 ,"m*V" ,"" )
`MPRnb( PSIID ,0.0 ,"(m^2)*V" ,"" )
`MPRnb( LCFS ,0.0 ,"F" ,"" )
`MPRnb( NCFS ,0.0 ,"F" ,"" )
`MPRnb( PCFS ,0.0 ,"F*m" ,"" )
`MPRnb( LCFD ,LCFS ,"F" ,"" )
`MPRnb( NCFD ,NCFS ,"F" ,"" )
`MPRnb( PCFD ,PCFS ,"F*m" ,"" )
`MPRnb( LCOVS ,0.0 ,"F" ,"" )
`MPRnb( NCOVS ,0.0 ,"F" ,"" )
`MPRnb( PCOVS ,0.0 ,"F*m" ,"" )
`MPRnb( LCOVD ,LCOVS ,"F" ,"" )
`MPRnb( NCOVD ,NCOVS ,"F" ,"" )
`MPRnb( PCOVD ,PCOVS ,"F*m" ,"" )
`MPRnb( LCGSL ,0.0 ,"F" ,"" )
`MPRnb( NCGSL ,0.0 ,"F" ,"" )
`MPRnb( PCGSL ,0.0 ,"F*m" ,"" )
`MPRnb( LCGDL ,LCGSL ,"F" ,"" )
`MPRnb( NCGDL ,NCGSL ,"F" ,"" )
`MPRnb( PCGDL ,PCGSL ,"F*m" ,"" )
`MPRnb( LCKAPPAS ,0.0 ,"m*V" ,"" )
`MPRnb( NCKAPPAS ,0.0 ,"m*V" ,"" )
`MPRnb( PCKAPPAS ,0.0 ,"(m^2)*V" ,"" )
`MPRnb( LCKAPPAD ,LCKAPPAS ,"m*V" ,"" )
`MPRnb( NCKAPPAD ,NCKAPPAS ,"m*V" ,"" )
`MPRnb( PCKAPPAD ,PCKAPPAS ,"(m^2)*V" ,"" )
`MPRnb( LCGBL ,0.0 ,"F" ,"" )
`MPRnb( NCGBL ,0.0 ,"F" ,"" )
`MPRnb( PCGBL ,0.0 ,"F*m" ,"" )
`MPRnb( LCKAPPAB ,0.0 ,"m*V" ,"" )
`MPRnb( NCKAPPAB ,0.0 ,"m*V" ,"" )
`MPRnb( PCKAPPAB ,0.0 ,"(m^2)*V" ,"" )
`MPRnb( LNTGEN ,0.0 ,"" ,"" )
`MPRnb( NNTGEN ,0.0 ,"" ,"" )
`MPRnb( PNTGEN ,0.0 ,"" ,"" )
`MPRnb( LAIGEN ,0.0 ,"(m^-2)*(V^-1)" ,"" )
`MPRnb( NAIGEN ,0.0 ,"(m^-2)*(V^-1)" ,"" )
`MPRnb( PAIGEN ,0.0 ,"(m^-1)*(V^-1)" ,"" )
`MPRnb( LBIGEN ,0.0 ,"(m^-2)*(V^-3)" ,"" )
`MPRnb( NBIGEN ,0.0 ,"(m^-2)*(V^-3)" ,"" )
`MPRnb( PBIGEN ,0.0 ,"(m^-1)*(V^-3)" ,"" )
`MPRnb( LXRCRG1 ,0.0 ,"" ,"" )
`MPRnb( NXRCRG1 ,0.0 ,"" ,"" )
`MPRnb( PXRCRG1 ,0.0 ,"" ,"" )
`MPRnb( LXRCRG2 ,0.0 ,"" ,"" )
`MPRnb( NXRCRG2 ,0.0 ,"" ,"" )
`MPRnb( PXRCRG2 ,0.0 ,"" ,"" )
`MPRnb( LUTE ,0.0 ,"" ,"" )
`MPRnb( NUTE ,0.0 ,"" ,"" )
`MPRnb( PUTE ,0.0 ,"" ,"" )
`MPRnb( LUTER ,LUTE ,"" ,"" )
`MPRnb( NUTER ,NUTE ,"" ,"" )
`MPRnb( PUTER ,PUTE ,"" ,"" )
`MPRnb( LUTL ,0.0 ,"" ,"" )
`MPRnb( NUTL ,0.0 ,"" ,"" )
`MPRnb( PUTL ,0.0 ,"" ,"" )
`MPRnb( LUTLR ,LUTL ,"" ,"" )
`MPRnb( NUTLR ,NUTL ,"" ,"" )
`MPRnb( PUTLR ,PUTL ,"" ,"" )
`MPRnb( LEMOBT ,0.0 ,"" ,"" )
`MPRnb( NEMOBT ,0.0 ,"" ,"" )
`MPRnb( PEMOBT ,0.0 ,"" ,"" )
`MPRnb( LUA1 ,0.0 ,"" ,"" )
`MPRnb( NUA1 ,0.0 ,"" ,"" )
`MPRnb( PUA1 ,0.0 ,"" ,"" )
`MPRnb( LUA1R ,LUA1 ,"" ,"" )
`MPRnb( NUA1R ,NUA1 ,"" ,"" )
`MPRnb( PUA1R ,PUA1 ,"" ,"" )
`MPRnb( LUC1 ,0.0 ,"" ,"" )
`MPRnb( NUC1 ,0.0 ,"" ,"" )
`MPRnb( PUC1 ,0.0 ,"" ,"" )
`MPRnb( LUC1R ,LUC1 ,"" ,"" )
`MPRnb( NUC1R ,NUC1 ,"" ,"" )
`MPRnb( PUC1R ,PUC1 ,"" ,"" )
`MPRnb( LUD1 ,0.0 ,"" ,"" )
`MPRnb( NUD1 ,0.0 ,"" ,"" )
`MPRnb( PUD1 ,0.0 ,"" ,"" )
`MPRnb( LUD1R ,LUD1 ,"" ,"" )
`MPRnb( NUD1R ,NUD1 ,"" ,"" )
`MPRnb( PUD1R ,PUD1 ,"" ,"" )
`MPRnb( LUCSTE ,0.0 ,"" ,"" )
`MPRnb( NUCSTE ,0.0 ,"" ,"" )
`MPRnb( PUCSTE ,0.0 ,"" ,"" )
`MPRnb( LPTWGT ,0.0 ,"m/K" ,"" )
`MPRnb( NPTWGT ,0.0 ,"m/K" ,"" )
`MPRnb( PPTWGT ,0.0 ,"(m^2)/K" ,"" )
`MPRnb( LAT ,0.0 ,"m/K" ,"" )
`MPRnb( NAT ,0.0 ,"m/K" ,"" )
`MPRnb( PAT ,0.0 ,"(m^2)/K" ,"" )
`MPRnb( LATR ,LAT ,"" ,"" )
`MPRnb( NATR ,NAT ,"" ,"" )
`MPRnb( PATR ,PAT ,"" ,"" )
`MPRnb( LATCV ,0.0 ,"m/K" ,"" )
`MPRnb( NATCV ,0.0 ,"m/K" ,"" )
`MPRnb( PATCV ,0.0 ,"(m^2)/K" ,"" )
`MPRnb( LSTTHETASAT ,0.0 ,"" ,"" )
`MPRnb( NSTTHETASAT ,0.0 ,"" ,"" )
`MPRnb( PSTTHETASAT ,0.0 ,"" ,"" )
`MPRnb( LPRT ,0.0 ,"m/K" ,"" )
`MPRnb( NPRT ,0.0 ,"m/K" ,"" )
`MPRnb( PPRT ,0.0 ,"(m^2)/K" ,"" )
`MPRnb( LKT1 ,0.0 ,"m*V" ,"" )
`MPRnb( NKT1 ,0.0 ,"m*V" ,"" )
`MPRnb( PKT1 ,0.0 ,"(m^2)*V" ,"" )
`MPRnb( LTSS ,0.0 ,"" ,"" )
`MPRnb( NTSS ,0.0 ,"" ,"" )
`MPRnb( PTSS ,0.0 ,"" ,"" )
`MPRnb( LIIT ,0.0 ,"" ,"" )
`MPRnb( NIIT ,0.0 ,"" ,"" )
`MPRnb( PIIT ,0.0 ,"" ,"" )
`MPRnb( LTII ,0.0 ,"" ,"" )
`MPRnb( NTII ,0.0 ,"" ,"" )
`MPRnb( PTII ,0.0 ,"" ,"" )
`MPRnb( LTGIDL ,0.0 ,"m/K" ,"" )
`MPRnb( NTGIDL ,0.0 ,"m/K" ,"" )
`MPRnb( PTGIDL ,0.0 ,"(m^2)/K" ,"" )
`MPRnb( LIGT ,0.0 ,"" ,"" )
`MPRnb( NIGT ,0.0 ,"" ,"" )
`MPRnb( PIGT ,0.0 ,"" ,"" )

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,117 @@
// ********************************************************
// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016****/
// * BSIM Common Multi-Gate Model Equations (Verilog-A)
// ********************************************************
//
// ********************************************************
// * Copyright 2016 Regents of the University of California.
// * All rights reserved.
// *
// * Project Director: Prof. Chenming Hu.
// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal,
// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
// * Ali Niknejad, Chenming Hu
// ********************************************************
// ********************************************************
// * NONDISCLOSURE STATEMENT
// Software is distributed as is, completely without warranty or service
// support. The University of California and its employees are not liable
// for the condition or performance of the software.
// The University of California owns the copyright and grants users a perpetual,
// irrevocable, worldwide, non-exclusive, royalty-free license with
// respect to the software as set forth below.
// The University of California hereby disclaims all implied warranties.
// The University of California 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 University of California code
// itself but may charge for additions, extensions, or support.
// 2. In any product based on the software, the users agree to acknowledge
// the University of California that developed the software. This
// acknowledgment shall appear in the product documentation.
// 3. The users agree to obey all U.S. Government restrictions governing
// redistribution or export of the software.
// 4. The users agree to reproduce any copyright notice which appears on
// the software on any copy or modification of such made available
// to others
// Agreed to on __Jan 01, 2016__________________
// By: ___University of California, Berkeley____
// ___Chenming Hu_____________________
// ___Professor in Graduate School _______
// ********************************************************
// ********************************************************
// Macro for the geometry-dependent fringing capacitance
// model
// ********************************************************
/*
(while (re-search-forward
(rx bow
(or "Hr" "Lr" "Hgdelta" "Lmax" "y" "x"
"CcgSat" "Cnon" "TT1" "Ccg1" "r1cf" "Rcf" "Ccg2"
"Ccg" "C1" "C2" "C3" "Cfglog" "dcf" "TT0"
"TT2" "Cfgsat" "delta" "xCfg")
eow)
nil t)
(replace-match "x42_\\&" t))
*/
`define Cfringe_2d_vars() \
real x42_Hr, x42_Lr, x42_Hgdelta, x42_Lmax, x42_y, x42_x; \
real x42_CcgSat, x42_Cnon, x42_TT1, x42_Ccg1, x42_r1cf, x42_Rcf, x42_Ccg2; \
real x42_Ccg, x42_C1, x42_C2, x42_C3, x42_Cfglog, x42_dcf, x42_TT0; \
real x42_TT2, x42_Cfgsat, x42_delta, Cfg;
`define Cfringe_2d(block_name, Hg, Hc, Lext, Wfin, Lc, Lg, Tox, Cf1, Cgg) \
begin : block_name \
x42_Hr = 2.3 + 0.2 * ((Hg) + (Tox)) / (Hc); \
x42_Lr = 1.05; \
x42_Hgdelta = abs((Hg) + (Tox) - (Hc)); \
x42_Lmax = (Lext) * x42_Lr; \
\
x42_y = min((Hc), (Hg) + (Tox)); \
x42_x = (Lext) / (x42_Hr + 1.0); \
x42_Cnon = 1.7e12; \
x42_CcgSat = epssp * (x42_y - x42_x) / (Lext); \
x42_TT1 = x42_Cnon * x42_CcgSat; \
if(x42_TT1 > `EXPL_THRESHOLD) \
x42_Ccg1 = x42_CcgSat; \
else \
x42_Ccg1 = 1.0 / x42_Cnon * ln(1.0 + lexp(x42_TT1)); \
\
x42_r1cf = 0.5 * \
min((Hc) / ((Hg) + (Tox)), ((Hg) + (Tox)) / (Hc)); \
x42_Rcf = x42_Hgdelta * x42_r1cf; \
x42_Ccg2 = epssp * 2 / `M_PI * \
ln(((Lext) + 0.5 * `M_PI * x42_Rcf) / (Lext)); \
\
x42_Ccg = (Wfin) * (x42_Ccg1 + x42_Ccg2); \
\
x42_x = x42_Lmax / (Hg); \
x42_C1 = 4.0 / (sqrt(2.0 * (x42_x + 1)) * `M_PI); \
x42_C2 = sqrt((Tox) * (Tox) + 2.0 * (Hg) * (Tox) + \
(Hg) * (Hg) * (x42_x + 1)) * sqrt(x42_x + 1) + (Tox) + \
(Hg) * x42_x + (Hg); \
x42_C3 = (Tox) * sqrt((x42_x + 1) * (x42_x + 4)) + Tox * (x42_x + 2); \
x42_Cfglog = epssp * (x42_C1 * ln(x42_C2 / x42_C3) + 12.27); \
\
x42_dcf = x42_Hr * x42_Lr; \
x42_TT0 = sqrt(x42_dcf * x42_dcf + 1.0); \
x42_TT1 = sqrt((x42_dcf * x42_dcf + 1) * ((x42_dcf * (Tox)) * (x42_dcf * (Tox)) + \
2 * x42_dcf * x42_Lmax * (Tox) + (x42_dcf * x42_dcf + 1) * x42_Lmax * x42_Lmax)) \
+ x42_dcf * (Tox) + x42_dcf * x42_dcf * x42_Lmax + x42_Lmax; \
x42_TT2 = (x42_TT0 + 1.0) * (x42_dcf * (Tox)); \
x42_Cfgsat = 2.0 * epssp * sqrt(2) / `M_PI * (Cf1) * x42_dcf \
/ x42_TT0 * ln(x42_TT1 / x42_TT2); \
\
x42_delta = 1.2e-12; \
x42_TT1 = x42_Cfgsat - x42_Cfglog - x42_delta; \
Cfg = (Wfin) * (x42_Cfgsat - 0.5 * (x42_TT1 + \
sqrt(x42_TT1 * x42_TT1 + 4 * x42_delta * x42_Cfgsat))); \
Cgg = x42_Ccg + Cfg; \
end

View File

@ -0,0 +1,89 @@
// ********************************************************
// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/
// * BSIM Common Multi-Gate Model Equations (Verilog-A)
// ********************************************************
//
// ********************************************************
// * Copyright 2016 Regents of the University of California.
// * All rights reserved.
// *
// * Project Director: Prof. Chenming Hu.
// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu,
// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
// * Ali Niknejad, Chenming Hu
// ********************************************************
// ********************************************************
// * NONDISCLOSURE STATEMENT
// Software is distributed as is, completely without warranty or service
// support. The University of California and its employees are not liable
// for the condition or performance of the software.
// The University of California owns the copyright and grants users a perpetual,
// irrevocable, worldwide, non-exclusive, royalty-free license with
// respect to the software as set forth below.
// The University of California hereby disclaims all implied warranties.
// The University of California 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 University of California code
// itself but may charge for additions, extensions, or support.
// 2. In any product based on the software, the users agree to acknowledge
// the University of California that developed the software. This
// acknowledgment shall appear in the product documentation.
// 3. The users agree to obey all U.S. Government restrictions governing
// redistribution or export of the software.
// 4. The users agree to reproduce any copyright notice which appears on
// the software on any copy or modification of such made available
// to others
// Agreed to on __Jan 01, 2016_________________
// By: ___University of California, Berkeley____
// ___Chenming Hu_____________________
// ___Professor in Graduate School _______
// ********************************************************
// *** Quasi Static CV Model ***
T11 = (2.0*qia+nVtm)/DvsatCV;//G
qg = qia+dqi*dqi/(6.0*T11);//qc
qd = -0.5*(qia-(dqi/(6.0))*(1.0-(dqi/T11)*(1+dqi/(5.0*T11))));//qd
// Including CLM in qg and qd
inv_MclmCV = 1.0 / MclmCV;
qg = inv_MclmCV * qg + (MclmCV - 1.0) * qid;
qd = inv_MclmCV * inv_MclmCV * qd + 0.5 * (MclmCV - inv_MclmCV) * qid;
//Calculating partition for NQSMOD2
`ifdef __NQSMOD2__
if(NQSMOD == 2) xdpart = qd / qg;
else xdpart = 0;
`endif
qs = -qg-qd; //from charge conservation qs = -qg-qd;
T6 = NFINtotal*WeffCV0 * LeffCV * coxeff;
qg = T6*qg;
qd = T6*qd;
qs = T6*qs;
qinv = qg ;
if(BULKMOD != 0) begin
T1 = NFINtotal * WeffCV0 * LeffCV_acc * cox_acc;
T7 = qi_acc_for_QM;//qbulk
T10 = T7 * T1;
qg_acc = - T10;
qb_acc = T10;
T1 = NFINtotal * WeffCV0 * LeffCV * cox;
T2 = qba - qi_acc_for_QM;
T10 = T1*T2;
qg_acc = qg_acc - T10;
qb_acc = qb_acc + T10;
T1 = NFINtotal * WeffCV0 * LeffCV * cox;
T2 = (nq-1.0)*0.5*(qia+(dqi*dqi/(6.0*T11)));
T10 = T1*T2;
qg_acc = qg_acc - T10;
qb_acc = qb_acc + T10;
end
// if vds is negative, physical charge on qd is qs
if (sigvds < 0) begin
T1 = qd;
qd = qs;
qs = T1;
end

View File

@ -0,0 +1,84 @@
// *******************************************************
// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/
// * BSIM Common Multi-Gate Model Equations (Verilog-A)
// ********************************************************
//
// ********************************************************
// * Copyright 2016 Regents of the University of California.
// * All rights reserved.
// *
// * Project Director: Prof. Chenming Hu.
// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal
// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
// * Ali Niknejad, Chenming Hu
// ********************************************************
// ********************************************************
// * NONDISCLOSURE STATEMENT
// Software is distributed as is, completely without warranty or service
// support. The University of California and its employees are not liable
// for the condition or performance of the software.
// The University of California owns the copyright and grants users a perpetual,
// irrevocable, worldwide, non-exclusive, royalty-free license with
// respect to the software as set forth below.
// The University of California hereby disclaims all implied warranties.
// The University of California 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 University of California code
// itself but may charge for additions, extensions, or support.
// 2. In any product based on the software, the users agree to acknowledge
// the University of California that developed the software. This
// acknowledgment shall appear in the product documentation.
// 3. The users agree to obey all U.S. Government restrictions governing
// redistribution or export of the software.
// 4. The users agree to reproduce any copyright notice which appears on
// the software on any copy or modification of such made available
// to others
// Agreed to on __Jan 01, 2016_________________
// By: ___University of California, Berkeley____
// ___Chenming Hu_____________________
// ___Professor in Graduate School _______
// ********************************************************
// Source-Drain Resistance Model
case(RDSMOD)
1: begin
Rdsi = 0.0;
Dr = 1.0;
T2 = vgs_noswap - vfbsd;
T3 = sqrt(T2 * T2 + 1.0e-1);
vgs_eff = 0.5 * (T2 + T3);
T4 = 1.0 + PRWGS_i * vgs_eff;
T1 = 1.0 / T4;
T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01));
T5 = RSW_i * (1.0 + RSDR_a * lexp(0.5 * PRSDR * lln(V(si,s) * V(si,s) + 1.0E-6)));
Rsource = rdstemp * (RSourceGeo + (RSWMIN_i + T5 * T0) * WeffWRFactor);
T2 = vgd_noswap - vfbsd;
T3 = sqrt(T2 * T2 + 1.0e-1);
vgd_eff = 0.5 * (T2 + T3);
T4 = 1.0 + PRWGD_i * vgd_eff;
T1 = 1.0 / T4;
T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01));
T5 = RDW_i * (1.0 + RDDR_a * lexp(0.5 * PRDDR * lln(V(di,d) * V(di,d) + 1.0E-6)));
Rdrain = rdstemp * (RDrainGeo + (RDWMIN_i + T5 * T0) * WeffWRFactor);
end
0: begin
Rsource = RSourceGeo;
Rdrain = RDrainGeo;
T4 = 1.0 + PRWGS_i * qia;
T1 = 1.0 / T4;
T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01));
Rdsi = rdstemp * (RDSWMIN_i + RDSW_i * T0) * WeffWRFactor;
Dr = 1.0 + (NFINtotal) * beta * ids0_ov_dqi / (Dmob * Dvsat) * Rdsi;
end
2: begin
T4 = 1.0 + PRWGS_i * qia;
T1 = 1.0 / T4;
T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01));
Rdsi = rdstemp * (RSourceGeo + RDrainGeo + RDSWMIN_i + RDSW_i * T0) * WeffWRFactor;
Dr = 1.0 + (NFINtotal) * beta * ids0_ov_dqi / (Dmob * Dvsat) * Rdsi;
Rsource = 0.0;
Rdrain = 0.0;
end
endcase

View File

@ -0,0 +1,185 @@
// ********************************************************
// **** BSIM-CMG 110.0.0 released by Sourabh Khandelwal on 01/01/2016 ****/
// * BSIM Common Multi-Gate Model Equations (Verilog-A)
// ********************************************************
//
// ********************************************************
// * Copyright 2016 Regents of the University of California.
// * All rights reserved.
// *
// * Project Director: Prof. Chenming Hu.
// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal
// * Chung-Hsun Lin, Mohan Dunga, Shijing Yao,
// * Ali Niknejad, Chenming Hu
// ********************************************************
// ********************************************************
// * NONDISCLOSURE STATEMENT
// Software is distributed as is, completely without warranty or service
// support. The University of California and its employees are not liable
// for the condition or performance of the software.
// The University of California owns the copyright and grants users a perpetual,
// irrevocable, worldwide, non-exclusive, royalty-free license with
// respect to the software as set forth below.
// The University of California hereby disclaims all implied warranties.
// The University of California 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 University of California code
// itself but may charge for additions, extensions, or support.
// 2. In any product based on the software, the users agree to acknowledge
// the University of California that developed the software. This
// acknowledgment shall appear in the product documentation.
// 3. The users agree to obey all U.S. Government restrictions governing
// redistribution or export of the software.
// 4. The users agree to reproduce any copyright notice which appears on
// the software on any copy or modification of such made available
// to others
// Agreed to on __Jan 01, 2016__________________
// By: ___University of California, Berkeley____
// ___Chenming Hu_____________________
// ___Professor in Graduate School _______
// ********************************************************
// Numerical Constants
`define EXPL_THRESHOLD 80.0
`define MAX_EXPL 5.540622384e34
`define MIN_EXPL 1.804851387e-35
`define N_MINLOG 1.0e-38
`define MEXPQM 4
`define DELTA_1 0.02
`define DELTA_ASYMM 0.04
`define CONSTCtoK (273.15)
`define REFTEMP (300.15) /* 27 degrees C */
// Model type definitions
`define ntype 1
`define ptype 0
// Physical Constants
`define q 1.60219e-19 // Coul
`define EPS0 8.8542e-12 // F/m
`define HBAR 1.05457e-34 // Joule-sec
`define MEL 9.11e-31 // kg
`define KboQ 8.617087e-5 // Joule / degree
// Mathematical functions
//`define SINH(x) (0.5 * (lexp(x) - lexp(-(x))))
`define COSH(x) (0.5 * (lexp(x) + lexp(-(x))))
//`define TANH(x) ((lexp(x) - lexp(-(x))) / (lexp(x) + lexp(-(x))))
`define COT(x) ((x)>=`M_PI/2 ? 0 : ((x)<=-`M_PI/2 ? 0 : 1.0/tan(x)))
// Junction capacitance
//ex:(ves_jct, Czbs, PBS_t, SBS, MJS, MJS2, Qes1)
`define BSIM6JunctnCap(vex, Cz, PB, SJ, MJ, MJ2, Qej) \
begin \
if (Cz > 0.0) begin \
T1 = vex / PB; \
if (T1 < 0.9) begin \
if (SJ > 0.0) begin /*second-step junction*/ \
vec = PB * (1.0 - lexp((1.0 / MJ) * lln(1.0/SJ))); /*Switch over voltage*/\
pb2 = PB * SJ * MJ2 / MJ / lexp(- (1.0 + MJ) * lln(1.0 - vec / PB)); /*PB for second doping region*/\
if (vex > vec) begin \
arg = 1.0 - T1; \
if (MJ == 0.5) sarg = 1.0 / sqrt(arg); \
else sarg = lexp(-MJ * lln(arg)); \
Qej = PB * Cz * (1.0 - arg * sarg) / (1.0 - MJ); \
end else begin /*vex < vec*/ \
arg = 1.0 - vec / PB; \
if (MJ == 0.5) sarg = 1.0 / sqrt(arg); \
else sarg = lexp(-MJ * lln(arg)); \
Qec = PB * Cz * (1.0 - arg * sarg) / (1.0 - MJ); \
arg = 1.0 - (vex - vec) / pb2; \
if (MJ2 == 0.5) sarg = 1.0 / sqrt(arg); \
else sarg = lexp(-MJ2 * lln(arg)); \
Qej = Qec + SJ * pb2 * Cz * (1.0 - arg * sarg) / (1.0 - MJ2); \
end \
end else begin /*single junction*/ \
arg = 1.0 - T1; \
if (MJ == 0.5) sarg = 1.0 / sqrt(arg); \
else sarg = lexp(-MJ * lln(arg)); \
Qej = PB * Cz * (1.0 - arg * sarg) / (1.0 - MJ); \
end \
end else begin /*vex/PB>=0.9*/ \
T2 = lexp(-MJ * lln(0.1)); \
T3 = 1.0 / (1.0-MJ); \
T4 = T2 * (T1 - 1.0) * (5.0 * MJ * (T1-1.0) + (1.0 + MJ) ); \
T5 = T3 * (1.0 - 0.05 * MJ * (1.0 + MJ) * T2 ); \
Qej = PB * Cz * (T4 + T5); /*Quadratic equation for Qej when vex/PB>=0.9*/\
end \
end else begin \
Qej = 0.0; \
end \
end
//
// Macros for the model/instance parameters
//
// MPRxx model parameter real
// MPIxx model parameter integer
// IPRxx instance parameter real
// IPIxx instance parameter integer
// ||
// cc closed lower bound, closed upper bound
// oo open lower bound, open upper bound
// co closed lower bound, open upper bound
// oc open lower bound, closed upper bound
// cz closed lower bound=0, open upper bound=inf
// oz open lower bound=0, open upper bound=inf
// nb no bounds
// ex no bounds with exclude
// sw switch(integer only, values 0=false and 1=true)
// ty switch(integer only, values -1=p-type and +1=n-type)
//
// IPM instance parameter mFactor(multiplicity, implicit for LRM2.2)
// OPP operating point parameter, includes units and description for printing
//
`define ALIAS(alias,paramName) aliasparam alias = paramName ;
`define OPP(nam,uni,des) (*units=uni, desc=des*) real nam ;
`define MPRnb(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def ;
`define MPRex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter real nam=def exclude exc ;
`define MPRcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr] ;
`define MPRoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr) ;
`define MPRco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr) ;
`define MPRoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr] ;
`define MPRcz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from[ 0:inf);
`define MPRoz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from( 0:inf);
`define MPInb(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def ;
`define MPIex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter integer nam=def exclude exc ;
`define MPIcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr] ;
`define MPIoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr) ;
`define MPIco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr) ;
`define MPIoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr] ;
`define MPIcz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0:inf);
`define MPIoz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from( 0:inf);
`define MPIsw(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0: 1] ;
`define MPIty(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ -1: 1] exclude 0 ;
`define IPRnb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def ;
`define IPRex(nam,def,uni,exc, des) (*units=uni, type="instance", desc=des*) parameter real nam=def exclude exc ;
`define IPRcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr] ;
`define IPRoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr) ;
`define IPRco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr) ;
`define IPRoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr] ;
`define IPRcz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[ 0:inf);
`define IPRoz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def from( 0:inf);
`define IPInb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def ;
`define IPIex(nam,def,uni,exc, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def exclude exc ;
`define IPIcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr] ;
`define IPIoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr) ;
`define IPIco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr) ;
`define IPIoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr] ;
`define IPIcz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[ 0:inf);
`define IPIoz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from( 0:inf);
`ifdef EXPLICIT_MFACTOR
`define IPM (*units="" , type="instance", desc="multiplicity factor"*) parameter real m=1.0 from(0.0:inf) ;
`define MFACTOR_USE m
`else //
`define IPM
`define MFACTOR_USE 1.0
`endif

View File

@ -0,0 +1,677 @@
// EPFL-EKV version 2.6: A Verilog-A description.
// The intrinsic device is coded according to the official manual
// (revision II) available at https://ekv.epfl.ch/model.
// License information for this implementation:
// Copyright Ivan Riis Nielsen 2006, Dietmar Warning 2009
// This model implementation is licensed according to the modified (3-clause) BSD license:
/*
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
//Default simulator: Spectre
`ifdef insideADMS
`define P(txt) (*txt*)
`define PGIVEN(p) $given(p)
`define INITIAL_MODEL @(initial_model)
`define INSTANCE @(initial_instance)
`define NOISE @(noise)
`else
`define P(txt) (txt)
`define PGIVEN(p) p
`define INITIAL_MODEL
`define INSTANCE
`define NOISE
`endif
//ADS
//`include "constants.vams"
//`include "disciplines.vams"
//`include "compact.vams"
//Spectre
`include "constants.h"
`include "discipline.h"
`define NMOS 1
`define PMOS -1
`define EPSSI `P_EPS0*11.7
`define EPSOX `P_EPS0*3.9
`define TREF 300.15
`define SQR(x) ((x)*(x))
`define VT(temp) (`P_K*temp/`P_Q)
`define EG(temp) (1.16-0.000702*`SQR(temp)/(temp+1108))
`define NI(temp) (1.45e16*(temp/`TREF)*exp(`EG(`TREF)/(2*`VT(`TREF))-`EG(temp)/(2*`VT(temp))))
`define oneThird 3.3333333333333333e-01
// Constants needed in safe exponential function (called "expl")
`define se05 2.3025850929940458e+02
`define ke05 1.0e-100
`define ke05inv 1.0e100
// P3 3rd order polynomial expansion of exp()
`define P3(u) (1.0 + (u) * (1.0 + 0.5 * ((u) * (1.0 + (u) * `oneThird))))
// expl exp() with 3rd order polynomial extrapolation
// to avoid overflows and underflows and retain C-3 continuity
`define expl(x, res) \
if (abs(x) < `se05) begin\
res = exp(x); \
end else begin \
if ((x) < -`se05) begin\
res = `ke05 / `P3(-`se05 - (x)); \
end else begin\
res = `ke05inv * `P3((x) - `se05); \
end \
end
module ekv (d,g,s,b);
// Node definitions
inout d,g,s,b;
electrical d,g,s,b,di,si;
// Model parameters
parameter integer nmos=1 from [0:1] `P(desc="MOS type : nmos:0");
parameter integer pmos=1 from [0:1] `P(desc="MOS type : pmos:0");
parameter integer MTYPE=(nmos==0 ? (pmos==0 ? 0 : 1) : (pmos==0 ? -1 : 1));
parameter real TNOM=27 from (-273.15:inf)
`P(desc="Nominal temperature [degC]");
parameter real IMAX=1 from (0:inf)
`P(desc="Maximum forward junction current before linearization [A]");
// - intrinsic model (optional, section 4.2.1)
parameter real TOX=0 from [0:inf)
`P(desc="Oxide thickness [m]");
parameter real NSUB=0 from [0:inf)
`P(desc="Channel doping [cm^-3]");
parameter real VFB=1001.0 from (-inf:inf) // use 1001V as "not specified"
`P(desc="Flat-band voltage [V]");
parameter real UO=0 from [0:inf)
`P(desc="Low-field mobility [cm^2/Vs]");
parameter real VMAX=0 from [0:inf)
`P(desc="Saturation velocity [m/s]");
parameter real THETA=0 from [0:inf)
`P(desc="Mobility reduction coefficient [V^-1]");
// - intrinsic model (process related, section 4.1)
parameter real COX=((TOX>0) ? (`EPSOX/TOX) : 0.7m) from [0:inf)
`P(desc="Oxide capacitance [F/m^2]");
parameter real XJ=0.1u from [1n:inf)
`P(desc="Junction depth [m]");
parameter real DL=0 from (-inf:inf)
`P(desc="Length correction [m]");
parameter real DW=0 from (-inf:inf)
`P(desc="Width correction [m]");
// - intrinsic model (basic, section 4.2)
parameter real GAMMA=((NSUB>0) ? (sqrt(2*`P_Q*`EPSSI*NSUB*1e6)/COX) : 1) from [0:inf)
`P(desc="Body effect parameter [V^0.5]");
parameter real PHI=((NSUB>0) ? (2*`VT((TNOM+273.15))*ln(max(NSUB,1)*1e6/`NI((TNOM+273.15)))) : 0.7) from [0.1:inf)
`P(desc="Bulk Fermi potential (*2) [V]");
parameter real VTO=((VFB<1000.0) ? (VFB+MTYPE*(PHI+GAMMA*sqrt(PHI))) : 0.5) from (-inf:inf)
`P(desc="Long-channel threshold voltage [V]");
parameter real KP=((UO>0) ? (UO*1e-4*COX) : 50u) from (0:inf)
`P(desc="Transconductance parameter [A/V^2]");
parameter real UCRIT=(((VMAX>0) && (UO>0)) ? (VMAX/(UO*1e-4)) : 2e6 ) from [100k:inf)
`P(desc="Longitudinal critical field [V/m]");
parameter real E0=((THETA>0) ? 0 : 1e12) from [100k:inf)
`P(desc="Mobility reduction coefficient [V/m]");
// - intrinsic model (channel length modulation and charge sharing, section 4.3)
parameter real LAMBDA=0.5 from [0:inf)
`P(desc="Depletion length coefficient (CLM)");
parameter real WETA=0.25 from (-inf:inf)
`P(desc="Narrow-channel effect coefficient");
parameter real LETA=0.1 from (-inf:inf)
`P(desc="Short-channel effect coefficient");
// - intrinsic model (reverse short channel effect, section 4.4)
parameter real Q0=0 from (-inf:inf)
`P(desc="RSCE peak charge density [C/m^2]");
parameter real LK=0.29u from [10n:inf)
`P(desc="RSCE characteristic length [m]");
// - intrinsic model (impact ionization, section 4.5)
parameter real IBA=0 from (-inf:inf)
`P(desc="First impact ionization coefficient [m^-1]");
parameter real IBB=3e8 from [1e8:inf)
`P(desc="Second impact ionization coefficient [V/m]");
parameter real IBN=1 from [0.1:inf)
`P(desc="Saturation voltage factor for impact ionization");
// - intrinsic model (temperature, section 4.6)
parameter real TCV=1m from (-inf:inf)
`P(desc="Threshold voltage TC [V/K]");
parameter real BEX=-1.5 from (-inf:inf)
`P(desc="Mobility temperature exponent");
parameter real UCEX=0.8 from (-inf:inf)
`P(desc="Longitudinal critical field temperature exponent");
parameter real IBBT=9e-4 from (-inf:inf)
`P(desc="Temperature coefficient for IBB [K^-1]");
// - intrinsic model (matching, section 4.7)
parameter real AVTO=0 from (-inf:inf)
`P(desc="Area related VTO mismatch parameter [Vm]");
parameter real AKP=0 from (-inf:inf)
`P(desc="Area related KP mismatch parameter [m]");
parameter real AGAMMA=0 from (-inf:inf)
`P(desc="Area related GAMMA mismatch parameter [V^0.5*m]");
// - intrinsic model (flicker noise, section 4.8)
parameter real KF=0 from [0:inf)
`P(desc="Flicker noise coefficient");
parameter real AF=1 from (-inf:inf)
`P(desc="Flicker noise exponent");
// - intrinsic model (setup, section 4.9)
parameter real NQS=0 from [0:1]
`P(desc="Non-quasi-static operation switch");
parameter real SATLIM=exp(4) from (0:inf)
`P(desc="Saturation limit (if/ir)");
parameter real XQC=0.4 from [0:1]
`P(desc="Charge/capacitance model selector");
// - external parasitic parameters
parameter real HDIF=0 from [0:inf)
`P(desc="S/D diffusion length (/2) [m]");
parameter real RSH=0 from [0:inf)
`P(desc="S/D sheet resistance [ohm]");
parameter real JS=0 from [0:inf)
`P(desc="S/D junction saturation current density [A/m^2]");
parameter real JSW=0 from [0:inf)
`P(desc="S/D junction sidewall saturation current density [A/m]");
parameter real XTI=0 from [0:inf)
`P(desc="S/D diode saturation current temperature exponent");
parameter real N=1 from [0.5:10]
`P(desc="S/D diode emission coefficient");
parameter real CJ=0 from [0:inf)
`P(desc="S/D zero-bias junction capacitance per area [F/m^2]");
parameter real CJSW=0 from [0:inf)
`P(desc="S/D zero-bias junction capacitance per perimeter [F/m]");
parameter real PB=0.8 from (0:inf)
`P(desc="S/D bottom junction builtin potential [V]");
parameter real PBSW=PB from (0:inf)
`P(desc="S/D sidewall junction builtin potential [V]");
parameter real MJ=0.5 from (0:inf)
`P(desc="S/D bottom junction grading coefficient");
parameter real MJSW=0.333 from (0:inf)
`P(desc="S/D sidewall junction grading coefficient");
parameter real FC=0.5 from (0:inf)
`P(desc="S/D bottom junction forward-bias threshold");
parameter real FCSW=FC from (0:inf)
`P(desc="S/D sidewall junction forward-bias threshold");
parameter real CGSO=0 from [0:inf)
`P(desc="Gate-source overlap capacitance per width [F/m]");
parameter real CGDO=0 from [0:inf)
`P(desc="Gate-drain overlap capacitance per width [F/m]");
parameter real CGBO=0 from [0:inf)
`P(desc="Gate-bulk overlap capacitance per length [F/m]");
// Instance parameters
// - intrinsic model
parameter real L=10u from [0:inf]
`P(type="instance" desc="Drawn length [m]" unit="m");
parameter real W=10u from [0:inf]
`P(type="instance" desc="Drawn width [m]" unit="m");
parameter real M=1 from [0:inf]
`P(type="instance" desc="Parallel multiplier" unit="m");
// parameter real N=1 from [0:inf]
// `P(type="instance" desc="Series multiplier" unit="m");
// - external parasitics
parameter real AD=((HDIF>0) ? (2*HDIF*W) : 0) from [0:inf)
`P(desc="Drain area [m^2]" type="instance");
parameter real AS=((HDIF>0) ? (2*HDIF*W) : 0) from [0:inf)
`P(desc="Source area [m^2]" type="instance");
parameter real PD=((HDIF>0) ? (4*HDIF+2*W) : 0) from [0:inf)
`P(desc="Drain perimeter [m]" type="instance");
parameter real PS=((HDIF>0) ? (4*HDIF+2*W) : 0) from [0:inf)
`P(desc="Source perimeter [m]" type="instance");
parameter real NRD=((HDIF>0) ? (HDIF/W) : 0) from [0:inf)
`P(desc="Drain no. squares" type="instance");
parameter real NRS=((HDIF>0) ? (HDIF/W) : 0) from [0:inf)
`P(desc="Source no. squares" type="instance");
parameter real RS=((RSH>0) ? (RSH*NRS) : 0) from [0:inf)
`P(desc="Source resistance [ohms]" type="instance");
parameter real RD=((RSH>0) ? (RSH*NRD) : 0) from [0:inf)
`P(desc="Drain resistance [ohms]" type="instance");
// Declaration of variables
integer mode;
real lc,isat_s,vexp_s,gexp_s,isat_d,vexp_d,gexp_d,fact,
weff,leff,np,ns,lmin,rd,rs,ceps,ca,xsi,dvrsce,
tempk,vt,sqrt_A,vto_a,kp_a,gamma_a,ucrit,phi,ibb,vc,qb0,
vg,vd,vs,tmp,vgprime,vp0,vsprime,vdprime,gamma0,gammaprime,vp,n,ifwd,
vdss,vdssprime,dv,vds,vip,dl,lprime,leq,irprime,irev,beta0,nau,
nq,xf,xr,qd,qs,qi,qb,qg,beta0prime,beta,vpprime,is,ids,vib,
idb,ibdj,ibsj,coxt,qdt,qst,qgt,qbt,
cbs0,cbs0sw,cbs,cbd0,cbd0sw,cbd,
fv,z0,z1,y;
real cgso,cgdo,cgbo;
analog begin
`INITIAL_MODEL begin // Model Initialization
lc = sqrt(`EPSSI/COX*XJ);
end // INITIAL_MODEL
`INSTANCE begin // temperature independent device initialization
weff = W+DW;
leff = L+DL;
np = M;
ns = 1;
// eq. 54
lmin = 0.1*ns*leff;
rs = ns/np*RS;
rd = ns/np*RD;
ceps = 4*22e-3*22e-3;
ca = 0.028;
xsi = ca*(10*leff/LK-1);
dvrsce = 2*Q0/COX/`SQR(1+0.5*(xsi+sqrt(xsi*xsi+ceps)));
coxt = np*ns*COX*weff*leff;
end // temperature independent
`INSTANCE begin // temperature dependent device initialization
tempk = $temperature;
vt = `VT(tempk);
sqrt_A = sqrt(np*weff*ns*leff);
vto_a = MTYPE*(VTO+TCV*(tempk-(TNOM+273.15)))+AVTO/sqrt_A;
kp_a = KP*pow(tempk/(TNOM+273.15),BEX)*(1+AKP/sqrt_A);
gamma_a = GAMMA+AGAMMA/sqrt_A;
ucrit = UCRIT*pow(tempk/(TNOM+273.15),UCEX);
phi = PHI*tempk/(TNOM+273.15)-3*vt*ln(tempk/(TNOM+273.15))-`EG(TNOM+273.15)*tempk/(TNOM+273.15)+`EG(tempk);
ibb = IBB*(1+IBBT*(tempk-(TNOM+273.15)));
vc = ucrit*ns*leff;
// eq. 60
qb0 = gamma_a*sqrt(phi);
fact = (`EG(TNOM+273.15)/`VT(TNOM+273.15)-`EG(tempk)/vt) * pow(tempk/(TNOM+273.15),XTI);
`expl(fact,tmp)
isat_s = np*ns*(JS*AS+JSW*PS)*tmp;
isat_d = np*ns*(JS*AD+JSW*PD)*tmp;
if (isat_s>0) begin
vexp_s = vt*ln(IMAX/isat_s+1);
gexp_s = (IMAX+isat_s)/vt;
end else begin
vexp_s = -1e9;
gexp_s = 0;
end
if (isat_d>0) begin
vexp_d = vt*ln(IMAX/isat_d+1);
gexp_d = (IMAX+isat_d)/vt;
end else begin
vexp_d = -1e9;
gexp_d = 0;
end
cbs0 = np*ns*CJ*AS;
cbd0 = np*ns*CJ*AD;
cbs0sw = np*ns*CJSW*PS;
cbd0sw = np*ns*CJSW*PD;
cgso = np*ns*CGSO*weff;
cgdo = np*ns*CGDO*weff;
cgbo = np*ns*CGBO*leff;
end // temperature dependent
begin //Bias-dependent model evaluation
vg = MTYPE*V(g,b);
vd = MTYPE*V(di,b);
vs = MTYPE*V(si,b);
// $strobe("vg=%e vd=%e vs=%e",vg,vd,vs);
if (vd>=vs)
mode = 1;
else begin
mode = -1;
tmp = vs;
vs = vd;
vd = tmp;
end
// eq. 33
vgprime = vg-vto_a-dvrsce+phi+gamma_a*sqrt(phi);
// eq. 35
vsprime = 0.5*(vs+phi+sqrt(`SQR(vs+phi)+16*`SQR(vt)));
vdprime = 0.5*(vd+phi+sqrt(`SQR(vd+phi)+16*`SQR(vt)));
// $strobe("vgprime=%e vdprime=%e vsprime=%e",vgprime,vdprime,vsprime);
// eq. 34
if (vgprime>=0) begin
vp0 = vgprime-phi-gamma_a*(sqrt(vgprime+0.25*`SQR(gamma_a))-0.5*gamma_a);
// eq. 36
gamma0 = gamma_a-`EPSSI/COX*(LETA/leff*(sqrt(vsprime)+sqrt(vdprime))-3*WETA/weff*sqrt(vp0+phi));
end else begin
vp0 = -phi;
// eq. 36 - skipped sqrt(vp0+phi) here, it produces inf on derivative
gamma0 = gamma_a-`EPSSI/COX*(LETA/leff*(sqrt(vsprime)+sqrt(vdprime)) );
end
// eq. 37
gammaprime = 0.5*(gamma0+sqrt(`SQR(gamma0)+0.1*vt));
// eq. 38
if (vgprime>=0)
vp = vgprime-phi-gammaprime*(sqrt(vgprime+0.25*`SQR(gammaprime))-0.5*gammaprime);
else
vp = -phi;
// $strobe("vp0=%e vp=%e gamma0=%e gammaprime=%e",vp0,vp,gamma0,gammaprime);
// eq. 39
n = 1+gamma_a*0.5/sqrt(vp+phi+4*vt);
// Forward current (43-44)
fv=(vp-vs)/vt;
if (fv > -0.35) begin
z0 = 2.0/(1.3 + fv - ln(fv+1.6));
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
end
else if (fv > -15) begin
`expl(-fv,tmp)
z0 = 1.55 + tmp;
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
end
else if (fv > -23.0) begin
`expl(-fv,tmp)
y = 1.0 / (2.0 + tmp);
end
else begin
`expl(fv,tmp)
y = tmp + 1.0e-64;
end
ifwd = y*(1.0 + y);
z0 = 1;
z1 = 1;
// eq. 46
vdss = vc*(sqrt(0.25+vt/vc*sqrt(ifwd))-0.5);
// eq. 47
vdssprime = vc*(sqrt(0.25+vt/vc*(sqrt(ifwd)-0.75*ln(ifwd)))-0.5)+vt*(ln(0.5*vc/vt)-0.6);
// $strobe("ifwd=%e vdss=%e vdssprime=%e",ifwd,vdss,vdssprime);
// eq. 48
dv = 4*vt*sqrt(LAMBDA*(sqrt(ifwd)-vdss/vt)+1.0/64);
// eq. 49
vds = 0.5*(vd-vs);
// eq. 50
vip = sqrt(`SQR(vdss)+`SQR(dv))-sqrt(`SQR(vds-vdss)+`SQR(dv));
// eq. 52
dl = LAMBDA*lc*ln(1+(vds-vip)/(lc*ucrit));
// eq. 53
lprime = ns*leff-dl+(vds+vip)/ucrit;
// eq. 55
leq = 0.5*(lprime+sqrt(`SQR(lprime)+`SQR(lmin)));
// eq. 56
fv=(vp-vds-vs-sqrt(`SQR(vdssprime)+`SQR(dv))+sqrt(`SQR(vds-vdssprime)+`SQR(dv)))/vt;
if (fv > -0.35) begin
z0 = 2.0/(1.3 + fv - ln(fv+1.6));
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
end
else if (fv > -15) begin
`expl(-fv,tmp)
z0 = 1.55 + tmp;
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
end
else if (fv > -23.0) begin
`expl(-fv,tmp)
y = 1.0 / (2.0 + tmp);
end
else begin
`expl(fv,tmp)
y = tmp + 1.0e-64;
end
irprime = y*(1.0 + y);
z0 = 1;
z1 = 1;
// eq. 57
fv=(vp-vd)/vt;
if (fv > -0.35) begin
z0 = 2.0/(1.3 + fv - ln(fv+1.6));
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
end
else if (fv > -15) begin
`expl(-fv,tmp)
z0 = 1.55 + tmp;
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
end
else if (fv > -23.0) begin
`expl(-fv,tmp)
y = 1.0 / (2.0 + tmp);
end
else begin
`expl(fv,tmp)
y = tmp + 1.0e-64;
end
irev = y*(1.0 + y);
// eq. 58
beta0 = kp_a*np*weff/leq;
// eq. 59
nau = (5+MTYPE)/12.0;
// eq. 69
nq = 1+0.5*gamma_a/sqrt(vp+phi+1e-6);
// eq. 70
xf = sqrt(0.25+ifwd);
// eq. 71
xr = sqrt(0.25+irev);
// eq. 72
qd = -nq*(4.0/15*(3*`SQR(xr)*(xr+2*xf)+2*`SQR(xf)*(xf+2*xr))/`SQR(xf+xr)-0.5);
// eq. 73
qs = -nq*(4.0/15*(3*`SQR(xf)*(xf+2*xr)+2*`SQR(xr)*(xr+2*xf))/`SQR(xf+xr)-0.5);
// eq. 74
qi = qs+qd;
// eq. 75
if (vgprime>=0)
qb = (-gamma_a*sqrt(vp+phi+1e-6))/vt-(nq-1)/nq*qi;
else
qb = -vgprime/vt;
// eq. 76 (qox removed since it is assumed to be zero)
qg = -qi-qb;
if (E0!=0) begin
// eq. 61
beta0prime = beta0*(1+COX/(E0*`EPSSI)*qb0);
// eq. 62
beta = beta0prime/(1+COX/(E0*`EPSSI)*vt*abs(qb+nau*qi));
end else begin
// eq. 63
vpprime = 0.5*(vp+sqrt(`SQR(vp)+2*`SQR(vt)));
// eq. 64
beta = beta0/(1+THETA*vpprime);
end // else: !if(e0!=0)
// eq. 65
is = 2*n*beta*`SQR(vt);
// $strobe("beta0=%e beta0prime=%e beta=%e E0=%e qb0=%e qb=%e qi=%e",beta0,beta0prime,beta,E0,qb0,qb,qi);
// eq. 66
ids = is*(ifwd-irprime);
// eq. 67
vib = vd-vs-IBN*2*vdss;
// eq. 68
if (vib>0) begin
`expl((-ibb*lc)/vib,tmp)
idb = ids*IBA/ibb*vib*tmp;
end else
idb = 0;
// $strobe("ids=%e idb=%e",ids,idb);
if (mode>1) begin
if (isat_s>0) begin
if (-vs>vexp_s)
ibsj = IMAX+gexp_s*(-vs-vexp_s);
else begin
`expl(-vs/(N*vt),tmp)
ibsj = isat_s*(tmp-1);
end
end else
ibsj = 0;
if (isat_d>0) begin
if (-vd>vexp_d)
ibdj = IMAX+gexp_d*(-vd-vexp_d);
else begin
`expl(-vd/(N*vt),tmp)
ibdj = isat_d*(tmp-1);
end
end else
ibdj = 0;
end else begin // if (mode>1)
if (isat_s>0) begin
if (-vd>vexp_s)
ibsj = IMAX+gexp_s*(-vd-vexp_s);
else begin
`expl(-vd/(N*vt),tmp)
ibsj = isat_s*(tmp-1);
end
end else
ibsj = 0;
if (isat_d>0) begin
if (-vs>vexp_d)
ibdj = IMAX+gexp_d*(-vs-vexp_d);
else begin
`expl(-vs/(N*vt),tmp)
ibdj = isat_d*(tmp-1);
end
end else
ibdj = 0;
end // else: !if(mode>1)
qdt = coxt*vt*qd;
qst = coxt*vt*qs;
qgt = coxt*vt*qg;
qbt = coxt*vt*qb;
cbs = 0;
cbd = 0;
if (cbs0>0) begin
if (MTYPE*V(b,si)>FC*PB)
cbs = cbs+cbs0/pow(1-FC,MJ)*(1+MJ*(MTYPE*V(b,si)-PB*FC))/(PB*(1-FC));
else
cbs = cbs+cbs0/pow(1-MTYPE*V(b,si),MJ);
end
if (cbd0>0) begin
if (MTYPE*V(b,di)>FC*PB)
cbd = cbd+cbd0/pow(1-FC,MJ)*(1+MJ*(MTYPE*V(b,di)-PB*FC))/(PB*(1-FC));
else
cbd = cbd+cbd0/pow(1-MTYPE*V(b,di),MJ);
end
if (cbs0sw>0) begin
if (MTYPE*V(b,si)>FCSW*PBSW)
cbs = cbs+cbs0sw/pow(1-FCSW,MJSW)*(1+MJSW*(MTYPE*V(b,si)-PBSW*FCSW))/(PBSW*(1-FCSW));
else
cbs = cbs+cbs0sw/pow(1-MTYPE*V(b,si),MJSW);
end
if (cbd0sw>0) begin
if (MTYPE*V(b,di)>FCSW*PBSW)
cbd = cbd+cbd0sw/pow(1-FCSW,MJSW)*(1+MJSW*(MTYPE*V(b,di)-PBSW*FCSW))/(PBSW*(1-FCSW));
else
cbd = cbd+cbd0sw/pow(1-MTYPE*V(b,di),MJSW);
end
end //Bias-dependent model evaluation
begin //Define branch sources
I(di,si) <+ MTYPE*mode*ids;
if (mode>0) begin
I(di,b) <+ MTYPE*idb;
I(di,g) <+ MTYPE*ddt(qdt);
I(si,g) <+ MTYPE*ddt(qst);
end else begin
I(si,b) <+ MTYPE*idb;
I(si,g) <+ MTYPE*ddt(qdt);
I(di,g) <+ MTYPE*ddt(qst);
end // else: !if(mode>0)
I(b,si) <+ MTYPE*ibsj;
I(b,di) <+ MTYPE*ibdj;
I(b,g) <+ MTYPE*ddt(qbt);
I(g,si) <+ cgso*ddt(V(g,si));
I(g,di) <+ cgdo*ddt(V(g,di));
I(g,b) <+ cgbo*ddt(V(g,b));
if (RD>0)
I(d,di) <+ V(d,di)/rd;
else
V(d,di) <+ 0.0;
if (RS>0)
I(s,si) <+ V(s,si)/rs;
else
V(s,si) <+ 0.0;
I(b,si) <+ cbs*ddt(V(b,si));
I(b,di) <+ cbd*ddt(V(b,di));
end // begin
// `NOISE begin //Define noise sources
//
// end // noise
end //analog
endmodule

View File

@ -0,0 +1,72 @@
//
// simple capacitor model
// t R i C b
// o——/\/\/——o——| |——o
//
`include "constants.h"
`include "discipline.h"
`define P_CELCIUS0 273.15
`define TNOM (`P_CELCIUS0 + 27.0)
module r2_cmc(t, b);
inout t, b;
electrical t, b;
electrical i;
branch (t, i) R;
branch (i, b) C;
parameter real w = 1u from (0.1u : +inf);
parameter real l = 1u from (0.1u : +inf);
parameter real nc = 1 from [1:2];
parameter real rsh = 1 from (0 : +inf);
parameter real ca = 1f from (0 : +inf);
parameter real tcr = 0;
parameter real vc1 = 0;
parameter real vc2 = 0;
parameter real type = 0; // 0=n, 1=p
real dT, rsh_t, c, r, Ir, Qc, Ceff, pwrR;
analog begin : L
if ($port_connected(b) == 0)
$finish(113);
if ($param_given(tcr))
$finish(4);
if ($param_given(tcr))
$finish(4);
if (nc > 2)
$finish(0);
begin : initializeModel
dT = $temperature - `TNOM;
rsh_t = rsh*(1.0+tcr*dT);
end
begin : initializeInstance
c = w*l*ca*1e12; // unit conversion
if (nc > 1.5)
r = rsh_t*(w/l)/12;
else
r = rsh_t*(w/l)/3;
end
begin : evaluateStatic
Ir = V(R)/r;
end
begin : evaluateDynamic
if (type > 0.5) // inelegant
Qc = c*V(C)*(1-V(C)*(vc1/2-V(C)*vc2/3));
else
Qc = c*V(C)*(1+V(C)*(vc1/2+V(C)*vc2/3));
end
begin : loadStatic
I(R) <+ Ir;
end
begin : loadDynamic
I(C) <+ ddt(Qc);
end
begin : postProcess
if (type > 0.5)
Ceff = c*(1.0-V(C)*(vc1/2-V(C)/3));//error!
else
Ceff = c*(1.0+V(C)*(vc1/2+V(C)/3));//error!
pwrR = V(R)*Ir;
end
end // analog
endmodule

View File

@ -0,0 +1,886 @@
/* COPYRIGHT NOTE for HICUM Models
downloaded 17.03.2018 from
https://www.iee.et.tu-dresden.de/iee/eb/hic_new/hic_source.html
The terms under which the HICUM software is provided are as follows:
Software is distributed as is, completely without warranty or service support.
The Model Owner and his team members are not liable for the condition or
performance of the software.
Michael Schroter (Model Owner) owns the copyright but shall not be liable
for any infringement of copyright or other proprietary rights brought by
third parties against the users of the software.
The Model Owner hereby disclaims all implied warranties.
The Model Owner 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:
The users agree not to charge for the HICUM code itself but may charge
for additions, extensions, or support.
In any product based on the software, the users agree to acknowledge
the Model Owner that developed the software. This acknowledgment
shall appear in the product documentation.
The users agree to reproduce any copyright notice which appears on
the software on any copy or modification of such made available to
others.
*/
// HICUM Level_0 Version_1.12: A Verilog-A description
// (A simplified version of HICUM Level2 model for BJT)
// ## It is modified after the first version of HICUM/L0 code ##
// 12/08: Modifications for ngspice and adms2.2.7 DW
// Changed VT0 in Vt0 to prevent conflict in compiled C version.
// Made a temporary variable cjei_i for cjei output purpose only.
// Minor code related changes
// 03/08: Quick Fix: Default value of TFH has been changed from infinity to zero and modified the default value limits to [0, inf) to include zero
// 12/06: Upper limit of FGEO is changed to infinity
// 06/06: Thermal node "tnode" set as external
// Flag FLSH introduced for controlling Self-heating calculation
// all if-else blocks marked with begin-end
// all series resistors and RTH are allowed to have a minimum value MIN_R
// 07/06: QCJMOD deleted, QJMODF introduced along with with HICJQ
// ddx() operator used with QJMOD and QJMODF wherever needed
// aj is kept at 2.4 except BE depletion charge
// Substrate transistor transfer current added.
// Gmin added to (bi,ei) and (bi,ci) branches.
// hyperbolic smoothing used in rbi computation to avoid devide-by-zero.
// *********************************************************************************
// 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 interprete a zero branch voltage as NODE-COLLAPSING action.
// **********************************************************************************
//Default simulator: Spectre
`ifdef insideADMS
`define P(p) (*p*)
`define PGIVEN(p) $given(p)
`define INITIAL_MODEL @(initial_model)
`else
`define P(p)
`define PGIVEN(p) p
`define INITIAL_MODEL @(initial_step)
`endif
//ADS
//`include "constants.vams"
//`include "disciplines.vams"
//`include "compact.vams"
//Spectre
`include "constants.h"
`include "discipline.h"
`define NPN +1
`define PNP -1
`define VPT_thresh 1.0e2
`define EXPLIM 80.0
`define INF 1.0e6
`define TMAX 326.85
`define TMIN -100.0
`define MIN_R 0.001
//`define Gmin 1.0e-12
`define QCMODF(vj,cj0,vd,z,aj,cjf)\
if(cj0 > 0.0) begin\
vf = vd*(1.0-exp(-ln(aj)/z));\
xvf = (vf-vj)/VT;\
xvf2 = sqrt(xvf*xvf+1.921812);\
v_j = vf-VT*(xvf+xvf2)*0.5;\
dvj = 0.5*(xvf+xvf2)/xvf2;\
cjf = cj0*exp(-z*ln(1-v_j/vd))*dvj+aj*cj0*(1-dvj);\
end else begin\
cjf = 0.0;\
end
// DEPLETION CHARGE CALCULATION
// Hyperbolic smoothing used; no punch-through
`define QJMODF(vj,cj0,vd,z,aj,qjf)\
if(cj0 > 0.0) begin\
vf = vd*(1.0-exp(-ln(aj)/z));\
xvf = (vf-vj)/VT;\
xvf2 = sqrt(xvf*xvf+1.921812);\
v_j = vf-VT*(xvf+xvf2)*0.5;\
x = 1.0-z;\
y = 1.0-exp(x*ln(1.0-v_j/vd));\
qjf = cj0*vd*y/x+aj*cj0*(vj-v_j);\
end else begin\
qjf = 0.0;\
end
// Depletion Charge : with punch through
`define QJMOD(vj,cj0,vd,z,vpt,aj,qjf)\
if(cj0 > 0.0) begin\
zr = z/4.0;\
vp = vpt-vd;\
vf = vd*(1.0-exp(-ln(aj)/z));\
cmax = aj*cj0;\
cr = cj0*exp((z-zr)*ln(vd/vpt));\
a = VT;\
ve = (vf-vj)/a;\
if (ve <= `EXPLIM) begin\
ex1 = exp(ve);\
ee1 = 1.0+ex1;\
vj1 = vf-a*ln(ee1);\
end else begin\
vj1 = vj;\
end\
a = 0.1*vp+4.0*VT;\
vr = (vp+vj1)/a;\
if (vr <= `EXPLIM) begin\
ex1 = exp(vr);\
ee1 = 1.0+ex1;\
vj2 = -vp+a*ln(ee1);\
end else begin\
vj2 = vj1;\
end\
vj4 = vj-vj1;\
ez = 1.0-z;\
ezr = 1.0-zr;\
vdj1 = ln(1.0-vj1/vd);\
vdj2 = ln(1.0-vj2/vd);\
qj1 = cj0*(1.0-exp(vdj2*ez))/ez;\
qj2 = cr*(1.0-exp(vdj1*ezr))/ezr;\
qj3 = cr*(1.0-exp(vdj2*ezr))/ezr;\
qjf = (qj1+qj2-qj3)*vd+cmax*vj4;\
end else begin\
qjf = 0.0;\
end
// DEPLETION CHARGE CALCULATION SELECTOR:
// Dependent on junction punch-through voltage
// Important for collector related junctions
`define HICJQ(vj,cj0,vd,z,vpt,qjf)\
if(vpt < `VPT_thresh) begin\
`QJMOD(vj,cj0,vd,z,vpt,2.4,qjf)\
end else begin\
`QJMODF(vj,cj0,vd,z,2.4,qjf)\
end
//Temperature dependence of depletion capacitance parameters
`define TMPHICJ(cj0,vd,z,vg,cj0_t,vd_t)\
arg = 0.5*vd/Vt0;\
vdj0 = 2*Vt0*ln(exp(arg)-exp(-arg));\
vdjt = vdj0*qtt0+vg*(1-qtt0)-mg*VT*ln_qtt0;\
vd_t = vdjt+2*VT*ln(0.5*(1+sqrt(1+4*exp(-vdjt/VT))));\
cj0_t = cj0*exp(z*ln(vd/vd_t));
//Limiting exponential
`define LIN_EXP(le, arg)\
if(arg > 80) begin\
le = (1 + ((arg) - 80));\
arg = 80;\
end else begin\
le=1;\
end\
le = le*limexp(arg);
// IDEAL DIODE (WITHOUT CAPACITANCE):
// conductance not calculated
// 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 > 80) begin\
le = (1 + ((DIOY) - 80));\
DIOY = 80;\
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
module hic0_full (c,b,e,s,tnode);
//Node definitions
inout c,b,e,s,tnode;
electrical c `P(desc="external collector node");
electrical b `P(desc="external base node");
electrical e `P(desc="external emitter node");
electrical s `P(desc="external substrate node");
electrical ci `P(desc="internal collector node");
electrical bi `P(desc="internal base node");
electrical ei `P(desc="internal emitter node");
electrical tnode `P(desc="local temperature rise node");
//Branch definitions
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 (bi,ei) br_biei;
branch (bi,ci) br_bici;
branch (ci,ei) br_ciei;
branch (b,bi) br_bbi_i;
branch (b,bi) br_bbi_v;
branch (b,e) br_be;
branch (b,ci) br_bci;
branch (b,s) br_bs;
branch (s,ci) br_sci;
branch (tnode ) br_sht;
//
// Parameter initialization with default values
// Collector current
parameter real is = 1.0e-16 from [0:1] `P(spice:name="is" desc="(Modified) saturation current" m:factor="yes" unit="A");
parameter real mcf = 1.00 from (0:10] `P(spice:name="mcf" desc="Non-ideality coefficient of forward collector current");
parameter real mcr = 1.00 from (0:10] `P(spice:name="mcr" desc="Non-ideality coefficient of reverse collector current");
parameter real vef = `INF from (0:`INF] `P(spice:name="vef" desc="forward Early voltage (normalization volt.)" unit="V" default:value="infinity");
parameter real iqf = `INF from (0:`INF] `P(spice:name="iqf" desc="forward d.c. high-injection toll-off current" unit="A" m:factor="yes" default:value="infinity");
parameter real iqr = `INF from (0:`INF] `P(spice:name="iqr" desc="inverse d.c. high-injection roll-off current" unit="A" m:factor="yes" default:value="infinity");
parameter real iqfh = `INF from (0:`INF] `P(spice:name="iqfh" desc="high-injection correction current" unit="A" m:factor="yes");
parameter real tfh = 0.0 from [0:`INF) `P(spice:name="tfh" desc="high-injection correction factor" test:value="2e-9" m:factor="yes");
// Base current
parameter real ibes = 1e-18 from [0:1] `P(spice:name="ibes" desc="BE saturation current" unit="A" m:factor="yes");
parameter real mbe = 1.0 from (0:10] `P(spice:name="mbe" desc="BE non-ideality factor");
parameter real ires = 0.0 from [0:1] `P(spice:name="ires" desc="BE recombination saturation current" test:value="1e-16" unit="A" m:factor="yes");
parameter real mre = 2.0 from (0:10] `P(spice:name="mre" desc="BE recombination non-ideality factor");
parameter real ibcs = 0.0 from [0:1] `P(spice:name="ibcs" desc="BC saturation current" test:value="1e-16" unit="A" m:factor="yes");
parameter real mbc = 1.0 from (0:10] `P(spice:name="mbc" desc="BC non-ideality factor");
// BE depletion cap
parameter real cje0 = 1.0e-20 from (0:`INF) `P(spice:name="cje0" desc="Zero-bias BE depletion capacitance" unit="F" test:value="2e-14" m:factor="yes");
parameter real vde = 0.9 from (0:10] `P(spice:name="vde" desc="BE built-in voltage" unit="V");
parameter real ze = 0.5 from (0:1] `P(spice:name="ze" desc="BE exponent factor");
parameter real aje = 2.5 from [1:`INF) `P(spice:name="aje" desc="Ratio of maximum to zero-bias value");
// Transit time
parameter real t0 = 0.0 from [0:`INF) `P(spice:name="t0" desc="low current transit time at Vbici=0" test:value="5e-12" unit="s");
parameter real dt0h = 0.0; // from [0:`INF) `P(spice:name="dt0h" desc="Base width modulation contribution" test:value="2e-12" unit="s");
parameter real tbvl = 0.0 from [0:`INF) `P(spice:name="tbvl" desc="SCR width modulation contribution" test:value="4e-12" unit="s");
parameter real tef0 = 0.0 from [0:`INF) `P(spice:name="tef0" desc="Storage time in neutral emitter" test:value="1e-12" unit="s");
parameter real gte = 1.0 from (0:10] `P(spice:name="gte" desc="Exponent factor for emmiter transit time");
parameter real thcs = 0.0 from [0:`INF) `P(spice:name="thcs" desc="Saturation time at high current densities" test:value="3e-11" unit="s");
parameter real ahc = 0.1 from (0:10] `P(spice:name="ahc" desc="Smoothing facor for current dependence");
parameter real tr = 0.0 from [0:`INF) `P(spice:name="tr" desc="Storage time at inverse operation" unit="s");
// Critical current
parameter real rci0 = 150 from (0:`INF) `P(spice:name="rci0" desc="Low-field collector resistance under emitter" test:value="50" unit="Ohm" m:inverse_factor="yes");
parameter real vlim = 0.5 from (0:10] `P(spice:name="vlim" desc="Voltage dividing ohmic and satur.region" unit="V");
parameter real vpt = 100 from (0:100] `P(spice:name="vpt" desc="Punch-through voltage" test:value="10" unit="V" default="infinity");
parameter real vces = 0.1 from [0:1] `P(spice:name="vces" desc="Saturation voltage" unit="V");
// BC depletion cap intern
parameter real cjci0 = 1.0e-20 from (0:`INF) `P(spice:name="cjci0" desc="Total zero-bias BC depletion capacitance" test:value="1e-15" unit="F" m:factor="yes");
parameter real vdci = 0.7 from (0:10] `P(spice:name="vdci" desc="BC built-in voltage" test:value="0.7" unit="V");
parameter real zci = 0.333 from (0:1] `P(spice:name="zci" desc="BC exponent factor" test:value="0.4");
parameter real vptci = 100 from (0:100] `P(spice:name="vptci" desc="Punch-through voltage of BC junction" test:value="50" unit="V");
// BC depletion cap extern
parameter real cjcx0 = 1.0e-20 from [0:`INF) `P(spice:name="cjcx0" desc="Zero-bias external BC depletion capacitance" unit="F" test:value="1e-15" m:factor="yes");
parameter real vdcx = 0.7 from (0:10] `P(spice:name="vdcx" desc="External BC built-in voltage" unit="V");
parameter real zcx = 0.333 from (0:1] `P(spice:name="zcx" desc="External BC exponent factor");
parameter real vptcx = 100 from (0:100] `P(spice:name="vptcx" desc="Punch-through voltage" unit="V" test:value="5.0" default="infinity");
parameter real fbc = 1.0 from [0:1] `P(spice:name="fbc" desc="Split factor = Cjci0/Cjc0" test:value="0.5");
// Base resistance
parameter real rbi0 = 0.0 from [0:`INF) `P(spice:name="rbi0" desc="Internal base resistance at zero-bias" test:value="100" unit="Ohm" m:inverse_factor="yes");
parameter real vr0e = 2.5 from (0:`INF] `P(spice:name="vr0e" desc="forward Early voltage (normalization volt.)" unit="V");
parameter real vr0c = `INF from (0:`INF] `P(spice:name="vr0c" desc="forward Early voltage (normalization volt.)" unit="V" default="infinity" test:value="25.0");
parameter real fgeo = 0.656 from [0:`INF] `P(spice:name="fgeo" desc="Geometry factor" test:value="0.73");
// Series resistances
parameter real rbx = 0.0 from [0:`INF) `P(spice:name="rbx" desc="External base series resistance" test:value="8.8" unit="Ohm" m:inverse_factor="yes");
parameter real rcx = 0.0 from [0:`INF) `P(spice:name="rcx" desc="Emitter series resistance" test:value="12.5" unit="Ohm" m:inverse_factor="yes");
parameter real re = 0.0 from [0:`INF) `P(spice:name="re" desc="External collector series resistance" test:value="9.16" unit="Ohm" m:inverse_factor="yes");
// Substrate transfer current, diode current and cap
parameter real itss = 0.0 from [0:1.0] `P(spice:name="itss" desc="Substrate transistor transfer saturation current" unit="A" test:value="1e-17" m:factor="yes");
parameter real msf = 1.0 from (0:10] `P(spice:name="msf" desc="Substrate transistor transfer current non-ideality factor");
parameter real iscs = 0.0 from [0:1.0] `P(spice:name="iscs" desc="SC saturation current" unit="A" test:value="1e-17" m:factor="yes");
parameter real msc = 1.0 from (0:10] `P(spice:name="msc" desc="SC non-ideality factor");
parameter real cjs0 = 1.0e-20 from [0:`INF) `P(spice:name="cjs0" desc="Zero-bias SC depletion capacitance" unit="F" test:value="1e-15" m:factor="yes");
parameter real vds = 0.3 from (0:10] `P(spice:name="vds" desc="SC built-in voltage" unit="V");
parameter real zs = 0.3 from (0:1] `P(spice:name="zs" desc="External SC exponent factor");
parameter real vpts = 100 from (0:100] `P(spice:name="vpts" desc="SC punch-through voltage" unit="V" test:value="5.0" default="infinity");
// Parasitic caps
parameter real cbcpar = 0.0 from [0:`INF) `P(spice:name="cbcpar" desc="Collector-base isolation (overlap) capacitance" unit="F" m:factor="yes" test:value="1e-15");
parameter real cbepar = 0.0 from [0:`INF) `P(spice:name="cbepar" desc="Emitter-base oxide capacitance" unit="F" m:factor="yes" test:value="2e-15");
// BC avalanche current
parameter real eavl = 0.0 from [0:inf) `P(spice:name="eavl" desc="Exponent factor" test:value="1e-14");
parameter real kavl = 0.0 from [0:`INF) `P(spice:name="kavl" desc="Prefactor" test:value="1.19");
// Flicker noise
parameter real kf = 0.0 from [0:`INF) `P(spice:name="kf" desc="flicker noise coefficient" unit="M^(1-AF)");
parameter real af = 2.0 from (0:10] `P(spice:name="af" desc="flicker noise exponent factor");
// Temperature dependance
parameter real vgb = 1.2 from (0:10] `P(spice:name="vgb" desc="Bandgap-voltage" unit="V" test:value="1.17");
parameter real vge = 1.17 from (0:10] `P(spice:name="vge" desc="Effective emitter bandgap-voltage" unit="V" test:value="1.07");
parameter real vgc = 1.17 from (0:10] `P(spice:name="vgc" desc="Effective collector bandgap-voltage" unit="V" test:value="1.14");
parameter real vgs = 1.17 from (0:10] `P(spice:name="vgs" desc="Effective substrate bandgap-voltage" unit="V" test:value="1.17");
parameter real f1vg =-1.02377e-4 `P(spice:name="f1vg" desc="Coefficient K1 in T-dependent bandgap equation" unit="V/K");
parameter real f2vg = 4.3215e-4 `P(spice:name="f2vg" desc="Coefficient K2 in T-dependent bandgap equation" unit="V/K");
parameter real alt0 = 0.0 `P(spice:name="alt0" desc="Frist-order TC of tf0" unit="1/K");
parameter real kt0 = 0.0 `P(spice:name="kt0" desc="Second-order TC of tf0" unit="1/K^2");
parameter real zetact = 3.0 `P(spice:name="zetact" desc="Exponent coefficient in transfer current temperature dependence" test:value="3.5");
parameter real zetabet = 3.5 `P(spice:name="zetabet" desc="Exponent coefficient in BE junction current temperature dependence" test:value="4.0");
parameter real zetaci = 0.0 `P(spice:name="zetaci" desc="TC of epi-collector diffusivity" test:value="1.6");
parameter real alvs = 0.0 `P(spice:name="alvs" desc="Relative TC of satur.drift velocity" unit="1/K" test:value="1e-3");
parameter real alces = 0.0 `P(spice:name="alces" desc="Relative TC of vces" unit="1/K" test:value="4e-4");
parameter real zetarbi = 0.0 `P(spice:name="zetarbi" desc="TC of internal base resistance" test:value="0.6");
parameter real zetarbx = 0.0 `P(spice:name="zetarbx" desc="TC of external base resistance" test:value="0.2");
parameter real zetarcx = 0.0 `P(spice:name="zetarcx" desc="TC of external collector resistance" test:value="0.2");
parameter real zetare = 0.0 `P(spice:name="zetare" desc="TC of emitter resistances");
parameter real alkav = 0.0 `P(spice:name="alkav" desc="TC of avalanche prefactor" unit="1/K");
parameter real aleav = 0.0 `P(spice:name="aleav" desc="TC of avalanche exponential factor" unit="1/K");
// Self-heating
parameter integer flsh = 0 from [0:2] `P(spice:name="flsh" desc="Flag for self-heating calculation" test:value="2");
parameter real rth = 0.0 from [0:`INF) `P(spice:name="rth" desc="Thermal resistance" test:value="200.0" unit="K/W" m:inverse_factor="yes");
parameter real cth = 0.0 from [0:`INF) `P(spice:name="cth" desc="Thermal capacitance" test:value="0.1" unit="Ws/K" m:factor="yes");
// Transistor type
parameter integer npn = 1 from [0:1] `P(spice:isflag="yes" desc="model type flag for npn" );
parameter integer pnp = 0 from [0:1] `P(desc="model type flag for pnp" );
//Circuit simulator specific parameters
parameter real tnom = 27 `P(spice:name="tnom" desc="Temperature for which parameters are valid" unit="C");
parameter real dt = 0.0 `P(spice:name="dt" type="instance" desc="Temperature change for particular transistor" unit="K");
// Declaration of the variables: begin
real HICUMtype `P(spice:name="type" /* desc="Device type from npn or pnp flags" unit="no" */);
// QCJMOD
real cj0,vd,z,aj;
real zr,vp;
real cmax,cr,ve;
real ee1,ez,ezr,vdj1,vdj2,ex1,vr,vj1,vj2,vj4;
real qj1,qj2,qj3,qjf;
//Cjfun *** VT, removed: BA
real cj1,cj2,cj3,cjf;
//cjtfun *** tnom,VT,mg,Vt0, removed: BA
real vg;
real vdj0,vdjt,cj0_t,vd_t,aj_t;
// temperature and drift
real VT,Tamb,Tdev,Tnom,dT,qtt0,ln_qtt0;
real vde_t,vdci_t,vdcx_t,vds_t;
real is_t,ires_t,ibes_t,ibcs_t;
real itss_t,iscs_t,cje0_t,cjci0_t,cjcx0_t;
real cjs0_t,rci0_t,vlim_t;
real vces_t,thcs_t,tef0_t,rbi0_t;
real rbx_t,rcx_t,re_t,t0_t,eavl_t,kavl_t;
real aje_t;
// bc charge and cap
real qjci `P(desc="B-C internal junction charge" unit="C");
real qjcx,qjcii,cjcii,qjcxi,qjciii; //cjcx
real cjci0_t_ii,cjcx0_t_ii,cjcx0_t_i,v_j;
// be junction
real qjei `P(desc="B-E internal junction charge" unit="C");
real cjei_i `P(desc="B-E internal junction capacitance" unit="F"); // dw: adms2.2.7 problem
real cjei,vf,vj,x,y,e1,e2;
// transfer and internal base current
real cc,qj_2,facl;
real tf0,ickf,ickr,itfi,itri,qm;
real qpt,itf,itr;
real it `P(desc="Transfer Current" unit="A");
real ibe,ire,ibi;
real itfl,itrl,al,s3l,wl,d_qfh;
// be diffusion charge
real qf,qf0,dqfh,dqef;
real dtef,dtfh,tf,ick;
real vc,vceff,s3,w,a,tww;
// bc diffusion charge
real qr;
// avalanche current source
real v_bord,a_iavl,lncc;
// base resistance
real rb,eta,rbi,qje,Qz_nom,fQz;
// substrate transistor, diode and cap
real qjs,HSa,HSb,HSI_Tsu,HSUM;
// self heating
real pterm;
// new for temperature dependence
real mg,zetabci,zetasct,zetatef,avs;
real k1,k2,vgbe,vgbc,vgsc,dvg;
real xvf,xvf2,dvj,uvc,Vt0;
// noise
real flicker_Pwr,fourkt,twoq;
// LIN_EXP
real le,arg,le1,arg1,le2,arg2;
//HICDIO
real IS,IST,UM1,U,Iz,DIOY;
// branch voltages
real Vbci,Vbici,Vbiei,Vciei,Vsci,Veie,Vbbi,Vcic,Vbe,Vrth;
//Output to be seen
real ijbc `P(desc="Base-collector diode current" unit="A");
real iavl `P(desc="Avalanche current" unit="A");
real ijsc `P(desc="Substrate-collector diode current" unit="A");
real Ieei `P(desc="Current through external to internal emitter node" unit="A");
real Icci `P(desc="Current through external to internal collector node" unit="A");
real Ibbi `P(desc="Current through external to internal base node" unit="A");
real Ibici `P(desc="Base-collector diode current minus the avalanche current" unit="A");
real ijbe `P(desc="Base-emitter diode current" unit="A");
real Qbci,Qbe,Qbici,Qbiei;
//Declaration of the variables: end
//
//======================== calculation of the transistor ===================
//
analog begin
// assign voltages with regard to transistor type
`INITIAL_MODEL
begin
if (`PGIVEN(npn))
HICUMtype = `NPN;
else if (`PGIVEN(pnp))
HICUMtype = `PNP;
else
HICUMtype = `NPN;
end
Vbci = HICUMtype*V(br_bci);
Vbici = HICUMtype*V(br_bici);
Vbiei = HICUMtype*V(br_biei);
Vciei = HICUMtype*V(br_ciei);
Vsci = HICUMtype*V(br_sci);
Veie = V(br_eie_v);
Vcic = V(br_cic_v);
Vbbi = V(br_bbi_v);
Vbe = HICUMtype*V(br_be);
Vrth = V(br_sht);
//
// temperature and resulting parameter drift
//
Tnom = tnom+273.15;
Tamb = $temperature;
Tdev = Tamb+dt+Vrth;
// Limit temperature to avoid FPE's 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
Vt0 = `P_K*Tnom /`P_Q;
VT = `P_K*Tdev /`P_Q;
dT = Tdev-Tnom;
qtt0 = Tdev/Tnom;
ln_qtt0 = ln(qtt0);
k1 = f1vg*Tnom;
k2 = f2vg*Tnom+k1*ln(Tnom);
avs = alvs*Tnom;
vgbe = (vgb+vge)/2;
vgbc = (vgb+vgc)/2;
vgsc = (vgs+vgc)/2;
mg = 3-`P_Q*f1vg/`P_K;
zetabci = mg+1-zetaci;
zetasct = mg-1.5; //+1-m_upS with m_upS=2.5
is_t = is*exp(zetact*ln_qtt0+vgb/VT*(qtt0-1));
ibes_t = ibes*exp(zetabet*ln_qtt0+vge/VT*(qtt0-1));
ires_t = ires*exp(0.5*mg*ln_qtt0+0.5*vgbe/VT*(qtt0-1));
ibcs_t = ibcs*exp(zetabci*ln_qtt0+vgc/VT*(qtt0-1));
itss_t = itss*exp(zetasct*ln_qtt0+vgc/VT*(qtt0-1));
iscs_t = iscs*exp(zetasct*ln_qtt0+vgs/VT*(qtt0-1));
`TMPHICJ(cje0,vde,ze,vgbe,cje0_t,vde_t)
aje_t = aje*vde_t/vde;
`TMPHICJ(cjci0,vdci,zci,vgbc,cjci0_t,vdci_t)
`TMPHICJ(cjcx0,vdcx,zcx,vgbc,cjcx0_t,vdcx_t)
`TMPHICJ(cjs0,vds,zs,vgsc,cjs0_t,vds_t)
rci0_t = rci0*exp(zetaci*ln_qtt0);
vlim_t = vlim*exp((zetaci-avs)*ln_qtt0);
vces_t = vces*(1+alces*dT);
t0_t = t0*(1+alt0*dT+kt0*dT*dT);
thcs_t = thcs*exp((zetaci-1)*ln_qtt0);
zetatef = zetabet-zetact-0.5;
dvg = vgb-vge;
tef0_t = tef0*exp(zetatef*ln_qtt0-dvg/VT*(qtt0-1));
rbx_t = rbx*exp(zetarbx*ln_qtt0);
rcx_t = rcx*exp(zetarcx*ln_qtt0);
rbi0_t = rbi0*exp(zetarbi*ln_qtt0);
re_t = re*exp(zetare*ln_qtt0);
eavl_t = eavl*exp(aleav*dT);
kavl_t = kavl*exp(alkav*dT);
//
// Calculation of intrinsic transistor elements
//
// BC charge and cap (internal and external)
// The cjcx0 value is used to switch between one (cjcx0=0) and two bc parameter sets
// 1. For one parameter set only the internal bc set is partitioned by fbc
// 2. For two independent sets only the external set is partitioned by fbc
if (cjcx0_t==0) begin
cjci0_t_ii = cjci0_t*fbc; // zero bias internal portion
qjcxi = 0;
cjcx0_t_i = cjci0_t*(1-fbc); // zero bias external portion
`HICJQ(Vbci,cjcx0_t_i,vdci_t,zci,vptci,qjcx)
end else begin
cjci0_t_ii = cjci0_t; // zero bias internal portion
cjcx0_t_ii = cjcx0_t*fbc;
`HICJQ(Vbici,cjcx0_t_ii,vdcx_t,zcx,vptcx,qjcxi)
cjcx0_t_i = cjcx0_t*(1-fbc); // zero bias external portion
`HICJQ(Vbci,cjcx0_t_i,vdcx_t,zcx,vptcx,qjcx)
end
`HICJQ(Vbici,cjci0_t_ii,vdci_t,zci,vptci,qjci)
qjcii = qjci+qjcxi;
//Internal bc cap without punch through for cc
//`HICJQ(Vbici,cjci0_t_ii,vdci_t,zci,100,qjciii)
`QCMODF(Vbici,cjci0_t_ii,vdci_t,zci,2.4,cjcii)
//cjcii = ddx(qjciii,V(bi));
//Internal be cap and charge
`QJMODF(Vbiei,cje0_t,vde_t,ze,aje_t,qjei)
cjei = ddx(qjei,V(bi));
cjei_i = cjei; // dw: adms2.2.7 problem
// Critical current: ick
vc = Vciei-vces_t;
uvc = vc/VT-1;
vceff = VT*(1+0.5*(uvc+sqrt(uvc*uvc+1.921812)));
x = (vceff-vlim_t)/vpt;
ick = vceff*(1+0.5*(x+sqrt(x*x+1e-3)))/rci0_t/sqrt(1+vceff*vceff/vlim_t/vlim_t);
// Transfer current
// Normalized BC cap and carge
cc = cjci0_t_ii/cjcii;
qjci = qjci/cjci0_t_ii;
qj_2 = (1+qjci/vef)/2;
// Minority charge transit time
tf0 = t0_t+dt0h*(cc-1)+tbvl*(1/cc-1);
// DC critical currents
ickf = iqf;
ickr = iqr;
// Ideal transfer currents
arg1 = Vbiei/(mcf*VT);
`LIN_EXP(le1,arg1)
itfi=is_t*le1;
arg2 = Vbici/(mcr*VT);
`LIN_EXP(le2,arg2)
itri=is_t*le2;
// Normalized minority charge
qm = (itfi/ickf+itri/ickr);
// Normalized total hole charge
qpt = qj_2+sqrt((qj_2)*(qj_2)+qm);
if (qpt<=1e-20) begin
qpt=1e-20;
end
// Low transfer current
itfl = itfi/qpt;
itrl = itri/qpt;
// Normalized injection width with low transfer current
// and normalized charge component
if (itfl<=1e-20) begin
itfl = 1e-20;
end
al = 1-ick/itfl;
s3l = sqrt(al*al+ahc);
wl = (al+s3l)/(1+sqrt(1+ahc));
d_qfh = (wl*wl+tfh*itfl/ick)*itfl/iqfh;
// Transfer current
facl = 1/(1+d_qfh/qpt);
itf = itfl*facl;
itr = itrl*facl;
if (itf<=1e-20) begin
itf = 1e-20;
end
it = itf-itr;
// BE diffusion charge
// Calculation of low-current portion
qf0 = tf0*itf;
// Current dependent component
a = 1-ick/itf;
s3 = sqrt(a*a+ahc);
w = (a+s3)/(1+sqrt(1+ahc));
tww = thcs_t*w*w;
dqfh = tww*itf;
dtfh = tww*(1+2*ick/itf/s3);
// Emitter component
dtef = tef0_t*exp(gte*ln(itf/ick));
dqef = dtef*itf/(gte+1.0);
// Total minority charge and transit time
qf = qf0+dqef+dqfh;
tf = tf0+dtfh+dtef;
// BC diffusion charge
qr = tr*itr;
// Internal base current
// BE diode
`HICDIO(ibes,ibes_t,mbe,Vbiei,ibe)
`HICDIO(ires,ires_t,mre,Vbiei,ire)
ijbe = ibe+ire;
// BC diode
`HICDIO(ibcs,ibcs_t,mbc,Vbici,ijbc)
// Total base current
ibi = ijbe+ijbc;
// Avalanche current
if (Vbici < 0) begin : HICAVL
v_bord = eavl_t*vdci_t;
if (vdci_t-Vbici>v_bord) begin
a_iavl = kavl_t/vdci_t*exp(-cc);
iavl = itf*a_iavl*(v_bord+(1+cc)*(vdci_t-Vbici-v_bord));
end else begin
lncc = ln(1/cc);
iavl = kavl_t*itf*exp(-1/zci*lncc-eavl_t*exp((1/zci-1)*lncc));
end
end else begin
iavl = 0;
end
//
// Additional elements for external transistor
//
// Base resistance
if(rbi0_t > 0.0) begin : HICRBI
// Conductivity modulation with hyperbolic smoothing
qje = qjei/cje0_t;
Qz_nom = 1+qje/vr0e+qjci/vr0c+itf/ickf+itr/ickr;
fQz = 0.5*(Qz_nom+sqrt(Qz_nom*Qz_nom+0.01));;
rbi = rbi0_t/fQz;
// Emitter current crowding
if (ibi > 0.0) begin
eta = fgeo*rbi*ibi/VT;
if (eta < 1e-6) begin
rbi = rbi*(1-0.5*eta);
end else begin
rbi = rbi*ln(eta+1)/eta;
end
end
end else begin
rbi = 0.0;
end
// Total base resistance
rb = rbi+rbx_t;
// Parasitic substrate transistor transfer current
if(itss > 0.0) begin : Sub_Transfer
HSUM = msf*VT;
HSa = limexp(Vbci/HSUM);
HSb = limexp(Vsci/HSUM);
HSI_Tsu = itss_t*(HSa-HSb);
end else begin
HSI_Tsu = 0.0;
end
// Substrate diode and cap and charge
`HICDIO(iscs,iscs_t,msc,Vsci,ijsc)
`HICJQ(Vsci,cjs0_t,vds_t,zs,vpts,qjs)
// Self heating
if (flsh == 1 && rth >= `MIN_R) begin
pterm = it*Vciei+iavl*(vdci_t-Vbici);
end else if (flsh == 2 && rth >= `MIN_R) begin
pterm = Vciei*it + (vdci_t-Vbici)*iavl + ijbe*Vbiei + ijbc*Vbici + ijsc*Vsci;
if (rb >= `MIN_R) begin
pterm = pterm + Vbbi*Vbbi/rb;
end
if (re_t >= `MIN_R) begin
pterm = pterm + Veie*Veie/re_t;
end
if (rcx_t >= `MIN_R) begin
pterm = pterm + Vcic*Vcic/rcx_t;
end
end
//
// Compute branch sources
//
Ibici = ijbc - iavl;
Qbci = cbcpar*Vbci;
Qbe = cbepar*Vbe;
Qbici = qjcii+qr;
Qbiei = qjei+qf;
ijsc = HICUMtype*ijsc;
qjs = HICUMtype*qjs;
qjcx = HICUMtype*qjcx;
Qbci = HICUMtype*Qbci;
Qbe = HICUMtype*Qbe;
Ibici = HICUMtype*Ibici;
Qbici = HICUMtype*Qbici;
ijbe = HICUMtype*ijbe;
Qbiei = HICUMtype*Qbiei;
it = HICUMtype*it;
//
// Define branch sources
//
I(br_biei) <+ $simparam("gmin")*V(br_biei);
I(br_bici) <+ $simparam("gmin")*V(br_bici);
I(br_bs) <+ HSI_Tsu;
I(br_sci) <+ ijsc + $simparam("gmin")*V(br_sci); //`P(spectre:gmin="add" spectre:pwl_passive="1e10");
I(br_sci) <+ ddt(qjs);
I(br_bci) <+ ddt(qjcx);
I(br_bci) <+ ddt(Qbci);
I(br_be) <+ ddt(Qbe);
if (re >= `MIN_R) begin
I(br_eie_i) <+ Veie/re_t + $simparam("gmin")*V(br_eie_i);//`P(spectre:gmin="add");
end else begin
V(br_eie_v) <+ 0.0;
end
if (rcx >= `MIN_R) begin
I(br_cic_i) <+ Vcic/rcx_t + $simparam("gmin")*V(br_cic_i);//`P(spectre:gmin="add");
end else begin
V(br_cic_v) <+ 0.0;
end
if (rbi0 >= `MIN_R || rbx >= `MIN_R) begin
I(br_bbi_i) <+ Vbbi/rb + $simparam("gmin")*V(br_bbi_i); //`P(spectre:gmin="add");
end else begin
V(br_bbi_v) <+ 0.0;
end
I(br_bici) <+ Ibici + $simparam("gmin")*V(br_bici); //`P(spectre:gmin="add" spectre:pwl_sat_current="IMAX" spectre:pwl_sat_cond="imax/0.025" spectre:pwl_rev_current="imax" spectre:pwl_rev_cond="IMAX/0.025");
I(br_bici) <+ ddt(Qbici);
I(br_biei) <+ ijbe + $simparam("gmin")*V(br_biei); //`P(spectre:gmin="add" spectre:pwl_fwd_current="IBEIS*exp(25.0)" spectre:pwl_fwd_node="bi" spectre:pwl_fwd_cond="IBEIS*exp(25.0)/0.025" spectre:pwl_sat_current="IMAX" spectre:pwl_sat_cond="IMAX/0.025" spectre:pwl_passive="1e10");
I(br_biei) <+ ddt(Qbiei);
I(br_ciei) <+ it `P(spectre:pwl_fwd_current="IS*exp(25.0)" spectre:pwl_fwd_node="bi" spectre:pwl_fwd_cond="IS*exp(25.0)/0.025" spectre:pwl_rev_current="IMAX" spectre:pwl_rev_cond="IMAX/0.025" spectre:pwl_passive="1e10");
// Following code is an intermediate solution:
// ******************************************
if(flsh == 0 || rth < `MIN_R) begin
I(br_sht) <+ Vrth/`MIN_R;
end else begin
I(br_sht) <+ Vrth/rth-pterm + $simparam("gmin")*V(br_sht);//`P(spectre:gmin="add");
I(br_sht) <+ ddt(cth*Vrth);
end
// ******************************************
// For simulators having no problem with V(br_sht) <+ 0.0
// with external thermal node, follwing code may be used.
// This external thermal node should remain accessible.
// ********************************************
//if(flsh == 0 || rth < `MIN_R) begin
// V(br_sht) <+ 0.0;
//end else begin
// I(br_sht) <+ Vrth/rth-pterm `P(spectre:gmin="add");
// I(br_sht) <+ ddt(cth*Vrth);
//end
// ********************************************
// Noise sources
// Thermal noise
fourkt = 4.0 * `P_K * Tdev;
if(rbx >= `MIN_R || rbi0 >= `MIN_R) begin
I(br_bbi_i) <+ white_noise(fourkt/rb);
end
if(rcx >= `MIN_R) begin
I(br_cic_i) <+ white_noise(fourkt/rcx_t);
end
if(re >= `MIN_R) begin
I(br_eie_i) <+ white_noise(fourkt/re_t);
end
// Shot noise
twoq = 2.0 * `P_Q;
I(br_biei) <+ white_noise(twoq*ijbe);
I(br_ciei) <+ white_noise(twoq*it);
// Flicker noise
flicker_Pwr = kf*pow(ijbe,af);
I(br_biei) <+ flicker_noise(flicker_Pwr,1.0);
end // analog
endmodule

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,47 @@
// Copyright (c) 2000-2007, NXP Semiconductors
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
INTELLECTUAL PROPERTY NOTICE, DISCLAIMER AND LICENSE
The Mextram model and documentation presented at this website,
denoted as the Model,
has been developed by NXP Semiconductors until 2007,
Delft University of Technology from 2007 to 2014,
and Auburn University since April 2015.
The Model is distributed as is, completely without any expressed
or implied warranty or service support.
NXP Semiconductors, Delft University of Technology,
Auburn University and their employees are not liable for
the condition or performance of the Model.
NXP Semiconductors, Delft University of Technology,
Auburn University own
the copyright and grant users a perpetual,
irrevocable, worldwide, non-exclusive, royalty-free
license with respect to the Model as set forth below.
NXP Semiconductors, Delft University of Technology, Auburn University
hereby disclaim all implied warranties.
NXP Semiconductors, Delft University of Technology, Auburn University
grant the users the right to modify, copy, and
redistribute the Model and documentation,
both within the user's organization and externally,
subject to the following restrictions
1. The users agree not to charge for the code
itself but may charge for additions, extensions, or support.
2. In any product based on the Model, the users agree to acknowledge
NXP Semiconductors, Delft University of Technology, Auburn University
that developed the Model. This acknowledgment
shall appear in the product documentation.
3. The users agree to obey all restrictions governing redistribution
or export of the Model.
4. The users agree to reproduce any copyright notice which appears
on the Model on any copy or modification of such made available
to others.

View File

@ -0,0 +1,54 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
`include "frontdef.inc"
`define SELFHEATING
`define SUBSTRATE
module bjt504tva (c, b, e, s, dt);
`ifdef insideADMS
`define P(p) (*p*)
`else
`define P(p)
`endif
// External ports
inout c, b, e, s, dt;
electrical c `P(desc="external collector node");
electrical b `P(desc="external base node");
electrical e `P(desc="external emitter node");
electrical s `P(desc="external substrate node");
electrical dt `P(desc="external thermal node");
// Internal nodes
electrical c1 `P(desc="internal collector node 1");
electrical e1 `P(desc="internal emitter node");
electrical b1 `P(desc="internal base node 1");
electrical b2 `P(desc="internal base node 2");
electrical c2 `P(desc="internal collector node 2");
electrical c3 `P(desc="internal collector node 3");
electrical c4 `P(desc="internal collector node 4");
// For correlated noise implementation
electrical noi `P(desc="internal noise node");
`include "parameters.inc"
`include "variables.inc"
//`include "opvars.inc"
analog begin
`include "initialize.inc"
`include "tscaling.inc"
`include "evaluate.inc"
`include "noise.inc"
//`include "opinfo.inc"
// The following can be used to print OP-info to std out:
// `include "op_print.inc"
end // analog
endmodule

View File

@ -0,0 +1,655 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Evaluate model equations
begin // Currents and charges
// Nodal biases
Vb2c1 = TYPE * V(b2, c1);
Vb2c2 = TYPE * V(b2, c2);
Vb2e1 = TYPE * V(b2, e1);
Vb1e1 = TYPE * V(b1, e1);
Vb1b2 = TYPE * V(b1, b2);
`ifdef SUBSTRATE
Vsc1 = TYPE * V(s, c1);
`endif
Vc1c2 = TYPE * V(c1, c2);
Vee1 = TYPE * V(e, e1);
Vbb1 = TYPE * V(b, b1);
Vbe = TYPE * V(b, e);
Vbc = TYPE * V(b, c);
/* RvdT, 03-12-2007, voltage differences
associated with distributed parasitic collector.
Evaluated taking values of resistances into account:
in case of vanishing resistance corresponding node
is not addressed: */
`ifdef insideADMS
//dw we have limited all the RCXXX to MIN_R
Vc4c1 = TYPE * V(c4, c1);
Vc3c4 = TYPE * V(c3, c4);
`else
if (RCBLX > 0.0)
begin
if (RCBLI > 0.0)
begin
Vc4c1 = TYPE * V(c4, c1);
Vc3c4 = TYPE * V(c3, c4);
end
else
begin
Vc4c1 = 0 ;
Vc3c4 = TYPE * V(c3, c1);
end
end
else
begin
if (RCBLI > 0.0)
begin
Vc4c1 = TYPE * V(c4, c1);
Vc3c4 = 0 ;
end
else
begin
Vc4c1 = 0 ;
Vc3c4 = 0 ;
end
end
`endif
Vb1c4 = Vb1b2 + Vb2c2 - Vc1c2 - Vc4c1 ;
Vcc3 = - Vbc + Vbb1 + Vb1c4 - Vc3c4 ;
Vbc3 = Vbc + Vcc3 ;
`ifdef SUBSTRATE
Vsc4 = Vsc1 - Vc4c1 ;
Vsc3 = Vsc4 - Vc3c4 ;
`endif
// Exponential bias terms
`expLin(eVb2c2,Vb2c2 * VtINV)
`expLin(eVb2e1,Vb2e1 * VtINV)
`expLin(eVb1e1,Vb1e1 * VtINV)
`expLin(eVb1c4,Vb1c4 * VtINV)
`expLin(eVb1b2,Vb1b2 * VtINV)
`expLin(eVbc3,Vbc3 * VtINV)
`ifdef SUBSTRATE
`expLin(eVsc1,Vsc1 * VtINV)
// RvdT MXT504.10, new: eVsc3, eVsc4
`expLin(eVsc3,Vsc3 * VtINV)
`expLin(eVsc4,Vsc4 * VtINV)
`endif
`expLin(eVbc3VDC,(Vbc3 - VDC_T) * VtINV)
`expLin(eVb1c4VDC,(Vb1c4 - VDC_T) * VtINV)
`expLin(eVb2c2VDC,(Vb2c2 - VDC_T) * VtINV)
`expLin(eVb2c1VDC,(Vb2c1 - VDC_T) * VtINV)
// Governing equations
// Epilayer model
K0 = sqrt(1.0 + 4.0 * eVb2c2VDC);
Kw = sqrt(1.0 + 4.0 * eVb2c1VDC);
pW = 2.0 * eVb2c1VDC / (1.0 + Kw);
// if (pW < `TEN_M40) pW = 0;
Ec = Vt * (K0 - Kw - ln((K0 + 1.0) / (Kw + 1.0)) );
Ic1c2 = (Ec + Vc1c2) / RCV_TM;
if (Ic1c2 > 0.0) begin
`linLog(tmpV,Vb2c1,100.0);
Vqs_th = VDC_T + 2.0 * Vt *
ln(0.5 * Ic1c2 * RCV_TM * VtINV + 1.0) - tmpV;
eps_VDC = 0.2 * VDC_T;
`max_hyp0(Vqs, Vqs_th, eps_VDC);
Iqs = Vqs * (Vqs + IHC_M * SCRCV_M) / (SCRCV_M * (Vqs + IHC_M * RCV_TM));
Ic1c2_Iqs = Ic1c2 / Iqs;
`max_logexp(alpha1, Ic1c2_Iqs, 1.0, AXI);
alpha = alpha1 / (1.0 + AXI * ln(1.0 + exp(-1.0 / AXI)));
vyi = Vqs / (IHC_M * SCRCV_M);
yi = (1.0 + sqrt(1.0 + 4.0 * alpha * vyi * (1.0 + vyi))) /
(2.0 * alpha * (1.0 + vyi));
//xi_w = 1.0 - yi / (1.0 + pW * yi);
// Niu 5/23/2015, fixes numerical discontinuity at forward/reverse transition, see "Epi layer model improvement of smoothness at I=0"
xi_w = (1.0 - yi + pW * yi) / (1.0 + pW * yi);
gp0 = 0.5 * Ic1c2 * RCV_TM * xi_w * VtINV;
gp0_help = 2.0 * gp0 + pW * (pW + gp0 + 1.0);
gp02 = 0.5 * (gp0 - 1.0);
sqr_arg = gp02 * gp02 + gp0_help;
if (gp0 >= 1.0)
p0star = gp02 + sqrt(sqr_arg);
else
p0star = gp0_help / (sqrt(sqr_arg) - gp02);
// if (p0star < `TEN_M40) p0star = 0.0;
eVb2c2star = p0star * (p0star + 1.0) * exp(VDC_T * VtINV);
B1 = 0.5 * SCRCV_M * (Ic1c2 - IHC_M);
B2 = SCRCV_M * RCV_TM * IHC_M * Ic1c2;
Vxi0 = B1 + sqrt(B1 * B1 + B2);
Vch = VDC_T * (0.1 + 2.0 * Ic1c2 / (Ic1c2 + Iqs));
Icap = IHC_M * Ic1c2 / (IHC_M + Ic1c2);
Icap_IHC = IHC_M / (IHC_M + Ic1c2);
end else begin
Iqs = 0.0 ;
p0star = 2.0 * eVb2c2VDC / (1.0 + K0);
eVb2c2star = eVb2c2;
if ((abs(Vc1c2) < 1.0e-5 * Vt) ||
(abs(Ec) < `TEN_M40 * Vt * (K0 + Kw)))
begin
pav = 0.5 * (p0star + pW);
xi_w = pav / (pav + 1.0);
end
else
begin
xi_w = Ec / (Ec + Vb2c2 - Vb2c1);
end
Vxi0 = Vc1c2;
Vch = 0.1 * VDC_T;
Icap = Ic1c2;
Icap_IHC = 1.0 - Icap / IHC_M;
end
// Effective emitter junction capacitance bias
Vfe = VDE_T * (1.0 - pow(`AJE , -1.0 / PE));
a_VDE = 0.1 * VDE_T;
`min_logexp(Vje, Vb2e1, Vfe, a_VDE);
// RvdT, November 2008, E0BE to be re-used in EB- Zener tunnel model:
E0BE = pow(1.0 - Vje * inv_VDE_T, 1.0 - PE) ;
Vte = VDE_T / (1.0 - PE) * (1.0 - E0BE) +
`AJE * (Vb2e1 - Vje);
// Effective collector junction capacitance bias
Vjunc = Vb2c1 + Vxi0;
bjc = (`AJC - XP_T) / (1.0 - XP_T);
Vfc = VDC_T * (1.0 - pow(bjc, -1.0 / PC));
`min_logexp(Vjc, Vjunc, Vfc, Vch);
fI = pow(Icap_IHC, MC);
Vcv = VDC_T / (1.0 - PC) * (1.0 - fI * pow(1.0 - Vjc / VDC_T, 1.0 - PC)) +
fI * bjc * (Vjunc - Vjc);
Vtc = (1.0 - XP_T) * Vcv + XP_T * Vb2c1;
// Transfer current
If0 = 4.0 * IS_TM / IK_TM;
f1 = If0 * eVb2e1;
n0 = f1 / (1.0 + sqrt(1.0 + f1));
f2 = If0 * eVb2c2star;
nB = f2 / (1.0 + sqrt(1.0 + f2));
if (DEG == 0.0)
q0I = 1.0 + Vte / VER_T + Vtc / VEF_T;
else
begin
termE = (Vte / VER_T + 1.0) * DEG_T * VtINV;
termC = -Vtc / VEF_T * DEG_T * VtINV;
q0I = (exp(termE) - exp(termC)) /
(exp(DEG_T * VtINV) - 1.0);
end
`max_hyp0(q1I, q0I, 0.1);
qBI = q1I * (1.0 + 0.5 * (n0 + nB));
Ir = IS_TM * eVb2c2star;
If = IS_TM * eVb2e1;
In = (If - Ir) / qBI;
// Base and substrate current(s)
Ibf0 = IS_TM / BF_T;
if (XREC == 0.0)
Ib1 = (1.0 - XIBI) * Ibf0 * (eVb2e1 - 1.0);
else
Ib1 = (1.0 - XIBI) * Ibf0 * ((1.0 - XREC) * (eVb2e1 - 1.0) +
XREC * (eVb2e1 + eVb2c2star - 2.0) * (1.0 + Vtc / VEF_T));
Ib1_s = XIBI * Ibf0 * (eVb1e1 - 1.0);
`expLin(tmpExp,Vb2e1 * VtINV / MLF)
Ib2 = IBF_TM * (tmpExp - 1.0) + $simparam("gmin") * Vb2e1;
`expLin(tmpExp,0.5 * Vb1c4 * VtINV)
Ib3 = IBR_TM * (eVb1c4 - 1.0) /
(tmpExp + exp(0.5 * VLR * VtINV)) +
$simparam("gmin") * Vb1c4;
// begin RvdT, November 2008, MXT504.8_alpha
// Base-emitter tunneling current
// max E-field E0BE calculated in BE depletion charge model:
if (IZEB > 0.0 && NZEB > 0.0 && Vb2e1 < 0)
begin
`expLin(eZEB, nZEB_T * (1 - (pow2_2mPE/(2.0*E0BE))))
// Force all derivatives at Vb2e1=0 to zero by using in DZEB a
// modified dE0BE expression for E0BE:
x = Vb2e1 * inv_VDE_T ;
dE0BE = pow(- x, -2.0-PE)*(PE*(1-PE*PE-3*x*(PE-1))-6*x*x*(PE-1+x)) * `one_sixth ;
`expLin(edZEB, Vb2e1 * pow2_2mPE * nZEB_T / (VGZEB_T * dE0BE ))
DZEB = - Vb2e1 - VGZEB_T * dE0BE * (1 - edZEB) / (pow2_2mPE * nZEB_T) ;
Izteb = 2.0 * IZEB_TM * DZEB * E0BE * eZEB * inv_VDE_T * pow2_PEm2 ;
end
else
begin
DZEB = 0 ;
Izteb = 0 ;
end
// end RvdT, November 2008, MXT504.8_alpha
// Iex, Isub (XIex, XIsub)
g1 = If0 * eVb1c4;
g2 = 4.0 * eVb1c4VDC;
// nBex until and including MXT 504.9:
// nBex = g1 / (1.0 + sqrt(1.0 + g1));
// nBex since MXT 504.10.1: Ackn. Jos Peters, Geoffrey Coram
nBex = (g1 - If0) / (1.0 + sqrt(1.0 + g1));
pWex = g2 / (1.0 + sqrt(1.0 + g2));
// Iex until and including MXT 504.9:
// Iex = (1.0 / BRI_T) * (0.5 * IK_TM * nBex - IS_TM);
//
// Iex since MXT 504.10: RvdT@TUDelft Q1, 2011:
Iex = IK_TM * nBex / (2.0 * BRI_T) ;
`ifdef SUBSTRATE
// RvdT MXT504.10, new term: eVsc4
if (EXSUB == 1.0)
Isub = 2.0 * ISS_TM * (eVb1c4 - eVsc4) /
(1.0 + sqrt(1.0 + 4.0 * (IS_TM / IKS_TM) * eVb1c4));
else
Isub = 2.0 * ISS_TM * (eVb1c4 - 1.0) /
(1.0 + sqrt(1.0 + 4.0 * (IS_TM / IKS_TM) * eVb1c4));
// until504.8: Isf = ISS_TM * (eVsc1 - 1.0);
// New 504.9:
if (ICSS < 0.0)
// this clause is to implement backwards compatibility
begin
Isf = ISS_TM * (eVsc1 - 1.0);
end
else
begin
Isf = ICSS_TM * (eVsc1 - 1.0);
end
// End: New 504.9.
`endif
XIex =0.0;
`ifdef SUBSTRATE
XIsub = 0.0;
`endif
// begin: RvdT, Q4 2012, Mextram 504.11: added EXMOD=2 option:
if (EXMOD == 1 || EXMOD == 2)
begin
Iex = Iex * Xext1;
`ifdef SUBSTRATE
Isub = Isub * Xext1;
`endif
Xg1 = If0 * eVbc3;
// XnBex until and including MXT 504.9:
// XnBex = Xg1 / (1.0 + sqrt(1.0 + Xg1));
// XnBex in MXT 504.10.1: Ackn. Jos Peters, Geoffrey Coram:
XnBex = (Xg1 - If0) / (1.0 + sqrt(1.0 + Xg1));
// XIMex until and including MXT 504.9:
// XIMex = XEXT * (0.5 * IK_TM * XnBex - IS_TM) / BRI_T;
//
// XIMex in MXT 504.10: RvdT@TUDelft Q1, 2011:
XIMex = XEXT * 0.5 * IK_TM * XnBex / BRI_T;
`ifdef SUBSTRATE
// RvdT MXT504.10, new term: eVsc3
if (EXSUB == 1.0)
XIMsub = XEXT * 2.0 * ISS_TM * (eVbc3 - eVsc3) /
(1.0 + sqrt(1.0 + 4.0 * IS_T / IKS_T * eVbc3));
else
XIMsub = XEXT * 2.0 * ISS_TM * (eVbc3 - 1.0) /
(1.0 + sqrt(1.0 + 4.0 * IS_T / IKS_T * eVbc3));
`else
XIMsub = 0.0;
`endif
if (EXMOD == 1)
begin
`ifdef SUBSTRATE
Vex_bias = XEXT * (IS_TM / BRI_T + ISS_TM) * RCCxx_TM;
`else
Vex_bias = XEXT * (IS_TM / BRI_T) * RCCxx_TM;
`endif
Vex = Vt * (2.0 - ln( Vex_bias * VtINV));
vdif = Vbc3 - Vex;
`max_hyp0(VBex, vdif, 0.11);
Fex = VBex /(Vex_bias + (XIMex + XIMsub) * RCCxx_TM + VBex);
end
else
begin
Vex = 0.0 ;
vdif = 0.0 ;
VBex = 0.0 ;
Fex = 1.0 ;
end
/* end: RvdT, Q4, 2012, Mextram 504.11: added EXMOD=2 option: */
XIex = Fex * XIMex;
`ifdef SUBSTRATE
XIsub = Fex * XIMsub;
`endif
end
else
begin
Fex = 0;
XnBex = 0 ;
end
// Variable base resistance
q0Q = 1.0 + Vte / VER_T + Vtc / VEF_T;
`max_hyp0(q1Q, q0Q, 0.1);
qBQ = q1Q * (1.0 + 0.5 * (n0 + nB));
Rb2 = 3.0 * RBV_TM / qBQ;
Ib1b2 = (2.0 * Vt * (eVb1b2 - 1.0) + Vb1b2) / Rb2;
// Weak-avalanche current
Iavl = 0.0;
Gem = 0.0;
if ((Ic1c2 > 0.0) && (Vb2c1 < VDC_T)) begin
dEdx0 = 2.0 * VAVL / (WAVL * WAVL);
sqr_arg = (VDC_T - Vb2c1) / Icap_IHC;
xd = sqrt(2.0 * sqr_arg / dEdx0);
if (EXAVL == 0.0)
Weff = WAVL;
else
begin
xi_w1 = 1.0 - 0.5 * xi_w;
Weff = WAVL * xi_w1 * xi_w1;
end
Wd = xd * Weff / sqrt(xd * xd + Weff * Weff);
Eav = (VDC_T - Vb2c1) / Wd;
E0 = Eav + 0.5 * Wd * dEdx0 * Icap_IHC;
if (EXAVL == 0)
Em = E0;
else
begin
SHw = 1.0 + 2.0 * SFH * (1.0 + 2.0 * xi_w);
Efi = (1.0 + SFH) / (1.0 + 2.0 * SFH);
Ew = Eav - 0.5 * Wd * dEdx0 * (Efi - Ic1c2 / (IHC_M * SHw));
sqr_arg = (Ew - E0) * (Ew - E0) + 0.1 * Eav * Eav * Icap / IHC_M;
Em = 0.5 * (Ew + E0 + sqrt(sqr_arg));
end
EmEav_Em = (Em - Eav) / Em;
if (abs(EmEav_Em) > `TEN_M07)
begin
lambda = 0.5 * Wd / EmEav_Em;
Gem = An / BnT * Em * lambda *
(exp(-BnT / Em) - exp(-BnT / Em * (1.0 + Weff / lambda)) );
end
else
Gem = An * Weff * exp(-BnT / Em);
Gmax = Vt / (Ic1c2 * (RBC_TM + Rb2)) + qBI / BF_T +
RE_TM / (RBC_TM + Rb2);
Iavl = Ic1c2 * Gem / (Gem +Gem / Gmax + 1.0);
end
if (eVb2c2star > 0.0)
Vb2c2star = Vt * ln(eVb2c2star);
else
Vb2c2star = Vb2c2;
`ifdef SELFHEATING
// Power dissipation
// RvdT 03-12-2007, modified power equation due to distribution collector resistance
power = In * (Vb2e1 - Vb2c2star) +
Ic1c2 * (Vb2c2star - Vb2c1) -
Iavl * Vb2c2star +
Vee1 * Vee1 / RE_TM +
Vcc3 * Vcc3 * GCCxx_TM +
Vc3c4 * Vc3c4 * GCCex_TM +
Vc4c1 * Vc4c1 * GCCin_TM +
Vbb1 * Vbb1 / RBC_TM +
Ib1b2 * Vb1b2 +
// 504.8: Nov. 2008, RvdT, TU_Delft: Zener current contribution added:
// Izteb > 0 for Vb2e1 < 0, hence the minus sign:
(Ib1 + Ib2 - Izteb) * Vb2e1 +
Ib1_s * Vb1e1 +
`ifdef SUBSTRATE
(Iex + Ib3) * Vb1c4 + XIex * Vbc3 +
Isub * (Vb1c4 - Vsc4) +
XIsub * (Vbc3 - Vsc3) +
Isf * Vsc1;
`else
(Iex + Ib3) * Vb1c4 + XIex * Vbc3;
`endif
`endif
// Charges
Qte = (1.0 - XCJE) * CJE_TM * Vte;
`min_logexp(Vje_s, Vb1e1, Vfe, a_VDE);
Qte_s = XCJE * CJE_TM * (VDE_T / (1.0 - PE) *
(1.0 - pow(1.0 - Vje_s * inv_VDE_T, 1.0 - PE)) +
`AJE * (Vb1e1 - Vje_s));
Qtc = XCJC * CJC_TM * Vtc;
Qb0 = TAUB_T * IK_TM;
Qbe_qs = 0.5 * Qb0 * n0 * q1Q;
Qbc_qs = 0.5 * Qb0 * nB * q1Q;
a_VDC = 0.1 * VDC_T;
`min_logexp(Vjcex, Vb1c4, Vfc, a_VDC);
Vtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - Vjcex / VDC_T, 1.0 - PC)) +
bjc * (Vb1c4 - Vjcex);
Qtex = CJC_TM * ((1.0 - XP_T) * Vtexv + XP_T * Vb1c4) *
(1.0 - XCJC) * (1.0 - XEXT);
`min_logexp(XVjcex, Vbc3, Vfc, a_VDC);
XVtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - XVjcex / VDC_T, 1.0 - PC)) +
bjc * (Vbc3 - XVjcex);
XQtex = CJC_TM * ((1.0 - XP_T) * XVtexv + XP_T * Vbc3) *
(1.0 - XCJC) * XEXT;
`ifdef SUBSTRATE
a_VDS = 0.1 * VDS_T;
Vfs = VDS_T * (1.0 - pow(`AJS , -1.0 / PS));
`min_logexp(Vjs, Vsc1, Vfs, a_VDS);
Qts = CJS_TM * (VDS_T / (1.0 - PS) *
(1.0 - pow(1.0 - Vjs / VDS_T, 1.0 - PS)) + `AJS * (Vsc1 - Vjs));
`endif
Qe0 = TAUE_T * IK_TM * pow(IS_TM / IK_TM, 1.0 / MTAU);
`expLin(tmpExp,Vb2e1 / (MTAU * Vt))
// Niu Q2, 2016, for fixing reverse VBE noise when KE=1, KC=1,
// Previous Qe_qs causes unphysically large noise correlation time constant tau_n
Qe_qs = Qe0 * tmpExp;
Qepi0 = 4.0 * TEPI_T * Vt / RCV_TM;
Qepi = 0.5 * Qepi0 * xi_w * (p0star + pW + 2.0);
Qex = TAUR_T * 0.5 * (Qb0 * nBex + Qepi0 * pWex) / (TAUB_T + TEPI_T);
XQex = 0.0;
if (EXMOD == 1) begin
Qex = Qex * (1.0 - XEXT);
Xg2 = 4.0 * eVbc3VDC;
XpWex = Xg2 / (1.0 + sqrt(1.0 + Xg2));
XQex = 0.5 * Fex * XEXT * TAUR_T *
(Qb0 * XnBex + Qepi0 * XpWex) / (TAUB_T + TEPI_T);
end
Qb1b2 = 0.0;
if (EXPHI == 1)
begin
dVteVje = pow(1.0 - Vje * inv_VDE_T, -PE) - `AJE;
Vb2e1Vfe = (Vb2e1 - Vfe) / a_VDE;
if (Vb2e1Vfe < 0.0)
dVjeVb2e1 = 1.0 / (1.0 + exp(Vb2e1Vfe));
else
dVjeVb2e1 = exp(- Vb2e1Vfe) / (1.0 + exp(- Vb2e1Vfe));
dVteVb2e1 = dVteVje * dVjeVb2e1 + `AJE;
dQteVb2e1 = (1.0 - XCJE) * CJE_TM * dVteVb2e1;
dn0Vb2e1 = If0 * eVb2e1 * VtINV * (0.5 / sqrt(1.0 + f1));
dQbeVb2e1 = 0.5 * Qb0 * q1Q * dn0Vb2e1;
// Niu, Q2 2016. Modified to fix reverse VBE noise problem.
dQeVb2e1 = Qe_qs / (MTAU * Vt);
Qb1b2 = 0.2 * Vb1b2 * (dQteVb2e1 + dQbeVb2e1 + dQeVb2e1);
Qe = (1 - KE) * Qe_qs;
Qbe_qs_eff = Qbe_qs + KE * Qe_qs;
Qbc = XQB * Qbe_qs_eff + Qbc_qs;
Qbe = (1 - XQB) * Qbe_qs_eff;
end
else
begin
Qbe = Qbe_qs;
Qbc = Qbc_qs;
Qe = Qe_qs;
end
// Add branch current contributions
// Static currents
I(c1, c2) <+ TYPE * Ic1c2;
I(c2, e1) <+ TYPE * In;
I(b1, e1) <+ TYPE * Ib1_s;
// begin RvdT, 28-10-2008, MXT504.8_alpha
// contribution tunnel current added
I(b2, e1) <+ TYPE * (Ib1 + Ib2 - Izteb);
`ifdef SUBSTRATE
I(b1, s) <+ TYPE * Isub;
I(b, s) <+ TYPE * XIsub;
I(s, c1) <+ TYPE * Isf;
`endif
I(b1, b2) <+ TYPE * Ib1b2;
I(b2, c2) <+ TYPE * (-1.0 * Iavl);
I(e, e1) <+ TYPE * Vee1 / RE_TM;
I(b, b1) <+ TYPE * Vbb1 / RBC_TM;
`ifdef SELFHEATING
// Electrical equivalent for the thermal network
I(dt) <+ V(dt) / RTH_Tamb_M;
I(dt) <+ ddt(CTH_M * V(dt));
I(dt) <+ -1.0 * power;
`endif
// Dynamic currents
I(b2, e1) <+ ddt(TYPE * (Qte + Qbe + Qe));
I(b1, e1) <+ ddt(TYPE * (Qte_s));
I(b2, c2) <+ ddt(TYPE * (Qtc + Qbc + Qepi));
`ifdef SUBSTRATE
I(s, c1) <+ ddt(TYPE * Qts);
`endif
I(b1, b2) <+ ddt(TYPE * Qb1b2);
I(b, e) <+ ddt(TYPE * CBEO_M * Vbe);
I(b, c) <+ ddt(TYPE * CBCO_M * Vbc);
end // Currents and charges
/* RvdT, Delft Univ. Tech. 03-12-2007.
Distribution of parasitic collector resistance.
This construct supports the case
RCBLI = 0.0 and or RCBLX = 0.0 .
It is up to the compiler to adjust the circuit topology
and perform a node-collapse in such cases. */
`ifdef insideADMS
//dw we have limited all the RCXXX to MIN_R
I(b, c3) <+ TYPE * XIex;
I(c, c3) <+ TYPE * Vcc3 * GCCxx_TM ;
I(b, c3) <+ ddt(TYPE * (XQtex + XQex));
I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM;
I(b1, c4) <+ TYPE * (Ib3 + Iex);
I(c3, c4) <+ TYPE * Vc3c4 * GCCex_TM ;
I(b1, c4) <+ ddt(TYPE * (Qtex + Qex));
`else
if (RCBLX > 0.0)
begin
I(b, c3) <+ TYPE * XIex;
I(c, c3) <+ TYPE * Vcc3 * GCCxx_TM ;
I(b, c3) <+ ddt(TYPE * (XQtex + XQex));
if (RCBLI > 0.0)
begin
I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM;
I(b1, c4) <+ TYPE * (Ib3 + Iex);
I(c3, c4) <+ TYPE * Vc3c4 * GCCex_TM ;
I(b1, c4) <+ ddt(TYPE * (Qtex + Qex));
end
else
begin
V(c4, c1) <+ 0.0 ;
I(b1, c1) <+ TYPE * (Ib3 + Iex);
I(b1, c1) <+ ddt(TYPE * (Qtex + Qex));
I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ;
end
end
else
begin
V(c3, c4) <+ 0 ;
if (RCBLI > 0.0)
begin
I(b, c4) <+ TYPE * XIex;
I(c, c4) <+ TYPE * Vcc3 * GCCxx_TM ;
I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM;
I(b1, c4) <+ TYPE * (Ib3 + Iex);
I(b1, c4) <+ ddt(TYPE * (Qtex + Qex));
I(b, c4) <+ ddt(TYPE * (XQtex + XQex));
end
else
begin
I(b, c1) <+ TYPE * XIex;
I(c, c1) <+ TYPE * Vcc3 * GCCxx_TM ;
V(c4, c1) <+ 0.0 ;
I(b1, c1) <+ TYPE * (Ib3 + Iex);
I(b1, c1) <+ ddt(TYPE * (Qtex + Qex));
I(b, c1) <+ ddt(TYPE * (XQtex + XQex));
I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ;
end
end
`endif

View File

@ -0,0 +1,130 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Front definitions
`include "discipline.h"
// Numerical, physical and model constants
`define TEN_M40 1.0e-40
`define TEN_M07 1.0e-7
`define C2K 273.15
`define KB 1.3806226e-23
`define QQ 1.6021918e-19
`define KBdivQQ 8.61708691805812512584e-5
`define one_third 0.33333333333333333333
`define one_sixth 0.16666666666666666667
`define VDLOW 0.05
`define AJE 3.0
`define AJC 2.0
`define AJS 2.0
`define VEXLIM 400.0
`define PI 3.1415926
`ifdef insideADMS
//dw needed for RCXXX limiting
`define MIN_R 0.001
`endif
// Desriptions and units
`ifdef __VAMS_COMPACT_MODELING__
`define OPP(nam,uni,des) (* desc="des", units="uni" *) real nam;
`define PAR(des,uni) (* desc="des", units="uni" *) parameter real
`define PAI(des,uni) (* desc="des", units="uni" *) parameter integer
`else
`define OPP(nam,uni,des)
`define PAR(des,uni) parameter real
`define PAI(des,uni) parameter integer
`endif
// ADMS specific definitions
`ifdef insideADMS
`define MODEL @(initial_model)
`define INSTANCE @(initial_instance)
`define NOISE @(noise)
`else
`define MODEL
`define INSTANCE
`define NOISE
`endif
// Smooth limitting functions
`define max_hyp0(result, x, epsilon)\
eps2 = epsilon * epsilon;\
x2 = x * x;\
if (x < 0.0)\
result = 0.5 * eps2 / (sqrt(x2 + eps2) - x);\
else\
result = 0.5 * (sqrt(x2 + eps2) + x);\
result=result
`define min_logexp(result, x, x0, a)\
dxa = (x - x0) / (a);\
if (x < x0)\
result = x - a * ln(1.0 + exp(dxa));\
else\
result = x0 - a * ln(1.0 + exp(-dxa));\
result=result
`define max_logexp(result, x, x0, a)\
dxa = (x - x0) / (a);\
if (x < x0)\
result = x0 + a * ln(1.0 + exp(dxa));\
else\
result = x + a * ln(1.0 + exp(-dxa));\
result=result
`define expLin(result, x)\
if (x < `VEXLIM)\
result = exp(x);\
else begin\
expl = exp(`VEXLIM);\
result = expl * (1.0 + (x - `VEXLIM));\
end
`define linLog(result, x, vlim)\
if (x < vlim)\
result = x;\
else\
result = vlim + ln(1.0 + (x - vlim));\
result=result
// Macros for the model/instance parameters
//
// MPRxx model parameter real
// MPIxx model parameter integer
// ||
// cc closed lower bound, closed upper bound
// oo open lower bound, open upper bound
// co closed lower bound, open upper bound
// oc open lower bound, closed upper bound
// cz closed lower bound=0, open upper bound=inf
// oz open lower bound=0, open upper bound=inf
// nb no bounds
// ex no bounds with exclude
// sw switch(integer only, values 0=false and 1=true)
// ty switch(integer only, values -1=p-type and +1=n-type)
//
//
`define MPRnb(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def ;
`define MPRex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter real nam=def exclude exc ;
`define MPRcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr] ;
`define MPRoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr) ;
`define MPRco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr) ;
`define MPRoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr] ;
`define MPRcz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from[ 0:inf);
`define MPRoz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from( 0:inf);
`define MPInb(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def ;
`define MPIex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter integer nam=def exclude exc ;
`define MPIcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr] ;
`define MPIoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr) ;
`define MPIco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr) ;
`define MPIoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr] ;
`define MPIcz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0:inf);
`define MPIoz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from( 0:inf);
`define MPIsw(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0: 1] ;
`define MPIty(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ -1: 1] exclude 0 ;

View File

@ -0,0 +1,83 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Initialize model constants
// Impact ionization constants (NPN - PNP)
if (TYPE == 1) begin
An = 7.03e7;
Bn = 1.23e8;
end else begin
An = 1.58e8;
Bn = 2.04e8;
end
Xext1 = 1.0 - XEXT;
// Temperature independent MULT scaling
`ifdef SELFHEATING
CTH_M = CTH * MULT;
`endif
CBEO_M = CBEO * MULT;
CBCO_M = CBCO * MULT;
invMULT = 1.0 / MULT;
SCRCV_M = SCRCV * invMULT;
KF_M = KF * pow(MULT, 1.0 - AF);
KFN_M = KFN * pow(MULT, 1.0 - (2.0 * (MLF - 1.0) + AF * (2.0 - MLF)));
// begin: RvdT, November 2008; Zener tunneling current model
pow2_2mPE = pow(2.0, 2.0 - PE) ;
pow2_PEm2 = 1.0 / pow2_2mPE ;
// Reference Temperature expressed in Kelvin:
Trk = TREF + `C2K;
// Ambient Temperature expressed in Kelvin:
Tamb = $temperature + DTA;
// begin: RvdT, November 2008; Zener tunneling current model
//
// Comment added March 2009: this assumes VGZEBOK as a model parameter.
//
// Bandgap for Zener tunnel current model at reference temperature in eV:
// VGZEB_Tr = VGZEBOK - AVGEB*Trk*Trk / (Trk + TVGEB) ;
// `max_logexp(VGZEB_Tr, VGZEBOK - AVGEB*Trk*Trk / (Trk + TVGEB), 0.05, 0.1) ;
// end: RvdT, November 2008
// begin: RvdT March 2009:
// to decrease parameter interdependency,
// use VGZEB as a parameter, instead of VGZEBOK:
// VGZEB : bandgap for Zener tunneling at T = Tref,
// VGZEBOK : bandgap for Zener tunneling at T = 0 K.
// `max_logexp(VGZEBOK, VGZEB + AVGEB*Trk*Trk / (Trk + TVGEB), 0.05, 0.1) ;
//dw adms can't expand the macro `max_logexp here - using the code
_x = VGZEB + AVGEB*Trk*Trk / (Trk + TVGEB);
_x0 = 0.05;
_a = 0.1;
_dxa = (_x - _x0) / (_a);
if (_x < _x0)
VGZEBOK = _x0 + _a * ln(1.0 + exp(_dxa));
else
VGZEBOK = _x + _a * ln(1.0 + exp(-_dxa));
VGZEB_Tr = VGZEB ;
// end: RvdT March 2009: use VGZEB as a parameter, instead of VGZEBOK:
inv_VGZEB_Tr = 1.0 / VGZEB_Tr ;
inv_VDE = 1.0 / VDE ;
// end: RvdT, November 2008; Zener tunneling current model

View File

@ -0,0 +1,145 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Noise sources
`NOISE begin
// Thermal noise
common = 4.0 * `KB * Tk;
powerREC = common / RE_TM; // Emitter resistance
powerRBC = common / RBC_TM; // Base resistance
powerRCCxx = common * GCCxx_TM; // Collector resistance
powerRCCex = common * GCCex_TM; // Collector resistance
powerRCCin = common * GCCin_TM; // Collector resistance
powerRBV = common / Rb2 * (4.0 * eVb1b2 + 5.0) * `one_third ; // Variable base resistance
// Main current shot noise
In_N = (If + Ir) / qBI;
powerCCS = 2.0 * `QQ * abs(In_N);
// Weak-avalanche current shot noise
if (KAVL > 0) begin
Gem_N = abs(Iavl / In_N);
end else begin
Gem_N = 0.0;
end
powerIIS = 2.0 * `QQ * Iavl * (Gem_N + 1);
// Transit time for noise
if (In_N > 0.0) begin
Taub_N = (Qbe + Qbc) / In_N;
end else begin
Taub_N = TAUB_T * q1Q * qBI;
end
// RF correlation noise model switch
if (KC == 1) begin
// use charge partition for noise transit time
taun = XQB * Taub_N;
end else if (KC == 2) begin
// use fraction of transit time for noise transit time
taun = FTAUN * Taub_N;
end else begin // KC == 0
// no correlation noise
taun = 0;
end
// Forward base current shot noise and 1/f noise
powerFBCS = 2.0 * `QQ * (abs(Ib1) + abs(Ib2) + abs(Izteb));
powerFBC1fB1 = (1.0 - XIBI) * pow((abs(Ib1) / (1 - XIBI)), AF) * KF_M;
exponentFBC1fB2 = (2.0 * (MLF - 1.0)) + (AF * (2.0 - MLF));
powerFBC1fB2 = KFN_M * pow(abs(Ib2), exponentFBC1fB2);
// Emitter-base sidewall current shot and 1/f noise
powerEBSCS = 2.0 * `QQ * abs(Ib1_s);
if (XIBI == 0)
powerEBSC1f = 0.0;
else
powerEBSC1f = KF_M * XIBI * pow((abs(Ib1_s / XIBI)), AF);
// Reverse base current shot noise and 1/f noise
powerRBCS = 2.0 * `QQ * abs(Ib3);
powerRBC1f = KF_M * pow(abs(Ib3), AF);
// Extrinsic current shot noise and 1/f noise
powerExCS = 2.0 * `QQ * abs(Iex);
powerExC1f = KF_M * (1 - (EXMOD * XEXT)) *
pow((abs(Iex) / (1 - (EXMOD * XEXT))), AF);
powerExCSMOD = 2.0 * `QQ * abs(XIex) * EXMOD;
if (XEXT == 0.0)
powerExC1fMOD = 0.0;
else
powerExC1fMOD = KF_M * EXMOD * XEXT * pow((abs(XIex) / XEXT), AF);
`ifdef SUBSTRATE
// Substrate current shot noise (between nodes B1 and S, resp. B and S)
powerSubsCS_B1S = 2.0 * `QQ * abs(Isub);
powerSubsCS_BS = 2.0 * `QQ * abs(XIsub);
`endif
// Reference un-correlated current shot noise sources
I(noi) <+ white_noise(powerCCS);
I(noi) <+ V(noi);
// Implementing correlated noise sources
I(b2, e1) <+ taun * ddt(V(noi));
I(c2, b2) <+ Gem_N * V(noi);
I(c2, e1) <+ V(noi);
// Implementing un-correlated noise sources
I(c2, b2) <+ white_noise(powerIIS);
I(b2, e1) <+ white_noise(powerFBCS);
// Add noise sources
I(e, e1) <+ white_noise(powerREC); // "emitter resistance"
I(b, b1) <+ white_noise(powerRBC); // "base resistance"
I(b1, b2) <+ white_noise(powerRBV); // "variable base resistance"
I(b2, e1) <+ flicker_noise(powerFBC1fB1, 1); // "bas_emi_forw"
I(b2, e1) <+ flicker_noise(powerFBC1fB2, 1); // "bas_emi_forw"
I(e1, b1) <+ white_noise(powerEBSCS); // "emi_bas_side"
I(e1, b1) <+ flicker_noise(powerEBSC1f, 1); // "emi_bas_side"
I(b1, c4) <+ white_noise(powerRBCS); // "bas_col_reve"
I(b1, c4) <+ flicker_noise(powerRBC1f, 1); // "bas_col_reve"
I(b1, c4) <+ white_noise(powerExCS); // "Ext_bas_col"
I(b1, c4) <+ flicker_noise(powerExC1f, 1); // "Ext_bas_col"
I(b, c3) <+ white_noise(powerExCSMOD); // "Ext_bas_col"
I(b, c3) <+ flicker_noise(powerExC1fMOD, 1); // "Ext_bas_col"
`ifdef SUBSTRATE
I(b1, s) <+ white_noise(powerSubsCS_B1S); // "bas_sub_current"
I(b, s) <+ white_noise(powerSubsCS_BS); // "bas_sub_current"
`endif
if (RCBLX > 0.0)
begin
if (RCBLI > 0.0)
begin /* all branches exist */
I(c, c3) <+ white_noise(powerRCCxx); // "collector plug resistance"
I(c3, c4) <+ white_noise(powerRCCex); // "extrinsic collector BL resistance"
I(c4, c1) <+ white_noise(powerRCCin); // "intrinsic collector BL resistance"
end
else
begin /* only Rcblx exists */
I(c, c3) <+ white_noise(powerRCCxx); // "collector plug resistance"
I(c3, c1) <+ white_noise(powerRCCex); // "extrinsic collector BL resistance"
end
end
else
begin
if (RCBLI > 0.0)
begin /* only Rcbli exists */
I(c, c4) <+ white_noise(powerRCCxx); // "collector plug resistance"
I(c4, c1) <+ white_noise(powerRCCin); // "intrinsic collector BL resistance"
end
else
begin /* neither Rcblx nor Rcbli exists */
I(c, c1) <+ white_noise(powerRCCxx); // "collector plug resistance"
end
end
end // Noise

View File

@ -0,0 +1,245 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Evaluate the operating point (output) variables
begin
`ifdef __VAMS_COMPACT_MODELING__
// The external currents and the current gain
OP_ic = I(<c>); // External DC collector current
OP_ib = I(<b>); // External DC base Current
if (OP_ib == 0)
begin
OP_betadc = 0.0 ;
end
else
begin
OP_betadc = OP_ic / OP_ib; // External DC Current gain
end
// begin added in MXT 504.9:
OP_ie = I(<e>); // External DC emitter current
OP_vbe = V(b, e); // External base-emitter bias
OP_vce = V(c, e); // External collector-emitter bias
OP_vbc = V(b, c); // External base-collector bias
`ifdef SUBSTRATE
OP_is = I(<s>); // External DC emitter current
OP_vse = V(s, e); // External substrate-emitter bias
OP_vbs = V(b, s); // External base-substrate bias
OP_vsc = V(s, c); // External substrate-collector bias
`endif
// end added in MXT 504.9:
// The internal voltage differences
OP_vb2e1 = Vb2e1; // Internal base-emiter bias
OP_vb2c2 = Vb2c2; // Internal base-emiter bias
OP_vb2c1 = Vb2c1; // Internal base-collector bias including epilayer
OP_vb1c1 = Vb1b2 + Vb2c1; // External base-collector bias without contact resistances
OP_vc4c1 = Vc4c1; // Bias over intrinsic buried layer
OP_vc3c4 = Vc3c4; // Bias over extrinsic buried layer
OP_ve1e = - Vee1; // Bias over emiter resistance
// The branch currents
OP_in = In; // Main current
OP_ic1c2 = Ic1c2; // Epilayer current
OP_ib1b2 = Ib1b2; // Pinched-base current
OP_ib1 = Ib1; // Ideal forward base current
OP_sib1 = Ib1_s; // Ideal side-wall base current
//
// 504.8, RvdT, TU-Delft April. 2009:
//
OP_izteb = Izteb ; // Zener tunneling current
//
OP_ib2 = Ib2; // Non-ideal forward base current
OP_ib3 = Ib3; // Non-ideal reverse base current
OP_iavl = Iavl; // Avalanche current
OP_iex = Iex; // Extrinsic reverse base current
OP_xiex = XIex; // Extrinsic reverse base current
`ifdef SUBSTRATE
OP_isub = Isub; // Substrate current
OP_xisub = XIsub; // Substrate current
OP_isf = Isf; // Substrate-collector current
`endif
OP_ire = - Vee1 / RE_TM; // Current through emiter resistance
OP_irbc = Vbb1 / RBC_TM; // Current through constant base resistance
OP_ircc = Vcc3 * GCCxx_TM; // Current through collector contact resistance
OP_ircblx = Vc3c4 * GCCex_TM; // Current through extrinsic buried layer resistance
OP_ircbli = Vc4c1 * GCCin_TM; // Current through extrinsic buried layer resistance
// The branch charges
OP_qe = Qe; // Emitter charge or emitter neutral charge
OP_qte = Qte; // Base-emiter depletion charge
OP_sqte = Qte_s; // Sidewall base-emiter depletion charge
OP_qbe = Qbe; // Base-emiter diffusion charge
OP_qbc = Qbc; // Base-collector diffusion charge
OP_qtc = Qtc; // Base-colector depletion charge
OP_qepi = Qepi; // Epilayer diffusion charge
OP_qb1b2 = Qb1b2; // AC current crowding charge
OP_qtex = Qtex; // Extrinsic base-collector depletion charge
OP_xqtex = XQtex; // Extrinsic base-collector depletion charge
OP_qex = Qex; // Extrinsic base-collector diffusion charge
OP_xqex = XQex; // Extrinsic base-collector diffusion charge
`ifdef SUBSTRATE
OP_qts = Qts; // Collector substrate depletion charge
`endif
// Small signal equivalent circuit conductances and resistances
OP_gx = - ddx(In, V(e1)); // Forward transconductance
OP_gy = - ddx(In, V(c2)); // Reverse transconductance
OP_gz = - ddx(In, V(c1)); // Reverse transconductance
OP_sgpi = - ddx(Ib1_s, V(e))
- ddx(Ib1_s, V(e1)); // Conductance sidewal b-e junction
OP_gpix = - ddx(Ib1+Ib2, V(e1)); // Conductance floor b-e junction
OP_gpiy = - ddx(Ib1, V(c2)); // Early effect on recombination base current
OP_gpiz = - ddx(Ib1, V(c1)); // Early effect on recombination base current
OP_gmux = ddx( Iavl, V(e1)); // Early effect on avalanche current limitting
OP_gmuy = ddx( Iavl, V(c2)); // Conductance of avalanche current
OP_gmuz = - ddx(- Iavl, V(c1)); // Conductance of avalanche current
// Conductance extrinsic b-c current :
OP_gmuex = ddx(Iex+Ib3, V(e))
+ ddx(Iex+Ib3, V(b1))
+ ddx(Iex+Ib3, V(b2))
+ ddx(Iex+Ib3, V(e1))
+ ddx(Iex+Ib3, V(c2));
OP_xgmuex = ddx(XIex, V(b)) ; // Conductance extrinsic b-c current
OP_grcvy = - ddx(Ic1c2, V(c2)); // Conductance of epilayer current
OP_grcvz = - ddx(Ic1c2, V(c1)); // Conductance of epilayer current
OP_rbv = 1.0 / (- ddx(Ib1b2, V(b2)) - ddx(Ib1b2, V(c2))); // Base resistance
OP_grbvx = - ddx(Ib1b2, V(e)) - ddx(Ib1b2, V(e1)); // Early effect on base resistance
OP_grbvy = - ddx(Ib1b2, V(c2)); // Early effect on base resistance
OP_grbvz = - ddx(Ib1b2, V(c1)); // Early effect on base resistance
OP_re = RE_TM; // Emiter resistance
OP_rbc = RBC_TM; // Constant base resistance
OP_rcc = RCCxx_TM; // Collector Contact resistance
OP_rcblx = RCCex_TM; // Extrinsic buried layer resistance
OP_rcbli = RCCin_TM; // Extrinsic buried layer resistance
`ifdef SUBSTRATE
OP_gs = ddx(Isub, V(b)) + ddx(Isub, V(b1)); // Conductance parasitic PNP transitor
OP_xgs = ddx(XIsub, V(b)) ; // Conductance parasitic PNP transistor
OP_gsf = ddx(Isf, V(s)) ; // Conductance substrate-collector current
`endif
// Small signal equivalent circuit capacitances
OP_scbe = - ddx(Qte_s, V(e)) - ddx(Qte_s, V(e1)); // Capacitance sidewall b-e junction
OP_cbex = - ddx(Qte + Qbe + Qe, V(e1)) ; // Capacitance floor b-e junction
OP_cbey = - ddx(Qbe, V(c2)); // Early effect on b-e diffusion junction
OP_cbez = - ddx(Qbe, V(c1)); // Early effect on b-e diffusion junction
OP_cbcx = - ddx(Qbc, V(e)) - ddx(Qbc, V(e1)); // Early effect on b-c diffusion junction
OP_cbcy = - ddx(Qtc + Qbc + Qepi, V(c2)); // Capacitance floor b-c junction
OP_cbcz = - ddx(Qtc + Qbc + Qepi, V(c1)); // Capacitance floor b-c junction
// Capacitance extrinsic b-c junction :
OP_cbcex = ddx(Qtex + Qex,V(e))
+ ddx(Qtex + Qex,V(b1 ))
+ ddx(Qtex + Qex,V(b2))
+ ddx(Qtex + Qex,V(e1))
+ ddx(Qtex + Qex,V(c2)) ;
// Capacitance extrinsic b-c junction :
OP_xcbcex = ddx(XQtex + XQex, V(b)) ;
OP_cb1b2 = - ddx(Qb1b2, V(b2)) - ddx(Qb1b2, V(c2)); // Capacitance AC current crowding
OP_cb1b2x = - ddx(Qb1b2, V(e)) - ddx(Qb1b2, V(e1)); // Cross-capacitance AC current crowding
OP_cb1b2y = - ddx(Qb1b2, V(c2)); // Cross-capacitance AC current crowding
OP_cb1b2z = - ddx(Qb1b2, V(c1)) ; // Cross-capacitance AC current crowding
`ifdef SUBSTRATE
OP_cts = ddx(Qts, V(s)) ; // Capacitance s-c junction
`endif
// Approximate small signal equivalent circuit
dydx = (OP_gx - OP_gmux) / (OP_grcvy + OP_gmuy - OP_gy);
dydz = (OP_gz - OP_grcvz - OP_gmuz) / (OP_grcvy + OP_gmuy - OP_gy);
gpi = OP_sgpi + OP_gpix + OP_gmux + OP_gpiz + OP_gmuz +
(OP_gpiy + OP_gmuy) * (dydx + dydz);
OP_gm = (OP_grcvy * (OP_gx - OP_gmux + // Transconductance
OP_gz - OP_gmuz) - OP_grcvz *
(OP_gy - OP_gmuy)) / (OP_grcvy + OP_gmuy - OP_gy);
OP_beta = OP_gm / gpi; // Current amplification
OP_gout = ((OP_gy - OP_gmuy) * OP_grcvz - // Output conductance
(OP_gz - OP_gmuz) * OP_grcvy) /
(OP_grcvy + OP_gmuy - OP_gy);
OP_gmu = OP_gpiz + OP_gmuz + (OP_gpiy + OP_gmuy) * dydz + // Feedback transconductance
OP_gmuex + OP_xgmuex;
OP_rb = RBC_TM + OP_rbv; // Base resistance
OP_rc = OP_rcc + OP_rcblx + OP_rcbli; // Collector resistance
OP_cbe = OP_cbex + OP_scbe + OP_cbcx + // Base-emitter capacitance
(OP_cbey + OP_cbcy) * dydx + CBEO_M;
OP_cbc = (OP_cbey + OP_cbcy) * dydz + OP_cbcz + // Base-collector capacitance
OP_cbcex + OP_xcbcex + CBCO_M;
// Quantities to describe internal state of the model
gammax = (OP_gpix + OP_gmux - OP_grbvx) * OP_rbv;
gammay = (OP_gpiy + OP_gmuy - OP_grbvy) * OP_rbv;
gammaz = (OP_gpiz + OP_gmuz - OP_grbvz) * OP_rbv;
gbfx = OP_gpix + OP_sgpi * (1.0 + gammax);
gbfy = OP_gpiy + OP_sgpi * gammay;
gbfz = OP_gpiz + OP_sgpi * gammaz;
// RvdT March 2008:
alpha_ft = (1.0 + (OP_grcvy * dydx * OP_rc) +
(OP_gx + gbfx + (OP_gy + gbfy) * dydx) * RE_TM)/
(1.0 - (OP_grcvz + OP_grcvy * dydz) * OP_rc -
(OP_gz + gbfz + (OP_gy + gbfy) * dydz) * RE_TM);
rx = pow((OP_grcvy * dydx + alpha_ft * (OP_grcvz + OP_grcvy * dydz)), -1);
rz = alpha_ft * rx;
ry = (1.0 - OP_grcvz * rz) / OP_grcvy;
rb1b2 = gammax * rx + gammay * ry + gammaz * rz;
rex = rz + rb1b2 - OP_rcbli;
xrex = rz + rb1b2 + RBC_TM * ((gbfx + OP_gmux) * rx + (gbfy + OP_gmuy) * ry +
(gbfz + OP_gmuz) * rz) - OP_rcbli - OP_rcblx;
taut = OP_scbe * (rx + rb1b2) + (OP_cbex + OP_cbcx) * rx + (OP_cbey + OP_cbcy) *
ry + (OP_cbez + OP_cbcz) * rz + OP_cbcex * rex + OP_xcbcex * xrex +
(CBEO_M + CBCO_M) * (xrex - RCCxx_TM);
OP_ft = 1.0 / (2.0 * `PI * taut); // Good approximation for cut-off frequency
OP_iqs = Iqs; // Current at onset of quasi-saturation
OP_xiwepi = xi_w; // Thickness of injection layer
OP_vb2c2star = Vb2c2star; // Physical value of internal base-collector bias
//self-heating
`ifdef SELFHEATING
OP_pdiss = power; // Dissipation
`endif
OP_tk = Tk; // Actual temperature
`endif
end

View File

@ -0,0 +1,156 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
//
// Operation point (output) variables
//
// The external currents and current gain
`OPP(OP_ic, A, External DC collector current)
`OPP(OP_ib, A, External DC base current)
`OPP(OP_betadc, , External DC current gain Ic/Ib)
// begin added in MXT 504.9:
`OPP(OP_ie, A, External DC emitter current)
// The external biases
`OPP(OP_vbe, V, External base-emitter bias)
`OPP(OP_vce, V, External collector-emitter bias)
`OPP(OP_vbc, V, External base-collector bias)
`ifdef SUBSTRATE
`OPP(OP_is, A, External DC substrate current)
`OPP(OP_vse, V, External substrate-emitter bias)
`OPP(OP_vbs, V, External base-substrate bias)
`OPP(OP_vsc, V, External substrate-collector bias)
`endif
// end added in MXT 504.9
// The internal biases
`OPP(OP_vb2e1, V, Internal base-emitter bias)
`OPP(OP_vb2c2, V, Internal base-collector bias)
`OPP(OP_vb2c1, V, Internal base-collector bias including epilayer)
`OPP(OP_vb1c1, V, External base-collector bias without contact resistances)
`OPP(OP_vc4c1, V, Bias over intrinsic buried layer)
`OPP(OP_vc3c4, V, Bias over extrinsic buried layer)
`OPP(OP_ve1e, V, Bias over emitter resistance)
// The actual currents
`OPP(OP_in, A, Main current)
`OPP(OP_ic1c2, A, Epilayer current)
`OPP(OP_ib1b2, A, Pinched-base current)
`OPP(OP_ib1, A, Ideal forward base current)
`OPP(OP_sib1, A, Ideal side-wall base current)
//
// 504.8, RvdT, TU-Delft April. 2009, Zener tunneling current:
//
`OPP(OP_izteb, A, Zener tunneling current in the emitter base junction)
//
`OPP(OP_ib2, A, Non-ideal forward base current)
`OPP(OP_ib3, A, Non-ideal reverse base current)
`OPP(OP_iavl, A, Avalanche current)
`OPP(OP_iex, A, Extrinsic reverse base current)
`OPP(OP_xiex, A, Extrinsic reverse base current)
`ifdef SUBSTRATE
`OPP(OP_isub, A, Substrate current)
`OPP(OP_xisub, A, Substrate current)
`OPP(OP_isf, A, Substrate failure current)
`endif
`OPP(OP_ire, A, Current through emitter resistance)
`OPP(OP_irbc, A, Current through constant base resistance)
`OPP(OP_ircblx, A, Current through extrinsic buried layer resistance)
`OPP(OP_ircbli, A, Current through intrinsic buried layer resistance)
`OPP(OP_ircc, A, Current through collector contact resistance)
//The actual charges
`OPP(OP_qe, C, Emitter charge or emitter neutral charge)
`OPP(OP_qte, C, Base-emitter depletion charge)
`OPP(OP_sqte, C, Sidewall base-emitter depletion charge)
`OPP(OP_qbe, C, Base-emitter diffusion charge)
`OPP(OP_qbc, C, Base_collector diffusion charge)
`OPP(OP_qtc, C, Base-collector depletion charge)
`OPP(OP_qepi, C, Epilayer diffusion charge)
`OPP(OP_qb1b2, C, AC current crowding charge)
`OPP(OP_qtex, C, Extrinsic base-collector depletion charge)
`OPP(OP_xqtex, C, Extrinsic base-collector depletion charge)
`OPP(OP_qex, C, Extrinsic base-collector diffusion charge)
`OPP(OP_xqex, C, Extrinsic base-collector diffusion charge)
`ifdef SUBSTRATE
`OPP(OP_qts, C, Collector-substrate depletion charge)
`endif
//Small signal equivalent circuit conductances and resistances
`OPP(OP_gx, S, Forward transconductance)
`OPP(OP_gy, S, Reverse transconductance)
`OPP(OP_gz, S, Reverse transconductance)
`OPP(OP_sgpi, S, Conductance sidewall b-e junction)
`OPP(OP_gpix, S, Conductance floor b-e junction)
`OPP(OP_gpiy, S, Early effect on recombination base current)
`OPP(OP_gpiz, S, Early effect on recombination base current)
`OPP(OP_gmux, S, Early effect on avalanche current limiting)
`OPP(OP_gmuy, S, Conductance of avalanche current)
`OPP(OP_gmuz, S, Conductance of avalanche current)
`OPP(OP_gmuex, S, Conductance of extrinsic b-c junction)
`OPP(OP_xgmuex, S, Conductance of extrinsic b-c junction)
`OPP(OP_grcvy, S, Conductance of epilayer current)
`OPP(OP_grcvz, S, Conductance of epilayer current)
`OPP(OP_rbv, Ohm, Base resistance)
`OPP(OP_grbvx, S, Early effect on base resistance)
`OPP(OP_grbvy, S, Early effect on base resistance)
`OPP(OP_grbvz, S, Early effect on base resistance)
`OPP(OP_re, Ohm, Emitter resistance)
`OPP(OP_rbc, Ohm, Constant base resistance)
`OPP(OP_rcc, Ohm, Collector contact resistance)
`OPP(OP_rcblx, Ohm, Extrinsic buried layer resistance)
`OPP(OP_rcbli, Ohm, Intrinsic buried layer resistance)
`ifdef SUBSTRATE
`OPP(OP_gs, S, Conductance parasitic PNP transistor)
`OPP(OP_xgs, S, Conductance parasitic PNP transistor)
`OPP(OP_gsf, S, Conductance substrate failure current)
`endif
//Small signal equivalent circuit capacitances
`OPP(OP_scbe, F, Capacitance sidewall b-e junction)
`OPP(OP_cbex, F, Capacitance floor b-e junction)
`OPP(OP_cbey, F, Early effect on b-e diffusion charge)
`OPP(OP_cbez, F, Early effect on b-e diffusion charge)
`OPP(OP_cbcx, F, Early effect on b-c diffusion charge)
`OPP(OP_cbcy, F, Capacitance floor b-c junction)
`OPP(OP_cbcz, F, Capacitance floor b-c junction)
`OPP(OP_cbcex, F, Capacitance extrinsic b-c junction)
`OPP(OP_xcbcex, F, Capacitance extrinsic b-c junction)
`OPP(OP_cb1b2, F, Capacitance AC current crowding)
`OPP(OP_cb1b2x, F, Cross-capacitance AC current crowding)
`OPP(OP_cb1b2y, F, Cross-capacitance AC current crowding)
`OPP(OP_cb1b2z, F, Cross-capacitance AC current crowding)
`ifdef SUBSTRATE
`OPP(OP_cts, F, Capacitance s-c junction)
`endif
//Approximate small signal equivalent circuit
`OPP(OP_gm, S,transconductance)
`OPP(OP_beta, , Current amplification)
`OPP(OP_gout, S, Output conductance)
`OPP(OP_gmu, S, Feedback transconductance)
`OPP(OP_rb, Ohm, Base resistance)
`OPP(OP_rc, Ohm, Collector resistance)
`OPP(OP_cbe, C, Base-emitter capacitance)
`OPP(OP_cbc, C, Base-collector capacitance)
//quantities to describe internal state of the model
`OPP(OP_ft, , Good approximation for cut-off frequency)
`OPP(OP_iqs, A, Current at onset of quasi-saturation)
`OPP(OP_xiwepi, m, Thickness of injection layer)
`OPP(OP_vb2c2star, V, Physical value of internal base-collector bias)
//self-heating
`ifdef SELFHEATING
`OPP(OP_pdiss, W, Dissipation)
`endif
`OPP(OP_tk, K, Actual temperature)
//help variables
real dydx, dydz, gpi;
real gammax, gammay, gammaz, gbfx, gbfy, gbfz, alpha_ft;
real rx, ry, rz, rb1b2, rex, xrex, taut;

View File

@ -0,0 +1,115 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Mextram parameters
`MPIco( LEVEL ,504 ,"" ,504 ,505 ,"Model level" )
`MPRco( TREF ,25.0 ,"" ,-273.0 ,inf ,"Reference temperature" )
`MPRnb( DTA ,0.0 ,"" ,"Difference between the local and global ambient temperatures" )
`MPIcc( EXMOD ,1 ,"" ,0 ,2 ,"Flag for extended modeling of the reverse current gain" )
`MPIcc( EXPHI ,1 ,"" ,0 ,1 ,"Flag for the distributed high-frequency effects in transient" )
`MPIcc( EXAVL ,0 ,"" ,0 ,1 ,"Flag for extended modeling of avalanche currents" )
`ifdef SUBSTRATE
`MPIcc( EXSUB ,0 ,"" ,0 ,1 ,"Flag for extended modelling of substrate currents" )
`endif
`MPRoo( IS ,22.0a ,"" ,0.0 ,inf ,"Collector-emitter saturation current" )
`MPRco( IK ,0.1 ,"" ,1.0p ,inf ,"Collector-emitter high injection knee current" )
`MPRco( VER ,2.5 ,"" ,0.01 ,inf ,"Reverse Early voltage" )
`MPRco( VEF ,44.0 ,"" ,0.01 ,inf ,"Forward Early voltage" )
`MPRco( BF ,215.0 ,"" ,0.1m ,inf ,"Ideal forward current gain" )
`MPRco( IBF ,2.7f ,"" ,0.0 ,inf ,"Saturation current of the non-ideal forward base current" )
`MPRco( MLF ,2.0 ,"" ,0.1 ,inf ,"Non-ideality factor of the non-ideal forward base current" )
`MPRcc( XIBI ,0.0 ,"" ,0.0 ,1.0 ,"Part of ideal base current that belongs to the sidewall" )
`MPRco( IZEB ,0.0 ,"" ,0.0 ,inf ,"Pre-factor of emitter-base Zener tunneling current" )
`MPRco( NZEB ,22.0 ,"" ,0.0 ,inf ,"Coefficient of emitter-base Zener tunneling current" )
`MPRco( BRI ,7.0 ,"" ,1.0e-4 ,inf ,"Ideal reverse current gain" )
`MPRco( IBR ,1.0f ,"" ,0.0 ,inf ,"Saturation current of the non-ideal reverse base current" )
`MPRnb( VLR ,0.2 ,"" ,"Cross-over voltage of the non-ideal reverse base current" )
`MPRcc( XEXT ,0.63 ,"" ,0.0 ,1.0 ,"Part of currents and charges that belong to extrinsic region" )
`MPRco( WAVL ,1.1u ,"" ,1.0n ,inf ,"Epilayer thickness used in weak-avalanche model" )
`MPRco( VAVL ,3.0 ,"" ,0.01 ,inf ,"Voltage determining curvature of avalanche current" )
`MPRco( SFH ,0.3 ,"" ,0.0 ,inf ,"Current spreading factor of avalanche model when EXAVL=1" )
`MPRco( RE ,5.0 ,"" ,1.0m ,inf ,"Emitter resistance" )
`MPRco( RBC ,23.0 ,"" ,1.0m ,inf ,"Constant part of the base resistance" )
`MPRco( RBV ,18.0 ,"" ,1.0m ,inf ,"Zero-bias value of the variable part of the base resistance" )
`MPRco( RCC ,12.0 ,"" ,1.0m ,inf ,"Constant part of the collector resistance" )
`MPRco( RCV ,150.0 ,"" ,1.0m ,inf ,"Resistance of the un-modulated epilayer" )
`MPRco( SCRCV ,1250.0 ,"" ,1.0m ,inf ,"Space charge resistance of the epilayer" )
`MPRco( IHC ,4.0m ,"" ,1.0p ,inf ,"Critical current for velocity saturation in the epilayer" )
`MPRco( AXI ,0.3 ,"" ,0.02 ,inf ,"Smoothness parameter for the onset of quasi-saturation" )
`MPRco( CJE ,73.0f ,"" ,0.0 ,inf ,"Zero-bias emitter-base depletion capacitance" )
`MPRco( VDE ,0.95 ,"" ,0.05 ,inf ,"Emitter-base diffusion voltage" )
`MPRco( PE ,0.4 ,"" ,0.01 ,0.99 ,"Emitter-base grading coefficient" )
`MPRcc( XCJE ,0.4 ,"" ,0.0 ,1.0 ,"Sidewall fraction of the emitter-base depletion capacitance" )
`MPRco( CBEO ,0.0 ,"" ,0.0 ,inf ,"Emitter-base overlap capacitance" )
`MPRco( CJC ,78.0f ,"" ,0.0 ,inf ,"Zero-bias collector-base depletion capacitance" )
`MPRco( VDC ,0.68 ,"" ,0.05 ,inf ,"Collector-base diffusion voltage" )
`MPRco( PC ,0.5 ,"" ,0.01 ,0.99 ,"Collector-base grading coefficient" )
`MPRco( XP ,0.35 ,"" ,0.0 ,0.99 ,"Constant part of Cjc" )
`MPRco( MC ,0.5 ,"" ,0.0 ,1.0 ,"Coefficient for current modulation of CB depletion capacitance" )
`MPRcc( XCJC ,32.0m ,"" ,0.0 ,1.0 ,"Fraction of CB depletion capacitance under the emitter" )
`MPRco( RCBLX ,0.0 ,"" ,0.0 ,inf ,"Resistance Collector Buried Layer eXtrinsic" )
`MPRco( RCBLI ,0.0 ,"" ,0.0 ,inf ,"Resistance Collector Buried Layer Intrinsic" )
`MPRco( CBCO ,0.0 ,"" ,0.0 ,inf ,"Collector-base overlap capacitance" )
`MPRco( MTAU ,1.0 ,"" ,0.1 ,inf ,"Non-ideality factor of the emitter stored charge" )
`MPRco( TAUE ,2.0p ,"" ,0.0 ,inf ,"Minimum transit time of stored emitter charge" )
`MPRoo( TAUB ,4.2p ,"" ,0.0 ,inf ,"Transit time of stored base charge" )
`MPRco( TEPI ,41.0p ,"" ,0.0 ,inf ,"Transit time of stored epilayer charge" )
`MPRco( TAUR ,520.0p ,"" ,0.0 ,inf ,"Transit time of reverse extrinsic stored base charge" )
`MPRnb( DEG ,0.0 ,"" ,"Bandgap difference over the base" )
`MPRco( XREC ,0.0 ,"" ,0.0 ,inf ,"Pre-factor of the recombination part of Ib1" )
`MPRcc( XQB ,`one_third ,"" ,0.0 ,1.0 ,"Emitter-fraction of base diffusion charge" )
`MPRnb( AQBO ,0.3 ,"" ,"Temperature coefficient of the zero-bias base charge" )
`MPRnb( AE ,0.0 ,"" ,"Temperature coefficient of the resistivity of the emitter" )
`MPRnb( AB ,1.0 ,"" ,"Temperature coefficient of the resistivity of the base" )
`MPRnb( AEPI ,2.5 ,"" ,"Temperature coefficient of the resistivity of the epilayer" )
`MPRnb( AEX ,0.62 ,"" ,"Temperature coefficient of the resistivity of the extrinsic base" )
`MPRnb( AC ,2.0 ,"" ,"Temperature coefficient of the resistivity of the collector contact" )
`MPRco( ACBL ,2.0 ,"" ,0.0 ,inf ,"Temperature coefficient of the resistivity of the collector buried layer" )
`MPRnb( DVGBF ,50.0m ,"" ,"Band-gap voltage difference of the forward current gain" )
`MPRnb( DVGBR ,45.0m ,"" ,"Band-gap voltage difference of the reverse current gain" )
`MPRco( VGB ,1.17 ,"" ,0.1 ,inf ,"Band-gap voltage of the base" )
`MPRco( VGC ,1.18 ,"" ,0.1 ,inf ,"Band-gap voltage of the collector" )
`MPRco( VGJ ,1.15 ,"" ,0.1 ,inf ,"Band-gap voltage recombination emitter-base junction" )
`MPRco( VGZEB ,1.15 ,"" ,0.1 ,inf ,"Band-gap voltage at Tref of Zener effect emitter-base junction" )
`MPRoo( AVGEB ,4.73e-4 ,"" ,-inf ,inf ,"Temperature coefficient band-gap voltage for Zener effect emitter-base junction" )
`MPRco( TVGEB ,636.0 ,"" ,0.0 ,inf ,"Temperature coefficient band-gap voltage for Zener effect emitter-base junction" )
`MPRnb( DVGTE ,0.05 ,"" ,"Band-gap voltage difference of emitter stored charge" )
`MPRnb( DAIS ,0.0 ,"" ,"Fine tuning of temperature dependence of C-E saturation current" )
`MPRco( AF ,2.0 ,"" ,0.01 ,inf ,"Exponent of the Flicker-noise" )
`MPRco( KF ,20.0p ,"" ,0.0 ,inf ,"Flicker-noise coefficient of the ideal base current" )
`MPRco( KFN ,20.0p ,"" ,0.0 ,inf ,"Flicker-noise coefficient of the non-ideal base current" )
`MPIcc( KAVL ,0 ,"" ,0 ,1 ,"Switch for white noise contribution due to avalanche" )
`MPIcc( KC ,0 ,"" ,0 ,2 ,"Switch for RF correlation noise model selection" )
`MPRcc( KE ,0.0 ,"" ,0.0 ,1.0 ,"Fraction of QE in excess phase shift" )
`MPRcc( FTAUN ,0.0 ,"" ,0.0 ,1.0 ,"Fraction of noise transit time to total transit time" )
`ifdef SUBSTRATE
`MPRco( ISS ,48.0a ,"" ,0.0 ,inf ,"Base-substrate saturation current" )
`MPRoo( ICSS ,-1.0 ,"" ,-inf ,inf ,"Collector-substrate ideal saturation current" )
`MPRco( IKS ,250.0u ,"" ,1.0p ,inf ,"Base-substrate high injection knee current" )
`MPRco( CJS ,315.0f ,"" ,0.0 ,inf ,"Zero-bias collector-substrate depletion capacitance" )
`MPRoo( VDS ,0.62 ,"" ,0.05 ,inf ,"Collector-substrate diffusion voltage" )
`MPRoo( PS ,0.34 ,"" ,0.01 ,0.99 ,"Collector-substrate grading coefficient" )
`MPRco( VGS ,1.20 ,"" ,0.1 ,inf ,"Band-gap voltage of the substrate" )
`MPRnb( AS ,1.58 ,"" ,"Substrate temperature coefficient" )
`MPRnb( ASUB ,2.0 ,"" ,"Temperature coefficient for mobility of minorities in the substrate" )
`endif
`ifdef SELFHEATING
`MPRoo( RTH ,300.0 ,"" ,0.0 ,inf ,"Thermal resistance" )
`MPRco( CTH ,3.0n ,"" ,0.0 ,inf ,"Thermal capacitance" )
`MPRnb( ATH ,0.0 ,"" ,"Temperature coefficient of the thermal resistance" )
`endif
`MPRoo( MULT ,1.0 ,"" ,0.0 ,inf ,"Multiplication factor" )
`MPIty( TYPE ,1 ,"" ,"Flag for NPN (1) or PNP (-1) transistor type" )
`MPRoc( GMIN ,1.0e-13 ,"" ,0.0 ,1e-10 ,"Minimum conductance" )

View File

@ -0,0 +1,262 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Temperature scaling of parameters
// The excess transistor temperature due to the self-heating
`ifdef SELFHEATING
Tki = V(dt);
// *** Convergence related smoothing ***
if (Tki < 0.0) begin
Tki = - ln(1.0 - Tki);
end
`linLog(Vdt, Tki, 200.0);
// `min_logexp(Vdt, Tki, 200.0, 10.0);
`else
Vdt = 0.0;
`endif
// Temperature variables
Tk = Tamb + Vdt;
tN = Tk / Trk;
Vt = `KBdivQQ * Tk;
Vtr = `KBdivQQ * Trk;
VtINV = 1.0 / Vt;
VtrINV = 1.0 / Vtr;
VdtINV = VtINV - VtrINV;
lntN = ln(tN) ;
// begin: RvdT, November 2008, "Zener tunneling model"
// VGZEB_T = VGZEBOK - AVGEB*Tk*Tk / (Tk + TVGEB) ;
`max_logexp(VGZEB_T, VGZEBOK - AVGEB*Tk*Tk / (Tk + TVGEB), 0.05, 0.1) ;
// end: RvdT, November 2008, "Zener tunneling model"
// Depletion capacitances
UdeT = -3.0 * Vt * ln(tN) + VDE * tN + (1.0 - tN) * VGB;
`max_logexp(VDE_T, `VDLOW, UdeT, Vt);
UdcT = -3.0 * Vt * ln(tN) + VDC * tN + (1.0 - tN) * VGC;
`max_logexp(VDC_T, `VDLOW, UdcT, Vt);
`ifdef SUBSTRATE
UdsT = -3.0 * Vt * ln(tN) + VDS * tN + (1.0 - tN) * VGS;
`max_logexp(VDS_T, `VDLOW, UdsT, Vt);
`endif
inv_VDE_T = 1.0 / VDE_T ;
CJE_T_div_CJE = pow(VDE * inv_VDE_T, PE);
CJE_T = CJE * CJE_T_div_CJE ;
`ifdef SUBSTRATE
CJS_T = CJS * pow(VDS / VDS_T, PS);
`endif
CJCscale = ((1.0 - XP) * pow(VDC / VDC_T, PC) + XP);
CJCscaleINV = 1.0 / CJCscale;
CJC_T = CJC * CJCscale;
XP_T = XP * CJCscaleINV;
// Resistances
// RvdT, November 2008:
// Instead of the following definition
// RE_T = RE * pow(tN, AE);
// we use, here, and in all following powers of tN,
// the following computationally cheaper implementation:
RE_T = RE * exp(lntN * AE);
// This is based on the observation that exp() is faster than pow().
// Acknowledgement due to Geoffrey Coram.
RBV_T = RBV * exp(lntN * (AB - AQBO));
RBC_T = RBC * exp(lntN * AEX);
// RvdT, 30-11-2007: new collector resistances RCCxx_T, RCCex_T, RCCin_T
`ifdef insideADMS
//dw limiting all the RCXXX to MIN_R
if (RCC > 0.0)
RCCxx_T = RCC * exp(lntN * AC);
else
RCCxx_T = `MIN_R * exp(lntN * AC);
if (RCBLX > 0.0)
RCCex_T = RCBLX * exp(lntN * ACBL);
else
RCCex_T = `MIN_R * exp(lntN * ACBL);
if (RCBLI > 0.0)
RCCin_T = RCBLI * exp(lntN * ACBL);
else
RCCin_T = `MIN_R * exp(lntN * ACBL);
`else
RCCxx_T = RCC * exp(lntN * AC);
RCCex_T = RCBLX * exp(lntN * ACBL);
RCCin_T = RCBLI * exp(lntN * ACBL);
`endif
RCV_T = RCV * exp(lntN * AEPI);
// Current gains
BF_T = BF * exp(lntN * (AE - AB - AQBO)) * exp(-DVGBF * VdtINV);
BRI_T = BRI * exp(-DVGBR * VdtINV);
// Currents and voltages
IS_T = IS * exp(lntN * (4.0 - AB - AQBO + DAIS)) * exp(-VGB * VdtINV);
IK_T = IK * exp(lntN * (1.0 - AB));
IBF_T = IBF * exp(lntN * (6.0 - 2.0 * MLF)) * exp(-VGJ * VdtINV / MLF);
IBR_T = IBR * tN * tN * exp(-VGC * VdtINV / 2.0);
// begin RvdT, November 2008, MXT504.8_alpha
// T-scaling BE tunneling:
//
x = pow(VGZEB_T * inv_VGZEB_Tr, -0.5) ;
// y = pow(VDE_T * inv_VDE, PE) ;
// more efficient, because we need both y and 1.0 / y:
y = 1.0 / CJE_T_div_CJE ;
// definition:
// nZEB_T = NZEB* pow(VGZEB_T/VGZEB_Tr, 1.5) * pow(VDE_T / VDE, PE-1) ;
// more efficient implementation:
// nZEB_T = NZEB* VGZEB_T * VGZEB_T * x * y * VDE /(VDE_T*VGZEB_Tr*VGZEB_Tr) ;
nZEB_T = NZEB* VGZEB_T * VGZEB_T * x * y * VDE * inv_VDE_T*inv_VGZEB_Tr*inv_VGZEB_Tr ;
// definition:
// IZEB_T = IZEB* pow(VGZEB_T/VGZEB_Tr, -0.5) * pow(VDE_T / VDE, 2-PE) * exp(NZEB-nZEB_T);
// more efficient implementation:
IZEB_T = IZEB* x * VDE_T * VDE_T * inv_VDE * inv_VDE * CJE_T_div_CJE * exp(NZEB-nZEB_T) ;
//
// end RvdT, November 2008, MXT504.8_alpha
x = exp(lntN * AQBO) ;
VEF_T = VEF * x * CJCscaleINV;
// VER_T = VER * x * pow(VDE / VDE_T, -PE);
VER_T = VER * x * y;
`ifdef SUBSTRATE
ISS_T = ISS * exp(lntN * (4.0 - AS)) * exp(-VGS * VdtINV);
// New 504.9:
ICSS_T = ICSS * exp(lntN * (3.5 - 0.5 * ASUB)) * exp(-VGS * VdtINV);
// End New 504.9.
if ((ISS_T > 0.0))
IKS_T = IKS * exp(lntN * (1.0 - AS)) * (IS_T / IS) * (ISS / ISS_T);
else
IKS_T = IKS * exp(lntN * (1.0 - AS));
`endif
// Transit times
TAUE_T = TAUE * exp(lntN * (AB - 2.0)) * exp(-DVGTE * VdtINV);
TAUB_T = TAUB * exp(lntN * (AQBO + AB - 1.0));
TEPI_T = TEPI * exp(lntN * (AEPI - 1.0));
TAUR_T = TAUR * (TAUB_T + TEPI_T) / (TAUB + TEPI);
// Avalanche constant
Tk300 = Tk - 300.0;
// RvdT, 15-02-2008: prevent division by zero and overflow at high temperatures:
if (Tk < 525.0)
begin
BnT = Bn * (1.0 + 7.2e-4 * Tk300 - 1.6e-6 * Tk300 * Tk300) ;
end
else
begin
BnT = Bn * 1.081 ;
end
// Heterojunction features
DEG_T = DEG * exp(lntN * AQBO);
`ifdef SELFHEATING
// Temperature scaling of the thermal resistance
RTH_Tamb = RTH * pow(Tamb / Trk, ATH);
`endif
// MULT - scaling
IS_TM = IS_T * MULT;
IK_TM = IK_T * MULT;
IBF_TM = IBF_T * MULT;
IBR_TM = IBR_T * MULT;
// RvdT: November 2008, Zener tunneling parameters
IZEB_TM = IZEB_T * MULT ;
// end Zener tunneling parameters
IHC_M = IHC * MULT;
`ifdef SUBSTRATE
ISS_TM = ISS_T * MULT;
// New: 504.9
ICSS_TM = ICSS_T * MULT;
IKS_TM = IKS_T * MULT;
`endif
CJE_TM = CJE_T * MULT;
CJC_TM = CJC_T * MULT;
// begin RvdT, 28-10-2008, MXT504.8_alpha
// Base-emitter tunneling current Mult scaling:
// BTJE_TM = BTJE_T * MULT;
// end RvdT, 28-10-2008, MXT504.8_alpha
`ifdef SUBSTRATE
CJS_TM = CJS_T * MULT;
`endif
RE_TM = RE_T * invMULT;
RBC_TM = RBC_T * invMULT;
RBV_TM = RBV_T * invMULT;
// RvdT, 30-01-2007: new collector resistances:
RCCxx_TM = RCCxx_T * invMULT;
RCCex_TM = RCCex_T * invMULT;
RCCin_TM = RCCin_T * invMULT;
RCV_TM = RCV_T * invMULT;
// RvdT, 03-12-2007: new collector conductances
`ifdef insideADMS
//dw we have limited all the RCXXX to MIN_R
GCCxx_TM = 1.0 / RCCxx_TM ;
GCCex_TM = 1.0 / RCCex_TM ;
GCCin_TM = 1.0 / RCCin_TM ;
`else
if (RCC > 0.0)
begin
GCCxx_TM = 1.0 / RCCxx_TM ;
end
else
begin
GCCxx_TM = 0 ;
end
if (RCBLX > 0.0)
begin
GCCex_TM = 1.0 / RCCex_TM ;
end
else
begin
GCCex_TM = 0 ;
end
if (RCBLI > 0.0)
begin
GCCin_TM = 1.0 / RCCin_TM ;
end
else
begin
GCCin_TM = 0 ;
end
`endif
`ifdef SELFHEATING
RTH_Tamb_M = RTH_Tamb * invMULT;
`endif

View File

@ -0,0 +1,198 @@
// Copyright (c) 2000-2007, NXP Semiconductor
// Copyright (c) 2007-2014, Delft University of Technology
// Copyright (c) 2015, Auburn University
// All rights reserved, see IP_NOTICE_DISCLAIMER_LICENSE for further information.
// Declaration of variables
real _x, _x0, _a, _dxa;
// Model constants
real An, Bn;
// Temperature scaling variables
real Tk, Trk, tN, Tamb;
real Vt, Vtr, VtINV, VtrINV, VdtINV;
real Vdt;
real UdeT, VDE_T, UdcT, VDC_T;
real CJE_T, CJC_T, XP_T;
real CJCscale, CJCscaleINV;
real RE_T, RBV_T, RBC_T, RCV_T;
// RvdT: 30-01-2007, new collector resistances:
real RCCxx_T, RCCex_T, RCCin_T;
real BF_T, BRI_T;
real IS_T, IK_T, IBF_T, IBR_T, VEF_T, VER_T;
// RvdT: November 2008, Zener tunneling parameters and variables:
real Izteb, IZEB_T, E0BE, dE0BE,nZEB_T, pow2_2mPE, pow2_PEm2, inv_VDE, inv_VDE_T;
real eZEB, edZEB, DZEB, VGZEB_T, VGZEB_Tr, inv_VGZEB_Tr, CJE_T_div_CJE ;
// RvdT: March 2009, Zener tunneling parameters and variables:
real VGZEBOK;
// end Zener tunneling parameters
real TAUE_T, TAUB_T, TEPI_T, TAUR_T;
real BnT, DEG_T, Tk300;
`ifdef SELFHEATING
real RTH_Tamb;
`endif
`ifdef SUBSTRATE
real UdsT, VDS_T, CJS_T, ISS_T, ICSS_T, IKS_T;
`endif
// MULT - scaling variables
real invMULT;
real IS_TM, IK_TM, IBF_TM, IBR_TM, IHC_M;
// RvdT: November 2008, Zener tunneling parameters
real IZEB_TM ;
// end Zener tunneling parameters
real CJE_TM, CJC_TM;
real RE_TM, RBC_TM, RBV_TM, RCV_TM, SCRCV_M;
// RvdT: 30-01-2007, new collector resistances:
real RCCxx_TM, RCCex_TM, RCCin_TM;
// RvdT: 03-12-2007, new collector conductances:
real GCCxx_TM, GCCex_TM, GCCin_TM;
real KF_M, KFN_M;
`ifdef SELFHEATING
real RTH_Tamb_M, CTH_M;
`endif
`ifdef SUBSTRATE
real ISS_TM, ICSS_TM, IKS_TM, CJS_TM;
`endif
// Epilayer model variables
real K0, Kw, pW, Ec, Ic1c2;
real Vqs_th, Vqs, Iqs;
real alpha, vyi, yi, xi_w, xi_w1;
real gp0, gp02, p0star, Vb2c2star, eVb2c2star;
real B1, B2, Vxi0, Vch, Icap, pav;
// Effective emitter and collector junction bias variables
real Vfe, Vje, Vte;
real Vjunc, bjc, Vfc, Vjc, fI, Vcv, Vtc;
// Transfer current variables
real If0, f1, f2, n0, nB;
real q0I, q1I, qBI, Ir, If, In;
// Base and substrate current(s) variables
real Xext1;
real Ib1, Ib1_s, Ib2, Ib3;
real Ibf0, Iex;
real g1, g2, pWex, nBex;
real Xg1, XnBex, XIMex, XIMsub, Vex, VBex, Fex, XIex;
`ifdef SUBSTRATE
real Isub, XIsub, Isf;
`endif
// Distributed base effects variables
real q0Q, q1Q, qBQ, Rb2, Ib1b2;
real dVteVb2e1, dVteVje, dVjeVb2e1;
real dQteVb2e1, dQbeVb2e1, dQeVb2e1;
real dn0Vb2e1;
// Weak-avalanche current variables
real dEdx0, xd, Weff, Wd, Eav, E0, Em, SHw, Efi, Ew;
real lambda, Gem, Gmax, Iavl;
real Icap_IHC;
`ifdef SELFHEATING
real Tki, power;
`endif
// Charges and capacitances variables
real Qte, Vje_s, Qte_s;
real Qtc;
real Qb0, Qbe, Qbc, Qb1b2;
real Qbe_qs, Qbc_qs;
real Vjcex, Vtexv, Qtex, XVjcex, XVtexv, XQtex;
`ifdef SUBSTRATE
real Vfs, Vjs, Qts;
`endif
real Qe0, Qe;
real Qe_qs;
real Qepi0, Qepi, Xg2, XpWex, XQex;
real Qex;
real CBEO_M, CBCO_M;
// Biases and exponential terms variables
real Vb2c1, Vb2c2, Vb2e1, Vb1e1, Vb1b2, Vb1c4, Vc1c2;
real Vc3c4, Vc4c1;
`ifdef SUBSTRATE
real Vsc1, Vsc3, Vsc4, eVsc1, eVsc3, eVsc4;
`endif
real Vee1, Vbb1, Vbc3, Vcc3, Vbe, Vbc;
real eVb2c2, eVb2e1, eVb1e1, eVb1b2, eVb1c4, eVbc3;
real eVb1c4VDC, eVb2c2VDC, eVbc3VDC, eVb2c1VDC;
// Help variables
// RvdT, November 2008, lntN introduced to speed up T-scaling:
// Acknowledgements due to Geoffrey Coram
real lntN ;
// RvdT, November 2008 variables for local use; may be re-used globally:
real x, y ;
real dxa, sqr_arg;
real eps2, x2;
real alpha1, vdif, Ic1c2_Iqs, gp0_help;
real EmEav_Em, Vb2e1Vfe, termE, termC;
real Vex_bias;
real eps_VDC, a_VDE, a_VDC;
real expl, tmpExp, tmpV;
`ifdef SUBSTRATE
real a_VDS;
`endif
// Noise variables
real common;
real powerREC, powerRBC, powerRCCxx, powerRCCex, powerRCCin, powerRBV;
real powerCCS;
real powerFBCS, powerFBC1fB1, exponentFBC1fB2, powerFBC1fB2;
real powerEBSCS, powerEBSC1f;
real powerRBCS, powerRBC1f;
real powerExCS, powerExCSMOD, powerExC1f, powerExC1fMOD;
real powerIIS;
`ifdef SUBSTRATE
real powerSubsCS_B1S, powerSubsCS_BS;
`endif
// noise correlation help variables
real In_N, Gem_N, Taub_N, taun, Qbe_qs_eff;

View File

@ -0,0 +1,184 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_InitModel.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
//////////////////////////////////////////////////////////////
//
// Calculation of internal paramters which are independent
// on instance parameters
//
//////////////////////////////////////////////////////////////
TRJ_i = `CLIP_LOW( TRJ , `TRJ_cliplow);
IMAX_i = `CLIP_LOW( IMAX , `IMAX_cliplow);
CJORBOT_i = `CLIP_LOW( CJORBOT , `CJORBOT_cliplow);
CJORSTI_i = `CLIP_LOW( CJORSTI , `CJORSTI_cliplow);
CJORGAT_i = `CLIP_LOW( CJORGAT , `CJORGAT_cliplow);
VBIRBOT_i = `CLIP_LOW( VBIRBOT , `VBIR_cliplow);
VBIRSTI_i = `CLIP_LOW( VBIRSTI , `VBIR_cliplow);
VBIRGAT_i = `CLIP_LOW( VBIRGAT , `VBIR_cliplow);
PBOT_i = `CLIP_BOTH(PBOT , `P_cliplow,`P_cliphigh);
PSTI_i = `CLIP_BOTH(PSTI , `P_cliplow,`P_cliphigh);
PGAT_i = `CLIP_BOTH(PGAT , `P_cliplow,`P_cliphigh);
IDSATRBOT_i = `CLIP_LOW( IDSATRBOT , `IDSATR_cliplow);
IDSATRSTI_i = `CLIP_LOW( IDSATRSTI , `IDSATR_cliplow);
IDSATRGAT_i = `CLIP_LOW( IDSATRGAT , `IDSATR_cliplow);
CSRHBOT_i = `CLIP_LOW( CSRHBOT , `CSRH_cliplow);
CSRHSTI_i = `CLIP_LOW( CSRHSTI , `CSRH_cliplow);
CSRHGAT_i = `CLIP_LOW( CSRHGAT , `CSRH_cliplow);
XJUNSTI_i = `CLIP_LOW( XJUNSTI , `XJUN_cliplow);
XJUNGAT_i = `CLIP_LOW( XJUNGAT , `XJUN_cliplow);
CTATBOT_i = `CLIP_LOW( CTATBOT , `CTAT_cliplow);
CTATSTI_i = `CLIP_LOW( CTATSTI , `CTAT_cliplow);
CTATGAT_i = `CLIP_LOW( CTATGAT , `CTAT_cliplow);
MEFFTATBOT_i = `CLIP_LOW( MEFFTATBOT, `MEFFTAT_cliplow);
MEFFTATSTI_i = `CLIP_LOW( MEFFTATSTI, `MEFFTAT_cliplow);
MEFFTATGAT_i = `CLIP_LOW( MEFFTATGAT, `MEFFTAT_cliplow);
CBBTBOT_i = `CLIP_LOW( CBBTBOT , `CBBT_cliplow);
CBBTSTI_i = `CLIP_LOW( CBBTSTI , `CBBT_cliplow);
CBBTGAT_i = `CLIP_LOW( CBBTGAT , `CBBT_cliplow);
VBRBOT_i = `CLIP_LOW( VBRBOT , `VBR_cliplow);
VBRSTI_i = `CLIP_LOW( VBRSTI , `VBR_cliplow);
VBRGAT_i = `CLIP_LOW( VBRGAT , `VBR_cliplow);
PBRBOT_i = `CLIP_LOW( PBRBOT , `PBR_cliplow);
PBRSTI_i = `CLIP_LOW( PBRSTI , `PBR_cliplow);
PBRGAT_i = `CLIP_LOW( PBRGAT , `PBR_cliplow);
tkr = `KELVINCONVERSION + TRJ_i;
tkd = max($temperature + DTA, `KELVINCONVERSION + `MINTEMP);
auxt = tkd / tkr;
KBOL_over_QELE = `KBOL / `QELE;
phitr = KBOL_over_QELE * tkr;
phitrinv = 1.0 / phitr;
phitd = KBOL_over_QELE * tkd;
phitdinv = 1.0 / phitd;
// bandgap voltages at reference temperature
deltaphigr = -(7.02e-4 * tkr * tkr) / (1108.0 + tkr);
phigrbot = PHIGBOT + deltaphigr;
phigrsti = PHIGSTI + deltaphigr;
phigrgat = PHIGGAT + deltaphigr;
// bandgap voltages at device temperature
deltaphigd = -(7.02e-4 * tkd * tkd) / (1108.0 + tkd);
phigdbot = PHIGBOT + deltaphigd;
phigdsti = PHIGSTI + deltaphigd;
phigdgat = PHIGGAT + deltaphigd;
// factors ftd for ideal-current model
ftdbot = (pow(auxt, 1.5)) * exp(0.5 * ((phigrbot * phitrinv) - (phigdbot * phitdinv)));
ftdsti = (pow(auxt, 1.5)) * exp(0.5 * ((phigrsti * phitrinv) - (phigdsti * phitdinv)));
ftdgat = (pow(auxt, 1.5)) * exp(0.5 * ((phigrgat * phitrinv) - (phigdgat * phitdinv)));
// temperature-scaled saturation current for ideal-current model
idsatbot = IDSATRBOT_i * ftdbot * ftdbot;
idsatsti = IDSATRSTI_i * ftdsti * ftdsti;
idsatgat = IDSATRGAT_i * ftdgat * ftdgat;
// built-in voltages before limiting
ubibot = VBIRBOT_i * auxt - 2 * phitd * ln(ftdbot);
ubisti = VBIRSTI_i * auxt - 2 * phitd * ln(ftdsti);
ubigat = VBIRGAT_i * auxt - 2 * phitd * ln(ftdgat);
// built-in voltages limited to phitd
vbibot = ubibot + phitd * ln(1 + exp((`vbilow - ubibot) * phitdinv));
vbisti = ubisti + phitd * ln(1 + exp((`vbilow - ubisti) * phitdinv));
vbigat = ubigat + phitd * ln(1 + exp((`vbilow - ubigat) * phitdinv));
// inverse values of built-in voltages
vbiinvbot = 1.0 / vbibot;
vbiinvsti = 1.0 / vbisti;
vbiinvgat = 1.0 / vbigat;
// one minus the grading coefficient
one_minus_PBOT = 1 - PBOT_i;
one_minus_PSTI = 1 - PSTI_i;
one_minus_PGAT = 1 - PGAT_i;
// one over "one minus the grading coefficient"
one_over_one_minus_PBOT = 1 / one_minus_PBOT;
one_over_one_minus_PSTI = 1 / one_minus_PSTI;
one_over_one_minus_PGAT = 1 / one_minus_PGAT;
// temperature-scaled zero-bias capacitance
cjobot = CJORBOT_i * pow((VBIRBOT_i * vbiinvbot), PBOT_i);
cjosti = CJORSTI_i * pow((VBIRSTI_i * vbiinvsti), PSTI_i);
cjogat = CJORGAT_i * pow((VBIRGAT_i * vbiinvgat), PGAT_i);
// prefactor in physical part of charge model
qprefbot = cjobot * vbibot * one_over_one_minus_PBOT;
qprefsti = cjosti * vbisti * one_over_one_minus_PSTI;
qprefgat = cjogat * vbigat * one_over_one_minus_PGAT;
// prefactor in mathematical extension of charge model
qpref2bot = `a * cjobot;
qpref2sti = `a * cjosti;
qpref2gat = `a * cjogat;
// zero-bias depletion widths at reference temperature, needed in SRH and TAT model
wdepnulrbot = `EPSSI / CJORBOT_i;
wdepnulrsti = XJUNSTI_i * `EPSSI / CJORSTI_i;
wdepnulrgat = XJUNGAT_i * `EPSSI / CJORGAT_i;
// inverse values of "wdepnulr", used in BBT model
wdepnulrinvbot = 1 / wdepnulrbot;
wdepnulrinvsti = 1 / wdepnulrsti;
wdepnulrinvgat = 1 / wdepnulrgat;
// inverse values of built-in voltages at reference temperature, needed in SRH and BBT model
VBIRBOTinv = 1 / VBIRBOT_i;
VBIRSTIinv = 1 / VBIRSTI_i;
VBIRGATinv = 1 / VBIRGAT_i;
// some constants needed in erfc-approximation, needed in TAT model
perfc = (`SQRTPI * `aerfc);
berfc = ((-5 * (`aerfc) + 6 - pow((perfc), -2)) / 3);
cerfc = (1.0 - (`aerfc) - (berfc));
// half the bandgap energy, limited to values > phitd, needed in TAT model
deltaEbot = max(0.5 * phigdbot, phitd);
deltaEsti = max(0.5 * phigdsti, phitd);
deltaEgat = max(0.5 * phigdgat, phitd);
// values of atat, needed in TAT model
atatbot = deltaEbot * phitdinv;
atatsti = deltaEsti * phitdinv;
atatgat = deltaEgat * phitdinv;
// values of btatpart, needed in TAT model
btatpartbot = sqrt(32 * MEFFTATBOT_i * `MELE * `QELE * (deltaEbot * deltaEbot * deltaEbot)) / (3 * `HBAR);
btatpartsti = sqrt(32 * MEFFTATSTI_i * `MELE * `QELE * (deltaEsti * deltaEsti * deltaEsti)) / (3 * `HBAR);
btatpartgat = sqrt(32 * MEFFTATGAT_i * `MELE * `QELE * (deltaEgat * deltaEgat * deltaEgat)) / (3 * `HBAR);
// temperature-scaled values of FBBT, needed in BBT model
fbbtbot = FBBTRBOT * (1 + STFBBTBOT * (tkd - tkr));
fbbtsti = FBBTRSTI * (1 + STFBBTSTI * (tkd - tkr));
fbbtgat = FBBTRGAT * (1 + STFBBTGAT * (tkd - tkr));
// values of fstop, needed in avalanche/breakdown model
fstopbot = 1 / (1 - pow(`alphaav, PBRBOT_i));
fstopsti = 1 / (1 - pow(`alphaav, PBRSTI_i));
fstopgat = 1 / (1 - pow(`alphaav, PBRGAT_i));
// inverse values of breakdown voltages, needed in avalanche/breakdown model
VBRinvbot = 1 / VBRBOT_i;
VBRinvsti = 1 / VBRSTI_i;
VBRinvgat = 1 / VBRGAT_i;
// slopes for linear extraploation close to and beyond breakdown, needed in avalanche/breakdown model
slopebot = -(fstopbot * fstopbot * pow(`alphaav, (PBRBOT_i - 1))) * PBRBOT_i * VBRinvbot;
slopesti = -(fstopsti * fstopsti * pow(`alphaav, (PBRSTI_i - 1))) * PBRSTI_i * VBRinvsti;
slopegat = -(fstopgat * fstopgat * pow(`alphaav, (PBRGAT_i - 1))) * PBRGAT_i * VBRinvgat;

View File

@ -0,0 +1,285 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
///////////////////////////////////////////
//
// Macros and constants used in JUNCAP2
//
///////////////////////////////////////////
// Other constants
`define MINTEMP -250
`define vbilow 0.050
`define a 2
`define epsch 0.1
`define dvbi 0.050
`define epsav 1E-6
`define vbrmax 1000
`define alphaav 0.999
`define vmaxlarge 1E8
`define aerfc 0.29214664
`define twothirds 0.666666666666667
// Clipping values
`define levelnumber 200
`define AB_cliplow 0
`define LS_cliplow 0
`define LG_cliplow 0
`define MULT_cliplow 0
`define TRJ_cliplow `MINTEMP
`define IMAX_cliplow 1E-12
`define CJORBOT_cliplow 1E-12
`define CJORSTI_cliplow 1E-18
`define CJORGAT_cliplow 1E-18
`define VBIR_cliplow `vbilow
`define P_cliplow 0.05
`define P_cliphigh 0.95
`define IDSATR_cliplow 0
`define CSRH_cliplow 0
`define XJUN_cliplow 1E-9
`define CTAT_cliplow 0
`define MEFFTAT_cliplow 0.01
`define CBBT_cliplow 0
`define VBR_cliplow 0.1
`define PBR_cliplow 0.1
/////////////////////////////////////////////////////////////////////////////
//
// Macro definitions.
//
// Note that because at present locally scoped variables
// can only be in named blocks, the intermediate variables
// used in the macros below must be explicitly declared
// as variables.
//
/////////////////////////////////////////////////////////////////////////////
// Instance parameter dependent initialization
`define JuncapInitInstance(AB_i, LS_i, LG_i, VMAX, vbimin, vch, vfmin, vbbtlim) \
if (idsatbot * AB_i > 0) begin \
vmaxbot = phitd * ln(IMAX_i / (idsatbot * AB_i) + 1); \
end else begin \
vmaxbot = `vmaxlarge; \
end \
if (idsatsti * LS_i > 0) begin \
vmaxsti = phitd * ln(IMAX_i / (idsatsti * LS_i) + 1); \
end else begin \
vmaxsti = `vmaxlarge; \
end \
if (idsatgat * LG_i > 0) begin \
vmaxgat = phitd * ln(IMAX_i / (idsatgat * LG_i) + 1); \
end else begin \
vmaxgat = `vmaxlarge; \
end \
VMAX = min(min(vmaxbot, vmaxsti), vmaxgat); \
\
/* determination of minimum value of the relevant built-in voltages */ \
vbibot2 = vbibot; \
vbisti2 = vbisti; \
vbigat2 = vbigat; \
if (AB_i == 0) begin vbibot2 = vbisti + vbigat; end \
if (LS_i == 0) begin vbisti2 = vbibot + vbigat; end \
if (LG_i == 0) begin vbigat2 = vbibot + vbisti; end \
vbimin = min(min(vbibot2, vbisti2), vbigat2); \
vch = vbimin * `epsch; \
if (vbimin == vbibot) begin vfmin = vbibot * (1 - (pow(`a, (-1.0 / PBOT_i)))); end \
if (vbimin == vbisti) begin vfmin = vbisti * (1 - (pow(`a, (-1.0 / PSTI_i)))); end \
if (vbimin == vbigat) begin vfmin = vbigat * (1 - (pow(`a, (-1.0 / PGAT_i)))); end \
\
/* determination of limiting value of conditioned voltage for BBT calculation */ \
vbibot2r = VBIRBOT_i; \
vbisti2r = VBIRSTI_i; \
vbigat2r = VBIRGAT_i; \
if (AB_i == 0) begin vbibot2r = VBIRSTI_i + VBIRGAT_i; end \
if (LS_i == 0) begin vbisti2r = VBIRBOT_i + VBIRGAT_i; end \
if (LG_i == 0) begin vbigat2r = VBIRBOT_i + VBIRSTI_i; end \
vbbtlim = min(min(vbibot2r, vbisti2r), vbigat2r) - `dvbi; \
// Special power-functions
`define mypower(x,power,result) \
if (power == 0.5) begin \
result = sqrt(x); \
end else begin \
result = pow(x, power); \
end
`define mypower2(x,power,result) \
if (power == -1) begin \
result = 1 / (x); \
end else begin \
result = pow(x, power); \
end
`define mypower3(x,power,result) \
if (power == 4) begin \
result = (x) * (x) * (x) * (x); \
end else begin \
result = pow(x, power); \
end
// Smoothing functions
`define hypfunction2(x,x0,eps,hyp2) \
hyp2 = 0.5 * ((x) + (x0) - sqrt(((x) - (x0)) * ((x) - (x0)) + 4 * (eps) * (eps)));
`define hypfunction5(x,x0,eps,hyp5) \
h1 = 4.0 * (eps) * (eps); \
h2 = (eps) / (x0); \
h2d = (x) + (eps) * h2; \
h3 = (x0) + h2d; \
h4 = (x0) - h2d; \
h5 = sqrt(h4 * h4 + h1); \
hyp5 = 2.0 * ((x) * (x0) / (h3 + h5));
// A special function used to calculate TAT-currents,
// including an approximation of the erfc-function
`define calcerfcexpmtat(y,m,result) \
ysq = y * y; \
if (y > 0) begin \
terfc = 1 / (1 + perfc * y); \
end else begin \
terfc = 1 / (1 - perfc * y); \
end \
`expl_low(-ysq + m, tmp) \
erfcpos = (`aerfc * terfc + berfc * (terfc * terfc) + cerfc * (terfc * terfc * terfc)) * tmp; \
if (y > 0) begin \
result = erfcpos; \
end else begin\
`expl_low(m, tmp) \
result = 2 * tmp - erfcpos; \
end
// This is the main function of the JUNCAP2-model. It returns the current and charge
// for a single diode
`define juncapfunction(qpref,qpref2,vbiinv,one_minus_P,idsat,CSRH,CTAT,vbi,wdepnulr,VBIRinv,P,ftd,btatpart,atat,one_over_one_minus_P,CBBT,VBIR,wdepnulrinv,fbbt,VBR,VBRinv,PBR,fstop,slope,Ijprime,Qjprime) \
`mypower((1 - vj * vbiinv), one_minus_P, tmp) \
Qjprime = qpref * (1 - tmp) + qpref2 * (VAK - vj); \
id = idsat * idmult; \
if ((CSRH == 0) && (CTAT == 0)) begin \
isrh = 0; \
end else begin \
vbi_minus_vjsrh = vbi-vjsrh; \
wsrhstep = 1 - sqrt(1 - two_psistar / vbi_minus_vjsrh); \
if (P == 0.5) begin \
dwsrh = 0; \
end else begin \
dwsrh = ((wsrhstep * wsrhstep * ln(wsrhstep) / (1 - wsrhstep)) + wsrhstep) * (1 - 2 * P); \
end \
wsrh = wsrhstep + dwsrh; \
`mypower(vbi_minus_vjsrh * VBIRinv, P, tmp) \
wdep = wdepnulr * tmp; \
asrh = ftd * ((zinv - 1) * wdep); \
isrh = CSRH * (asrh * wsrh); \
end \
if (CTAT == 0) begin \
itat = 0; \
end else begin \
btat = btatpart * ((wdep * one_minus_P) / vbi_minus_vjsrh); \
twoatatoverthreebtat = (`twothirds * atat) / btat; \
umaxbeforelimiting = twoatatoverthreebtat * twoatatoverthreebtat; \
umax = sqrt(umaxbeforelimiting * umaxbeforelimiting / (umaxbeforelimiting * umaxbeforelimiting + 1)); \
sqrtumax = sqrt(abs(umax)); \
umaxpoweronepointfive = umax * sqrtumax; \
`mypower2((1 + btat * umaxpoweronepointfive), (-P * one_over_one_minus_P), wgamma) \
wtat = wsrh * wgamma / (wsrh + wgamma); \
ktat = sqrt(0.375 * (btat / sqrtumax)); \
ltat = 2 * (twoatatoverthreebtat * sqrtumax) - umax; \
mtat = atat * twoatatoverthreebtat * sqrtumax - atat * umax + 0.5 * (btat * umaxpoweronepointfive); \
xerfc = (ltat - 1) * ktat; \
`calcerfcexpmtat(xerfc, mtat, erfctimesexpmtat) \
gammamax = `SQRTPI * 0.5 * (atat * erfctimesexpmtat / ktat); \
itat = CTAT * (asrh * gammamax * wtat); \
end \
if (CBBT == 0) begin \
ibbt = 0; \
end else begin \
`mypower(((VBIR - vbbt) * VBIRinv), P, tmp) \
Fmaxr = one_over_one_minus_P * ((VBIR - vbbt) * wdepnulrinv / tmp); \
`expl(-fbbt / Fmaxr, tmp) \
ibbt = CBBT * (VAK * Fmaxr * Fmaxr * tmp); \
end \
if (VBR > `vbrmax) begin \
fbreakdown = 1; \
end else begin \
if (vav > -`alphaav * VBR) begin \
`mypower3(abs(vav * VBRinv), PBR, tmp) \
fbreakdown = 1 / (1 - tmp); \
end else begin \
fbreakdown = fstop + (vav + `alphaav * VBR) * slope; \
end \
end \
Ijprime = (id + isrh + itat + ibbt) * fbreakdown;
// The following code is written as a macro because the naming of the instance parameters is
// different for JUNCAP2 stand-alone and JUNCAP2-in-PSP: AB, LS, LG for JUNCAP2 stand-alone,
// ABSOURCE, LSSOURCE, LGSOURCE for source junction in PSP and ABDRAIN, LSDRAIN, LGDRAIN for
// drain junction in PSP
`define juncapcommon(AB_i,LS_i,LG_i,ijunbot,qjunbot,ijunsti,qjunsti,ijungat,qjungat) \
vbbt = 0.0; \
two_psistar = 0.0; \
if ( !( ((AB_i) == 0) && ((LS_i) == 0) && ((LG_i) == 0) ) ) begin \
`hypfunction5(VAK, vfmin, vch, vj) \
if (VAK < VMAX) begin \
`expl(0.5 * (VAK * phitdinv), zinv) \
idmult = zinv * zinv; \
end else begin \
`expl(VMAX * phitdinv, exp_VMAX_over_phitd) \
idmult = (1 + (VAK - VMAX) * phitdinv) * exp_VMAX_over_phitd; \
zinv = sqrt(idmult); \
end \
idmult = idmult - 1.0; \
z = 1 / zinv; \
if (VAK > 0) begin \
two_psistar = 2.0 * (phitd * ln(2.0 + z + sqrt((z + 1.0) * (z + 3.0)))); \
end else begin \
two_psistar = -VAK + 2.0 * (phitd * ln(2 * zinv + 1 + sqrt((1 + zinv) * (1 + 3 * zinv)))); \
end \
vjlim = vbimin - two_psistar; \
`hypfunction2(VAK, vjlim, phitd, vjsrh) \
`hypfunction2(VAK, vbbtlim, phitr, vbbt) \
`hypfunction2(VAK, 0, `epsav, vav) \
end \
if ((AB_i) == 0) begin \
ijunbot = 0; \
qjunbot = 0; \
end else begin \
`juncapfunction(qprefbot,qpref2bot,vbiinvbot,one_minus_PBOT,idsatbot,CSRHBOT_i,CTATBOT_i,vbibot,wdepnulrbot,VBIRBOTinv,PBOT_i,ftdbot,btatpartbot,atatbot,one_over_one_minus_PBOT,CBBTBOT_i,VBIRBOT_i,wdepnulrinvbot,fbbtbot,VBRBOT_i,VBRinvbot,PBRBOT_i,fstopbot,slopebot,ijunbot, qjunbot) \
end \
if ((LS_i) == 0) begin \
ijunsti = 0; \
qjunsti = 0; \
end else begin \
`juncapfunction(qprefsti,qpref2sti,vbiinvsti,one_minus_PSTI,idsatsti,CSRHSTI_i,CTATSTI_i,vbisti,wdepnulrsti,VBIRSTIinv,PSTI_i,ftdsti,btatpartsti,atatsti,one_over_one_minus_PSTI,CBBTSTI_i,VBIRSTI_i,wdepnulrinvsti,fbbtsti,VBRSTI_i,VBRinvsti,PBRSTI_i,fstopsti,slopesti,ijunsti, qjunsti) \
end \
if ((LG_i) == 0) begin \
ijungat = 0; \
qjungat = 0; \
end else begin \
`juncapfunction(qprefgat,qpref2gat,vbiinvgat,one_minus_PGAT,idsatgat,CSRHGAT_i,CTATGAT_i,vbigat,wdepnulrgat,VBIRGATinv,PGAT_i,ftdgat,btatpartgat,atatgat,one_over_one_minus_PGAT,CBBTGAT_i,VBIRGAT_i,wdepnulrinvgat,fbbtgat,VBRGAT_i,VBRinvgat,PBRGAT_i,fstopgat,slopegat,ijungat, qjungat) \
end

View File

@ -0,0 +1,65 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_parlist.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
//////////////////////////////////////////
//
// JUNCAP2 - Reduced parameterlist
//
//////////////////////////////////////////
parameter real IMAX = 1000 `from(`IMAX_cliplow ,inf ) `P(desc="Maximum current up to which forward current behaves exponentially" unit="A" );
parameter real CJORBOT = 1E-3 `from(`CJORBOT_cliplow ,inf ) `P(desc="Zero-bias capacitance per unit-of-area of bottom component" unit="Fm^-2" );
parameter real CJORSTI = 1E-9 `from(`CJORSTI_cliplow ,inf ) `P(desc="Zero-bias capacitance per unit-of-length of STI-edge component" unit="Fm^-1" );
parameter real CJORGAT = 1E-9 `from(`CJORGAT_cliplow ,inf ) `P(desc="Zero-bias capacitance per unit-of-length of gate-edge component" unit="Fm^-1" );
parameter real VBIRBOT = 1 `from(`VBIR_cliplow ,inf ) `P(desc="Built-in voltage at the reference temperature of bottom component" unit="V" );
parameter real VBIRSTI = 1 `from(`VBIR_cliplow ,inf ) `P(desc="Built-in voltage at the reference temperature of STI-edge component" unit="V" );
parameter real VBIRGAT = 1 `from(`VBIR_cliplow ,inf ) `P(desc="Built-in voltage at the reference temperature of gate-edge component" unit="V" );
parameter real PBOT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(desc="Grading coefficient of bottom component" unit="" );
parameter real PSTI = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(desc="Grading coefficient of STI-edge component" unit="" );
parameter real PGAT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(desc="Grading coefficient of gate-edge component" unit="" );
parameter real PHIGBOT = 1.16 `P(desc="Zero-temperature bandgap voltage of bottom component" unit="V" );
parameter real PHIGSTI = 1.16 `P(desc="Zero-temperature bandgap voltage of STI-edge component" unit="V" );
parameter real PHIGGAT = 1.16 `P(desc="Zero-temperature bandgap voltage of gate-edge component" unit="V" );
parameter real IDSATRBOT = 1E-12 `from(`IDSATR_cliplow ,inf ) `P(desc="Saturation current density at the reference temperature of bottom component" unit="Am^-2" );
parameter real IDSATRSTI = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(desc="Saturation current density at the reference temperature of STI-edge component" unit="Am^-1" );
parameter real IDSATRGAT = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(desc="Saturation current density at the reference temperature of gate-edge component" unit="Am^-1" );
parameter real CSRHBOT = 1E2 `from(`CSRH_cliplow ,inf ) `P(desc="Shockley-Read-Hall prefactor of bottom component" unit="Am^-3" );
parameter real CSRHSTI = 1E-4 `from(`CSRH_cliplow ,inf ) `P(desc="Shockley-Read-Hall prefactor of STI-edge component" unit="Am^-2" );
parameter real CSRHGAT = 1E-4 `from(`CSRH_cliplow ,inf ) `P(desc="Shockley-Read-Hall prefactor of gate-edge component" unit="Am^-2" );
parameter real XJUNSTI = 100E-9 `from(`XJUN_cliplow ,inf ) `P(desc="Junction depth of STI-edge component" unit="m" );
parameter real XJUNGAT = 100E-9 `from(`XJUN_cliplow ,inf ) `P(desc="Junction depth of gate-edge component" unit="m" );
parameter real CTATBOT = 1E2 `from(`CTAT_cliplow ,inf ) `P(desc="Trap-assisted tunneling prefactor of bottom component" unit="Am^-3" );
parameter real CTATSTI = 1E-4 `from(`CTAT_cliplow ,inf ) `P(desc="Trap-assisted tunneling prefactor of STI-edge component" unit="Am^-2" );
parameter real CTATGAT = 1E-4 `from(`CTAT_cliplow ,inf ) `P(desc="Trap-assisted tunneling prefactor of gate-edge component" unit="Am^-2" );
parameter real MEFFTATBOT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(desc="Effective mass (in units of m0) for trap-assisted tunneling of bottom component" unit="" );
parameter real MEFFTATSTI = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(desc="Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component" unit="" );
parameter real MEFFTATGAT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(desc="Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component" unit="" );
parameter real CBBTBOT = 1E-12 `from(`CBBT_cliplow ,inf ) `P(desc="Band-to-band tunneling prefactor of bottom component" unit="AV^-3" );
parameter real CBBTSTI = 1E-18 `from(`CBBT_cliplow ,inf ) `P(desc="Band-to-band tunneling prefactor of STI-edge component" unit="AV^-3m" );
parameter real CBBTGAT = 1E-18 `from(`CBBT_cliplow ,inf ) `P(desc="Band-to-band tunneling prefactor of gate-edge component" unit="AV^-3m" );
parameter real FBBTRBOT = 1E9 `P(desc="Normalization field at the reference temperature for band-to-band tunneling of bottom component" unit="Vm^-1" );
parameter real FBBTRSTI = 1E9 `P(desc="Normalization field at the reference temperature for band-to-band tunneling of STI-edge component" unit="Vm^-1" );
parameter real FBBTRGAT = 1E9 `P(desc="Normalization field at the reference temperature for band-to-band tunneling of gate-edge component" unit="Vm^-1" );
parameter real STFBBTBOT = -1E-3 `P(desc="Temperature scaling parameter for band-to-band tunneling of bottom component" unit="K^-1" );
parameter real STFBBTSTI = -1E-3 `P(desc="Temperature scaling parameter for band-to-band tunneling of STI-edge component" unit="K^-1" );
parameter real STFBBTGAT = -1E-3 `P(desc="Temperature scaling parameter for band-to-band tunneling of gate-edge component" unit="K^-1" );
parameter real VBRBOT = 10 `from(`VBR_cliplow ,inf ) `P(desc="Breakdown voltage of bottom component" unit="V" );
parameter real VBRSTI = 10 `from(`VBR_cliplow ,inf ) `P(desc="Breakdown voltage of STI-edge component" unit="V" );
parameter real VBRGAT = 10 `from(`VBR_cliplow ,inf ) `P(desc="Breakdown voltage of gate-edge component" unit="V" );
parameter real PBRBOT = 4 `from(`PBR_cliplow ,inf ) `P(desc="Breakdown onset tuning parameter of bottom component" unit="V" );
parameter real PBRSTI = 4 `from(`PBR_cliplow ,inf ) `P(desc="Breakdown onset tuning parameter of STI-edge component" unit="V" );
parameter real PBRGAT = 4 `from(`PBR_cliplow ,inf ) `P(desc="Breakdown onset tuning parameter of gate-edge component" unit="V" );

View File

@ -0,0 +1,67 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_varlist.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
// declaration of variables needed in macro "calcerfcexpmtat"
real ysq, terfc, erfcpos;
// declaration of variables needed in hypfunction 5
real h1, h2, h2d, h3, h4, h5;
// declaration of variables used within macro "juncapfunction"
real tmp, id;
real isrh, vbi_minus_vjsrh, wsrhstep, dwsrh, wsrh, wdep, asrh;
real itat, btat, twoatatoverthreebtat, umaxbeforelimiting, umax, sqrtumax, umaxpoweronepointfive;
real wgamma, wtat, ktat, ltat, mtat, xerfc, erfctimesexpmtat, gammamax;
real ibbt, Fmaxr;
real fbreakdown;
// declaration of clipped parameters
real TRJ_i, IMAX_i;
real CJORBOT_i, CJORSTI_i, CJORGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i;
real PBOT_i, PSTI_i, PGAT_i;
real IDSATRBOT_i, IDSATRSTI_i, IDSATRGAT_i, XJUNSTI_i, XJUNGAT_i;
real CSRHBOT_i, CSRHSTI_i, CSRHGAT_i, CTATBOT_i, CTATSTI_i, CTATGAT_i;
real MEFFTATBOT_i, MEFFTATSTI_i, MEFFTATGAT_i;
real CBBTBOT_i, CBBTSTI_i, CBBTGAT_i;
real VBRBOT_i, VBRSTI_i, VBRGAT_i, PBRBOT_i, PBRSTI_i, PBRGAT_i;
// declaration of variables calculated outside macro "juncapfunction", voltage-independent part
real tkr, tkd, auxt, KBOL_over_QELE, phitr, phitrinv, phitd, phitdinv;
real deltaphigr, phigrbot, phigrsti, phigrgat, deltaphigd, phigdbot, phigdsti, phigdgat;
real ftdbot, ftdsti, ftdgat, idsatbot, idsatsti, idsatgat, exp_VMAX_over_phitd;
real ubibot, ubisti, ubigat, vbibot, vbisti, vbigat;
real vbibot2, vbisti2, vbigat2, vbibot2r, vbisti2r, vbigat2r;
real vbiinvbot, vbiinvsti, vbiinvgat;
real one_minus_PBOT, one_minus_PSTI, one_minus_PGAT;
real one_over_one_minus_PBOT, one_over_one_minus_PSTI, one_over_one_minus_PGAT;
real cjobot, cjosti, cjogat, qprefbot, qprefsti, qprefgat;
real vbimin, vch, vfmin, vbbtlim;
real qpref2bot, qpref2sti, qpref2gat;
real wdepnulrbot, wdepnulrsti, wdepnulrgat, wdepnulrinvbot, wdepnulrinvsti, wdepnulrinvgat;
real VBIRBOTinv, VBIRSTIinv, VBIRGATinv;
real perfc, berfc, cerfc;
real deltaEbot, deltaEsti, deltaEgat, atatbot, atatsti, atatgat;
real btatpartbot, btatpartsti, btatpartgat;
real fbbtbot, fbbtsti, fbbtgat;
real fstopbot, fstopsti, fstopgat, VBRinvbot, VBRinvsti, VBRinvgat;
real slopebot, slopesti, slopegat;
real vmaxbot, vmaxsti, vmaxgat, VMAX;
// declaration of variables calculated outside macro "juncapfunction", voltage-dependent part
real VAK, idmult, vj, z, zinv, two_psistar, vjlim, vjsrh, vbbt, vav;

View File

@ -0,0 +1,303 @@
//======================================================================================
//======================================================================================
// Filename: PSP102_ChargesNQS.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
///////////////////////////////////////////////
//
// Calculate NQS-charge contributions
//
///////////////////////////////////////////////
Qp1 = vnorm * V(SPLINE1);
Qp2 = vnorm * V(SPLINE2);
Qp3 = vnorm * V(SPLINE3);
Qp4 = vnorm * V(SPLINE4);
Qp5 = vnorm * V(SPLINE5);
Qp6 = vnorm * V(SPLINE6);
Qp7 = vnorm * V(SPLINE7);
Qp8 = vnorm * V(SPLINE8);
Qp9 = vnorm * V(SPLINE9);
Tnorm = 0.0;
if (SWNQS_i != 0) begin
// Dimension and mobility information is included in Tnorm
Tnorm = MUNQS_i * phit1 * BET_i / (COX_qm * Gmob_dL);
thesat2 = thesat1 * thesat1 * phit1 * phit1;
if (SWNQS_i == 1) begin
dQy = QpN - Qp0;
d2Qy = 6.0 * (Qp0 + QpN) - 12.0 * Qp1;
end else if (SWNQS_i == 2) begin
dQy = (-7.0 * Qp0 - 3.0 * Qp1 + 12.0 * Qp2 - 2.0 * QpN) / 5.0;
d2Qy = -18.0 / 5.0 * (-4.0 * Qp0 + 9.0 * Qp1 - 6.0 * Qp2 + QpN);
end else if (SWNQS_i == 3) begin
dQy = (-13.0 * Qp0 - 6.0 * Qp1 + 24.0 * Qp2 - 6.0 * Qp3 + QpN) / 7.0;
d2Qy = (180.0 * Qp0 - 408.0 * Qp1 + 288.0 * Qp2 - 72.0 * Qp3 + 12.0 * QpN) / 7.0;
end else if (SWNQS_i == 5) begin
dQy = (-181.0 * Qp0 - 84.0 * Qp1 + 24.0 * Qp4 - 6.0 * Qp5 - 90.0 * Qp3 + QpN
+ 336.0 * Qp2) / 65.0;
d2Qy = (432.0 * Qp4 - 108.0 * Qp5 - 1620.0 * Qp3 + 18.0 * QpN + 3762.0 * Qp0
- 8532.0 * Qp1 + 6048.0 * Qp2) / 65.0;
end else if (SWNQS_i == 9) begin
dQy = (1680.0 * Qp6 + 23400.0 * Qp4 + 5.0 * QpN - 87330.0 * Qp3 + 120.0 * Qp8
- 450.0 * Qp7 - 81480.0 * Qp1 + 325920.0 * Qp2
-175565.0 * Qp0 - 30.0 * Qp9) / 37829.0 - 30.0 / 181.0 * Qp5;
d2Qy = (-13500.0 * Qp7 + 702000.0 * Qp4 - 2619900 * Qp3 - 13793100.0 * Qp1
+ 9777600.0 * Qp2 + 6081750.0 * Qp0 + 150.0 * QpN + 3600.0 * Qp8
- 900.0 * Qp9 + 50400 * Qp6) / 37829.0 - 900.0 / 181.0 * Qp5;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp1, xg, dQy, d2Qy, fk1)
end
if (SWNQS_i >= 2) begin
if (SWNQS_i == 2) begin
dQy = (2.0 * Qp0 - 12.0 * Qp1 + 3.0 * Qp2 + 7.0 * QpN) / 5.0;
d2Qy = -18.0 / 5.0 * (-4.0 * QpN + 9.0 * Qp2 - 6.0 * Qp1 + Qp0);
end else if (SWNQS_i == 3) begin
dQy = 0.5 * Qp0 - 3.0 * Qp1 + 3.0 * Qp3 - 0.5 * QpN;
d2Qy = (-48.0 * Qp0 + 288.0 * Qp1 - 480.0 * Qp2 + 288.0 * Qp3 - 48.0 * QpN) / 7.0;
end else if (SWNQS_i == 5) begin
dQy = (-291.0 * Qp1 - 6.0 * Qp2 - 84.0 * Qp4 + 21.0 * Qp5) / 65.0
+ (630.0 * Qp3 - 7.0 * QpN + 97.0 * Qp0) / 130.0;
d2Qy = (-1728.0 * Qp4 + 432.0 * Qp5 + 6480.0 * Qp3 - 72.0 * QpN - 1008 * Qp0
+ 6048 * Qp1 - 10152 * Qp2) / 65.0;
end else if (SWNQS_i == 9) begin
dQy = (-5880.0 * Qp6 - 81900.0 * Qp4 + 305655.0 * Qp3 - 420.0 * Qp8
+ 105.0 * Qp9 - 282255.0 * Qp1 + 1575.0 * Qp7 - 5850.0 * Qp2) / 37829.0
+ 105.0 / 181.0 * Qp5 + (94085.0 * Qp0 - 35.0 * QpN) / 75658.0;
d2Qy = (9777600.0 * Qp1 + 54000.0 * Qp7 - 2808000.0 * Qp4 + 10479600.0 * Qp3
- 16413000.0 * Qp2 - 1629600.0 * Qp0 - 600.0 * QpN - 14400.0 * Qp8
+ 3600.0 * Qp9 - 201600.0 * Qp6) / 37829.0 + 3600.0 * Qp5 / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp2, xg, dQy, d2Qy, fk2)
end
if (SWNQS_i >= 3) begin
if (SWNQS_i == 3) begin
dQy = (13.0 * QpN + 6.0 * Qp3 - 24.0 * Qp2 + 6.0 * Qp1 - Qp0) / 7.0;
d2Qy = (180.0 * QpN - 408.0 * Qp3 + 288.0 * Qp2 - 72.0 * Qp1 + 12.0 * Qp0) / 7.0;
end else if (SWNQS_i == 5) begin
dQy = (QpN - 6.0 * Qp5 + 24.0 * Qp4 - 24.0 * Qp2 + 6.0 * Qp1 - Qp0) / 5.0;
d2Qy = (1296.0 * (Qp4 + Qp2) - 324.0 * (Qp5 + Qp1) - 2052.0 * Qp3
+ 54.0 * (QpN + Qp0)) / 13.0;
end else if (SWNQS_i == 9) begin
dQy = (21840.0 * Qp6 + 304200.0 * Qp4 + 65.0 * QpN - 420.0 * Qp3 + 1560.0 * Qp8
- 12605.0 * Qp0-390.0 * Qp9 + 75630.0 * Qp1 - 5850.0 * Qp7
- 302520.0 * Qp2) / 37829.0 - 390.0 / 181.0 * Qp5;
d2Qy = (-2619900.0 * Qp1 - 202500.0 * Qp7 + 10530000.0 * Qp4 - 16601100.0 * Qp3
+ 10479600.0 * Qp2 + 436650.0 * Qp0 + 2250.0 * QpN + 54000.0 * Qp8
- 13500.0 * Qp9 + 756000.0 * Qp6) / 37829.0 - 13500.0 * Qp5 / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp3, xg, dQy, d2Qy, fk3)
end
if (SWNQS_i >= 4) begin
if (SWNQS_i == 5) begin
dQy = (-630.0 * Qp3 + 12.0 * Qp4 + 582.0 * Qp5 - 97.0 * QpN + 7.0 * Qp0
- 42.0 * Qp1 + 168.0 * Qp2)/130.0;
d2Qy = (-10152.0 * Qp4 + 6048.0 * Qp5 + 6480.0 * Qp3 - 1008.0 * QpN
- 72.0 * Qp0 + 432.0 * Qp1 - 1728.0 * Qp2) / 65.0;
end
else if (SWNQS_i == 9) begin
dQy = (-81480.0 * Qp6 - 30.0 * Qp4 - 303975.0 * Qp3 - 5820.0 * Qp8
+ 1455.0 * Qp9 - 20265.0 * Qp1 + 21825.0 * Qp7 + 81060.0 * Qp2) / 37829.0
- 485.0 / 75658.0 * QpN + 1455.0 * Qp5 / 181.0 + 6755.0 * Qp0 / 75658.0;
d2Qy = (702000.0 * Qp1 + 756000.0 * Qp7 - 16614600.0 * Qp4 + 10530000.0 * Qp3
- 2808000.0 * Qp2 - 117000.0 * Qp0 - 8400.0 * QpN - 201600.0 * Qp8
+ 50400.0 * Qp9 - 2822400.0 * Qp6) / 37829.0 + 50400.0 * Qp5 / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp4, xg, dQy, d2Qy, fk4)
end
if (SWNQS_i >= 5) begin
if (SWNQS_i == 5) begin
dQy = (-336.0 * Qp4 + 84.0 * Qp5 + 90.0 * Qp3 + 181.0 * QpN - Qp0 + 6.0 * Qp1
- 24.0 * Qp2) / 65.0;
d2Qy = (18.0 * Qp0 + 3762.0 * QpN + 6048.0 * Qp4 + 432.0 * Qp2 - 1620.0 * Qp3
- 108.0 * Qp1 - 8532.0 * Qp5) / 65.0;
end else if (SWNQS_i == 9) begin
dQy = (1680.0 * (Qp6 - Qp4) + 5.0 * (QpN - Qp0) + 450.0 * (Qp3 - Qp7)
+ 120.0 * (Qp8 - Qp2) - 30.0 * (Qp9 - Qp1)) / 209.0;
d2Qy = (-900.0 * (Qp1 + Qp9) - 13500.0 * (Qp7 + Qp3) - 79500.0 * Qp5
+ 50400.0 * (Qp4 + Qp6) + 3600.0 * (Qp2 + Qp8) + 150.0 * (Qp0 + QpN)) / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp5, xg, dQy, d2Qy, fk5)
end
if (SWNQS_i >= 6) begin
if (SWNQS_i == 9) begin
dQy = (30.0 * Qp6 + 81480.0 * Qp4 - 21825.0 * Qp3 - 81060.0 * Qp8 + 20265.0 * Qp9
- 1455.0 * Qp1 + 303975.0 * Qp7 + 5820.0 * Qp2) / 37829.0
-(6755.0 * QpN - 485.0 * Qp0) / 75658.0 - 1455.0 / 181.0 * Qp5;
d2Qy = (50400.0 * Qp1 + 10530000.0 * Qp7 - 2822400.0 * Qp4 + 756000.0 * Qp3
- 201600.0 * Qp2 - 8400.0 * Qp0 - 117000.0 * QpN - 2808000.0 * Qp8
+ 702000.0 * Qp9 - 16614600.0 * Qp6) / 37829.0 + 50400.0 * Qp5 / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp6, xg, dQy, d2Qy, fk6)
end
if (SWNQS_i >= 7) begin
if (SWNQS_i == 9) begin
dQy = (-304200.0 * Qp6 - 21840.0 * Qp4 + 12605.0 * QpN + 5850.0 * Qp3
+ 302520.0 * Qp8 - 65.0 * Qp0 - 75630.0 * Qp9 + 390.0 * Qp1 + 420.0 * Qp7
- 1560.0 * Qp2) / 37829.0 + 390.0 / 181.0 * Qp5;
d2Qy = (-13500.0 * Qp1 - 16601100.0 * Qp7 + 756000.0 * Qp4 - 202500.0 * Qp3
+ 54000.0 * Qp2 + 2250.0 * Qp0 + 436650.0 * QpN + 10479600.0 * Qp8
- 2619900.0 * Qp9 + 10530000.0 * Qp6) / 37829.0 - 13500.0 * Qp5 / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp7, xg, dQy, d2Qy, fk7)
end
if (SWNQS_i >= 8) begin
if (SWNQS_i == 9) begin
dQy = (81900.0 * Qp6 + 5880.0 * Qp4 - 1575.0 * Qp3 + 5850.0 * Qp8 + 282255.0 * Qp9
- 105.0 * Qp1 - 305655.0 * Qp7 + 420.0 * Qp2) / 37829.0 + (35.0 * Qp0
- 94085.0 * QpN) / 75658.0 - 105.0 / 181.0 * Qp5;
d2Qy = (3600.0 * Qp1 + 10479600.0 * Qp7 - 201600.0 * Qp4 + 54000.0 * Qp3
- 14400.0 * Qp2 - 600.0 * Qp0 - 1629600.0 * QpN - 16413000.0 * Qp8
+ 9777600.0 * Qp9 - 2808000.0 * Qp6) / 37829.0 + 3600.0 * Qp5 / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp8, xg, dQy, d2Qy, fk8)
end
if (SWNQS_i >= 9) begin
if (SWNQS_i == 9) begin
dQy = (-23400.0 * Qp6 - 1680.0 * Qp4 + 175565.0 * QpN + 450.0 * Qp3
- 325920.0 * Qp8 - 5.0 * Qp0 + 81480.0 * Qp9 + 30.0 * Qp1
+ 87330.0 * Qp7 - 120.0 * Qp2) / 37829.0 + 30.0 * Qp5 / 181.0;
d2Qy = (-900.0 * Qp1 - 2619900.0 * Qp7 + 50400.0 * Qp4 - 13500.0 * Qp3
+ 3600.0 * Qp2 + 150.0 * Qp0 + 6081750.0 * QpN + 9777600.0 * Qp8
- 13793100.0 * Qp9 + 702000.0 * Qp6) / 37829.0 - 900.0 * Qp5 / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp9, xg, dQy, d2Qy, fk9)
end
//--------------------------------------------------------------------
// Terminal charges for NQS
if (SWNQS_i != 0) begin
if (SWNQS_i == 1) begin
QS_NQS = (17.0 * Qp0 + 30.0 * Qp1 + QpN) / 96.0;
QD_NQS = (Qp0 + 30.0 * Qp1 + 17.0 * QpN) / 96.0;
`QiToPhi(Qp1,xg, temp1)
QG_NQS = xg - (x_sp + 4.0 * temp1 + x_dp) * `oneSixth;
end else if (SWNQS_i == 2) begin
QS_NQS = (11.0 * Qp0 + 24.0 * Qp1 + 9.0 * Qp2 + QpN) / 90.0;
QD_NQS = (11.0 * QpN + 24.0 * Qp2 + 9.0 * Qp1 + Qp0) / 90.0;
`QiToPhi(Qp1, xg, temp1)
`QiToPhi(Qp2, xg, temp2)
QG_NQS = xg - (x_sp + 3.0 * (temp1 + temp2) + x_dp) * 0.125;
end else if (SWNQS_i == 3) begin
QS_NQS = (251.0 * Qp0 + 594.0 * Qp1 + 312.0 * Qp2 + 174.0 * Qp3 + 13.0 * QpN) / 2688.0;
QD_NQS = (251.0 * QpN + 594.0 * Qp3 + 312.0 * Qp2 + 174.0 * Qp1 + 13.0 * Qp0) / 2688.0;
`QiToPhi(Qp1, xg, temp1)
`QiToPhi(Qp2, xg, temp2)
`QiToPhi(Qp3, xg, temp3)
QG_NQS = xg - (x_sp + 4.0 * temp1 + 2.0 * temp2 + 4.0 * temp3 + x_dp) / 12.0;
end else if (SWNQS_i == 5) begin
QS_NQS = (1187.0 * Qp0 + 43.0 * QpN) / 18720.0 + (503.0 * Qp1 + 172.0 * Qp4
+ 87.0 * Qp5 + 265.0 * Qp3 + 328.0 * Qp2) / 3120.0;
QD_NQS = (1187.0 * QpN + 43.0 * Qp0) / 18720.0 + (503.0 * Qp5 + 172.0 * Qp2
+ 87.0 * Qp1 + 265.0 * Qp3 + 328.0 * Qp4) / 3120.0;
`QiToPhi(Qp1, xg, temp1)
`QiToPhi(Qp2, xg, temp2)
`QiToPhi(Qp3, xg, temp3)
`QiToPhi(Qp4, xg, temp4)
`QiToPhi(Qp5, xg, temp5)
QG_NQS = xg - (x_sp + 4.0 * (temp1 + temp3 + temp5) + 2.0 * (temp2 + temp4) + x_dp) / 18.0;
end else if (SWNQS_i == 9) begin
QS_NQS = (75653.0 * Qp8 + 225999.0 * Qp4) / 3782900.0 + (151321.0 * Qp9
+ 454023.0 * Qp7 + 1073767.0 * Qp3 + 1564569.0 * Qp1) / 15131600.0
+ 75623.0 * Qp6 / 1891450.0 + 145.0 * Qp5 / 2896.0 + 72263.0 * Qp2 / 945725.0
+ (3504517.0 * Qp0 + 75653.0 * QpN) / 90789600.0;
QD_NQS = (75653.0 * Qp2 + 225999.0 * Qp6) / 3782900.0 + (151321.0 * Qp1
+ 454023.0 * Qp3 + 1073767.0 * Qp7 + 1564569.0 * Qp9) / 15131600.0
+ 75623.0 * Qp4 / 1891450.0 + 145.0 * Qp5 / 2896.0 + 72263.0 * Qp8 / 945725.0
+ (3504517.0 * QpN + 75653.0 * Qp0) / 90789600.0;
`QiToPhi(Qp1, xg, temp1)
`QiToPhi(Qp2, xg, temp2)
`QiToPhi(Qp3, xg, temp3)
`QiToPhi(Qp4, xg, temp4)
`QiToPhi(Qp5, xg, temp5)
`QiToPhi(Qp6, xg, temp6)
`QiToPhi(Qp7, xg, temp7)
`QiToPhi(Qp8, xg, temp8)
`QiToPhi(Qp9, xg, temp9)
QG_NQS = xg - (x_sp + 4.0 * (temp1 + temp3 + temp5 + temp7 + temp9)
+ 2.0 * (temp2 + temp4 + temp6 + temp8) + x_dp) / 30.0;
end
QG_NQS = pd * QG_NQS;
if (sigVds > 0) begin
Qs = COX_qm * phit1 * QS_NQS;
Qd = COX_qm * phit1 * QD_NQS;
end else begin
Qs = COX_qm * phit1 * QD_NQS;
Qd = COX_qm * phit1 * QS_NQS;
end
Qg = COX_qm * phit1 * QG_NQS;
Qb = -Qg - Qs - Qd;
end
// Update internal nodes
V(RES1) <+ vnorm_inv * I(RES1) * r_nqs;
V(SPLINE1) <+ idt(-vnorm_inv * Tnorm * fk1, Qp1_0);
V(RES2) <+ vnorm_inv * I(RES2) * r_nqs;
V(SPLINE2) <+ idt(-vnorm_inv * Tnorm * fk2, Qp2_0);
V(RES3) <+ vnorm_inv * I(RES3) * r_nqs;
V(SPLINE3) <+ idt(-vnorm_inv * Tnorm * fk3, Qp3_0);
V(RES4) <+ vnorm_inv * I(RES4) * r_nqs;
V(SPLINE4) <+ idt(-vnorm_inv * Tnorm * fk4, Qp4_0);
V(RES5) <+ vnorm_inv * I(RES5) * r_nqs;
V(SPLINE5) <+ idt(-vnorm_inv * Tnorm * fk5, Qp5_0);
V(RES6) <+ vnorm_inv * I(RES6) * r_nqs;
V(SPLINE6) <+ idt(-vnorm_inv * Tnorm * fk6, Qp6_0);
V(RES7) <+ vnorm_inv * I(RES7) * r_nqs;
V(SPLINE7) <+ idt(-vnorm_inv * Tnorm * fk7, Qp7_0);
V(RES8) <+ vnorm_inv * I(RES8) * r_nqs;
V(SPLINE8) <+ idt(-vnorm_inv * Tnorm * fk8, Qp8_0);
V(RES9) <+ vnorm_inv * I(RES9) * r_nqs;
V(SPLINE9) <+ idt(-vnorm_inv * Tnorm * fk9, Qp9_0);

View File

@ -0,0 +1,190 @@
//======================================================================================
//======================================================================================
// Filename: PSP102_InitNQS.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
/////////////////////////////////////////////////////////////////////////////
//
// Computing initial (dc) values for internal nodes.
// This code is independent of internal-node voltages
//
/////////////////////////////////////////////////////////////////////////////
Qp1_0 = 0.0;
Qp2_0 = 0.0;
Qp3_0 = 0.0;
Qp4_0 = 0.0;
Qp5_0 = 0.0;
Qp6_0 = 0.0;
Qp7_0 = 0.0;
Qp8_0 = 0.0;
Qp9_0 = 0.0;
fk1 = 0.0;
fk2 = 0.0;
fk3 = 0.0;
fk4 = 0.0;
fk5 = 0.0;
fk6 = 0.0;
fk7 = 0.0;
fk8 = 0.0;
fk9 = 0.0;
if (SWNQS_i != 0) begin
dQis = 0.0;
dQy = 0.0;
dfQi = 0.0;
fQi = 0.0;
d2Qy = 0.0;
Qp1 = 0.0;
Qp2 = 0.0;
Qp3 = 0.0;
Qp4 = 0.0;
Qp5 = 0.0;
Qp6 = 0.0;
Qp7 = 0.0;
Qp8 = 0.0;
Qp9 = 0.0;
phi_p1 = 0.0;
phi_p2 = 0.0;
phi_p3 = 0.0;
phi_p4 = 0.0;
phi_p5 = 0.0;
phi_p6 = 0.0;
phi_p7 = 0.0;
phi_p8 = 0.0;
phi_p9 = 0.0;
// Setting initial values for charge along the channel
// from interpolated DC-solution
if (xg > 0) begin
if (SWNQS_i == 1) begin
phi_p1 = `Phiy(0.5);
`PhiToQb(phi_p1,Qb_tmp)
Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp;
end else if (SWNQS_i == 2) begin
phi_p1 = `Phiy(`oneThird);
`PhiToQb(phi_p1,Qb_tmp)
Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp;
phi_p2 = `Phiy(`twoThirds);
`PhiToQb(phi_p2,Qb_tmp)
Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp;
if (sigVds < 0) begin
`swap(Qp1_0, Qp2_0)
end
end else if (SWNQS_i == 3) begin
phi_p1 = `Phiy(0.25);
`PhiToQb(phi_p1,Qb_tmp)
Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp;
phi_p2 = `Phiy(0.5);
`PhiToQb(phi_p2,Qb_tmp)
Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp;
phi_p3 = `Phiy(0.75);
`PhiToQb(phi_p3,Qb_tmp)
Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp;
if (sigVds < 0) begin
`swap(Qp1_0, Qp3_0)
end
end else if (SWNQS_i == 5) begin
phi_p1 = `Phiy(`oneSixth);
`PhiToQb(phi_p1,Qb_tmp)
Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp;
phi_p2 = `Phiy(`oneThird);
`PhiToQb(phi_p2,Qb_tmp)
Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp;
phi_p3 = `Phiy(0.5);
`PhiToQb(phi_p3,Qb_tmp)
Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp;
phi_p4 = `Phiy(`twoThirds);
`PhiToQb(phi_p4,Qb_tmp)
Qp4_0 = -pd * (xg - phi_p4) - Qb_tmp;
phi_p5 = `Phiy(0.8333333333333333);
`PhiToQb(phi_p5,Qb_tmp)
Qp5_0 = -pd * (xg - phi_p5) - Qb_tmp;
if (sigVds < 0) begin
`swap(Qp1_0, Qp5_0)
`swap(Qp2_0, Qp4_0)
end
end else if (SWNQS_i == 9) begin
phi_p1 = `Phiy(0.1);
`PhiToQb(phi_p1,Qb_tmp)
Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp;
phi_p2 = `Phiy(0.2);
`PhiToQb(phi_p2,Qb_tmp)
Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp;
phi_p3 = `Phiy(0.3);
`PhiToQb(phi_p3,Qb_tmp)
Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp;
phi_p4 = `Phiy(0.4);
`PhiToQb(phi_p4,Qb_tmp)
Qp4_0 = -pd * (xg - phi_p4) - Qb_tmp;
phi_p5 = `Phiy(0.5);
`PhiToQb(phi_p5,Qb_tmp)
Qp5_0 = -pd * (xg - phi_p5) - Qb_tmp;
phi_p6 = `Phiy(0.6);
`PhiToQb(phi_p6,Qb_tmp)
Qp6_0 = -pd * (xg - phi_p6) - Qb_tmp;
phi_p7 = `Phiy(0.7);
`PhiToQb(phi_p7,Qb_tmp)
Qp7_0 = -pd * (xg - phi_p7) - Qb_tmp;
phi_p8 = `Phiy(0.8);
`PhiToQb(phi_p8,Qb_tmp)
Qp8_0 = -pd * (xg - phi_p8) - Qb_tmp;
phi_p9 = `Phiy(0.9);
`PhiToQb(phi_p9,Qb_tmp)
Qp9_0 = -pd * (xg - phi_p9) - Qb_tmp;
if (sigVds < 0) begin
`swap(Qp1_0, Qp9_0)
`swap(Qp2_0, Qp8_0)
`swap(Qp3_0, Qp7_0)
`swap(Qp4_0, Qp6_0)
end
end
end // (x_g >0)
end // (SWNQS_i != 0)
x_sp = 0.0;
x_dp = 0.0;
Qp0 = 0.0;
QpN = 0.0;
if (SWNQS_i != 0.0) begin
x_sp = x_m - sigVds * 0.5 * dps * inv_phit1;
x_dp = x_m + sigVds * 0.5 * dps * inv_phit1;
Qp0 = 0.0;
QpN = 0.0;
if (x_sp > 0) begin
`PhiToQb(x_sp, QbSIGN)
Qp0 = -pd * (xg - x_sp) - QbSIGN;
end
if (x_dp > 0) begin
`PhiToQb(x_dp, QbSIGN)
QpN = -pd * (xg - x_dp) - QbSIGN;
end
end

View File

@ -0,0 +1,127 @@
//======================================================================================
//======================================================================================
// Filename: PSP102_binning.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
// auxiliary variables
iLEWE = iLE * iWE;
iiLE = LE / LEN;
iiWE = WE / WEN;
iiLEWE = iiLE * iiWE;
iiiLEWE = iiWE / iiLE;
// auxiliary variables for COX only
iiLEcv = LEcv / LEN;
iiWEcv = WEcv / WEN;
iiLEWEcv = iiLEcv * iiWEcv;
// auxiliary variables for CGOV only
iLEcv = LEN / LEcv;
iiiLEWEcv = iiWEcv / iiLEcv;
// auxiliary variables for CGBOV only
iiLcv = Lcv / LEN;
iiWcv = Wcv / WEN;
iiLWcv = iiLcv * iiWcv;
// auxiliary variables for CFR only
iLcv = LEN / Lcv;
iiiLWcv = iiWcv / iiLcv;
// Process parameters
VFB = POVFB + iLE * PLVFB + iWE * PWVFB + iLEWE * PLWVFB;
STVFB = POSTVFB + iLE * PLSTVFB + iWE * PWSTVFB + iLEWE * PLWSTVFB;
TOX = POTOX;
NEFF = PONEFF + iLE * PLNEFF + iWE * PWNEFF + iLEWE * PLWNEFF;
VNSUB = POVNSUB;
NSLP = PONSLP;
DNSUB = PODNSUB;
DPHIB = PODPHIB + iLE * PLDPHIB + iWE * PWDPHIB + iLEWE * PLWDPHIB;
NP = PONP + iLE * PLNP + iWE * PWNP + iLEWE * PLWNP;
CT = POCT + iLE * PLCT + iWE * PWCT + iLEWE * PLWCT;
TOXOV = POTOXOV;
NOV = PONOV + iLE * PLNOV + iWE * PWNOV + iLEWE * PLWNOV;
// DIBL parameters
CF = POCF + iLE * PLCF + iWE * PWCF + iLEWE * PLWCF;
CFB = POCFB;
// Mobility parameters
BETN = POBETN + iLE * PLBETN + iiWE * PWBETN + iiiLEWE * PLWBETN;
STBET = POSTBET + iLE * PLSTBET + iWE * PWSTBET + iLEWE * PLWSTBET;
MUE = POMUE + iLE * PLMUE + iWE * PWMUE + iLEWE * PLWMUE;
STMUE = POSTMUE;
THEMU = POTHEMU;
STTHEMU = POSTTHEMU;
CS = POCS + iLE * PLCS + iWE * PWCS + iLEWE * PLWCS;
STCS = POSTCS;
XCOR = POXCOR + iLE * PLXCOR + iWE * PWXCOR + iLEWE * PLWXCOR;
STXCOR = POSTXCOR;
FETA = POFETA;
// Series resistance parameters
RS = PORS + iLE * PLRS + iWE * PWRS + iLEWE * PLWRS;
STRS = POSTRS;
RSB = PORSB;
RSG = PORSG;
// Velocity saturation parameters
THESAT = POTHESAT + iLE * PLTHESAT + iWE * PWTHESAT + iLEWE * PLWTHESAT;
STTHESAT = POSTTHESAT + iLE * PLSTTHESAT + iWE * PWSTTHESAT + iLEWE * PLWSTTHESAT;
THESATB = POTHESATB + iLE * PLTHESATB + iWE * PWTHESATB + iLEWE * PLWTHESATB;
THESATG = POTHESATG + iLE * PLTHESATG + iWE * PWTHESATG + iLEWE * PLWTHESATG;
// Saturation voltage parameters
AX = POAX + iLE * PLAX + iWE * PWAX + iLEWE * PLWAX;
// Channel length modulation (CLM) parameters
ALP = POALP + iLE * PLALP + iWE * PWALP + iLEWE * PLWALP;
ALP1 = POALP1 + iLE * PLALP1 + iWE * PWALP1 + iLEWE * PLWALP1;
ALP2 = POALP2 + iLE * PLALP2 + iWE * PWALP2 + iLEWE * PLWALP2;
VP = POVP;
// Impact ionization parameters
A1 = POA1 + iLE * PLA1 + iWE * PWA1 + iLEWE * PLWA1;
A2 = POA2;
STA2 = POSTA2;
A3 = POA3 + iLE * PLA3 + iWE * PWA3 + iLEWE * PLWA3;
A4 = POA4 + iLE * PLA4 + iWE * PWA4 + iLEWE * PLWA4;
GCO = POGCO;
// Gate current parameters
IGINV = POIGINV + iiLE * PLIGINV + iiWE * PWIGINV + iiLEWE * PLWIGINV;
IGOV = POIGOV + iLE * PLIGOV + iiWE * PWIGOV + iiiLEWE * PLWIGOV;
STIG = POSTIG;
GC2 = POGC2;
GC3 = POGC3;
CHIB = POCHIB;
// Gate-induced drain leakage (GIDL) parameters
AGIDL = POAGIDL + iLE * PLAGIDL + iiWE * PWAGIDL + iiiLEWE * PLWAGIDL;
BGIDL = POBGIDL;
STBGIDL = POSTBGIDL;
CGIDL = POCGIDL;
// Charge model parameters
COX = POCOX + iiLEcv * PLCOX + iiWEcv * PWCOX + iiLEWEcv * PLWCOX;
CGOV = POCGOV + iLEcv * PLCGOV + iiWEcv * PWCGOV + iiiLEWEcv * PLWCGOV;
CGBOV = POCGBOV + iiLcv * PLCGBOV + iiWcv * PWCGBOV + iiLWcv * PLWCGBOV;
CFR = POCFR + iLcv * PLCFR + iiWcv * PWCFR + iiiLWcv * PLWCFR;
// Noise model parameters
FNT = POFNT;
NFA = PONFA + iLE * PLNFA + iWE * PWNFA + iLEWE * PLWNFA;
NFB = PONFB + iLE * PLNFB + iWE * PWNFB + iLEWE * PLWNFB;
NFC = PONFC + iLE * PLNFC + iWE * PWNFC + iLEWE * PLWNFC;

View File

@ -0,0 +1,233 @@
//======================================================================================
//======================================================================================
// Filename: PSP102_binpars.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
///////////////////////////////////////////////////
// PSP global model parameters (binning)
///////////////////////////////////////////////////
parameter real LEVEL = 1021 `P(desc="Model level" unit="" );
parameter real TYPE = 1 `from( -1.0,1.0 ) `P(desc="Channel type parameter, +1=NMOS -1=PMOS" unit="" );
parameter real TR = 21 `from( -273.0,inf ) `P(desc="nominal (reference) temperature" unit="C" );
// Switch parameters
parameter real SWIGATE = 0 `from( 0.0,1.0 ) `P(desc="Flag for gate current, 0=turn off IG" unit="" );
parameter real SWIMPACT = 0 `from( 0.0,1.0 ) `P(desc="Flag for impact ionization current, 0=turn off II" unit="" );
parameter real SWGIDL = 0 `from( 0.0,1.0 ) `P(desc="Flag for GIDL current, 0=turn off IGIDL" unit="" );
parameter real SWJUNCAP = 0 `from( 0.0,3.0 ) `P(desc="Flag for juncap, 0=turn off juncap" unit="" );
parameter real QMC = 1 `from( 0.0,inf ) `P(desc="Quantum-mechanical correction factor" unit="" );
// Process parameters
parameter real LVARO = 0 `P(desc="Geometry independent difference between actual and programmed poly-silicon gate length" unit="m" );
parameter real LVARL = 0 `P(desc="Length dependence of difference between actual and programmed poly-silicon gate length" unit="" );
parameter real LAP = 0 `P(desc="Effective channel length reduction per side due to lateral diffusion of source/drain dopant ions" unit="m" );
parameter real WVARO = 0 `P(desc="Geometry independent difference between actual and programmed field-oxide opening" unit="m" );
parameter real WVARW = 0 `P(desc="Width dependence of difference between actual and programmed field-oxide opening" unit="" );
parameter real WOT = 0 `P(desc="Effective reduction of channel width per side due to lateral diffusion of channel-stop dopant ions" unit="m" );
parameter real DLQ = 0 `P(desc="Effective channel length reduction for CV" unit="m" );
parameter real DWQ = 0 `P(desc="Effective channel width reduction for CV" unit="m" );
parameter real POVFB = -1 `P(desc="Coefficient for the geometry independent part of VFB" unit="V" );
parameter real PLVFB = 0.0 `P(desc="Coefficient for the length dependence of VFB" unit="V" );
parameter real PWVFB = 0.0 `P(desc="Coefficient for the width dependence of VFB" unit="V" );
parameter real PLWVFB = 0.0 `P(desc="Coefficient for the length times width dependence of VFB" unit="V" );
parameter real POSTVFB = 0.0005 `P(desc="Coefficient for the geometry independent part of STVFB" unit="V/K" );
parameter real PLSTVFB = 0.0 `P(desc="Coefficient for the length dependence of STVFB" unit="V/K" );
parameter real PWSTVFB = 0.0 `P(desc="Coefficient for the width dependence of STVFB" unit="V/K" );
parameter real PLWSTVFB = 0.0 `P(desc="Coefficient for the length times width dependence of STVFB" unit="V/K" );
parameter real POTOX = 2E-09 `P(desc="Coefficient for the geometry independent part of TOX" unit="m" );
parameter real PONEFF = 5E+23 `P(desc="Coefficient for the geometry independent part of NEFF" unit="m^-3" );
parameter real PLNEFF = 0.0 `P(desc="Coefficient for the length dependence of NEFF" unit="m^-3" );
parameter real PWNEFF = 0.0 `P(desc="Coefficient for the width dependence of NEFF" unit="m^-3" );
parameter real PLWNEFF = 0.0 `P(desc="Coefficient for the length times width dependence of NEFF" unit="m^-3" );
parameter real POVNSUB = 0 `P(desc="Coefficient for the geometry independent part of VNSUB" unit="V" );
parameter real PONSLP = 0.05 `P(desc="Coefficient for the geometry independent part of NSLP" unit="V" );
parameter real PODNSUB = 0 `P(desc="Coefficient for the geometry independent part of DNSUB" unit="V^-1" );
parameter real PODPHIB = 0 `P(desc="Coefficient for the geometry independent part of DPHIB" unit="V" );
parameter real PLDPHIB = 0.0 `P(desc="Coefficient for the length dependence of DPHIB" unit="V" );
parameter real PWDPHIB = 0.0 `P(desc="Coefficient for the width dependence of DPHIB" unit="V" );
parameter real PLWDPHIB = 0.0 `P(desc="Coefficient for the length times width dependence of DPHIB" unit="V" );
parameter real PONP = 1E+26 `P(desc="Coefficient for the geometry independent part of NP" unit="m^-3" );
parameter real PLNP = 0.0 `P(desc="Coefficient for the length dependence of NP" unit="m^-3" );
parameter real PWNP = 0.0 `P(desc="Coefficient for the width dependence of NP" unit="m^-3" );
parameter real PLWNP = 0.0 `P(desc="Coefficient for the length times width dependence of NP" unit="m^-3" );
parameter real POCT = 0 `P(desc="Coefficient for the geometry independent part of CT" unit="" );
parameter real PLCT = 0.0 `P(desc="Coefficient for the length dependence of CT" unit="" );
parameter real PWCT = 0.0 `P(desc="Coefficient for the width dependence of CT" unit="" );
parameter real PLWCT = 0.0 `P(desc="Coefficient for the length times width dependence of CT" unit="" );
parameter real POTOXOV = 2E-09 `P(desc="Coefficient for the geometry independent part of TOXOV" unit="m" );
parameter real PONOV = 5E+25 `P(desc="Coefficient for the geometry independent part of NOV" unit="m^-3" );
parameter real PLNOV = 0.0 `P(desc="Coefficient for the length dependence of NOV" unit="m^-3" );
parameter real PWNOV = 0.0 `P(desc="Coefficient for the width dependence of NOV" unit="m^-3" );
parameter real PLWNOV = 0.0 `P(desc="Coefficient for the length times width dependence of NOV" unit="m^-3" );
// DIBL parameters
parameter real POCF = 0 `P(desc="Coefficient for the geometry independent part of CF" unit="V^-1" );
parameter real PLCF = 0.0 `P(desc="Coefficient for the length dependence of CF" unit="V^-1" );
parameter real PWCF = 0.0 `P(desc="Coefficient for the width dependence of CF" unit="V^-1" );
parameter real PLWCF = 0.0 `P(desc="Coefficient for the length times width dependence of CF" unit="V^-1" );
parameter real POCFB = 0 `P(desc="Coefficient for the geometry independent part of CFB" unit="V^-1" );
// Mobility parameters
parameter real POBETN = 0.07 `P(desc="Coefficient for the geometry independent part of BETN" unit="m^2/V/s" );
parameter real PLBETN = 0.0 `P(desc="Coefficient for the length dependence of BETN" unit="m^2/V/s" );
parameter real PWBETN = 0.0 `P(desc="Coefficient for the width dependence of BETN" unit="m^2/V/s" );
parameter real PLWBETN = 0.0 `P(desc="Coefficient for the length times width dependence of BETN" unit="m^2/V/s" );
parameter real POSTBET = 1 `P(desc="Coefficient for the geometry independent part of STBET" unit="" );
parameter real PLSTBET = 0.0 `P(desc="Coefficient for the length dependence of STBET" unit="" );
parameter real PWSTBET = 0.0 `P(desc="Coefficient for the width dependence of STBET" unit="" );
parameter real PLWSTBET = 0.0 `P(desc="Coefficient for the length times width dependence of STBET" unit="" );
parameter real POMUE = 0.5 `P(desc="Coefficient for the geometry independent part of MUE" unit="m/V" );
parameter real PLMUE = 0.0 `P(desc="Coefficient for the length dependence of MUE" unit="m/V" );
parameter real PWMUE = 0.0 `P(desc="Coefficient for the width dependence of MUE" unit="m/V" );
parameter real PLWMUE = 0.0 `P(desc="Coefficient for the length times width dependence of MUE" unit="m/V" );
parameter real POSTMUE = 0 `P(desc="Coefficient for the geometry independent part of STMUE" unit="" );
parameter real POTHEMU = 1.5 `P(desc="Coefficient for the geometry independent part of THEMU" unit="" );
parameter real POSTTHEMU = 1.5 `P(desc="Coefficient for the geometry independent part of STTHEMU" unit="" );
parameter real POCS = 0 `P(desc="Coefficient for the geometry independent part of CS" unit="" );
parameter real PLCS = 0.0 `P(desc="Coefficient for the length dependence of CS" unit="" );
parameter real PWCS = 0.0 `P(desc="Coefficient for the width dependence of CS" unit="" );
parameter real PLWCS = 0.0 `P(desc="Coefficient for the length times width dependence of CS" unit="" );
parameter real POSTCS = 0 `P(desc="Coefficient for the geometry independent part of STCS" unit="" );
parameter real POXCOR = 0 `P(desc="Coefficient for the geometry independent part of XCOR" unit="V^-1" );
parameter real PLXCOR = 0.0 `P(desc="Coefficient for the length dependence of XCOR" unit="V^-1" );
parameter real PWXCOR = 0.0 `P(desc="Coefficient for the width dependence of XCOR" unit="V^-1" );
parameter real PLWXCOR = 0.0 `P(desc="Coefficient for the length times width dependence of XCOR" unit="V^-1" );
parameter real POSTXCOR = 0 `P(desc="Coefficient for the geometry independent part of STXCOR" unit="" );
parameter real POFETA = 1 `P(desc="Coefficient for the geometry independent part of FETA" unit="" );
// Series resistance parameters
parameter real PORS = 30 `P(desc="Coefficient for the geometry independent part of RS" unit="Ohm" );
parameter real PLRS = 0.0 `P(desc="Coefficient for the length dependence of RS" unit="Ohm" );
parameter real PWRS = 0.0 `P(desc="Coefficient for the width dependence of RS" unit="Ohm" );
parameter real PLWRS = 0.0 `P(desc="Coefficient for the length times width dependence of RS" unit="Ohm" );
parameter real POSTRS = 1 `P(desc="Coefficient for the geometry independent part of STRS" unit="" );
parameter real PORSB = 0 `P(desc="Coefficient for the geometry independent part of RSB" unit="V^-1" );
parameter real PORSG = 0 `P(desc="Coefficient for the geometry independent part of RSG" unit="V^-1" );
// Velocity saturation parameters
parameter real POTHESAT = 1 `P(desc="Coefficient for the geometry independent part of THESAT" unit="V^-1" );
parameter real PLTHESAT = 0.0 `P(desc="Coefficient for the length dependence of THESAT" unit="V^-1" );
parameter real PWTHESAT = 0.0 `P(desc="Coefficient for the width dependence of THESAT" unit="V^-1" );
parameter real PLWTHESAT = 0.0 `P(desc="Coefficient for the length times width dependence of THESAT" unit="V^-1" );
parameter real POSTTHESAT = 1 `P(desc="Coefficient for the geometry independent part of STTHESAT" unit="" );
parameter real PLSTTHESAT = 0.0 `P(desc="Coefficient for the length dependence of STTHESAT" unit="" );
parameter real PWSTTHESAT = 0.0 `P(desc="Coefficient for the width dependence of STTHESAT" unit="" );
parameter real PLWSTTHESAT = 0.0 `P(desc="Coefficient for the length times width dependence of STTHESAT" unit="" );
parameter real POTHESATB = 0 `P(desc="Coefficient for the geometry independent part of THESATB" unit="V^-1" );
parameter real PLTHESATB = 0.0 `P(desc="Coefficient for the length dependence of THESATB" unit="V^-1" );
parameter real PWTHESATB = 0.0 `P(desc="Coefficient for the width dependence of THESATB" unit="V^-1" );
parameter real PLWTHESATB = 0.0 `P(desc="Coefficient for the length times width dependence of THESATB" unit="V^-1" );
parameter real POTHESATG = 0 `P(desc="Coefficient for the geometry independent part of THESATG" unit="V^-1" );
parameter real PLTHESATG = 0.0 `P(desc="Coefficient for the length dependence of THESATG" unit="V^-1" );
parameter real PWTHESATG = 0.0 `P(desc="Coefficient for the width dependence of THESATG" unit="V^-1" );
parameter real PLWTHESATG = 0.0 `P(desc="Coefficient for the length times width dependence of THESATG" unit="V^-1" );
// Saturation voltage parameters
parameter real POAX = 3 `P(desc="Coefficient for the geometry independent part of AX" unit="" );
parameter real PLAX = 0.0 `P(desc="Coefficient for the length dependence of AX" unit="" );
parameter real PWAX = 0.0 `P(desc="Coefficient for the width dependence of AX" unit="" );
parameter real PLWAX = 0.0 `P(desc="Coefficient for the length times width dependence of AX" unit="" );
// Channel length modulation (CLM) parameters
parameter real POALP = 0.01 `P(desc="Coefficient for the geometry independent part of ALP" unit="" );
parameter real PLALP = 0.0 `P(desc="Coefficient for the length dependence of ALP" unit="" );
parameter real PWALP = 0.0 `P(desc="Coefficient for the width dependence of ALP" unit="" );
parameter real PLWALP = 0.0 `P(desc="Coefficient for the length times width dependence of ALP" unit="" );
parameter real POALP1 = 0 `P(desc="Coefficient for the geometry independent part of ALP1" unit="V" );
parameter real PLALP1 = 0.0 `P(desc="Coefficient for the length dependence of ALP1" unit="V" );
parameter real PWALP1 = 0.0 `P(desc="Coefficient for the width dependence of ALP1" unit="V" );
parameter real PLWALP1 = 0.0 `P(desc="Coefficient for the length times width dependence of ALP1" unit="V" );
parameter real POALP2 = 0 `P(desc="Coefficient for the geometry independent part of ALP2" unit="V^-1" );
parameter real PLALP2 = 0.0 `P(desc="Coefficient for the length dependence of ALP2" unit="V^-1" );
parameter real PWALP2 = 0.0 `P(desc="Coefficient for the width dependence of ALP2" unit="V^-1" );
parameter real PLWALP2 = 0.0 `P(desc="Coefficient for the length times width dependence of ALP2" unit="V^-1" );
parameter real POVP = 0.05 `P(desc="Coefficient for the geometry independent part of VP" unit="V" );
// Impact ionization parameters
parameter real POA1 = 1 `P(desc="Coefficient for the geometry independent part of A1" unit="" );
parameter real PLA1 = 0.0 `P(desc="Coefficient for the length dependence of A1" unit="" );
parameter real PWA1 = 0.0 `P(desc="Coefficient for the width dependence of A1" unit="" );
parameter real PLWA1 = 0.0 `P(desc="Coefficient for the length times width dependence of A1" unit="" );
parameter real POA2 = 10 `P(desc="Coefficient for the geometry independent part of A2" unit="V" );
parameter real POSTA2 = 0 `P(desc="Coefficient for the geometry independent part of STA2" unit="V" );
parameter real POA3 = 1 `P(desc="Coefficient for the geometry independent part of A3" unit="" );
parameter real PLA3 = 0.0 `P(desc="Coefficient for the length dependence of A3" unit="" );
parameter real PWA3 = 0.0 `P(desc="Coefficient for the width dependence of A3" unit="" );
parameter real PLWA3 = 0.0 `P(desc="Coefficient for the length times width dependence of A3" unit="" );
parameter real POA4 = 0 `P(desc="Coefficient for the geometry independent part of A4" unit="V^-0.5" );
parameter real PLA4 = 0.0 `P(desc="Coefficient for the length dependence of A4" unit="V^-0.5" );
parameter real PWA4 = 0.0 `P(desc="Coefficient for the width dependence of A4" unit="V^-0.5" );
parameter real PLWA4 = 0.0 `P(desc="Coefficient for the length times width dependence of A4" unit="V^-0.5" );
parameter real POGCO = 0 `P(desc="Coefficient for the geometry independent part of GCO" unit="" );
// Gate current parameters
parameter real POIGINV = 0 `P(desc="Coefficient for the geometry independent part of IGINV" unit="A" );
parameter real PLIGINV = 0.0 `P(desc="Coefficient for the length dependence of IGINV" unit="A" );
parameter real PWIGINV = 0.0 `P(desc="Coefficient for the width dependence of IGINV" unit="A" );
parameter real PLWIGINV = 0.0 `P(desc="Coefficient for the length times width dependence of IGINV" unit="A" );
parameter real POIGOV = 0 `P(desc="Coefficient for the geometry independent part of IGOV" unit="A" );
parameter real PLIGOV = 0.0 `P(desc="Coefficient for the length dependence of IGOV" unit="A" );
parameter real PWIGOV = 0.0 `P(desc="Coefficient for the width dependence of IGOV" unit="A" );
parameter real PLWIGOV = 0.0 `P(desc="Coefficient for the length times width dependence of IGOV" unit="A" );
parameter real POSTIG = 2 `P(desc="Coefficient for the geometry independent part of STIG" unit="" );
parameter real POGC2 = 0.375 `P(desc="Coefficient for the geometry independent part of GC2" unit="" );
parameter real POGC3 = 0.063 `P(desc="Coefficient for the geometry independent part of GC3" unit="" );
parameter real POCHIB = 3.1 `P(desc="Coefficient for the geometry independent part of CHIB" unit="V" );
// Gate-induced drain leakage (GIDL) parameters
parameter real POAGIDL = 0 `P(desc="Coefficient for the geometry independent part of AGIDL" unit="A/V^3" );
parameter real PLAGIDL = 0.0 `P(desc="Coefficient for the length dependence of AGIDL" unit="A/V^3" );
parameter real PWAGIDL = 0.0 `P(desc="Coefficient for the width dependence of AGIDL" unit="A/V^3" );
parameter real PLWAGIDL = 0.0 `P(desc="Coefficient for the length times width dependence of AGIDL" unit="A/V^3" );
parameter real POBGIDL = 41 `P(desc="Coefficient for the geometry independent part of BGIDL" unit="V" );
parameter real POSTBGIDL = 0 `P(desc="Coefficient for the geometry independent part of STBGIDL" unit="V/K" );
parameter real POCGIDL = 0 `P(desc="Coefficient for the geometry independent part of CGIDL" unit="" );
// Charge model parameters
parameter real POCOX = 1E-14 `P(desc="Coefficient for the geometry independent part of COX" unit="F" );
parameter real PLCOX = 0.0 `P(desc="Coefficient for the length dependence of COX" unit="F" );
parameter real PWCOX = 0.0 `P(desc="Coefficient for the width dependence of COX" unit="F" );
parameter real PLWCOX = 0.0 `P(desc="Coefficient for the length times width dependence of COX" unit="F" );
parameter real POCGOV = 1E-15 `P(desc="Coefficient for the geometry independent part of CGOV" unit="F" );
parameter real PLCGOV = 0.0 `P(desc="Coefficient for the length dependence of CGOV" unit="F" );
parameter real PWCGOV = 0.0 `P(desc="Coefficient for the width dependence of CGOV" unit="F" );
parameter real PLWCGOV = 0.0 `P(desc="Coefficient for the length times width dependence of CGOV" unit="F" );
parameter real POCGBOV = 0 `P(desc="Coefficient for the geometry independent part of CGBOV" unit="F" );
parameter real PLCGBOV = 0.0 `P(desc="Coefficient for the length dependence of CGBOV" unit="F" );
parameter real PWCGBOV = 0.0 `P(desc="Coefficient for the width dependence of CGBOV" unit="F" );
parameter real PLWCGBOV = 0.0 `P(desc="Coefficient for the length times width dependence of CGBOV" unit="F" );
parameter real POCFR = 0 `P(desc="Coefficient for the geometry independent part of CFR" unit="F" );
parameter real PLCFR = 0.0 `P(desc="Coefficient for the length dependence of CFR" unit="F" );
parameter real PWCFR = 0.0 `P(desc="Coefficient for the width dependence of CFR" unit="F" );
parameter real PLWCFR = 0.0 `P(desc="Coefficient for the length times width dependence of CFR" unit="F" );
// Noise model parameters
parameter real POFNT = 1 `P(desc="Coefficient for the geometry independent part of FNT" unit="" );
parameter real PONFA = 8E+22 `P(desc="Coefficient for the geometry independent part of NFA" unit="V^-1/m^4" );
parameter real PLNFA = 0.0 `P(desc="Coefficient for the length dependence of NFA" unit="V^-1/m^4" );
parameter real PWNFA = 0.0 `P(desc="Coefficient for the width dependence of NFA" unit="V^-1/m^4" );
parameter real PLWNFA = 0.0 `P(desc="Coefficient for the length times width dependence of NFA" unit="V^-1/m^4" );
parameter real PONFB = 3E+07 `P(desc="Coefficient for the geometry independent part of NFB" unit="V^-1/m^2" );
parameter real PLNFB = 0.0 `P(desc="Coefficient for the length dependence of NFB" unit="V^-1/m^2" );
parameter real PWNFB = 0.0 `P(desc="Coefficient for the width dependence of NFB" unit="V^-1/m^2" );
parameter real PLWNFB = 0.0 `P(desc="Coefficient for the length times width dependence of NFB" unit="V^-1/m^2" );
parameter real PONFC = 0 `P(desc="Coefficient for the geometry independent part of NFC" unit="V^-1" );
parameter real PLNFC = 0.0 `P(desc="Coefficient for the length dependence of NFC" unit="V^-1" );
parameter real PWNFC = 0.0 `P(desc="Coefficient for the width dependence of NFC" unit="V^-1" );
parameter real PLWNFC = 0.0 `P(desc="Coefficient for the length times width dependence of NFC" unit="V^-1" );
// Other parameters
parameter real DTA = 0 `P(desc="Temperature offset w.r.t. ambient temperature" unit="K" );

View File

@ -0,0 +1,250 @@
//======================================================================================
//======================================================================================
// Filename: PSP102_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
/////////////////////////////////////////////
//
// Macros and constants used in PSP
//
/////////////////////////////////////////////
// Explicit Gmin
`define GMIN 1E-15
`define PMOS -1
`define NMOS +1
// Some functions
`define MINA(x,y,a) 0.5*((x)+(y)-sqrt(((x)-(y))*((x)-(y))+(a)))
`define MAXA(x,y,a) 0.5*((x)+(y)+sqrt(((x)-(y))*((x)-(y))+(a)))
// Physical constants
`define EPSOX 3.453E-11
`define QMN 5.951993
`define QMP 7.448711
// Other constants (PSP-mos)
`define DELTA1 0.02
`define invSqrt2 7.0710678118654746e-01
`define oneSixth 1.6666666666666667e-01
`define exp80 5.5406223843935098e+34
`define exp160 3.0698496406442424e+69
`ifdef NQSmodel
`define Gint GP
`define Bint BP
`define Bjs BS
`define Bjd BD
`else // NQSmodel
`define Gint G
`define Bint B
`define Bjs B
`define Bjd B
`endif // NQSModel
/////////////////////////////////////////////////////////////////////////////
//
// Macro definitions.
//
// Note that because at present locally scoped variables
// can only be in named blocks, the intermediate variables
// used in the macros below must be explicitly declared
// as variables in the main code.
//
/////////////////////////////////////////////////////////////////////////////
// sigma function used in surface potential and other calculations
// (one call uses expressions for arguments so parentheses
// around the arguments in the expressions are necessary)
`define sigma(a,c,tau,eta,y) \
nu = (a) + (c); \
mu = nu * nu / (tau) + 0.5 * ((c) * (c)) - (a); \
y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a)));
// modified version of sigma, which takes 4 arguments
`define sigma2(a,b,c,tau,eta,y) \
nu = (a) + (c); \
if (abs(tau) < 1e-120) begin /*sometimes tau is extremely small...*/\
y = (eta); \
end else begin \
mu = (nu) * (nu) / (tau) + 0.5 * ((c) * (c)) - (a) * (b); \
y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a) * (b))); \
end
//
// sp_s surface potential calculation
//
`define sp_s(sp,xg,xn,delta) \
if (abs(xg) <= margin) begin \
SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \
sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \
end else begin \
if (xg < -margin) begin \
SP_S_yg = -xg; \
SP_S_ysub = 1.25 * (SP_S_yg * inv_xi); \
SP_S_eta = 0.5 * (SP_S_ysub + 10 - sqrt((SP_S_ysub - 6.0) * (SP_S_ysub - 6.0) + 64.0)); \
SP_S_temp = SP_S_yg - SP_S_eta; \
SP_S_a = SP_S_temp * SP_S_temp + Gf2*(SP_S_eta + 1.0);\
SP_S_c = 2.0 * SP_S_temp - Gf2; \
SP_S_tau = -SP_S_eta + ln(SP_S_a * inv_Gf2); \
`sigma(SP_S_a, SP_S_c, SP_S_tau, SP_S_eta, SP_S_y0) \
`expl_high(SP_S_y0, SP_S_delta0) \
SP_S_delta1 = 1.0 / SP_S_delta0; \
SP_S_temp = 1.0 / (2.0 + SP_S_y0 * SP_S_y0); \
SP_S_xi0 = SP_S_y0 * SP_S_y0 * SP_S_temp; \
SP_S_xi1 = 4.0 * (SP_S_y0 * SP_S_temp * SP_S_temp); \
SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \
SP_S_temp = SP_S_yg - SP_S_y0; \
SP_S_temp1 = (delta) * SP_S_delta1; \
SP_S_pC = 2.0 * SP_S_temp + Gf2 * (SP_S_delta0 - 1.0 - SP_S_temp1 + (delta) * (1.0 - SP_S_xi1)); \
SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta0 - SP_S_y0 - 1.0 + SP_S_temp1 + (delta) * (SP_S_y0 - 1.0 - SP_S_xi0)); \
SP_S_temp = 2.0 - Gf2 * (SP_S_delta0 + SP_S_temp1 - (delta) * SP_S_xi2); \
SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \
sp = -SP_S_y0 - 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \
end else begin \
SP_xg1 = 1.0 / (x1 + Gf * 7.324648775608221e-001); \
SP_S_A_fac= (xi * x1 * SP_xg1 - 1.0) * SP_xg1; \
SP_S_xbar = xg * inv_xi * (1.0 + SP_S_A_fac * xg); \
`expl_low(-SP_S_xbar, SP_S_temp) \
SP_S_w = 1.0 - SP_S_temp; \
SP_S_x1 = xg + Gf2 * 0.5 - Gf * sqrt(xg + Gf2 * 0.25 - SP_S_w); \
SP_S_bx = (xn) + 3.0; \
SP_S_eta = `MINA(SP_S_x1, SP_S_bx, 5.0) - 0.5 * (SP_S_bx - sqrt(SP_S_bx * SP_S_bx + 5.0)); \
SP_S_temp = xg - SP_S_eta; \
SP_S_temp1= exp(-SP_S_eta); \
SP_S_temp2= 1.0 / (2.0 + SP_S_eta * SP_S_eta); \
SP_S_xi0 = SP_S_eta * SP_S_eta * SP_S_temp2; \
SP_S_xi1 = 4.0 * (SP_S_eta * SP_S_temp2 * SP_S_temp2); \
SP_S_xi2 = (8.0 * SP_S_temp2 - 12.0 * SP_S_xi0) * SP_S_temp2 * SP_S_temp2; \
SP_S_a = max(1.0e-40, SP_S_temp * SP_S_temp - Gf2 * (SP_S_temp1 + SP_S_eta - 1.0 - (delta) * (SP_S_eta + 1.0 + SP_S_xi0))); \
SP_S_b = 1.0 - 0.5 * (Gf2 * (SP_S_temp1 - (delta) * SP_S_xi2)); \
SP_S_c = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_temp1 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_tau = (xn) - SP_S_eta + ln(SP_S_a / Gf2); \
`sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \
if (SP_S_x0 < `se05) begin \
SP_S_delta0 = exp(SP_S_x0); \
SP_S_delta1 = 1.0 / SP_S_delta0; \
SP_S_delta0 = (delta) * SP_S_delta0; \
end else begin \
if (SP_S_x0 > (xn) - `se05) begin \
SP_S_delta0 = exp(SP_S_x0 - (xn)); \
SP_S_delta1 = (delta) / SP_S_delta0; \
end else begin \
SP_S_delta0 = `ke05 / `P3((xn) - SP_S_x0 - `se05); \
SP_S_delta1 = `ke05 / `P3(SP_S_x0 - `se05); \
end \
end \
SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \
SP_S_xi0 = SP_S_x0 * SP_S_x0 * SP_S_temp; \
SP_S_xi1 = 4.0 * (SP_S_x0 * SP_S_temp * SP_S_temp); \
SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \
SP_S_temp = xg - SP_S_x0; \
SP_S_pC = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_delta1 + SP_S_delta0 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta1 + SP_S_x0 - 1.0 + SP_S_delta0 - (delta) * (SP_S_x0 + 1.0 + SP_S_xi0)); \
SP_S_temp = 2.0 - Gf2 * (SP_S_delta1 + SP_S_delta0 - (delta) * SP_S_xi2); \
SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \
sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \
end \
end
//
// sp_s_d surface potential calculation at drain (subset of function sp_s)
//
`define sp_s_d(sp,xg,xn,delta) \
if (abs(xg) <= margin) begin \
SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \
sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \
end else begin \
SP_S_bx = (xn) + 3; \
SP_S_eta = `MINA(SP_S_x1, SP_S_bx, 5.0) - 0.5 * (SP_S_bx - sqrt(SP_S_bx * SP_S_bx + 5.0)); \
SP_S_temp = xg - SP_S_eta; \
SP_S_temp1= exp(-SP_S_eta); \
SP_S_temp2= 1.0 / (2.0 + SP_S_eta * SP_S_eta); \
SP_S_xi0 = SP_S_eta * SP_S_eta * SP_S_temp2; \
SP_S_xi1 = 4.0 * (SP_S_eta * SP_S_temp2 * SP_S_temp2); \
SP_S_xi2 = (8.0 * SP_S_temp2 - 12.0 * SP_S_xi0) * SP_S_temp2 * SP_S_temp2; \
SP_S_a = max(1.0e-40, SP_S_temp * SP_S_temp - Gf2 * (SP_S_temp1 + SP_S_eta - 1.0 - (delta) * (SP_S_eta + 1.0 + SP_S_xi0))); \
SP_S_b = 1.0 - 0.5 * (Gf2 * (SP_S_temp1 - (delta) * SP_S_xi2)); \
SP_S_c = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_temp1 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_tau = (xn) - SP_S_eta + ln(SP_S_a / Gf2); \
`sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \
if (SP_S_x0 < `se05) begin \
SP_S_delta0 = exp(SP_S_x0); \
SP_S_delta1 = 1.0 / SP_S_delta0; \
SP_S_delta0 = (delta) * SP_S_delta0; \
end else begin \
if (SP_S_x0 > (xn) - `se05) begin \
SP_S_delta0 = exp(SP_S_x0 - (xn)); \
SP_S_delta1 = (delta) / SP_S_delta0; \
end else begin \
SP_S_delta0 = `ke05 / `P3((xn) - SP_S_x0 - `se05); \
SP_S_delta1 = `ke05 / `P3(SP_S_x0 - `se05); \
end \
end \
SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \
SP_S_xi0 = SP_S_x0 * SP_S_x0 * SP_S_temp; \
SP_S_xi1 = 4.0 * (SP_S_x0 * SP_S_temp * SP_S_temp); \
SP_S_xi2 = (8.0 * SP_S_temp-12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \
SP_S_temp = xg - SP_S_x0; \
SP_S_pC = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_delta1 + SP_S_delta0 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta1 + SP_S_x0 - 1.0 + SP_S_delta0 - (delta) * (SP_S_x0 + 1.0 + SP_S_xi0)); \
SP_S_temp = 2.0 - Gf2*(SP_S_delta1+SP_S_delta0-(delta)*SP_S_xi2); \
SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \
sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp)));\
end
//
// sp_ov surface potential calculation for the overlap regions
//
`define sp_ov(sp,xg) \
if (abs(xg) <= x_mrg_ov) begin \
sp = (-(xg) * inv_xi_ov); \
end else begin \
if (xg < -x_mrg_ov) begin \
SP_OV_yg = -xg; \
SP_OV_z = x1 * SP_OV_yg * inv_xi_ov; \
SP_OV_eta = 0.5 * (SP_OV_z + 10.0 - sqrt((SP_OV_z - 6.0) * (SP_OV_z - 6.0) + 64.0)); \
SP_OV_a = (SP_OV_yg - SP_OV_eta) * (SP_OV_yg - SP_OV_eta) + GOV2 * (SP_OV_eta + 1.0); \
SP_OV_c = 2.0 * (SP_OV_yg - SP_OV_eta) - GOV2; \
SP_OV_tau = ln(SP_OV_a / GOV2) - SP_OV_eta; \
`sigma(SP_OV_a, SP_OV_c, SP_OV_tau, SP_OV_eta, SP_OV_y0) \
SP_OV_D0 = exp(SP_OV_y0); \
SP_OV_temp = SP_OV_yg - SP_OV_y0; \
SP_OV_p = 2.0 * SP_OV_temp + GOV2 * (SP_OV_D0 - 1.0); \
SP_OV_q = SP_OV_temp * SP_OV_temp + GOV2 * (SP_OV_y0 + 1.0 - SP_OV_D0); \
SP_OV_xi = 1.0 - GOV2 * 0.5 * SP_OV_D0; \
SP_OV_temp = SP_OV_p * SP_OV_p - 4.0 * (SP_OV_xi * SP_OV_q); \
SP_OV_w = 2.0 * (SP_OV_q / (SP_OV_p + sqrt(SP_OV_temp))); \
sp = -(SP_OV_y0 + SP_OV_w); \
end else begin \
SP_OV_Afac = (xi_ov * x1 * inv_xg1 - 1.0) * inv_xg1; \
SP_OV_xbar = xg * inv_xi_ov * (1.0 + SP_OV_Afac * xg); \
`expl_low(-SP_OV_xbar, SP_OV_temp) \
SP_OV_w = 1.0 - SP_OV_temp; \
SP_OV_x0 = xg + GOV2 * 0.5 - GOV * sqrt(xg + GOV2 * 0.25 - SP_OV_w); \
`expl_low(-SP_OV_x0, SP_OV_D0) \
SP_OV_p = 2.0 * (xg - SP_OV_x0) + GOV2 * (1 - SP_OV_D0); \
SP_OV_q = (xg - SP_OV_x0) * (xg - SP_OV_x0) - GOV2 * (SP_OV_x0 - 1.0 + SP_OV_D0); \
SP_OV_xi = 1.0 - GOV2 * 0.5 * SP_OV_D0; \
SP_OV_temp = SP_OV_p * SP_OV_p - 4.0 * (SP_OV_xi * SP_OV_q); \
SP_OV_u = 2.0 * (SP_OV_q / (SP_OV_p + sqrt(SP_OV_temp))); \
sp = SP_OV_x0 + SP_OV_u; \
end \
sp = -sp; \
end

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,117 @@
//======================================================================================
//======================================================================================
// Filename: PSP102_nqs_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
//////////////////////////////////////////
//
// Macros used in PSP-NQS
//
//////////////////////////////////////////
// Function to calculate bulk charge from surface potential
`define PhiToQb(phi,Qb_tmp) \
if (abs(phi) <= margin) \
Qb_tmp = -0.70710678 * phi * Gf * (1.0 - `oneSixth * phi * (1.0 - `oneSixth * phi)); \
else begin \
`expl((-phi), temp) \
Qb_tmp = Gf * sqrt(temp + phi - 1.0); \
if (phi > margin) \
Qb_tmp = -Qb_tmp; \
end
// Function used in fq-macro
`define PhiTod2Qis(xphi,d2Qis) \
if (abs(xphi) <= margin) begin \
Qb_tmp = -0.70710678 * xphi * Gf * (1.0 - `oneSixth * xphi * (1.0 - `oneSixth * xphi)); \
dQbs = -0.70710678 * Gf * (1.0 - `oneThird * xphi * (1.0 - 0.25 * xphi)); \
d2Qis = -0.235702 * Gf * (1.0 - 0.5 * xphi); \
end else begin \
`expl((-xphi),temp) \
Qb_tmp = Gf * sqrt(temp + xphi - 1.0); \
if (xphi > margin) \
Qb_tmp = -Qb_tmp; \
dQbs = 0.5 * Gf2 * (1.0 - temp) / Qb_tmp; \
d2Qis = (dQbs * dQbs - 0.5 * Gf * Gf) / Qb_tmp + dQbs; \
end
// Function used in QiToPhi
`define sps(sp, xg) \
if (abs(xg) <= marginp) begin \
sp = xg / a_factrp; \
end else begin \
if (xg < -marginp) begin \
NQS_yg = -xg; \
NQS_z = 1.25 * NQS_yg / a_factrp; \
NQS_eta = (NQS_z + 10.0 - sqrt((NQS_z - 6.0) * (NQS_z - 6.0) + 64.0)) * 0.5; \
NQS_a = (NQS_yg - NQS_eta) * (NQS_yg - NQS_eta) + Gp2 * (NQS_eta + 1.0); \
NQS_c = 2.0 * (NQS_yg - NQS_eta) - Gp2; \
NQS_tau = ln(NQS_a / Gp2) - NQS_eta; \
`sigma(NQS_a, NQS_c, NQS_tau, NQS_eta, NQS_y0) \
`expl(NQS_y0, NQS_D0) \
NQS_xi = 1.0 - Gp2 * NQS_D0 * 0.5; \
NQS_p = 2.0 * (NQS_yg - NQS_y0) + Gp2 * (NQS_D0 - 1.0); \
NQS_q = (NQS_yg - NQS_y0) * (NQS_yg - NQS_y0) + Gp2 * (NQS_y0 + 1.0 - NQS_D0); \
NQS_temp = NQS_p * NQS_p - 4.0 * NQS_xi * NQS_q; \
NQS_w = 2.0 * NQS_q / (NQS_p + sqrt(NQS_temp)); \
sp = -(NQS_y0 + NQS_w); \
end else begin \
NQS_xg1 = 1.0 / ( 1.25 + 7.32464877560822e-01 * Gp); \
NQS_A_fac = (1.25 * a_factrp * NQS_xg1 - 1.0) * NQS_xg1; \
NQS_xbar = xg / a_factrp * (1.0 + NQS_A_fac * xg); \
`expl(-NQS_xbar, NQS_temp) \
NQS_w = 1.0 - NQS_temp; \
NQS_x0 = xg + Gp2 * 0.5 - Gp * sqrt(xg + Gp2 * 0.25 - NQS_w); \
`expl((-NQS_x0), NQS_D0) \
NQS_xi = 1.0 - Gp2 * 0.5 * NQS_D0; \
NQS_p = 2.0 * (xg - NQS_x0) + Gp2 * (1.0 - NQS_D0); \
NQS_q = (xg - NQS_x0) * (xg - NQS_x0) - Gp2 * (NQS_x0 - 1.0 + NQS_D0); \
NQS_temp = NQS_p * NQS_p - 4.0 * NQS_xi * NQS_q; \
NQS_u = 2.0 * NQS_q / (NQS_p + sqrt(NQS_temp)); \
sp = NQS_x0 + NQS_u; \
end \
end
// Function to calculate surface potential from inversion charge
`define QiToPhi(Qi,xg,xphi) \
temp = Qi / pd + xg; \
`sps(xphi,temp)
// Calculation of fk
`define fq(Qi,xg,dQy,d2Qy,fk) \
`QiToPhi(Qi, xg, xphi) \
`PhiTod2Qis(xphi, d2Qis) \
dQis = pd - dQbs; \
dQis_1 = 1.0 / dQis; \
fQi = Qi * dQis_1 - 1.0; \
dfQi = (1.0 - Qi * d2Qis * dQis_1 * dQis_1) * dQis_1; \
fk0 = dfQi * dQy * dQy + fQi * d2Qy; \
dpsy2 = dQy * dQy * dQis_1 * dQis_1; \
zsat = thesat2 * dpsy2; \
if (CHNL_TYPE == `PMOS) \
zsat = zsat / (1.0 + thesat1 * dps); \
temp = sqrt(1.0 + 2.0 * zsat); \
Fvsat = 2.0 / (1.0 + temp); \
temp1 = d2Qy - dpsy2 * d2Qis; \
fk = Fvsat * (fk0 - zsat * fQi * temp1 * Fvsat / temp);
// Interpolation of surface potential along channel
`define Phiy(y) \
x_m + H * (1.0 - sqrt(1.0 - 2.0 * dps / H * ((y) - ym))) * inv_phit1

View File

@ -0,0 +1,122 @@
//======================================================================================
//======================================================================================
// Filename: SIMKIT_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
//////////////////////////////////////////////////////////////
//
// General macros and constants for compact va-models
//
//////////////////////////////////////////////////////////////
`define VERS "0.0"
`define VREV "0.0"
`define VERSreal 0.0
`define VREVreal 0.0
`define CLIP_LOW(val,min) ((val)>(min)?(val):(min))
`define CLIP_HIGH(val,max) ((val)<(max)?(val):(max))
`define CLIP_BOTH(val,min,max) ((val)>(min)?((val)<(max)?(val):(max)):(min))
// Note 1: In this va-code, the `P-macro is defined such that its argument
// is ignored during compilation; in this source code it acts as
// a comment
// Note 2: In this va-code, the "from" keyword in the parameter
// list is not used. Silent clipping is used instead. One could enable
// the Verilog-A range checking by redefining the `from-macro below.
// `define P(txt)
`define P(txt) (*txt*)
`define AT_MODEL
`define AT_INSTANCE
`define AT_NOISE
`define from(lower,upper)
// `define from(lower,upper) from[lower:upper]
// Some functions
`define MAX(x,y) ((x)>(y)?(x):(y))
`define MIN(x,y) ((x)<(y)?(x):(y))
// Mathematical constants
`define PI 3.1415926535897931
`define SQRTPI 1.77245385090551603
// Physical constants
`define KELVINCONVERSION 273.15
`define KBOL 1.3806505E-23
`define QELE 1.6021918E-19
`define HBAR 1.05457168E-34
`define MELE 9.1093826E-31
`define EPSSI 1.045E-10
// Other constants
`define oneThird 3.3333333333333333e-01
`define twoThirds 6.6666666666666667e-01
// Constants needed in safe exponential function (called "expl")
`define se 4.6051701859880916e+02
`define se05 2.3025850929940458e+02
`define ke 1.0e-200
`define ke05 1.0e-100
`define keinv 1.0e200
`define ke05inv 1.0e100
/////////////////////////////////////////////////////////////////////////////
//
// Macro definitions.
//
// Note that because variables in macros are not locally scoped,
// the intermediate variables used in the macros below must be
// explicitly declared in the main code.
//
/////////////////////////////////////////////////////////////////////////////
// P3 3rd order polynomial expansion of exp()
`define P3(u) (1.0 + (u) * (1.0 + 0.5 * ((u) * (1.0 + (u) * `oneThird))))
// expl exp() with 3rd order polynomial extrapolation
// for very low values (exp_low), very high
// values (exp_high), or both (expl), to avoid overflows
// and underflows and retain C-3 continuity
`define expl(x, res) \
if (abs(x) < `se05) begin\
res = exp(x); \
end else begin \
if ((x) < -`se05) begin\
res = `ke05 / `P3(-`se05 - (x)); \
end else begin\
res = `ke05inv * `P3((x) - `se05); \
end \
end
`define expl_low(x, res) \
if ((x) > -`se05) begin\
res = exp(x); \
end else begin\
res = `ke05 / `P3(-`se05 - (x)); \
end
`define expl_high(x, res) \
if ((x) < `se05) begin\
res = exp(x); \
end else begin \
res = `ke05inv * `P3((x) - `se05); \
end
`define swap(a, b) \
temp = a; \
a = b; \
b = temp;

View File

@ -0,0 +1,48 @@
//======================================================================================
//======================================================================================
// Filename: psp102.va
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
`include "discipline.h"
`include "SIMKIT_macrodefs.include"
`include "JUNCAP200_macrodefs.include"
`include "PSP102_macrodefs.include"
/////////////////////////////////////////////////////////////////////////////
//
// PSP global model code
//
/////////////////////////////////////////////////////////////////////////////
// `undef LocalModel
// `define Binning
module PSP102VA(D, G, S, B)
`P(
desc = "PSP MOSFET Model"
version = `VERS
revision = `VREV
simkit:name = "psp1020"
simkit:desc = "psp_1020"
);
`include "PSP102_module.include"
endmodule

View File

@ -0,0 +1,8 @@
ngspice customizations of package psp102.1
------------------------------------------
- Mon Apr 30 15:28:25 WEDT 2007 (Berlin)
o renamed 'initializeModel/initializeInstance' to 'initial_model/initial_instance'.
(this issue should go away when auto-partionning done in adms.)
o redefined macro P(txt) in order to 'see' instance parameters
o status: psp code created by adms compiles

View File

@ -0,0 +1,120 @@
======================================================================================
======================================================================================
---------------------------
Verilog-A definition of PSP
---------------------------
(c) Copyright 2007, All Rights Reserved, NXP Semiconductors
Version: PSP 102.1 (including JUNCAP2 200.2), April 2007 (Simkit 2.5)
======================================================================================
======================================================================================
Authors: G.D.J. Smit, A.J. Scholten, and D.B.M. Klaassen (NXP Semiconductors Research)
R. van Langevelde (Philips Research)
G. Gildenblat, X. Li, and W. Wu (The Arizona State University)
The most recent version of the model code, the documentation, and contact information
can be found on:
http://PSPmodel.asu.edu/
or
http://www.nxp.com/Philips_Models/
======================================================================================
======================================================================================
This package consists of several files:
- readme.txt This file
- psp102.va Main file for global ("geometrical") model
- psp102b.va Main file for global binning model
- psp102e.va Main file for local ("electrical") model
- psp102_nqs.va Main file for global ("geometrical") model with NQS-effects
- psp102b_nqs.va Main file for global binning model with NQS-effects
- psp102e_nqs.va Main file for local ("electrical") model with NQS-effects
- juncap200.va Main file for JUNCAP2 stand-alone model
- SIMKIT_macrodefs.include Common macro definitions
- PSP102_macrodefs.include Macro definitions for PSP
- PSP102_module.include Actual model code for intrinsic MOS model
- PSP102_binning.include Geometry scaling equation for binning
- PSP102_binpars.include Parameterlist for global PSP binning model
- PSP102_nqs_macrodefs.include Macro definitions for PSP-NQS
- PSP102_InitNQS.include PSP-NQS initialization code
- PSP102_ChargesNQS.include Calculation of NQS-charge contributions
- JUNCAP200_macrodefs.include Macro definitions for JUNCAP2 model
- JUNCAP200_parlist.include JUNCAP2 parameter list
- JUNCAP200_varlist.include JUNCAP2 variable declarations
- JUNCAP200_InitModel.include JUNCAP2 model initialization code
======================================================================================
======================================================================================
Usage
-----
Depending which model one wants to use, one should compile one of the seven .va-files
(psp102.va, psp102b.va, psp102e.va, psp102_nqs.va, psp102b_nqs.va, psp102e_nqs.va, and
juncap200.va). The module names are "PSP102VA" and "PSPNQS102VA" for the global PSP-model
(QS and NQS, respectively), and similarly "PSP102BVA" and "PSPNQS102BVA" for the binning
PSP-model, "PSP102EVA" and "PSPNQS102EVA" for the local PSP-model, and "JUNCAP200" for
the JUNCAP2-model.
======================================================================================
======================================================================================
Release notes va-code of PSP 102.1, including JUNCAP2 200.2 (April 2007)
------------------------------------------------------------------------
Focus in this release has been on improving the simulation speed of PSP and JUNCAP2.
The model equations in this release of PSP 102.1 are identical to those in the
October 2006 release. This version features some minor impelementation changes
w.r.t. the previous release.
The main changes have been in the SiMKit version generated from this verilog-A
implementation: improvements in the automatic C-code generation process
and compilation of the C-code. The result is reflected in the SiMKit 2.5 version of
PSP, which shows a very significant simulation speed improvement w.r.t SiMKit 2.4.
The minor implementation changes in the verilog-A code will have some positive effect
on the simulation speed of the verilog-A version as well. Note, however, that the
simulation speed of the verilog-A version of PSP and the improvement w.r.t. the
previous version strongly depend on the verilog-A compiler used.
PSP 102.1 is backwards compatible with the previous version, PSP 102.0.
======================================================================================
======================================================================================
The functionality of the Verilog-A code in this package is the same as that of the
C-code, which is contained in SIMKIT version 2.5. Note that Operating Point information
is available only in the C-code, not in Verilog-A code.
The PSP-NQS model is provided as Verilog-A code. In SiMKit 2.5, a test version of
the PSP-NQS model is included (identical to that in SiMKit 2.4). This implementation
circumvents the problem of the SpectreVerilog-A-generated C-code being too large to
compile. Moreover, it is computationally more efficient as it uses less rows in the
simulator matrix. On the other hand, this implementation has some known limitations.
More information is available from the authors. Further improvements are expected in
future releases.
This Verilog-A code of PSP is primarily intended as a source for C-code generation
using ADMS. Most of the testing has been done on the C-code which was generated from it.
The authors want to thank Laurent Lemaitre and Colin McAndrew (Freescale)
for their help with ADMS and the implementation of the model code. Geoffrey
Coram (Analog Devices) is acknowledged for useful comments on the Verilog-A
code.