Browse Source

update hisim to version 2.7.0

pre-master-46
dwarning 14 years ago
parent
commit
79119b3372
  1. 6
      src/spicelib/devices/hisim2/hisim2.h
  2. 24
      src/spicelib/devices/hisim2/hsm2.c
  3. 6
      src/spicelib/devices/hisim2/hsm2acld.c
  4. 6
      src/spicelib/devices/hisim2/hsm2ask.c
  5. 6
      src/spicelib/devices/hisim2/hsm2cvtest.c
  6. 135
      src/spicelib/devices/hisim2/hsm2def.h
  7. 6
      src/spicelib/devices/hisim2/hsm2del.c
  8. 6
      src/spicelib/devices/hisim2/hsm2dest.c
  9. 929
      src/spicelib/devices/hisim2/hsm2eval.c
  10. 17
      src/spicelib/devices/hisim2/hsm2evalenv.h
  11. 6
      src/spicelib/devices/hisim2/hsm2ext.h
  12. 6
      src/spicelib/devices/hisim2/hsm2getic.c
  13. 4
      src/spicelib/devices/hisim2/hsm2init.c
  14. 14
      src/spicelib/devices/hisim2/hsm2itf.h
  15. 65
      src/spicelib/devices/hisim2/hsm2ld.c
  16. 60
      src/spicelib/devices/hisim2/hsm2mask.c
  17. 6
      src/spicelib/devices/hisim2/hsm2mdel.c
  18. 78
      src/spicelib/devices/hisim2/hsm2mpar.c
  19. 27
      src/spicelib/devices/hisim2/hsm2noi.c
  20. 6
      src/spicelib/devices/hisim2/hsm2par.c
  21. 6
      src/spicelib/devices/hisim2/hsm2pzld.c
  22. 335
      src/spicelib/devices/hisim2/hsm2set.c
  23. 450
      src/spicelib/devices/hisim2/hsm2temp.c
  24. 6
      src/spicelib/devices/hisim2/hsm2trunc.c

6
src/spicelib/devices/hisim2/hisim2.h

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hisim2.h FILE : hisim2.h
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &

24
src/spicelib/devices/hisim2/hsm2.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2.c FILE : hsm2.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &
@ -117,6 +119,7 @@ IFparm HSM2mPTable[] = { /* model parameters */
IOP("corecip", HSM2_MOD_CORECIP, IF_INTEGER, "capacitance reciprocity takes first priority"), IOP("corecip", HSM2_MOD_CORECIP, IF_INTEGER, "capacitance reciprocity takes first priority"),
IOP("coqy", HSM2_MOD_COQY, IF_INTEGER, "calculate lateral-field-induced charge/capacitance"), IOP("coqy", HSM2_MOD_COQY, IF_INTEGER, "calculate lateral-field-induced charge/capacitance"),
IOP("coqovsm", HSM2_MOD_COQOVSM, IF_INTEGER, "select smoothing method of Qover"), IOP("coqovsm", HSM2_MOD_COQOVSM, IF_INTEGER, "select smoothing method of Qover"),
IOP("coerrrep", HSM2_MOD_COERRREP, IF_INTEGER, "selector for error report"),
IOP("vmax", HSM2_MOD_VMAX, IF_REAL, "saturation velocity [cm/s"), IOP("vmax", HSM2_MOD_VMAX, IF_REAL, "saturation velocity [cm/s"),
IOP("bgtmp1", HSM2_MOD_BGTMP1, IF_REAL, "first order temp. coeff. for band gap [V/K]"), IOP("bgtmp1", HSM2_MOD_BGTMP1, IF_REAL, "first order temp. coeff. for band gap [V/K]"),
IOP("bgtmp2", HSM2_MOD_BGTMP2, IF_REAL, "second order temp. coeff. for band gap [V/K^2]"), IOP("bgtmp2", HSM2_MOD_BGTMP2, IF_REAL, "second order temp. coeff. for band gap [V/K^2]"),
@ -159,11 +162,14 @@ IFparm HSM2mPTable[] = { /* model parameters */
IOP("vfbc", HSM2_MOD_VFBC, IF_REAL, "constant part of Vfb [V]"), IOP("vfbc", HSM2_MOD_VFBC, IF_REAL, "constant part of Vfb [V]"),
IOP("vbi", HSM2_MOD_VBI, IF_REAL, "built-in potential [V]"), IOP("vbi", HSM2_MOD_VBI, IF_REAL, "built-in potential [V]"),
IOP("nsubc", HSM2_MOD_NSUBC, IF_REAL, "constant part of Nsub [1/cm^3]"), IOP("nsubc", HSM2_MOD_NSUBC, IF_REAL, "constant part of Nsub [1/cm^3]"),
IOP("vfbcl", HSM2_MOD_VFBCL, IF_REAL, "gate-length dependence of VFBC [um]"),
IOP("vfbclp", HSM2_MOD_VFBCLP, IF_REAL, "gate-length dependence of VFBC [-]"),
IOP("parl2", HSM2_MOD_PARL2, IF_REAL, "under diffusion [m]"), IOP("parl2", HSM2_MOD_PARL2, IF_REAL, "under diffusion [m]"),
IOP("lp", HSM2_MOD_LP, IF_REAL, "length of pocket potential [m]"), IOP("lp", HSM2_MOD_LP, IF_REAL, "length of pocket potential [m]"),
IOP("nsubp", HSM2_MOD_NSUBP, IF_REAL, "[1/cm^3]"), IOP("nsubp", HSM2_MOD_NSUBP, IF_REAL, "[1/cm^3]"),
IOP("nsubpl", HSM2_MOD_NSUBPL, IF_REAL, "gate-length dependence of NSUBP"), IOP("nsubpl", HSM2_MOD_NSUBPL, IF_REAL, "gate-length dependence of NSUBP"),
IOP("nsubpfac", HSM2_MOD_NSUBPFAC, IF_REAL, "gate-length dependence of NSUBP"), IOP("nsubpfac", HSM2_MOD_NSUBPFAC, IF_REAL, "gate-length dependence of NSUBP"),
IOP("nsubpdlt", HSM2_MOD_NSUBPDLT, IF_REAL, "Delta for nsubp smoothing [-]"),
IOP("nsubpw", HSM2_MOD_NSUBPW, IF_REAL, "pocket implant parameter"), IOP("nsubpw", HSM2_MOD_NSUBPW, IF_REAL, "pocket implant parameter"),
IOP("nsubpwp", HSM2_MOD_NSUBPWP, IF_REAL, "pocket implant parameter"), IOP("nsubpwp", HSM2_MOD_NSUBPWP, IF_REAL, "pocket implant parameter"),
IOP("scp1", HSM2_MOD_SCP1, IF_REAL, "parameter for pocket [-]"), IOP("scp1", HSM2_MOD_SCP1, IF_REAL, "parameter for pocket [-]"),
@ -239,6 +245,9 @@ IFparm HSM2mPTable[] = { /* model parameters */
IOP("nsubpsti1", HSM2_MOD_NSUBPSTI1, IF_REAL, "STI Stress pocket impla parameter"), IOP("nsubpsti1", HSM2_MOD_NSUBPSTI1, IF_REAL, "STI Stress pocket impla parameter"),
IOP("nsubpsti2", HSM2_MOD_NSUBPSTI2, IF_REAL, "STI Stress pocket impla parameter"), IOP("nsubpsti2", HSM2_MOD_NSUBPSTI2, IF_REAL, "STI Stress pocket impla parameter"),
IOP("nsubpsti3", HSM2_MOD_NSUBPSTI3, IF_REAL, "STI Stress pocket impla parameter"), IOP("nsubpsti3", HSM2_MOD_NSUBPSTI3, IF_REAL, "STI Stress pocket impla parameter"),
IOP("nsubcsti1", HSM2_MOD_NSUBCSTI1, IF_REAL, "STI Stress Parameter for Nsubc [-]"),
IOP("nsubcsti2", HSM2_MOD_NSUBCSTI2, IF_REAL, "STI Stress Parameter for Nsubc [-]"),
IOP("nsubcsti3", HSM2_MOD_NSUBCSTI3, IF_REAL, "STI Stress Parameter for Nsubc [-]"),
IOP("lpext", HSM2_MOD_LPEXT, IF_REAL, "Pocket extension"), IOP("lpext", HSM2_MOD_LPEXT, IF_REAL, "Pocket extension"),
IOP("npext", HSM2_MOD_NPEXT, IF_REAL, "Pocket extension"), IOP("npext", HSM2_MOD_NPEXT, IF_REAL, "Pocket extension"),
IOP("npextw", HSM2_MOD_NPEXTW, IF_REAL, "new model parameter NPEXTW"), IOP("npextw", HSM2_MOD_NPEXTW, IF_REAL, "new model parameter NPEXTW"),
@ -303,6 +312,8 @@ IFparm HSM2mPTable[] = { /* model parameters */
IOP("gidl3", HSM2_MOD_GIDL3, IF_REAL, "parameter for GIDL [?]"), IOP("gidl3", HSM2_MOD_GIDL3, IF_REAL, "parameter for GIDL [?]"),
IOP("gidl4", HSM2_MOD_GIDL4, IF_REAL, "parameter for GIDL [?]"), IOP("gidl4", HSM2_MOD_GIDL4, IF_REAL, "parameter for GIDL [?]"),
IOP("gidl5", HSM2_MOD_GIDL5, IF_REAL, "parameter for GIDL [?]"), IOP("gidl5", HSM2_MOD_GIDL5, IF_REAL, "parameter for GIDL [?]"),
IOP("gidl6", HSM2_MOD_GIDL6, IF_REAL, "parameter for GIDL [-]"),
IOP("gidl7", HSM2_MOD_GIDL7, IF_REAL, "parameter for GIDL [-]"),
IOP("gleak1", HSM2_MOD_GLEAK1, IF_REAL, "parameter for gate current [A*V^(-3/2)/C]"), IOP("gleak1", HSM2_MOD_GLEAK1, IF_REAL, "parameter for gate current [A*V^(-3/2)/C]"),
IOP("gleak2", HSM2_MOD_GLEAK2, IF_REAL, "parameter for gate current [V^(-1/2)/m ]"), IOP("gleak2", HSM2_MOD_GLEAK2, IF_REAL, "parameter for gate current [V^(-1/2)/m ]"),
IOP("gleak3", HSM2_MOD_GLEAK3, IF_REAL, "parameter for gate current [-]"), IOP("gleak3", HSM2_MOD_GLEAK3, IF_REAL, "parameter for gate current [-]"),
@ -431,6 +442,9 @@ IFparm HSM2mPTable[] = { /* model parameters */
IOP("lnsubpsti1", HSM2_MOD_LNSUBPSTI1, IF_REAL, "Length dependence of nsubpsti1"), IOP("lnsubpsti1", HSM2_MOD_LNSUBPSTI1, IF_REAL, "Length dependence of nsubpsti1"),
IOP("lnsubpsti2", HSM2_MOD_LNSUBPSTI2, IF_REAL, "Length dependence of nsubpsti2"), IOP("lnsubpsti2", HSM2_MOD_LNSUBPSTI2, IF_REAL, "Length dependence of nsubpsti2"),
IOP("lnsubpsti3", HSM2_MOD_LNSUBPSTI3, IF_REAL, "Length dependence of nsubpsti3"), IOP("lnsubpsti3", HSM2_MOD_LNSUBPSTI3, IF_REAL, "Length dependence of nsubpsti3"),
IOP("lnsubcsti1", HSM2_MOD_LNSUBCSTI1, IF_REAL, "Length dependence of nsubcsti1"),
IOP("lnsubcsti2", HSM2_MOD_LNSUBCSTI2, IF_REAL, "Length dependence of nsubcsti2"),
IOP("lnsubcsti3", HSM2_MOD_LNSUBCSTI3, IF_REAL, "Length dependence of nsubcsti3"),
IOP("lcgso", HSM2_MOD_LCGSO, IF_REAL, "Length dependence of cgso"), IOP("lcgso", HSM2_MOD_LCGSO, IF_REAL, "Length dependence of cgso"),
IOP("lcgdo", HSM2_MOD_LCGDO, IF_REAL, "Length dependence of cgdo"), IOP("lcgdo", HSM2_MOD_LCGDO, IF_REAL, "Length dependence of cgdo"),
IOP("ljs0", HSM2_MOD_LJS0, IF_REAL, "Length dependence of js0"), IOP("ljs0", HSM2_MOD_LJS0, IF_REAL, "Length dependence of js0"),
@ -503,6 +517,9 @@ IFparm HSM2mPTable[] = { /* model parameters */
IOP("wnsubpsti1", HSM2_MOD_WNSUBPSTI1, IF_REAL, "Width dependence of nsubpsti1"), IOP("wnsubpsti1", HSM2_MOD_WNSUBPSTI1, IF_REAL, "Width dependence of nsubpsti1"),
IOP("wnsubpsti2", HSM2_MOD_WNSUBPSTI2, IF_REAL, "Width dependence of nsubpsti2"), IOP("wnsubpsti2", HSM2_MOD_WNSUBPSTI2, IF_REAL, "Width dependence of nsubpsti2"),
IOP("wnsubpsti3", HSM2_MOD_WNSUBPSTI3, IF_REAL, "Width dependence of nsubpsti3"), IOP("wnsubpsti3", HSM2_MOD_WNSUBPSTI3, IF_REAL, "Width dependence of nsubpsti3"),
IOP("wnsubcsti1", HSM2_MOD_WNSUBCSTI1, IF_REAL, "Wength dependence of nsubcsti1"),
IOP("wnsubcsti2", HSM2_MOD_WNSUBCSTI2, IF_REAL, "Wength dependence of nsubcsti2"),
IOP("wnsubcsti3", HSM2_MOD_WNSUBCSTI3, IF_REAL, "Wength dependence of nsubcsti3"),
IOP("wcgso", HSM2_MOD_WCGSO, IF_REAL, "Width dependence of cgso"), IOP("wcgso", HSM2_MOD_WCGSO, IF_REAL, "Width dependence of cgso"),
IOP("wcgdo", HSM2_MOD_WCGDO, IF_REAL, "Width dependence of cgdo"), IOP("wcgdo", HSM2_MOD_WCGDO, IF_REAL, "Width dependence of cgdo"),
IOP("wjs0", HSM2_MOD_WJS0, IF_REAL, "Width dependence of js0"), IOP("wjs0", HSM2_MOD_WJS0, IF_REAL, "Width dependence of js0"),
@ -575,6 +592,9 @@ IFparm HSM2mPTable[] = { /* model parameters */
IOP("pnsubpsti1", HSM2_MOD_PNSUBPSTI1, IF_REAL, "Cross-term dependence of nsubpsti1"), IOP("pnsubpsti1", HSM2_MOD_PNSUBPSTI1, IF_REAL, "Cross-term dependence of nsubpsti1"),
IOP("pnsubpsti2", HSM2_MOD_PNSUBPSTI2, IF_REAL, "Cross-term dependence of nsubpsti2"), IOP("pnsubpsti2", HSM2_MOD_PNSUBPSTI2, IF_REAL, "Cross-term dependence of nsubpsti2"),
IOP("pnsubpsti3", HSM2_MOD_PNSUBPSTI3, IF_REAL, "Cross-term dependence of nsubpsti3"), IOP("pnsubpsti3", HSM2_MOD_PNSUBPSTI3, IF_REAL, "Cross-term dependence of nsubpsti3"),
IOP("pnsubcsti1", HSM2_MOD_PNSUBCSTI1, IF_REAL, "Cross-term dependence of nsubcsti1"),
IOP("pnsubcsti2", HSM2_MOD_PNSUBCSTI2, IF_REAL, "Cross-term dependence of nsubcsti2"),
IOP("pnsubcsti3", HSM2_MOD_PNSUBCSTI3, IF_REAL, "Cross-term dependence of nsubcsti3"),
IOP("pcgso", HSM2_MOD_PCGSO, IF_REAL, "Cross-term dependence of cgso"), IOP("pcgso", HSM2_MOD_PCGSO, IF_REAL, "Cross-term dependence of cgso"),
IOP("pcgdo", HSM2_MOD_PCGDO, IF_REAL, "Cross-term dependence of cgdo"), IOP("pcgdo", HSM2_MOD_PCGDO, IF_REAL, "Cross-term dependence of cgdo"),
IOP("pjs0", HSM2_MOD_PJS0, IF_REAL, "Cross-term dependence of js0"), IOP("pjs0", HSM2_MOD_PJS0, IF_REAL, "Cross-term dependence of js0"),

6
src/spicelib/devices/hisim2/hsm2acld.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2acld.c FILE : hsm2acld.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &

6
src/spicelib/devices/hisim2/hsm2ask.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2ask.c FILE : hsm2ask.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &

6
src/spicelib/devices/hisim2/hsm2cvtest.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2cvtest.c FILE : hsm2cvtest.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &

135
src/spicelib/devices/hisim2/hsm2def.h

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2def.h FILE : hsm2def.h
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &
@ -24,36 +26,31 @@
/* declarations for HiSIM2 MOSFETs */ /* declarations for HiSIM2 MOSFETs */
typedef struct sHSM2modelCGSParam {
double HSM2_tox ;
double HSM2_xld ;
double HSM2_xwd ;
double HSM2_xqy ;
double HSM2_xl ;
double HSM2_xw ;
double HSM2_saref ;
double HSM2_sbref ;
/* unit-converted model parameters */
typedef struct sHSM2modelMKSParam {
double HSM2_npext ;
double HSM2_nsubcwpe ;
double HSM2_nsubpwpe ;
double HSM2_npextwpe ;
double HSM2_ll ; double HSM2_ll ;
double HSM2_lld ;
double HSM2_wl ; double HSM2_wl ;
double HSM2_wld ;
double HSM2_lp ;
double HSM2_tpoly ;
double HSM2_parl2 ;
double HSM2_qme1 ;
double HSM2_qme3 ;
double HSM2_cgbo ;
double HSM2_cj ;
double HSM2_cjsw ;
double HSM2_cjswg ;
double HSM2_lpext ;
double HSM2_wl1 ;
double HSM2_rs ;
double HSM2_rd ;
double HSM2_gdld ;
double HSM2_muepwd ;
double HSM2_muepld ;
} HSM2modelCGSParam ;
double HSM2_svgsl ;
double HSM2_svgsw ;
double HSM2_svbsl ;
double HSM2_slgl ;
double HSM2_sub1l ;
double HSM2_slg ;
double HSM2_sub2l ;
double HSM2_nsubcmax ;
double HSM2_glksd3 ;
double HSM2_gleak2 ;
double HSM2_gleak4 ;
double HSM2_gleak5 ;
double HSM2_gleak7 ;
double HSM2_cit ;
double HSM2_ovslp ;
double HSM2_dly3 ;
} HSM2modelMKSParam ;
/* binning parameters */ /* binning parameters */
typedef struct sHSM2binningParam { typedef struct sHSM2binningParam {
@ -102,6 +99,9 @@ typedef struct sHSM2binningParam {
double HSM2_nsubpsti1 ; double HSM2_nsubpsti1 ;
double HSM2_nsubpsti2 ; double HSM2_nsubpsti2 ;
double HSM2_nsubpsti3 ; double HSM2_nsubpsti3 ;
double HSM2_nsubcsti1;
double HSM2_nsubcsti2;
double HSM2_nsubcsti3;
double HSM2_cgso ; double HSM2_cgso ;
double HSM2_cgdo ; double HSM2_cgdo ;
double HSM2_js0 ; double HSM2_js0 ;
@ -130,19 +130,9 @@ typedef struct sHSM2binningParam {
} HSM2binningParam ; } HSM2binningParam ;
/* unit-converted parameters for each instance */ /* unit-converted parameters for each instance */
typedef struct sHSM2hereCGSParam {
double HSM2_l;
double HSM2_w;
double HSM2_ad;
double HSM2_as;
double HSM2_pd;
double HSM2_ps;
double HSM2_xgl;
double HSM2_xgw;
double HSM2_sa;
double HSM2_sb;
double HSM2_sd;
} HSM2hereCGSParam ;
typedef struct sHSM2hereMKSParam {
double HSM2_nsubcdfm ;
} HSM2hereMKSParam ;
/* information needed for each instance */ /* information needed for each instance */
typedef struct sHSM2instance { typedef struct sHSM2instance {
@ -433,8 +423,8 @@ typedef struct sHSM2instance {
double HSM2_nsubp ; double HSM2_nsubp ;
double HSM2_nsubc ; double HSM2_nsubc ;
HSM2hereMKSParam hereMKS ; /* unit-converted parameters */
HSM2binningParam pParam ; /* binning parameters */ HSM2binningParam pParam ; /* binning parameters */
HSM2hereCGSParam hereCGS ; /* unit-converted parameters */
/* no use in SPICE3f5 /* no use in SPICE3f5
double HSM2drainSquares; the length of the drain in squares double HSM2drainSquares; the length of the drain in squares
@ -633,6 +623,7 @@ typedef struct sHSM2model { /* model structure for a resistor */
int HSM2_corecip; int HSM2_corecip;
int HSM2_coqy; int HSM2_coqy;
int HSM2_coqovsm ; int HSM2_coqovsm ;
int HSM2_coerrrep;
/* HiSIM original */ /* HiSIM original */
double HSM2_vmax ; double HSM2_vmax ;
@ -676,11 +667,14 @@ typedef struct sHSM2model { /* model structure for a resistor */
/* double HSM2_nf; */ /* double HSM2_nf; */
double HSM2_vfbc ; double HSM2_vfbc ;
double HSM2_vbi ; double HSM2_vbi ;
double HSM2_vfbcl;
double HSM2_vfbclp;
double HSM2_nsubc ; double HSM2_nsubc ;
double HSM2_parl2 ; double HSM2_parl2 ;
double HSM2_lp ; double HSM2_lp ;
double HSM2_nsubp ; double HSM2_nsubp ;
double HSM2_nsubpl ; double HSM2_nsubpl ;
double HSM2_nsubpdlt;
double HSM2_nsubpfac ; double HSM2_nsubpfac ;
double HSM2_nsubpw ; double HSM2_nsubpw ;
double HSM2_nsubpwp ; double HSM2_nsubpwp ;
@ -755,6 +749,9 @@ typedef struct sHSM2model { /* model structure for a resistor */
double HSM2_muesti3 ; double HSM2_muesti3 ;
double HSM2_nsubpsti1 ; double HSM2_nsubpsti1 ;
double HSM2_nsubpsti2 ; double HSM2_nsubpsti2 ;
double HSM2_nsubcsti1;
double HSM2_nsubcsti2;
double HSM2_nsubcsti3;
double HSM2_nsubpsti3 ; double HSM2_nsubpsti3 ;
double HSM2_lpext ; double HSM2_lpext ;
double HSM2_npext ; double HSM2_npext ;
@ -817,6 +814,8 @@ typedef struct sHSM2model { /* model structure for a resistor */
double HSM2_gidl2 ; double HSM2_gidl2 ;
double HSM2_gidl3 ; double HSM2_gidl3 ;
double HSM2_gidl4 ; double HSM2_gidl4 ;
double HSM2_gidl6;
double HSM2_gidl7;
double HSM2_gidl5 ; double HSM2_gidl5 ;
double HSM2_gleak1 ; double HSM2_gleak1 ;
double HSM2_gleak2 ; double HSM2_gleak2 ;
@ -940,6 +939,9 @@ typedef struct sHSM2model { /* model structure for a resistor */
double HSM2_lmuesti3 ; double HSM2_lmuesti3 ;
double HSM2_lnsubpsti1 ; double HSM2_lnsubpsti1 ;
double HSM2_lnsubpsti2 ; double HSM2_lnsubpsti2 ;
double HSM2_lnsubcsti1;
double HSM2_lnsubcsti2;
double HSM2_lnsubcsti3;
double HSM2_lnsubpsti3 ; double HSM2_lnsubpsti3 ;
double HSM2_lcgso ; double HSM2_lcgso ;
double HSM2_lcgdo ; double HSM2_lcgdo ;
@ -1012,6 +1014,9 @@ typedef struct sHSM2model { /* model structure for a resistor */
double HSM2_wmuesti3 ; double HSM2_wmuesti3 ;
double HSM2_wnsubpsti1 ; double HSM2_wnsubpsti1 ;
double HSM2_wnsubpsti2 ; double HSM2_wnsubpsti2 ;
double HSM2_wnsubcsti1;
double HSM2_wnsubcsti2;
double HSM2_wnsubcsti3;
double HSM2_wnsubpsti3 ; double HSM2_wnsubpsti3 ;
double HSM2_wcgso ; double HSM2_wcgso ;
double HSM2_wcgdo ; double HSM2_wcgdo ;
@ -1084,6 +1089,9 @@ typedef struct sHSM2model { /* model structure for a resistor */
double HSM2_pmuesti3 ; double HSM2_pmuesti3 ;
double HSM2_pnsubpsti1 ; double HSM2_pnsubpsti1 ;
double HSM2_pnsubpsti2 ; double HSM2_pnsubpsti2 ;
double HSM2_pnsubcsti1;
double HSM2_pnsubcsti2;
double HSM2_pnsubcsti3;
double HSM2_pnsubpsti3 ; double HSM2_pnsubpsti3 ;
double HSM2_pcgso ; double HSM2_pcgso ;
double HSM2_pcgdo ; double HSM2_pcgdo ;
@ -1118,8 +1126,7 @@ typedef struct sHSM2model { /* model structure for a resistor */
double HSM2_ktnom ; double HSM2_ktnom ;
int HSM2_bypass_enable ; int HSM2_bypass_enable ;
HSM2modelCGSParam modelCGS ; /* unit-converted parameters */
HSM2modelMKSParam modelMKS ; /* unit-converted parameters */
/* flag for model */ /* flag for model */
unsigned HSM2_type_Given :1; unsigned HSM2_type_Given :1;
unsigned HSM2_level_Given :1; unsigned HSM2_level_Given :1;
@ -1146,6 +1153,7 @@ typedef struct sHSM2model { /* model structure for a resistor */
unsigned HSM2_corecip_Given :1; unsigned HSM2_corecip_Given :1;
unsigned HSM2_coqy_Given :1; unsigned HSM2_coqy_Given :1;
unsigned HSM2_coqovsm_Given :1; unsigned HSM2_coqovsm_Given :1;
unsigned HSM2_coerrrep_Given :1;
unsigned HSM2_kappa_Given :1; unsigned HSM2_kappa_Given :1;
unsigned HSM2_vdiffj_Given :1; unsigned HSM2_vdiffj_Given :1;
unsigned HSM2_vmax_Given :1; unsigned HSM2_vmax_Given :1;
@ -1189,11 +1197,14 @@ typedef struct sHSM2model { /* model structure for a resistor */
/* unsigned HSM2_nf_Given :1; */ /* unsigned HSM2_nf_Given :1; */
unsigned HSM2_vfbc_Given :1; unsigned HSM2_vfbc_Given :1;
unsigned HSM2_vbi_Given :1; unsigned HSM2_vbi_Given :1;
unsigned HSM2_vfbcl_Given :1;
unsigned HSM2_vfbclp_Given :1;
unsigned HSM2_nsubc_Given :1; unsigned HSM2_nsubc_Given :1;
unsigned HSM2_parl2_Given :1; unsigned HSM2_parl2_Given :1;
unsigned HSM2_lp_Given :1; unsigned HSM2_lp_Given :1;
unsigned HSM2_nsubp_Given :1; unsigned HSM2_nsubp_Given :1;
unsigned HSM2_nsubpl_Given :1; unsigned HSM2_nsubpl_Given :1;
unsigned HSM2_nsubpdlt_Given :1;
unsigned HSM2_nsubpfac_Given :1; unsigned HSM2_nsubpfac_Given :1;
unsigned HSM2_nsubpw_Given :1; unsigned HSM2_nsubpw_Given :1;
unsigned HSM2_nsubpwp_Given :1; unsigned HSM2_nsubpwp_Given :1;
@ -1268,6 +1279,9 @@ typedef struct sHSM2model { /* model structure for a resistor */
unsigned HSM2_muesti3_Given :1; unsigned HSM2_muesti3_Given :1;
unsigned HSM2_nsubpsti1_Given :1; unsigned HSM2_nsubpsti1_Given :1;
unsigned HSM2_nsubpsti2_Given :1; unsigned HSM2_nsubpsti2_Given :1;
unsigned HSM2_nsubcsti1_Given :1;
unsigned HSM2_nsubcsti2_Given :1;
unsigned HSM2_nsubcsti3_Given :1;
unsigned HSM2_nsubpsti3_Given :1; unsigned HSM2_nsubpsti3_Given :1;
unsigned HSM2_lpext_Given :1; unsigned HSM2_lpext_Given :1;
unsigned HSM2_npext_Given :1; unsigned HSM2_npext_Given :1;
@ -1330,6 +1344,8 @@ typedef struct sHSM2model { /* model structure for a resistor */
unsigned HSM2_gidl2_Given :1; unsigned HSM2_gidl2_Given :1;
unsigned HSM2_gidl3_Given :1; unsigned HSM2_gidl3_Given :1;
unsigned HSM2_gidl4_Given :1; unsigned HSM2_gidl4_Given :1;
unsigned HSM2_gidl6_Given :1;
unsigned HSM2_gidl7_Given :1;
unsigned HSM2_gidl5_Given :1; unsigned HSM2_gidl5_Given :1;
unsigned HSM2_gleak1_Given :1; unsigned HSM2_gleak1_Given :1;
unsigned HSM2_gleak2_Given :1; unsigned HSM2_gleak2_Given :1;
@ -1451,6 +1467,9 @@ typedef struct sHSM2model { /* model structure for a resistor */
unsigned HSM2_lmuesti3_Given :1; unsigned HSM2_lmuesti3_Given :1;
unsigned HSM2_lnsubpsti1_Given :1; unsigned HSM2_lnsubpsti1_Given :1;
unsigned HSM2_lnsubpsti2_Given :1; unsigned HSM2_lnsubpsti2_Given :1;
unsigned HSM2_lnsubcsti1_Given :1;
unsigned HSM2_lnsubcsti2_Given :1;
unsigned HSM2_lnsubcsti3_Given :1;
unsigned HSM2_lnsubpsti3_Given :1; unsigned HSM2_lnsubpsti3_Given :1;
unsigned HSM2_lcgso_Given :1; unsigned HSM2_lcgso_Given :1;
unsigned HSM2_lcgdo_Given :1; unsigned HSM2_lcgdo_Given :1;
@ -1523,6 +1542,9 @@ typedef struct sHSM2model { /* model structure for a resistor */
unsigned HSM2_wmuesti3_Given :1; unsigned HSM2_wmuesti3_Given :1;
unsigned HSM2_wnsubpsti1_Given :1; unsigned HSM2_wnsubpsti1_Given :1;
unsigned HSM2_wnsubpsti2_Given :1; unsigned HSM2_wnsubpsti2_Given :1;
unsigned HSM2_wnsubcsti1_Given :1;
unsigned HSM2_wnsubcsti2_Given :1;
unsigned HSM2_wnsubcsti3_Given :1;
unsigned HSM2_wnsubpsti3_Given :1; unsigned HSM2_wnsubpsti3_Given :1;
unsigned HSM2_wcgso_Given :1; unsigned HSM2_wcgso_Given :1;
unsigned HSM2_wcgdo_Given :1; unsigned HSM2_wcgdo_Given :1;
@ -1595,6 +1617,9 @@ typedef struct sHSM2model { /* model structure for a resistor */
unsigned HSM2_pmuesti3_Given :1; unsigned HSM2_pmuesti3_Given :1;
unsigned HSM2_pnsubpsti1_Given :1; unsigned HSM2_pnsubpsti1_Given :1;
unsigned HSM2_pnsubpsti2_Given :1; unsigned HSM2_pnsubpsti2_Given :1;
unsigned HSM2_pnsubcsti1_Given :1;
unsigned HSM2_pnsubcsti2_Given :1;
unsigned HSM2_pnsubcsti3_Given :1;
unsigned HSM2_pnsubpsti3_Given :1; unsigned HSM2_pnsubpsti3_Given :1;
unsigned HSM2_pcgso_Given :1; unsigned HSM2_pcgso_Given :1;
unsigned HSM2_pcgdo_Given :1; unsigned HSM2_pcgdo_Given :1;
@ -1658,6 +1683,7 @@ typedef struct sHSM2model { /* model structure for a resistor */
#define HSM2_MOD_CORECIP 37 #define HSM2_MOD_CORECIP 37
#define HSM2_MOD_COQY 38 #define HSM2_MOD_COQY 38
#define HSM2_MOD_COQOVSM 39 #define HSM2_MOD_COQOVSM 39
#define HSM2_MOD_COERRREP 153
/* device parameters */ /* device parameters */
#define HSM2_L 51 #define HSM2_L 51
#define HSM2_W 52 #define HSM2_W 52
@ -1744,6 +1770,8 @@ typedef struct sHSM2model { /* model structure for a resistor */
#define HSM2_MOD_VFBC 121 #define HSM2_MOD_VFBC 121
#define HSM2_MOD_VBI 122 #define HSM2_MOD_VBI 122
#define HSM2_MOD_NSUBC 123 #define HSM2_MOD_NSUBC 123
#define HSM2_MOD_VFBCL 272
#define HSM2_MOD_VFBCLP 273
#define HSM2_MOD_TNOM 124 #define HSM2_MOD_TNOM 124
#define HSM2_MOD_PARL2 125 #define HSM2_MOD_PARL2 125
#define HSM2_MOD_SC1 126 #define HSM2_MOD_SC1 126
@ -1810,6 +1838,7 @@ typedef struct sHSM2model { /* model structure for a resistor */
#define HSM2_MOD_NSUBP 181 #define HSM2_MOD_NSUBP 181
#define HSM2_MOD_NSUBPL 196 #define HSM2_MOD_NSUBPL 196
#define HSM2_MOD_NSUBPFAC 197 #define HSM2_MOD_NSUBPFAC 197
#define HSM2_MOD_NSUBPDLT 274
#define HSM2_MOD_NSUBPW 182 #define HSM2_MOD_NSUBPW 182
#define HSM2_MOD_NSUBPWP 183 #define HSM2_MOD_NSUBPWP 183
#define HSM2_MOD_SCP1 184 #define HSM2_MOD_SCP1 184
@ -1872,6 +1901,9 @@ typedef struct sHSM2model { /* model structure for a resistor */
#define HSM2_MOD_NSUBPSTI1 238 #define HSM2_MOD_NSUBPSTI1 238
#define HSM2_MOD_NSUBPSTI2 239 #define HSM2_MOD_NSUBPSTI2 239
#define HSM2_MOD_NSUBPSTI3 240 #define HSM2_MOD_NSUBPSTI3 240
#define HSM2_MOD_NSUBCSTI1 198
#define HSM2_MOD_NSUBCSTI2 247
#define HSM2_MOD_NSUBCSTI3 252
#define HSM2_MOD_LPEXT 241 #define HSM2_MOD_LPEXT 241
#define HSM2_MOD_NPEXT 242 #define HSM2_MOD_NPEXT 242
#define HSM2_MOD_NPEXTW 471 #define HSM2_MOD_NPEXTW 471
@ -1893,6 +1925,8 @@ typedef struct sHSM2model { /* model structure for a resistor */
#define HSM2_MOD_OVMAG 262 #define HSM2_MOD_OVMAG 262
#define HSM2_MOD_GIDL4 281 #define HSM2_MOD_GIDL4 281
#define HSM2_MOD_GIDL5 282 #define HSM2_MOD_GIDL5 282
#define HSM2_MOD_GIDL6 189
#define HSM2_MOD_GIDL7 194
#define HSM2_MOD_SVGS 283 #define HSM2_MOD_SVGS 283
#define HSM2_MOD_SVBS 284 #define HSM2_MOD_SVBS 284
#define HSM2_MOD_SVBSL 285 #define HSM2_MOD_SVBSL 285
@ -1998,6 +2032,9 @@ typedef struct sHSM2model { /* model structure for a resistor */
#define HSM2_MOD_LNSUBPSTI1 1238 #define HSM2_MOD_LNSUBPSTI1 1238
#define HSM2_MOD_LNSUBPSTI2 1239 #define HSM2_MOD_LNSUBPSTI2 1239
#define HSM2_MOD_LNSUBPSTI3 1240 #define HSM2_MOD_LNSUBPSTI3 1240
#define HSM2_MOD_LNSUBCSTI1 253
#define HSM2_MOD_LNSUBCSTI2 264
#define HSM2_MOD_LNSUBCSTI3 265
#define HSM2_MOD_LCGSO 1154 #define HSM2_MOD_LCGSO 1154
#define HSM2_MOD_LCGDO 1155 #define HSM2_MOD_LCGDO 1155
#define HSM2_MOD_LJS0 1157 #define HSM2_MOD_LJS0 1157
@ -2070,6 +2107,9 @@ typedef struct sHSM2model { /* model structure for a resistor */
#define HSM2_MOD_WNSUBPSTI1 2238 #define HSM2_MOD_WNSUBPSTI1 2238
#define HSM2_MOD_WNSUBPSTI2 2239 #define HSM2_MOD_WNSUBPSTI2 2239
#define HSM2_MOD_WNSUBPSTI3 2240 #define HSM2_MOD_WNSUBPSTI3 2240
#define HSM2_MOD_WNSUBCSTI1 266
#define HSM2_MOD_WNSUBCSTI2 267
#define HSM2_MOD_WNSUBCSTI3 268
#define HSM2_MOD_WCGSO 2154 #define HSM2_MOD_WCGSO 2154
#define HSM2_MOD_WCGDO 2155 #define HSM2_MOD_WCGDO 2155
#define HSM2_MOD_WJS0 2157 #define HSM2_MOD_WJS0 2157
@ -2142,6 +2182,9 @@ typedef struct sHSM2model { /* model structure for a resistor */
#define HSM2_MOD_PNSUBPSTI1 3238 #define HSM2_MOD_PNSUBPSTI1 3238
#define HSM2_MOD_PNSUBPSTI2 3239 #define HSM2_MOD_PNSUBPSTI2 3239
#define HSM2_MOD_PNSUBPSTI3 3240 #define HSM2_MOD_PNSUBPSTI3 3240
#define HSM2_MOD_PNSUBCSTI1 269
#define HSM2_MOD_PNSUBCSTI2 270
#define HSM2_MOD_PNSUBCSTI3 271
#define HSM2_MOD_PCGSO 3154 #define HSM2_MOD_PCGSO 3154
#define HSM2_MOD_PCGDO 3155 #define HSM2_MOD_PCGDO 3155
#define HSM2_MOD_PJS0 3157 #define HSM2_MOD_PJS0 3157

6
src/spicelib/devices/hisim2/hsm2del.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2del.c FILE : hsm2del.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &

6
src/spicelib/devices/hisim2/hsm2dest.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2dest.c FILE : hsm2dest.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &

929
src/spicelib/devices/hisim2/hsm2eval.c
File diff suppressed because it is too large
View File

17
src/spicelib/devices/hisim2/hsm2evalenv.h

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2evalenv.h FILE : hsm2evalenv.h
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &
@ -52,6 +54,9 @@
#define C_m2cm_p2 (1.0e4) #define C_m2cm_p2 (1.0e4)
#define C_m2cm_p1o2 (1.0e1) #define C_m2cm_p1o2 (1.0e1)
#define C_m2um (1.0e6) #define C_m2um (1.0e6)
#define C_cm2m_p3 (1.0e-6)
#define C_vmax (1.0e5)
#define C_E0_p2 (1.0e9)
/*---------------------------------------------------* /*---------------------------------------------------*
* Physical constants/properties. (macro) * Physical constants/properties. (macro)
@ -63,9 +68,9 @@
#define C_KB (1.3806226e-23) #define C_KB (1.3806226e-23)
/* Permitivity of Si, SiO2 and vacuum */ /* Permitivity of Si, SiO2 and vacuum */
#define C_ESI (1.034943e-12)
#define C_EOX (3.453133e-13)
#define C_VAC (8.8541878e-14)
#define C_ESI (1.034943e-10)
#define C_EOX (3.453133e-11)
#define C_VAC (8.8541878e-12)
/* Room temperature constants */ /* Room temperature constants */
#define C_T300 (300e+00) #define C_T300 (300e+00)
@ -77,7 +82,7 @@
/* Intrinsic carrier density at 300K */ /* Intrinsic carrier density at 300K */
#define C_Nin0 (1.04e+10)
#define C_Nin0 (1.04e+16)
/*---------------------------------------------------* /*---------------------------------------------------*

6
src/spicelib/devices/hisim2/hsm2ext.h

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2ext.h FILE : hsm2ext.h
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &

6
src/spicelib/devices/hisim2/hsm2getic.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2getic.c FILE : hsm2getic.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &

4
src/spicelib/devices/hisim2/hsm2init.c

@ -1,5 +1,3 @@
#include "ngspice/config.h"
#include "ngspice/devdefs.h" #include "ngspice/devdefs.h"
#include "hsm2def.h" #include "hsm2def.h"
@ -8,7 +6,7 @@
SPICEdev HSM2info = { SPICEdev HSM2info = {
{ "HiSIM2", { "HiSIM2",
"Hiroshima University STARC IGFET Model 2.6.1",
"Hiroshima University STARC IGFET Model 2.7.0",
&HSM2nSize, &HSM2nSize,
&HSM2nSize, &HSM2nSize,

14
src/spicelib/devices/hisim2/hsm2itf.h

@ -1,17 +1,3 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
FILE : hsm2itf.h
date : 2012.4.6
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#ifndef DEV_HISIM2 #ifndef DEV_HISIM2
#define DEV_HISIM2 #define DEV_HISIM2

65
src/spicelib/devices/hisim2/hsm2ld.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2ld.c FILE : hsm2ld.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &
@ -45,6 +47,7 @@ static double vsum0 = 1.0e5 ;
#endif #endif
#endif #endif
static void ShowPhysVals static void ShowPhysVals
( (
HSM2instance *here, HSM2instance *here,
@ -179,38 +182,38 @@ int HSM2load(
register HSM2model *model = (HSM2model*)inModel; register HSM2model *model = (HSM2model*)inModel;
register HSM2instance *here; register HSM2instance *here;
HSM2binningParam *pParam; HSM2binningParam *pParam;
double cbhat, cdrain, cdhat, cdreq, cgbhat, cgshat, cgdhat;
double Ibtot, Idtot, Igbtot, Igstot, Igdtot;
double ceq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg;
double ceqjs, ceqjd, ceqqjs = 0.0, ceqqjd = 0.0;
double delvbd, delvbs, delvds, delvgd, delvgs;
double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb;
double gcgdb, gcggb, gcgsb, gcgbb, gcsdb, gcsgb, gcssb;
double geq, xfact;
double vbd, vbs, vds, vgb, vgd, vgdo, vgs, von;
double gbbdp, gbbsp, gbspg, gbspdp, gbspb, gbspsp;
double qgate, qbulk, qdrn;
double cqgate, cqbulk, cqdrn;
double gbdpdp, gbdpg, gbdpb, gbdpsp;
double gm, gmbs, FwdSum, RevSum;
double ag0;
double Ibtoteq, gIbtotg, gIbtotd, gIbtots, gIbtotb;
double Igtoteq, gIgtotg, gIgtotd, gIgtots, gIgtotb;
double Idtoteq, gIdtotg, gIdtotd, gIdtots, gIdtotb;
double Istoteq, gIstotg, gIstotd, gIstots, gIstotb;
double ivds, ivgs, ivbs;
double gjbs, gjbd, gcdbdb, gcsbsb, gcbbb, gcdbb, gcsbb, grg;
double vdbs, vsbs, vdbd, delvdbs, delvsbs, delvdbd;
double vges, vged, delvges, delvged, vgedo;
double vsbdo, vsbd;
double vbs_jct, vbd_jct, delvbs_jct, delvbd_jct;
int ByPass, Check, Check1, Check2;
int BYPASS_enable ;
double cbhat=0.0, cdrain=0.0, cdhat=0.0, cdreq=0.0, cgbhat=0.0, cgshat=0.0, cgdhat=0.0 ;
double Ibtot=0.0, Idtot=0.0, Igbtot=0.0, Igstot=0.0, Igdtot=0.0 ;
double ceq=0.0, ceqbd=0.0, ceqbs=0.0, ceqqb=0.0, ceqqd=0.0, ceqqg=0.0 ;
double ceqjs=0.0, ceqjd=0.0, ceqqjs=0.0, ceqqjd=0.0 ;
double delvbd=0.0, delvbs=0.0, delvds=0.0, delvgd=0.0, delvgs=0.0 ;
double gcbdb=0.0, gcbgb=0.0, gcbsb=0.0, gcddb=0.0, gcdgb=0.0, gcdsb=0.0 ;
double gcgdb=0.0, gcggb=0.0, gcgsb=0.0, gcgbb=0.0, gcsdb=0.0, gcsgb=0.0, gcssb=0.0 ;
double geq=0.0, xfact=0.0 ;
double vbd=0.0, vbs=0.0, vds=0.0, vgb=0.0, vgd=0.0, vgdo=0.0, vgs=0.0, von=0.0 ;
double gbbdp=0.0, gbbsp=0.0, gbspg=0.0, gbspdp=0.0, gbspb=0.0, gbspsp=0.0 ;
double qgate=0.0, qbulk=0.0, qdrn=0.0 ;
double cqgate=0.0, cqbulk=0.0, cqdrn=0.0 ;
double gbdpdp=0.0, gbdpg=0.0, gbdpb=0.0, gbdpsp=0.0;
double gm=0.0, gmbs=0.0, FwdSum=0.0, RevSum=0.0 ;
double ag0=0.0 ;
double Ibtoteq=0.0, gIbtotg=0.0, gIbtotd=0.0, gIbtots=0.0, gIbtotb=0.0 ;
double Igtoteq=0.0, gIgtotg=0.0, gIgtotd=0.0, gIgtots=0.0, gIgtotb=0.0 ;
double Idtoteq=0.0, gIdtotg=0.0, gIdtotd=0.0, gIdtots=0.0, gIdtotb=0.0 ;
double Istoteq=0.0, gIstotg=0.0, gIstotd=0.0, gIstots=0.0, gIstotb=0.0 ;
double ivds=0.0, ivgs=0.0, ivbs=0.0 ;
double gjbs=0.0, gjbd=0.0, gcdbdb=0.0, gcsbsb=0.0, gcbbb=0.0, gcdbb=0.0, gcsbb=0.0, grg=0.0 ;
double vdbs=0.0, vsbs=0.0, vdbd=0.0, delvdbs=0.0, delvsbs=0.0, delvdbd=0.0 ;
double vges=0.0, vged=0.0, delvges=0.0, delvged=0.0, vgedo=0.0 ;
double vsbdo=0.0, vsbd=0.0;
double vbs_jct=0.0, vbd_jct=0.0, delvbs_jct=0.0, delvbd_jct=0.0 ;
int ByPass=0, Check=0, Check1=0, Check2=0 ;
int BYPASS_enable =0 ;
#ifndef NOBYPASS #ifndef NOBYPASS
double tempv;
double tempv=0.0 ;
#endif /*NOBYPASS*/ #endif /*NOBYPASS*/
#ifndef NEWCONV #ifndef NEWCONV
double tol, tol2, tol3, tol4;
double tol=0.0, tol2=0.0, tol3=0.0, tol4=0.0 ;
#endif #endif
int ChargeComputationNeeded = int ChargeComputationNeeded =
((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) ||

60
src/spicelib/devices/hisim2/hsm2mask.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2mask.c FILE : hsm2mask.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &
@ -110,6 +112,9 @@ int HSM2mAsk(
case HSM2_MOD_COQOVSM: case HSM2_MOD_COQOVSM:
value->iValue = model->HSM2_coqovsm; value->iValue = model->HSM2_coqovsm;
return(OK); return(OK);
case HSM2_MOD_COERRREP:
value->iValue = model->HSM2_coerrrep;
return(OK);
case HSM2_MOD_VMAX: case HSM2_MOD_VMAX:
value->rValue = model->HSM2_vmax; value->rValue = model->HSM2_vmax;
return(OK); return(OK);
@ -236,6 +241,12 @@ int HSM2mAsk(
case HSM2_MOD_NSUBC: case HSM2_MOD_NSUBC:
value->rValue = model->HSM2_nsubc; value->rValue = model->HSM2_nsubc;
return(OK); return(OK);
case HSM2_MOD_VFBCL:
value->rValue = model->HSM2_vfbcl;
return(OK);
case HSM2_MOD_VFBCLP:
value->rValue = model->HSM2_vfbclp;
return(OK);
case HSM2_MOD_PARL2: case HSM2_MOD_PARL2:
value->rValue = model->HSM2_parl2; value->rValue = model->HSM2_parl2;
return(OK); return(OK);
@ -251,6 +262,9 @@ int HSM2mAsk(
case HSM2_MOD_NSUBPFAC: case HSM2_MOD_NSUBPFAC:
value->rValue = model->HSM2_nsubpfac; value->rValue = model->HSM2_nsubpfac;
return(OK); return(OK);
case HSM2_MOD_NSUBPDLT:
value->rValue = model->HSM2_nsubpdlt;
return(OK);
case HSM2_MOD_NSUBPW: case HSM2_MOD_NSUBPW:
value->rValue = model->HSM2_nsubpw; value->rValue = model->HSM2_nsubpw;
return(OK); return(OK);
@ -473,6 +487,15 @@ int HSM2mAsk(
case HSM2_MOD_NSUBPSTI3: case HSM2_MOD_NSUBPSTI3:
value->rValue = model->HSM2_nsubpsti3; value->rValue = model->HSM2_nsubpsti3;
return(OK); return(OK);
case HSM2_MOD_NSUBCSTI1:
value->rValue = model->HSM2_nsubcsti1;
return(OK);
case HSM2_MOD_NSUBCSTI2:
value->rValue = model->HSM2_nsubcsti2;
return(OK);
case HSM2_MOD_NSUBCSTI3:
value->rValue = model->HSM2_nsubcsti3;
return(OK);
case HSM2_MOD_LPEXT: case HSM2_MOD_LPEXT:
value->rValue = model->HSM2_lpext; value->rValue = model->HSM2_lpext;
return(OK); return(OK);
@ -657,6 +680,12 @@ int HSM2mAsk(
case HSM2_MOD_GIDL5: case HSM2_MOD_GIDL5:
value->rValue = model->HSM2_gidl5; value->rValue = model->HSM2_gidl5;
return(OK); return(OK);
case HSM2_MOD_GIDL6:
value->rValue = model->HSM2_gidl6;
return(OK);
case HSM2_MOD_GIDL7:
value->rValue = model->HSM2_gidl7;
return(OK);
case HSM2_MOD_GLEAK1: case HSM2_MOD_GLEAK1:
value->rValue = model->HSM2_gleak1; value->rValue = model->HSM2_gleak1;
return(OK); return(OK);
@ -1011,6 +1040,15 @@ int HSM2mAsk(
case HSM2_MOD_LNSUBPSTI3: case HSM2_MOD_LNSUBPSTI3:
value->rValue = model->HSM2_lnsubpsti3; value->rValue = model->HSM2_lnsubpsti3;
return(OK); return(OK);
case HSM2_MOD_LNSUBCSTI1:
value->rValue = model->HSM2_lnsubcsti1;
return(OK);
case HSM2_MOD_LNSUBCSTI2:
value->rValue = model->HSM2_lnsubcsti2;
return(OK);
case HSM2_MOD_LNSUBCSTI3:
value->rValue = model->HSM2_lnsubcsti3;
return(OK);
case HSM2_MOD_LCGSO: case HSM2_MOD_LCGSO:
value->rValue = model->HSM2_lcgso; value->rValue = model->HSM2_lcgso;
return(OK); return(OK);
@ -1223,6 +1261,15 @@ int HSM2mAsk(
case HSM2_MOD_WNSUBPSTI3: case HSM2_MOD_WNSUBPSTI3:
value->rValue = model->HSM2_wnsubpsti3; value->rValue = model->HSM2_wnsubpsti3;
return(OK); return(OK);
case HSM2_MOD_WNSUBCSTI1:
value->rValue = model->HSM2_wnsubcsti1;
return(OK);
case HSM2_MOD_WNSUBCSTI2:
value->rValue = model->HSM2_wnsubcsti2;
return(OK);
case HSM2_MOD_WNSUBCSTI3:
value->rValue = model->HSM2_wnsubcsti3;
return(OK);
case HSM2_MOD_WCGSO: case HSM2_MOD_WCGSO:
value->rValue = model->HSM2_wcgso; value->rValue = model->HSM2_wcgso;
return(OK); return(OK);
@ -1435,6 +1482,15 @@ int HSM2mAsk(
case HSM2_MOD_PNSUBPSTI3: case HSM2_MOD_PNSUBPSTI3:
value->rValue = model->HSM2_pnsubpsti3; value->rValue = model->HSM2_pnsubpsti3;
return(OK); return(OK);
case HSM2_MOD_PNSUBCSTI1:
value->rValue = model->HSM2_pnsubcsti1;
return(OK);
case HSM2_MOD_PNSUBCSTI2:
value->rValue = model->HSM2_pnsubcsti2;
return(OK);
case HSM2_MOD_PNSUBCSTI3:
value->rValue = model->HSM2_pnsubcsti3;
return(OK);
case HSM2_MOD_PCGSO: case HSM2_MOD_PCGSO:
value->rValue = model->HSM2_pcgso; value->rValue = model->HSM2_pcgso;
return(OK); return(OK);

6
src/spicelib/devices/hisim2/hsm2mdel.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2mdel.c FILE : hsm2mdel.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &

78
src/spicelib/devices/hisim2/hsm2mpar.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2mpar.c FILE : hsm2mpar.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &
@ -134,6 +136,10 @@ int HSM2mParam(
mod->HSM2_coqovsm = value->iValue; mod->HSM2_coqovsm = value->iValue;
mod->HSM2_coqovsm_Given = TRUE; mod->HSM2_coqovsm_Given = TRUE;
break; break;
case HSM2_MOD_COERRREP:
mod->HSM2_coerrrep = value->iValue;
mod->HSM2_coerrrep_Given = TRUE;
break;
case HSM2_MOD_VMAX: case HSM2_MOD_VMAX:
mod->HSM2_vmax = value->rValue; mod->HSM2_vmax = value->rValue;
mod->HSM2_vmax_Given = TRUE; mod->HSM2_vmax_Given = TRUE;
@ -302,6 +308,14 @@ int HSM2mParam(
mod->HSM2_nsubc = value->rValue; mod->HSM2_nsubc = value->rValue;
mod->HSM2_nsubc_Given = TRUE; mod->HSM2_nsubc_Given = TRUE;
break; break;
case HSM2_MOD_VFBCL:
mod->HSM2_vfbcl = value->rValue;
mod->HSM2_vfbcl_Given = TRUE;
break;
case HSM2_MOD_VFBCLP:
mod->HSM2_vfbclp = value->rValue;
mod->HSM2_vfbclp_Given = TRUE;
break;
case HSM2_MOD_PARL2: case HSM2_MOD_PARL2:
mod->HSM2_parl2 = value->rValue; mod->HSM2_parl2 = value->rValue;
mod->HSM2_parl2_Given = TRUE; mod->HSM2_parl2_Given = TRUE;
@ -322,6 +336,10 @@ int HSM2mParam(
mod->HSM2_nsubpfac = value->rValue; mod->HSM2_nsubpfac = value->rValue;
mod->HSM2_nsubpfac_Given = TRUE; mod->HSM2_nsubpfac_Given = TRUE;
break; break;
case HSM2_MOD_NSUBPDLT:
mod->HSM2_nsubpdlt = value->rValue;
mod->HSM2_nsubpdlt_Given = TRUE;
break;
case HSM2_MOD_NSUBPW: case HSM2_MOD_NSUBPW:
mod->HSM2_nsubpw = value->rValue; mod->HSM2_nsubpw = value->rValue;
mod->HSM2_nsubpw_Given = TRUE; mod->HSM2_nsubpw_Given = TRUE;
@ -618,6 +636,18 @@ int HSM2mParam(
mod->HSM2_nsubpsti3 = value->rValue; mod->HSM2_nsubpsti3 = value->rValue;
mod->HSM2_nsubpsti3_Given = TRUE; mod->HSM2_nsubpsti3_Given = TRUE;
break; break;
case HSM2_MOD_NSUBCSTI1:
mod->HSM2_nsubcsti1 = value->rValue;
mod->HSM2_nsubcsti1_Given = TRUE;
break;
case HSM2_MOD_NSUBCSTI2:
mod->HSM2_nsubcsti2 = value->rValue;
mod->HSM2_nsubcsti2_Given = TRUE;
break;
case HSM2_MOD_NSUBCSTI3:
mod->HSM2_nsubcsti3 = value->rValue;
mod->HSM2_nsubcsti3_Given = TRUE;
break;
case HSM2_MOD_LPEXT: case HSM2_MOD_LPEXT:
mod->HSM2_lpext = value->rValue; mod->HSM2_lpext = value->rValue;
mod->HSM2_lpext_Given = TRUE; mod->HSM2_lpext_Given = TRUE;
@ -864,6 +894,14 @@ int HSM2mParam(
mod->HSM2_gidl5 = value->rValue; mod->HSM2_gidl5 = value->rValue;
mod->HSM2_gidl5_Given = TRUE; mod->HSM2_gidl5_Given = TRUE;
break; break;
case HSM2_MOD_GIDL6:
mod->HSM2_gidl6 = value->rValue;
mod->HSM2_gidl6_Given = TRUE;
break;
case HSM2_MOD_GIDL7:
mod->HSM2_gidl7 = value->rValue;
mod->HSM2_gidl7_Given = TRUE;
break;
case HSM2_MOD_GLEAK1: case HSM2_MOD_GLEAK1:
mod->HSM2_gleak1 = value->rValue; mod->HSM2_gleak1 = value->rValue;
mod->HSM2_gleak1_Given = TRUE; mod->HSM2_gleak1_Given = TRUE;
@ -1332,6 +1370,18 @@ int HSM2mParam(
mod->HSM2_lnsubpsti3 = value->rValue; mod->HSM2_lnsubpsti3 = value->rValue;
mod->HSM2_lnsubpsti3_Given = TRUE; mod->HSM2_lnsubpsti3_Given = TRUE;
break; break;
case HSM2_MOD_LNSUBCSTI1:
mod->HSM2_lnsubcsti1 = value->rValue;
mod->HSM2_lnsubcsti1_Given = TRUE;
break;
case HSM2_MOD_LNSUBCSTI2:
mod->HSM2_lnsubcsti2 = value->rValue;
mod->HSM2_lnsubcsti2_Given = TRUE;
break;
case HSM2_MOD_LNSUBCSTI3:
mod->HSM2_lnsubcsti3 = value->rValue;
mod->HSM2_lnsubcsti3_Given = TRUE;
break;
case HSM2_MOD_LCGSO: case HSM2_MOD_LCGSO:
mod->HSM2_lcgso = value->rValue; mod->HSM2_lcgso = value->rValue;
mod->HSM2_lcgso_Given = TRUE; mod->HSM2_lcgso_Given = TRUE;
@ -1614,6 +1664,18 @@ int HSM2mParam(
mod->HSM2_wnsubpsti3 = value->rValue; mod->HSM2_wnsubpsti3 = value->rValue;
mod->HSM2_wnsubpsti3_Given = TRUE; mod->HSM2_wnsubpsti3_Given = TRUE;
break; break;
case HSM2_MOD_WNSUBCSTI1:
mod->HSM2_wnsubcsti1 = value->rValue;
mod->HSM2_wnsubcsti1_Given = TRUE;
break;
case HSM2_MOD_WNSUBCSTI2:
mod->HSM2_wnsubcsti2 = value->rValue;
mod->HSM2_wnsubcsti2_Given = TRUE;
break;
case HSM2_MOD_WNSUBCSTI3:
mod->HSM2_wnsubcsti3 = value->rValue;
mod->HSM2_wnsubcsti3_Given = TRUE;
break;
case HSM2_MOD_WCGSO: case HSM2_MOD_WCGSO:
mod->HSM2_wcgso = value->rValue; mod->HSM2_wcgso = value->rValue;
mod->HSM2_wcgso_Given = TRUE; mod->HSM2_wcgso_Given = TRUE;
@ -1896,6 +1958,18 @@ int HSM2mParam(
mod->HSM2_pnsubpsti3 = value->rValue; mod->HSM2_pnsubpsti3 = value->rValue;
mod->HSM2_pnsubpsti3_Given = TRUE; mod->HSM2_pnsubpsti3_Given = TRUE;
break; break;
case HSM2_MOD_PNSUBCSTI1:
mod->HSM2_pnsubcsti1 = value->rValue;
mod->HSM2_pnsubcsti1_Given = TRUE;
break;
case HSM2_MOD_PNSUBCSTI2:
mod->HSM2_pnsubcsti2 = value->rValue;
mod->HSM2_pnsubcsti2_Given = TRUE;
break;
case HSM2_MOD_PNSUBCSTI3:
mod->HSM2_pnsubcsti3 = value->rValue;
mod->HSM2_pnsubcsti3_Given = TRUE;
break;
case HSM2_MOD_PCGSO: case HSM2_MOD_PCGSO:
mod->HSM2_pcgso = value->rValue; mod->HSM2_pcgso = value->rValue;
mod->HSM2_pcgso_Given = TRUE; mod->HSM2_pcgso_Given = TRUE;

27
src/spicelib/devices/hisim2/hsm2noi.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2noi.c FILE : hsm2noi.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &
@ -84,12 +86,13 @@ int HSM2noise (
(void) sprintf(name, "onoise.%s%s", (void) sprintf(name, "onoise.%s%s",
(char *)here->HSM2name, HSM2nNames[i]); (char *)here->HSM2name, HSM2nNames[i]);
data->namelist = data->namelist =
TREALLOC(IFuid, data->namelist, data->numPlots + 1);
(IFuid *) trealloc((char *) data->namelist,
((long unsigned int)data->numPlots + 1) * sizeof(IFuid));
if (!data->namelist) if (!data->namelist)
return(E_NOMEM); return(E_NOMEM);
SPfrontEnd->IFnewUid
(*(SPfrontEnd->IFnewUid))
(ckt, &(data->namelist[data->numPlots++]), (ckt, &(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER, NULL);
(IFuid) NULL, name, UID_OTHER, NULL);
} }
break; break;
case INT_NOIZ: case INT_NOIZ:
@ -97,22 +100,24 @@ int HSM2noise (
(void) sprintf(name, "onoise_total.%s%s", (void) sprintf(name, "onoise_total.%s%s",
(char *)here->HSM2name, HSM2nNames[i]); (char *)here->HSM2name, HSM2nNames[i]);
data->namelist = data->namelist =
TREALLOC(IFuid, data->namelist, data->numPlots + 1);
(IFuid *) trealloc((char *) data->namelist,
((long unsigned int)data->numPlots + 1) * sizeof(IFuid));
if (!data->namelist) if (!data->namelist)
return(E_NOMEM); return(E_NOMEM);
SPfrontEnd->IFnewUid
(*(SPfrontEnd->IFnewUid))
(ckt, &(data->namelist[data->numPlots++]), (ckt, &(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER, NULL);
(IFuid) NULL, name, UID_OTHER, NULL);
(void) sprintf(name, "inoise_total.%s%s", (void) sprintf(name, "inoise_total.%s%s",
(char *)here->HSM2name, HSM2nNames[i]); (char *)here->HSM2name, HSM2nNames[i]);
data->namelist = data->namelist =
TREALLOC(IFuid, data->namelist, data->numPlots + 1);
(IFuid *) trealloc((char *) data->namelist,
((long unsigned int)data->numPlots + 1) * sizeof(IFuid));
if (!data->namelist) if (!data->namelist)
return(E_NOMEM); return(E_NOMEM);
SPfrontEnd->IFnewUid
(*(SPfrontEnd->IFnewUid))
(ckt, &(data->namelist[data->numPlots++]), (ckt, &(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER, NULL);
(IFuid) NULL, name, UID_OTHER, NULL);
} }
break; break;
} }

6
src/spicelib/devices/hisim2/hsm2par.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2par.c FILE : hsm2par.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &

6
src/spicelib/devices/hisim2/hsm2pzld.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2pzld.c FILE : hsm2pzld.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &

335
src/spicelib/devices/hisim2/hsm2set.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2set.c FILE : hsm2set.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &
@ -23,6 +25,33 @@
#include "ngspice/suffix.h" #include "ngspice/suffix.h"
#define BINNING(param) pParam->HSM2_##param = model->HSM2_##param \
+ model->HSM2_l##param / Lbin + model->HSM2_w##param / Wbin \
+ model->HSM2_p##param / LWbin ;
#define RANGECHECK(param, min, max, pname) \
if ( model->HSM2_coerrrep && ((param) < (min) || (param) > (max)) ) { \
printf("warning: (%s = %g) range [%g , %g].\n", \
(pname), (param), (min), (max) ); \
}
#define RANGERESET(param, min, max, pname) \
if ( model->HSM2_coerrrep && ((param) > (max)) ) { \
printf("reset : (%s = %g to %g) range [%g , %g].\n", \
(pname), (param), (max), (min), (max) ); \
} \
if ( model->HSM2_coerrrep && ((param) < (min)) ) { \
printf("reset : (%s = %g to %g) range [%g , %g].\n", \
(pname), (param), (min), (min), (max) ); \
} \
if ( (param) < (min) ) { param = (min); } \
if ( (param) > (max) ) { param = (max); }
#define MINCHECK(param, min, pname) \
if ( model->HSM2_coerrrep && ((param) < (min)) ) { \
printf("warning: (%s = %g) range [%g , %g].\n", \
(pname), (param), (min), (min) ); \
}
int HSM2setup( int HSM2setup(
register SMPmatrix *matrix, register SMPmatrix *matrix,
register GENmodel *inModel, register GENmodel *inModel,
@ -36,6 +65,11 @@ int HSM2setup(
register HSM2instance *here; register HSM2instance *here;
int error; int error;
CKTnode *tmp; CKTnode *tmp;
HSM2binningParam *pParam ;
HSM2modelMKSParam *modelMKS ;
HSM2hereMKSParam *hereMKS ;
double Lgate =0.0, LG =0.0, Wgate =0.0, WG=0.0 ;
double Lbin=0.0, Wbin=0.0, LWbin =0.0; /* binning */
/* loop through all the HSM2 device models */ /* loop through all the HSM2 device models */
for ( ;model != NULL ;model = model->HSM2nextModel ) { for ( ;model != NULL ;model = model->HSM2nextModel ) {
@ -48,13 +82,13 @@ int HSM2setup(
model->HSM2_noise = 1; /* allways noise is set to be 1 */ model->HSM2_noise = 1; /* allways noise is set to be 1 */
if ( !model->HSM2_version_Given) { if ( !model->HSM2_version_Given) {
model->HSM2_version = 261; /* default 261 */
printf(" 261 is selected for VERSION. (default) \n");
model->HSM2_version = 270; /* default 270 */
printf(" 270 is selected for VERSION. (default) \n");
} else { } else {
if (model->HSM2_version != 261) {
model->HSM2_version = 261; /* default 261 */
printf(" 261 is only available for VERSION. \n");
printf(" 261 is selected for VERSION. (default) \n");
if (model->HSM2_version != 270) {
model->HSM2_version = 270; /* default 270 */
printf(" 270 is only available for VERSION. \n");
printf(" 270 is selected for VERSION. (default) \n");
} else { } else {
printf(" %d is selected for VERSION \n", (int)model->HSM2_version); printf(" %d is selected for VERSION \n", (int)model->HSM2_version);
} }
@ -83,6 +117,7 @@ int HSM2setup(
if ( !model->HSM2_corecip_Given ) model->HSM2_corecip = 1 ; if ( !model->HSM2_corecip_Given ) model->HSM2_corecip = 1 ;
if ( !model->HSM2_coqy_Given ) model->HSM2_coqy = 0 ; if ( !model->HSM2_coqy_Given ) model->HSM2_coqy = 0 ;
if ( !model->HSM2_coqovsm_Given ) model->HSM2_coqovsm = 1 ; if ( !model->HSM2_coqovsm_Given ) model->HSM2_coqovsm = 1 ;
if ( !model->HSM2_coerrrep_Given ) model->HSM2_coerrrep = 1 ;
if ( !model->HSM2_vmax_Given ) model->HSM2_vmax = 1.0e7 ; if ( !model->HSM2_vmax_Given ) model->HSM2_vmax = 1.0e7 ;
@ -126,11 +161,14 @@ int HSM2setup(
if ( !model->HSM2_vfbc_Given ) model->HSM2_vfbc = -1.0 ; if ( !model->HSM2_vfbc_Given ) model->HSM2_vfbc = -1.0 ;
if ( !model->HSM2_vbi_Given ) model->HSM2_vbi = 1.1 ; if ( !model->HSM2_vbi_Given ) model->HSM2_vbi = 1.1 ;
if ( !model->HSM2_nsubc_Given ) model->HSM2_nsubc = 5.0e17 ; if ( !model->HSM2_nsubc_Given ) model->HSM2_nsubc = 5.0e17 ;
if ( !model->HSM2_vfbcl_Given ) model->HSM2_vfbcl = 0 ;
if ( !model->HSM2_vfbclp_Given ) model->HSM2_vfbclp = 1 ;
if ( !model->HSM2_parl2_Given ) model->HSM2_parl2 = 10.0e-9 ; if ( !model->HSM2_parl2_Given ) model->HSM2_parl2 = 10.0e-9 ;
if ( !model->HSM2_lp_Given ) model->HSM2_lp = 15.0e-9 ; if ( !model->HSM2_lp_Given ) model->HSM2_lp = 15.0e-9 ;
if ( !model->HSM2_nsubp_Given ) model->HSM2_nsubp = 1.0e18 ; if ( !model->HSM2_nsubp_Given ) model->HSM2_nsubp = 1.0e18 ;
if ( !model->HSM2_nsubpl_Given ) model->HSM2_nsubpl = 0.001 ; /* um */ if ( !model->HSM2_nsubpl_Given ) model->HSM2_nsubpl = 0.001 ; /* um */
if ( !model->HSM2_nsubpfac_Given ) model->HSM2_nsubpfac = 1.0 ; if ( !model->HSM2_nsubpfac_Given ) model->HSM2_nsubpfac = 1.0 ;
if ( !model->HSM2_nsubpdlt_Given ) model->HSM2_nsubpdlt = 0.01 ;
if ( !model->HSM2_nsubpw_Given ) model->HSM2_nsubpw = 0.0 ; if ( !model->HSM2_nsubpw_Given ) model->HSM2_nsubpw = 0.0 ;
if ( !model->HSM2_nsubpwp_Given ) model->HSM2_nsubpwp = 1.0 ; if ( !model->HSM2_nsubpwp_Given ) model->HSM2_nsubpwp = 1.0 ;
@ -222,6 +260,9 @@ int HSM2setup(
if ( !model->HSM2_nsubpsti1_Given ) model->HSM2_nsubpsti1 = 0.0 ; if ( !model->HSM2_nsubpsti1_Given ) model->HSM2_nsubpsti1 = 0.0 ;
if ( !model->HSM2_nsubpsti2_Given ) model->HSM2_nsubpsti2 = 0.0 ; if ( !model->HSM2_nsubpsti2_Given ) model->HSM2_nsubpsti2 = 0.0 ;
if ( !model->HSM2_nsubpsti3_Given ) model->HSM2_nsubpsti3 = 1.0 ; if ( !model->HSM2_nsubpsti3_Given ) model->HSM2_nsubpsti3 = 1.0 ;
if ( !model->HSM2_nsubcsti1_Given ) model->HSM2_nsubcsti1 = 0.0 ;
if ( !model->HSM2_nsubcsti2_Given ) model->HSM2_nsubcsti2 = 0.0 ;
if ( !model->HSM2_nsubcsti3_Given ) model->HSM2_nsubcsti3 = 1.0 ;
if ( !model->HSM2_lpext_Given ) model->HSM2_lpext = 1.0e-50 ; if ( !model->HSM2_lpext_Given ) model->HSM2_lpext = 1.0e-50 ;
if ( !model->HSM2_npext_Given ) model->HSM2_npext = 5.0e17 ; if ( !model->HSM2_npext_Given ) model->HSM2_npext = 5.0e17 ;
@ -288,6 +329,8 @@ int HSM2setup(
if ( !model->HSM2_gidl3_Given ) model->HSM2_gidl3 = 0.9e0 ; if ( !model->HSM2_gidl3_Given ) model->HSM2_gidl3 = 0.9e0 ;
if ( !model->HSM2_gidl4_Given ) model->HSM2_gidl4 = 0.0 ; if ( !model->HSM2_gidl4_Given ) model->HSM2_gidl4 = 0.0 ;
if ( !model->HSM2_gidl5_Given ) model->HSM2_gidl5 = 0.2e0 ; if ( !model->HSM2_gidl5_Given ) model->HSM2_gidl5 = 0.2e0 ;
if ( !model->HSM2_gidl6_Given ) model->HSM2_gidl6 = 0 ;
if ( !model->HSM2_gidl7_Given ) model->HSM2_gidl7 = 1 ;
if ( !model->HSM2_gleak1_Given ) model->HSM2_gleak1 = 50e0 ; if ( !model->HSM2_gleak1_Given ) model->HSM2_gleak1 = 50e0 ;
if ( !model->HSM2_gleak2_Given ) model->HSM2_gleak2 = 10e6 ; if ( !model->HSM2_gleak2_Given ) model->HSM2_gleak2 = 10e6 ;
@ -421,6 +464,9 @@ int HSM2setup(
if ( !model->HSM2_lnsubpsti1_Given ) model->HSM2_lnsubpsti1 = 0.0 ; if ( !model->HSM2_lnsubpsti1_Given ) model->HSM2_lnsubpsti1 = 0.0 ;
if ( !model->HSM2_lnsubpsti2_Given ) model->HSM2_lnsubpsti2 = 0.0 ; if ( !model->HSM2_lnsubpsti2_Given ) model->HSM2_lnsubpsti2 = 0.0 ;
if ( !model->HSM2_lnsubpsti3_Given ) model->HSM2_lnsubpsti3 = 0.0 ; if ( !model->HSM2_lnsubpsti3_Given ) model->HSM2_lnsubpsti3 = 0.0 ;
if ( !model->HSM2_lnsubcsti1_Given ) model->HSM2_lnsubcsti1 = 0.0 ;
if ( !model->HSM2_lnsubcsti2_Given ) model->HSM2_lnsubcsti2 = 0.0 ;
if ( !model->HSM2_lnsubcsti3_Given ) model->HSM2_lnsubcsti3 = 0.0 ;
if ( !model->HSM2_lcgso_Given ) model->HSM2_lcgso = 0.0 ; if ( !model->HSM2_lcgso_Given ) model->HSM2_lcgso = 0.0 ;
if ( !model->HSM2_lcgdo_Given ) model->HSM2_lcgdo = 0.0 ; if ( !model->HSM2_lcgdo_Given ) model->HSM2_lcgdo = 0.0 ;
if ( !model->HSM2_ljs0_Given ) model->HSM2_ljs0 = 0.0 ; if ( !model->HSM2_ljs0_Given ) model->HSM2_ljs0 = 0.0 ;
@ -492,6 +538,9 @@ int HSM2setup(
if ( !model->HSM2_wnsubpsti1_Given ) model->HSM2_wnsubpsti1 = 0.0 ; if ( !model->HSM2_wnsubpsti1_Given ) model->HSM2_wnsubpsti1 = 0.0 ;
if ( !model->HSM2_wnsubpsti2_Given ) model->HSM2_wnsubpsti2 = 0.0 ; if ( !model->HSM2_wnsubpsti2_Given ) model->HSM2_wnsubpsti2 = 0.0 ;
if ( !model->HSM2_wnsubpsti3_Given ) model->HSM2_wnsubpsti3 = 0.0 ; if ( !model->HSM2_wnsubpsti3_Given ) model->HSM2_wnsubpsti3 = 0.0 ;
if ( !model->HSM2_wnsubcsti1_Given ) model->HSM2_wnsubcsti1 = 0.0 ;
if ( !model->HSM2_wnsubcsti2_Given ) model->HSM2_wnsubcsti2 = 0.0 ;
if ( !model->HSM2_wnsubcsti3_Given ) model->HSM2_wnsubcsti3 = 0.0 ;
if ( !model->HSM2_wcgso_Given ) model->HSM2_wcgso = 0.0 ; if ( !model->HSM2_wcgso_Given ) model->HSM2_wcgso = 0.0 ;
if ( !model->HSM2_wcgdo_Given ) model->HSM2_wcgdo = 0.0 ; if ( !model->HSM2_wcgdo_Given ) model->HSM2_wcgdo = 0.0 ;
if ( !model->HSM2_wjs0_Given ) model->HSM2_wjs0 = 0.0 ; if ( !model->HSM2_wjs0_Given ) model->HSM2_wjs0 = 0.0 ;
@ -563,6 +612,9 @@ int HSM2setup(
if ( !model->HSM2_pnsubpsti1_Given ) model->HSM2_pnsubpsti1 = 0.0 ; if ( !model->HSM2_pnsubpsti1_Given ) model->HSM2_pnsubpsti1 = 0.0 ;
if ( !model->HSM2_pnsubpsti2_Given ) model->HSM2_pnsubpsti2 = 0.0 ; if ( !model->HSM2_pnsubpsti2_Given ) model->HSM2_pnsubpsti2 = 0.0 ;
if ( !model->HSM2_pnsubpsti3_Given ) model->HSM2_pnsubpsti3 = 0.0 ; if ( !model->HSM2_pnsubpsti3_Given ) model->HSM2_pnsubpsti3 = 0.0 ;
if ( !model->HSM2_pnsubcsti1_Given ) model->HSM2_pnsubcsti1 = 0.0 ;
if ( !model->HSM2_pnsubcsti2_Given ) model->HSM2_pnsubcsti2 = 0.0 ;
if ( !model->HSM2_pnsubcsti3_Given ) model->HSM2_pnsubcsti3 = 0.0 ;
if ( !model->HSM2_pcgso_Given ) model->HSM2_pcgso = 0.0 ; if ( !model->HSM2_pcgso_Given ) model->HSM2_pcgso = 0.0 ;
if ( !model->HSM2_pcgdo_Given ) model->HSM2_pcgdo = 0.0 ; if ( !model->HSM2_pcgdo_Given ) model->HSM2_pcgdo = 0.0 ;
if ( !model->HSM2_pjs0_Given ) model->HSM2_pjs0 = 0.0 ; if ( !model->HSM2_pjs0_Given ) model->HSM2_pjs0 = 0.0 ;
@ -593,11 +645,11 @@ int HSM2setup(
if ( model->HSM2_corecip == 1 ){ if ( model->HSM2_corecip == 1 ){
model->HSM2_sc2 = 0.0 ; model->HSM2_lsc2 = 0.0 ; model->HSM2_wsc2 = 0.0 ; model->HSM2_psc2 = 0.0 ; model->HSM2_sc2 = 0.0 ; model->HSM2_lsc2 = 0.0 ; model->HSM2_wsc2 = 0.0 ; model->HSM2_psc2 = 0.0 ;
model->HSM2_scp2 = 0.0 ; model->HSM2_lscp2 = 0.0 ; model->HSM2_wscp2 = 0.0 ; model->HSM2_pscp2 = 0.0 ; model->HSM2_scp2 = 0.0 ; model->HSM2_lscp2 = 0.0 ; model->HSM2_wscp2 = 0.0 ; model->HSM2_pscp2 = 0.0 ;
model->HSM2_sc4 = 0.0 ;
model->HSM2_sc4 = 0.0 ; model->HSM2_lsc4 = 0.0 ; model->HSM2_wsc4 = 0.0 ; model->HSM2_psc4 = 0.0 ;
model->HSM2_coqy = 0 ; model->HSM2_coqy = 0 ;
} }
modelMKS = &model->modelMKS ;
/* loop through all the instances of the model */ /* loop through all the instances of the model */
for ( here = model->HSM2instances ;here != NULL ; for ( here = model->HSM2instances ;here != NULL ;
@ -609,6 +661,7 @@ int HSM2setup(
else else
*states += HSM2numStates; *states += HSM2numStates;
hereMKS = &here->hereMKS ;
/* perform the parameter defaulting */ /* perform the parameter defaulting */
if ( !here->HSM2_l_Given ) here->HSM2_l = 5.0e-6 ; if ( !here->HSM2_l_Given ) here->HSM2_l = 5.0e-6 ;
if ( !here->HSM2_w_Given ) here->HSM2_w = 5.0e-6 ; if ( !here->HSM2_w_Given ) here->HSM2_w = 5.0e-6 ;
@ -636,6 +689,7 @@ int HSM2setup(
here->HSM2_corbnet = model->HSM2_corbnet ; here->HSM2_corbnet = model->HSM2_corbnet ;
else if ( here->HSM2_corbnet != 0 && here->HSM2_corbnet != 1 ) { else if ( here->HSM2_corbnet != 0 && here->HSM2_corbnet != 1 ) {
here->HSM2_corbnet = model->HSM2_corbnet ; here->HSM2_corbnet = model->HSM2_corbnet ;
if(model->HSM2_coerrrep)
printf("warning(HiSIM2): CORBNET has been set to its default value: %d.\n", here->HSM2_corbnet); printf("warning(HiSIM2): CORBNET has been set to its default value: %d.\n", here->HSM2_corbnet);
} }
if ( !here->HSM2_rbdb_Given) here->HSM2_rbdb = model->HSM2_rbdb; /* in ohm */ if ( !here->HSM2_rbdb_Given) here->HSM2_rbdb = model->HSM2_rbdb; /* in ohm */
@ -648,6 +702,7 @@ int HSM2setup(
here->HSM2_corg = model->HSM2_corg ; here->HSM2_corg = model->HSM2_corg ;
else if ( here->HSM2_corg != 0 && here->HSM2_corg != 1 ) { else if ( here->HSM2_corg != 0 && here->HSM2_corg != 1 ) {
here->HSM2_corg = model->HSM2_corg ; here->HSM2_corg = model->HSM2_corg ;
if(model->HSM2_coerrrep)
printf("warning(HiSIM2): CORG has been set to its default value: %d.\n", here->HSM2_corg); printf("warning(HiSIM2): CORG has been set to its default value: %d.\n", here->HSM2_corg);
} }
@ -781,8 +836,266 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
TSTALLOC(HSM2BbPtr, HSM2bNode, HSM2bNode); TSTALLOC(HSM2BbPtr, HSM2bNode, HSM2bNode);
} }
/*-----------------------------------------------------------*
* Range check of instance parameters
*-----------------*/
RANGECHECK(here->HSM2_l, model->HSM2_lmin, model->HSM2_lmax, "L") ;
RANGECHECK(here->HSM2_w/here->HSM2_nf, model->HSM2_wmin, model->HSM2_wmax, "W/NF") ;
RANGECHECK(here->HSM2_mphdfm, -3.0, 3.0, "MPHDFM") ;
/*-----------------------------------------------------------*
* Change unit into Kelvin.
*-----------------*/
here->HSM2_ktemp = here->HSM2_temp + 273.15 ; /* [C] -> [K] */
here->HSM2_lgate = Lgate = here->HSM2_l + model->HSM2_xl ;
Wgate = here->HSM2_w / here->HSM2_nf + model->HSM2_xw ;
LG = Lgate * C_m2um ;
here->HSM2_wg = WG = Wgate * C_m2um ;
/* binning calculation */
pParam = &here->pParam ;
Lbin = pow(LG, model->HSM2_lbinn) ;
Wbin = pow(WG, model->HSM2_wbinn) ;
LWbin = Lbin * Wbin ;
BINNING(vmax)
BINNING(bgtmp1)
BINNING(bgtmp2)
BINNING(eg0)
BINNING(lover)
BINNING(vfbover)
BINNING(nover)
BINNING(wl2)
BINNING(vfbc)
BINNING(nsubc)
BINNING(nsubp)
BINNING(scp1)
BINNING(scp2)
BINNING(scp3)
BINNING(sc1)
BINNING(sc2)
BINNING(sc3)
BINNING(sc4)
BINNING(pgd1)
BINNING(ndep)
BINNING(ninv)
BINNING(muecb0)
BINNING(muecb1)
BINNING(mueph1)
BINNING(vtmp)
BINNING(wvth0)
BINNING(muesr1)
BINNING(muetmp)
BINNING(sub1)
BINNING(sub2)
BINNING(svds)
BINNING(svbs)
BINNING(svgs)
BINNING(nsti)
BINNING(wsti)
BINNING(scsti1)
BINNING(scsti2)
BINNING(vthsti)
BINNING(muesti1)
BINNING(muesti2)
BINNING(muesti3)
BINNING(nsubpsti1)
BINNING(nsubpsti2)
BINNING(nsubpsti3)
BINNING(nsubcsti1)
BINNING(nsubcsti2)
BINNING(nsubcsti3)
BINNING(cgso)
BINNING(cgdo)
BINNING(js0)
BINNING(js0sw)
BINNING(nj)
BINNING(cisbk)
BINNING(clm1)
BINNING(clm2)
BINNING(clm3)
BINNING(wfc)
BINNING(gidl1)
BINNING(gidl2)
BINNING(gleak1)
BINNING(gleak2)
BINNING(gleak3)
BINNING(gleak6)
BINNING(glksd1)
BINNING(glksd2)
BINNING(glkb1)
BINNING(glkb2)
BINNING(nftrp)
BINNING(nfalp)
BINNING(vdiffj)
BINNING(ibpc1)
BINNING(ibpc2)
/*-----------------------------------------------------------*
* Range check of binning parameters
*-----------------*/
RANGECHECK(pParam->HSM2_vmax, 1.0e5, 20.0e6, "VMAX") ;
RANGECHECK(pParam->HSM2_bgtmp1, 50.0e-6, 1.0e-3, "BGTMP1") ;
RANGECHECK(pParam->HSM2_bgtmp2, -1.0e-6, 1.0e-6, "BGTMP2") ;
RANGECHECK(pParam->HSM2_eg0, 1.0, 1.3, "EG0") ;
RANGECHECK(pParam->HSM2_vfbc, -1.2, -0.8, "VFBC") ;
RANGECHECK(pParam->HSM2_vfbover, -0.2, 0.2, "VFBOVER") ;
RANGECHECK(pParam->HSM2_nsubc, 1.0e16, 1.0e19, "NSUBC") ;
RANGECHECK(pParam->HSM2_nsubp, 1.0e16, 1.0e19, "NSUBP") ;
RANGECHECK(pParam->HSM2_scp1, 0.0, 20.0, "SCP1") ;
RANGECHECK(pParam->HSM2_scp2, 0.0, 2.0, "SCP2") ;
RANGECHECK(pParam->HSM2_scp3, 0.0, 100.0e-9, "SCP3") ;
RANGECHECK(pParam->HSM2_sc1, 0.0, 20.0, "SC1") ;
RANGECHECK(pParam->HSM2_sc2, 0.0, 2.0, "SC2") ;
RANGECHECK(pParam->HSM2_sc3, 0.0, 200.0e-9, "SC3") ;
RANGECHECK(pParam->HSM2_pgd1, 0.0, 50.0e-3, "PGD1") ;
RANGECHECK(pParam->HSM2_ndep, 0.0, 1.0, "NDEP") ;
RANGECHECK(pParam->HSM2_ninv, 0.0, 1.0, "NINV") ;
RANGECHECK(pParam->HSM2_muecb0, 100.0, 100.0e3, "MUECB0") ;
RANGECHECK(pParam->HSM2_muecb1, 5.0, 1.0e4, "MUECB1") ;
RANGECHECK(pParam->HSM2_mueph1, 2.0e3, 35.0e3, "MUEPH1") ;
RANGECHECK(pParam->HSM2_vtmp, -5.0, 1.0, "VTMP") ;
RANGECHECK(pParam->HSM2_muesr1, 1.0e13, 1.0e16, "MUESR1") ;
RANGECHECK(pParam->HSM2_muetmp, 0.5, 2.0, "MUETMP") ;
RANGECHECK(pParam->HSM2_clm1, 0.5, 1.0, "CLM1") ;
RANGECHECK(pParam->HSM2_clm2, 1.0, 4.0, "CLM2") ;
RANGECHECK(pParam->HSM2_clm3, 0.5, 5.0, "CLM3") ;
RANGECHECK(pParam->HSM2_wfc, -5.0e-15, 1.0e-6, "WFC") ;
RANGECHECK(pParam->HSM2_cgso, 0.0, 100e-9 * 100*C_VAC*model->HSM2_kappa/model->HSM2_tox*C_m2cm, "CGSO") ;
RANGECHECK(pParam->HSM2_cgdo, 0.0, 100e-9 * 100*C_VAC*model->HSM2_kappa/model->HSM2_tox*C_m2cm, "CGDO") ;
RANGECHECK(pParam->HSM2_ibpc1, 0.0, 1.0e12, "IBPC1") ;
RANGECHECK(pParam->HSM2_ibpc2, 0.0, 1.0e12, "IBPC2") ;
RANGECHECK(pParam->HSM2_nsti, 1.0e16, 1.0e19, "NSTI") ;
/*-----------------------------------------------------------*
* Lg dependence of binning parameters
*-----------------*/
/* Vfbc */
pParam->HSM2_vfbc = pParam->HSM2_vfbc
* (1.0e0 + (model->HSM2_vfbcl / pow (LG, model->HSM2_vfbclp))) ;
/*-----------------------------------------------------------*
* Conversion to MKS unit for instance parameters.
*-----------------*/
hereMKS->HSM2_nsubcdfm = here->HSM2_nsubcdfm / C_cm2m_p3 ;
pParam->HSM2_nsubc = pParam->HSM2_nsubc / C_cm2m_p3 ;
pParam->HSM2_nsubp = pParam->HSM2_nsubp / C_cm2m_p3 ;
pParam->HSM2_nsti = pParam->HSM2_nsti / C_cm2m_p3 ;
pParam->HSM2_nover = pParam->HSM2_nover / C_cm2m_p3 ;
pParam->HSM2_nsubpsti1 = pParam->HSM2_nsubpsti1 / C_m2cm ;
pParam->HSM2_nsubcsti1 = pParam->HSM2_nsubcsti1 / C_m2cm ;
pParam->HSM2_muesti1 = pParam->HSM2_muesti1 / C_m2cm ;
pParam->HSM2_ndep = pParam->HSM2_ndep / C_m2cm ;
pParam->HSM2_ninv = pParam->HSM2_ninv / C_m2cm ;
pParam->HSM2_vmax = pParam->HSM2_vmax / C_m2cm ;
pParam->HSM2_wfc = pParam->HSM2_wfc * C_m2cm_p2 ;
pParam->HSM2_glksd1 = pParam->HSM2_glksd1 / C_m2cm ;
pParam->HSM2_glksd2 = pParam->HSM2_glksd2 * C_m2cm ;
pParam->HSM2_gleak2 = pParam->HSM2_gleak2 * C_m2cm ;
pParam->HSM2_glkb2 = pParam->HSM2_glkb2 * C_m2cm ;
pParam->HSM2_gidl1 = pParam->HSM2_gidl1 / C_m2cm_p1o2 ;
pParam->HSM2_gidl2 = pParam->HSM2_gidl2 * C_m2cm ;
pParam->HSM2_nfalp = pParam->HSM2_nfalp / C_m2cm ;
pParam->HSM2_nftrp = pParam->HSM2_nftrp * C_m2cm_p2 ;
} /* End of instance */
/*-----------------------------------------------------------*
* Range check of model parameters
*-----------------*/
MINCHECK (model->HSM2_tox, 0.0, "TOX") ;
RANGECHECK(model->HSM2_xld, 0.0, 50.0e-9, "XLD") ;
RANGECHECK(model->HSM2_xwd, -10.0e-9, 100.0e-9, "XWD") ;
RANGECHECK(model->HSM2_rsh, 0.0, 1.0e-3, "RSH") ;
RANGECHECK(model->HSM2_rshg, 0.0, 100.0, "RSHG") ;
RANGECHECK(model->HSM2_xqy, 10.0e-9, 50.0e-9, "XQY") ;
RANGECHECK(model->HSM2_rs, 0.0, 10.0e-3, "RS") ;
RANGECHECK(model->HSM2_rd, 0.0, 10.0e-3, "RD") ;
RANGECHECK(model->HSM2_vbi, 1.0, 1.2, "VBI") ;
RANGECHECK(model->HSM2_parl2, 0.0, 50.0e-9, "PARL2") ;
RANGECHECK(model->HSM2_lp, 0.0, 300.0e-9, "LP") ;
RANGECHECK(model->HSM2_pgd2, 0.0, 1.5, "PGD2") ;
RANGECHECK(model->HSM2_pgd4, 0.0, 3.0, "PGD4") ;
RANGECHECK(model->HSM2_muecb0lp, 0.0, 2.0, "MUECB0LP") ;
RANGECHECK(model->HSM2_muecb1lp, 0.0, 2.0, "MUECB1LP") ;
RANGECHECK(model->HSM2_mueph0, 0.25, 0.35, "MUEPH0") ;
RANGECHECK(model->HSM2_muesr0, 1.8, 2.2, "MUESR0") ;
RANGECHECK(model->HSM2_lpext, 1.0e-50, 10.0e-6, "LPEXT") ;
RANGECHECK(model->HSM2_npext, 1.0e16, 1.0e18, "NPEXT") ;
RANGECHECK(model->HSM2_scp21, 0.0, 5.0, "SCP21") ;
RANGECHECK(model->HSM2_scp22, 0.0, 0.0, "SCP22") ;
RANGECHECK(model->HSM2_bs1, 0.0, 50.0e-3, "BS1") ;
RANGECHECK(model->HSM2_bs2, 0.5, 1.0, "BS2") ;
MINCHECK (model->HSM2_cgbo, 0.0, "CGBO") ;
RANGECHECK(model->HSM2_clm5, 0.0, 2.0, "CLM5") ;
RANGECHECK(model->HSM2_clm6, 0.0, 20.0, "CLM6") ;
RANGECHECK(model->HSM2_vover, 0.0, 50.0, "VOVER") ;
RANGECHECK(model->HSM2_voverp, 0.0, 2.0, "VOVERP") ;
RANGECHECK(model->HSM2_qme1, 0.0, 300.0e-9, "QME1") ;
RANGECHECK(model->HSM2_qme3, 0.0,800.0e-12, "QME3") ;
RANGECHECK(model->HSM2_tnom, 22.0, 32.0, "TNOM") ;
RANGECHECK(model->HSM2_ddltmax, 1.0, 20.0, "DDLTMAX") ;
RANGECHECK(model->HSM2_ddltict, -3.0, 20.0, "DDLTICT") ;
RANGECHECK(model->HSM2_ddltslp, 0.0, 20.0, "DDLTSLP") ;
RANGECHECK(model->HSM2_cvb, -0.1, 0.2, "CVB") ;
RANGECHECK(model->HSM2_cvbk, -0.1, 0.2, "CVBK") ;
RANGECHECK(model->HSM2_byptol, 0.0, 1.0, "BYPTOL") ;
RANGECHECK(model->HSM2_sc3Vbs, -3.0, 0.0, "SC3VBS") ;
RANGERESET(model->HSM2_nsubpfac, 0.2, 1.0, "NSUBPFAC") ;
RANGERESET(model->HSM2_nsubpdlt, 1E-50, 0.1, "NSUBPDLT") ;
/*-----------------------------------------------------------*
* Conversion to MKS unit for model parameters.
*-----------------*/
modelMKS->HSM2_npext = model->HSM2_npext / C_cm2m_p3 ;
modelMKS->HSM2_nsubcwpe = model->HSM2_nsubcwpe / C_cm2m_p3 ;
modelMKS->HSM2_nsubpwpe = model->HSM2_nsubpwpe / C_cm2m_p3 ;
modelMKS->HSM2_npextwpe = model->HSM2_npextwpe / C_cm2m_p3 ;
modelMKS->HSM2_ll = model->HSM2_ll / pow( C_m2cm , model->HSM2_lln ) ;
modelMKS->HSM2_wl = model->HSM2_wl / pow( C_m2cm , model->HSM2_wln ) ;
modelMKS->HSM2_svgsl = model->HSM2_svgsl / pow( C_m2cm , model->HSM2_svgslp ) ;
modelMKS->HSM2_svgsw = model->HSM2_svgsw / pow( C_m2cm , model->HSM2_svgswp ) ;
modelMKS->HSM2_svbsl = model->HSM2_svbsl / pow( C_m2cm , model->HSM2_svbslp ) ;
modelMKS->HSM2_slgl = model->HSM2_slgl / pow( C_m2cm , model->HSM2_slglp ) ;
modelMKS->HSM2_sub1l = model->HSM2_sub1l / pow( C_m2cm , model->HSM2_sub1lp ) ;
modelMKS->HSM2_slg = model->HSM2_slg / C_m2cm ;
modelMKS->HSM2_sub2l = model->HSM2_sub2l / C_m2cm ;
modelMKS->HSM2_nsubcmax = model->HSM2_nsubcmax / C_cm2m_p3 ;
modelMKS->HSM2_glksd3 = model->HSM2_glksd3 * C_m2cm ;
modelMKS->HSM2_gleak2 = model->HSM2_gleak2 * C_m2cm ;
modelMKS->HSM2_gleak4 = model->HSM2_gleak4 * C_m2cm ;
modelMKS->HSM2_gleak5 = model->HSM2_gleak5 * C_m2cm ;
modelMKS->HSM2_gleak7 = model->HSM2_gleak7 / C_m2cm_p2 ;
modelMKS->HSM2_cit = model->HSM2_cit * C_m2cm_p2 ;
modelMKS->HSM2_ovslp = model->HSM2_ovslp / C_m2cm ;
modelMKS->HSM2_dly3 = model->HSM2_dly3 / C_m2cm_p2 ;
/*-----------------------------------------------------------*
* Change unit into Kelvin.
*-----------------*/
model->HSM2_ktnom = model->HSM2_tnom + 273.15 ; /* [C] -> [K] */
/* SourceSatCurrent = 1.0e-14 */
/* DrainSatCurrent = 1.0e-14 */
model->HSM2_vcrit = CONSTvt0 * log( CONSTvt0 / (CONSTroot2 * 1.0e-14) ) ;
/* Quantum Mechanical Effect */
if ( ( model->HSM2_qme1 == 0.0 && model->HSM2_qme3 == 0.0 ) || model->HSM2_qme2 == 0.0 ) {
model->HSM2_flg_qme = 0 ;
} else {
model->HSM2_flg_qme = 1 ;
model->HSM2_qme12 = model->HSM2_qme1 / ( model->HSM2_qme2 * model->HSM2_qme2 ) ;
} }
}
} /* End of model */
return(OK); return(OK);
} }

450
src/spicelib/devices/hisim2/hsm2temp.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2temp.c FILE : hsm2temp.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &
@ -22,17 +24,16 @@
#include "ngspice/sperror.h" #include "ngspice/sperror.h"
#include "ngspice/suffix.h" #include "ngspice/suffix.h"
#define BINNING(param) pParam->HSM2_##param = model->HSM2_##param \
+ model->HSM2_l##param / Lbin + model->HSM2_w##param / Wbin \
+ model->HSM2_p##param / LWbin ;
#define Nsubmin (1e15 / C_cm2m_p3)
#define Nsubmin_dlt (0.01 / C_cm2m_p3)
#define lpext_dlt (1e-8 / C_m2cm)
#define RANGECHECK(param, min, max, pname) \
if ( (param) < (min) || (param) > (max) ) { \
printf("warning(HiSIM2): The model/instance parameter %s (= %e) must be in the range [%e , %e].\n", \
(pname), (param), (min), (max) ); \
#define RANGECHECK(param, min, max, pname) \
if ( model->HSM2_coerrrep && ((param) < (min) || (param) > (max)) ) { \
printf("warning: (%s = %g) range [%g , %g].\n", \
(pname), (param), (min), (max) ); \
} }
/*---------------------------------------------------* /*---------------------------------------------------*
* smoothZero: flooring to zero. * smoothZero: flooring to zero.
* y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) ) * y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) )
@ -41,19 +42,21 @@
#define Fn_SZtemp( y , x , delta ) { \ #define Fn_SZtemp( y , x , delta ) { \
T1 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta) ) ; \ T1 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta) ) ; \
y = 0.5 * ( ( x ) + T1 ) ; \ y = 0.5 * ( ( x ) + T1 ) ; \
if (y < 0) \
y = 0 ; \
} }
#define Fn_SUtemp( y , x , xmax , delta ) { \ #define Fn_SUtemp( y , x , xmax , delta ) { \
T1 = ( xmax ) - ( x ) - ( delta ) ; \ T1 = ( xmax ) - ( x ) - ( delta ) ; \
T2 = sqrt ( T1 * T1 + 4.0 * ( xmax ) * ( delta) ) ; \
T2 = 4.0 * ( xmax ) * ( delta) ; \
T2 = T2 > 0.0 ? T2 : - ( T2 ) ; \
T2 = sqrt ( T1 * T1 + T2 ) ; \
y = ( xmax ) - 0.5 * ( T1 + T2 ) ; \ y = ( xmax ) - 0.5 * ( T1 + T2 ) ; \
} }
#define Fn_SLtemp( y , x , xmin , delta ) { \ #define Fn_SLtemp( y , x , xmin , delta ) { \
T1 = ( x ) - ( xmin ) - ( delta ) ; \ T1 = ( x ) - ( xmin ) - ( delta ) ; \
T2 = sqrt ( T1 * T1 + 4.0 * ( xmin ) * ( delta ) ) ; \
T2 = 4.0 * ( xmin ) * ( delta ) ; \
T2 = T2 > 0.0 ? T2 : - ( T2 ) ; \
T2 = sqrt ( T1 * T1 + T2 ) ; \
y = ( xmin ) + 0.5 * ( T1 + T2 ) ; \ y = ( xmin ) + 0.5 * ( T1 + T2 ) ; \
} }
@ -64,11 +67,10 @@ int HSM2temp(
register HSM2model *model = (HSM2model *)inModel ; register HSM2model *model = (HSM2model *)inModel ;
register HSM2instance *here ; register HSM2instance *here ;
HSM2binningParam *pParam ; HSM2binningParam *pParam ;
HSM2modelCGSParam *modelCGS ;
HSM2hereCGSParam *hereCGS ;
HSM2modelMKSParam *modelMKS ;
HSM2hereMKSParam *hereMKS ;
double mueph ; double mueph ;
double Leff, dL , LG, Weff, dW , WG , WL , Lgate , Wgate; double Leff, dL , LG, Weff, dW , WG , WL , Lgate , Wgate;
double Lbin, Wbin, LWbin ; /* binning */
double Nsubpp, Nsubps, Nsub, q_Nsub, Nsubb, Npext ; double Nsubpp, Nsubps, Nsub, q_Nsub, Nsubb, Npext ;
double Lod_half, Lod_half_ref ; double Lod_half, Lod_half_ref ;
double MUEPWD = 0.0 ; double MUEPWD = 0.0 ;
@ -90,269 +92,22 @@ int HSM2temp(
for ( ;model ;model = model->HSM2nextModel ) { for ( ;model ;model = model->HSM2nextModel ) {
modelCGS = &model->modelCGS ;
/*-----------------------------------------------------------*
* Range check of model parameters
*-----------------*/
if ( model->HSM2_tox <= 0 ) {
printf("warning(HiSIM2): TOX = %e\n ", model->HSM2_tox);
printf("warning(HiSIM2): The model parameter TOX must be positive.\n");
}
RANGECHECK(model->HSM2_xld, 0.0, 50.0e-9, "XLD") ;
RANGECHECK(model->HSM2_xwd, -10.0e-9, 100.0e-9, "XWD") ;
RANGECHECK(model->HSM2_rsh, 0.0, 1.0e-3, "RSH") ;
RANGECHECK(model->HSM2_rshg, 0.0, 100.0, "RSHG") ;
RANGECHECK(model->HSM2_xqy, 10.0e-9, 50.0e-9, "XQY") ;
RANGECHECK(model->HSM2_rs, 0.0, 10.0e-3, "RS") ;
RANGECHECK(model->HSM2_rd, 0.0, 10.0e-3, "RD") ;
RANGECHECK(model->HSM2_vbi, 1.0, 1.2, "VBI") ;
RANGECHECK(model->HSM2_parl2, 0.0, 50.0e-9, "PARL2") ;
RANGECHECK(model->HSM2_lp, 0.0, 300.0e-9, "LP") ;
RANGECHECK(model->HSM2_pgd2, 0.0, 1.5, "PGD2") ;
RANGECHECK(model->HSM2_pgd4, 0.0, 3.0, "PGD4") ;
RANGECHECK(model->HSM2_muecb0lp, 0.0, 2.0, "MUECB0LP") ;
RANGECHECK(model->HSM2_muecb1lp, 0.0, 2.0, "MUECB1LP") ;
RANGECHECK(model->HSM2_mueph0, 0.25, 0.35, "MUEPH0") ;
RANGECHECK(model->HSM2_muesr0, 1.8, 2.2, "MUESR0") ;
RANGECHECK(model->HSM2_lpext, 1.0e-50, 10.0e-6, "LPEXT") ;
RANGECHECK(model->HSM2_npext, 1.0e16, 1.0e18, "NPEXT") ;
RANGECHECK(model->HSM2_scp21, 0.0, 5.0, "SCP21") ;
RANGECHECK(model->HSM2_scp22, 0.0, 0.0, "SCP22") ;
RANGECHECK(model->HSM2_bs1, 0.0, 50.0e-3, "BS1") ;
RANGECHECK(model->HSM2_bs2, 0.5, 1.0, "BS2") ;
if ( model->HSM2_cgbo < 0.0 ) {
printf("warning(HiSIM2): %s = %e\n", "CGBO", model->HSM2_cgbo );
printf("warning(HiSIM2): The model parameter %s must not be less than %s.\n", "CGBO", "0.0" );
}
RANGECHECK(model->HSM2_clm5, 0.0, 2.0, "CLM5") ;
RANGECHECK(model->HSM2_clm6, 0.0, 20.0, "CLM6") ;
RANGECHECK(model->HSM2_vover, 0.0, 50.0, "VOVER") ;
RANGECHECK(model->HSM2_voverp, 0.0, 2.0, "VOVERP") ;
RANGECHECK(model->HSM2_qme1, 0.0, 300.0e-9, "QME1") ;
RANGECHECK(model->HSM2_qme3, 0.0,800.0e-12, "QME3") ;
RANGECHECK(model->HSM2_tnom, 22.0, 32.0, "TNOM") ;
RANGECHECK(model->HSM2_ddltmax, 1.0, 20.0, "DDLTMAX") ;
RANGECHECK(model->HSM2_ddltict, -3.0, 20.0, "DDLTICT") ;
RANGECHECK(model->HSM2_ddltslp, 0.0, 20.0, "DDLTSLP") ;
RANGECHECK(model->HSM2_cvb, -0.1, 0.2, "CVB") ;
RANGECHECK(model->HSM2_cvbk, -0.1, 0.2, "CVBK") ;
RANGECHECK(model->HSM2_byptol, 0.0, 1.0, "BYPTOL") ;
RANGECHECK(model->HSM2_sc3Vbs, -3.0, 0.0, "SC3VBS") ;
/*-----------------------------------------------------------*
* Change units into CGS.
*-----------------*/
modelCGS->HSM2_tox = model->HSM2_tox * C_m2cm ;
modelCGS->HSM2_xld = model->HSM2_xld * C_m2cm ;
modelCGS->HSM2_xwd = model->HSM2_xwd * C_m2cm ;
modelCGS->HSM2_xqy = model->HSM2_xqy * C_m2cm ;
modelCGS->HSM2_xl = model->HSM2_xl * C_m2cm ;
modelCGS->HSM2_xw = model->HSM2_xw * C_m2cm ;
modelCGS->HSM2_saref = model->HSM2_saref * C_m2cm ;
modelCGS->HSM2_sbref = model->HSM2_sbref * C_m2cm ;
modelCGS->HSM2_ll = model->HSM2_ll * C_m2cm ;
modelCGS->HSM2_lld = model->HSM2_lld * C_m2cm ;
modelCGS->HSM2_wl = model->HSM2_wl * C_m2cm ;
modelCGS->HSM2_wld = model->HSM2_wld * C_m2cm ;
modelCGS->HSM2_lp = model->HSM2_lp * C_m2cm ;
modelCGS->HSM2_tpoly = model->HSM2_tpoly * C_m2cm ;
modelCGS->HSM2_parl2 = model->HSM2_parl2 * C_m2cm ;
modelCGS->HSM2_qme1 = model->HSM2_qme1 * C_m2cm ;
modelCGS->HSM2_qme3 = model->HSM2_qme3 * C_m2cm ;
modelCGS->HSM2_cgbo = model->HSM2_cgbo / C_m2cm ;
modelCGS->HSM2_cj = model->HSM2_cj / C_m2cm_p2 ;
modelCGS->HSM2_cjsw = model->HSM2_cjsw / C_m2cm ;
modelCGS->HSM2_cjswg = model->HSM2_cjswg / C_m2cm ;
modelCGS->HSM2_lpext = model->HSM2_lpext * C_m2cm ;
modelCGS->HSM2_wl1 = model->HSM2_wl1 * C_m2cm ;
modelCGS->HSM2_rs = model->HSM2_rs * C_m2cm ;
modelCGS->HSM2_rd = model->HSM2_rd * C_m2cm ;
GDLD = model->HSM2_gdld * C_m2um ;
/*-----------------------------------------------------------*
* Change unit into Kelvin.
*-----------------*/
model->HSM2_ktnom = model->HSM2_tnom + 273.15 ; /* [C] -> [K] */
/* SourceSatCurrent = 1.0e-14 */
/* DrainSatCurrent = 1.0e-14 */
model->HSM2_vcrit = CONSTvt0 * log( CONSTvt0 / (CONSTroot2 * 1.0e-14) ) ;
/* Quantum Mechanical Effect */
if ( ( model->HSM2_qme1 == 0.0 && model->HSM2_qme3 == 0.0 ) || model->HSM2_qme2 == 0.0 ) {
model->HSM2_flg_qme = 0 ;
} else {
model->HSM2_flg_qme = 1 ;
model->HSM2_qme12 = model->HSM2_qme1 / ( model->HSM2_qme2 * model->HSM2_qme2 ) ;
}
modelMKS = &model->modelMKS ;
for ( here = model->HSM2instances; here; here = here->HSM2nextInstance ) { for ( here = model->HSM2instances; here; here = here->HSM2nextInstance ) {
hereCGS = &here->hereCGS ;
pParam = &here->pParam ; pParam = &here->pParam ;
hereMKS = &here->hereMKS ;
/*-----------------------------------------------------------*
* Range check of instance parameters
*-----------------*/
RANGECHECK(here->HSM2_l, model->HSM2_lmin, model->HSM2_lmax, "L") ;
RANGECHECK(here->HSM2_w/here->HSM2_nf, model->HSM2_wmin, model->HSM2_wmax, "W/NF") ;
RANGECHECK(here->HSM2_mphdfm, -3.0, 3.0, "MPHDFM") ;
here->HSM2_lgate = Lgate = here->HSM2_l + model->HSM2_xl ;
Wgate = here->HSM2_w / here->HSM2_nf + model->HSM2_xw ;
/*-----------------------------------------------------------*
* Change units into CGS.
*-----------------*/
hereCGS->HSM2_l = here->HSM2_l * C_m2cm ;
hereCGS->HSM2_w = here->HSM2_w * C_m2cm ;
hereCGS->HSM2_as = here->HSM2_as * C_m2cm_p2 ;
hereCGS->HSM2_ad = here->HSM2_ad * C_m2cm_p2 ;
hereCGS->HSM2_ps = here->HSM2_ps * C_m2cm ;
hereCGS->HSM2_pd = here->HSM2_pd * C_m2cm ;
hereCGS->HSM2_xgw = here->HSM2_xgw * C_m2cm ;
hereCGS->HSM2_xgl = here->HSM2_xgl * C_m2cm ;
hereCGS->HSM2_sa = here->HSM2_sa * C_m2cm ;
hereCGS->HSM2_sb = here->HSM2_sb * C_m2cm ;
hereCGS->HSM2_sd = here->HSM2_sd * C_m2cm ;
/*-----------------------------------------------------------*
* Change unit into Kelvin.
*-----------------*/
here->HSM2_ktemp = here->HSM2_temp + 273.15 ; /* [C] -> [K] */
here->HSM2_lgate = Lgate = hereCGS->HSM2_l + modelCGS->HSM2_xl ;
Wgate = hereCGS->HSM2_w / here->HSM2_nf + modelCGS->HSM2_xw ;
LG = Lgate * 1.0e4 ;
here->HSM2_wg = WG = Wgate * 1.0e4 ;
LG = Lgate * C_m2um ;
here->HSM2_wg = WG = Wgate * C_m2um ;
WL = WG * LG ; WL = WG * LG ;
MUEPWD = model->HSM2_muepwd * C_m2um ; MUEPWD = model->HSM2_muepwd * C_m2um ;
MUEPLD = model->HSM2_muepld * C_m2um ; MUEPLD = model->HSM2_muepld * C_m2um ;
/* binning calculation */
Lbin = pow(LG, model->HSM2_lbinn) ;
Wbin = pow(WG, model->HSM2_wbinn) ;
LWbin = Lbin * Wbin ;
BINNING(vmax)
BINNING(bgtmp1)
BINNING(bgtmp2)
BINNING(eg0)
BINNING(lover)
BINNING(vfbover)
BINNING(nover)
BINNING(wl2)
BINNING(vfbc)
BINNING(nsubc)
BINNING(nsubp)
BINNING(scp1)
BINNING(scp2)
BINNING(scp3)
BINNING(sc1)
BINNING(sc2)
BINNING(sc3)
BINNING(sc4)
BINNING(pgd1)
BINNING(ndep)
BINNING(ninv)
BINNING(muecb0)
BINNING(muecb1)
BINNING(mueph1)
BINNING(vtmp)
BINNING(wvth0)
BINNING(muesr1)
BINNING(muetmp)
BINNING(sub1)
BINNING(sub2)
BINNING(svds)
BINNING(svbs)
BINNING(svgs)
BINNING(nsti)
BINNING(wsti)
BINNING(scsti1)
BINNING(scsti2)
BINNING(vthsti)
BINNING(muesti1)
BINNING(muesti2)
BINNING(muesti3)
BINNING(nsubpsti1)
BINNING(nsubpsti2)
BINNING(nsubpsti3)
BINNING(cgso)
BINNING(cgdo)
BINNING(js0)
BINNING(js0sw)
BINNING(nj)
BINNING(cisbk)
BINNING(clm1)
BINNING(clm2)
BINNING(clm3)
BINNING(wfc)
BINNING(gidl1)
BINNING(gidl2)
BINNING(gleak1)
BINNING(gleak2)
BINNING(gleak3)
BINNING(gleak6)
BINNING(glksd1)
BINNING(glksd2)
BINNING(glkb1)
BINNING(glkb2)
BINNING(nftrp)
BINNING(nfalp)
BINNING(vdiffj)
BINNING(ibpc1)
BINNING(ibpc2)
/*-----------------------------------------------------------*
* Range check of model parameters
*-----------------*/
RANGECHECK(pParam->HSM2_vmax, 1.0e5, 20.0e6, "VMAX") ;
RANGECHECK(pParam->HSM2_bgtmp1, 50.0e-6, 1.0e-3, "BGTMP1") ;
RANGECHECK(pParam->HSM2_bgtmp2, -1.0e-6, 1.0e-6, "BGTMP2") ;
RANGECHECK(pParam->HSM2_eg0, 1.0, 1.3, "EG0") ;
RANGECHECK(pParam->HSM2_vfbc, -1.2, -0.8, "VFBC") ;
RANGECHECK(pParam->HSM2_vfbover, -0.2, 0.2, "VFBOVER") ;
RANGECHECK(pParam->HSM2_nsubc, 1.0e16, 1.0e19, "NSUBC") ;
RANGECHECK(pParam->HSM2_nsubp, 1.0e16, 1.0e19, "NSUBP") ;
RANGECHECK(pParam->HSM2_scp1, 0.0, 20.0, "SCP1") ;
RANGECHECK(pParam->HSM2_scp2, 0.0, 2.0, "SCP2") ;
RANGECHECK(pParam->HSM2_scp3, 0.0, 100.0e-9, "SCP3") ;
RANGECHECK(pParam->HSM2_sc1, 0.0, 20.0, "SC1") ;
RANGECHECK(pParam->HSM2_sc2, 0.0, 2.0, "SC2") ;
RANGECHECK(pParam->HSM2_sc3, 0.0, 200.0e-9, "SC3") ;
RANGECHECK(pParam->HSM2_pgd1, 0.0, 50.0e-3, "PGD1") ;
RANGECHECK(pParam->HSM2_ndep, 0.0, 1.0, "NDEP") ;
RANGECHECK(pParam->HSM2_ninv, 0.0, 1.0, "NINV") ;
RANGECHECK(pParam->HSM2_muecb0, 100.0, 100.0e3, "MUECB0") ;
RANGECHECK(pParam->HSM2_muecb1, 5.0, 1.0e4, "MUECB1") ;
RANGECHECK(pParam->HSM2_mueph1, 2.0e3, 35.0e3, "MUEPH1") ;
RANGECHECK(pParam->HSM2_vtmp, -5.0, 1.0, "VTMP") ;
RANGECHECK(pParam->HSM2_muesr1, 1.0e13, 1.0e16, "MUESR1") ;
RANGECHECK(pParam->HSM2_muetmp, 0.5, 2.0, "MUETMP") ;
RANGECHECK(pParam->HSM2_clm1, 0.5, 1.0, "CLM1") ;
RANGECHECK(pParam->HSM2_clm2, 1.0, 4.0, "CLM2") ;
RANGECHECK(pParam->HSM2_clm3, 0.5, 5.0, "CLM3") ;
RANGECHECK(pParam->HSM2_wfc, -5.0e-15, 1.0e-6, "WFC") ;
RANGECHECK(pParam->HSM2_cgso, 0.0, 100e-9 * 100*C_VAC*model->HSM2_kappa/model->HSM2_tox*C_m2cm, "CGSO") ;
RANGECHECK(pParam->HSM2_cgdo, 0.0, 100e-9 * 100*C_VAC*model->HSM2_kappa/model->HSM2_tox*C_m2cm, "CGDO") ;
RANGECHECK(pParam->HSM2_ibpc1, 0.0, 1.0e12, "IBPC1") ;
RANGECHECK(pParam->HSM2_ibpc2, 0.0, 1.0e12, "IBPC2") ;
RANGECHECK(pParam->HSM2_nsti, 1.0e16, 1.0e19, "NSTI") ;
/*-----------------------------------------------------------*
* Change units into CGS.
*-----------------*/
pParam->HSM2_lover *= C_m2cm ;
pParam->HSM2_sc3 *= C_m2cm ;
pParam->HSM2_scp3 *= C_m2cm ;
pParam->HSM2_wfc *= C_m2cm ;
pParam->HSM2_wsti *= C_m2cm ;
pParam->HSM2_gidl1 *= C_m2cm_p1o2 ;
pParam->HSM2_cgso /= C_m2cm ;
pParam->HSM2_cgdo /= C_m2cm ;
pParam->HSM2_js0 /= C_m2cm_p2 ;
pParam->HSM2_js0sw /= C_m2cm ;
/* Band gap */ /* Band gap */
here->HSM2_egtnom = pParam->HSM2_eg0 - model->HSM2_ktnom here->HSM2_egtnom = pParam->HSM2_eg0 - model->HSM2_ktnom
* ( 90.25e-6 + model->HSM2_ktnom * 1.0e-7 ) ; * ( 90.25e-6 + model->HSM2_ktnom * 1.0e-7 ) ;
@ -375,26 +130,26 @@ int HSM2temp(
here->HSM2_clmmod = 1e0 + pow( LG , model->HSM2_clm5 ) * model->HSM2_clm6 ; here->HSM2_clmmod = 1e0 + pow( LG , model->HSM2_clm5 ) * model->HSM2_clm6 ;
/* Half length of diffusion */ /* Half length of diffusion */
T1 = 1.0 / (modelCGS->HSM2_saref + 0.5 * hereCGS->HSM2_l)
+ 1.0 / (modelCGS->HSM2_sbref + 0.5 * hereCGS->HSM2_l);
T1 = 1.0 / (model->HSM2_saref + 0.5 * here->HSM2_l)
+ 1.0 / (model->HSM2_sbref + 0.5 * here->HSM2_l);
Lod_half_ref = 2.0 / T1 ; Lod_half_ref = 2.0 / T1 ;
if (hereCGS->HSM2_sa > 0.0 && hereCGS->HSM2_sb > 0.0 &&
if (here->HSM2_sa > 0.0 && here->HSM2_sb > 0.0 &&
(here->HSM2_nf == 1.0 || (here->HSM2_nf == 1.0 ||
(here->HSM2_nf > 1.0 && hereCGS->HSM2_sd > 0.0))) {
(here->HSM2_nf > 1.0 && here->HSM2_sd > 0.0))) {
T1 = 0.0; T1 = 0.0;
for (i = 0; i < here->HSM2_nf; i++) { for (i = 0; i < here->HSM2_nf; i++) {
T1 += 1.0 / (hereCGS->HSM2_sa + 0.5 * hereCGS->HSM2_l
+ i * (hereCGS->HSM2_sd + hereCGS->HSM2_l))
+ 1.0 / (hereCGS->HSM2_sb + 0.5 * hereCGS->HSM2_l
+ i * (hereCGS->HSM2_sd + hereCGS->HSM2_l));
T1 += 1.0 / (here->HSM2_sa + 0.5 * here->HSM2_l
+ i * (here->HSM2_sd + here->HSM2_l))
+ 1.0 / (here->HSM2_sb + 0.5 * here->HSM2_l
+ i * (here->HSM2_sd + here->HSM2_l));
} }
Lod_half = 2.0 * here->HSM2_nf / T1; Lod_half = 2.0 * here->HSM2_nf / T1;
} else { } else {
Lod_half = 0.0; Lod_half = 0.0;
} }
Npext = model->HSM2_npext * ( 1.0 + model->HSM2_npextw / pow( WG, model->HSM2_npextwp ) ); /* new */
Npext = modelMKS->HSM2_npext * ( 1.0 + model->HSM2_npextw / pow( WG, model->HSM2_npextwp ) ); /* new */
here->HSM2_mueph1 = pParam->HSM2_mueph1 ; here->HSM2_mueph1 = pParam->HSM2_mueph1 ;
here->HSM2_nsubp = pParam->HSM2_nsubp ; here->HSM2_nsubp = pParam->HSM2_nsubp ;
here->HSM2_nsubc = pParam->HSM2_nsubc ; here->HSM2_nsubc = pParam->HSM2_nsubc ;
@ -403,31 +158,31 @@ int HSM2temp(
if ( model->HSM2_codfm == 1 && here->HSM2_nsubcdfm_Given ) { if ( model->HSM2_codfm == 1 && here->HSM2_nsubcdfm_Given ) {
RANGECHECK(here->HSM2_nsubcdfm, 1.0e16, 1.0e19, "NSUBCDFM") ; RANGECHECK(here->HSM2_nsubcdfm, 1.0e16, 1.0e19, "NSUBCDFM") ;
here->HSM2_mueph1 *= here->HSM2_mphdfm here->HSM2_mueph1 *= here->HSM2_mphdfm
* ( log(here->HSM2_nsubcdfm) - log(here->HSM2_nsubc) ) + 1.0 ;
here->HSM2_nsubp += here->HSM2_nsubcdfm - here->HSM2_nsubc ;
Npext += here->HSM2_nsubcdfm - here->HSM2_nsubc ;
here->HSM2_nsubc = here->HSM2_nsubcdfm ;
* ( log(hereMKS->HSM2_nsubcdfm) - log(here->HSM2_nsubc) ) + 1.0 ;
here->HSM2_nsubp += hereMKS->HSM2_nsubcdfm - here->HSM2_nsubc ;
Npext += hereMKS->HSM2_nsubcdfm - here->HSM2_nsubc ;
here->HSM2_nsubc = hereMKS->HSM2_nsubcdfm ;
} }
/* WPE */ /* WPE */
T0 = model->HSM2_nsubcwpe *
T0 = modelMKS->HSM2_nsubcwpe *
( here->HSM2_sca ( here->HSM2_sca
+ model->HSM2_web * here->HSM2_scb + model->HSM2_web * here->HSM2_scb
+ model->HSM2_wec * here->HSM2_scc ) ; + model->HSM2_wec * here->HSM2_scc ) ;
here->HSM2_nsubc += T0 ; here->HSM2_nsubc += T0 ;
Fn_SLtemp( here->HSM2_nsubc , here->HSM2_nsubc , 1e15 , 0.01 ) ;
T0 = model->HSM2_nsubpwpe *
Fn_SLtemp( here->HSM2_nsubc , here->HSM2_nsubc , Nsubmin , Nsubmin_dlt ) ;
T0 = modelMKS->HSM2_nsubpwpe *
( here->HSM2_sca ( here->HSM2_sca
+ model->HSM2_web * here->HSM2_scb + model->HSM2_web * here->HSM2_scb
+ model->HSM2_wec * here->HSM2_scc ) ; + model->HSM2_wec * here->HSM2_scc ) ;
here->HSM2_nsubp += T0 ; here->HSM2_nsubp += T0 ;
Fn_SLtemp( here->HSM2_nsubp , here->HSM2_nsubp , 1e15 , 0.01 ) ;
T0 = model->HSM2_npextwpe *
Fn_SLtemp( here->HSM2_nsubp , here->HSM2_nsubp , Nsubmin , Nsubmin_dlt ) ;
T0 = modelMKS->HSM2_npextwpe *
( here->HSM2_sca ( here->HSM2_sca
+ model->HSM2_web * here->HSM2_scb + model->HSM2_web * here->HSM2_scb
+ model->HSM2_wec * here->HSM2_scc ) ; + model->HSM2_wec * here->HSM2_scc ) ;
Npext += T0 ; Npext += T0 ;
Fn_SLtemp( Npext , Npext , 1e15 , 0.01 ) ;
Fn_SLtemp( Npext , Npext , Nsubmin , Nsubmin_dlt ) ;
/* WPE end */ /* WPE end */
/* Coulomb Scattering */ /* Coulomb Scattering */
@ -435,7 +190,7 @@ int HSM2temp(
here->HSM2_muecb1 = pParam->HSM2_muecb1 * pow( LG, model->HSM2_muecb1lp ); here->HSM2_muecb1 = pParam->HSM2_muecb1 * pow( LG, model->HSM2_muecb1lp );
/* Phonon Scattering (temperature-independent part) */ /* Phonon Scattering (temperature-independent part) */
mueph = pParam->HSM2_mueph1
mueph = here->HSM2_mueph1
* (1.0e0 + (model->HSM2_muephw / pow( WG + MUEPWD , model->HSM2_muepwp))) * (1.0e0 + (model->HSM2_muephw / pow( WG + MUEPWD , model->HSM2_muepwp)))
* (1.0e0 + (model->HSM2_muephl / pow( LG + MUEPLD , model->HSM2_mueplp))) * (1.0e0 + (model->HSM2_muephl / pow( LG + MUEPLD , model->HSM2_mueplp)))
* (1.0e0 + (model->HSM2_muephw2 / pow( WG, model->HSM2_muepwp2))) * (1.0e0 + (model->HSM2_muephw2 / pow( WG, model->HSM2_muepwp2)))
@ -467,13 +222,13 @@ int HSM2temp(
here->HSM2_ninv_o_esi = pParam->HSM2_ninv / C_ESI ; here->HSM2_ninv_o_esi = pParam->HSM2_ninv / C_ESI ;
/* Metallurgical channel geometry */ /* Metallurgical channel geometry */
dL = modelCGS->HSM2_xld
+ (modelCGS->HSM2_ll / pow (Lgate + modelCGS->HSM2_lld, model->HSM2_lln)) ;
dW = modelCGS->HSM2_xwd
+ (modelCGS->HSM2_wl / pow (Wgate + modelCGS->HSM2_wld, model->HSM2_wln)) ;
dL = model->HSM2_xld
+ (modelMKS->HSM2_ll / pow (Lgate + model->HSM2_lld, model->HSM2_lln)) ;
dW = model->HSM2_xwd
+ (modelMKS->HSM2_wl / pow (Wgate + model->HSM2_wld, model->HSM2_wln)) ;
Leff = Lgate - 2.0e0 * dL ; Leff = Lgate - 2.0e0 * dL ;
if ( Leff <= 1.0e-7 ) {
if ( Leff <= 1.0e-9 ) {
IFuid namarr[2]; IFuid namarr[2];
namarr[0] = model->HSM2modName; namarr[0] = model->HSM2modName;
namarr[1] = here->HSM2name; namarr[1] = here->HSM2name;
@ -488,11 +243,11 @@ int HSM2temp(
here->HSM2_leff = Leff ; here->HSM2_leff = Leff ;
/* Wg dependence for short channel devices */ /* Wg dependence for short channel devices */
here->HSM2_lgatesm = Lgate + modelCGS->HSM2_wl1 / pow( WL , model->HSM2_wl1p ) ;
here->HSM2_lgatesm = Lgate + model->HSM2_wl1 / pow( WL , model->HSM2_wl1p ) ;
here->HSM2_dVthsm = pParam->HSM2_wl2 / pow( WL , model->HSM2_wl2p ) ; here->HSM2_dVthsm = pParam->HSM2_wl2 / pow( WL , model->HSM2_wl2p ) ;
/* Lg dependence of wsti */ /* Lg dependence of wsti */
T1 = 1.0e0 + model->HSM2_wstil / pow( here->HSM2_lgatesm * 1e4 , model->HSM2_wstilp ) ;
T1 = 1.0e0 + model->HSM2_wstil / pow( here->HSM2_lgatesm * C_m2um , model->HSM2_wstilp ) ;
T2 = 1.0e0 + model->HSM2_wstiw / pow( WG , model->HSM2_wstiwp ) ; T2 = 1.0e0 + model->HSM2_wstiw / pow( WG , model->HSM2_wstiwp ) ;
here->HSM2_wsti = pParam->HSM2_wsti * T1 * T2 ; here->HSM2_wsti = pParam->HSM2_wsti * T1 * T2 ;
@ -512,11 +267,13 @@ int HSM2temp(
here->HSM2_weff_nf = Weff * here->HSM2_nf ; here->HSM2_weff_nf = Weff * here->HSM2_nf ;
/* Surface impurity profile */ /* Surface impurity profile */
/* Nsubp */
if(model->HSM2_nsubpfac < 1.0) {
T1 = 2.0 * ( 1.0 - model->HSM2_nsubpfac ) / model->HSM2_nsubpl * LG + 2.0 * model->HSM2_nsubpfac - 1.0 ; T1 = 2.0 * ( 1.0 - model->HSM2_nsubpfac ) / model->HSM2_nsubpl * LG + 2.0 * model->HSM2_nsubpfac - 1.0 ;
Fn_SUtemp( T1 , T1 , 1 , 0.01 ) ;
Fn_SLtemp( T1 , T1 , model->HSM2_nsubpfac , 0.01 ) ;
Fn_SUtemp( T1 , T1 , 1 , model->HSM2_nsubpdlt ) ;
Fn_SLtemp( T1 , T1 , model->HSM2_nsubpfac , model->HSM2_nsubpdlt ) ;
here->HSM2_nsubp *= T1 ; here->HSM2_nsubp *= T1 ;
}
/* Note: Sign Changed --> */ /* Note: Sign Changed --> */
Nsubpp = here->HSM2_nsubp Nsubpp = here->HSM2_nsubp
@ -534,33 +291,40 @@ int HSM2temp(
T2 = 1.0e0 + ( model->HSM2_nsubcw / pow ( WG, model->HSM2_nsubcwp )) ; T2 = 1.0e0 + ( model->HSM2_nsubcw / pow ( WG, model->HSM2_nsubcwp )) ;
T2 *= 1.0e0 + ( model->HSM2_nsubcw2 / pow ( WG, model->HSM2_nsubcwp2 )) ; T2 *= 1.0e0 + ( model->HSM2_nsubcw2 / pow ( WG, model->HSM2_nsubcwp2 )) ;
T3 = model->HSM2_nsubcmax / here->HSM2_nsubc ;
T3 = modelMKS->HSM2_nsubcmax / here->HSM2_nsubc ;
Fn_SUtemp( T1 , T2 , T3 , 0.01 ) ; Fn_SUtemp( T1 , T2 , T3 , 0.01 ) ;
here->HSM2_nsubc *= T1 ; here->HSM2_nsubc *= T1 ;
if ( here->HSM2_nsubc <= 0.0 ) {
if (Lod_half > 0.0) {
T1 = 1.0e0 / (1.0e0 + pParam->HSM2_nsubcsti2) ;
T2 = pow (pParam->HSM2_nsubcsti1 / Lod_half, pParam->HSM2_nsubcsti3) ;
T3 = pow (pParam->HSM2_nsubcsti1 / Lod_half_ref, pParam->HSM2_nsubcsti3) ;
here->HSM2_nsubc = here->HSM2_nsubc * (1.0e0 + T1 * T2) / (1.0e0 + T1 * T3) ;
}
if(model->HSM2_coerrrep && (here->HSM2_nsubc <= 0.0)) {
fprintf ( stderr , "*** warning(HiSIM): actual NSUBC value is negative -> reset to 1E+15.\n" ) ; fprintf ( stderr , "*** warning(HiSIM): actual NSUBC value is negative -> reset to 1E+15.\n" ) ;
fprintf ( stderr , " The model parameter NSUBCW/NSUBCWP and/or NSUBCW2/NSUBCW2P might be wrong.\n" ) ; fprintf ( stderr , " The model parameter NSUBCW/NSUBCWP and/or NSUBCW2/NSUBCW2P might be wrong.\n" ) ;
here->HSM2_nsubc = 1e15 ;
here->HSM2_nsubc = 1e15 / C_cm2m_p3 ;
} }
if(Npext < here->HSM2_nsubc || Npext > here->HSM2_nsubp) {
if(model->HSM2_coerrrep && (Npext < here->HSM2_nsubc || Npext > here->HSM2_nsubp)) {
fprintf ( stderr , "*** warning(HiSIM): actual NPEXT value is smaller than NSUBC and/or greater than NSUBP.\n" ) ; fprintf ( stderr , "*** warning(HiSIM): actual NPEXT value is smaller than NSUBC and/or greater than NSUBP.\n" ) ;
fprintf ( stderr , " ( Npext = %e , NSUBC = %e , NSUBP = %e ) \n",Npext,here->HSM2_nsubc,here->HSM2_nsubp); fprintf ( stderr , " ( Npext = %e , NSUBC = %e , NSUBP = %e ) \n",Npext,here->HSM2_nsubc,here->HSM2_nsubp);
fprintf ( stderr , " The model parameter NPEXTW and/or NPEXTWP might be wrong.\n" ) ; fprintf ( stderr , " The model parameter NPEXTW and/or NPEXTWP might be wrong.\n" ) ;
} }
if( Lgate > modelCGS->HSM2_lp ){
Nsub = (here->HSM2_nsubc * (Lgate - modelCGS->HSM2_lp)
+ Nsubps * modelCGS->HSM2_lp) / Lgate ;
if( Lgate > model->HSM2_lp ){
Nsub = (here->HSM2_nsubc * (Lgate - model->HSM2_lp)
+ Nsubps * model->HSM2_lp) / Lgate ;
} else { } else {
Nsub = Nsubps Nsub = Nsubps
+ (Nsubps - here->HSM2_nsubc) * (modelCGS->HSM2_lp - Lgate)
/ modelCGS->HSM2_lp ;
+ (Nsubps - here->HSM2_nsubc) * (model->HSM2_lp - Lgate)
/ model->HSM2_lp ;
} }
T3 = 0.5e0 * Lgate - modelCGS->HSM2_lp ;
Fn_SZtemp( T3 , T3 , 1e-8 ) ;
T1 = Fn_Max(0.0e0, modelCGS->HSM2_lpext ) ;
T3 = 0.5e0 * Lgate - model->HSM2_lp ;
Fn_SZtemp( T3 , T3 , lpext_dlt ) ;
T1 = Fn_Max(0.0e0, model->HSM2_lpext ) ;
T2 = T3 * T1 / ( T3 + T1 ) ; T2 = T3 * T1 / ( T3 + T1 ) ;
here->HSM2_nsub = here->HSM2_nsub =
@ -570,10 +334,10 @@ int HSM2temp(
here->HSM2_2qnsub_esi = 2.0 * here->HSM2_qnsub_esi ; here->HSM2_2qnsub_esi = 2.0 * here->HSM2_qnsub_esi ;
/* Pocket Overlap (temperature-independent part) */ /* Pocket Overlap (temperature-independent part) */
if ( Lgate <= 2.0e0 * modelCGS->HSM2_lp ) {
if ( Lgate <= 2.0e0 * model->HSM2_lp ) {
Nsubb = 2.0e0 * Nsubps Nsubb = 2.0e0 * Nsubps
- (Nsubps - here->HSM2_nsubc) * Lgate - (Nsubps - here->HSM2_nsubc) * Lgate
/ modelCGS->HSM2_lp - here->HSM2_nsubc ;
/ model->HSM2_lp - here->HSM2_nsubc ;
here->HSM2_ptovr0 = log (Nsubb / here->HSM2_nsubc) ; here->HSM2_ptovr0 = log (Nsubb / here->HSM2_nsubc) ;
} else { } else {
here->HSM2_ptovr0 = 0.0e0 ; here->HSM2_ptovr0 = 0.0e0 ;
@ -603,12 +367,13 @@ int HSM2temp(
/* Gate resistance */ /* Gate resistance */
if ( here->HSM2_corg == 1 ) { if ( here->HSM2_corg == 1 ) {
T1 = hereCGS->HSM2_xgw + Weff / (3.0e0 * here->HSM2_ngcon);
T2 = Lgate - hereCGS->HSM2_xgl;
T1 = here->HSM2_xgw + Weff / (3.0e0 * here->HSM2_ngcon);
T2 = Lgate - here->HSM2_xgl;
here->HSM2_grg = model->HSM2_rshg * T1 / (here->HSM2_ngcon * T2 * here->HSM2_nf); here->HSM2_grg = model->HSM2_rshg * T1 / (here->HSM2_ngcon * T2 * here->HSM2_nf);
if (here->HSM2_grg > 1.0e-3) here->HSM2_grg = here->HSM2_m / here->HSM2_grg; if (here->HSM2_grg > 1.0e-3) here->HSM2_grg = here->HSM2_m / here->HSM2_grg;
else { else {
here->HSM2_grg = here->HSM2_m * 1.0e3; here->HSM2_grg = here->HSM2_m * 1.0e3;
if(model->HSM2_coerrrep)
printf("warning(HiSIM2): The gate conductance reset to 1.0e3 mho.\n"); printf("warning(HiSIM2): The gate conductance reset to 1.0e3 mho.\n");
} }
} }
@ -618,16 +383,16 @@ int HSM2temp(
if ( model->HSM2_rsh > 0.0 ) { if ( model->HSM2_rsh > 0.0 ) {
here->HSM2_rd += model->HSM2_rsh * here->HSM2_nrd ; here->HSM2_rd += model->HSM2_rsh * here->HSM2_nrd ;
} }
if ( modelCGS->HSM2_rd > 0.0 ) {
here->HSM2_rd += modelCGS->HSM2_rd / here->HSM2_weff_nf ;
if ( model->HSM2_rd > 0.0 ) {
here->HSM2_rd += model->HSM2_rd / here->HSM2_weff_nf ;
} }
here->HSM2_rs = 0.0; here->HSM2_rs = 0.0;
if ( model->HSM2_rsh > 0.0 ) { if ( model->HSM2_rsh > 0.0 ) {
here->HSM2_rs += model->HSM2_rsh * here->HSM2_nrs ; here->HSM2_rs += model->HSM2_rsh * here->HSM2_nrs ;
} }
if ( modelCGS->HSM2_rs > 0.0 ) {
here->HSM2_rs += modelCGS->HSM2_rs / here->HSM2_weff_nf ;
if ( model->HSM2_rs > 0.0 ) {
here->HSM2_rs += model->HSM2_rs / here->HSM2_weff_nf ;
} }
if (model->HSM2_corsrd < 0) { if (model->HSM2_corsrd < 0) {
@ -686,35 +451,36 @@ int HSM2temp(
T2 = pow( Weff , model->HSM2_svgswp ) ; T2 = pow( Weff , model->HSM2_svgswp ) ;
here->HSM2_vg2const = pParam->HSM2_svgs here->HSM2_vg2const = pParam->HSM2_svgs
* ( 1.0e0 * ( 1.0e0
+ model->HSM2_svgsl / pow( here->HSM2_lgate , model->HSM2_svgslp ) )
* ( T2 / ( T2 + model->HSM2_svgsw ) ) ;
+ modelMKS->HSM2_svgsl / pow( here->HSM2_lgate , model->HSM2_svgslp ) )
* ( T2 / ( T2 + modelMKS->HSM2_svgsw ) ) ;
here->HSM2_xvbs = pParam->HSM2_svbs here->HSM2_xvbs = pParam->HSM2_svbs
* ( 1.0e0 * ( 1.0e0
+ model->HSM2_svbsl / pow( here->HSM2_lgate , model->HSM2_svbslp ) ) ;
here->HSM2_xgate = model->HSM2_slg
+ modelMKS->HSM2_svbsl / pow( here->HSM2_lgate , model->HSM2_svbslp ) ) ;
here->HSM2_xgate = modelMKS->HSM2_slg
* ( 1.0 * ( 1.0
+ model->HSM2_slgl / pow( here->HSM2_lgate , model->HSM2_slglp ) ) ;
+ modelMKS->HSM2_slgl / pow( here->HSM2_lgate , model->HSM2_slglp ) ) ;
here->HSM2_xsub1 = pParam->HSM2_sub1 here->HSM2_xsub1 = pParam->HSM2_sub1
* ( 1.0 * ( 1.0
+ model->HSM2_sub1l / pow( here->HSM2_lgate , model->HSM2_sub1lp ) ) ;
+ modelMKS->HSM2_sub1l / pow( here->HSM2_lgate , model->HSM2_sub1lp ) ) ;
here->HSM2_xsub2 = pParam->HSM2_sub2 here->HSM2_xsub2 = pParam->HSM2_sub2
* ( 1.0 + model->HSM2_sub2l / here->HSM2_lgate ) ;
* ( 1.0 + modelMKS->HSM2_sub2l / here->HSM2_lgate ) ;
/* Fringing capacitance */ /* Fringing capacitance */
here->HSM2_cfrng = C_EOX / ( C_Pi / 2.0e0 ) * here->HSM2_weff_nf here->HSM2_cfrng = C_EOX / ( C_Pi / 2.0e0 ) * here->HSM2_weff_nf
* log( 1.0e0 + modelCGS->HSM2_tpoly / modelCGS->HSM2_tox ) ;
* log( 1.0e0 + model->HSM2_tpoly / model->HSM2_tox ) ;
/* Additional term of lateral-field-induced capacitance */ /* Additional term of lateral-field-induced capacitance */
here->HSM2_cqyb0 = 1.0e4 * here->HSM2_weff_nf
here->HSM2_cqyb0 = C_m2um * here->HSM2_weff_nf
* model->HSM2_xqy1 / pow( LG , model->HSM2_xqy2 ) ; * model->HSM2_xqy1 / pow( LG , model->HSM2_xqy2 ) ;
/* Parasitic component of the channel current */ /* Parasitic component of the channel current */
GDLD = model->HSM2_gdld * C_m2um ;
here->HSM2_ptl0 = model->HSM2_ptl * pow( LG , - model->HSM2_ptlp ) ; here->HSM2_ptl0 = model->HSM2_ptl * pow( LG , - model->HSM2_ptlp ) ;
here->HSM2_pt40 = model->HSM2_pt4 * pow( LG , - model->HSM2_pt4p ) ; here->HSM2_pt40 = model->HSM2_pt4 * pow( LG , - model->HSM2_pt4p ) ;
here->HSM2_gdl0 = model->HSM2_gdl * pow( LG + modelCGS->HSM2_gdld , - model->HSM2_gdlp ) ;
here->HSM2_gdl0 = model->HSM2_gdl * pow( LG + GDLD , - model->HSM2_gdlp ) ;
/*-----------------------------------------------------------* /*-----------------------------------------------------------*
@ -782,7 +548,7 @@ int HSM2temp(
here->HSM2_pb2over = 2.0 / beta * log( pParam->HSM2_nover / Nin ) ; here->HSM2_pb2over = 2.0 / beta * log( pParam->HSM2_nover / Nin ) ;
/* (1 / cnst1 / cnstCoxi) for Ps0LD_iniB */ /* (1 / cnst1 / cnstCoxi) for Ps0LD_iniB */
T1 = here->HSM2_cnst0over * modelCGS->HSM2_tox / here->HSM2_cecox ;
T1 = here->HSM2_cnst0over * model->HSM2_tox / here->HSM2_cecox ;
T2 = pParam->HSM2_nover / Nin ; T2 = pParam->HSM2_nover / Nin ;
T1 = T2 * T2 / ( T1 * T1 ) ; T1 = T2 * T2 / ( T1 * T1 ) ;
here->HSM2_ps0ldinib = T1 ; /* (1 / cnst1 / cnstCoxi) */ here->HSM2_ps0ldinib = T1 ; /* (1 / cnst1 / cnstCoxi) */
@ -818,10 +584,10 @@ int HSM2temp(
* exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta * exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta
+ model->HSM2_xti2 * log (TTEMP / model->HSM2_ktnom)) / model->HSM2_njsw) ; + model->HSM2_xti2 * log (TTEMP / model->HSM2_ktnom)) / model->HSM2_njsw) ;
here->HSM2_isbd = hereCGS->HSM2_ad * js + hereCGS->HSM2_pd * jssw ;
here->HSM2_isbd2 = hereCGS->HSM2_ad * js2 + hereCGS->HSM2_pd * jssw2 ;
here->HSM2_isbs = hereCGS->HSM2_as * js + hereCGS->HSM2_ps * jssw ;
here->HSM2_isbs2 = hereCGS->HSM2_as * js2 + hereCGS->HSM2_ps * jssw2 ;
here->HSM2_isbd = here->HSM2_ad * js + here->HSM2_pd * jssw ;
here->HSM2_isbd2 = here->HSM2_ad * js2 + here->HSM2_pd * jssw2 ;
here->HSM2_isbs = here->HSM2_as * js + here->HSM2_ps * jssw ;
here->HSM2_isbs2 = here->HSM2_as * js2 + here->HSM2_ps * jssw2 ;
here->HSM2_vbdt = pParam->HSM2_nj / beta here->HSM2_vbdt = pParam->HSM2_nj / beta
* log (pParam->HSM2_vdiffj * (TTEMP / model->HSM2_ktnom) * (TTEMP / model->HSM2_ktnom) * log (pParam->HSM2_vdiffj * (TTEMP / model->HSM2_ktnom) * (TTEMP / model->HSM2_ktnom)
@ -851,7 +617,7 @@ int HSM2temp(
cnst0 = here->HSM2_cnst0 ; cnst0 = here->HSM2_cnst0 ;
cnst1 = here->HSM2_cnst1 ; cnst1 = here->HSM2_cnst1 ;
c_eox = here->HSM2_cecox ; c_eox = here->HSM2_cecox ;
Tox = modelCGS->HSM2_tox ;
Tox = model->HSM2_tox ;
Cox = c_eox / Tox ; Cox = c_eox / Tox ;
Cox_inv = 1.0 / Cox ; Cox_inv = 1.0 / Cox ;
fac1 = cnst0 * Cox_inv ; fac1 = cnst0 * Cox_inv ;
@ -879,7 +645,7 @@ int HSM2temp(
Vth0 = Ps0 + Vfb + T2 * Cox_inv ; Vth0 = Ps0 + Vfb + T2 * Cox_inv ;
T1 = C_ESI * Cox_inv ; T1 = C_ESI * Cox_inv ;
T2 = here->HSM2_wdplp ; T2 = here->HSM2_wdplp ;
T4 = 1.0e0 / ( modelCGS->HSM2_lp * modelCGS->HSM2_lp ) ;
T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ;
T3 = 2.0 * ( model->HSM2_vbi - Pb20 ) * T2 * T4 ; T3 = 2.0 * ( model->HSM2_vbi - Pb20 ) * T2 * T4 ;
T5 = T1 * T3 ; T5 = T1 * T3 ;
T6 = Ps0 - sc3Vbs ; T6 = Ps0 - sc3Vbs ;
@ -889,12 +655,12 @@ int HSM2temp(
T1 = Vthp - Vth0 ; T1 = Vthp - Vth0 ;
T9 = Ps0 - sc3Vbs ; T9 = Ps0 - sc3Vbs ;
T9_dVb = Ps0_dVbs - 1.0 ; T9_dVb = Ps0_dVbs - 1.0 ;
T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / modelCGS->HSM2_lp;
T3_dVb = pParam->HSM2_scp3 * T9_dVb / modelCGS->HSM2_lp ;
T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / model->HSM2_lp;
T3_dVb = pParam->HSM2_scp3 * T9_dVb / model->HSM2_lp ;
dVthLP = T1 * dVth0 * T3 ; dVthLP = T1 * dVth0 * T3 ;
dVthLP_dVb = T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb; dVthLP_dVb = T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb;
T3 = here->HSM2_lgate - modelCGS->HSM2_parl2 ;
T3 = here->HSM2_lgate - model->HSM2_parl2 ;
T4 = 1.0e0 / ( T3 * T3 ) ; T4 = 1.0e0 / ( T3 * T3 ) ;
T0 = C_ESI * here->HSM2_wdpl * 2.0e0 * ( model->HSM2_vbi - Pb20 ) * T4 ; T0 = C_ESI * here->HSM2_wdpl * 2.0e0 * ( model->HSM2_vbi - Pb20 ) * T4 ;
T2 = T0 * Cox_inv ; T2 = T0 * Cox_inv ;

6
src/spicelib/devices/hisim2/hsm2trunc.c

@ -3,10 +3,12 @@
HiSIM (Hiroshima University STARC IGFET Model) HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2012 Hiroshima University & STARC Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM 2.6.1
MODEL NAME : HiSIM
( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta
FILE : hsm2trunc.c FILE : hsm2trunc.c
date : 2012.4.6
Date : 2012.10.25
released by released by
Hiroshima University & Hiroshima University &

Loading…
Cancel
Save