mirror of
https://git.code.sf.net/p/ngspice/ngspice
synced 2026-08-22 13:57:32 +02:00
hisimhv update to version 1.2.3
This commit is contained in:
@@ -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 &
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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] ;
|
||||
|
||||
@@ -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 &
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 &
|
||||
|
||||
@@ -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 &
|
||||
|
||||
@@ -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 */
|
||||
|
||||
/*-----------------------------------------------------------*
|
||||
|
||||
@@ -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 &
|
||||
|
||||
@@ -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*);
|
||||
|
||||
@@ -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 &
|
||||
|
||||
@@ -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 &
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 &
|
||||
|
||||
@@ -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 &
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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") ;
|
||||
|
||||
@@ -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 ) ;
|
||||
|
||||
@@ -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 &
|
||||
|
||||
Reference in New Issue
Block a user