hisim2 update to version 2.6.1

This commit is contained in:
dwarning 2012-10-24 08:54:31 +02:00
parent b829555f7c
commit e75fdab962
24 changed files with 1136 additions and 948 deletions

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hisim2.h
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -14,7 +14,6 @@
***********************************************************************/
#include "ngspice/ngspice.h"
#include <stdio.h>
#include "ngspice/devdefs.h"
#include "hsm2def.h"
#include "ngspice/suffix.h"
@ -50,7 +49,12 @@ IFparm HSM2pTable[] = { /* parameters */
IOP("nsubcdfm", HSM2_NSUBCDFM, IF_REAL, "constant part of Nsub for DFM [1/cm^3]"),
IOP("mphdfm", HSM2_MPHDFM, IF_REAL, "NSUBCDFM dependence of phonon scattering for DFM"),
IOP("m", HSM2_M, IF_REAL, "Multiplication factor [-]"),
/* Output Physical Values: */
/* WPE */
IOP("sca", HSM2_SCA, IF_REAL, "WPE sca"),
IOP("scb", HSM2_SCB, IF_REAL, "WPE scb"),
IOP("scc", HSM2_SCC, IF_REAL, "WPE scc"),
/* Output Physical Values: */
OP ( "ids", HSM2_CD, IF_REAL , "Ids"), /* Drain-Source current */
OP ( "isub", HSM2_ISUB, IF_REAL , "Isub"), /* Substrate current */
OP ( "igidl", HSM2_IGIDL, IF_REAL , "Igidl"), /* Gate-Induced Drain Leakage current */
@ -359,7 +363,13 @@ IFparm HSM2mPTable[] = { /* model parameters */
IOP("nsubcwp2", HSM2_MOD_NSUBCWP2, IF_REAL, ""),
IOP("muephw2", HSM2_MOD_MUEPHW2, IF_REAL, ""),
IOP("muepwp2", HSM2_MOD_MUEPWP2, IF_REAL, ""),
/* WPE */
IOP("web", HSM2_MOD_WEB, IF_REAL, "Description for the model parameter WPE web"),
IOP("wec", HSM2_MOD_WEC, IF_REAL, "Description for the model parameter WPE wec"),
IOP("nsubcwpe" , HSM2_MOD_NSUBCWPE, IF_REAL, "Description for the model parameter WPE nsubcwpe"),
IOP("npextwpe" , HSM2_MOD_NPEXTWPE, IF_REAL, "Description for the model parameter WPE npextwpe"),
IOP("nsubpwpe" , HSM2_MOD_NSUBPWPE, IF_REAL, "Description for the model parameter WPE nsubpwpe"),
IOP("vgsmin", HSM2_MOD_VGSMIN, IF_REAL, "minimal/maximal expected Vgs (NMOS/PMOS) [V]"),
IOP("sc3vbs", HSM2_MOD_SC3VBS, IF_REAL, "Vbs value for clamping sc3 [V]"),
IOP("byptol", HSM2_MOD_BYPTOL, IF_REAL, "BYP_TOL_FACTOR for bypass control"),

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2acld.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2ask.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -14,7 +14,6 @@
***********************************************************************/
#include "ngspice/ngspice.h"
#include <stdio.h>
#include "ngspice/ifsim.h"
#include "ngspice/cktdefs.h"
#include "ngspice/devdefs.h"
@ -280,6 +279,16 @@ int HSM2ask(
case HSM2_M:
value->rValue = here->HSM2_m;
return(OK);
/* WPE */
case HSM2_SCA:
value->rValue = here->HSM2_sca;
return(OK);
case HSM2_SCB:
value->rValue = here->HSM2_scb;
return(OK);
case HSM2_SCC:
value->rValue = here->HSM2_scc;
return(OK);
default:
return(E_BADPARM);
}

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2cvtest.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -14,7 +14,6 @@
***********************************************************************/
#include "ngspice/ngspice.h"
#include <stdio.h>
#include "ngspice/cktdefs.h"
#include "hsm2def.h"
#include "ngspice/trandefs.h"

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2def.h
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -24,6 +24,37 @@
/* 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 ;
double HSM2_ll ;
double HSM2_lld ;
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 ;
/* binning parameters */
typedef struct sHSM2binningParam {
double HSM2_vmax ;
@ -98,6 +129,21 @@ typedef struct sHSM2binningParam {
double HSM2_ibpc2 ;
} HSM2binningParam ;
/* 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 ;
/* information needed for each instance */
typedef struct sHSM2instance {
struct sHSM2model *HSM2modPtr; /* pointer to model */
@ -118,9 +164,10 @@ typedef struct sHSM2instance {
int HSM2sbNode;
double HSM2_noiflick; /* for 1/f noise calc. */
double HSM2_noithrml; /* for thrmal noise calc. */
double HSM2_noithrml; /* for thermal noise calc. */
double HSM2_noiigate; /* for induced gate noise */
double HSM2_noicross; /* for induced gate noise */
double HSM2_Qdrat; /* for induced gate noise */
/* instance */
double HSM2_l; /* the length of the channel region */
@ -131,7 +178,7 @@ typedef struct sHSM2instance {
double HSM2_ps; /* perimeter of source junction [m] */
double HSM2_nrd; /* equivalent num of squares of drain [-] (unused) */
double HSM2_nrs; /* equivalent num of squares of source [-] (unused) */
double HSM2_temp; /* lattice temperature [K] */
double HSM2_temp; /* lattice temperature [C] */
double HSM2_dtemp;
double HSM2_weff; /* the effective width of the channel region */
@ -158,6 +205,11 @@ typedef struct sHSM2instance {
double HSM2_nsubcdfm; /* DFM */
double HSM2_mphdfm; /* DFM */
double HSM2_m;
/* WPE */
double HSM2_sca; /* scc */
double HSM2_scb; /* scb */
double HSM2_scc; /* scc */
int HSM2_called; /* flag to check the first call */
/* previous values to evaluate initial guess */
@ -376,8 +428,13 @@ typedef struct sHSM2instance {
double HSM2_gdl0;
double HSM2_muecb0;
double HSM2_muecb1;
double HSM2_ktemp; /* lattice temperature [K] */
double HSM2_mueph1 ;
double HSM2_nsubp ;
double HSM2_nsubc ;
HSM2binningParam pParam ; /* binning parameters */
HSM2hereCGSParam hereCGS ; /* unit-converted parameters */
/* no use in SPICE3f5
double HSM2drainSquares; the length of the drain in squares
@ -427,6 +484,10 @@ typedef struct sHSM2instance {
unsigned HSM2_mphdfm_Given :1; /* DFM */
unsigned HSM2_m_Given :1;
/* WPE */
unsigned HSM2_sca_Given :1; /* sca */
unsigned HSM2_scb_Given :1; /* scb */
unsigned HSM2_scc_Given :1; /* scc */
/* pointer to sparse matrix */
double *HSM2GgPtr; /* pointer to sparse matrix element at (gate node,gate node) */
@ -812,6 +873,12 @@ typedef struct sHSM2model { /* model structure for a resistor */
double HSM2_muephw2 ;
double HSM2_muepwp2 ;
/* variables for WPE */
double HSM2_web ;
double HSM2_wec ;
double HSM2_nsubcwpe ;
double HSM2_npextwpe ;
double HSM2_nsubpwpe ;
/* for Ps0_min */
double HSM2_Vgsmin ;
double HSM2_sc3Vbs ; /* SC3 clamping */
@ -1048,8 +1115,11 @@ typedef struct sHSM2model { /* model structure for a resistor */
double HSM2_vcrit ;
int HSM2_flg_qme ;
double HSM2_qme12 ;
double HSM2_ktnom ;
int HSM2_bypass_enable ;
HSM2modelCGSParam modelCGS ; /* unit-converted parameters */
/* flag for model */
unsigned HSM2_type_Given :1;
unsigned HSM2_level_Given :1;
@ -1316,6 +1386,12 @@ typedef struct sHSM2model { /* model structure for a resistor */
unsigned HSM2_muephw2_Given :1;
unsigned HSM2_muepwp2_Given :1;
/* val set flag for WPE */
unsigned HSM2_web_Given :1;
unsigned HSM2_wec_Given :1;
unsigned HSM2_nsubcwpe_Given :1;
unsigned HSM2_npextwpe_Given :1;
unsigned HSM2_nsubpwpe_Given :1;
unsigned HSM2_Vgsmin_Given :1;
unsigned HSM2_sc3Vbs_Given :1;
unsigned HSM2_byptol_Given :1;
@ -1617,6 +1693,11 @@ typedef struct sHSM2model { /* model structure for a resistor */
#define HSM2_MPHDFM 84
#define HSM2_M 83
/* val symbol for WPE */
#define HSM2_SCA 85 /* sca */
#define HSM2_SCB 86 /* scb */
#define HSM2_SCC 87 /* scc */
/* model parameters */
#define HSM2_MOD_VMAX 100
#define HSM2_MOD_BGTMP1 101
@ -1850,6 +1931,13 @@ typedef struct sHSM2model { /* model structure for a resistor */
#define HSM2_MOD_MUEPHW2 463
#define HSM2_MOD_MUEPWP2 464
/* val symbol for WPE */
#define HSM2_MOD_WEB 88
#define HSM2_MOD_WEC 89
#define HSM2_MOD_NSUBCWPE 91
#define HSM2_MOD_NPEXTWPE 41
#define HSM2_MOD_NSUBPWPE 43
#define HSM2_MOD_VGSMIN 466
#define HSM2_MOD_SC3VBS 467
#define HSM2_MOD_BYPTOL 468

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2del.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -14,7 +14,6 @@
***********************************************************************/
#include "ngspice/ngspice.h"
#include <stdio.h>
#include "hsm2def.h"
#include "ngspice/sperror.h"
#include "ngspice/gendefs.h"

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2dest.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -14,7 +14,6 @@
***********************************************************************/
#include "ngspice/ngspice.h"
#include <stdio.h>
#include "hsm2def.h"
#include "ngspice/suffix.h"

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2evalenv.h
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2ext.h
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2getic.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -14,7 +14,6 @@
***********************************************************************/
#include "ngspice/ngspice.h"
#include <stdio.h>
#include "ngspice/cktdefs.h"
#include "hsm2def.h"
#include "ngspice/sperror.h"

View File

@ -8,7 +8,7 @@
SPICEdev HSM2info = {
{ "HiSIM2",
"Hiroshima University STARC IGFET Model 2.5.1",
"Hiroshima University STARC IGFET Model 2.6.1",
&HSM2nSize,
&HSM2nSize,

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2itf.h
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2ld.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -45,7 +45,6 @@ static double vsum0 = 1.0e5 ;
#endif
#endif
static void ShowPhysVals
(
HSM2instance *here,
@ -61,7 +60,6 @@ static void ShowPhysVals
{
NG_IGNORE(vgd);
NG_IGNORE(vbd);
/* regard the epsilon-quantity as 0.0 */
vds = (fabs(vds) < SHOW_EPS_QUANT) ? 0.0 : vds;
vgs = (fabs(vgs) < SHOW_EPS_QUANT) ? 0.0 : vgs;
@ -906,7 +904,7 @@ tm0 = gtodsecld() ;
*(ckt->CKTstate1 + here->HSM2qbd) = *(ckt->CKTstate0 + here->HSM2qbd);
}
}
return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSM2qb));
return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSM2qg));
return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSM2qd));

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2mask.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -14,7 +14,6 @@
***********************************************************************/
#include "ngspice/ngspice.h"
#include <stdio.h>
#include "ngspice/ifsim.h"
#include "ngspice/cktdefs.h"
#include "ngspice/devdefs.h"
@ -823,6 +822,22 @@ int HSM2mAsk(
case HSM2_MOD_MUEPWP2:
value->rValue = model->HSM2_muepwp2;
return(OK);
/* WPE */
case HSM2_MOD_WEB:
value->rValue = model->HSM2_web;
return(OK);
case HSM2_MOD_WEC:
value->rValue = model->HSM2_wec;
return(OK);
case HSM2_MOD_NSUBCWPE:
value->rValue = model->HSM2_nsubcwpe;
return(OK);
case HSM2_MOD_NPEXTWPE:
value->rValue = model->HSM2_npextwpe;
return(OK);
case HSM2_MOD_NSUBPWPE:
value->rValue = model->HSM2_nsubpwpe;
return(OK);
case HSM2_MOD_VGSMIN:
value->rValue = model->HSM2_Vgsmin;
return(OK);

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2mdel.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -14,7 +14,6 @@
***********************************************************************/
#include "ngspice/ngspice.h"
#include <stdio.h>
#include "hsm2def.h"
#include "ngspice/sperror.h"
#include "ngspice/suffix.h"

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2mpar.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -14,7 +14,6 @@
***********************************************************************/
#include "ngspice/ngspice.h"
#include <stdio.h>
#include "hsm2def.h"
#include "ngspice/ifsim.h"
#include "ngspice/sperror.h"
@ -1083,6 +1082,27 @@ int HSM2mParam(
mod->HSM2_muepwp2 = value->rValue;
mod->HSM2_muepwp2_Given = TRUE;
break;
/* WPE */
case HSM2_MOD_WEB:
mod->HSM2_web = value->rValue;
mod->HSM2_web_Given = TRUE;
break;
case HSM2_MOD_WEC:
mod->HSM2_wec = value->rValue;
mod->HSM2_wec_Given = TRUE;
break;
case HSM2_MOD_NSUBCWPE:
mod->HSM2_nsubcwpe = value->rValue;
mod->HSM2_nsubcwpe_Given = TRUE;
break;
case HSM2_MOD_NPEXTWPE:
mod->HSM2_npextwpe = value->rValue;
mod->HSM2_npextwpe_Given = TRUE;
break;
case HSM2_MOD_NSUBPWPE:
mod->HSM2_nsubpwpe = value->rValue;
mod->HSM2_nsubpwpe_Given = TRUE;
break;
case HSM2_MOD_VGSMIN:
mod->HSM2_Vgsmin = value->rValue;
mod->HSM2_Vgsmin_Given = TRUE;

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2noi.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -14,8 +14,6 @@
***********************************************************************/
#include "ngspice/ngspice.h"
#include <stdio.h>
#include <math.h>
#include "hsm2def.h"
#include "ngspice/cktdefs.h"
#include "ngspice/iferrmsg.h"
@ -32,6 +30,9 @@
* all of the MOSFET's is summed with the variable "OnDens".
*/
extern void NevalSrc();
extern double Nintegrate();
int HSM2noise (
int mode, int operation,
GENmodel *inModel,
@ -39,8 +40,6 @@ int HSM2noise (
register Ndata *data,
double *OnDens)
{
NOISEAN *job = (NOISEAN *) ckt->CKTcurJob;
register HSM2model *model = (HSM2model *)inModel;
register HSM2instance *here;
char name[N_MXVLNTH];
@ -51,6 +50,11 @@ int HSM2noise (
register int i;
double R = 0.0 , G = 0.0 ;
double TTEMP = 0.0 ;
/* for induced gate noise calculation: */
double omega = ckt->CKTomega;
double sid, ci, sigrat, Qdrat;
double realXds, imagXds, realXgs, imagXgs ;
/* define the names of the noise sources */
static char * HSM2nNames[HSM2NSRCS] = {
@ -76,42 +80,45 @@ int HSM2noise (
/* see if we have to to produce a summary report */
/* if so, name all the noise generators */
if (job->NStpsSm != 0) {
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) {
switch (mode) {
case N_DENS:
for ( i = 0; i < HSM2NSRCS; i++ ) {
(void) sprintf(name, "onoise.%s%s",
here->HSM2name, HSM2nNames[i]);
(char *)here->HSM2name, HSM2nNames[i]);
data->namelist =
TREALLOC(IFuid, data->namelist, data->numPlots + 1);
(IFuid *) trealloc((char *) data->namelist,
(data->numPlots + 1) * sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
SPfrontEnd->IFnewUid
(*(SPfrontEnd->IFnewUid))
(ckt, &(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER, NULL);
(IFuid) NULL, name, UID_OTHER, NULL);
}
break;
case INT_NOIZ:
for ( i = 0; i < HSM2NSRCS; i++ ) {
(void) sprintf(name, "onoise_total.%s%s",
here->HSM2name, HSM2nNames[i]);
(char *)here->HSM2name, HSM2nNames[i]);
data->namelist =
TREALLOC(IFuid, data->namelist, data->numPlots + 1);
(IFuid *) trealloc((char *) data->namelist,
(data->numPlots + 1) * sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
SPfrontEnd->IFnewUid
(*(SPfrontEnd->IFnewUid))
(ckt, &(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER, NULL);
(IFuid) NULL, name, UID_OTHER, NULL);
(void) sprintf(name, "inoise_total.%s%s",
here->HSM2name, HSM2nNames[i]);
(char *)here->HSM2name, HSM2nNames[i]);
data->namelist =
TREALLOC(IFuid, data->namelist, data->numPlots + 1);
(IFuid *) trealloc((char *) data->namelist,
(data->numPlots + 1) * sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
SPfrontEnd->IFnewUid
(*(SPfrontEnd->IFnewUid))
(ckt, &(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER, NULL);
(IFuid) NULL, name, UID_OTHER, NULL);
}
break;
}
@ -123,7 +130,7 @@ int HSM2noise (
/* temperature */
TTEMP = ckt->CKTtemp ;
if ( here->HSM2_temp_Given ) TTEMP = here->HSM2_temp ;
if ( here->HSM2_temp_Given ) TTEMP = here->HSM2_ktemp ;
if ( here->HSM2_dtemp_Given ) {
TTEMP = TTEMP + here->HSM2_dtemp ;
}
@ -215,11 +222,19 @@ int HSM2noise (
switch ( model->HSM2_noise ) {
case 1:
/* HiSIM model */
NevalSrc(&noizDens[HSM2IGNOIZ], (double*) NULL,
ckt, N_GAIN,
here->HSM2dNodePrime, here->HSM2sNodePrime,
(double) 0.0);
noizDens[HSM2IGNOIZ] *= here->HSM2_noiigate * here->HSM2_noicross * here->HSM2_noicross * data->freq * data->freq;
sid = 4.0 * CONSTboltz * TTEMP * here->HSM2_noithrml ;
ci = here->HSM2_noicross ;
sigrat = (sid > 0.0 && here->HSM2_noiigate > 0.0) ? sqrt(here->HSM2_noiigate/sid) : 0.0 ;
Qdrat = here->HSM2_Qdrat ;
realXds = *(ckt->CKTrhs +here->HSM2dNodePrime) - *(ckt->CKTrhs +here->HSM2sNodePrime);
imagXds = *(ckt->CKTirhs+here->HSM2dNodePrime) - *(ckt->CKTirhs+here->HSM2sNodePrime);
realXgs = *(ckt->CKTrhs +here->HSM2gNodePrime) - *(ckt->CKTrhs +here->HSM2sNodePrime);
imagXgs = *(ckt->CKTirhs+here->HSM2gNodePrime) - *(ckt->CKTirhs+here->HSM2sNodePrime);
noizDens[HSM2IGNOIZ] = 2.0 * omega * ci * sigrat * sid * ( realXgs*imagXds - realXds*imagXgs )
+ omega*omega * sigrat*sigrat * sid * ( (realXgs-Qdrat*realXds) * (realXgs-Qdrat*realXds)
+(imagXgs-Qdrat*imagXds) * (imagXgs-Qdrat*imagXds) ) ;
lnNdens[HSM2IGNOIZ] = log(MAX(noizDens[HSM2IGNOIZ], N_MINLOG));
break;
}
@ -247,7 +262,7 @@ int HSM2noise (
/* clear out our integration variables
if it's the first pass
*/
if (data->freq == job->NstartFreq) {
if (data->freq == ((NOISEAN*) ckt->CKTcurJob)->NstartFreq) {
for (i = 0; i < HSM2NSRCS; i++) {
here->HSM2nVar[OUTNOIZ][i] = 0.0;
here->HSM2nVar[INNOIZ][i] = 0.0;
@ -271,7 +286,7 @@ int HSM2noise (
here->HSM2nVar[LNLSTDENS][i] = lnNdens[i];
data->outNoiz += tempOnoise;
data->inNoise += tempInoise;
if ( job->NStpsSm != 0 ) {
if ( ((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0 ) {
here->HSM2nVar[OUTNOIZ][i] += tempOnoise;
here->HSM2nVar[OUTNOIZ][HSM2TOTNOIZ] += tempOnoise;
here->HSM2nVar[INNOIZ][i] += tempInoise;
@ -289,7 +304,7 @@ int HSM2noise (
break;
case INT_NOIZ:
/* already calculated, just output */
if ( job->NStpsSm != 0 ) {
if ( ((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0 ) {
for ( i = 0; i < HSM2NSRCS; i++ ) {
data->outpVector[data->outNumber++] = here->HSM2nVar[OUTNOIZ][i];
data->outpVector[data->outNumber++] = here->HSM2nVar[INNOIZ][i];

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2par.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -14,7 +14,6 @@
***********************************************************************/
#include "ngspice/ngspice.h"
#include <stdio.h>
#include "ngspice/ifsim.h"
#include "hsm2def.h"
#include "ngspice/sperror.h"
@ -174,6 +173,20 @@ int HSM2param(
here->HSM2_m = value->rValue;
here->HSM2_m_Given = TRUE;
break;
/* WPE */
case HSM2_SCA:
here->HSM2_sca = value->rValue;
here->HSM2_sca_Given = TRUE;
break;
case HSM2_SCB:
here->HSM2_scb = value->rValue;
here->HSM2_scb_Given = TRUE;
break;
case HSM2_SCC:
here->HSM2_scc= value->rValue;
here->HSM2_scc_Given = TRUE;
break;
default:
return(E_BADPARM);
}

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2pzld.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -14,7 +14,6 @@
***********************************************************************/
#include "ngspice/ngspice.h"
#include <stdio.h>
#include "ngspice/cktdefs.h"
#include "ngspice/complex.h"
#include "ngspice/sperror.h"
@ -28,8 +27,8 @@ int HSM2pzLoad(
{
register HSM2model *model = (HSM2model*)inModel;
register HSM2instance *here;
double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb;
double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb;
double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb = 0.0, xcbsb, xcbbb;
double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb = 0.0, xcssb, xcsbb;
double xcdbdb = 0.0, xcsbsb = 0.0;
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, FwdSum, RevSum, gm, gmbs;
double gjbd, gjbs, grg;

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2set.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -14,7 +14,6 @@
***********************************************************************/
#include "ngspice/ngspice.h"
#include <stdio.h>
#include "ngspice/smpdefs.h"
#include "ngspice/cktdefs.h"
#include "hsm2def.h"
@ -49,13 +48,13 @@ int HSM2setup(
model->HSM2_noise = 1; /* allways noise is set to be 1 */
if ( !model->HSM2_version_Given) {
model->HSM2_version = 251; /* default 251 */
printf(" 251 is selected for VERSION. (default) \n");
model->HSM2_version = 261; /* default 261 */
printf(" 261 is selected for VERSION. (default) \n");
} else {
if (model->HSM2_version != 251) {
model->HSM2_version = 251; /* default 251 */
printf(" 251 is only available for VERSION. \n");
printf(" 251 is selected for VERSION. (default) \n");
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");
} else {
printf(" %d is selected for VERSION \n", (int)model->HSM2_version);
}
@ -357,6 +356,12 @@ int HSM2setup(
if ( !model->HSM2_nsubcwp2_Given ) model->HSM2_nsubcwp2 = 1.0 ;
if ( !model->HSM2_muephw2_Given ) model->HSM2_muephw2 = 0.0 ;
if ( !model->HSM2_muepwp2_Given ) model->HSM2_muepwp2 = 1.0 ;
/* WPE set default Model parameter value */
if ( !model->HSM2_web_Given ) model->HSM2_web = 0.0 ;
if ( !model->HSM2_wec_Given ) model->HSM2_wec = 0.0 ;
if ( !model->HSM2_nsubcwpe_Given ) model->HSM2_nsubcwpe = 0.0 ;
if ( !model->HSM2_npextwpe_Given ) model->HSM2_npextwpe = 0.0 ;
if ( !model->HSM2_nsubpwpe_Given ) model->HSM2_nsubpwpe = 0.0 ;
if ( !model->HSM2_Vgsmin_Given ) model->HSM2_Vgsmin = -5.0 * model->HSM2_type ;
if ( !model->HSM2_sc3Vbs_Given ) model->HSM2_sc3Vbs = 0.0 ;
if ( !model->HSM2_byptol_Given ) model->HSM2_byptol = 0.0 ;
@ -611,8 +616,8 @@ int HSM2setup(
if ( !here->HSM2_as_Given ) here->HSM2_as = 0.0 ;
if ( !here->HSM2_pd_Given ) here->HSM2_pd = 0.0 ;
if ( !here->HSM2_ps_Given ) here->HSM2_ps = 0.0 ;
if ( !here->HSM2_nrd_Given ) here->HSM2_nrd = 1.0 ;
if ( !here->HSM2_nrs_Given ) here->HSM2_nrs = 1.0 ;
if ( !here->HSM2_nrd_Given ) here->HSM2_nrd = 0.0 ;
if ( !here->HSM2_nrs_Given ) here->HSM2_nrs = 0.0 ;
if ( !here->HSM2_ngcon_Given ) here->HSM2_ngcon = 1.0 ;
if ( !here->HSM2_xgw_Given ) here->HSM2_xgw = 0e0 ;
if ( !here->HSM2_xgl_Given ) here->HSM2_xgl = 0e0 ;
@ -649,34 +654,42 @@ int HSM2setup(
if ( !here->HSM2_mphdfm_Given ) here->HSM2_mphdfm = model->HSM2_mphdfm ;
if ( !here->HSM2_m_Given ) here->HSM2_m = 1.0 ;
/* WPE */
if ( !here->HSM2_sca_Given ) here->HSM2_sca = 0.0 ; /* default value */
if ( !here->HSM2_scb_Given ) here->HSM2_scb = 0.0 ; /* default value */
if ( !here->HSM2_scc_Given ) here->HSM2_scc = 0.0 ; /* default value */
/* process drain series resistance */
if ((model->HSM2_corsrd < 0 &&
(model->HSM2_rsh > 0.0 || model->HSM2_rd > 0.0)) && here->HSM2dNodePrime == 0) {
(model->HSM2_rsh > 0.0 || model->HSM2_rd > 0.0))) {
if(here->HSM2dNodePrime <= 0) {
error = CKTmkVolt(ckt, &tmp, here->HSM2name, "drain");
if (error) return(error);
here->HSM2dNodePrime = tmp->number;
}
} else {
here->HSM2dNodePrime = here->HSM2dNode;
}
/* process source series resistance */
if ((model->HSM2_corsrd < 0 &&
(model->HSM2_rsh > 0.0 || model->HSM2_rs > 0.0)) && here->HSM2sNodePrime == 0) {
(model->HSM2_rsh > 0.0 || model->HSM2_rs > 0.0))) {
if(here->HSM2sNodePrime == 0) {
error = CKTmkVolt(ckt, &tmp, here->HSM2name, "source");
if (error) return(error);
here->HSM2sNodePrime = tmp->number;
}
} else {
here->HSM2sNodePrime = here->HSM2sNode;
}
/* process gate resistance */
if ((here->HSM2_corg == 1 && model->HSM2_rshg > 0.0) && here->HSM2gNodePrime == 0) {
if ((here->HSM2_corg == 1 && model->HSM2_rshg > 0.0)) {
if(here->HSM2gNodePrime <= 0) {
error = CKTmkVolt(ckt, &tmp, here->HSM2name, "gate");
if (error) return(error);
here->HSM2gNodePrime = tmp->number;
}
} else {
here->HSM2gNodePrime = here->HSM2gNode;
}
@ -773,7 +786,6 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
return(OK);
}
int
HSM2unsetup(
GENmodel *inModel,

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2temp.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -41,8 +41,6 @@
#define Fn_SZtemp( y , x , delta ) { \
T1 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta) ) ; \
y = 0.5 * ( ( x ) + T1 ) ; \
if (y < 0) \
y = 0 ; \
}
#define Fn_SUtemp( y , x , xmax , delta ) { \
@ -64,6 +62,8 @@ int HSM2temp(
register HSM2model *model = (HSM2model *)inModel ;
register HSM2instance *here ;
HSM2binningParam *pParam ;
HSM2modelCGSParam *modelCGS ;
HSM2hereCGSParam *hereCGS ;
double mueph ;
double Leff, dL , LG, Weff, dW , WG , WL , Lgate , Wgate;
double Lbin, Wbin, LWbin ; /* binning */
@ -88,6 +88,7 @@ int HSM2temp(
for ( ;model ;model = model->HSM2nextModel ) {
modelCGS = &model->modelCGS ;
/*-----------------------------------------------------------*
* Range check of model parameters
@ -140,37 +141,37 @@ int HSM2temp(
/*-----------------------------------------------------------*
* Change units into CGS.
*-----------------*/
model->HSM2_tox *= C_m2cm ;
model->HSM2_xld *= C_m2cm ;
model->HSM2_xwd *= C_m2cm ;
model->HSM2_xqy *= C_m2cm ;
model->HSM2_xl *= C_m2cm ;
model->HSM2_xw *= C_m2cm ;
model->HSM2_saref *= C_m2cm ;
model->HSM2_sbref *= C_m2cm ;
model->HSM2_ll *= C_m2cm ;
model->HSM2_lld *= C_m2cm ;
model->HSM2_wl *= C_m2cm ;
model->HSM2_wld *= C_m2cm ;
model->HSM2_lp *= C_m2cm ;
model->HSM2_tpoly *= C_m2cm ;
model->HSM2_parl2 *= C_m2cm ;
model->HSM2_qme1 *= C_m2cm ;
model->HSM2_qme3 *= C_m2cm ;
model->HSM2_cgbo /= C_m2cm ;
model->HSM2_cj /= C_m2cm_p2 ;
model->HSM2_cjsw /= C_m2cm ;
model->HSM2_cjswg /= C_m2cm ;
model->HSM2_lpext *= C_m2cm ;
model->HSM2_wl1 *= C_m2cm ;
model->HSM2_rs *= C_m2cm ;
model->HSM2_rd *= C_m2cm ;
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_tnom += 273.15 ; /* [C] -> [K] */
model->HSM2_ktnom = model->HSM2_tnom + 273.15 ; /* [C] -> [K] */
/* SourceSatCurrent = 1.0e-14 */
@ -186,37 +187,38 @@ int HSM2temp(
}
for ( here = model->HSM2instances; here; here = here->HSM2nextInstance ) {
hereCGS = &here->hereCGS ;
pParam = &here->pParam ;
/*-----------------------------------------------------------*
* Range check of instance parameters
*-----------------*/
RANGECHECK(here->HSM2_l, model->HSM2_lmin, model->HSM2_lmax, "L") ;
RANGECHECK(here->HSM2_w, model->HSM2_wmin, model->HSM2_wmax, "W") ;
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 units into CGS.
*-----------------*/
here->HSM2_l *= C_m2cm ;
here->HSM2_w *= C_m2cm ;
here->HSM2_as *= C_m2cm_p2 ;
here->HSM2_ad *= C_m2cm_p2 ;
here->HSM2_ps *= C_m2cm ;
here->HSM2_pd *= C_m2cm ;
here->HSM2_xgw *= C_m2cm ;
here->HSM2_xgl *= C_m2cm ;
here->HSM2_sa *= C_m2cm ;
here->HSM2_sb *= C_m2cm ;
here->HSM2_sd *= C_m2cm ;
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_temp += 273.15 ; /* [C] -> [K] */
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 ;
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 ;
@ -350,8 +352,8 @@ int HSM2temp(
pParam->HSM2_js0sw /= C_m2cm ;
/* Band gap */
here->HSM2_egtnom = pParam->HSM2_eg0 - model->HSM2_tnom
* ( 90.25e-6 + model->HSM2_tnom * 1.0e-7 ) ;
here->HSM2_egtnom = pParam->HSM2_eg0 - model->HSM2_ktnom
* ( 90.25e-6 + model->HSM2_ktnom * 1.0e-7 ) ;
/* C_EOX */
here->HSM2_cecox = C_VAC * model->HSM2_kappa ;
@ -371,19 +373,19 @@ int HSM2temp(
here->HSM2_clmmod = 1e0 + pow( LG , model->HSM2_clm5 ) * model->HSM2_clm6 ;
/* Half length of diffusion */
T1 = 1.0 / (model->HSM2_saref + 0.5 * here->HSM2_l)
+ 1.0 / (model->HSM2_sbref + 0.5 * here->HSM2_l);
T1 = 1.0 / (modelCGS->HSM2_saref + 0.5 * hereCGS->HSM2_l)
+ 1.0 / (modelCGS->HSM2_sbref + 0.5 * hereCGS->HSM2_l);
Lod_half_ref = 2.0 / T1 ;
if (here->HSM2_sa > 0.0 && here->HSM2_sb > 0.0 &&
if (hereCGS->HSM2_sa > 0.0 && hereCGS->HSM2_sb > 0.0 &&
(here->HSM2_nf == 1.0 ||
(here->HSM2_nf > 1.0 && here->HSM2_sd > 0.0))) {
(here->HSM2_nf > 1.0 && hereCGS->HSM2_sd > 0.0))) {
T1 = 0.0;
for (i = 0; i < here->HSM2_nf; i++) {
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));
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));
}
Lod_half = 2.0 * here->HSM2_nf / T1;
} else {
@ -391,17 +393,41 @@ int HSM2temp(
}
Npext = model->HSM2_npext * ( 1.0 + model->HSM2_npextw / pow( WG, model->HSM2_npextwp ) ); /* new */
here->HSM2_mueph1 = pParam->HSM2_mueph1 ;
here->HSM2_nsubp = pParam->HSM2_nsubp ;
here->HSM2_nsubc = pParam->HSM2_nsubc ;
/* DFM */
if ( model->HSM2_codfm == 1 && here->HSM2_nsubcdfm_Given ) {
RANGECHECK(here->HSM2_nsubcdfm, 1.0e16, 1.0e19, "NSUBCDFM") ;
pParam->HSM2_mueph1 *= here->HSM2_mphdfm
* ( log(here->HSM2_nsubcdfm) - log(pParam->HSM2_nsubc) ) + 1.0 ;
pParam->HSM2_nsubp += here->HSM2_nsubcdfm - pParam->HSM2_nsubc ;
Npext += here->HSM2_nsubcdfm - pParam->HSM2_nsubc ;
pParam->HSM2_nsubc = here->HSM2_nsubcdfm ;
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 ;
}
/* WPE */
T0 = model->HSM2_nsubcwpe *
( here->HSM2_sca
+ model->HSM2_web * here->HSM2_scb
+ model->HSM2_wec * here->HSM2_scc ) ;
here->HSM2_nsubc += T0 ;
Fn_SLtemp( here->HSM2_nsubc , here->HSM2_nsubc , 1e15 , 0.01 ) ;
T0 = model->HSM2_nsubpwpe *
( here->HSM2_sca
+ model->HSM2_web * here->HSM2_scb
+ model->HSM2_wec * here->HSM2_scc ) ;
here->HSM2_nsubp += T0 ;
Fn_SLtemp( here->HSM2_nsubp , here->HSM2_nsubp , 1e15 , 0.01 ) ;
T0 = model->HSM2_npextwpe *
( here->HSM2_sca
+ model->HSM2_web * here->HSM2_scb
+ model->HSM2_wec * here->HSM2_scc ) ;
Npext += T0 ;
Fn_SLtemp( Npext , Npext , 1e15 , 0.01 ) ;
/* WPE end */
/* Coulomb Scattering */
here->HSM2_muecb0 = pParam->HSM2_muecb0 * pow( LG, model->HSM2_muecb0lp );
here->HSM2_muecb1 = pParam->HSM2_muecb1 * pow( LG, model->HSM2_muecb1lp );
@ -439,10 +465,10 @@ int HSM2temp(
here->HSM2_ninv_o_esi = pParam->HSM2_ninv / C_ESI ;
/* Metallurgical channel geometry */
dL = model->HSM2_xld
+ (model->HSM2_ll / pow (Lgate + model->HSM2_lld, model->HSM2_lln)) ;
dW = model->HSM2_xwd
+ (model->HSM2_wl / pow (Wgate + model->HSM2_wld, model->HSM2_wln)) ;
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)) ;
Leff = Lgate - 2.0e0 * dL ;
if ( Leff <= 1.0e-7 ) {
@ -460,7 +486,7 @@ int HSM2temp(
here->HSM2_leff = Leff ;
/* Wg dependence for short channel devices */
here->HSM2_lgatesm = Lgate + model->HSM2_wl1 / pow( WL , model->HSM2_wl1p ) ;
here->HSM2_lgatesm = Lgate + modelCGS->HSM2_wl1 / pow( WL , model->HSM2_wl1p ) ;
here->HSM2_dVthsm = pParam->HSM2_wl2 / pow( WL , model->HSM2_wl2p ) ;
/* Lg dependence of wsti */
@ -488,10 +514,10 @@ int HSM2temp(
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 ) ;
pParam->HSM2_nsubp *= T1 ;
here->HSM2_nsubp *= T1 ;
/* Note: Sign Changed --> */
Nsubpp = pParam->HSM2_nsubp
Nsubpp = here->HSM2_nsubp
* (1.0e0 + (model->HSM2_nsubpw / pow (WG, model->HSM2_nsubpwp))) ;
/* <-- Note: Sign Changed */
@ -506,47 +532,47 @@ int HSM2temp(
T2 = 1.0e0 + ( model->HSM2_nsubcw / pow ( WG, model->HSM2_nsubcwp )) ;
T2 *= 1.0e0 + ( model->HSM2_nsubcw2 / pow ( WG, model->HSM2_nsubcwp2 )) ;
T3 = model->HSM2_nsubcmax / pParam->HSM2_nsubc ;
T3 = model->HSM2_nsubcmax / here->HSM2_nsubc ;
Fn_SUtemp( T1 , T2 , T3 , 0.01 ) ;
pParam->HSM2_nsubc *= T1 ;
here->HSM2_nsubc *= T1 ;
if ( pParam->HSM2_nsubc <= 0.0 ) {
if ( here->HSM2_nsubc <= 0.0 ) {
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" ) ;
pParam->HSM2_nsubc = 1e15 ;
here->HSM2_nsubc = 1e15 ;
}
if(Npext < pParam->HSM2_nsubc || Npext > pParam->HSM2_nsubp) {
if(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 , " ( Npext = %e , NSUBC = %e , NSUBP = %e ) \n",Npext,pParam->HSM2_nsubc,pParam->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" ) ;
}
if( Lgate > model->HSM2_lp ){
Nsub = (pParam->HSM2_nsubc * (Lgate - model->HSM2_lp)
+ Nsubps * model->HSM2_lp) / Lgate ;
if( Lgate > modelCGS->HSM2_lp ){
Nsub = (here->HSM2_nsubc * (Lgate - modelCGS->HSM2_lp)
+ Nsubps * modelCGS->HSM2_lp) / Lgate ;
} else {
Nsub = Nsubps
+ (Nsubps - pParam->HSM2_nsubc) * (model->HSM2_lp - Lgate)
/ model->HSM2_lp ;
+ (Nsubps - here->HSM2_nsubc) * (modelCGS->HSM2_lp - Lgate)
/ modelCGS->HSM2_lp ;
}
T3 = 0.5e0 * Lgate - model->HSM2_lp ;
T3 = 0.5e0 * Lgate - modelCGS->HSM2_lp ;
Fn_SZtemp( T3 , T3 , 1e-8 ) ;
T1 = Fn_Max(0.0e0, model->HSM2_lpext ) ;
T1 = Fn_Max(0.0e0, modelCGS->HSM2_lpext ) ;
T2 = T3 * T1 / ( T3 + T1 ) ;
here->HSM2_nsub =
Nsub = Nsub + T2 * (Npext - pParam->HSM2_nsubc) / Lgate ;
Nsub = Nsub + T2 * (Npext - here->HSM2_nsubc) / Lgate ;
here->HSM2_qnsub = q_Nsub = C_QE * Nsub ;
here->HSM2_qnsub_esi = q_Nsub * C_ESI ;
here->HSM2_2qnsub_esi = 2.0 * here->HSM2_qnsub_esi ;
/* Pocket Overlap (temperature-independent part) */
if ( Lgate <= 2.0e0 * model->HSM2_lp ) {
if ( Lgate <= 2.0e0 * modelCGS->HSM2_lp ) {
Nsubb = 2.0e0 * Nsubps
- (Nsubps - pParam->HSM2_nsubc) * Lgate
/ model->HSM2_lp - pParam->HSM2_nsubc ;
here->HSM2_ptovr0 = log (Nsubb / pParam->HSM2_nsubc) ;
- (Nsubps - here->HSM2_nsubc) * Lgate
/ modelCGS->HSM2_lp - here->HSM2_nsubc ;
here->HSM2_ptovr0 = log (Nsubb / here->HSM2_nsubc) ;
} else {
here->HSM2_ptovr0 = 0.0e0 ;
}
@ -563,7 +589,7 @@ int HSM2temp(
/* @300K, with pocket */
here->HSM2_pb20 = 2.0e0 / C_b300 * log (Nsub / C_Nin0) ;
/* @300K, w/o pocket */
here->HSM2_pb2c = 2.0e0 / C_b300 * log (pParam->HSM2_nsubc / C_Nin0) ;
here->HSM2_pb2c = 2.0e0 / C_b300 * log (here->HSM2_nsubc / C_Nin0) ;
/* constant for Poly depletion */
@ -575,8 +601,8 @@ int HSM2temp(
/* Gate resistance */
if ( here->HSM2_corg == 1 ) {
T1 = here->HSM2_xgw + Weff / (3.0e0 * here->HSM2_ngcon);
T2 = Lgate - here->HSM2_xgl;
T1 = hereCGS->HSM2_xgw + Weff / (3.0e0 * here->HSM2_ngcon);
T2 = Lgate - hereCGS->HSM2_xgl;
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;
else {
@ -590,16 +616,16 @@ int HSM2temp(
if ( model->HSM2_rsh > 0.0 ) {
here->HSM2_rd += model->HSM2_rsh * here->HSM2_nrd ;
}
if ( model->HSM2_rd > 0.0 ) {
here->HSM2_rd += model->HSM2_rd / here->HSM2_weff_nf ;
if ( modelCGS->HSM2_rd > 0.0 ) {
here->HSM2_rd += modelCGS->HSM2_rd / here->HSM2_weff_nf ;
}
here->HSM2_rs = 0.0;
if ( model->HSM2_rsh > 0.0 ) {
here->HSM2_rs += model->HSM2_rsh * here->HSM2_nrs ;
}
if ( model->HSM2_rs > 0.0 ) {
here->HSM2_rs += model->HSM2_rs / here->HSM2_weff_nf ;
if ( modelCGS->HSM2_rs > 0.0 ) {
here->HSM2_rs += modelCGS->HSM2_rs / here->HSM2_weff_nf ;
}
if (model->HSM2_corsrd < 0) {
@ -677,7 +703,7 @@ int HSM2temp(
/* Fringing capacitance */
here->HSM2_cfrng = C_EOX / ( C_Pi / 2.0e0 ) * here->HSM2_weff_nf
* log( 1.0e0 + model->HSM2_tpoly / model->HSM2_tox ) ;
* log( 1.0e0 + modelCGS->HSM2_tpoly / modelCGS->HSM2_tox ) ;
/* Additional term of lateral-field-induced capacitance */
here->HSM2_cqyb0 = 1.0e4 * here->HSM2_weff_nf
@ -686,29 +712,29 @@ int HSM2temp(
/* Parasitic component of the channel current */
here->HSM2_ptl0 = model->HSM2_ptl * pow( LG , - model->HSM2_ptlp ) ;
here->HSM2_pt40 = model->HSM2_pt4 * pow( LG , - model->HSM2_pt4p ) ;
here->HSM2_gdl0 = model->HSM2_gdl * pow( LG + GDLD , - model->HSM2_gdlp ) ;
here->HSM2_gdl0 = model->HSM2_gdl * pow( LG + modelCGS->HSM2_gdld , - model->HSM2_gdlp ) ;
/*-----------------------------------------------------------*
* Temperature dependent constants.
*-----------------*/
TTEMP = ckt->CKTtemp ;
if ( here->HSM2_temp_Given ) TTEMP = here->HSM2_temp ;
if ( here->HSM2_temp_Given ) TTEMP = here->HSM2_ktemp ;
if ( here->HSM2_dtemp_Given ) {
TTEMP = TTEMP + here->HSM2_dtemp ;
here->HSM2_temp = TTEMP ;
here->HSM2_ktemp = TTEMP ;
}
/* Band gap */
T1 = TTEMP - model->HSM2_tnom ;
T2 = TTEMP * TTEMP - model->HSM2_tnom * model->HSM2_tnom ;
T1 = TTEMP - model->HSM2_ktnom ;
T2 = TTEMP * TTEMP - model->HSM2_ktnom * model->HSM2_ktnom ;
here->HSM2_eg = Eg = here->HSM2_egtnom - pParam->HSM2_bgtmp1 * T1
- pParam->HSM2_bgtmp2 * T2 ;
here->HSM2_sqrt_eg = sqrt( Eg ) ;
T1 = 1.0 / TTEMP ;
T2 = 1.0 / model->HSM2_tnom ;
T2 = 1.0 / model->HSM2_ktnom ;
T3 = here->HSM2_egtnom + model->HSM2_egig
+ model->HSM2_igtemp2 * ( T1 - T2 )
+ model->HSM2_igtemp3 * ( T1 * T1 - T2 * T2 ) ;
@ -720,15 +746,15 @@ int HSM2temp(
here->HSM2_beta = beta = C_QE / (C_KB * TTEMP) ;
here->HSM2_beta_inv = 1.0 / beta ;
here->HSM2_beta2 = beta * beta ;
here->HSM2_betatnom = C_QE / (C_KB * model->HSM2_tnom) ;
here->HSM2_betatnom = C_QE / (C_KB * model->HSM2_ktnom) ;
/* Intrinsic carrier concentration */
here->HSM2_nin = Nin = C_Nin0 * pow (TTEMP / model->HSM2_tnom, 1.5e0)
here->HSM2_nin = Nin = C_Nin0 * pow (TTEMP / model->HSM2_ktnom, 1.5e0)
* exp (- Eg / 2.0e0 * beta + here->HSM2_egtnom / 2.0e0 * here->HSM2_betatnom) ;
/* Phonon Scattering (temperature-dependent part) */
T1 = pow (TTEMP / model->HSM2_tnom, pParam->HSM2_muetmp) ;
T1 = pow (TTEMP / model->HSM2_ktnom, pParam->HSM2_muetmp) ;
here->HSM2_mphn0 = T1 / here->HSM2_mueph ;
here->HSM2_mphn1 = here->HSM2_mphn0 * model->HSM2_mueph0 ;
@ -738,7 +764,7 @@ int HSM2temp(
/* Velocity Temperature Dependence */
T1 = TTEMP / model->HSM2_tnom ;
T1 = TTEMP / model->HSM2_ktnom ;
here->HSM2_vmax = here->HSM2_vmax0 * pParam->HSM2_vmax
/ (1.8 + 0.4 * T1 + 0.1 * T1 * T1 - pParam->HSM2_vtmp * (1.0e0 - T1)) ;
@ -754,7 +780,7 @@ int HSM2temp(
here->HSM2_pb2over = 2.0 / beta * log( pParam->HSM2_nover / Nin ) ;
/* (1 / cnst1 / cnstCoxi) for Ps0LD_iniB */
T1 = here->HSM2_cnst0over * model->HSM2_tox / here->HSM2_cecox ;
T1 = here->HSM2_cnst0over * modelCGS->HSM2_tox / here->HSM2_cecox ;
T2 = pParam->HSM2_nover / Nin ;
T1 = T2 * T2 / ( T1 * T1 ) ;
here->HSM2_ps0ldinib = T1 ; /* (1 / cnst1 / cnstCoxi) */
@ -768,7 +794,7 @@ int HSM2temp(
/* Depletion Width */
T1 = 2.0e0 * C_ESI / C_QE ;
here->HSM2_wdpl = sqrt ( T1 / here->HSM2_nsub ) ;
here->HSM2_wdplp = sqrt( T1 / ( pParam->HSM2_nsubp ) ) ;
here->HSM2_wdplp = sqrt( T1 / ( here->HSM2_nsubp ) ) ;
/* cnst1: n_{p0} / p_{p0} */
T1 = Nin / here->HSM2_nsub ;
@ -778,31 +804,31 @@ int HSM2temp(
/* for substrate-source/drain junction diode. */
js = pParam->HSM2_js0
* exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta
+ model->HSM2_xti * log (TTEMP / model->HSM2_tnom)) / pParam->HSM2_nj) ;
+ model->HSM2_xti * log (TTEMP / model->HSM2_ktnom)) / pParam->HSM2_nj) ;
jssw = pParam->HSM2_js0sw
* exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta
+ model->HSM2_xti * log (TTEMP / model->HSM2_tnom)) / model->HSM2_njsw) ;
+ model->HSM2_xti * log (TTEMP / model->HSM2_ktnom)) / model->HSM2_njsw) ;
js2 = pParam->HSM2_js0
* exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta
+ model->HSM2_xti2 * log (TTEMP / model->HSM2_tnom)) / pParam->HSM2_nj) ;
+ model->HSM2_xti2 * log (TTEMP / model->HSM2_ktnom)) / pParam->HSM2_nj) ;
jssw2 = pParam->HSM2_js0sw
* exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta
+ model->HSM2_xti2 * log (TTEMP / model->HSM2_tnom)) / model->HSM2_njsw) ;
+ model->HSM2_xti2 * log (TTEMP / model->HSM2_ktnom)) / model->HSM2_njsw) ;
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_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_vbdt = pParam->HSM2_nj / beta
* log (pParam->HSM2_vdiffj * (TTEMP / model->HSM2_tnom) * (TTEMP / model->HSM2_tnom)
* log (pParam->HSM2_vdiffj * (TTEMP / model->HSM2_ktnom) * (TTEMP / model->HSM2_ktnom)
/ (here->HSM2_isbd + 1.0e-50) + 1) ;
here->HSM2_vbst = pParam->HSM2_nj / beta
* log (pParam->HSM2_vdiffj * (TTEMP / model->HSM2_tnom) * (TTEMP / model->HSM2_tnom)
* log (pParam->HSM2_vdiffj * (TTEMP / model->HSM2_ktnom) * (TTEMP / model->HSM2_ktnom)
/ (here->HSM2_isbs + 1.0e-50) + 1) ;
here->HSM2_exptemp = exp (((TTEMP / model->HSM2_tnom) - 1) * model->HSM2_ctemp) ;
here->HSM2_exptemp = exp (((TTEMP / model->HSM2_ktnom) - 1) * model->HSM2_ctemp) ;
here->HSM2_jd_nvtm_inv = 1.0 / ( pParam->HSM2_nj / beta ) ;
here->HSM2_jd_expcd = exp (here->HSM2_vbdt * here->HSM2_jd_nvtm_inv ) ;
here->HSM2_jd_expcs = exp (here->HSM2_vbst * here->HSM2_jd_nvtm_inv ) ;
@ -823,7 +849,7 @@ int HSM2temp(
cnst0 = here->HSM2_cnst0 ;
cnst1 = here->HSM2_cnst1 ;
c_eox = here->HSM2_cecox ;
Tox = model->HSM2_tox ;
Tox = modelCGS->HSM2_tox ;
Cox = c_eox / Tox ;
Cox_inv = 1.0 / Cox ;
fac1 = cnst0 * Cox_inv ;
@ -846,12 +872,12 @@ int HSM2temp(
Qb0 = sqrt ( T1 ) ;
Vthp = Ps0 + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr ;
T1 = 2.0 * C_QE * pParam->HSM2_nsubc * C_ESI ;
T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ;
T2 = sqrt( T1 ) ;
Vth0 = Ps0 + Vfb + T2 * Cox_inv ;
T1 = C_ESI * Cox_inv ;
T2 = here->HSM2_wdplp ;
T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ;
T4 = 1.0e0 / ( modelCGS->HSM2_lp * modelCGS->HSM2_lp ) ;
T3 = 2.0 * ( model->HSM2_vbi - Pb20 ) * T2 * T4 ;
T5 = T1 * T3 ;
T6 = Ps0 - sc3Vbs ;
@ -861,12 +887,12 @@ int HSM2temp(
T1 = Vthp - Vth0 ;
T9 = Ps0 - sc3Vbs ;
T9_dVb = Ps0_dVbs - 1.0 ;
T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / model->HSM2_lp;
T3_dVb = pParam->HSM2_scp3 * T9_dVb / model->HSM2_lp ;
T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / modelCGS->HSM2_lp;
T3_dVb = pParam->HSM2_scp3 * T9_dVb / modelCGS->HSM2_lp ;
dVthLP = T1 * dVth0 * T3 ;
dVthLP_dVb = T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb;
T3 = here->HSM2_lgate - model->HSM2_parl2 ;
T3 = here->HSM2_lgate - modelCGS->HSM2_parl2 ;
T4 = 1.0e0 / ( T3 * T3 ) ;
T0 = C_ESI * here->HSM2_wdpl * 2.0e0 * ( model->HSM2_vbi - Pb20 ) * T4 ;
T2 = T0 * Cox_inv ;
@ -911,7 +937,7 @@ int HSM2temp(
pParam->HSM2_sc3 = sc3lim;
}
}
}
} /* End of instance loop */
}
return(OK);
}

View File

@ -1,12 +1,12 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2011 Hiroshima University & STARC
Copyright (C) 2012 Hiroshima University & STARC
VERSION : HiSIM_2.5.1
VERSION : HiSIM 2.6.1
FILE : hsm2trunc.c
date : 2011.04.07
date : 2012.4.6
released by
Hiroshima University &
@ -14,7 +14,6 @@
***********************************************************************/
#include "ngspice/ngspice.h"
#include <stdio.h>
#include "ngspice/cktdefs.h"
#include "hsm2def.h"
#include "ngspice/sperror.h"