hisimhv update to version 1.2.3

This commit is contained in:
dwarning
2012-11-26 23:17:11 +01:00
parent d0f58dc5a6
commit 51ec28d174
96 changed files with 17597 additions and 17841 deletions
+4 -4
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hisimhv.h
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
+4 -4
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhv.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
+8 -4
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvacld.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
@@ -183,6 +183,10 @@ int HSMHVacLoad(
}
/*bulk prime*/
*(here->HSMHVBPdPtr) += here->HSMHV_ydc_bP[dNode];
*(here->HSMHVBPdPtr +1) += omega*here->HSMHV_ydyn_bP[dNode];
*(here->HSMHVBPsPtr) += here->HSMHV_ydc_bP[sNode];
*(here->HSMHVBPsPtr +1) += omega*here->HSMHV_ydyn_bP[sNode];
*(here->HSMHVBPdpPtr) += here->HSMHV_ydc_bP[dNodePrime];
*(here->HSMHVBPdpPtr +1) += omega*here->HSMHV_ydyn_bP[dNodePrime];
*(here->HSMHVBPgpPtr) += here->HSMHV_ydc_bP[gNodePrime] ;
+4 -4
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvask.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
+4 -5
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvcvtest.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
@@ -17,7 +17,6 @@
#include "ngspice/ngspice.h"
#include "ngspice/cktdefs.h"
#include "hsmhvdef.h"
#include "ngspice/trandefs.h"
#include "ngspice/const.h"
+42 -11
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvdef
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
@@ -488,6 +488,26 @@ typedef struct sHSMHVinstance {
double HSMHV_dqsp_dVgse ;
double HSMHV_dqsp_dVbse ;
double HSMHV_dqsp_dTi ;
double HSMHV_qgext ;
double HSMHV_dQgext_dVdse ;
double HSMHV_dQgext_dVgse ;
double HSMHV_dQgext_dVbse ;
double HSMHV_dQgext_dTi ;
double HSMHV_qdext ;
double HSMHV_dQdext_dVdse ;
double HSMHV_dQdext_dVgse ;
double HSMHV_dQdext_dVbse ;
double HSMHV_dQdext_dTi ;
double HSMHV_qbext ;
double HSMHV_dQbext_dVdse ;
double HSMHV_dQbext_dVgse ;
double HSMHV_dQbext_dVbse ;
double HSMHV_dQbext_dTi ;
double HSMHV_qsext ;
double HSMHV_dQsext_dVdse ;
double HSMHV_dQsext_dVgse ;
double HSMHV_dQsext_dVbse ;
double HSMHV_dQsext_dTi ;
/* junctions */
double HSMHV_ibd;
double HSMHV_gbd;
@@ -633,6 +653,11 @@ typedef struct sHSMHVinstance {
double HSMHV_rthtemp0 ;
double HSMHV_powratio ;
double HSMHV_mueph1 ;
double HSMHV_nsubp;
double HSMHV_nsubc;
HSMHVhereMKSParam hereMKS ; /* unit-converted parameters */
HSMHVbinningParam pParam ; /* binning parameters */
@@ -716,6 +741,7 @@ typedef struct sHSMHVinstance {
double *HSMHVDdPtr; /* pointer to sparse matrix element at (Drain node,drain node) */
double *HSMHVDdpPtr; /* pointer to sparse matrix element at (drain node,drain prime node) */
double *HSMHVDspPtr; /* pointer to sparse matrix element at (drain node,source prime node) */
double *HSMHVDdbPtr; /* pointer to sparse matrix element at (drain node,drain body node) */
double *HSMHVSPsPtr; /* pointer to sparse matrix element at (source prime node,source node) */
@@ -726,14 +752,15 @@ typedef struct sHSMHVinstance {
double *HSMHVSsPtr; /* pointer to sparse matrix element at (source node,source node) */
double *HSMHVSspPtr; /* pointer to sparse matrix element at (source node,source prime node) */
double *HSMHVSdpPtr; /* pointer to sparse matrix element at (source node,drain prime node) */
double *HSMHVSsbPtr; /* pointer to sparse matrix element at (source node,source body node) */
double *HSMHVBPgpPtr; /* pointer to sparse matrix element at (bulk prime node,gate prime node) */
double *HSMHVBPbpPtr; /* pointer to sparse matrix element at (bulk prime node,bulk prime node) */
double *HSMHVBPdPtr; /* pointer to sparse matrix element at (bulk prime node,drain node) */
double *HSMHVBPdpPtr; /* pointer to sparse matrix element at (bulk prime node,drain prime node) */
double *HSMHVBPsPtr; /* pointer to sparse matrix element at (bulk prime node,source node) */
double *HSMHVBPspPtr; /* pointer to sparse matrix element at (bulk prime node,source prime node) */
double *HSMHVBPsPtr; /* pointer to sparse matrix element at (bulk prime node,source node) */
double *HSMHVBPbPtr; /* pointer to sparse matrix element at (bulk prime node,bulk node) */
double *HSMHVBPdbPtr; /* pointer to sparse matrix element at (bulk prime node,source body node) */
double *HSMHVBPsbPtr; /* pointer to sparse matrix element at (bulk prime node,source body node) */
@@ -846,15 +873,19 @@ typedef struct sHSMHVinstance {
#define HSMHVqfs HSMHVstates+ 27
#define HSMHVcqfs HSMHVstates+ 28
#define HSMHVnumStates 29
/*add external drain capacitance*/
#define HSMHVqdE HSMHVstates+ 29
#define HSMHVcqdE HSMHVstates+ 30
#define HSMHVnumStates 31
/* nqs charges */
#define HSMHVqi_nqs HSMHVstates+ 30
#define HSMHVdotqi_nqs HSMHVstates + 31
#define HSMHVqb_nqs HSMHVstates+ 32
#define HSMHVdotqb_nqs HSMHVstates + 33
#define HSMHVqi_nqs HSMHVstates+ 32
#define HSMHVdotqi_nqs HSMHVstates + 33
#define HSMHVqb_nqs HSMHVstates+ 34
#define HSMHVdotqb_nqs HSMHVstates + 35
#define HSMHVnumStatesNqs 34
#define HSMHVnumStatesNqs 36
/* indices to the array of HiSIMHV NOISE SOURCES */
#define HSMHVRDNOIZ 0
+4 -4
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvdel.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
+4 -4
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvdest.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
+244 -105
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhveval.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
@@ -143,11 +143,11 @@ June. 2008 (revised in June 2011)
/*---------------------------------------------------*
* Header files.
*-----------------*/
#include "ngspice/ngspice.h"
#ifdef __STDC__
/* #include <ieeefp.h> */
#endif
#include "ngspice/ngspice.h"
/*-----------------------------------*
* HiSIM macros
@@ -202,14 +202,18 @@ double TMF0 , TMF1 , TMF2 , TMF3 , TMF4 , TMF5 , TMF6 ;
#define Fn_SU( y , x , xmax , delta , dx ) { \
TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
TMF2 = sqrt ( TMF1 * TMF1 + 4.0 * ( xmax ) * ( delta) ) ; \
TMF2 = 4.0 * ( xmax ) * ( delta) ; \
TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \
TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
}
#define Fn_SU2( y , x , xmax , delta , dy_dx , dy_dxmax ) { \
TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
TMF2 = sqrt ( TMF1 * TMF1 + 4.0 * ( xmax ) * ( delta) ) ; \
TMF2 = 4.0 * ( xmax ) * ( delta) ; \
TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \
TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
dy_dxmax = 0.5 * ( 1.0 - ( TMF1 + 2.0 * delta ) / TMF2 ) ; \
y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
@@ -224,14 +228,18 @@ double TMF0 , TMF1 , TMF2 , TMF3 , TMF4 , TMF5 , TMF6 ;
#define Fn_SL( y , x , xmin , delta , dx ) { \
TMF1 = ( x ) - ( xmin ) - ( delta ) ; \
TMF2 = sqrt ( TMF1 * TMF1 + 4.0 * ( xmin ) * ( delta ) ) ; \
TMF2 = 4.0 * ( xmin ) * ( delta ) ; \
TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \
TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \
}
#define Fn_SL2( y , x , xmin , delta , dy_dx, dy_dxmin ) { \
TMF1 = ( x ) - ( xmin ) - ( delta ) ; \
TMF2 = sqrt ( TMF1 * TMF1 + 4.0 * ( xmin ) * ( delta ) ) ; \
TMF2 = 4.0 * ( xmin ) * ( delta ) ; \
TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \
TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
dy_dxmin = 0.5 * ( 1.0 - ( TMF1 - 2.0 * delta ) / TMF2 ) ; \
y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \
@@ -246,8 +254,6 @@ double TMF0 , TMF1 , TMF2 , TMF3 , TMF4 , TMF5 , TMF6 ;
TMF2 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta) ) ; \
dx = 0.5 * ( 1.0 + ( x ) / TMF2 ) ; \
y = 0.5 * ( ( x ) + TMF2 ) ; \
if (y < 0) \
y = 0 ; \
}
@@ -430,7 +436,7 @@ int HSMHVevaluate
const double small = 1.0e-50 ;
const double small2= 1e-12 ; /* for Ra(Vdse) dependence */
const double c_exp_2 = 7.38905609893065 ;
const double large_arg = log(1.0e100) ;
const double large_arg = 80 ; // log(1.0e100) ;
double Vbs_max = 0.8e0, Vbs_max_dT =0.0 ;
double Vbs_bnd = 0.4e0, Vbs_bnd_dT =0.0 ; /* start point of positive Vbs bending */
@@ -451,7 +457,7 @@ int HSMHVevaluate
/* Important Variables in HiSIM -------*/
/* confined bias */
double Vbscl=0.0, Vbscl_dVbs=0.0, Vbscl_dT=0.0, Vbscl_dVbs_dVbs = 0.0 ;
double Vbscl=0.0, Vbscl_dVbs=0.0, Vbscl_dT=0.0, Vbscl_dVbs_dVbs = 0.0, Vbscl_dVbs_dT = 0.0 ;
double Vgp =0.0, Vgp_dVbs =0.0, Vgp_dVds =0.0, Vgp_dVgs =0.0, Vgp_dT =0.0 ;
double Vgs_fb =0.0 ;
/* Ps0 : surface potential at the source side */
@@ -478,9 +484,9 @@ int HSMHVevaluate
double Xilp32 =0.0, Xilp32_dVbs =0.0, Xilp32_dVds =0.0, Xilp32_dVgs =0.0, Xilp32_dT =0.0 ;
/* modified bias and potential for sym.*/
double Vbsz =0.0, Vbsz_dVbs =0.0, Vbsz_dVds =0.0, Vbsz_dT =0.0 ;
double Vdsz =0.0, Vdsz_dVbs =0.0, Vdsz_dVds =0.0 ;
double Vgsz =0.0, Vgsz_dVbs =0.0, Vgsz_dVds =0.0, Vgsz_dVgs =0.0 ;
double Vzadd =0.0, Vzadd_dVbs =0.0, Vzadd_dVds = 0.0 ;
double Vdsz =0.0, Vdsz_dVbs =0.0, Vdsz_dVds =0.0, Vdsz_dT =0.0 ;
double Vgsz =0.0, Vgsz_dVbs =0.0, Vgsz_dVds =0.0, Vgsz_dVgs =0.0, Vgsz_dT =0.0 ;
double Vzadd =0.0, Vzadd_dVbs =0.0, Vzadd_dVds = 0.0, Vzadd_dT = 0.0 ;
double Ps0z =0.0, Ps0z_dVbs =0.0, Ps0z_dVds =0.0, Ps0z_dVgs =0.0, Ps0z_dT =0.0 ;
double Pzadd =0.0, Pzadd_dVbs =0.0, Pzadd_dVds =0.0, Pzadd_dVgs =0.0, Pzadd_dT =0.0 ;
@@ -498,7 +504,7 @@ int HSMHVevaluate
double Rho =0.0, Rho_dT =0.0 ;
/* threshold voltage */
double Vth =0.0 ;
double Vth0 =0.0, Vth0_dVb =0.0, Vth0_dVd =0.0, Vth0_dVg =0.0 ;
double Vth0 =0.0, Vth0_dVb =0.0, Vth0_dVd =0.0, Vth0_dVg =0.0, Vth0_dT =0.0 ;
/* variation of threshold voltage */
double dVth =0.0, dVth_dVb =0.0, dVth_dVd =0.0, dVth_dVg =0.0, dVth_dT = 0.0 ;
double dVth0 =0.0 ;
@@ -509,14 +515,14 @@ int HSMHVevaluate
double Psi_a =0.0, Psi_a_dVg =0.0, Psi_a_dVb =0.0, Psi_a_dVd =0.0, Psi_a_dT =0.0 ;
double Pb20a =0.0, Pb20a_dVg =0.0, Pb20a_dVb =0.0, Pb20a_dVd =0.0, Pb20a_dT =0.0 ;
double Pb20b =0.0, Pb20b_dVg =0.0, Pb20b_dVb =0.0, Pb20b_dVd =0.0, Pb20b_dT =0.0 ;
double dVthW =0.0, dVthW_dVb =0.0, dVthW_dVd =0.0, dVthW_dVg =0.0 ;
double dVthW =0.0, dVthW_dVb =0.0, dVthW_dVd =0.0, dVthW_dVg =0.0, dVthW_dT =0.0 ;
/* Alpha and related parameters */
double Alpha =0.0, Alpha_dVbs =0.0, Alpha_dVds =0.0, Alpha_dVgs =0.0, Alpha_dT =0.0 ;
double Achi =0.0, Achi_dVbs =0.0, Achi_dVds =0.0, Achi_dVgs =0.0, Achi_dT =0.0 ;
double VgVt =0.0, VgVt_dVbs =0.0, VgVt_dVds =0.0, VgVt_dVgs =0.0, VgVt_dT =0.0 ;
double Pslsat =0.0 ;
double Vdsat =0.0 ;
double VdsatS =0.0, VdsatS_dVbs =0.0, VdsatS_dVds =0.0, VdsatS_dVgs =0.0 ;
double VdsatS =0.0, VdsatS_dVbs =0.0, VdsatS_dVds =0.0, VdsatS_dVgs =0.0, VdsatS_dT =0.0 ;
double Delta =0.0 ;
/* Q_B and capacitances */
double Qb =0.0, Qb_dVbs =0.0, Qb_dVds =0.0, Qb_dVgs =0.0, Qb_dT=0.0 ;
@@ -573,21 +579,21 @@ int HSMHVevaluate
/* Pocket Implant */
double Vthp=0.0, Vthp_dVb=0.0, Vthp_dVd=0.0, Vthp_dVg =0.0, Vthp_dT =0.0 ;
double dVthLP=0.0, dVthLP_dVb=0.0, dVthLP_dVd=0.0, dVthLP_dVg =0.0, dVthLP_dT =0.0 ;
double bs12=0.0, bs12_dVb=0.0, bs12_dVd =0.0, bs12_dVg =0.0 ;
double Qbmm=0.0, Qbmm_dVb=0.0, Qbmm_dVd =0.0, Qbmm_dVg =0.0 ;
double dqb=0.0, dqb_dVb=0.0, dqb_dVg=0.0, dqb_dVd =0.0 ;
double Vdx=0.0, Vdx_dVbs=0.0;
double Vdx2=0.0, Vdx2_dVbs=0.0;
double bs12=0.0, bs12_dVb=0.0, bs12_dVd =0.0, bs12_dVg =0.0, bs12_dT =0.0 ;
double Qbmm=0.0, Qbmm_dVb=0.0, Qbmm_dVd =0.0, Qbmm_dVg =0.0, Qbmm_dT =0.0 ;
double dqb=0.0, dqb_dVb=0.0, dqb_dVg=0.0, dqb_dVd =0.0, dqb_dT =0.0 ;
double Vdx=0.0, Vdx_dVbs=0.0, Vdx_dT=0.0 ;
double Vdx2=0.0, Vdx2_dVbs=0.0, Vdx2_dT=0.0 ;
double Pbsum=0.0, Pbsum_dVb=0.0, Pbsum_dVd=0.0, Pbsum_dVg =0.0, Pbsum_dT =0.0 ;
double sqrt_Pbsum =0.0 ;
/* Poly-Depletion Effect */
const double pol_b = 1.0 ;
double dPpg =0.0, dPpg_dVb =0.0, dPpg_dVd =0.0, dPpg_dVg =0.0, dPpg_dT = 0.0 ;
/* Quantum Effect */
double Tox =0.0, Tox_dVb =0.0, Tox_dVd =0.0, Tox_dVg =0.0 ;
double dTox =0.0, dTox_dVb =0.0, dTox_dVd =0.0, dTox_dVg =0.0 ;
double Cox =0.0, Cox_dVb =0.0, Cox_dVd =0.0, Cox_dVg =0.0 ;
double Cox_inv =0.0, Cox_inv_dVb =0.0, Cox_inv_dVd =0.0, Cox_inv_dVg =0.0 ;
double Tox =0.0, Tox_dVb =0.0, Tox_dVd =0.0, Tox_dVg =0.0, Tox_dT =0.0 ;
double dTox =0.0, dTox_dVb =0.0, dTox_dVd =0.0, dTox_dVg =0.0, dTox_dT =0.0 ;
double Cox =0.0, Cox_dVb =0.0, Cox_dVd =0.0, Cox_dVg =0.0, Cox_dT =0.0 ;
double Cox_inv =0.0, Cox_inv_dVb =0.0, Cox_inv_dVd =0.0, Cox_inv_dVg =0.0, Cox_inv_dT =0.0 ;
double Tox0 =0.0, Cox0 =0.0, Cox0_inv =0.0 ;
double Vthq=0.0, Vthq_dVb =0.0, Vthq_dVd =0.0 ;
/* Igate , Igidl , Igisl */
@@ -611,9 +617,9 @@ int HSMHVevaluate
double Vdb =0.0, Vsb =0.0 ;
/* connecting function */
double FD2 =0.0, FD2_dVbs =0.0, FD2_dVds =0.0, FD2_dVgs =0.0, FD2_dT =0.0 ;
double FMDVDS =0.0, FMDVDS_dVbs =0.0, FMDVDS_dVds =0.0, FMDVDS_dVgs =0.0 ;
double FMDVDS =0.0, FMDVDS_dVbs =0.0, FMDVDS_dVds =0.0, FMDVDS_dVgs =0.0, FMDVDS_dT =0.0 ;
double FMDVGS =0.0, FMDVGS_dVgs =0.0 ;
double FMDPG =0.0, FMDPG_dVbs =0.0, FMDPG_dVds =0.0, FMDPG_dVgs =0.0 ;
double FMDPG =0.0, FMDPG_dVbs =0.0, FMDPG_dVds =0.0, FMDPG_dVgs =0.0, FMDPG_dT =0.0 ;
double cnst0 =0.0, cnst0_dT =0.0;
double cnst1 =0.0, cnst1_dT =0.0;
@@ -703,7 +709,6 @@ int HSMHVevaluate
/* PART-4 (junction diode) */
double Ibs =0.0, Gbs =0.0, Gbse =0.0, Ibs_dT =0.0 ;
double Ibd =0.0, Gbd =0.0, Gbde =0.0, Ibd_dT =0.0 ;
/* junction capacitance */
double Qbs =0.0, Capbs =0.0, Capbse =0.0, Qbs_dT =0.0 ;
double Qbd =0.0, Capbd =0.0, Capbde =0.0, Qbd_dT =0.0 ;
@@ -755,6 +760,7 @@ int HSMHVevaluate
double T12 =0.0, T12_dT =0.0 ;
double T15 =0.0, T16 =0.0, T17 =0.0 ;
double T2_dVdse = 0.0, T5_dVdse = 0.0 ;
double T4_dVb_dT, T5_dVb_dT, T6_dVb_dT, T7_dVb_dT ;
int flg_zone =0 ;
double Vfbsft =0.0, Vfbsft_dVbs =0.0, Vfbsft_dVds =0.0, Vfbsft_dVgs =0.0, Vfbsft_dT =0.0 ;
@@ -772,10 +778,12 @@ int HSMHVevaluate
double QbuLD =0.0, QbuLD_dVbs =0.0, QbuLD_dVds =0.0, QbuLD_dVgs =0.0, QbuLD_dT =0.0 ;
double QbdLD =0.0, QbdLD_dVbs =0.0, QbdLD_dVds =0.0, QbdLD_dVgs =0.0, QbdLD_dT =0.0 ;
double QbsLD =0.0, QbsLD_dVbs =0.0, QbsLD_dVds =0.0, QbsLD_dVgs =0.0, QbsLD_dT =0.0 ;
double QbdLDext =0.0, QbdLDext_dVbse =0.0, QbdLDext_dVdse =0.0, QbdLDext_dVgse =0.0, QbdLDext_dT =0.0 ;
double QbsLDext =0.0, QbsLDext_dVbse =0.0, QbsLDext_dVdse =0.0, QbsLDext_dVgse =0.0, QbsLDext_dT =0.0 ;
/* Vgsz for SCE and PGD */
double Vbsz2 =0.0, Vbsz2_dVbs =0.0, Vbsz2_dVds =0.0, Vbsz2_dVgs =0.0 ;
double dmpacc =0.0, dmpacc_dVbs =0.0, dmpacc_dVds =0.0, dmpacc_dVgs =0.0 ;
double Vbsz2 =0.0, Vbsz2_dVbs =0.0, Vbsz2_dVds =0.0, Vbsz2_dVgs =0.0 , Vbsz2_dT =0.0;
/* Multiplication factor * number of gate fingers */
double Mfactor = here->HSMHV_m ;
@@ -842,6 +850,8 @@ int HSMHVevaluate
double QiuLD =0.0, QiuLD_dVbs =0.0, QiuLD_dVds =0.0, QiuLD_dVgs =0.0, QiuLD_dT =0.0 ;
double QidLD =0.0, QidLD_dVbs =0.0, QidLD_dVds =0.0, QidLD_dVgs =0.0, QidLD_dT =0.0 ;
double QisLD =0.0, QisLD_dVbs =0.0, QisLD_dVds =0.0, QisLD_dVgs =0.0, QisLD_dT =0.0 ;
double QidLDext =0.0, QidLDext_dVbse =0.0, QidLDext_dVdse =0.0, QidLDext_dVgse =0.0, QidLDext_dT =0.0 ;
double QisLDext =0.0, QisLDext_dVbse =0.0, QisLDext_dVdse =0.0, QisLDext_dVgse =0.0, QisLDext_dT =0.0 ;
/* Self heating */
double mphn0_dT =0.0 ;
@@ -1029,9 +1039,9 @@ int HSMHVevaluate
* Determine clamping limits for too large Vbs (internal).
*-----------------*/
if ( Pb2 - model->HSMHV_vzadd0 < Vbs_max ) {
Vbs_max = Pb2 - model->HSMHV_vzadd0 ;
}
Fn_SU( T1 , Pb2 - model->HSMHV_vzadd0 , Vbs_max , 0.1 , T0 ) ;
Vbs_max = T1 ;
Vbs_max_dT = Pb2_dT * T0 ;
if ( Pb20 - model->HSMHV_vzadd0 < Vbs_max ) {
Vbs_max = Pb20 - model->HSMHV_vzadd0 ;
Vbs_max_dT = 0.0 ;
@@ -1150,7 +1160,7 @@ int HSMHVevaluate
Fn_SymAdd( Vzadd , Vdserev / 2 , model->HSMHV_vzadd0 , T2 ) ;
Vzadd_ext_dVd = T2 / 2 ;
if ( Vzadd < ps_conv ) {
Vzadd = 0.0 ;
Vzadd = ps_conv ;
Vzadd_ext_dVd = 0.0 ;
}
Vdserevz = Vdserev + 2.0 * Vzadd ;
@@ -1276,7 +1286,9 @@ int HSMHVevaluate
}
if ( here->HSMHVsubNode >= 0 && model->HSMHV_cosym == 0 ) { /* external substrate node exists && LDMOS case: */
if ( here->HSMHVsubNode >= 0 && model->HSMHV_cosym == 0 &&
( pParam->HSMHV_nover * ( NSUBSUB + pParam->HSMHV_nover ) ) > 0 ) {
/* external substrate node exists && LDMOS case: */
/* Substrate Effect */
T0 = VBISUB - RDVDSUB * Vdserevz - RDVSUB * Vsubsrev ;
Fn_SZ( T1, T0, 10.0, T2 ) ;
@@ -1349,6 +1361,7 @@ int HSMHVevaluate
Rs_dVgse /= WeffLD_nf ;
Rs_dVdse /= WeffLD_nf ;
Rs_dVbse /= WeffLD_nf ;
Rs_dVsubs /= WeffLD_nf ;
Rs_dT /= WeffLD_nf ;
/* Sheet resistances are added. */
@@ -1387,27 +1400,38 @@ int HSMHVevaluate
/* x/xmax */
T4 = T1 * T3 ;
T4_dVb = T3 ;
T5 = T4 * T4;
T4_dT = T1_dT * T3 - T1*T3*T3*T2_dT;
T4_dVb_dT = -T3*T3*T2_dT ;
T5 = T4 * T4;
T5_dVb = 2 * T4_dVb * T4 ;
T5_dT = 2.0*T4*T4_dT;
T5_dVb_dT = 2 * T4_dVb_dT * T4 + 2 * T4_dVb * T4_dT ;
T15 = 2 * T4_dVb * T4_dVb ; /* T15 = T5_dVb_dVb */
T6 = T4 * T5 ;
T6_dVb = T4_dVb * T5 + T4 * T5_dVb ;
T6_dT = T4_dT * T5 + T4 * T5_dT ;
T6_dVb_dT = T4_dVb_dT * T5 + T4_dVb * T5_dT + T4_dT * T5_dVb + T4*T5_dVb_dT ;
T16 = T4_dVb * T5_dVb + T4_dVb * T5_dVb + T4 * T15 ; /* T16 = T6_dVb_dVb */
/* T7 = Z T7_dVb = dZ_dVb T17 = dZ_dVb_dVb */
T7 = 1 + T4 + T5 + T6 + T5 * T5 ;
T7_dVb = T4_dVb + T5_dVb + T6_dVb + 2 * T5_dVb * T5 ;
T7_dT = T4_dT + T5_dT + T6_dT + 2 * T5_dT * T5 ;
T7_dVb_dT = T4_dVb_dT + T5_dVb_dT + T6_dVb_dT + 2 * T5_dVb_dT * T5 + 2 * T5_dVb * T5_dT ;
T17 = T15 + T16 + 2 * T15 * T5 + 2 * T5_dVb * T5_dVb ;
T8 = T7 * T7 ;
T8_dVb = 2 * T7_dVb * T7 ;
T8_dT = 2 * T7_dT * T7 ;
T9 = 1 / T8 ;
T9_dVb = - T8_dVb * T9 * T9 ;
T9_dT = - T8_dT * T9 * T9 ;
Vbscl_dVbs = T2 * T7_dVb * T9 ;
Vbscl_dVbs_dT = T2_dT * T7_dVb * T9 + T2*(T7_dVb_dT * T9+ T7_dVb * T9_dT);
Vbscl_dVbs_dVbs = T2 * ( T17 * T9 + T7_dVb * T9_dVb ) ;
} else {
Vbscl = Vbs ;
@@ -1424,28 +1448,32 @@ int HSMHVevaluate
T1 = Vbscl_dVbs * Vds / 2 ;
Fn_SymAdd( Vzadd , T1 , model->HSMHV_vzadd0 , T2 ) ;
Vzadd_dVbs = T2 * Vbscl_dVbs_dVbs * Vds / 2 ;
Vzadd_dT = T2 * Vbscl_dVbs_dT * Vds / 2 ;
T2 *= Vbscl_dVbs / 2 ;
Vzadd_dVds = T2 ;
if ( Vzadd < ps_conv ) {
Vzadd = 0.0 ;
Vzadd = ps_conv ;
Vzadd_dVds = 0.0 ;
Vzadd_dVbs = 0.0 ;
Vzadd_dT = 0.0 ;
}
Vbsz = Vbscl + Vzadd ;
Vbsz_dVbs = Vbscl_dVbs + Vzadd_dVbs ;
Vbsz_dVds = Vzadd_dVds ;
Vbsz_dT = Vbscl_dT ;
Vbsz_dT = Vbscl_dT + Vzadd_dT;
Vdsz = Vds + 2.0 * Vzadd ;
Vdsz_dVbs = 2.0 * Vzadd_dVbs ;
Vdsz_dVds = 1.0 + 2.0 * Vzadd_dVds ;
Vdsz_dT = 2.0 * Vzadd_dT ;
Vgsz = Vgs + Vzadd ;
Vgsz_dVbs = Vzadd_dVbs ;
Vgsz_dVgs = 1.0 ;
Vgsz_dVds = Vzadd_dVds ;
Vgsz_dT = Vzadd_dT ;
/*---------------------------------------------------*
* Factor of modification for symmetry.
@@ -1461,9 +1489,10 @@ int HSMHVevaluate
VdsatS = Pslsat - Pb2c ;
Fn_SL( VdsatS , VdsatS , 0.1 , 5e-2 , T6 ) ;
VdsatS_dVbs = T6 * T5 / TX * Vbscl_dVbs ;
VdsatS_dVbs = ( TX ? (T6 * T5 / TX * Vbscl_dVbs) : 0.0 ) ;
VdsatS_dVds = 0.0 ;
VdsatS_dVgs = T6 * ( 1.0 - T5 / TX ) ;
VdsatS_dVgs = ( TX ? (T6 * ( 1.0 - T5 / TX )) : 0.0 ) ;
VdsatS_dT = (TX ? (T6* T5/TX * Vbscl_dT) : 0) ;
T1 = Vds / VdsatS ;
Fn_SUPoly4( TX , T1 , 1.0 , T0 ) ;
@@ -1473,6 +1502,7 @@ int HSMHVevaluate
FMDVDS_dVbs = T3 * ( - Vds * VdsatS_dVbs ) ;
FMDVDS_dVds = T3 * ( 1.0 * VdsatS - Vds * VdsatS_dVds ) ;
FMDVDS_dVgs = T3 * ( - Vds * VdsatS_dVgs ) ;
FMDVDS_dT = T3 * ( - Vds * VdsatS_dT ) ;
/*-----------------------------------------------------------*
* Quantum effect
@@ -1519,10 +1549,13 @@ int HSMHVevaluate
T5_dVb = Vgsz_dVbs - Vthq_dVb ;
T5_dVd = Vgsz_dVds - Vthq_dVd ;
T5_dVg = Vgsz_dVgs ;
T5_dT = Vgsz_dT ;
Fn_SZ( T2 , - T5 , qme2_dlt, T3) ;
T2_dVb = - T3 * T5_dVb ;
T2_dVd = - T3 * T5_dVd ;
T2_dVg = - T3 * T5_dVg ;
T2 = T2 + small ;
T2_dVb = - T3 * T5_dVb ;
T2_dVd = - T3 * T5_dVd ;
T2_dVg = - T3 * T5_dVg ;
T2_dT = - T3 * T5_dT ;
T3 = model->HSMHV_qme12 * T1 * T1 ;
T4 = model->HSMHV_qme12 * T2 * T2 + model->HSMHV_qme3 ;
Fn_SU( dTox , T4 , T3 , qme_dlt , T6 ) ;
@@ -1530,6 +1563,7 @@ int HSMHVevaluate
dTox_dVb = T7 * T2_dVb ;
dTox_dVd = T7 * T2_dVd ;
dTox_dVg = T7 * T2_dVg ;
dTox_dT = T7 * T2_dT ;
if ( dTox * 1.0e12 < Tox0 ) {
@@ -1537,33 +1571,37 @@ int HSMHVevaluate
dTox_dVb = 0.0 ;
dTox_dVd = 0.0 ;
dTox_dVg = 0.0 ;
dTox_dT = 0.0 ;
flg_qme = 0 ;
}
Tox = Tox0 + dTox ;
Tox_dVb = dTox_dVb ;
Tox_dVd = dTox_dVd ;
Tox_dVg = dTox_dVg ;
Tox_dT = dTox_dT ;
Cox = c_eox / Tox ;
T1 = - c_eox / ( Tox * Tox ) ;
Cox_dVb = T1 * Tox_dVb ;
Cox_dVd = T1 * Tox_dVd ;
Cox_dVg = T1 * Tox_dVg ;
Cox_inv = Tox / c_eox ;
Cox_dT = T1 * Tox_dT ;
Cox_inv = Tox / c_eox ;
T1 = 1.0 / c_eox ;
Cox_inv_dVb = T1 * Tox_dVb ;
Cox_inv_dVd = T1 * Tox_dVd ;
Cox_inv_dVg = T1 * Tox_dVg ;
Cox_inv_dT = T1 * Tox_dT ;
T0 = cnst0 * cnst0 * Cox_inv ;
cnstCoxi = T0 * Cox_inv ;
T1 = 2.0 * T0 ;
cnstCoxi_dVb = T1 * Cox_inv_dVb ;
cnstCoxi_dVd = T1 * Cox_inv_dVd ;
cnstCoxi_dVg = T1 * Cox_inv_dVg ;
cnstCoxi_dT = 2.0 * cnst0 * cnst0_dT * Cox_inv * Cox_inv ;
cnstCoxi_dT = 2.0 * cnst0 * cnst0_dT * Cox_inv * Cox_inv + T1 * Cox_inv_dT;
}
/*---------------------------------------------------*
@@ -1573,7 +1611,8 @@ int HSMHVevaluate
Vbsz2_dVbs = Vbsz_dVbs ;
Vbsz2_dVds = Vbsz_dVds ;
Vbsz2_dVgs = 0.0 ;
Vbsz2_dT = Vbsz_dT ;
/*---------------------------------------------------*
* Vthp : Vth with pocket.
*-----------------*/
@@ -1583,12 +1622,13 @@ int HSMHVevaluate
Qb0_dVb = T2 * (- Vbsz2_dVbs) ;
Qb0_dVd = T2 * (- Vbsz2_dVds) ;
Qb0_dVg = T2 * (- Vbsz2_dVgs) ;
Qb0_dT = T2 * (- Vbsz2_dT) ;
Vthp = Pb20 + Vfb + Qb0 * Cox_inv + here->HSMHV_ptovr;
Vthp_dVb = Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ;
Vthp_dVd = Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ;
Vthp_dVg = Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ;
Vthp_dT = ptovr_dT ;
Vthp_dT = Qb0_dT * Cox_inv + Qb0 * Cox_inv_dT + ptovr_dT ;
if ( pParam->HSMHV_pthrou != 0.0 ) {
/* Modify Pb20 to Pb20b */
@@ -1603,7 +1643,7 @@ int HSMHVevaluate
T1_dVg = Vgsz_dVgs - T10_dVg ;
T1_dVd = Vgsz_dVds - T10_dVd ;
T1_dVb = Vgsz_dVbs - T10_dVb ;
T1_dT = - T10_dT ;
T1_dT = Vgsz_dT - T10_dT ;
T0 = Fn_Sgn (T10) ;
T2 = sqrt (T1 * T1 + T0 * 4.0 * T10 * psia2_dlt) ;
T3 = T10 + 0.5 * (T1 + T2) - Vfb ; /* Vgpa for sqrt calc. */
@@ -1684,7 +1724,7 @@ int HSMHVevaluate
T1_dVb = T0 * Pb20b_dVb - Vbsz2_dVbs ;
T1_dVd = T0 * Pb20b_dVd - Vbsz2_dVds ;
T1_dVg = T0 * Pb20b_dVg - Vbsz2_dVgs ;
T1_dT = T0 * Pb20b_dT ;
T1_dT = T0 * Pb20b_dT - Vbsz2_dT ;
T2 = sqrt (T1 * T1 + 4.0 * T0 * Pb20b * 1.0e-3) ;
T3 = T0 * Pb20b - 0.5 * (T1 + T2) ;
T4 = 2.0 * T0 * 1.0e-3 ;
@@ -1720,31 +1760,36 @@ int HSMHVevaluate
T5_dVb = - Vbsz2_dVbs * T6 ;
T5_dVd = - Vbsz2_dVds * T6 ;
T5_dVg = - Vbsz2_dVgs * T6 ;
T5_dT = - Vbsz2_dT * T6 ;
T7 = 1.0 / T5 ;
bs12 = model->HSMHV_bs1 * T7 ;
T8 = - bs12 * T7 ;
bs12_dVb = T8 * T5_dVb ;
bs12_dVd = T8 * T5_dVd ;
bs12_dVg = T8 * T5_dVg ;
bs12_dT = T8 * T5_dT ;
Fn_SU( T10 , Vbsz2 + bs12, 0.93 * Pb20, vth_dlt, T0) ;
Qbmm = sqrt (T1 * (Pb20 - T10 )) ;
T9 = T0 / Qbmm ;
Qbmm_dVb = 0.5 * T1 * - (Vbsz2_dVbs + bs12_dVb) * T9 ;
Qbmm_dVd = 0.5 * T1 * - (Vbsz2_dVds + bs12_dVd) * T9 ;
Qbmm_dVg = 0.5 * T1 * - (Vbsz2_dVgs + bs12_dVg) * T9 ;
Qbmm_dT = 0.5 * T1 * - (Vbsz2_dT + bs12_dT) * T9 ;
dqb = (Qb0 - Qbmm) * Cox_inv ;
dqb_dVb = Vthp_dVb - Qbmm_dVb * Cox_inv - Qbmm * Cox_inv_dVb ;
dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv - Qbmm * Cox_inv_dVd ;
dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv - Qbmm * Cox_inv_dVg ;
dqb_dT = Vthp_dT - Qbmm_dT * Cox_inv - Qbmm * Cox_inv_dT ;
T1 = 2.0 * C_QE * pParam->HSMHV_nsubc * C_ESI ;
T1 = 2.0 * C_QE * here->HSMHV_nsubc * C_ESI ;
T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ;
Vth0 = Pb2c + Vfb + T2 * Cox_inv ;
T3 = 0.5 * T1 / T2 * Cox_inv ;
Vth0_dVb = T3 * ( - Vbsz2_dVbs ) + T2 * Cox_inv_dVb ;
Vth0_dVd = T3 * ( - Vbsz2_dVds ) + T2 * Cox_inv_dVd ;
Vth0_dVg = T3 * ( - Vbsz2_dVgs ) + T2 * Cox_inv_dVg ;
Vth0_dT = T3 * ( - Vbsz2_dT ) + T2 * Cox_inv_dT ;
T1 = C_ESI * Cox_inv ;
T2 = here->HSMHV_wdplp ;
@@ -1757,7 +1802,7 @@ int HSMHVevaluate
dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
dVth0_dT = T6 * Pbsum_dT + T8 * Pb20b_dT ;
dVth0_dT = T6 * Pbsum_dT + T7 * Cox_inv_dT + T8 * Pb20b_dT ;
T1 = Vthp - Vth0 ;
T1_dVb = Vthp_dVb - Vth0_dVb ;
@@ -1769,8 +1814,10 @@ int HSMHVevaluate
Vdx = model->HSMHV_scp21 + Vdsz ;
Vdx_dVbs = Vdsz_dVbs ;
Vdx_dT = Vdsz_dT ;
Vdx2 = Vdx * Vdx ;
Vdx2_dVbs = 2 * Vdx_dVbs * Vdx ;
Vdx2_dT = 2 * Vdx_dT * Vdx ;
dVthLP = T1 * dVth0 * T3 + dqb - here->HSMHV_msc / Vdx2 ;
dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb
@@ -1781,10 +1828,13 @@ int HSMHVevaluate
+ T1 * dVth0 * pParam->HSMHV_scp2 * Vdsz_dVds
+ dqb_dVd
+ 2.0e0 * here->HSMHV_msc * Vdx * Vdsz_dVds / ( Vdx2 * Vdx2 ) ;
dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3
dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3
+ T4 * Pbsum_dVg + dqb_dVg ;
dVthLP_dT = (Vthp_dT ) * dVth0 * T3 + T1 * dVth0_dT * T3
+ T4 * Pbsum_dT ;
dVthLP_dT = (Vthp_dT - Vth0_dT) * dVth0 * T3 + T1 * dVth0_dT * T3
+ T4 * Pbsum_dT
+ T1 * dVth0 * pParam->HSMHV_scp2 * Vdsz_dT
+ dqb_dT
+ 2.0e0 * here->HSMHV_msc * Vdx * Vdsz_dT / ( Vdx2 * Vdx2 );
} else {
dVthLP = 0.0e0 ;
dVthLP_dVb = 0.0e0 ;
@@ -1809,7 +1859,7 @@ int HSMHVevaluate
dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
dVth0_dT = T6 * Pbsum_dT + T8 * Pb20b_dT ;
dVth0_dT = T6 * Pbsum_dT + T7 * Cox_inv_dT + T8 * Pb20b_dT ;
T1 = pParam->HSMHV_sc3 / here->HSMHV_lgate ;
T4 = pParam->HSMHV_sc1 + T1 * Pbsum ;
@@ -1821,10 +1871,11 @@ int HSMHVevaluate
T5 = T4 + pParam->HSMHV_sc2 * Vdsz * ( 1.0 + model->HSMHV_sc4 * Pbsum );
T5_dVb = T4_dVb + pParam->HSMHV_sc2 * Vdsz * model->HSMHV_sc4 * Pbsum_dVb
+ pParam->HSMHV_sc2 * Vdsz_dVbs * model->HSMHV_sc4 * Pbsum;
T5_dVd = T4_dVd + pParam->HSMHV_sc2 * Vdsz_dVds * ( 1.0 + model->HSMHV_sc4 * Pbsum )
T5_dVd = T4_dVd + pParam->HSMHV_sc2 * Vdsz_dVds * ( 1.0 + model->HSMHV_sc4 * Pbsum )
+ pParam->HSMHV_sc2 * Vdsz * model->HSMHV_sc4 * Pbsum_dVd;
T5_dVg = T4_dVg + pParam->HSMHV_sc2 * Vdsz * model->HSMHV_sc4 * Pbsum_dVg;
T5_dT = T4_dT + pParam->HSMHV_sc2 * Vdsz * model->HSMHV_sc4 * Pbsum_dT;
T5_dT = T4_dT + pParam->HSMHV_sc2 * Vdsz * model->HSMHV_sc4 * Pbsum_dT
+ pParam->HSMHV_sc2 * Vdsz_dT * model->HSMHV_sc4 * Pbsum;
dVthSC = dVth0 * T5 ;
dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ;
@@ -1846,6 +1897,7 @@ int HSMHVevaluate
dVthW_dVb = Qb0_dVb * T5 - Cox_dVb * T6 ;
dVthW_dVd = Qb0_dVd * T5 - Cox_dVd * T6 ;
dVthW_dVg = - Cox_dVg * T6 ;
dVthW_dT = Qb0_dT * T5 - Cox_dT * T6 ;
/*---------------------------------------------------*
* dVth : Total variation.
@@ -1855,7 +1907,7 @@ int HSMHVevaluate
dVth_dVb = dVthSC_dVb + dVthLP_dVb + dVthW_dVb ;
dVth_dVd = dVthSC_dVd + dVthLP_dVd + dVthW_dVd ;
dVth_dVg = dVthSC_dVg + dVthLP_dVg + dVthW_dVg ;
dVth_dT = dVthSC_dT + dVthLP_dT ;
dVth_dT = dVthSC_dT + dVthLP_dT + dVthW_dT ;
/*---------------------------------------------------*
* Vth : Threshold voltage.
@@ -1917,6 +1969,7 @@ int HSMHVevaluate
FMDPG_dVbs = FMDVDS_dVbs * FMDVGS ;
FMDPG_dVds = FMDVDS_dVds * FMDVGS ;
FMDPG_dVgs = FMDVDS_dVgs * FMDVGS + FMDVDS * FMDVGS_dVgs ;
FMDPG_dT = FMDVDS_dT * FMDVGS ;
TX = pParam->HSMHV_pgd3 ;
@@ -1925,25 +1978,27 @@ int HSMHVevaluate
TY_dVbs = T1 * FMDPG_dVbs ;
TY_dVds = T1 * FMDPG_dVds ;
TY_dVgs = T1 * FMDPG_dVgs ;
if ( TX == 0.0 ) TY = TY_dVbs = TY_dVds = TY_dVgs = 0.0 ;
TY_dT = T1 * FMDPG_dT ;
if ( TX == 0.0 ) { TY =0.0 ; TY_dVbs =0.0 ; TY_dVds =0.0 ; TY_dVgs =0.0 ; TY_dT =0.0 ; }
T3 = T7 - model->HSMHV_pgd2 - TY * T8 ;
T3_dVb = - TY_dVbs * T8 ;
T3_dVd = T7_dVd - ( TY_dVds * T8 + TY * T8_dVd ) ;
T3_dVg = T7_dVg - ( TY_dVgs * T8 ) ;
T3_dT = - TY_dT * T8;
Fn_ExpLim( dPpg , T3 , T6 ) ;
dPpg *= T0 ;
dPpg_dVb = T0 * T6 * T3_dVb ;
dPpg_dVd = T0 * T6 * T3_dVd ;
dPpg_dVg = T0 * T6 * T3_dVg ;
dPpg_dT = 0.0 ;
dPpg_dT = T0 * T6 * T3_dT ;
Fn_SU( dPpg , dPpg , pol_b , pol_dlt , T9 ) ;
dPpg_dVb *= T9 ;
dPpg_dVd *= T9 ;
dPpg_dVg *= T9 ;
dPpg_dT = 0.0 ;
dPpg_dT *= T9 ;
/* damping in accumulation zone */
@@ -2838,10 +2893,10 @@ int HSMHVevaluate
/*---------------------------------------------------*
* Skip Psl calculation when Vds is very small.
*-----------------*/
if ( Vds <= epsm10 ) {
if ( Vds <= 0.0 ) {
Pds = 0.0 ;
Psl = Ps0 ;
flg_conv = 1 ;
// flg_conv = 1 ;
goto start_of_loopl ;
}
@@ -3131,7 +3186,7 @@ start_of_loopl:
*-----------------*/
Pds = Psl - Ps0 ;
/* if ( Pds < ps_conv ) { */
/* if ( Pds < ps_conv ) { */
if ( Pds < 0.0 ) { /* take care of numerical noise */
Pds = 0.0 ;
Psl = Ps0 ;
@@ -3317,7 +3372,7 @@ start_of_loopl:
Wd_dVbs = T9 * (Psl_dVbs - Vbscl_dVbs) ;
Wd_dVds = T9 * Psl_dVds ;
Wd_dVgs = T9 * Psl_dVgs ;
Wd_dT = T9 * Psl_dT ;
Wd_dT = T9 * (Psl_dT - Vbscl_dT) ;
T0 = 1.0 / Wd ;
T1 = Qn0 * T0 ;
@@ -3409,7 +3464,7 @@ start_of_loopl:
Lred_dVbs = FMDVDS_dVbs * T1 + FMDVDS * Lred_dVbs ;
Lred_dVds = FMDVDS_dVds * T1 + FMDVDS * Lred_dVds ;
Lred_dVgs = FMDVDS_dVgs * T1 + FMDVDS * Lred_dVgs ;
Lred_dT = FMDVDS * Lred_dT ;
Lred_dT = FMDVDS_dT * T1 + FMDVDS * Lred_dT ;
}
/* CLM5 & CLM6 */
@@ -3798,7 +3853,7 @@ start_of_mobility:
Mu_dVgs = Muun_dVgs * T5 - T7 * Em_dVgs ;
Mu_dT = Muun_dT * T5 + Muun * T5_dT ;
/* end_of_mobility :*/
/* end_of_mobility : */
/*-----------------------------------------------------------*
* Ids: channel current.
@@ -4242,8 +4297,8 @@ start_of_mobility:
Pzadd_dT = T2 * ( -Pds_dT );
if ( fabs ( Pzadd ) < epsm10 ) {
Pzadd = 0.0 ;
if ( Pzadd < epsm10 ) {
Pzadd = epsm10 ;
Pzadd_dVbs = 0.0 ;
Pzadd_dVds = 0.0 ;
Pzadd_dVgs = 0.0 ;
@@ -5022,11 +5077,11 @@ start_of_mobility:
if ( CVDSOVER != 0.0 ) { /* Qovsext begin */
Vgbgmt = Vgse - Vbs ;
Vgbgmt = Vgse - Vbse ;
Vgbgmt_dVbs = -1.0 ;
Vgbgmt_dVds = 0.0 ;
Vgbgmt_dVgs = 1.0 ;
Vxbgmt = - Vbs ;
Vxbgmt = - Vbse ;
Vxbgmt_dVbs = -1.0 ;
Vxbgmt_dVds = 0.0 ;
Vxbgmt_dVgs = 0.0 ;
@@ -5040,6 +5095,18 @@ start_of_mobility:
Qovsext_dVbse = T4 * QsuLD_dVbs ;
Qovsext_dT = T4 * QsuLD_dT ;
QisLDext = T4 * QiuLD ;
QisLDext_dVbse = T4 * QiuLD_dVbs ;
QisLDext_dVdse = T4 * QiuLD_dVds ;
QisLDext_dVgse = T4 * QiuLD_dVgs ;
QisLDext_dT = T4 * QiuLD_dT ;
QbsLDext = T4 * QbuLD ;
QbsLDext_dVbse = T4 * QbuLD_dVbs ;
QbsLDext_dVdse = T4 * QbuLD_dVds ;
QbsLDext_dVgse = T4 * QbuLD_dVgs ;
QbsLDext_dT = T4 * QbuLD_dT ;
} /* Qovsext end */
}
@@ -5143,11 +5210,11 @@ start_of_mobility:
if ( CVDSOVER != 0.0 ) { /* Qovdext begin */
Vgbgmt = Vgse - Vbs ;
Vgbgmt = Vgse - Vbse ;
Vgbgmt_dVbs = -1.0 ;
Vgbgmt_dVds = 0.0 ;
Vgbgmt_dVgs = 1.0 ;
Vxbgmt = Vdse - Vbs ;
Vxbgmt = Vdse - Vbse ;
Vxbgmt_dVbs = -1.0 ;
Vxbgmt_dVds = 1.0 ;
Vxbgmt_dVgs = 0.0 ;
@@ -5161,6 +5228,18 @@ start_of_mobility:
Qovdext_dVbse = T4 * QsuLD_dVbs ;
Qovdext_dT = T4 * QsuLD_dT ;
QidLDext = T4 * QiuLD ;
QidLDext_dVbse = T4 * QiuLD_dVbs ;
QidLDext_dVdse = T4 * QiuLD_dVds ;
QidLDext_dVgse = T4 * QiuLD_dVgs ;
QidLDext_dT = T4 * QiuLD_dT ;
QbdLDext = T4 * QbuLD ;
QbdLDext_dVbse = T4 * QbuLD_dVbs ;
QbdLDext_dVdse= T4 * QbuLD_dVds ;
QbdLDext_dVgse= T4 * QbuLD_dVgs ;
QbdLDext_dT = T4 * QbuLD_dT ;
} /* Qovdext end */
}
@@ -5434,7 +5513,8 @@ start_of_mobility:
czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSMHV_ktnom )) ;
czbsswg_dT = ( model->HSMHV_cjswg * here->HSMHV_weff_nf ) * tcjbsswg ;
if (vbs_jct == 0.0) {
// if (vbs_jct == 0.0) {
if (0) {
Qbs = 0.0 ;
Qbs_dT = 0.0 ;
Capbs = czbs + czbssw + czbsswg ;
@@ -5490,7 +5570,8 @@ start_of_mobility:
czbsswg = model->HSMHV_cjswg * here->HSMHV_ps ;
czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSMHV_ktnom )) ;
czbsswg_dT = ( model->HSMHV_cjswg * here->HSMHV_ps ) * tcjbsswg ;
if (vbs_jct == 0.0) {
// if (vbs_jct == 0.0) {
if (0) {
Qbs = 0.0 ;
Qbs_dT = 0.0 ;
Capbs = czbs + czbsswg ;
@@ -5542,7 +5623,8 @@ start_of_mobility:
czbdswg = model->HSMHV_cjswg * here->HSMHV_weff_nf ;
czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSMHV_ktnom )) ;
czbdswg_dT = ( model->HSMHV_cjswg * here->HSMHV_weff_nf ) * tcjbdswg ;
if (vbd_jct == 0.0) {
// if (vbd_jct == 0.0) {
if (0) {
Qbd = 0.0 ;
Qbd_dT = 0.0 ;
Capbd = czbd + czbdsw + czbdswg ;
@@ -5601,7 +5683,8 @@ start_of_mobility:
czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSMHV_ktnom )) ;
czbdswg_dT = ( model->HSMHV_cjswg * here->HSMHV_pd ) * tcjbdswg ;
if (vbd_jct == 0.0) {
// if (vbd_jct == 0.0) {
if (0) {
Qbd = 0.0 ;
Qbd_dT = 0.0 ;
Capbd = czbd + czbdswg ;
@@ -5966,6 +6049,22 @@ start_of_mobility:
here->HSMHV_dQb_dVbsi = 0.0 ;
here->HSMHV_dQb_dTi = 0.0 ;
here->HSMHV_qgext = 0.0 ;
here->HSMHV_qdext = 0.0 ;
here->HSMHV_qsext = 0.0 ;
here->HSMHV_dQdext_dVdse = 0.0 ;
here->HSMHV_dQdext_dVgse = 0.0 ;
here->HSMHV_dQdext_dVbse = 0.0 ;
here->HSMHV_dQdext_dTi = 0.0 ;
here->HSMHV_dQgext_dVdse = 0.0 ;
here->HSMHV_dQgext_dVgse = 0.0 ;
here->HSMHV_dQgext_dVbse = 0.0 ;
here->HSMHV_dQgext_dTi = 0.0 ;
here->HSMHV_dQbext_dVdse = 0.0 ;
here->HSMHV_dQbext_dVgse = 0.0 ;
here->HSMHV_dQbext_dVbse = 0.0 ;
here->HSMHV_dQbext_dTi = 0.0 ;
here->HSMHV_tau = tau ;
here->HSMHV_tau_dVgsi = tau_dVgs ;
here->HSMHV_tau_dVdsi = tau_dVds ;
@@ -6013,6 +6112,22 @@ start_of_mobility:
here->HSMHV_dqsp_dVbse = 0.0 ;
here->HSMHV_dqsp_dTi = 0.0 ;
here->HSMHV_qgext = 0.0 ;
here->HSMHV_qdext = 0.0 ;
here->HSMHV_qsext = 0.0 ;
here->HSMHV_dQdext_dVdse = 0.0 ;
here->HSMHV_dQdext_dVgse = 0.0 ;
here->HSMHV_dQdext_dVbse = 0.0 ;
here->HSMHV_dQdext_dTi = 0.0 ;
here->HSMHV_dQgext_dVdse = 0.0 ;
here->HSMHV_dQgext_dVgse = 0.0 ;
here->HSMHV_dQgext_dVbse = 0.0 ;
here->HSMHV_dQgext_dTi = 0.0 ;
here->HSMHV_dQbext_dVdse = 0.0 ;
here->HSMHV_dQbext_dVgse = 0.0 ;
here->HSMHV_dQbext_dVbse = 0.0 ;
here->HSMHV_dQbext_dTi = 0.0 ;
here->HSMHV_dQdi_dVdsi = Mfactor * Qd_dVds ;
here->HSMHV_dQdi_dVgsi = Mfactor * Qd_dVgs ;
here->HSMHV_dQdi_dVbsi = Mfactor * Qd_dVbs ;
@@ -6035,8 +6150,9 @@ start_of_mobility:
here->HSMHV_qg += Mfactor * ( Qgod + Qgos + Qgbo + Qy - Qovd - Qovs ) ;
here->HSMHV_qd += Mfactor * ( - Qgod - Qy + QbdLD ) ;
here->HSMHV_qs += Mfactor * ( - Qgos + QbsLD ) ;
here->HSMHV_qdp += Mfactor * ( - Qfd - Qgdo + Qovdext ) ;
here->HSMHV_qsp += Mfactor * ( - Qfs - Qgso + Qovsext ) ;
here->HSMHV_qdp += Mfactor * ( - Qfd - Qgdo ) ;
here->HSMHV_qsp += Mfactor * ( - Qfs - Qgso ) ;
here->HSMHV_cddo = Mfactor * ( - Qgod_dVds - Qy_dVds + QbdLD_dVds ) ;
here->HSMHV_dQdi_dVdsi += here->HSMHV_cddo ;
@@ -6059,21 +6175,44 @@ start_of_mobility:
here->HSMHV_cbbo = Mfactor * ( - Qgbo_dVbs + QidLD_dVbs + QisLD_dVbs ) ;
here->HSMHV_dQb_dVbsi += here->HSMHV_cbbo ;
here->HSMHV_dQb_dTi += Mfactor * ( - Qgbo_dT + QidLD_dT + QisLD_dT ) ;
/* for fringing capacitances */
here->HSMHV_dqdp_dVdse += Mfactor * ( Cfd - Qgdo_dVdse + Qovdext_dVdse ) ;
here->HSMHV_dqdp_dVgse += Mfactor * ( - Cfd - Qgdo_dVgse + Qovdext_dVgse ) ;
here->HSMHV_dqdp_dVbse += Mfactor * ( - Qgdo_dVbse + Qovdext_dVbse ) ;
here->HSMHV_dqdp_dTi += Mfactor * ( Qovdext_dT ) ;
here->HSMHV_dqsp_dVdse += Mfactor * ( - Qgso_dVdse + Qovsext_dVdse ) ;
here->HSMHV_dqsp_dVgse += Mfactor * ( - Cfs - Qgso_dVgse + Qovsext_dVgse ) ;
here->HSMHV_dqsp_dVbse += Mfactor * ( - Qgso_dVbse + Qovsext_dVbse ) ;
here->HSMHV_dqsp_dTi += Mfactor * ( Qovsext_dT ) ;
here->HSMHV_dqdp_dVdse += Mfactor * ( Cfd - Qgdo_dVdse ) ;
here->HSMHV_dqdp_dVgse += Mfactor * ( - Cfd - Qgdo_dVgse ) ;
here->HSMHV_dqdp_dVbse += Mfactor * ( - Qgdo_dVbse ) ;
here->HSMHV_dqdp_dTi += 0.0 ;
here->HSMHV_dqsp_dVdse += Mfactor * ( - Qgso_dVdse ) ;
here->HSMHV_dqsp_dVgse += Mfactor * ( - Cfs - Qgso_dVgse ) ;
here->HSMHV_dqsp_dVbse += Mfactor * ( - Qgso_dVbse ) ;
here->HSMHV_dqsp_dTi += 0.0 ;
here->HSMHV_qgext += Mfactor * ( - Qovdext - Qovsext ) ;
here->HSMHV_qdext += Mfactor * QbdLDext ;
here->HSMHV_qsext += Mfactor * QbsLDext ;
here->HSMHV_dQdext_dVdse += Mfactor * ( QbdLDext_dVdse ) ;
here->HSMHV_dQdext_dVgse += Mfactor * ( QbdLDext_dVgse ) ;
here->HSMHV_dQdext_dVbse += Mfactor * ( QbdLDext_dVbse ) ;
here->HSMHV_dQdext_dTi += Mfactor * ( QbdLDext_dT ) ;
here->HSMHV_dQgext_dVdse += Mfactor * ( - Qovdext_dVdse - Qovsext_dVdse ) ;
here->HSMHV_dQgext_dVgse += Mfactor * ( - Qovdext_dVgse - Qovsext_dVgse ) ;
here->HSMHV_dQgext_dVbse += Mfactor * ( - Qovdext_dVbse - Qovsext_dVbse ) ;
here->HSMHV_dQgext_dTi += Mfactor * ( - Qovdext_dT - Qovsext_dT ) ;
here->HSMHV_dQbext_dVdse += Mfactor * ( QidLDext_dVdse + QisLDext_dVdse ) ;
here->HSMHV_dQbext_dVgse += Mfactor * ( QidLDext_dVgse + QisLDext_dVgse ) ;
here->HSMHV_dQbext_dVbse += Mfactor * ( QidLDext_dVbse + QisLDext_dVbse ) ;
here->HSMHV_dQbext_dTi += Mfactor * ( QidLDext_dT + QisLDext_dT ) ;
}
here->HSMHV_dQsi_dVdsi = - (here->HSMHV_dQdi_dVdsi + here->HSMHV_dQg_dVdsi + here->HSMHV_dQb_dVdsi) ;
here->HSMHV_dQsi_dVgsi = - (here->HSMHV_dQdi_dVgsi + here->HSMHV_dQg_dVgsi + here->HSMHV_dQb_dVgsi) ;
here->HSMHV_dQsi_dVbsi = - (here->HSMHV_dQdi_dVbsi + here->HSMHV_dQg_dVbsi + here->HSMHV_dQb_dVbsi) ;
here->HSMHV_dQsi_dTi = - (here->HSMHV_dQdi_dTi + here->HSMHV_dQg_dTi + here->HSMHV_dQb_dTi ) ;
here->HSMHV_dQsext_dVdse = - (here->HSMHV_dQdext_dVdse + here->HSMHV_dQgext_dVdse + here->HSMHV_dQbext_dVdse) ;
here->HSMHV_dQsext_dVgse = - (here->HSMHV_dQdext_dVgse + here->HSMHV_dQgext_dVgse + here->HSMHV_dQbext_dVgse) ;
here->HSMHV_dQsext_dVbse = - (here->HSMHV_dQdext_dVbse + here->HSMHV_dQgext_dVbse + here->HSMHV_dQbext_dVbse) ;
here->HSMHV_dQsext_dTi = - (here->HSMHV_dQdext_dTi + here->HSMHV_dQgext_dTi + here->HSMHV_dQbext_dTi ) ;
/*---------------------------------------------------*
* Substrate/gate/leak currents.
@@ -6336,13 +6475,13 @@ start_of_mobility:
here->HSMHV_dRs_dTi = Rs_dT / Mfactor ;
} else {
here->HSMHV_Rd = Rs / Mfactor ;
here->HSMHV_dRd_dVdse = - ( Rs_dVdse + Rs_dVgse + Rs_dVbse ) / Mfactor ;
here->HSMHV_dRd_dVdse = - ( Rs_dVdse + Rs_dVgse + Rs_dVbse + Rs_dVsubs ) / Mfactor ;
here->HSMHV_dRd_dVgse = Rs_dVgse / Mfactor ;
here->HSMHV_dRd_dVbse = Rs_dVbse / Mfactor ;
here->HSMHV_dRd_dVsubs = Rs_dVsubs / Mfactor ;
here->HSMHV_dRd_dTi = Rs_dT / Mfactor ;
here->HSMHV_Rs = Rd / Mfactor ;
here->HSMHV_dRs_dVdse = - ( Rd_dVdse + Rd_dVgse + Rd_dVbse ) / Mfactor ;
here->HSMHV_dRs_dVdse = - ( Rd_dVdse + Rd_dVgse + Rd_dVbse + Rs_dVsubs ) / Mfactor ;
here->HSMHV_dRs_dVgse = Rd_dVgse / Mfactor ;
here->HSMHV_dRs_dVbse = Rd_dVbse / Mfactor ;
here->HSMHV_dRs_dVsubs = Rd_dVsubs / Mfactor ;
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhveval_qover.h
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
@@ -37,7 +37,7 @@
T11 = 1.0 ;
T10_dT = 0.0;
}
Vxbgmtcl = - T10;
Vxbgmtcl = - T10 - small2 ;
Vxbgmtcl_dVxbgmt = T11;
Vxbgmtcl_dT = - T10_dT;
@@ -166,13 +166,8 @@
to get Ps0_iniA from simplified Poisson equation: */
flg_ovzone = 2 ;
Chi = znbd3 ;
T4 = sqrt(Chi+exp(-Chi)-1.0);
T5 = 1.0 + 0.5*beta*fac1*(1.0-exp(-Chi))/T4;
T6 = beta / T5;
Chi_dVxb = T6 * Vxbgmtcl_dVxbgmt;
Chi_dVgb = T6 * VgpLD_dVgb;
Chi_dT = ( beta_dT*(VgpLD+Vxbgmtcl-fac1*T4)
+ beta*(Vxbgmtcl_dT-fac1_dT*T4) ) / T5;
Chi_dVxb = 0.0 ; Chi_dVgb = 0.0 ; Chi_dT = 0.0 ;
Ps0_iniA= Chi/beta - Vxbgmtcl ;
Ps0_iniA_dVxb = Chi_dVxb/beta - Vxbgmtcl_dVxbgmt ;
Ps0_iniA_dVgb = Chi_dVgb/beta ;
@@ -342,12 +337,9 @@
Chi_A_dT = Chi_dT;
Fn_SU2( Chi, Chi_A, Chi_B, c_ps0ini_2*75.00, T1, T2 ); /* org: 50 */
Chi_dVgb = Chi_A_dVgb * T1*(1.05) + Chi_B_dVgb * T2; /* 1.05 */
Chi_dVgb = Chi_A_dVgb * T1 + Chi_B_dVgb * T2;
Chi_dVxb = Chi_A_dVxb * T1 + Chi_B_dVxb * T2;
Chi_dT = Chi_A_dT * T1 + Chi_B_dT * T2;
Fn_SU( Chi_dVgb , -Chi_dVgb , -Chi_A_dVgb , 1.0e-5 , T3 ) /* 1.0e-5 */
Chi_dVgb = - Chi_dVgb;
Fn_SL( Chi_dVxb , Chi_dVxb , Chi_A_dVxb , 1.0e-5 , T3 )
}
@@ -393,7 +385,7 @@
*-----------------*/
/* initial value too close to flat band should not be used */
if (Ps0LD+Vxbgmtcl < 1.0e-2) Ps0LD = 1.0e-2 - Vxbgmtcl;
// if (Ps0LD+Vxbgmtcl < 1.0e-2) Ps0LD = 1.0e-2 - Vxbgmtcl;
exp_bVbs = exp( beta * - Vxbgmtcl ) ;
T0 = here->HSMHV_nin / Nover_func;
cnst1over = T0 * T0;
@@ -549,8 +541,6 @@
Xi0p32_dVgs = T1 * Ps0LD_dVgb ;
Xi0p32_dT = 3 * fb * fb * fb_dChi * Chi_dT ;
fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ;
fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ;
} else {
/*-------------------------------------------*
* zone-D3. (Ps0LD)
@@ -577,14 +567,6 @@
Xi0p32_dVgs = T1 * Xi0_dVgs ;
Xi0p32_dT = T1 * Xi0_dT ;
if ( Chi < large_arg ) {
exp_Chi_dT = exp_Chi * Chi_dT ;
fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ;
} else {
exp_bPs0_dT = exp_bPs0 * (beta_dT * Ps0LD + beta * Ps0LD_dT) ;
fs01_dT = cnst1over_dT*(exp_bPs0-exp_bVbs) + cnst1over*(exp_bPs0_dT-exp_bVbs_dT) ;
}
fs02_dT = T2 * ( Chi_dT + fs01_dT ) ;
} /* end of if ( Chi ... ) block */
/*-----------------------------------------------------------*
+4 -4
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvevalenv.h
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
+5 -5
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvext.h
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
@@ -27,7 +27,7 @@ extern int HSMHVmDelete(GENmodel**,IFuid,GENmodel*);
extern int HSMHVmParam(int,IFvalue*,GENmodel*);
extern void HSMHVmosCap(CKTcircuit*, double, double, double, double*,
double, double, double, double, double, double,
double*, double*, double*, double*, double*, double*, double*, double*,
double*, double*, double*, double*, double*, double*, double*, double*,
double*, double*, double*, double*, double*, double*, double*,
double*);
extern int HSMHVparam(int,IFvalue*,GENinstance*,IFvalue*);
+4 -4
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvgetic.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
+4 -4
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvitf
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
+111 -39
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvld.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
@@ -40,8 +40,8 @@ static void ShowPhysVals
)
{
NG_IGNORE(vgd);
NG_IGNORE(vbd);
NG_IGNORE(vgd);
NG_IGNORE(vbd);
/* */
/* */
@@ -222,6 +222,7 @@ int HSMHVload(
/* displacement currents */
double cq_d=0.0, cq_dP=0.0, cq_g=0.0, cq_gP=0.0, cq_s=0.0, cq_sP=0.0, cq_bP=0.0, cq_b=0.0, cq_db=0.0, cq_sb=0.0, cq_t=0.0 ;
double cq_dE=0.0, cq_gE=0.0, cq_sE=0.0, cq_bE=0.0 ;
/* node currents */
double cur_d=0.0, cur_dP=0.0, cur_g=0.0, cur_gP=0.0, cur_s=0.0, cur_sP=0.0, cur_bP=0.0, cur_b=0.0, cur_db=0.0, cur_sb=0.0, cur_t=0.0 ;
@@ -247,6 +248,10 @@ int HSMHVload(
double Qfd=0.0, dQfd_dVdse=0.0, dQfd_dVgse=0.0, dQfd_dVbse=0.0, dQfd_dT=0.0 ;
double Qfs=0.0, dQfs_dVdse=0.0, dQfs_dVgse=0.0, dQfs_dVbse=0.0, dQfs_dT=0.0 ;
double Qdext=0.0, dQdext_dVdse=0.0, dQdext_dVgse=0.0, dQdext_dVbse=0.0, dQdext_dT=0.0 ;
double Qgext=0.0, dQgext_dVdse=0.0, dQgext_dVgse=0.0, dQgext_dVbse=0.0, dQgext_dT=0.0 ;
double Qsext=0.0, dQsext_dVdse=0.0, dQsext_dVgse=0.0, dQsext_dVbse=0.0, dQsext_dT=0.0 ;
double Qbext=0.0, dQbext_dVdse=0.0, dQbext_dVgse=0.0, dQbext_dVbse=0.0, dQbext_dT=0.0 ;
/* 5th substrate node */
int flg_subNode = 0 ;
@@ -270,7 +275,9 @@ int HSMHVload(
#define Fn_SU( y , x , xmax , delta , dx ) { \
TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
TMF2 = sqrt ( TMF1 * TMF1 + 4.0 * ( xmax ) * ( delta) ) ; \
TMF2 = 4.0 * ( xmax ) * ( delta) ; \
TMF2 = TMF2 > 0.0 ? TMF2 : -( TMF2 ) ; \
TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
}
@@ -306,7 +313,7 @@ int HSMHVload(
double ydyn_bP[XDIM], ydyn_b[XDIM], ydyn_db[XDIM], ydyn_sb[XDIM], ydyn_t[XDIM], ydyn_qi[XDIM], ydyn_qb[XDIM] ;
/* limiter, bypass, and convergence */
int ByPass=0, Check=0, Check1=0, Check2=0, Check3=0;
int ByPass=0, Check=0, Check1=0, Check2=0, Check3=0 ;
double von=0.0, limval =0.0 ;
double i_dP_hat=0.0, i_gP_hat=0.0, i_sP_hat=0.0, i_db_hat=0.0, i_sb_hat =0.0 ;
@@ -1090,6 +1097,27 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
dQfs_dVgse = here->HSMHV_dqsp_dVgse ;
dQfs_dVbse = here->HSMHV_dqsp_dVbse ;
dQfs_dT = (flg_tempNode > 0) ? here->HSMHV_dqsp_dTi : 0.0 ;
Qdext = here->HSMHV_qdext ;
dQdext_dVdse = here->HSMHV_dQdext_dVdse ;
dQdext_dVgse = here->HSMHV_dQdext_dVgse ;
dQdext_dVbse = here->HSMHV_dQdext_dVbse ;
dQdext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQdext_dTi : 0.0 ;
Qgext = here->HSMHV_qgext ;
dQgext_dVdse = here->HSMHV_dQgext_dVdse ;
dQgext_dVgse = here->HSMHV_dQgext_dVgse ;
dQgext_dVbse = here->HSMHV_dQgext_dVbse ;
dQgext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQgext_dTi : 0.0 ;
Qsext = here->HSMHV_qsext ;
dQsext_dVdse = here->HSMHV_dQsext_dVdse ;
dQsext_dVgse = here->HSMHV_dQsext_dVgse ;
dQsext_dVbse = here->HSMHV_dQsext_dVbse ;
dQsext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQsext_dTi : 0.0 ;
Qbext = - (here->HSMHV_qgext + here->HSMHV_qdext + here->HSMHV_qsext) ;
dQbext_dVdse = here->HSMHV_dQbext_dVdse ;
dQbext_dVgse = here->HSMHV_dQbext_dVgse ;
dQbext_dVbse = here->HSMHV_dQbext_dVbse ;
dQbext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQbext_dTi : 0.0 ;
Isub = here->HSMHV_isub ;
dIsub_dVds = here->HSMHV_dIsub_dVdsi ;
dIsub_dVgs = here->HSMHV_dIsub_dVgsi ;
@@ -1231,6 +1259,27 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
dQfs_dVgse = here->HSMHV_dqdp_dVgse ;
dQfs_dVbse = here->HSMHV_dqdp_dVbse ;
dQfs_dT = (flg_tempNode > 0) ? here->HSMHV_dqdp_dTi : 0.0 ;
Qdext = here->HSMHV_qsext ;
dQdext_dVdse = - (here->HSMHV_dQsext_dVdse + here->HSMHV_dQsext_dVgse + here->HSMHV_dQsext_dVbse);
dQdext_dVgse = here->HSMHV_dQsext_dVgse ;
dQdext_dVbse = here->HSMHV_dQsext_dVbse ;
dQdext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQsext_dTi : 0.0 ;
Qgext = here->HSMHV_qgext ;
dQgext_dVdse = - (here->HSMHV_dQgext_dVdse + here->HSMHV_dQgext_dVgse + here->HSMHV_dQgext_dVbse);
dQgext_dVgse = here->HSMHV_dQgext_dVgse ;
dQgext_dVbse = here->HSMHV_dQgext_dVbse ;
dQgext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQgext_dTi : 0.0 ;
Qsext = here->HSMHV_qdext ;
dQsext_dVdse = - (here->HSMHV_dQdext_dVdse + here->HSMHV_dQdext_dVgse + here->HSMHV_dQdext_dVbse);
dQsext_dVgse = here->HSMHV_dQdext_dVgse ;
dQsext_dVbse = here->HSMHV_dQdext_dVbse ;
dQsext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQdext_dTi : 0.0 ;
Qbext = - (here->HSMHV_qgext + here->HSMHV_qdext + here->HSMHV_qsext) ;
dQbext_dVdse = - (here->HSMHV_dQbext_dVdse + here->HSMHV_dQbext_dVgse + here->HSMHV_dQbext_dVbse);
dQbext_dVgse = here->HSMHV_dQbext_dVgse ;
dQbext_dVbse = here->HSMHV_dQbext_dVbse ;
dQbext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQbext_dTi : 0.0 ;
Isub = 0.0 ;
dIsub_dVds = 0.0 ;
dIsub_dVgs = 0.0 ;
@@ -1956,13 +2005,13 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
if (!ByPass) { /* loading of state vector not necessary in case of Bypass */
/* intrinsic gate node (without fringing charges) */
*(ckt->CKTstate0 + here->HSMHVqg) = Qg + Qg_nqs ;
*(ckt->CKTstate0 + here->HSMHVqg) = Qg + Qg_nqs + Qgext;
/* intrinsic drain node */
*(ckt->CKTstate0 + here->HSMHVqd) = Qd + Qd_nqs ;
/* intrinsic bulk node */
*(ckt->CKTstate0 + here->HSMHVqb) = Qb + Qb_nqs ;
*(ckt->CKTstate0 + here->HSMHVqb) = Qb + Qb_nqs + Qbext;
/* drain bulk node */
*(ckt->CKTstate0 + here->HSMHVqbd) = Qbd ;
@@ -1977,6 +2026,9 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
*(ckt->CKTstate0 + here->HSMHVqfd) = Qfd ;
*(ckt->CKTstate0 + here->HSMHVqfs) = Qfs ;
/* external drain node */
*(ckt->CKTstate0 + here->HSMHVqdE) = Qdext;
/* nqs charges Qi_nqs, Qb_nqs: already loaded above */
/* if ( flg_nqs ) { */
/* *(ckt->CKTstate0 + here->HSMHVqi_nqs) = Qi_nqs; */
@@ -1987,17 +2039,17 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
/* ... assemble capacitance matrix */
/* ...... drain node */
ydyn_d[dNode] = dQfd_dVdse + Cbd;
ydyn_d[dNode] = dQfd_dVdse + Cbd + dQdext_dVdse ;
/* ydyn_d[dNodePrime] = 0.0 ; */
/* ydyn_d[gNode] = 0.0 ; */
ydyn_d[gNodePrime] = dQfd_dVgse;
ydyn_d[sNode] = - (dQfd_dVdse + dQfd_dVgse+ dQfd_dVbse);
ydyn_d[gNodePrime] = dQfd_dVgse + dQdext_dVgse ;
ydyn_d[sNode] = - (dQfd_dVdse + dQfd_dVgse+ dQfd_dVbse) - ( dQdext_dVdse + dQdext_dVgse + dQdext_dVbse ) ;
/* ydyn_d[sNodePrime ] = 0.0 ; */
ydyn_d[bNodePrime] = dQfd_dVbse;
ydyn_d[bNodePrime] = dQfd_dVbse + dQdext_dVbse;
/* ydyn_d[bNode ] = 0.0 ; */
ydyn_d[dbNode] = - Cbd ;
/* ydyn_d[sbNode ] = 0.0 ; */
ydyn_d[tempNode] = dQfd_dT - Cbdt;
ydyn_d[tempNode] = dQfd_dT - Cbdt + dQdext_dT ;
/* ...... intrinsic drain node */
/* ydyn_dP[dNode] = 0.0 ; */
@@ -2016,30 +2068,31 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
/* (no entry) */
/* ...... intrinsic gate node */
ydyn_gP[dNode] = -dQfd_dVdse - dQfs_dVdse ;
ydyn_gP[dNode] = -dQfd_dVdse - dQfs_dVdse + dQgext_dVdse ;
ydyn_gP[dNodePrime] = dQg_dVds ;
/* ydyn_gP[gNode] = 0.0 ; */
ydyn_gP[gNodePrime] = dQg_dVgs -dQfd_dVgse - dQfs_dVgse;
ydyn_gP[sNode] = dQfd_dVdse + dQfs_dVdse + dQfd_dVgse + dQfs_dVgse + dQfd_dVbse + dQfs_dVbse;
ydyn_gP[gNodePrime] = dQg_dVgs -dQfd_dVgse - dQfs_dVgse + dQgext_dVgse ;
ydyn_gP[sNode] = dQfd_dVdse + dQfs_dVdse + dQfd_dVgse + dQfs_dVgse + dQfd_dVbse + dQfs_dVbse
- ( dQgext_dVdse + dQgext_dVgse + dQgext_dVbse ) ;
ydyn_gP[sNodePrime] = -( dQg_dVds + dQg_dVgs + dQg_dVbs ) ;
ydyn_gP[bNodePrime] = dQg_dVbs -dQfd_dVbse - dQfs_dVbse;
ydyn_gP[bNodePrime] = dQg_dVbs -dQfd_dVbse - dQfs_dVbse + dQgext_dVbse ;
/* ydyn_gP[bNode] = 0.0 ; */
/* ydyn_gP[dbNode] = 0.0 ; */
/* ydyn_gP[sbNode] = 0.0 ; */
ydyn_gP[tempNode] = dQg_dT - dQfd_dT - dQfs_dT ;
ydyn_gP[tempNode] = dQg_dT - dQfd_dT - dQfs_dT + dQgext_dT ;
/* ...... source node */
ydyn_s[dNode] = dQfs_dVdse;
ydyn_s[dNode] = dQfs_dVdse + dQsext_dVdse ;
/* ydyn_d[dNodePrime ] = 0.0 ; */
/* ydyn_d[gNode ] = 0.0 ; */
ydyn_s[gNodePrime] = dQfs_dVgse;
ydyn_s[sNode] = Cbs - (dQfs_dVdse + dQfs_dVgse+ dQfs_dVbse);
ydyn_s[gNodePrime] = dQfs_dVgse + dQsext_dVgse ;
ydyn_s[sNode] = Cbs - (dQfs_dVdse + dQfs_dVgse+ dQfs_dVbse) - ( dQsext_dVdse + dQsext_dVgse + dQsext_dVbse ) ;
/* ydyn_d[sNodePrime ] = 0.0 ; */
ydyn_s[bNodePrime] = dQfs_dVbse;
ydyn_s[bNodePrime] = dQfs_dVbse + dQsext_dVbse ;
/* ydyn_d[bNode ] = 0.0 ; */
/* ydyn_d[dbNode ] = 0.0 ; */
ydyn_s[sbNode] = - Cbs ;
ydyn_s[tempNode] = dQfs_dT - Cbst;
ydyn_s[tempNode] = dQfs_dT - Cbst + dQsext_dT ;
/* ...... intrinsic source node */
/* ydyn_sP[dNode] = 0.0 ; */
@@ -2055,17 +2108,17 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
ydyn_sP[tempNode] = dQs_dT ;
/* ...... intrinsic bulk node */
/* ydyn_bP[dNode] = 0.0 ; */
ydyn_bP[dNode] = dQbext_dVdse ;
ydyn_bP[dNodePrime] = dQb_dVds ;
/* ydyn_bP[gNode] = 0.0 ; */
ydyn_bP[gNodePrime] = dQb_dVgs ;
/* ydyn_bP[sNode] = 0.0 ; */
ydyn_bP[gNodePrime] = dQb_dVgs + dQbext_dVgse ;
ydyn_bP[sNode] = - ( dQbext_dVdse + dQbext_dVgse + dQbext_dVbse ) ;
ydyn_bP[sNodePrime] = - ( dQb_dVds + dQb_dVgs + dQb_dVbs );
ydyn_bP[bNodePrime] = dQb_dVbs;
ydyn_bP[bNodePrime] = dQb_dVbs + dQbext_dVbse ;
/* ydyn_bP[bNode] = 0.0 ; */
/* ydyn_bP[dbNode] = 0.0 ; */
/* ydyn_bP[sbNode] = 0.0 ; */
ydyn_bP[tempNode] = dQb_dT ;
ydyn_bP[tempNode] = dQb_dT + dQbext_dT ;
/* ...... bulk node */
/* (no entry) */
@@ -2192,7 +2245,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
/* store small signal parameters */
if (ckt->CKTmode & MODEINITSMSIG) {
/* printf("HSMHV_load: (small signal) ByPass=%d\n",ByPass);
printf("HSMHV_load: ydc_dP=%e %e %e %e %e %e %e %e\n",
/* printf("HSMHV_load: ydc_dP=%e %e %e %e %e %e %e %e\n",
ydc_dP[0],ydc_dP[1],ydc_dP[2],ydc_dP[3],ydc_dP[4],ydc_dP[5],ydc_dP[6],ydc_dP[7]);
printf("HSMHV_load: ych_dP=%e %e %e %e %e %e %e %e\n",
ydyn_dP[0],ydyn_dP[1],ydyn_dP[2],ydyn_dP[3],ydyn_dP[4],ydyn_dP[5],ydyn_dP[6],ydyn_dP[7]);
@@ -2252,12 +2305,14 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
*(ckt->CKTstate1 + here->HSMHVqfd) = *(ckt->CKTstate0 + here->HSMHVqfd);
*(ckt->CKTstate1 + here->HSMHVqfs) = *(ckt->CKTstate0 + here->HSMHVqfs);
*(ckt->CKTstate1 + here->HSMHVqdE) = *(ckt->CKTstate0 + here->HSMHVqdE);
if (flg_nqs) {
*(ckt->CKTstate1 + here->HSMHVqi_nqs) = *(ckt->CKTstate0 + here->HSMHVqi_nqs);
*(ckt->CKTstate1 + here->HSMHVqb_nqs) = *(ckt->CKTstate0 + here->HSMHVqb_nqs);
}
}
return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqb));
return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqg));
return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqd));
@@ -2269,6 +2324,8 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqfd));
return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqfs));
return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqdE));
if (flg_nqs) {
return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqi_nqs));
return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSMHVqb_nqs));
@@ -2287,6 +2344,8 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
*(ckt->CKTstate1 + here->HSMHVcqbd) = *(ckt->CKTstate0 + here->HSMHVcqbd);
*(ckt->CKTstate1 + here->HSMHVcqfd) = *(ckt->CKTstate0 + here->HSMHVcqfd);
*(ckt->CKTstate1 + here->HSMHVcqfs) = *(ckt->CKTstate0 + here->HSMHVcqfs);
*(ckt->CKTstate1 + here->HSMHVcqdE) = *(ckt->CKTstate0 + here->HSMHVcqdE);
if (flg_nqs) {
*(ckt->CKTstate1 + here->HSMHVdotqi_nqs) = *(ckt->CKTstate0 + here->HSMHVdotqi_nqs);
*(ckt->CKTstate1 + here->HSMHVdotqb_nqs) = *(ckt->CKTstate0 + here->HSMHVdotqb_nqs);
@@ -2303,6 +2362,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
cq_sP = - *(ckt->CKTstate0 + here->HSMHVcqg)
- *(ckt->CKTstate0 + here->HSMHVcqb)
- *(ckt->CKTstate0 + here->HSMHVcqd);
cq_dE = *(ckt->CKTstate0 + here->HSMHVcqdE);
cq_db = *(ckt->CKTstate0 + here->HSMHVcqbd);
cq_sb = *(ckt->CKTstate0 + here->HSMHVcqbs);
cq_g = 0.0 ;
@@ -2340,10 +2400,20 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
cq_t += ag0*Cth *deldeltemp ;
cq_d += ag0*dQfd_dT*deldeltemp ;
cq_s += ag0*dQfs_dT*deldeltemp ;
cq_gE += ag0*dQgext_dT*deldeltemp ;
cq_dE += ag0*dQdext_dT*deldeltemp ;
cq_bE += ag0*dQbext_dT*deldeltemp ;
cq_sE = - ( cq_gE + cq_dE + cq_bE );
}
if (delvgse || delvdse || delvbse) {
cq_d += ag0*(dQfd_dVgse*delvgse + dQfd_dVdse*delvdse + dQfd_dVbse*delvbse) ;
cq_s += ag0*(dQfs_dVgse*delvgse + dQfs_dVdse*delvdse + dQfs_dVbse*delvbse) ;
cq_gE += ag0*(dQgext_dVgse*delvgse + dQgext_dVdse*delvdse + dQgext_dVbse*delvbse) ;
cq_dE += ag0*(dQdext_dVgse*delvgse + dQdext_dVdse*delvdse + dQdext_dVbse*delvbse) ;
cq_bE += ag0*(dQbext_dVgse*delvgse + dQbext_dVdse*delvdse + dQbext_dVbse*delvbse) ;
cq_sE = - ( cq_gE + cq_dE + cq_bE );
}
if (flg_nqs) {
@@ -2369,13 +2439,13 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
/* Assemble total node currents (type-handling shifted to stamping) */
cur_d = i_d + cq_d - cq_db;
cur_d = i_d + cq_d - cq_db + cq_dE ;
cur_dP = i_dP + cq_dP ;
cur_g = i_g + cq_g ;
cur_gP = i_gP + cq_gP - cq_d - cq_s ;
cur_s = i_s + cq_s - cq_sb;
cur_gP = i_gP + cq_gP - cq_d - cq_s + cq_gE ;
cur_s = i_s + cq_s - cq_sb + cq_sE ;
cur_sP = i_sP + cq_sP;
cur_bP = i_bP + cq_bP;
cur_bP = i_bP + cq_bP + cq_bE ;
cur_b = i_b + cq_b;
cur_db = i_db + cq_db;
cur_sb = i_sb + cq_sb;
@@ -2413,6 +2483,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
*(here->HSMHVDdpPtr) += ydc_d[dNodePrime] + ag0*ydyn_d[dNodePrime];
*(here->HSMHVDgpPtr) += ydc_d[gNodePrime] + ag0*ydyn_d[gNodePrime];
*(here->HSMHVDsPtr) += ydc_d[sNode] + ag0*ydyn_d[sNode];
*(here->HSMHVDspPtr) += ydc_d[sNodePrime] + ag0*ydyn_d[sNodePrime];
*(here->HSMHVDbpPtr) += ydc_d[bNodePrime] + ag0*ydyn_d[bNodePrime];
*(here->HSMHVDdbPtr) += ydc_d[dbNode] + ag0*ydyn_d[dbNode];
if (flg_subNode > 0) {
@@ -2464,8 +2535,9 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
/*source*/
*(here->HSMHVSdPtr) += ydc_s[dNode] + ag0*ydyn_s[dNode];
*(here->HSMHVSgpPtr) += ydc_s[gNodePrime] + ag0*ydyn_s[gNodePrime];
*(here->HSMHVSsPtr) += ydc_s[sNode] + ag0*ydyn_s[sNode];
*(here->HSMHVSdpPtr) += ydc_s[dNodePrime] + ag0*ydyn_s[dNodePrime];
*(here->HSMHVSgpPtr) += ydc_s[gNodePrime] + ag0*ydyn_s[gNodePrime];
*(here->HSMHVSspPtr) += ydc_s[sNodePrime] + ag0*ydyn_s[sNodePrime];
*(here->HSMHVSbpPtr) += ydc_s[bNodePrime] + ag0*ydyn_s[bNodePrime];
*(here->HSMHVSsbPtr) += ydc_s[sbNode] + ag0*ydyn_s[sbNode];
@@ -2496,11 +2568,11 @@ line755: /* standard entry if HSMHVevaluate is bypassed */
}
/*bulk prime*/
*(here->HSMHVBPdPtr) += ydc_bP[dNode]; /* ydc_bP[dNode] + ag0*ydyn_bP[dNodePrime] */
*(here->HSMHVBPdPtr) += ydc_bP[dNode] + ag0*ydyn_bP[dNode];
*(here->HSMHVBPdpPtr) += ydc_bP[dNodePrime] + ag0*ydyn_bP[dNodePrime];
*(here->HSMHVBPgpPtr) += ydc_bP[gNodePrime] + ag0*ydyn_bP[gNodePrime];
*(here->HSMHVBPsPtr) += ydc_bP[sNode] + ag0*ydyn_bP[sNode];
*(here->HSMHVBPspPtr) += ydc_bP[sNodePrime] + ag0*ydyn_bP[sNodePrime];
*(here->HSMHVBPsPtr) += ydc_bP[sNode] + ag0*ydyn_bP[sNode];
*(here->HSMHVBPbpPtr) += ydc_bP[bNodePrime] + ag0*ydyn_bP[bNodePrime];
*(here->HSMHVBPbPtr) += ydc_bP[bNode] + ag0*ydyn_bP[bNode];
*(here->HSMHVBPdbPtr) += ydc_bP[dbNode] + ag0*ydyn_bP[dbNode];
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvld_info_eval.h
DATE : 2011.6.29
DATE : 2012.4.6
recent changes: - 2009.01.09 some bugfixes
+4 -4
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvmask.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
+4 -4
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvmdel.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
+4 -5
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvmpar.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
@@ -16,7 +16,6 @@
***********************************************************************/
#include "ngspice/ngspice.h"
#include "hsmhvdef.h"
#include "ngspice/ifsim.h"
#include "ngspice/sperror.h"
+23 -21
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvnoi.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
@@ -18,7 +18,6 @@
#include "ngspice/ngspice.h"
#include "hsmhvdef.h"
#include "ngspice/cktdefs.h"
/* #include "fteconst.h" */
#include "ngspice/iferrmsg.h"
#include "ngspice/noisedef.h"
#include "ngspice/suffix.h"
@@ -35,6 +34,9 @@
* all of the MOSFET's is summed with the variable "OnDens".
*/
extern void NevalSrc();
extern double Nintegrate();
int HSMHVnoise (
int mode, int operation,
GENmodel *inModel,
@@ -42,8 +44,6 @@ int HSMHVnoise (
register Ndata *data,
double *OnDens)
{
NOISEAN *job = (NOISEAN *) ckt->CKTcurJob;
register HSMHVmodel *model = (HSMHVmodel *)inModel;
register HSMHVinstance *here;
char name[N_MXVLNTH];
@@ -76,13 +76,15 @@ int HSMHVnoise (
/* see if we have to to produce a summary report */
/* if so, name all the noise generators */
if (job->NStpsSm != 0) {
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) {
switch (mode) {
case N_DENS:
for ( i = 0; i < HSMHVNSRCS; i++ ) {
(void) sprintf(name, "onoise.%s%s",
here->HSMHVname, HSMHVnNames[i]);
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
(char *)here->HSMHVname, HSMHVnNames[i]);
data->namelist =
(IFuid *) trealloc((char *) data->namelist,
(data->numPlots + 1) * sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid))
@@ -93,8 +95,10 @@ int HSMHVnoise (
case INT_NOIZ:
for ( i = 0; i < HSMHVNSRCS; i++ ) {
(void) sprintf(name, "onoise_total.%s%s",
here->HSMHVname, HSMHVnNames[i]);
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
(char *)here->HSMHVname, HSMHVnNames[i]);
data->namelist =
(IFuid *) trealloc((char *) data->namelist,
(data->numPlots + 1) * sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid))
@@ -102,8 +106,10 @@ int HSMHVnoise (
(IFuid) NULL, name, UID_OTHER, NULL);
(void) sprintf(name, "inoise_total.%s%s",
here->HSMHVname, HSMHVnNames[i]);
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
(char *)here->HSMHVname, HSMHVnNames[i]);
data->namelist =
(IFuid *) trealloc((char *) data->namelist,
(data->numPlots + 1) * sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid))
@@ -204,7 +210,7 @@ int HSMHVnoise (
/* clear out our integration variables
if it's the first pass
*/
if (data->freq == job->NstartFreq) {
if (data->freq == ((NOISEAN*) ckt->CKTcurJob)->NstartFreq) {
for (i = 0; i < HSMHVNSRCS; i++) {
here->HSMHVnVar[OUTNOIZ][i] = 0.0;
here->HSMHVnVar[INNOIZ][i] = 0.0;
@@ -228,7 +234,7 @@ int HSMHVnoise (
here->HSMHVnVar[LNLSTDENS][i] = lnNdens[i];
data->outNoiz += tempOnoise;
data->inNoise += tempInoise;
if ( job->NStpsSm != 0 ) {
if ( ((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0 ) {
here->HSMHVnVar[OUTNOIZ][i] += tempOnoise;
here->HSMHVnVar[OUTNOIZ][HSMHVTOTNOIZ] += tempOnoise;
here->HSMHVnVar[INNOIZ][i] += tempInoise;
@@ -246,7 +252,7 @@ int HSMHVnoise (
break;
case INT_NOIZ:
/* already calculated, just output */
if ( job->NStpsSm != 0 ) {
if ( ((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0 ) {
for ( i = 0; i < HSMHVNSRCS; i++ ) {
data->outpVector[data->outNumber++] = here->HSMHVnVar[OUTNOIZ][i];
data->outpVector[data->outNumber++] = here->HSMHVnVar[INNOIZ][i];
@@ -268,7 +274,3 @@ int HSMHVnoise (
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <float.h>
+6 -4
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvpar.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
@@ -28,7 +28,9 @@ int HSMHVparam(
IFvalue *select)
{
HSMHVinstance *here = (HSMHVinstance*)inst;
NG_IGNORE(select);
switch (param) {
case HSMHV_COSELFHEAT:
here->HSMHV_coselfheat = value->iValue;
+4 -5
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvpzld.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
@@ -29,7 +29,6 @@ int HSMHVpzLoad(
{
register HSMHVmodel *model = (HSMHVmodel*)inModel;
register HSMHVinstance *here;
int flg_nqs =0 ;
NG_IGNORE(ckt);
+62 -52
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvset.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
@@ -35,7 +35,7 @@
#define RANGECHECK(param, min, max, pname) \
if ( (param) < (min) || (param) > (max) ) { \
printf("warning(HiSIMHV): The model/instance parameter %s (= %e) must be in the range [%e , %e].\n", \
(pname), (param), (double) (min), (double) (max) ); \
(pname), (param), (double) (min), (double) (max) ); \
}
#define MINCHECK(param, min, pname) \
if ( (param) < (min) ) { \
@@ -74,13 +74,13 @@ int HSMHVsetup(
model->HSMHV_noise = 1;
if ( !model->HSMHV_version_Given) {
model->HSMHV_version = "1.22" ;
printf(" 1.22 is selected for VERSION. (default) \n");
model->HSMHV_version = "1.23" ;
printf(" 1.23 is selected for VERSION. (default) \n");
} else {
if (strcmp(model->HSMHV_version,"1.22") != 0 ) {
model->HSMHV_version = "1.22" ;
printf(" 1.22 is only available for VERSION. \n");
printf(" 1.22 is selected for VERSION. (default) \n");
if (strcmp(model->HSMHV_version,"1.23") != 0 ) {
model->HSMHV_version = "1.23" ;
printf(" 1.23 is only available for VERSION. \n");
printf(" 1.23 is selected for VERSION. (default) \n");
} else {
printf(" %s is selected for VERSION \n", model->HSMHV_version);
}
@@ -122,7 +122,7 @@ int HSMHVsetup(
if ( !model->HSMHV_bgtmp2_Given ) model->HSMHV_bgtmp2 = 1.0e-7 ;
if ( !model->HSMHV_eg0_Given ) model->HSMHV_eg0 = 1.1785e0 ;
if ( !model->HSMHV_tox_Given ) model->HSMHV_tox = 30e-9 ;
if ( !model->HSMHV_xld_Given ) model->HSMHV_xld = 30e-9 ;
if ( !model->HSMHV_xld_Given ) model->HSMHV_xld = 0.0 ;
if ( !model->HSMHV_lovers_Given ) model->HSMHV_lovers = 30e-9 ;
if ( model->HSMHV_lover_Given ) model->HSMHV_lovers = model->HSMHV_lover ;
if ( !model->HSMHV_rdov11_Given ) model->HSMHV_rdov11 = 0.0 ;
@@ -139,7 +139,7 @@ int HSMHVsetup(
if ( !model->HSMHV_ldrift2s_Given ) model->HSMHV_ldrift2s = 1.0e-6 ;
if ( !model->HSMHV_subld1_Given ) model->HSMHV_subld1 = 0.0 ;
if ( !model->HSMHV_subld2_Given ) model->HSMHV_subld2 = 0.0 ;
if ( !model->HSMHV_ddltmax_Given ) model->HSMHV_ddltmax = 1.0 ; /* Vdseff */
if ( !model->HSMHV_ddltmax_Given ) model->HSMHV_ddltmax = 10.0 ; /* Vdseff */
if ( !model->HSMHV_ddltslp_Given ) model->HSMHV_ddltslp = 0.0 ; /* Vdseff */
if ( !model->HSMHV_ddltict_Given ) model->HSMHV_ddltict = 10.0 ; /* Vdseff */
if ( !model->HSMHV_vfbover_Given ) model->HSMHV_vfbover = -0.5 ;
@@ -173,19 +173,19 @@ int HSMHVsetup(
if ( !model->HSMHV_rd_Given ) model->HSMHV_rd = 5.0e-3 ;
if ( !model->HSMHV_vfbc_Given ) model->HSMHV_vfbc = -1.0 ;
if ( !model->HSMHV_vbi_Given ) model->HSMHV_vbi = 1.1 ;
if ( !model->HSMHV_nsubc_Given ) model->HSMHV_nsubc = 1.0e17 ;
if ( !model->HSMHV_nsubc_Given ) model->HSMHV_nsubc = 5.0e17 ;
if ( !model->HSMHV_parl2_Given ) model->HSMHV_parl2 = 10.0e-9 ;
if ( !model->HSMHV_lp_Given ) model->HSMHV_lp = 0.0 ;
if ( !model->HSMHV_nsubp_Given ) model->HSMHV_nsubp = 1.0e17 ;
if ( !model->HSMHV_nsubp_Given ) model->HSMHV_nsubp = 1.0e18 ;
if ( !model->HSMHV_nsubp0_Given ) model->HSMHV_nsubp0 = 0.0 ;
if ( !model->HSMHV_nsubwp_Given ) model->HSMHV_nsubwp = 1.0 ;
if ( !model->HSMHV_scp1_Given ) model->HSMHV_scp1 = 1.0 ;
if ( !model->HSMHV_scp2_Given ) model->HSMHV_scp2 = 0.1 ;
if ( !model->HSMHV_scp2_Given ) model->HSMHV_scp2 = 0.0 ;
if ( !model->HSMHV_scp3_Given ) model->HSMHV_scp3 = 0.0 ;
if ( !model->HSMHV_sc1_Given ) model->HSMHV_sc1 = 1.0 ;
if ( !model->HSMHV_sc2_Given ) model->HSMHV_sc2 = 1.0 ;
if ( !model->HSMHV_sc2_Given ) model->HSMHV_sc2 = 0.0 ;
if ( !model->HSMHV_sc3_Given ) model->HSMHV_sc3 = 0.0 ;
if ( !model->HSMHV_sc4_Given ) model->HSMHV_sc4 = 0.0 ;
if ( !model->HSMHV_pgd1_Given ) model->HSMHV_pgd1 = 0.0 ;
@@ -222,15 +222,15 @@ int HSMHVsetup(
if ( !model->HSMHV_mueswp_Given ) model->HSMHV_mueswp = 1.0 ;
if ( !model->HSMHV_mueslp_Given ) model->HSMHV_mueslp = 1.0 ;
if ( !model->HSMHV_muetmp_Given ) model->HSMHV_muetmp = 1.7 ;
if ( !model->HSMHV_muetmp_Given ) model->HSMHV_muetmp = 1.5 ;
if ( !model->HSMHV_bb_Given ) {
if (model->HSMHV_type == NMOS) model->HSMHV_bb = 2.0 ;
else model->HSMHV_bb = 1.0 ;
}
if ( !model->HSMHV_sub1_Given ) model->HSMHV_sub1 = 50e-3 ;
if ( !model->HSMHV_sub2_Given ) model->HSMHV_sub2 = 100e0 ;
if ( !model->HSMHV_sub1_Given ) model->HSMHV_sub1 = 10.0 ;
if ( !model->HSMHV_sub2_Given ) model->HSMHV_sub2 = 25.0 ;
if ( !model->HSMHV_svgs_Given ) model->HSMHV_svgs = 0.8e0 ;
if ( !model->HSMHV_svbs_Given ) model->HSMHV_svbs = 0.5e0 ;
if ( !model->HSMHV_svbsl_Given ) model->HSMHV_svbsl = 0e0 ;
@@ -300,7 +300,7 @@ int HSMHVsetup(
if ( !model->HSMHV_cvbk_Given ) model->HSMHV_cvbk = 0.0e0 ;
if ( !model->HSMHV_divx_Given ) model->HSMHV_divx = 0.0e0 ;
if ( !model->HSMHV_clm1_Given ) model->HSMHV_clm1 = 50e-3 ;
if ( !model->HSMHV_clm1_Given ) model->HSMHV_clm1 = 0.7 ;
if ( !model->HSMHV_clm2_Given ) model->HSMHV_clm2 = 2.0 ;
if ( !model->HSMHV_clm3_Given ) model->HSMHV_clm3 = 1.0 ;
if ( !model->HSMHV_clm5_Given ) model->HSMHV_clm5 = 1.0 ;
@@ -311,7 +311,7 @@ int HSMHVsetup(
if ( !model->HSMHV_nsubcw_Given ) model->HSMHV_nsubcw = 0.0 ;
if ( !model->HSMHV_nsubcwp_Given ) model->HSMHV_nsubcwp = 1.0 ;
if ( !model->HSMHV_qme1_Given ) model->HSMHV_qme1 = 0.0 ;
if ( !model->HSMHV_qme2_Given ) model->HSMHV_qme2 = 1.0 ;
if ( !model->HSMHV_qme2_Given ) model->HSMHV_qme2 = 0.0 ;
if ( !model->HSMHV_qme3_Given ) model->HSMHV_qme3 = 0.0 ;
if ( !model->HSMHV_vovers_Given ) model->HSMHV_vovers = 0.0 ;
@@ -320,7 +320,7 @@ int HSMHVsetup(
if ( !model->HSMHV_gidl1_Given ) model->HSMHV_gidl1 = 2e0 ;
if ( !model->HSMHV_gidl2_Given ) model->HSMHV_gidl2 = 3e7 ;
if ( !model->HSMHV_gidl3_Given ) model->HSMHV_gidl3 = 0.9e0 ;
if ( !model->HSMHV_gidl4_Given ) model->HSMHV_gidl4 = 0.9 ;
if ( !model->HSMHV_gidl4_Given ) model->HSMHV_gidl4 = 0.0 ;
if ( !model->HSMHV_gidl5_Given ) model->HSMHV_gidl5 = 0.2e0 ;
if ( !model->HSMHV_gleak1_Given ) model->HSMHV_gleak1 = 50e0 ;
@@ -360,8 +360,8 @@ int HSMHVsetup(
if ( !model->HSMHV_dly3_Given ) model->HSMHV_dly3 = 0.8e-6 ;
if ( !model->HSMHV_tnom_Given ) model->HSMHV_tnom = 27.0 ; /* [C] */
if ( !model->HSMHV_ovslp_Given ) model->HSMHV_ovslp = 2.0e-8 ;
if ( !model->HSMHV_ovmag_Given ) model->HSMHV_ovmag = 500.0 ;
if ( !model->HSMHV_ovslp_Given ) model->HSMHV_ovslp = 2.1e-7 ;
if ( !model->HSMHV_ovmag_Given ) model->HSMHV_ovmag = 0.6 ;
if ( !model->HSMHV_gbmin_Given ) model->HSMHV_gbmin = 1.0e-12; /* in mho */
if ( !model->HSMHV_rbpb_Given ) model->HSMHV_rbpb = 50.0e0 ;
@@ -848,12 +848,13 @@ int HSMHVsetup(
* ( here->HSMHV_ldrift2 * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ;
Rd = model->HSMHV_rsh * here->HSMHV_nrd * here->HSMHV_nf + (model->HSMHV_rd + model->HSMHV_rdvd) * T2 ;
if ( (model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3)
&& Rd > 0.0
&& here->HSMHVdNodePrime <= 0) {
&& Rd > 0.0 ) {
if(here->HSMHVdNodePrime <= 0) {
model->HSMHV_rd = ( model->HSMHV_rd == 0.0 ) ? 1e-50 : model->HSMHV_rd ;
error = CKTmkVolt(ckt, &tmp, here->HSMHVname, "drain");
if (error) return(error);
here->HSMHVdNodePrime = tmp->number;
}
} else {
here->HSMHVdNodePrime = here->HSMHVdNode;
}
@@ -865,23 +866,24 @@ int HSMHVsetup(
* ( here->HSMHV_ldrift2s * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ;
Rs = model->HSMHV_rsh * here->HSMHV_nrs * here->HSMHV_nf + model->HSMHV_rs * T2 ;
if ( (model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3)
&& Rs > 0.0
&& here->HSMHVsNodePrime == 0) {
&& Rs > 0.0 ) {
if(here->HSMHVsNodePrime == 0) {
error = CKTmkVolt(ckt, &tmp, here->HSMHVname, "source");
if (error) return(error);
here->HSMHVsNodePrime = tmp->number;
}
} else {
here->HSMHVsNodePrime = here->HSMHVsNode;
}
here->HSMHVsourceConductance = 0.0 ; /* initialized for hsmhvnoi.c */
/* printf("HSMHV_set: corsrd=%d dNode=%d dNodePrime=%d sNode=%d sNodePrime=%d\n",model->HSMHV_corsrd,
here->HSMHVdNode,here->HSMHVdNodePrime,here->HSMHVsNode,here->HSMHVsNodePrime); */
/* process gate resistance */
if ((here->HSMHV_corg == 1 && model->HSMHV_rshg > 0.0) && here->HSMHVgNodePrime == 0) {
if ( (here->HSMHV_corg == 1 && model->HSMHV_rshg > 0.0) ) {
if(here->HSMHVgNodePrime == 0) {
error = CKTmkVolt(ckt, &tmp, here->HSMHVname, "gate");
if (error) return(error);
here->HSMHVgNodePrime = tmp->number;
}
} else {
here->HSMHVgNodePrime = here->HSMHVgNode;
}
@@ -945,8 +947,8 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
TSTALLOC(HSMHVGPbpPtr, HSMHVgNodePrime, HSMHVbNodePrime)
TSTALLOC(HSMHVBPdPtr, HSMHVbNodePrime, HSMHVdNode)
TSTALLOC(HSMHVBPdpPtr, HSMHVbNodePrime, HSMHVdNodePrime)
TSTALLOC(HSMHVBPsPtr, HSMHVbNodePrime, HSMHVsNode)
TSTALLOC(HSMHVBPdpPtr, HSMHVbNodePrime, HSMHVdNodePrime)
TSTALLOC(HSMHVBPspPtr, HSMHVbNodePrime, HSMHVsNodePrime)
TSTALLOC(HSMHVBPgpPtr, HSMHVbNodePrime, HSMHVgNodePrime)
TSTALLOC(HSMHVBPbpPtr, HSMHVbNodePrime, HSMHVbNodePrime)
@@ -998,11 +1000,13 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
TSTALLOC(HSMHVDgpPtr, HSMHVdNode, HSMHVgNodePrime);
TSTALLOC(HSMHVDsPtr, HSMHVdNode, HSMHVsNode);
TSTALLOC(HSMHVDbpPtr, HSMHVdNode, HSMHVbNodePrime);
TSTALLOC(HSMHVDspPtr, HSMHVdNode, HSMHVsNodePrime);
TSTALLOC(HSMHVDPsPtr, HSMHVdNodePrime, HSMHVsNode);
TSTALLOC(HSMHVSgpPtr, HSMHVsNode, HSMHVgNodePrime);
TSTALLOC(HSMHVSdPtr, HSMHVsNode, HSMHVdNode);
TSTALLOC(HSMHVSbpPtr, HSMHVsNode, HSMHVbNodePrime);
TSTALLOC(HSMHVSdpPtr, HSMHVsNode, HSMHVdNodePrime);
TSTALLOC(HSMHVSPdPtr, HSMHVsNodePrime, HSMHVdNode);
TSTALLOC(HSMHVGPdPtr, HSMHVgNodePrime, HSMHVdNode);
@@ -1063,7 +1067,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
* Range check of instance parameters
*-----------------*/
RANGECHECK(here->HSMHV_l, model->HSMHV_lmin, model->HSMHV_lmax, "L") ;
RANGECHECK(here->HSMHV_w, model->HSMHV_wmin, model->HSMHV_wmax, "W") ;
RANGECHECK(here->HSMHV_w/here->HSMHV_nf, model->HSMHV_wmin, model->HSMHV_wmax, "W/NF") ;
/* binning calculation */
pParam = &here->pParam ;
@@ -1172,32 +1176,32 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
* Range check of model parameters
*-----------------*/
RANGECHECK(pParam->HSMHV_vmax, 1.0e6, 20.0e6, "VMAX") ;
RANGECHECK(pParam->HSMHV_bgtmp1, 50.0e-6, 100.0e-6, "BGTMP1") ;
RANGECHECK(pParam->HSMHV_bgtmp1, 50.0e-6, 1.0e-3, "BGTMP1") ;
RANGECHECK(pParam->HSMHV_bgtmp2, -1.0e-6, 1.0e-6, "BGTMP2") ;
RANGECHECK(pParam->HSMHV_eg0, 1.0, 1.3, "EG0") ;
RANGECHECK(pParam->HSMHV_vfbover, -1.0, 1.0, "VFBOVER") ;
RANGECHECK(pParam->HSMHV_vfbc, -1.2, -0.8, "VFBC") ;
RANGECHECK(pParam->HSMHV_nsubc, 1.0e16, 1.0e19, "NSUBC") ;
RANGECHECK(pParam->HSMHV_nsubp, 1.0e16, 1.0e19, "NSUBP") ;
RANGECHECK(pParam->HSMHV_scp1, 0.0, 50.0, "SCP1") ;
RANGECHECK(pParam->HSMHV_scp2, 0.0, 50.0, "SCP2") ;
RANGECHECK(pParam->HSMHV_scp3, 0.0, 1.0e-3, "SCP3") ;
RANGECHECK(pParam->HSMHV_sc1, 0.0, 200.0, "SC1") ;
RANGECHECK(pParam->HSMHV_sc2, 0.0, 50.0, "SC2") ;
RANGECHECK(pParam->HSMHV_sc3, 0.0, 1.0e-3, "SC3") ;
RANGECHECK(pParam->HSMHV_scp1, 0.0, 20.0, "SCP1") ;
RANGECHECK(pParam->HSMHV_scp2, 0.0, 2.0, "SCP2") ;
RANGECHECK(pParam->HSMHV_scp3, 0.0, 200e-9, "SCP3") ;
RANGECHECK(pParam->HSMHV_sc1, 0.0, 20.0, "SC1") ;
RANGECHECK(pParam->HSMHV_sc2, 0.0, 2.0, "SC2") ;
RANGECHECK(pParam->HSMHV_sc3, 0.0, 200e-9, "SC3") ;
RANGECHECK(pParam->HSMHV_pgd1, 0.0, 50.0e-3, "PGD1") ;
RANGECHECK(pParam->HSMHV_pgd3, 0.0, 1.0, "PGD3") ;
RANGECHECK(pParam->HSMHV_pgd3, 0.0, 1.2, "PGD3") ;
RANGECHECK(pParam->HSMHV_ndep, 0.0, 1.0, "NDEP") ;
RANGECHECK(pParam->HSMHV_ninv, 0.0, 1.0, "NINV") ;
RANGECHECK(pParam->HSMHV_muecb0, 100.0, 100.0e3, "MUECB0") ;
RANGECHECK(pParam->HSMHV_muecb1, 15.0, 10.0e3, "MUECB1") ;
RANGECHECK(pParam->HSMHV_muecb1, 5.0, 10.0e3, "MUECB1") ;
RANGECHECK(pParam->HSMHV_mueph1, 2.0e3, 30.0e3, "MUEPH1") ;
RANGECHECK(pParam->HSMHV_vtmp, -2.0, 1.0, "VTMP") ;
RANGECHECK(pParam->HSMHV_muesr1, 1.0e14, 1.0e16, "MUESR1") ;
RANGECHECK(pParam->HSMHV_muetmp, 0.5, 2.0, "MUETMP") ;
RANGECHECK(pParam->HSMHV_clm1, 0.01, 1.0, "CLM1") ;
RANGECHECK(pParam->HSMHV_clm2, 1.0, 2.0, "CLM2") ;
RANGECHECK(pParam->HSMHV_clm3, 1.0, 5.0, "CLM3") ;
RANGECHECK(pParam->HSMHV_clm2, 1.0, 4.0, "CLM2") ;
RANGECHECK(pParam->HSMHV_clm3, 0.5, 5.0, "CLM3") ;
RANGECHECK(pParam->HSMHV_wfc, -5.0e-15, 1.0e-6, "WFC") ;
RANGECHECK(pParam->HSMHV_cgso, 0.0, 100e-9 * 100*C_VAC*model->HSMHV_kappa/model->HSMHV_tox*C_m2cm, "CGSO") ;
RANGECHECK(pParam->HSMHV_cgdo, 0.0, 100e-9 * 100*C_VAC*model->HSMHV_kappa/model->HSMHV_tox*C_m2cm, "CGDO") ;
@@ -1223,7 +1227,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
MINCHECK( pParam->HSMHV_rdvg11, 0.0, "RDVG11") ;
RANGECHECK(pParam->HSMHV_rs, 0.0, 10.0e-3, "RS") ;
RANGECHECK(pParam->HSMHV_rth0, 0.0, 10.0, "RTH0") ;
RANGECHECK(pParam->HSMHV_vover, 0.0, 1.0, "VOVER") ;
RANGECHECK(pParam->HSMHV_vover, 0.0, 4.0, "VOVER") ;
/*-----------------------------------------------------------*
* Change unit into MKS for instance parameters.
@@ -1296,14 +1300,20 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
RANGECHECK(model->HSMHV_muesr0, 1.8, 2.2, "MUESR0") ;
RANGECHECK(model->HSMHV_lpext, 1.0e-50, 10.0e-6, "LPEXT") ;
RANGECHECK(model->HSMHV_scp21, 0.0, 5.0, "SCP21") ;
RANGECHECK(model->HSMHV_scp22, 0.0, 50.0e-3, "SCP22") ;
RANGECHECK(model->HSMHV_bs1, 0.0, 100.0e-3, "BS1") ;
RANGECHECK(model->HSMHV_scp22, 0.0, 0.0, "SCP22") ;
RANGECHECK(model->HSMHV_bs1, 0.0, 50.0e-3, "BS1") ;
RANGECHECK(model->HSMHV_bs2, 0.5, 1.0, "BS2") ;
RANGECHECK(model->HSMHV_clm5, 0.0, 5.0, "CLM5") ;
RANGECHECK(model->HSMHV_clm6, 0.0, 5.0, "CLM6") ;
RANGECHECK(model->HSMHV_clm5, 0.0, 2.0, "CLM5") ;
RANGECHECK(model->HSMHV_clm6, 0.0, 20.0, "CLM6") ;
MINCHECK (model->HSMHV_ninvd, 0.0, "NINVD") ;
MINCHECK (model->HSMHV_ninvdw, 0.0, "NINVDW") ;
MINCHECK (model->HSMHV_ninvdwp, 0.0, "NINVDWP") ;
MINCHECK (model->HSMHV_ninvdt1, 0.0, "NINVDT1") ;
MINCHECK (model->HSMHV_ninvdt2, 0.0, "NINVDT2") ;
RANGECHECK(model->HSMHV_sub2l, 0.0, 1.0, "SUB2L") ;
RANGECHECK(model->HSMHV_voverp, 0.0, 2.0, "VOVERP") ;
RANGECHECK(model->HSMHV_qme1, 0.0, 300.0e-9, "QME1") ;
RANGECHECK(model->HSMHV_qme2, 0.0, 3.0, "QME2") ;
RANGECHECK(model->HSMHV_qme2, 0.0, 0.0, "QME2") ;
RANGECHECK(model->HSMHV_qme3, 0.0,800.0e-12, "QME3") ;
RANGECHECK(model->HSMHV_glpart1, 0.0, 1.0, "GLPART1") ;
RANGECHECK(model->HSMHV_tnom, 22.0, 32.0, "TNOM") ;
@@ -1327,13 +1337,13 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
RANGECHECK(model->HSMHV_rth0w, -100, 100, "RTH0W") ;
RANGECHECK(model->HSMHV_rth0wp, -10, 10, "RTH0WP") ;
RANGECHECK(model->HSMHV_rth0nf, -5.0, 5.0, "RTH0NF") ;
RANGECHECK(model->HSMHV_powrat, 0.0, 1.0, "POWRAT") ;
RANGECHECK(model->HSMHV_prattemp1, -1.0, 1.0, "PRATTEMP1") ;
RANGECHECK(model->HSMHV_prattemp2, -1.0, 1.0, "PRATTEMP2") ;
MINCHECK( model->HSMHV_xldld, 0.0, "XLDLD") ;
MINCHECK( model->HSMHV_loverld, 0.0, "LOVERLD") ;
MINCHECK( model->HSMHV_lovers, 0.0, "LOVERS") ;
MINCHECK( model->HSMHV_lover, 0.0, "LOVER") ;
RANGECHECK(model->HSMHV_qovsm, 10e-3, 1.0, "QOVSM") ;
MINCHECK( model->HSMHV_ldrift1, 0.0, "LDRIFT1") ;
MINCHECK( model->HSMHV_ldrift1s, 0.0, "LDRIFT1S") ;
MINCHECK( model->HSMHV_ldrift2, 0.0, "LDRIFT2") ;
+36 -23
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvtemp.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
@@ -33,14 +33,18 @@
#define Fn_SU( y , x , xmax , delta , dx ) { \
TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
TMF2 = sqrt ( TMF1 * TMF1 + 4.0 * ( xmax ) * ( delta) ) ; \
TMF2 = 4.0 * ( xmax ) * ( delta ) ; \
TMF2 = TMF2 > 0.0 ? TMF2 : -( TMF2) ; \
TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
}
#define Fn_SL( y , x , xmin , delta , dx ) { \
TMF1 = ( x ) - ( xmin ) - ( delta ) ; \
TMF2 = sqrt ( TMF1 * TMF1 + 4.0 * ( xmin ) * ( delta ) ) ; \
TMF2 = 4.0 * ( xmin ) * ( delta ) ; \
TMF2 = TMF2 > 0.0 ? TMF2 : -( TMF2 ); \
TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \
}
@@ -75,6 +79,7 @@ int HSMHVtemp(
double TMF1 , TMF2 ;
const double small = 1.0e-50 ;
const double dlt_rd23 = 1.0e-6 / C_m2cm ;
const double large_arg = 80 ;
for ( ;model ;model = model->HSMHVnextModel ) {
@@ -146,18 +151,22 @@ int HSMHVtemp(
}
Npext = pParam->HSMHV_npext ;
here->HSMHV_mueph1 = pParam->HSMHV_mueph1 ;
here->HSMHV_nsubp = pParam->HSMHV_nsubp ;
here->HSMHV_nsubc = pParam->HSMHV_nsubc ;
/* DFM */
if ( model->HSMHV_codfm == 1 && here->HSMHV_nsubcdfm_Given ) {
RANGECHECK(hereMKS->HSMHV_nsubcdfm, 1.0e16, 1.0e19, "NSUBCDFM") ;
pParam->HSMHV_mueph1 *= model->HSMHV_mphdfm
* ( log(hereMKS->HSMHV_nsubcdfm) - log(pParam->HSMHV_nsubc) ) + 1.0 ;
pParam->HSMHV_nsubp += hereMKS->HSMHV_nsubcdfm - pParam->HSMHV_nsubc ;
Npext += hereMKS->HSMHV_nsubcdfm - pParam->HSMHV_nsubc ;
pParam->HSMHV_nsubc = hereMKS->HSMHV_nsubcdfm ;
here->HSMHV_mueph1 *= model->HSMHV_mphdfm
* ( log(hereMKS->HSMHV_nsubcdfm) - log(here->HSMHV_nsubc) ) + 1.0 ;
here->HSMHV_nsubp += hereMKS->HSMHV_nsubcdfm - here->HSMHV_nsubc ;
Npext += hereMKS->HSMHV_nsubcdfm - here->HSMHV_nsubc ;
here->HSMHV_nsubc = hereMKS->HSMHV_nsubcdfm ;
}
/* Phonon Scattering (temperature-independent part) */
mueph = pParam->HSMHV_mueph1
mueph = here->HSMHV_mueph1
* (1.0e0 + (model->HSMHV_muephw / pow( WG, model->HSMHV_muepwp)))
* (1.0e0 + (model->HSMHV_muephl / pow( LG, model->HSMHV_mueplp)))
* (1.0e0 + (model->HSMHV_muephs / pow( WL, model->HSMHV_muepsp)));
@@ -239,7 +248,7 @@ int HSMHVtemp(
/* Surface impurity profile */
/* Note: Sign Changed --> */
Nsubpp = pParam->HSMHV_nsubp
Nsubpp = here->HSMHV_nsubp
* (1.0e0 + (model->HSMHV_nsubp0 / pow (WG, model->HSMHV_nsubwp))) ;
/* <-- Note: Sign Changed */
@@ -252,21 +261,21 @@ int HSMHVtemp(
Nsubps = Nsubpp ;
}
pParam->HSMHV_nsubc *= 1.0e0 + ( model->HSMHV_nsubcw / pow ( WG, model->HSMHV_nsubcwp )) ;
here->HSMHV_nsubc *= 1.0e0 + ( model->HSMHV_nsubcw / pow ( WG, model->HSMHV_nsubcwp )) ;
if( Lgate > model->HSMHV_lp ){
Nsub = (pParam->HSMHV_nsubc * (Lgate - model->HSMHV_lp)
Nsub = (here->HSMHV_nsubc * (Lgate - model->HSMHV_lp)
+ Nsubps * model->HSMHV_lp) / Lgate ;
} else {
Nsub = Nsubps
+ (Nsubps - pParam->HSMHV_nsubc) * (model->HSMHV_lp - Lgate)
+ (Nsubps - here->HSMHV_nsubc) * (model->HSMHV_lp - Lgate)
/ model->HSMHV_lp ;
}
T3 = 0.5e0 * Lgate - model->HSMHV_lp ;
T1 = 1.0e0 / ( 1.0e0 / T3 + 1.0e0 / model->HSMHV_lpext ) ;
T2 = Fn_Max (0.0e0, T1) ;
here->HSMHV_nsub =
Nsub = Nsub + T2 * (Npext - pParam->HSMHV_nsubc) / Lgate ;
Nsub = Nsub + T2 * (Npext - here->HSMHV_nsubc) / Lgate ;
here->HSMHV_qnsub = q_Nsub = C_QE * Nsub ;
here->HSMHV_qnsub_esi = q_Nsub * C_ESI ;
here->HSMHV_2qnsub_esi = 2.0 * here->HSMHV_qnsub_esi ;
@@ -274,9 +283,9 @@ int HSMHVtemp(
/* Pocket Overlap (temperature-independent part) */
if ( Lgate <= 2.0e0 * model->HSMHV_lp ) {
Nsubb = 2.0e0 * Nsubps
- (Nsubps - pParam->HSMHV_nsubc) * Lgate
/ model->HSMHV_lp - pParam->HSMHV_nsubc ;
here->HSMHV_ptovr0 = log (Nsubb / pParam->HSMHV_nsubc) ;
- (Nsubps - here->HSMHV_nsubc) * Lgate
/ model->HSMHV_lp - here->HSMHV_nsubc ;
here->HSMHV_ptovr0 = log (Nsubb / here->HSMHV_nsubc) ;
/* here->HSMHV_ptovr0 will be divided by beta later. */
} else {
here->HSMHV_ptovr0 = 0.0e0 ;
@@ -294,7 +303,7 @@ int HSMHVtemp(
/* @300K, with pocket */
here->HSMHV_pb20 = 2.0e0 / C_b300 * log (Nsub / C_Nin0) ;
/* @300K, w/o pocket */
here->HSMHV_pb2c = 2.0e0 / C_b300 * log (pParam->HSMHV_nsubc / C_Nin0) ;
here->HSMHV_pb2c = 2.0e0 / C_b300 * log (here->HSMHV_nsubc / C_Nin0) ;
/* constant for Poly depletion */
@@ -327,13 +336,17 @@ int HSMHVtemp(
here->HSMHV_rdtemp0 = 1.0 + model->HSMHV_rds / pow( here->HSMHV_w * C_m2um * LG , model->HSMHV_rdsp ) ;
if( pParam->HSMHV_rdvd != 0.0 ){
T7 = ( 1.0 + model->HSMHV_rdvds / pow( here->HSMHV_w * C_m2um * LG , model->HSMHV_rdvdsp ) );
T6 = exp( - model->HSMHV_rdvdl * pow( LG , model->HSMHV_rdvdlp ) ) ;
T6 = ( - model->HSMHV_rdvdl * pow( LG , model->HSMHV_rdvdlp ) ) ;
if(T6 > large_arg) T6 = large_arg ;
T6 = exp( T6 ) ;
here->HSMHV_rdvdtemp0 = T6 * T7 ;
}
}
if( pParam->HSMHV_rd23 != 0.0 ){
T2 = ( 1.0 + model->HSMHV_rd23s / pow( here->HSMHV_w * C_m2um * LG , model->HSMHV_rd23sp ) );
T1 = exp( - model->HSMHV_rd23l * pow( LG , model->HSMHV_rd23lp ) ) ;
T1 = ( - model->HSMHV_rd23l * pow( LG , model->HSMHV_rd23lp ) ) ;
if(T1 > large_arg) T1 = large_arg ;
T1 = exp( T1 ) ;
T3 = pParam->HSMHV_rd23 * T2 * T1 ;
here->HSMHV_rd23 = 0.5 * ( T3 + sqrt ( T3 * T3 + 4.0 * dlt_rd23 * dlt_rd23 ) ) ;
} else {
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvtemp_eval.h
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &
@@ -145,7 +145,7 @@ Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ;
/* Depletion Width */
T1 = 2.0e0 * C_ESI / C_QE ;
here->HSMHV_wdpl = sqrt ( T1 / here->HSMHV_nsub ) ;
here->HSMHV_wdplp = sqrt( T1 / ( pParam->HSMHV_nsubp ) ) ;
here->HSMHV_wdplp = sqrt( T1 / ( here->HSMHV_nsubp ) ) ;
/* Coefficient of the F function for bulk charge */
here->HSMHV_cnst0 = sqrt ( 2.0 * C_ESI * C_QE * here->HSMHV_nsub / beta ) ;
+4 -4
View File
@@ -1,14 +1,14 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 2 )
Model Parameter VERSION : 1.22
( VERSION : 1 SUBVERSION : 2 REVISION : 3 )
Model Parameter VERSION : 1.23
FILE : hsmhvtrunc.c
DATE : 2011.6.29
DATE : 2012.4.6
released by
Hiroshima University &