Update hisim code to 1.2.0.
This commit is contained in:
parent
5ae9de6d52
commit
2522b8a8a3
|
|
@ -1,35 +1,11 @@
|
||||||
## Process this file with automake to produce Makefile.in
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
noinst_LIBRARIES = libhisim.a
|
pkglib_LTLIBRARIES = libhsm1.la
|
||||||
|
|
||||||
libhisim_a_SOURCES = \
|
|
||||||
hsm1.c \
|
|
||||||
hsm1acld.c \
|
|
||||||
hsm1ask.c \
|
|
||||||
hsm1cvtest.c \
|
|
||||||
hsm1del.c \
|
|
||||||
hsm1dest.c \
|
|
||||||
hsm1eval1_0.c \
|
|
||||||
hsm1eval1_1.c \
|
|
||||||
hsm1getic.c \
|
|
||||||
hsm1ld.c \
|
|
||||||
hsm1mask.c \
|
|
||||||
hsm1mdel.c \
|
|
||||||
hsm1mpar.c \
|
|
||||||
hsm1noi.c \
|
|
||||||
hsm1par.c \
|
|
||||||
hsm1pzld.c \
|
|
||||||
hsm1set.c \
|
|
||||||
hsm1temp.c \
|
|
||||||
hsm1trunc.c \
|
|
||||||
hisim1.h \
|
|
||||||
hsm1evalenv.h \
|
|
||||||
hsm1def.h \
|
|
||||||
hsm1ext.h \
|
|
||||||
hsm1init.c \
|
|
||||||
hsm1init.h \
|
|
||||||
hsm1itf.h
|
|
||||||
|
|
||||||
|
libhsm1_la_SOURCES = hsm1.c hsm1acld.c hsm1ask.c hsm1cvtest.c hsm1del.c hsm1dest.c \
|
||||||
|
hsm1eval102.c hsm1eval112.c hsm1eval120.c hsm1getic.c hsm1init.c hsm1ld.c \
|
||||||
|
hsm1mask.c hsm1mdel.c hsm1mpar.c hsm1noi.c hsm1par.c hsm1pzld.c \
|
||||||
|
hsm1set.c hsm1temp.c hsm1trunc.c
|
||||||
|
|
||||||
|
|
||||||
INCLUDES = -I$(top_srcdir)/src/include
|
INCLUDES = -I$(top_srcdir)/src/include
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,13 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hisim.h of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hisim.h of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _HiSIM_H
|
#ifndef _HiSIM_H
|
||||||
#define _HiSIM_H
|
#define _HiSIM_H
|
||||||
|
|
@ -70,6 +66,9 @@ typedef struct sHiSIM_input {
|
||||||
/* frequency [Hz] */
|
/* frequency [Hz] */
|
||||||
double freq ;
|
double freq ;
|
||||||
|
|
||||||
|
/* version */
|
||||||
|
double version ;
|
||||||
|
|
||||||
/* Control options that can be set in a model parameter set. */
|
/* Control options that can be set in a model parameter set. */
|
||||||
int info ; /* information level (for debug, etc.) */
|
int info ; /* information level (for debug, etc.) */
|
||||||
int corsrd ; /* solve equations accounting Rs and Rd. */
|
int corsrd ; /* solve equations accounting Rs and Rd. */
|
||||||
|
|
@ -82,11 +81,13 @@ typedef struct sHiSIM_input {
|
||||||
int coxx08 ; /* spare */
|
int coxx08 ; /* spare */
|
||||||
int coxx09 ; /* spare */
|
int coxx09 ; /* spare */
|
||||||
int coisub ; /* calculate isub */
|
int coisub ; /* calculate isub */
|
||||||
int coiigs ; /* calculate igs */
|
int coiigs ; /* calculate igate */
|
||||||
int cogidl ; /* calculate ilg */
|
int cogidl ; /* calculate igidl */
|
||||||
|
int cogisl ; /* calculate igisl */
|
||||||
int coovlp ; /* calculate overlap charge */
|
int coovlp ; /* calculate overlap charge */
|
||||||
int conois ; /* calculate 1/f noise */
|
int conois ; /* calculate 1/f noise */
|
||||||
int coisti ; /* calculate STI */
|
int coisti ; /* calculate STI */
|
||||||
|
int cosmbi ; /* bias smoothing in dVth */
|
||||||
|
|
||||||
/* Previous values that may be used as initial guesses */
|
/* Previous values that may be used as initial guesses */
|
||||||
/* - derivatives are ones w.r.t. internal biases. */
|
/* - derivatives are ones w.r.t. internal biases. */
|
||||||
|
|
@ -119,6 +120,7 @@ typedef struct sHiSIM_input {
|
||||||
double nrd ; /* equivalent num of squares of drain [-] (unused) */
|
double nrd ; /* equivalent num of squares of drain [-] (unused) */
|
||||||
double nrs ; /* equivalent num of squares of source [-] (unused) */
|
double nrs ; /* equivalent num of squares of source [-] (unused) */
|
||||||
double temp ; /* lattice temperature [K] */
|
double temp ; /* lattice temperature [K] */
|
||||||
|
double m ; /* multiplier */
|
||||||
|
|
||||||
/* Model parameters */
|
/* Model parameters */
|
||||||
double vmax ; /* saturation velocity [cm/s] */
|
double vmax ; /* saturation velocity [cm/s] */
|
||||||
|
|
@ -162,9 +164,6 @@ typedef struct sHiSIM_input {
|
||||||
double muesr1 ; /* coeff. for S.R. scattering [-] */
|
double muesr1 ; /* coeff. for S.R. scattering [-] */
|
||||||
double muetmp ; /* parameter for mobility [-] */
|
double muetmp ; /* parameter for mobility [-] */
|
||||||
double bb ; /* empirical mobility model coefficient [-] */
|
double bb ; /* empirical mobility model coefficient [-] */
|
||||||
double vds0 ; /* Vds0 used for low field mobility [V] */
|
|
||||||
double bc0 ; /* coeff. for BC */
|
|
||||||
double bc1 ; /* power of L for BC */
|
|
||||||
/**/
|
/**/
|
||||||
double sub1 ; /* parameter for Isub [1/V] */
|
double sub1 ; /* parameter for Isub [1/V] */
|
||||||
double sub2 ; /* parameter for Isub [V] */
|
double sub2 ; /* parameter for Isub [V] */
|
||||||
|
|
@ -231,7 +230,15 @@ typedef struct sHiSIM_input {
|
||||||
double nfalp ;
|
double nfalp ;
|
||||||
double cit ;
|
double cit ;
|
||||||
|
|
||||||
double gmin ; /* gmin = minimam conductance of SPICE3 K.M. */
|
double gmin ; /* gmin = minimum conductance of SPICE3 */
|
||||||
|
/**/
|
||||||
|
double glpart1 ; /* partition of gate leackage current */
|
||||||
|
double glpart2 ;
|
||||||
|
double kappa ; /* */
|
||||||
|
double xdiffd ; /* */
|
||||||
|
double pthrou ; /* */
|
||||||
|
double vdiffj ; /* */
|
||||||
|
|
||||||
} HiSIM_input ;
|
} HiSIM_input ;
|
||||||
|
|
||||||
/*-------------------------------------------------------------------*
|
/*-------------------------------------------------------------------*
|
||||||
|
|
@ -252,10 +259,6 @@ typedef struct sHiSIM_output {
|
||||||
/**/
|
/**/
|
||||||
double von ; /* Vth [V] */
|
double von ; /* Vth [V] */
|
||||||
double vdsat ; /* saturation voltage [V] */
|
double vdsat ; /* saturation voltage [V] */
|
||||||
/**/
|
|
||||||
double capgs ; /* Meyer's gate capacitance (dQg/dVgs+cgso) [S] */
|
|
||||||
double capgd ; /* Meyer's gate capacitance (dQg/dVgs+cgso) [S] */
|
|
||||||
double capgb ; /* Meyer's gate capacitance (dQg/dVgs+cgso) [S] */
|
|
||||||
/**/
|
/**/
|
||||||
double ibs ; /* substrate source leakage current [A] */
|
double ibs ; /* substrate source leakage current [A] */
|
||||||
double ibd ; /* substrate drain leakage current [A] */
|
double ibd ; /* substrate drain leakage current [A] */
|
||||||
|
|
@ -286,15 +289,35 @@ typedef struct sHiSIM_output {
|
||||||
double cddb ; /* intrinsic drain capacitance w.r.t. drain [F] */
|
double cddb ; /* intrinsic drain capacitance w.r.t. drain [F] */
|
||||||
double cdsb ; /* intrinsic drain capacitance w.r.t. source [F] */
|
double cdsb ; /* intrinsic drain capacitance w.r.t. source [F] */
|
||||||
/**/
|
/**/
|
||||||
double igs ; /* gate current due to tunneling [A] */
|
double igate ; /* gate current due to tunneling [A] */
|
||||||
double gggs ; /* trans conductance (dIgs/dVgs) [S] */
|
double gggs ; /* trans conductance (dIgate/dVgs) [S] */
|
||||||
double ggds ; /* trans conductance (dIgs/dVds) [S] */
|
double ggds ; /* trans conductance (dIgate/dVds) [S] */
|
||||||
double ggbs ; /* trans conductance (dIgs/dVbs) [S] */
|
double ggbs ; /* trans conductance (dIgate/dVbs) [S] */
|
||||||
/**/
|
/**/
|
||||||
double ilg ; /* gate induced drain leakage [A] */
|
double igateb ; /* gate current due to tunneling [A] (G->B)*/
|
||||||
double glgs ; /* trans conductance (dIlg/dVgs) [S] */
|
double ggbgs ; /* trans conductance (dIgateb/dVgs) [S] */
|
||||||
double glds ; /* trans conductance (dIlg/dVds) [S] */
|
double ggbds ; /* trans conductance (dIgateb/dVds) [S] */
|
||||||
double glbs ; /* trans conductance (dIlg/dVbs) [S] */
|
double ggbbs ; /* trans conductance (dIgateb/dVbs) [S] */
|
||||||
|
/**/
|
||||||
|
double igates ; /* gate current due to tunneling [A] (G->S)*/
|
||||||
|
double ggsgs ; /* trans conductance (dIgates/dVgs) [S] */
|
||||||
|
double ggsds ; /* trans conductance (dIgates/dVds) [S] */
|
||||||
|
double ggsbs ; /* trans conductance (dIgates/dVbs) [S] */
|
||||||
|
/**/
|
||||||
|
double igated ; /* gate current due to tunneling [A] (G->D)*/
|
||||||
|
double ggdgs ; /* trans conductance (dIgated/dVgs) [S] */
|
||||||
|
double ggdds ; /* trans conductance (dIgated/dVds) [S] */
|
||||||
|
double ggdbs ; /* trans conductance (dIgated/dVbs) [S] */
|
||||||
|
/**/
|
||||||
|
double igidl ; /* gate induced drain leakage [A] */
|
||||||
|
double ggidlgs ; /* trans conductance (dIgidl/dVgs) [S] */
|
||||||
|
double ggidlds ; /* trans conductance (dIgidl/dVds) [S] */
|
||||||
|
double ggidlbs ; /* trans conductance (dIgidl/dVbs) [S] */
|
||||||
|
/**/
|
||||||
|
double igisl ; /* gate induced source leakage [A] */
|
||||||
|
double ggislgd ; /* trans conductance (dIgisl/dVgs) [S] */
|
||||||
|
double ggislsd ; /* trans conductance (dIgisl/dVds) [S] */
|
||||||
|
double ggislbd ; /* trans conductance (dIgisl/dVbs) [S] */
|
||||||
/**/
|
/**/
|
||||||
double nois_idsfl ;
|
double nois_idsfl ;
|
||||||
double nois_ird ;
|
double nois_ird ;
|
||||||
|
|
@ -322,6 +345,13 @@ typedef struct sHiSIM_output {
|
||||||
|
|
||||||
/* mobility added by K.M. */
|
/* mobility added by K.M. */
|
||||||
double mu ;
|
double mu ;
|
||||||
|
|
||||||
|
/* intrinsic charges */
|
||||||
|
double qg_int ;
|
||||||
|
double qd_int ;
|
||||||
|
double qs_int ;
|
||||||
|
double qb_int ;
|
||||||
|
|
||||||
} HiSIM_output ;
|
} HiSIM_output ;
|
||||||
|
|
||||||
/*-------------------------------------------------------------------*
|
/*-------------------------------------------------------------------*
|
||||||
|
|
@ -354,4 +384,23 @@ typedef struct sHiSIM_messenger {
|
||||||
* dms[ 1 ] :(in) timepoint.
|
* dms[ 1 ] :(in) timepoint.
|
||||||
-------------------------------------------*/
|
-------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
extern int HSM1evaluate102(
|
||||||
|
HiSIM_input sIN,
|
||||||
|
HiSIM_output *pOT,
|
||||||
|
HiSIM_messenger *pMS
|
||||||
|
) ;
|
||||||
|
extern int HSM1evaluate112
|
||||||
|
(
|
||||||
|
HiSIM_input sIN,
|
||||||
|
HiSIM_output *pOT,
|
||||||
|
HiSIM_messenger *pMS
|
||||||
|
) ;
|
||||||
|
extern int HSM1evaluate120
|
||||||
|
(
|
||||||
|
HiSIM_input sIN,
|
||||||
|
HiSIM_output *pOT,
|
||||||
|
HiSIM_messenger *pMS
|
||||||
|
) ;
|
||||||
|
|
||||||
#endif /* _HiSIM_H */
|
#endif /* _HiSIM_H */
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,13 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1.c of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "devdefs.h"
|
#include "devdefs.h"
|
||||||
#include "hsm1def.h"
|
#include "hsm1def.h"
|
||||||
|
|
@ -21,7 +16,6 @@
|
||||||
IFparm HSM1pTable[] = { /* parameters */
|
IFparm HSM1pTable[] = { /* parameters */
|
||||||
IOP( "l", HSM1_L, IF_REAL , "Length"),
|
IOP( "l", HSM1_L, IF_REAL , "Length"),
|
||||||
IOP( "w", HSM1_W, IF_REAL , "Width"),
|
IOP( "w", HSM1_W, IF_REAL , "Width"),
|
||||||
IOP( "m", HSM1_M, IF_REAL , "Parallel multiplier"),
|
|
||||||
IOP( "ad", HSM1_AD, IF_REAL , "Drain area"),
|
IOP( "ad", HSM1_AD, IF_REAL , "Drain area"),
|
||||||
IOP( "as", HSM1_AS, IF_REAL , "Source area"),
|
IOP( "as", HSM1_AS, IF_REAL , "Source area"),
|
||||||
IOP( "pd", HSM1_PD, IF_REAL , "Drain perimeter"),
|
IOP( "pd", HSM1_PD, IF_REAL , "Drain perimeter"),
|
||||||
|
|
@ -31,7 +25,8 @@ IFparm HSM1pTable[] = { /* parameters */
|
||||||
IOP( "temp", HSM1_TEMP, IF_REAL , "Lattice temperature"),
|
IOP( "temp", HSM1_TEMP, IF_REAL , "Lattice temperature"),
|
||||||
IOP( "dtemp", HSM1_DTEMP,IF_REAL , ""),
|
IOP( "dtemp", HSM1_DTEMP,IF_REAL , ""),
|
||||||
IOP( "off", HSM1_OFF, IF_FLAG , "Device is initially off"),
|
IOP( "off", HSM1_OFF, IF_FLAG , "Device is initially off"),
|
||||||
IP ( "ic", HSM1_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages")
|
IP ( "ic", HSM1_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"),
|
||||||
|
IOP( "m", HSM1_M, IF_REAL , "Parallel multiplier")
|
||||||
};
|
};
|
||||||
|
|
||||||
IFparm HSM1mPTable[] = { /* model parameters */
|
IFparm HSM1mPTable[] = { /* model parameters */
|
||||||
|
|
@ -40,7 +35,7 @@ IFparm HSM1mPTable[] = { /* model parameters */
|
||||||
IOP("level", HSM1_MOD_LEVEL, IF_INTEGER, ""),
|
IOP("level", HSM1_MOD_LEVEL, IF_INTEGER, ""),
|
||||||
IOP("info", HSM1_MOD_INFO, IF_INTEGER, "information level (for debug, etc.)"),
|
IOP("info", HSM1_MOD_INFO, IF_INTEGER, "information level (for debug, etc.)"),
|
||||||
IOP("noise", HSM1_MOD_NOISE, IF_INTEGER, "noise model selector"),
|
IOP("noise", HSM1_MOD_NOISE, IF_INTEGER, "noise model selector"),
|
||||||
IOP("version", HSM1_MOD_VERSION, IF_INTEGER, "model version 100 or 110"),
|
IOP("version", HSM1_MOD_VERSION, IF_INTEGER, "model version 102 or 112 or 120"),
|
||||||
IOP("show", HSM1_MOD_SHOW, IF_INTEGER, "show physical value"),
|
IOP("show", HSM1_MOD_SHOW, IF_INTEGER, "show physical value"),
|
||||||
IOP("corsrd", HSM1_MOD_CORSRD, IF_INTEGER, "solve equations accounting Rs and Rd."),
|
IOP("corsrd", HSM1_MOD_CORSRD, IF_INTEGER, "solve equations accounting Rs and Rd."),
|
||||||
IOP("coiprv", HSM1_MOD_COIPRV, IF_INTEGER, "use ids_prv as initial guess of Ids"),
|
IOP("coiprv", HSM1_MOD_COIPRV, IF_INTEGER, "use ids_prv as initial guess of Ids"),
|
||||||
|
|
@ -52,21 +47,21 @@ IFparm HSM1mPTable[] = { /* model parameters */
|
||||||
IOP("coxx08", HSM1_MOD_COXX08, IF_INTEGER, "spare"),
|
IOP("coxx08", HSM1_MOD_COXX08, IF_INTEGER, "spare"),
|
||||||
IOP("coxx09", HSM1_MOD_COXX09, IF_INTEGER, "spare"),
|
IOP("coxx09", HSM1_MOD_COXX09, IF_INTEGER, "spare"),
|
||||||
IOP("coisub", HSM1_MOD_COISUB, IF_INTEGER, "calculate isub"),
|
IOP("coisub", HSM1_MOD_COISUB, IF_INTEGER, "calculate isub"),
|
||||||
IOP("coiigs", HSM1_MOD_COIIGS, IF_INTEGER, "calculate igs"),
|
IOP("coiigs", HSM1_MOD_COIIGS, IF_INTEGER, "calculate igate"),
|
||||||
IOP("cogidl", HSM1_MOD_COGIDL, IF_INTEGER, "calculate ilg"),
|
IOP("cogidl", HSM1_MOD_COGIDL, IF_INTEGER, "calculate igidl"),
|
||||||
|
IOP("cogisl", HSM1_MOD_COGISL, IF_INTEGER, "calculate igisl"),
|
||||||
IOP("coovlp", HSM1_MOD_COOVLP, IF_INTEGER, "calculate overlap charge"),
|
IOP("coovlp", HSM1_MOD_COOVLP, IF_INTEGER, "calculate overlap charge"),
|
||||||
IOP("conois", HSM1_MOD_CONOIS, IF_INTEGER, "calculate 1/f noise"),
|
IOP("conois", HSM1_MOD_CONOIS, IF_INTEGER, "calculate 1/f noise"),
|
||||||
IOP("coisti", HSM1_MOD_COISTI, IF_INTEGER, "calculate STI HiSIM1.1"),
|
IOP("coisti", HSM1_MOD_COISTI, IF_INTEGER, "calculate STI HiSIM1.1"),
|
||||||
|
IOP("cosmbi", HSM1_MOD_COSMBI, IF_INTEGER, "biases smoothing in dvth HiSIM1.2"),
|
||||||
IOP("vmax", HSM1_MOD_VMAX, IF_REAL, "saturation velocity [cm/s"),
|
IOP("vmax", HSM1_MOD_VMAX, IF_REAL, "saturation velocity [cm/s"),
|
||||||
IOP("bgtmp1", HSM1_MOD_BGTMP1, IF_REAL, "first order temp. coeff. for band gap [V/K]"),
|
IOP("bgtmp1", HSM1_MOD_BGTMP1, IF_REAL, "first order temp. coeff. for band gap [V/K]"),
|
||||||
IOP("bgtmp2", HSM1_MOD_BGTMP2, IF_REAL, "second order temp. coeff. for band gap [V/K^2]"),
|
IOP("bgtmp2", HSM1_MOD_BGTMP2, IF_REAL, "second order temp. coeff. for band gap [V/K^2]"),
|
||||||
IOP("tox", HSM1_MOD_TOX, IF_REAL, "oxide thickness [m]"),
|
IOP("tox", HSM1_MOD_TOX, IF_REAL, "oxide thickness [m]"),
|
||||||
IOP("dl", HSM1_MOD_DL, IF_REAL, "lateral diffusion of S/D under the gate [m]"),
|
IOP("xld", HSM1_MOD_XLD, IF_REAL, "lateral diffusion of S/D under the gate [m]"),
|
||||||
IOP("dw", HSM1_MOD_DW, IF_REAL, "lateral diffusion along the width dir. [m]"),
|
IOP("xwd", HSM1_MOD_XWD, IF_REAL, "lateral diffusion along the width dir. [m]"),
|
||||||
IOP("xld", HSM1_MOD_DL, IF_REAL, "lateral diffusion of S/D under the gate [m]"),
|
IOP("xj", HSM1_MOD_XJ, IF_REAL, "HiSIM1.0.z [m]"),
|
||||||
IOP("xwd", HSM1_MOD_DW, IF_REAL, "lateral diffusion along the width dir. [m]"),
|
IOP("xqy", HSM1_MOD_XQY, IF_REAL, "HiSIM1.1.z or later [m]"),
|
||||||
IOP("xj", HSM1_MOD_XJ, IF_REAL, "HiSIM1.0 [m]"),
|
|
||||||
IOP("xqy", HSM1_MOD_XQY, IF_REAL, "HiSIM1.1 [m]"),
|
|
||||||
IOP("rs", HSM1_MOD_RS, IF_REAL, "source contact resistance [ohm m]"),
|
IOP("rs", HSM1_MOD_RS, IF_REAL, "source contact resistance [ohm m]"),
|
||||||
IOP("rd", HSM1_MOD_RD, IF_REAL, "drain contact resistance [ohm m]"),
|
IOP("rd", HSM1_MOD_RD, IF_REAL, "drain contact resistance [ohm m]"),
|
||||||
IOP("vfbc", HSM1_MOD_VFBC, IF_REAL, "constant part of Vfb [V]"),
|
IOP("vfbc", HSM1_MOD_VFBC, IF_REAL, "constant part of Vfb [V]"),
|
||||||
|
|
@ -75,12 +70,12 @@ IFparm HSM1mPTable[] = { /* model parameters */
|
||||||
IOP("parl2", HSM1_MOD_PARL2, IF_REAL, "under diffusion [m]"),
|
IOP("parl2", HSM1_MOD_PARL2, IF_REAL, "under diffusion [m]"),
|
||||||
IOP("lp", HSM1_MOD_LP, IF_REAL, "length of pocket potential [m]"),
|
IOP("lp", HSM1_MOD_LP, IF_REAL, "length of pocket potential [m]"),
|
||||||
IOP("nsubp", HSM1_MOD_NSUBP, IF_REAL, "[1/cm^3]"),
|
IOP("nsubp", HSM1_MOD_NSUBP, IF_REAL, "[1/cm^3]"),
|
||||||
IOP("scp1", HSM1_MOD_SCP1, IF_REAL, "parameter for pocket [1/V]"),
|
IOP("scp1", HSM1_MOD_SCP1, IF_REAL, "parameter for pocket [-]"),
|
||||||
IOP("scp2", HSM1_MOD_SCP2, IF_REAL, "parameter for pocket [1/V^2]"),
|
IOP("scp2", HSM1_MOD_SCP2, IF_REAL, "parameter for pocket [1/V]"),
|
||||||
IOP("scp3", HSM1_MOD_SCP3, IF_REAL, "parameter for pocket [m/V^2]"),
|
IOP("scp3", HSM1_MOD_SCP3, IF_REAL, "parameter for pocket [m/V]"),
|
||||||
IOP("sc1", HSM1_MOD_SC1, IF_REAL, "parameter for SCE [1/V]"),
|
IOP("sc1", HSM1_MOD_SC1, IF_REAL, "parameter for SCE [-]"),
|
||||||
IOP("sc2", HSM1_MOD_SC2, IF_REAL, "parameter for SCE [1/V^2]"),
|
IOP("sc2", HSM1_MOD_SC2, IF_REAL, "parameter for SCE [1/V]"),
|
||||||
IOP("sc3", HSM1_MOD_SC3, IF_REAL, "parameter for SCE [m/V^2]"),
|
IOP("sc3", HSM1_MOD_SC3, IF_REAL, "parameter for SCE [m/V]"),
|
||||||
IOP("pgd1", HSM1_MOD_PGD1, IF_REAL, "parameter for gate-poly depletion [V]"),
|
IOP("pgd1", HSM1_MOD_PGD1, IF_REAL, "parameter for gate-poly depletion [V]"),
|
||||||
IOP("pgd2", HSM1_MOD_PGD2, IF_REAL, "parameter for gate-poly depletion [V]"),
|
IOP("pgd2", HSM1_MOD_PGD2, IF_REAL, "parameter for gate-poly depletion [V]"),
|
||||||
IOP("pgd3", HSM1_MOD_PGD3, IF_REAL, "parameter for gate-poly depletion [-]"),
|
IOP("pgd3", HSM1_MOD_PGD3, IF_REAL, "parameter for gate-poly depletion [-]"),
|
||||||
|
|
@ -97,7 +92,6 @@ IFparm HSM1mPTable[] = { /* model parameters */
|
||||||
IOP("muesr1", HSM1_MOD_MUESR1, IF_REAL, "coeff. for S.R. scattering [-]"),
|
IOP("muesr1", HSM1_MOD_MUESR1, IF_REAL, "coeff. for S.R. scattering [-]"),
|
||||||
IOP("muetmp", HSM1_MOD_MUETMP, IF_REAL, "parameter for mobility [-]"),
|
IOP("muetmp", HSM1_MOD_MUETMP, IF_REAL, "parameter for mobility [-]"),
|
||||||
IOP("bb", HSM1_MOD_BB, IF_REAL, "empirical mobility model coefficient [-]"),
|
IOP("bb", HSM1_MOD_BB, IF_REAL, "empirical mobility model coefficient [-]"),
|
||||||
IOP("vds0", HSM1_MOD_VDS0, IF_REAL, "Vds0 used for low field mobility [V]"),
|
|
||||||
IOP("sub1", HSM1_MOD_SUB1, IF_REAL, "parameter for Isub [1/V]"),
|
IOP("sub1", HSM1_MOD_SUB1, IF_REAL, "parameter for Isub [1/V]"),
|
||||||
IOP("sub2", HSM1_MOD_SUB2, IF_REAL, "parameter for Isub [V]"),
|
IOP("sub2", HSM1_MOD_SUB2, IF_REAL, "parameter for Isub [V]"),
|
||||||
IOP("sub3", HSM1_MOD_SUB3, IF_REAL, "parameter for Isub [-]"),
|
IOP("sub3", HSM1_MOD_SUB3, IF_REAL, "parameter for Isub [-]"),
|
||||||
|
|
@ -111,7 +105,7 @@ IFparm HSM1mPTable[] = { /* model parameters */
|
||||||
IOP("js0", HSM1_MOD_JS0, IF_REAL, "Saturation current density [A/m^2]"),
|
IOP("js0", HSM1_MOD_JS0, IF_REAL, "Saturation current density [A/m^2]"),
|
||||||
IOP("js0sw", HSM1_MOD_JS0SW, IF_REAL, "Side wall saturation current density [A/m]"),
|
IOP("js0sw", HSM1_MOD_JS0SW, IF_REAL, "Side wall saturation current density [A/m]"),
|
||||||
IOP("nj", HSM1_MOD_NJ, IF_REAL, "Emission coefficient"),
|
IOP("nj", HSM1_MOD_NJ, IF_REAL, "Emission coefficient"),
|
||||||
IOP("njsw", HSM1_MOD_NJSW, IF_REAL, "Emission coefficient (sidewall)"),
|
IOP("njsw", HSM1_MOD_NJSW, IF_REAL, "Sidewall emission coefficient"),
|
||||||
IOP("xti", HSM1_MOD_XTI, IF_REAL, "Junction current temparature exponent coefficient"),
|
IOP("xti", HSM1_MOD_XTI, IF_REAL, "Junction current temparature exponent coefficient"),
|
||||||
IOP("cj", HSM1_MOD_CJ, IF_REAL, "Bottom junction capacitance per unit area at zero bias [F/m^2]"),
|
IOP("cj", HSM1_MOD_CJ, IF_REAL, "Bottom junction capacitance per unit area at zero bias [F/m^2]"),
|
||||||
IOP("cjsw", HSM1_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient per unit length at zero bias [F/m]"),
|
IOP("cjsw", HSM1_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient per unit length at zero bias [F/m]"),
|
||||||
|
|
@ -126,8 +120,8 @@ IFparm HSM1mPTable[] = { /* model parameters */
|
||||||
IOP("clm1", HSM1_MOD_CLM1, IF_REAL, "parameter for CLM [-]"),
|
IOP("clm1", HSM1_MOD_CLM1, IF_REAL, "parameter for CLM [-]"),
|
||||||
IOP("clm2", HSM1_MOD_CLM2, IF_REAL, "parameter for CLM [1/m]"),
|
IOP("clm2", HSM1_MOD_CLM2, IF_REAL, "parameter for CLM [1/m]"),
|
||||||
IOP("clm3", HSM1_MOD_CLM3, IF_REAL, "parameter for CLM [-]"),
|
IOP("clm3", HSM1_MOD_CLM3, IF_REAL, "parameter for CLM [-]"),
|
||||||
IOP("rpock1", HSM1_MOD_RPOCK1, IF_REAL, "parameter for Ids [V^2 sqrt(m)/A]"),
|
IOP("rpock1", HSM1_MOD_RPOCK1, IF_REAL, "parameter for Ids [V]"),
|
||||||
IOP("rpock2", HSM1_MOD_RPOCK2, IF_REAL, "parameter for Ids [V]"),
|
IOP("rpock2", HSM1_MOD_RPOCK2, IF_REAL, "parameter for Ids [V^2 sqrt(m)/A]"),
|
||||||
IOP("rpocp1", HSM1_MOD_RPOCP1, IF_REAL, "parameter for Ids [-] HiSIM1.1"),
|
IOP("rpocp1", HSM1_MOD_RPOCP1, IF_REAL, "parameter for Ids [-] HiSIM1.1"),
|
||||||
IOP("rpocp2", HSM1_MOD_RPOCP2, IF_REAL, "parameter for Ids [-] HiSIM1.1"),
|
IOP("rpocp2", HSM1_MOD_RPOCP2, IF_REAL, "parameter for Ids [-] HiSIM1.1"),
|
||||||
IOP("vover", HSM1_MOD_VOVER, IF_REAL, "parameter for overshoot [m^{voverp}]"),
|
IOP("vover", HSM1_MOD_VOVER, IF_REAL, "parameter for overshoot [m^{voverp}]"),
|
||||||
|
|
@ -147,6 +141,12 @@ IFparm HSM1mPTable[] = { /* model parameters */
|
||||||
IOP("nftrp", HSM1_MOD_NFTRP, IF_REAL, ""),
|
IOP("nftrp", HSM1_MOD_NFTRP, IF_REAL, ""),
|
||||||
IOP("nfalp", HSM1_MOD_NFALP, IF_REAL, ""),
|
IOP("nfalp", HSM1_MOD_NFALP, IF_REAL, ""),
|
||||||
IOP("cit", HSM1_MOD_CIT, IF_REAL, ""),
|
IOP("cit", HSM1_MOD_CIT, IF_REAL, ""),
|
||||||
|
IOP("glpart1", HSM1_MOD_GLPART1, IF_REAL, "partitoning of gate current HiSIM1.2"),
|
||||||
|
IOP("glpart2", HSM1_MOD_GLPART2, IF_REAL, "partitoning of gate current HiSIM1.2"),
|
||||||
|
IOP("kappa", HSM1_MOD_KAPPA, IF_REAL, "HiSIM1.2 dielectric constant for high-k stacked gate"),
|
||||||
|
IOP("xdiffd", HSM1_MOD_XDIFFD, IF_REAL, "HiSIM1.2 parameter for W_design [m]"),
|
||||||
|
IOP("pthrou", HSM1_MOD_PTHROU, IF_REAL, "HiSIM1.2 modify subthreshold sloop [-]"),
|
||||||
|
IOP("vdiffj", HSM1_MOD_VDIFFJ, IF_REAL, "HiSIM1.2 threshold voltage for S/D junction diode [V]"),
|
||||||
IOP( "ef", HSM1_MOD_EF, IF_REAL, "flicker noise frequency exponent"),
|
IOP( "ef", HSM1_MOD_EF, IF_REAL, "flicker noise frequency exponent"),
|
||||||
IOP( "af", HSM1_MOD_AF, IF_REAL, "flicker noise exponent"),
|
IOP( "af", HSM1_MOD_AF, IF_REAL, "flicker noise exponent"),
|
||||||
IOP( "kf", HSM1_MOD_KF, IF_REAL, "flicker noise coefficient")
|
IOP( "kf", HSM1_MOD_KF, IF_REAL, "flicker noise coefficient")
|
||||||
|
|
@ -164,3 +164,4 @@ int HSM1pTSize = NUMELEMS(HSM1pTable);
|
||||||
int HSM1mPTSize = NUMELEMS(HSM1mPTable);
|
int HSM1mPTSize = NUMELEMS(HSM1mPTable);
|
||||||
int HSM1iSize = sizeof(HSM1instance);
|
int HSM1iSize = sizeof(HSM1instance);
|
||||||
int HSM1mSize = sizeof(HSM1model);
|
int HSM1mSize = sizeof(HSM1model);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,13 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1acld.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1acld.c of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
#include "hsm1def.h"
|
#include "hsm1def.h"
|
||||||
|
|
@ -20,18 +15,23 @@
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
|
|
||||||
int HSM1acLoad(GENmodel *inModel, CKTcircuit *ckt)
|
int
|
||||||
|
HSM1acLoad(GENmodel *inModel, register CKTcircuit *ckt)
|
||||||
{
|
{
|
||||||
HSM1model *model = (HSM1model*)inModel;
|
register HSM1model *model = (HSM1model*)inModel;
|
||||||
HSM1instance *here;
|
register HSM1instance *here;
|
||||||
double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb;
|
double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb;
|
||||||
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb;
|
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb;
|
||||||
double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb, omega;
|
double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb, omega;
|
||||||
double cgso, cgdo, cgbo, FwdSum, RevSum, gm, gmbs;
|
double cgso, cgdo, cgbo, FwdSum, RevSum, gm, gmbs;
|
||||||
double gbspsp, gbbdp, gbbsp, gbspg, gbspb;
|
double gbspsp, gbbdp, gbbsp, gbspg, gbspb;
|
||||||
double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp;
|
double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp;
|
||||||
|
double gIbtotg, gIbtotd, gIbtots, gIbtotb;
|
||||||
|
double gIgtotg, gIgtotd, gIgtots, gIgtotb;
|
||||||
|
double gIdtotg, gIdtotd, gIdtots, gIdtotb;
|
||||||
|
double gIstotg, gIstotd, gIstots, gIstotb;
|
||||||
|
|
||||||
double m;
|
double m; /* Multiplier */
|
||||||
|
|
||||||
omega = ckt->CKTomega;
|
omega = ckt->CKTomega;
|
||||||
for ( ; model != NULL; model = model->HSM1nextModel ) {
|
for ( ; model != NULL; model = model->HSM1nextModel ) {
|
||||||
|
|
@ -60,6 +60,37 @@ int HSM1acLoad(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
gbspb = 0.0;
|
gbspb = 0.0;
|
||||||
gbspsp = 0.0;
|
gbspsp = 0.0;
|
||||||
|
|
||||||
|
if (model->HSM1_coiigs) {
|
||||||
|
gIbtotg = here->HSM1_gigbg;
|
||||||
|
gIbtotd = here->HSM1_gigbd;
|
||||||
|
gIbtots = here->HSM1_gigbs;
|
||||||
|
gIbtotb = here->HSM1_gigbb;
|
||||||
|
|
||||||
|
gIstotg = here->HSM1_gigsg;
|
||||||
|
gIstotd = here->HSM1_gigsd;
|
||||||
|
gIstots = here->HSM1_gigss;
|
||||||
|
gIstotb = here->HSM1_gigsb;
|
||||||
|
|
||||||
|
gIdtotg = here->HSM1_gigdg;
|
||||||
|
gIdtotd = here->HSM1_gigdd;
|
||||||
|
gIdtots = here->HSM1_gigds;
|
||||||
|
gIdtotb = here->HSM1_gigdb;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0;
|
||||||
|
gIstotg = gIstotd = gIstots = gIstotb = 0.0;
|
||||||
|
gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (model->HSM1_coiigs) {
|
||||||
|
gIgtotg = gIbtotg + gIstotg + gIdtotg;
|
||||||
|
gIgtotd = gIbtotd + gIstotd + gIdtotd;
|
||||||
|
gIgtots = gIbtots + gIstots + gIdtots;
|
||||||
|
gIgtotb = gIbtotb + gIstotb + gIdtotb;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0;
|
||||||
|
|
||||||
cggb = here->HSM1_cggb;
|
cggb = here->HSM1_cggb;
|
||||||
cgsb = here->HSM1_cgsb;
|
cgsb = here->HSM1_cgsb;
|
||||||
cgdb = here->HSM1_cgdb;
|
cgdb = here->HSM1_cgdb;
|
||||||
|
|
@ -91,6 +122,37 @@ int HSM1acLoad(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
gbspb = here->HSM1_gbbs;
|
gbspb = here->HSM1_gbbs;
|
||||||
gbspdp = -(gbspg + gbspsp + gbspb);
|
gbspdp = -(gbspg + gbspsp + gbspb);
|
||||||
|
|
||||||
|
if (model->HSM1_coiigs) {
|
||||||
|
gIbtotg = here->HSM1_gigbg;
|
||||||
|
gIbtotd = here->HSM1_gigbd;
|
||||||
|
gIbtots = here->HSM1_gigbs;
|
||||||
|
gIbtotb = here->HSM1_gigbb;
|
||||||
|
|
||||||
|
gIstotg = here->HSM1_gigsg;
|
||||||
|
gIstotd = here->HSM1_gigsd;
|
||||||
|
gIstots = here->HSM1_gigss;
|
||||||
|
gIstotb = here->HSM1_gigsb;
|
||||||
|
|
||||||
|
gIdtotg = here->HSM1_gigdg;
|
||||||
|
gIdtotd = here->HSM1_gigdd;
|
||||||
|
gIdtots = here->HSM1_gigds;
|
||||||
|
gIdtotb = here->HSM1_gigdb;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0;
|
||||||
|
gIstotg = gIstotd = gIstots = gIstotb = 0.0;
|
||||||
|
gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (model->HSM1_coiigs) {
|
||||||
|
gIgtotg = gIbtotg + gIstotg + gIdtotg;
|
||||||
|
gIgtotd = gIbtotd + gIstotd + gIdtotd;
|
||||||
|
gIgtots = gIbtots + gIstots + gIdtots;
|
||||||
|
gIgtotb = gIbtotb + gIstotb + gIdtotb;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0;
|
||||||
|
|
||||||
cggb = here->HSM1_cggb;
|
cggb = here->HSM1_cggb;
|
||||||
cgsb = here->HSM1_cgdb;
|
cgsb = here->HSM1_cgdb;
|
||||||
cgdb = here->HSM1_cgsb;
|
cgdb = here->HSM1_cgsb;
|
||||||
|
|
@ -129,13 +191,19 @@ int HSM1acLoad(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
xcbdb = (cbdb - capbd) * omega;
|
xcbdb = (cbdb - capbd) * omega;
|
||||||
xcbsb = (cbsb - capbs) * omega;
|
xcbsb = (cbsb - capbs) * omega;
|
||||||
|
|
||||||
|
m = here->HSM1_m;
|
||||||
|
|
||||||
*(here->HSM1GgPtr +1) += m * xcggb;
|
*(here->HSM1GgPtr +1) += m * xcggb;
|
||||||
|
*(here->HSM1GgPtr) += m * gIgtotg;
|
||||||
*(here->HSM1BbPtr +1) -= m * (xcbgb + xcbdb + xcbsb);
|
*(here->HSM1BbPtr +1) -= m * (xcbgb + xcbdb + xcbsb);
|
||||||
*(here->HSM1DPdpPtr +1) += m * xcddb;
|
*(here->HSM1DPdpPtr +1) += m * xcddb;
|
||||||
*(here->HSM1SPspPtr +1) += m * xcssb;
|
*(here->HSM1SPspPtr +1) += m * xcssb;
|
||||||
*(here->HSM1GbPtr +1) -= m * (xcggb + xcgdb + xcgsb);
|
*(here->HSM1GbPtr +1) -= m * (xcggb + xcgdb + xcgsb);
|
||||||
|
*(here->HSM1GbPtr) += m * gIgtotb;
|
||||||
*(here->HSM1GdpPtr +1) += m * xcgdb;
|
*(here->HSM1GdpPtr +1) += m * xcgdb;
|
||||||
|
*(here->HSM1GdpPtr) += m * gIgtotd;
|
||||||
*(here->HSM1GspPtr +1) += m * xcgsb;
|
*(here->HSM1GspPtr +1) += m * xcgsb;
|
||||||
|
*(here->HSM1GspPtr) += m * gIgtots;
|
||||||
*(here->HSM1BgPtr +1) += m * xcbgb;
|
*(here->HSM1BgPtr +1) += m * xcbgb;
|
||||||
*(here->HSM1BdpPtr +1) += m * xcbdb;
|
*(here->HSM1BdpPtr +1) += m * xcbdb;
|
||||||
*(here->HSM1BspPtr +1) += m * xcbsb;
|
*(here->HSM1BspPtr +1) += m * xcbsb;
|
||||||
|
|
@ -148,29 +216,51 @@ int HSM1acLoad(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
|
|
||||||
*(here->HSM1DdPtr) += m * gdpr;
|
*(here->HSM1DdPtr) += m * gdpr;
|
||||||
*(here->HSM1SsPtr) += m * gspr;
|
*(here->HSM1SsPtr) += m * gspr;
|
||||||
*(here->HSM1BbPtr) += m * (gbd + gbs - here->HSM1_gbbs);
|
*(here->HSM1BbPtr) += m * (gbd + gbs - here->HSM1_gbbs - gIbtotb);
|
||||||
*(here->HSM1DPdpPtr) += m * (gdpr + gds + gbd + RevSum + gbdpdp);
|
*(here->HSM1DPdpPtr) += m * (gdpr + gds + gbd + RevSum + gbdpdp);
|
||||||
*(here->HSM1SPspPtr) += m * (gspr + gds + gbs + FwdSum + gbspsp);
|
*(here->HSM1SPspPtr) += m * (gspr + gds + gbs + FwdSum + gbspsp);
|
||||||
|
|
||||||
*(here->HSM1DdpPtr) -= m * gdpr;
|
*(here->HSM1DdpPtr) -= m * gdpr;
|
||||||
*(here->HSM1SspPtr) -= m * gspr;
|
*(here->HSM1SspPtr) -= m * gspr;
|
||||||
|
|
||||||
*(here->HSM1BgPtr) -= m * here->HSM1_gbgs;
|
*(here->HSM1BgPtr) -= m * (here->HSM1_gbgs + gIbtotg);
|
||||||
*(here->HSM1BdpPtr) -= m * (gbd - gbbdp);
|
*(here->HSM1BdpPtr) -= m * (gbd - gbbdp + gIbtotd);
|
||||||
*(here->HSM1BspPtr) -= m * (gbs - gbbsp);
|
*(here->HSM1BspPtr) -= m * (gbs - gbbsp + gIbtots);
|
||||||
|
|
||||||
*(here->HSM1DPdPtr) -= m * gdpr;
|
*(here->HSM1DPdPtr) += m * (gdpr - gIdtotd);
|
||||||
*(here->HSM1DPgPtr) += m * (gm + gbdpg);
|
*(here->HSM1DPgPtr) += m * (gm + gbdpg - gIdtotg);
|
||||||
*(here->HSM1DPbPtr) -= m * (gbd - gmbs - gbdpb);
|
*(here->HSM1DPbPtr) -= m * (gbd - gmbs - gbdpb + gIdtotb);
|
||||||
*(here->HSM1DPspPtr) -= m * (gds + FwdSum - gbdpsp);
|
*(here->HSM1DPspPtr) -= m * (gds + FwdSum - gbdpsp + gIdtots);
|
||||||
|
|
||||||
*(here->HSM1SPgPtr) -= m * (gm - gbspg);
|
*(here->HSM1SPgPtr) -= m * (gm - gbspg + gIstotg);
|
||||||
*(here->HSM1SPsPtr) -= m * gspr;
|
*(here->HSM1SPsPtr) -= m * (gspr - gIstots);
|
||||||
*(here->HSM1SPbPtr) -= m * (gbs + gmbs - gbspb);
|
*(here->HSM1SPbPtr) -= m * (gbs + gmbs - gbspb + gIstotb);
|
||||||
*(here->HSM1SPdpPtr) -= m * (gds + RevSum - gbspdp);
|
*(here->HSM1SPdpPtr) -= m * (gds + RevSum - gbspdp + gIstotd);
|
||||||
|
|
||||||
|
/* stamp gidl */
|
||||||
|
*(here->HSM1DPdpPtr) += m * here->HSM1_gigidlds;
|
||||||
|
*(here->HSM1DPgPtr) += m * here->HSM1_gigidlgs;
|
||||||
|
*(here->HSM1DPspPtr) -= m * (here->HSM1_gigidlgs +
|
||||||
|
here->HSM1_gigidlds + here->HSM1_gigidlbs);
|
||||||
|
*(here->HSM1DPbPtr) += m * here->HSM1_gigidlbs;
|
||||||
|
*(here->HSM1BdpPtr) -= m * here->HSM1_gigidlds;
|
||||||
|
*(here->HSM1BgPtr) -= m * here->HSM1_gigidlgs;
|
||||||
|
*(here->HSM1BspPtr) += m * (here->HSM1_gigidlgs +
|
||||||
|
here->HSM1_gigidlds + here->HSM1_gigidlbs);
|
||||||
|
*(here->HSM1BbPtr) -= m * here->HSM1_gigidlbs;
|
||||||
|
/* stamp gisl */
|
||||||
|
*(here->HSM1SPdpPtr) -= m * (here->HSM1_gigislsd +
|
||||||
|
here->HSM1_gigislgd + here->HSM1_gigislbd);
|
||||||
|
*(here->HSM1SPgPtr) += m * here->HSM1_gigislgd;
|
||||||
|
*(here->HSM1SPspPtr) += m * here->HSM1_gigislsd;
|
||||||
|
*(here->HSM1SPbPtr) += m * here->HSM1_gigislbd;
|
||||||
|
*(here->HSM1BdpPtr) += m * (here->HSM1_gigislgd +
|
||||||
|
here->HSM1_gigislsd + here->HSM1_gigislbd);
|
||||||
|
*(here->HSM1BgPtr) -= m * here->HSM1_gigislgd;
|
||||||
|
*(here->HSM1BspPtr) -= m * here->HSM1_gigislsd;
|
||||||
|
*(here->HSM1BbPtr) -= m * here->HSM1_gigislbd;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
... just for the case ...
|
|
||||||
*(here->HSM1GgPtr) -= m * xgtg;
|
*(here->HSM1GgPtr) -= m * xgtg;
|
||||||
*(here->HSM1GbPtr) -= m * xgtb;
|
*(here->HSM1GbPtr) -= m * xgtb;
|
||||||
*(here->HSM1GdpPtr) -= m * xgtd;
|
*(here->HSM1GdpPtr) -= m * xgtd;
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,13 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1ask.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1ask.c of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "ifsim.h"
|
#include "ifsim.h"
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
|
|
@ -21,8 +16,9 @@
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
int HSM1ask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value,
|
int
|
||||||
IFvalue *select)
|
HSM1ask(CKTcircuit *ckt, GENinstance *inst, int which,
|
||||||
|
IFvalue *value, IFvalue *select)
|
||||||
{
|
{
|
||||||
HSM1instance *here = (HSM1instance*)inst;
|
HSM1instance *here = (HSM1instance*)inst;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,13 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1cvtest.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1cvtest.c of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
#include "hsm1def.h"
|
#include "hsm1def.h"
|
||||||
|
|
@ -22,10 +17,11 @@
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
int HSM1convTest(GENmodel *inModel, CKTcircuit *ckt)
|
int
|
||||||
|
HSM1convTest(GENmodel *inModel, register CKTcircuit *ckt)
|
||||||
{
|
{
|
||||||
HSM1model *model = (HSM1model*)inModel;
|
register HSM1model *model = (HSM1model*)inModel;
|
||||||
HSM1instance *here;
|
register HSM1instance *here;
|
||||||
double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds;
|
double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds;
|
||||||
double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs;
|
double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs;
|
||||||
|
|
||||||
|
|
@ -77,6 +73,15 @@ int HSM1convTest(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
if ( here->HSM1_off == 0 || !(ckt->CKTmode & MODEINITFIX) ) {
|
if ( here->HSM1_off == 0 || !(ckt->CKTmode & MODEINITFIX) ) {
|
||||||
tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) + ckt->CKTabstol;
|
tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) + ckt->CKTabstol;
|
||||||
if ( fabs(cdhat - cd) >= tol ) {
|
if ( fabs(cdhat - cd) >= tol ) {
|
||||||
|
#ifdef XSPICE
|
||||||
|
/* gtri - begin - wbk - report conv prob */
|
||||||
|
if(ckt->enh->conv_debug.report_conv_probs) {
|
||||||
|
ENHreport_conv_prob(ENH_ANALOG_INSTANCE,
|
||||||
|
(char *) here->MOS1name,
|
||||||
|
"");
|
||||||
|
}
|
||||||
|
/* gtri - end - wbk - report conv prob */
|
||||||
|
#endif
|
||||||
ckt->CKTnoncon++;
|
ckt->CKTnoncon++;
|
||||||
return(OK);
|
return(OK);
|
||||||
}
|
}
|
||||||
|
|
@ -96,6 +101,15 @@ int HSM1convTest(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
tol = ckt->CKTreltol *
|
tol = ckt->CKTreltol *
|
||||||
MAX(fabs(cbhat), fabs(cbs + cbd - here->HSM1_isub)) + ckt->CKTabstol;
|
MAX(fabs(cbhat), fabs(cbs + cbd - here->HSM1_isub)) + ckt->CKTabstol;
|
||||||
if ( fabs(cbhat - (cbs + cbd - here->HSM1_isub)) > tol ) {
|
if ( fabs(cbhat - (cbs + cbd - here->HSM1_isub)) > tol ) {
|
||||||
|
#ifdef XSPICE
|
||||||
|
/* gtri - begin - wbk - report conv prob */
|
||||||
|
if(ckt->enh->conv_debug.report_conv_probs) {
|
||||||
|
ENHreport_conv_prob(ENH_ANALOG_INSTANCE,
|
||||||
|
(char *) here->HSM1name,
|
||||||
|
"");
|
||||||
|
}
|
||||||
|
/* gtri - end - wbk - report conv prob */
|
||||||
|
#endif
|
||||||
ckt->CKTnoncon++;
|
ckt->CKTnoncon++;
|
||||||
return(OK);
|
return(OK);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,13 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1def.h of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1def.h of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HSM1
|
#ifndef HSM1
|
||||||
#define HSM1
|
#define HSM1
|
||||||
|
|
||||||
|
|
@ -30,6 +25,7 @@ typedef struct sHSM1instance {
|
||||||
struct sHSM1instance *HSM1nextInstance; /* pointer to next instance of
|
struct sHSM1instance *HSM1nextInstance; /* pointer to next instance of
|
||||||
current model*/
|
current model*/
|
||||||
IFuid HSM1name; /* pointer to character string naming this instance */
|
IFuid HSM1name; /* pointer to character string naming this instance */
|
||||||
|
/*DW next is additional in spice */
|
||||||
int HSM1owner; /* number of owner process */
|
int HSM1owner; /* number of owner process */
|
||||||
int HSM1states; /* index into state table for this device */
|
int HSM1states; /* index into state table for this device */
|
||||||
|
|
||||||
|
|
@ -75,8 +71,8 @@ typedef struct sHSM1instance {
|
||||||
double HSM1_dtemp;
|
double HSM1_dtemp;
|
||||||
|
|
||||||
/* added by K.M. */
|
/* added by K.M. */
|
||||||
double HSM1_weff; /* the effectiv width of the channel region */
|
double HSM1_weff; /* the effective width of the channel region */
|
||||||
double HSM1_leff; /* the effectiv length of the channel region */
|
double HSM1_leff; /* the effective length of the channel region */
|
||||||
|
|
||||||
/* output */
|
/* output */
|
||||||
int HSM1_capop;
|
int HSM1_capop;
|
||||||
|
|
@ -129,8 +125,34 @@ typedef struct sHSM1instance {
|
||||||
double HSM1_freq;
|
double HSM1_freq;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* added by K.M. */
|
|
||||||
double HSM1_mu; /* mobility */
|
double HSM1_mu; /* mobility */
|
||||||
|
double HSM1_igidl; /* gate induced drain leakage */
|
||||||
|
double HSM1_gigidlgs;
|
||||||
|
double HSM1_gigidlds;
|
||||||
|
double HSM1_gigidlbs;
|
||||||
|
double HSM1_igisl; /* gate induced source leakage */
|
||||||
|
double HSM1_gigislgd;
|
||||||
|
double HSM1_gigislsd;
|
||||||
|
double HSM1_gigislbd;
|
||||||
|
double HSM1_igb; /* gate tunneling current (gate to bulk) */
|
||||||
|
double HSM1_gigbg;
|
||||||
|
double HSM1_gigbd;
|
||||||
|
double HSM1_gigbb;
|
||||||
|
double HSM1_gigbs;
|
||||||
|
double HSM1_igs; /* gate tunneling current (gate to source) */
|
||||||
|
double HSM1_gigsg;
|
||||||
|
double HSM1_gigsd;
|
||||||
|
double HSM1_gigsb;
|
||||||
|
double HSM1_gigss;
|
||||||
|
double HSM1_igd; /* gate tunneling current (gate to drain) */
|
||||||
|
double HSM1_gigdg;
|
||||||
|
double HSM1_gigdd;
|
||||||
|
double HSM1_gigdb;
|
||||||
|
double HSM1_gigds;
|
||||||
|
double HSM1_qg_int ;
|
||||||
|
double HSM1_qd_int ;
|
||||||
|
double HSM1_qs_int ;
|
||||||
|
double HSM1_qb_int ;
|
||||||
|
|
||||||
/* no use in SPICE3f5
|
/* no use in SPICE3f5
|
||||||
double HSM1drainSquares; the length of the drain in squares
|
double HSM1drainSquares; the length of the drain in squares
|
||||||
|
|
@ -258,7 +280,7 @@ typedef struct sHiSIM1model { /* model structure for a resistor */
|
||||||
int HSM1_level; /* level */
|
int HSM1_level; /* level */
|
||||||
int HSM1_info; /* information */
|
int HSM1_info; /* information */
|
||||||
int HSM1_noise; /* noise model selecter see hsm1noi.c */
|
int HSM1_noise; /* noise model selecter see hsm1noi.c */
|
||||||
int HSM1_version; /* model version 100/110 */
|
int HSM1_version; /* model version 101/111/120 */
|
||||||
int HSM1_show; /* show physical value 1, 2, ... , 11 */
|
int HSM1_show; /* show physical value 1, 2, ... , 11 */
|
||||||
|
|
||||||
/* flags for initial guess */
|
/* flags for initial guess */
|
||||||
|
|
@ -274,16 +296,19 @@ typedef struct sHiSIM1model { /* model structure for a resistor */
|
||||||
int HSM1_coisub ;
|
int HSM1_coisub ;
|
||||||
int HSM1_coiigs ;
|
int HSM1_coiigs ;
|
||||||
int HSM1_cogidl ;
|
int HSM1_cogidl ;
|
||||||
|
int HSM1_cogisl ;
|
||||||
int HSM1_coovlp ;
|
int HSM1_coovlp ;
|
||||||
int HSM1_conois ;
|
int HSM1_conois ;
|
||||||
int HSM1_coisti ; /* HiSIM1.1 */
|
int HSM1_coisti ; /* HiSIM1.1 */
|
||||||
|
int HSM1_cosmbi ; /* HiSIM1.2 */
|
||||||
|
|
||||||
/* HiSIM original */
|
/* HiSIM original */
|
||||||
double HSM1_vmax ;
|
double HSM1_vmax ;
|
||||||
double HSM1_bgtmp1 ;
|
double HSM1_bgtmp1 ;
|
||||||
double HSM1_bgtmp2 ;
|
double HSM1_bgtmp2 ;
|
||||||
double HSM1_tox ;
|
double HSM1_tox ;
|
||||||
double HSM1_dl ;
|
double HSM1_xld ;
|
||||||
double HSM1_dw ;
|
double HSM1_xwd ;
|
||||||
double HSM1_xj ; /* HiSIM1.0 */
|
double HSM1_xj ; /* HiSIM1.0 */
|
||||||
double HSM1_xqy ; /* HiSIM1.1 */
|
double HSM1_xqy ; /* HiSIM1.1 */
|
||||||
double HSM1_rs; /* source contact resistance */
|
double HSM1_rs; /* source contact resistance */
|
||||||
|
|
@ -315,9 +340,6 @@ typedef struct sHiSIM1model { /* model structure for a resistor */
|
||||||
double HSM1_muesr1 ;
|
double HSM1_muesr1 ;
|
||||||
double HSM1_muesr0 ;
|
double HSM1_muesr0 ;
|
||||||
double HSM1_bb ;
|
double HSM1_bb ;
|
||||||
double HSM1_vds0 ;
|
|
||||||
double HSM1_bc0 ;
|
|
||||||
double HSM1_bc1 ;
|
|
||||||
double HSM1_sub1 ;
|
double HSM1_sub1 ;
|
||||||
double HSM1_sub2 ;
|
double HSM1_sub2 ;
|
||||||
double HSM1_sub3 ;
|
double HSM1_sub3 ;
|
||||||
|
|
@ -368,6 +390,12 @@ typedef struct sHiSIM1model { /* model structure for a resistor */
|
||||||
double HSM1_nftrp ;
|
double HSM1_nftrp ;
|
||||||
double HSM1_nfalp ;
|
double HSM1_nfalp ;
|
||||||
double HSM1_cit ;
|
double HSM1_cit ;
|
||||||
|
double HSM1_glpart1 ; /* HiSIM1.2 */
|
||||||
|
double HSM1_glpart2 ; /* HiSIM1.2 */
|
||||||
|
double HSM1_kappa ; /* HiSIM1.2 */
|
||||||
|
double HSM1_xdiffd ; /* HiSIM1.2 */
|
||||||
|
double HSM1_pthrou ; /* HiSIM1.2 */
|
||||||
|
double HSM1_vdiffj ; /* HiSIM1.2 */
|
||||||
|
|
||||||
/* for flicker noise of SPICE3 added by K.M. */
|
/* for flicker noise of SPICE3 added by K.M. */
|
||||||
double HSM1_ef;
|
double HSM1_ef;
|
||||||
|
|
@ -393,15 +421,23 @@ typedef struct sHiSIM1model { /* model structure for a resistor */
|
||||||
unsigned HSM1_coisub_Given :1;
|
unsigned HSM1_coisub_Given :1;
|
||||||
unsigned HSM1_coiigs_Given :1;
|
unsigned HSM1_coiigs_Given :1;
|
||||||
unsigned HSM1_cogidl_Given :1;
|
unsigned HSM1_cogidl_Given :1;
|
||||||
|
unsigned HSM1_cogisl_Given :1;
|
||||||
unsigned HSM1_coovlp_Given :1;
|
unsigned HSM1_coovlp_Given :1;
|
||||||
unsigned HSM1_conois_Given :1;
|
unsigned HSM1_conois_Given :1;
|
||||||
unsigned HSM1_coisti_Given :1; /* HiSIM1.1 */
|
unsigned HSM1_coisti_Given :1; /* HiSIM1.1 */
|
||||||
|
unsigned HSM1_cosmbi_Given :1; /* HiSIM1.2 */
|
||||||
|
unsigned HSM1_glpart1_Given :1; /* HiSIM1.2 */
|
||||||
|
unsigned HSM1_glpart2_Given :1; /* HiSIM1.2 */
|
||||||
|
unsigned HSM1_kappa_Given :1; /* HiSIM1.2 */
|
||||||
|
unsigned HSM1_xdiffd_Given :1; /* HiSIM1.2 */
|
||||||
|
unsigned HSM1_pthrou_Given :1; /* HiSIM1.2 */
|
||||||
|
unsigned HSM1_vdiffj_Given :1; /* HiSIM1.2 */
|
||||||
unsigned HSM1_vmax_Given :1;
|
unsigned HSM1_vmax_Given :1;
|
||||||
unsigned HSM1_bgtmp1_Given :1;
|
unsigned HSM1_bgtmp1_Given :1;
|
||||||
unsigned HSM1_bgtmp2_Given :1;
|
unsigned HSM1_bgtmp2_Given :1;
|
||||||
unsigned HSM1_tox_Given :1;
|
unsigned HSM1_tox_Given :1;
|
||||||
unsigned HSM1_dl_Given :1;
|
unsigned HSM1_xld_Given :1;
|
||||||
unsigned HSM1_dw_Given :1;
|
unsigned HSM1_xwd_Given :1;
|
||||||
unsigned HSM1_xj_Given :1; /* HiSIM1.0 */
|
unsigned HSM1_xj_Given :1; /* HiSIM1.0 */
|
||||||
unsigned HSM1_xqy_Given :1; /* HiSIM1.1 */
|
unsigned HSM1_xqy_Given :1; /* HiSIM1.1 */
|
||||||
unsigned HSM1_rs_Given :1;
|
unsigned HSM1_rs_Given :1;
|
||||||
|
|
@ -433,9 +469,6 @@ typedef struct sHiSIM1model { /* model structure for a resistor */
|
||||||
unsigned HSM1_muesr1_Given :1;
|
unsigned HSM1_muesr1_Given :1;
|
||||||
unsigned HSM1_muesr0_Given :1;
|
unsigned HSM1_muesr0_Given :1;
|
||||||
unsigned HSM1_bb_Given :1;
|
unsigned HSM1_bb_Given :1;
|
||||||
unsigned HSM1_vds0_Given :1;
|
|
||||||
unsigned HSM1_bc0_Given :1;
|
|
||||||
unsigned HSM1_bc1_Given :1;
|
|
||||||
unsigned HSM1_sub1_Given :1;
|
unsigned HSM1_sub1_Given :1;
|
||||||
unsigned HSM1_sub2_Given :1;
|
unsigned HSM1_sub2_Given :1;
|
||||||
unsigned HSM1_sub3_Given :1;
|
unsigned HSM1_sub3_Given :1;
|
||||||
|
|
@ -523,10 +556,11 @@ typedef struct sHiSIM1model { /* model structure for a resistor */
|
||||||
#define HSM1_MOD_COOVLP 24
|
#define HSM1_MOD_COOVLP 24
|
||||||
#define HSM1_MOD_CONOIS 25
|
#define HSM1_MOD_CONOIS 25
|
||||||
#define HSM1_MOD_COISTI 26 /* HiSIM1.1 */
|
#define HSM1_MOD_COISTI 26 /* HiSIM1.1 */
|
||||||
|
#define HSM1_MOD_COSMBI 27 /* HiSIM1.2 */
|
||||||
|
#define HSM1_MOD_COGISL 28 /* HiSIM1.2 */
|
||||||
/* device parameters */
|
/* device parameters */
|
||||||
#define HSM1_L 51
|
#define HSM1_L 51
|
||||||
#define HSM1_W 52
|
#define HSM1_W 52
|
||||||
#define HSM1_M 66
|
|
||||||
#define HSM1_AD 53
|
#define HSM1_AD 53
|
||||||
#define HSM1_AS 54
|
#define HSM1_AS 54
|
||||||
#define HSM1_PD 55
|
#define HSM1_PD 55
|
||||||
|
|
@ -540,14 +574,15 @@ typedef struct sHiSIM1model { /* model structure for a resistor */
|
||||||
#define HSM1_IC_VDS 63
|
#define HSM1_IC_VDS 63
|
||||||
#define HSM1_IC_VGS 64
|
#define HSM1_IC_VGS 64
|
||||||
#define HSM1_IC 65
|
#define HSM1_IC 65
|
||||||
|
#define HSM1_M 66
|
||||||
|
|
||||||
/* model parameters */
|
/* model parameters */
|
||||||
#define HSM1_MOD_VMAX 101
|
#define HSM1_MOD_VMAX 101
|
||||||
#define HSM1_MOD_BGTMP1 103
|
#define HSM1_MOD_BGTMP1 103
|
||||||
#define HSM1_MOD_BGTMP2 104
|
#define HSM1_MOD_BGTMP2 104
|
||||||
#define HSM1_MOD_TOX 105
|
#define HSM1_MOD_TOX 105
|
||||||
#define HSM1_MOD_DL 106
|
#define HSM1_MOD_XLD 106
|
||||||
#define HSM1_MOD_DW 107
|
#define HSM1_MOD_XWD 107
|
||||||
#define HSM1_MOD_XJ 996 /* HiSIM1.0 */
|
#define HSM1_MOD_XJ 996 /* HiSIM1.0 */
|
||||||
#define HSM1_MOD_XQY 997 /* HiSIM1.1 */
|
#define HSM1_MOD_XQY 997 /* HiSIM1.1 */
|
||||||
#define HSM1_MOD_RS 108
|
#define HSM1_MOD_RS 108
|
||||||
|
|
@ -570,9 +605,6 @@ typedef struct sHiSIM1model { /* model structure for a resistor */
|
||||||
#define HSM1_MOD_MUESR1 135
|
#define HSM1_MOD_MUESR1 135
|
||||||
#define HSM1_MOD_MUESR0 136
|
#define HSM1_MOD_MUESR0 136
|
||||||
#define HSM1_MOD_BB 137
|
#define HSM1_MOD_BB 137
|
||||||
#define HSM1_MOD_VDS0 138
|
|
||||||
#define HSM1_MOD_BC0 139
|
|
||||||
#define HSM1_MOD_BC1 140
|
|
||||||
#define HSM1_MOD_SUB1 141
|
#define HSM1_MOD_SUB1 141
|
||||||
#define HSM1_MOD_SUB2 142
|
#define HSM1_MOD_SUB2 142
|
||||||
#define HSM1_MOD_SUB3 143
|
#define HSM1_MOD_SUB3 143
|
||||||
|
|
@ -629,6 +661,12 @@ typedef struct sHiSIM1model { /* model structure for a resistor */
|
||||||
#define HSM1_MOD_WSTI 209 /* HiSIM1.1 */
|
#define HSM1_MOD_WSTI 209 /* HiSIM1.1 */
|
||||||
#define HSM1_MOD_RPOCP1 210 /* HiSIM1.1 */
|
#define HSM1_MOD_RPOCP1 210 /* HiSIM1.1 */
|
||||||
#define HSM1_MOD_RPOCP2 211 /* HiSIM1.1 */
|
#define HSM1_MOD_RPOCP2 211 /* HiSIM1.1 */
|
||||||
|
#define HSM1_MOD_GLPART1 212 /* HiSIM1.2 */
|
||||||
|
#define HSM1_MOD_GLPART2 213 /* HiSIM1.2 */
|
||||||
|
#define HSM1_MOD_KAPPA 214 /* HiSIM1.2 */
|
||||||
|
#define HSM1_MOD_XDIFFD 215 /* HiSIM1.2 */
|
||||||
|
#define HSM1_MOD_PTHROU 216 /* HiSIM1.2 */
|
||||||
|
#define HSM1_MOD_VDIFFJ 217 /* HiSIM1.2 */
|
||||||
#define HSM1_MOD_NFTRP 401
|
#define HSM1_MOD_NFTRP 401
|
||||||
#define HSM1_MOD_NFALP 402
|
#define HSM1_MOD_NFALP 402
|
||||||
#define HSM1_MOD_CIT 403
|
#define HSM1_MOD_CIT 403
|
||||||
|
|
|
||||||
|
|
@ -1,25 +1,21 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1del.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1del.c of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "hsm1def.h"
|
#include "hsm1def.h"
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
#include "gendefs.h"
|
#include "gendefs.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
int HSM1delete(GENmodel *inModel, IFuid name, GENinstance **inInst)
|
int
|
||||||
|
HSM1delete(GENmodel *inModel, IFuid name, GENinstance **inInst)
|
||||||
{
|
{
|
||||||
HSM1instance **fast = (HSM1instance**)inInst;
|
HSM1instance **fast = (HSM1instance**)inInst;
|
||||||
HSM1model *model = (HSM1model*)inModel;
|
HSM1model *model = (HSM1model*)inModel;
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,19 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1dest.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1dest.c of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "hsm1def.h"
|
#include "hsm1def.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
void HSM1destroy(GENmodel **inModel)
|
void
|
||||||
|
HSM1destroy(GENmodel **inModel)
|
||||||
{
|
{
|
||||||
HSM1model **model = (HSM1model**)inModel;
|
HSM1model **model = (HSM1model**)inModel;
|
||||||
HSM1instance *here;
|
HSM1instance *here;
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,22 +1,17 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1evalenv.h of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1evalenv.h of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HSM1_EVAL_ENV_H
|
#ifndef HSM1_EVAL_ENV_H
|
||||||
#define HSM1_EVAL_ENV_H
|
#define HSM1_EVAL_ENV_H
|
||||||
|
|
||||||
/* macros and constants used in hsm1eval1_x.c */
|
/* macros and constants used in hsm1eval1_y_z.c */
|
||||||
|
|
||||||
/*---------------------------------------------------*
|
/*---------------------------------------------------*
|
||||||
* Numerical constants. (macro)
|
* Numerical constants. (macro)
|
||||||
|
|
@ -57,9 +52,10 @@
|
||||||
/* Boltzmann constant */
|
/* Boltzmann constant */
|
||||||
#define C_KB (1.3806226e-23)
|
#define C_KB (1.3806226e-23)
|
||||||
|
|
||||||
/* Permitivity of Si and SiO2 */
|
/* Permitivity of Si, SiO2 and vacuum */
|
||||||
#define C_ESI (1.034943e-12)
|
#define C_ESI (1.034943e-12)
|
||||||
#define C_EOX (3.453133e-13)
|
#define C_EOX (3.453133e-13)
|
||||||
|
#define C_VAC (8.8541878e-14)
|
||||||
|
|
||||||
/* Room temperature constants */
|
/* Room temperature constants */
|
||||||
#define C_T300 (300e+00)
|
#define C_T300 (300e+00)
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,13 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1ext.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1ext.h of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern int HSM1acLoad(GENmodel *,CKTcircuit*);
|
extern int HSM1acLoad(GENmodel *,CKTcircuit*);
|
||||||
extern int HSM1ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*);
|
extern int HSM1ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*);
|
||||||
extern int HSM1convTest(GENmodel *,CKTcircuit*);
|
extern int HSM1convTest(GENmodel *,CKTcircuit*);
|
||||||
|
|
|
||||||
|
|
@ -1,25 +1,21 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1getic.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1getic of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
#include "hsm1def.h"
|
#include "hsm1def.h"
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
int HSM1getic(GENmodel *inModel, CKTcircuit *ckt)
|
int
|
||||||
|
HSM1getic(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
{
|
{
|
||||||
HSM1model *model = (HSM1model*)inModel;
|
HSM1model *model = (HSM1model*)inModel;
|
||||||
HSM1instance *here;
|
HSM1instance *here;
|
||||||
|
|
@ -31,6 +27,7 @@ int HSM1getic(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
for ( ;model ;model = model->HSM1nextModel ) {
|
for ( ;model ;model = model->HSM1nextModel ) {
|
||||||
for ( here = model->HSM1instances; here ;here = here->HSM1nextInstance ) {
|
for ( here = model->HSM1instances; here ;here = here->HSM1nextInstance ) {
|
||||||
|
|
||||||
|
|
||||||
if (here->HSM1owner != ARCHme)
|
if (here->HSM1owner != ARCHme)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,15 +2,14 @@
|
||||||
|
|
||||||
#include <devdefs.h>
|
#include <devdefs.h>
|
||||||
|
|
||||||
|
#include "hsm1def.h"
|
||||||
#include "hsm1itf.h"
|
#include "hsm1itf.h"
|
||||||
#include "hsm1ext.h"
|
#include "hsm1ext.h"
|
||||||
#include "hsm1init.h"
|
#include "hsm1init.h"
|
||||||
|
|
||||||
|
|
||||||
SPICEdev HSM1info = {
|
SPICEdev HSM1info = {
|
||||||
{
|
{ "HiSIM1",
|
||||||
"HiSIM1",
|
"Hiroshima University STARC IGFET Model 1.2.0",
|
||||||
"Hiroshima-university STARC IGFET Model 1.1.0",
|
|
||||||
|
|
||||||
&HSM1nSize,
|
&HSM1nSize,
|
||||||
&HSM1nSize,
|
&HSM1nSize,
|
||||||
|
|
@ -21,6 +20,7 @@ SPICEdev HSM1info = {
|
||||||
|
|
||||||
&HSM1mPTSize,
|
&HSM1mPTSize,
|
||||||
HSM1mPTable,
|
HSM1mPTable,
|
||||||
|
|
||||||
#ifdef XSPICE
|
#ifdef XSPICE
|
||||||
/*---- Fixed by SDB 5.2.2003 to enable XSPICE/tclspice integration -----*/
|
/*---- Fixed by SDB 5.2.2003 to enable XSPICE/tclspice integration -----*/
|
||||||
NULL, /* This is a SPICE device, it has no MIF info data */
|
NULL, /* This is a SPICE device, it has no MIF info data */
|
||||||
|
|
@ -65,6 +65,7 @@ DEV_DEFAULT
|
||||||
DEVsenPrint : NULL,
|
DEVsenPrint : NULL,
|
||||||
DEVsenTrunc : NULL,
|
DEVsenTrunc : NULL,
|
||||||
DEVdisto : NULL,
|
DEVdisto : NULL,
|
||||||
|
|
||||||
DEVnoise : HSM1noise,
|
DEVnoise : HSM1noise,
|
||||||
#ifdef CIDER
|
#ifdef CIDER
|
||||||
DEVdump : NULL,
|
DEVdump : NULL,
|
||||||
|
|
@ -72,6 +73,7 @@ DEV_DEFAULT
|
||||||
#endif
|
#endif
|
||||||
DEVinstSize : &HSM1iSize,
|
DEVinstSize : &HSM1iSize,
|
||||||
DEVmodSize : &HSM1mSize
|
DEVmodSize : &HSM1mSize
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef _HISIM1INIT_H
|
#ifndef _HISIMINIT_H
|
||||||
#define _HISIM1INIT_H
|
#define _HISIMINIT_H
|
||||||
|
|
||||||
extern IFparm HSM1pTable[ ];
|
extern IFparm HSM1pTable[ ];
|
||||||
extern IFparm HSM1mPTable[ ];
|
extern IFparm HSM1mPTable[ ];
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,12 @@
|
||||||
/**********
|
/***********************************************************************
|
||||||
Copyright 2001 Regents of the University of California. All rights reserved.
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
Author: 2000 Weidong Liu, Xiaodong Jin.
|
Copyright (C) 2003 STARC
|
||||||
Author: 2001 Xuemei Xi
|
|
||||||
File: bsim4itf.h
|
VERSION : HiSIM 1.2.0
|
||||||
**********/
|
FILE : hsm1itf.h of HiSIM 1.2.0
|
||||||
|
|
||||||
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
|
***********************************************************************/
|
||||||
|
|
||||||
#ifndef DEV_HISIM1
|
#ifndef DEV_HISIM1
|
||||||
#define DEV_HISIM1
|
#define DEV_HISIM1
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,13 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1ld.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1ld.c of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
#include "hsm1def.h"
|
#include "hsm1def.h"
|
||||||
|
|
@ -23,94 +18,138 @@
|
||||||
#include "devdefs.h"
|
#include "devdefs.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
static void ShowPhysVals(HSM1instance *here, int flag, int isFirst, double vds,
|
#define SHOW_EPS_QUANT 1.0e-15
|
||||||
double vgs, double vbs)
|
|
||||||
|
static void
|
||||||
|
ShowPhysVals(HSM1instance *here, HSM1model *model,int isFirst, double vds,
|
||||||
|
double vgs, double vbs, double vgd, double vbd, double vgb)
|
||||||
{
|
{
|
||||||
switch (flag) {
|
/* 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;
|
||||||
|
vbs = (fabs(vbs) < SHOW_EPS_QUANT) ? 0.0 : vbs;
|
||||||
|
vgb = (fabs(vgb) < SHOW_EPS_QUANT) ? 0.0 : vgb;
|
||||||
|
switch (model->HSM1_show) {
|
||||||
case 1:
|
case 1:
|
||||||
if (isFirst) printf("Vds Ids\n");
|
if (isFirst) printf("Vds Ids\n");
|
||||||
printf("%e %e\n", vds, here->HSM1_ids);
|
printf("%e %e\n", model->HSM1_type*vds, here->HSM1_mode*here->HSM1_ids);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
if (isFirst) printf("Vgs Ids\n");
|
if (isFirst) printf("Vgs Ids\n");
|
||||||
printf("%e %e\n", vgs, here->HSM1_ids);
|
printf("%e %e\n", model->HSM1_type*vgs, here->HSM1_mode*here->HSM1_ids);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
if (isFirst) printf("vgs ln(Ids)\n");
|
if (isFirst) printf("Vgs log10(|Ids|)\n");
|
||||||
printf("%e %e\n", vgs, log(here->HSM1_ids));
|
printf("%e %e\n", model->HSM1_type*vgs, log10(here->HSM1_ids));
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
if (isFirst) printf("ln(Ids) gm/Ids\n");
|
if (isFirst) printf("log10(|Ids|) gm/|Ids|\n");
|
||||||
if (here->HSM1_ids == 0.0)
|
if (here->HSM1_ids == 0.0)
|
||||||
printf("I can't show gm/Ids - ln(Ids), because Ids = 0.\n");
|
printf("I can't show gm/Ids - log10(Ids), because Ids = 0.\n");
|
||||||
else
|
else
|
||||||
printf("%e %e\n", log(here->HSM1_ids), here->HSM1_gm/here->HSM1_ids);
|
printf("%e %e\n", log10(here->HSM1_ids), here->HSM1_gm/here->HSM1_ids);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
if (isFirst) printf("Vds gds\n");
|
if (isFirst) printf("Vds gds\n");
|
||||||
printf("%e %e\n", vds, here->HSM1_gds);
|
printf("%e %e\n", model->HSM1_type*vds, here->HSM1_gds);
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
if (isFirst) printf("Vgs gm\n");
|
if (isFirst) printf("Vgs gm\n");
|
||||||
printf("%e %e\n", vgs, here->HSM1_gm);
|
printf("%e %e\n", model->HSM1_type*vgs, here->HSM1_gm);
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
if (isFirst) printf("Vbs gbs\n");
|
if (isFirst) printf("Vbs gbs\n");
|
||||||
printf("%e %e\n", vbs, here->HSM1_gbs);
|
printf("%e %e\n", model->HSM1_type*vbs, here->HSM1_gmbs);
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
if (isFirst) printf("Vgs Cgg\n");
|
if (isFirst) printf("Vgs Cgg\n");
|
||||||
printf("%e %e\n", vgs, here->HSM1_cggb);
|
printf("%e %e\n", model->HSM1_type*vgs, here->HSM1_cggb);
|
||||||
break;
|
break;
|
||||||
case 9:
|
case 9:
|
||||||
if (isFirst) printf("Vgs Cgs\n");
|
if (isFirst) printf("Vgs Cgs\n");
|
||||||
printf("%e %e\n", vgs, here->HSM1_cgsb);
|
printf("%e %e\n", model->HSM1_type*vgs, here->HSM1_cgsb);
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
if (isFirst) printf("Vgs Cgd\n");
|
if (isFirst) printf("Vgs Cgd\n");
|
||||||
printf("%e %e\n", vgs, here->HSM1_cgdb);
|
printf("%e %e\n", model->HSM1_type*vgs, here->HSM1_cgdb);
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 11:
|
||||||
if (isFirst) printf("Vgs Cgb\n");
|
if (isFirst) printf("Vgs Cgb\n");
|
||||||
printf("%e %e\n", vgs, -(here->HSM1_cggb+here->HSM1_cgsb+here->HSM1_cgdb));
|
printf("%e %e\n", model->HSM1_type*vgs, -(here->HSM1_cggb+here->HSM1_cgsb+here->HSM1_cgdb));
|
||||||
break;
|
break;
|
||||||
case 12:
|
case 12:
|
||||||
if (isFirst) printf("Vds Csg\n");
|
if (isFirst) printf("Vds Csg\n");
|
||||||
printf("%e %e\n", vds, -(here->HSM1_cggb+here->HSM1_cbgb+here->HSM1_cdgb));
|
printf("%e %e\n", model->HSM1_type*vds, -(here->HSM1_cggb+here->HSM1_cbgb+here->HSM1_cdgb));
|
||||||
break;
|
break;
|
||||||
case 13:
|
case 13:
|
||||||
if (isFirst) printf("Vds Cdg\n");
|
if (isFirst) printf("Vds Cdg\n");
|
||||||
printf("%e %e\n", vds, here->HSM1_cdgb);
|
printf("%e %e\n", model->HSM1_type*vds, here->HSM1_cdgb);
|
||||||
break;
|
break;
|
||||||
case 14:
|
case 14:
|
||||||
if (isFirst) printf("Vds Cbg\n");
|
if (isFirst) printf("Vds Cbg\n");
|
||||||
printf("%e %e\n", vds, here->HSM1_cbgb);
|
printf("%e %e\n", model->HSM1_type*vds, here->HSM1_cbgb);
|
||||||
break;
|
break;
|
||||||
deafult:
|
case 15:
|
||||||
|
if (isFirst) printf("Vds Cgg\n");
|
||||||
|
printf("%e %e\n", model->HSM1_type*vds, here->HSM1_cggb);
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
if (isFirst) printf("Vds Cgs\n");
|
||||||
|
printf("%e %e\n", model->HSM1_type*vds, here->HSM1_cgsb);
|
||||||
|
break;
|
||||||
|
case 17:
|
||||||
|
if (isFirst) printf("Vds Cgd\n");
|
||||||
|
printf("%e %e\n", model->HSM1_type*vds, here->HSM1_cgdb);
|
||||||
|
break;
|
||||||
|
case 18:
|
||||||
|
if (isFirst) printf("Vds Cgb\n");
|
||||||
|
printf("%e %e\n", model->HSM1_type*vds, -(here->HSM1_cggb+here->HSM1_cgsb+here->HSM1_cgdb));
|
||||||
|
break;
|
||||||
|
case 19:
|
||||||
|
if (isFirst) printf("Vgs Csg\n");
|
||||||
|
printf("%e %e\n", model->HSM1_type*vgs, -(here->HSM1_cggb+here->HSM1_cbgb+here->HSM1_cdgb));
|
||||||
|
break;
|
||||||
|
case 20:
|
||||||
|
if (isFirst) printf("Vgs Cdg\n");
|
||||||
|
printf("%e %e\n", model->HSM1_type*vgs, here->HSM1_cdgb);
|
||||||
|
break;
|
||||||
|
case 21:
|
||||||
|
if (isFirst) printf("Vgs Cbg\n");
|
||||||
|
printf("%e %e\n", model->HSM1_type*vgs, here->HSM1_cbgb);
|
||||||
|
break;
|
||||||
|
case 22:
|
||||||
|
if (isFirst) printf("Vgb Cgb\n");
|
||||||
|
printf("%e %e\n", model->HSM1_type*vgb, -(here->HSM1_cggb+here->HSM1_cgsb+here->HSM1_cgdb));
|
||||||
|
break;
|
||||||
|
case 50:
|
||||||
|
if (isFirst) printf("Vgs Vds Vbs Vgb Ids log10(|Ids|) gm/|Ids| gm gds gbs Cgg Cgs Cgb Cgd Csg Cbg Cdg\n");
|
||||||
|
printf("%e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e\n", model->HSM1_type*vgs, model->HSM1_type*vds, model->HSM1_type*vbs, model->HSM1_type*vgb, here->HSM1_mode*here->HSM1_ids, log10(here->HSM1_ids), here->HSM1_gm/here->HSM1_ids, here->HSM1_gm, here->HSM1_gds, here->HSM1_gmbs, here->HSM1_cggb, here->HSM1_cgsb, -(here->HSM1_cggb+here->HSM1_cgsb+here->HSM1_cgdb), here->HSM1_cgdb, -(here->HSM1_cggb+here->HSM1_cbgb+here->HSM1_cdgb), here->HSM1_cbgb, here->HSM1_cdgb);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
/*
|
/*
|
||||||
printf("There is no physical vaule corrsponding to %d\n", flag);
|
printf("There is no physical value corrsponding to %d\n", flag);
|
||||||
*/
|
*/
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
int HSM1load(GENmodel *inModel, register CKTcircuit *ckt)
|
||||||
/* actually load the current value into the
|
/* actually load the current value into the
|
||||||
* sparse matrix previously provided
|
* sparse matrix previously provided
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
HSM1model *model = (HSM1model*)inModel;
|
register HSM1model *model = (HSM1model*)inModel;
|
||||||
HSM1instance *here;
|
register HSM1instance *here;
|
||||||
HiSIM_input sIN;
|
HiSIM_input sIN;
|
||||||
HiSIM_output sOT;
|
HiSIM_output sOT;
|
||||||
HiSIM_messenger sMS;
|
HiSIM_messenger sMS;
|
||||||
double cbhat, cdrain, cdhat, cdreq;
|
double cbhat, cdrain, cdhat, cdreq, cgbhat, cgshat, cgdhat;
|
||||||
double Ibtot, Idtot;
|
double Ibtot, Idtot, Igbtot, Igstot, Igdtot;
|
||||||
double ceq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg;
|
double ceq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg;
|
||||||
double delvbd, delvbs, delvds, delvgd, delvgs;
|
double delvbd, delvbs, delvds, delvgd, delvgs;
|
||||||
double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb;
|
double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb;
|
||||||
double gcgdb, gcggb, gcgsb, gcsdb, gcsgb, gcssb;
|
double gcgdb, gcggb, gcgsb, gcsdb, gcsgb, gcssb;
|
||||||
double geq, tol, xfact;
|
double geq, xfact;
|
||||||
double vbd, vbs, vcrit, vds, vgb, vgd, vgdo, vgs, von;
|
double vbd, vbs, vcrit, vds, vgb, vgd, vgdo, vgs, von;
|
||||||
double qgd, qgs, qgb;
|
double qgd, qgs, qgb;
|
||||||
double gbbdp, gbbsp, gbspg, gbspdp, gbspb, gbspsp;
|
double gbbdp, gbbsp, gbspg, gbspdp, gbspb, gbspsp;
|
||||||
|
|
@ -120,18 +159,27 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
double cgdo, cgso, cgbo;
|
double cgdo, cgso, cgbo;
|
||||||
double gm, gmbs, FwdSum, RevSum;
|
double gm, gmbs, FwdSum, RevSum;
|
||||||
double vt0, ag0;
|
double vt0, 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;
|
||||||
int ByPass, Check, error;
|
int ByPass, Check, error;
|
||||||
#ifndef NOBYPASS
|
#ifndef NOBYPASS
|
||||||
double tempv;
|
double tempv;
|
||||||
#endif /*NOBYPASS*/
|
#endif /*NOBYPASS*/
|
||||||
double tmp;
|
double tmp;
|
||||||
|
#ifndef NEWCONV
|
||||||
|
double tol, tol2, tol3, tol4;
|
||||||
|
#endif
|
||||||
int ChargeComputationNeeded =
|
int ChargeComputationNeeded =
|
||||||
((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) ||
|
((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) ||
|
||||||
((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)))
|
((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)))
|
||||||
? 1 : 0;
|
? 1 : 0;
|
||||||
int showPhysVal;
|
int showPhysVal;
|
||||||
|
int isConv;
|
||||||
|
double vds_pre;
|
||||||
|
|
||||||
double m;
|
double m; /* Parallel multiplier */
|
||||||
|
|
||||||
/* loop through all the HSM1 device models */
|
/* loop through all the HSM1 device models */
|
||||||
for ( ; model != NULL; model = model->HSM1nextModel ) {
|
for ( ; model != NULL; model = model->HSM1nextModel ) {
|
||||||
|
|
@ -142,7 +190,6 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
if (here->HSM1owner != ARCHme)
|
if (here->HSM1owner != ARCHme)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
||||||
showPhysVal = 0;
|
showPhysVal = 0;
|
||||||
Check=1;
|
Check=1;
|
||||||
ByPass = 0;
|
ByPass = 0;
|
||||||
|
|
@ -194,7 +241,6 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
*(ckt->CKTstate0 + here->HSM1vbd) =
|
*(ckt->CKTstate0 + here->HSM1vbd) =
|
||||||
*(ckt->CKTstate0 + here->HSM1vbs)-
|
*(ckt->CKTstate0 + here->HSM1vbs)-
|
||||||
*(ckt->CKTstate0 + here->HSM1vds);
|
*(ckt->CKTstate0 + here->HSM1vds);
|
||||||
showPhysVal = 1;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#endif /* PREDICTOR */
|
#endif /* PREDICTOR */
|
||||||
|
|
@ -208,10 +254,10 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
vds = model->HSM1_type *
|
vds = model->HSM1_type *
|
||||||
(*(ckt->CKTrhsOld+here->HSM1dNodePrime) -
|
(*(ckt->CKTrhsOld+here->HSM1dNodePrime) -
|
||||||
*(ckt->CKTrhsOld+here->HSM1sNodePrime));
|
*(ckt->CKTrhsOld+here->HSM1sNodePrime));
|
||||||
showPhysVal = 1;
|
|
||||||
#ifndef PREDICTOR
|
#ifndef PREDICTOR
|
||||||
}
|
}
|
||||||
#endif /* PREDICTOR */
|
#endif /* PREDICTOR */
|
||||||
|
|
||||||
vbd = vbs - vds;
|
vbd = vbs - vds;
|
||||||
vgd = vgs - vds;
|
vgd = vgs - vds;
|
||||||
vgdo = *(ckt->CKTstate0 + here->HSM1vgs) -
|
vgdo = *(ckt->CKTstate0 + here->HSM1vgs) -
|
||||||
|
|
@ -223,29 +269,57 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
delvgd = vgd - vgdo;
|
delvgd = vgd - vgdo;
|
||||||
|
|
||||||
if (here->HSM1_mode >= 0) {
|
if (here->HSM1_mode >= 0) {
|
||||||
Idtot = here->HSM1_ids + here->HSM1_isub - here->HSM1_ibd;
|
Idtot = here->HSM1_ids + here->HSM1_isub - here->HSM1_ibd
|
||||||
|
+ here->HSM1_igidl;
|
||||||
cdhat = Idtot - here->HSM1_gbd * delvbd
|
cdhat = Idtot - here->HSM1_gbd * delvbd
|
||||||
+ (here->HSM1_gmbs + here->HSM1_gbbs) * delvbs
|
+ (here->HSM1_gmbs + here->HSM1_gbbs + here->HSM1_gigidlbs) * delvbs
|
||||||
+ (here->HSM1_gm + here->HSM1_gbgs) * delvgs
|
+ (here->HSM1_gm + here->HSM1_gbgs + here->HSM1_gigidlgs) * delvgs
|
||||||
+ (here->HSM1_gds + here->HSM1_gbds) * delvds;
|
+ (here->HSM1_gds + here->HSM1_gbds + here->HSM1_gigidlds) * delvds;
|
||||||
Ibtot = here->HSM1_ibs + here->HSM1_ibd - here->HSM1_isub;
|
Ibtot = here->HSM1_ibs + here->HSM1_ibd - here->HSM1_isub
|
||||||
|
- here->HSM1_igidl - here->HSM1_igisl;
|
||||||
cbhat = Ibtot + here->HSM1_gbd * delvbd
|
cbhat = Ibtot + here->HSM1_gbd * delvbd
|
||||||
+ (here->HSM1_gbs - here->HSM1_gbbs) * delvbs
|
+ (here->HSM1_gbs - here->HSM1_gbbs - here->HSM1_gigidlbs) * delvbs
|
||||||
- here->HSM1_gbgs * delvgs
|
- (here->HSM1_gbgs + here->HSM1_gigidlgs) * delvgs
|
||||||
- here->HSM1_gbds * delvds;
|
- (here->HSM1_gbds + here->HSM1_gigidlds) * delvds
|
||||||
|
- here->HSM1_gigislgd * delvgd - here->HSM1_gigislbd * delvbd
|
||||||
|
+ here->HSM1_gigislsd * delvds;
|
||||||
|
Igstot = here->HSM1_igs;
|
||||||
|
cgshat = Igstot + here->HSM1_gigsg * delvgs +
|
||||||
|
here->HSM1_gigsd * delvds + here->HSM1_gigsb * delvbs;
|
||||||
|
Igdtot = here->HSM1_igd;
|
||||||
|
cgdhat = Igdtot + here->HSM1_gigdg * delvgs +
|
||||||
|
here->HSM1_gigdd * delvds + here->HSM1_gigdb * delvbs;
|
||||||
|
Igbtot = here->HSM1_igb;
|
||||||
|
cgbhat = Igbtot + here->HSM1_gigbg * delvgs +
|
||||||
|
here->HSM1_gigbd * delvds + here->HSM1_gigbb * delvbs;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Idtot = here->HSM1_ids - here->HSM1_ibd;
|
Idtot = here->HSM1_ids + here->HSM1_ibd - here->HSM1_igidl;
|
||||||
cdhat = Idtot - (here->HSM1_gbd - here->HSM1_gmbs) * delvbd
|
cdhat = Idtot + (here->HSM1_gbd + here->HSM1_gmbs) * delvbd
|
||||||
+ here->HSM1_gm * delvgd
|
+ here->HSM1_gm * delvgd - here->HSM1_gds * delvds
|
||||||
- here->HSM1_gds * delvds;
|
- here->HSM1_gigidlgs * delvgd - here->HSM1_gigidlbs * delvbd
|
||||||
Ibtot = here->HSM1_ibs + here->HSM1_ibd - here->HSM1_isub;
|
+ here->HSM1_gigidlds * delvds ;
|
||||||
|
Ibtot = here->HSM1_ibs + here->HSM1_ibd - here->HSM1_isub
|
||||||
|
- here->HSM1_igidl - here->HSM1_igisl;
|
||||||
cbhat = Ibtot + here->HSM1_gbs * delvbs
|
cbhat = Ibtot + here->HSM1_gbs * delvbs
|
||||||
+ (here->HSM1_gbd - here->HSM1_gbbs) * delvbd
|
+ (here->HSM1_gbd - here->HSM1_gbbs - here->HSM1_gigidlbs) * delvbd
|
||||||
- here->HSM1_gbgs * delvgd
|
- (here->HSM1_gbgs + here->HSM1_gigidlgs) * delvgd
|
||||||
+ here->HSM1_gbds * delvds;
|
+ (here->HSM1_gbds + here->HSM1_gigidlds) * delvds
|
||||||
|
- here->HSM1_gigislgd * delvgd - here->HSM1_gigislbd * delvbd
|
||||||
|
+ here->HSM1_gigislsd * delvds;
|
||||||
|
Igbtot = here->HSM1_igb;
|
||||||
|
cgbhat = Igbtot + here->HSM1_gigbg * delvgd
|
||||||
|
- here->HSM1_gigbs * delvds + here->HSM1_gigbb * delvbd;
|
||||||
|
Igstot = here->HSM1_igs;
|
||||||
|
cgshat = Igstot + here->HSM1_gigsg * delvgd
|
||||||
|
- here->HSM1_gigss * delvds + here->HSM1_gigsb * delvbd;
|
||||||
|
Igdtot = here->HSM1_igd;
|
||||||
|
cgdhat = Igdtot + here->HSM1_gigdg * delvgd
|
||||||
|
- here->HSM1_gigds * delvds + here->HSM1_gigdb * delvbd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vds_pre = vds;
|
||||||
|
|
||||||
#ifndef NOBYPASS /* BSIM3 style */
|
#ifndef NOBYPASS /* BSIM3 style */
|
||||||
/* now lets see if we can bypass (ugh) */
|
/* now lets see if we can bypass (ugh) */
|
||||||
|
|
||||||
|
|
@ -272,7 +346,16 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
ckt->CKTvoltTol ) )
|
ckt->CKTvoltTol ) )
|
||||||
if ( fabs(cdhat - Idtot) <
|
if ( fabs(cdhat - Idtot) <
|
||||||
( ckt->CKTreltol *
|
( ckt->CKTreltol *
|
||||||
MAX(fabs(cdhat),fabs(Idtot)) + ckt->CKTabstol ) ) {
|
MAX(fabs(cdhat),fabs(Idtot)) + ckt->CKTabstol ) )
|
||||||
|
if (!model->HSM1_coiigs ||
|
||||||
|
(fabs(cgbhat - Igbtot) < ckt->CKTreltol
|
||||||
|
* MAX(fabs(cgbhat), fabs(Igbtot)) + ckt->CKTabstol))
|
||||||
|
if (!model->HSM1_coiigs ||
|
||||||
|
(fabs(cgshat - Igstot) < ckt->CKTreltol
|
||||||
|
* MAX(fabs(cgshat), fabs(Igstot)) + ckt->CKTabstol))
|
||||||
|
if (!model->HSM1_coiigs ||
|
||||||
|
(fabs(cgdhat - Igdtot) < ckt->CKTreltol
|
||||||
|
* MAX(fabs(cgdhat), fabs(Igdtot)) + ckt->CKTabstol)){
|
||||||
tempv = MAX(fabs(cbhat),fabs(Ibtot)) + ckt->CKTabstol;
|
tempv = MAX(fabs(cbhat),fabs(Ibtot)) + ckt->CKTabstol;
|
||||||
if ((fabs(cbhat - Ibtot)) < ckt->CKTreltol * tempv) {
|
if ((fabs(cbhat - Ibtot)) < ckt->CKTreltol * tempv) {
|
||||||
/* bypass code */
|
/* bypass code */
|
||||||
|
|
@ -335,7 +418,7 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
vgb = vgs - vbs;
|
vgb = vgs - vbs;
|
||||||
|
|
||||||
/* Input data for HiSIM evaluation part */
|
/* Input data for HiSIM evaluation part */
|
||||||
sIN.gmin = ckt->CKTgmin; /* minimal conductance */
|
sIN.gmin = ckt->CKTgmin; /* minimum conductance */
|
||||||
|
|
||||||
if (vds >= 0) { /* normal mode */
|
if (vds >= 0) { /* normal mode */
|
||||||
here->HSM1_mode = 1;
|
here->HSM1_mode = 1;
|
||||||
|
|
@ -343,7 +426,7 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
sIN.vgs = vgs;
|
sIN.vgs = vgs;
|
||||||
sIN.vbs = vbs;
|
sIN.vbs = vbs;
|
||||||
}
|
}
|
||||||
else { /* inverse mode */
|
else { /* reverse mode */
|
||||||
here->HSM1_mode = -1;
|
here->HSM1_mode = -1;
|
||||||
sIN.vds = -vds;
|
sIN.vds = -vds;
|
||||||
sIN.vgs = vgd;
|
sIN.vgs = vgd;
|
||||||
|
|
@ -372,13 +455,14 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
if ( here->HSM1_dtemp_Given ) sIN.temp = ckt->CKTtemp + here->HSM1_dtemp;
|
if ( here->HSM1_dtemp_Given ) sIN.temp = ckt->CKTtemp + here->HSM1_dtemp;
|
||||||
|
|
||||||
sIN.tox = model->HSM1_tox;
|
sIN.tox = model->HSM1_tox;
|
||||||
sIN.xld = model->HSM1_dl;
|
sIN.xld = model->HSM1_xld;
|
||||||
sIN.xwd = model->HSM1_dw;
|
sIN.xwd = model->HSM1_xwd;
|
||||||
|
|
||||||
if (model->HSM1_version == 100) { /* HiSIM 1.0.0 */
|
if (model->HSM1_version == 102) { /* HiSIM 1.0.2 */
|
||||||
sIN.xj = model->HSM1_xj;
|
sIN.xj = model->HSM1_xj;
|
||||||
}
|
}
|
||||||
else if (model->HSM1_version == 110) { /* HiSIM 1.1.0 */
|
else if (model->HSM1_version == 112 ||
|
||||||
|
model->HSM1_version == 120) { /* HiSIM 1.1.2 / 1.2.0 */
|
||||||
sIN.xqy = model->HSM1_xqy;
|
sIN.xqy = model->HSM1_xqy;
|
||||||
}
|
}
|
||||||
sIN.vmax = model->HSM1_vmax;
|
sIN.vmax = model->HSM1_vmax;
|
||||||
|
|
@ -413,7 +497,8 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
sIN.muesr1 = model->HSM1_muesr1;
|
sIN.muesr1 = model->HSM1_muesr1;
|
||||||
sIN.muesr0 = model->HSM1_muesr0;
|
sIN.muesr0 = model->HSM1_muesr0;
|
||||||
sIN.muetmp = model->HSM1_muetmp;
|
sIN.muetmp = model->HSM1_muetmp;
|
||||||
if (model->HSM1_version == 110) { /* HiSIM 1.1.0 */
|
if (model->HSM1_version == 112 ||
|
||||||
|
model->HSM1_version == 120) { /* HiSIM 1.1.2 / 1.2.0 */
|
||||||
sIN.wvthsc = model->HSM1_wvthsc;
|
sIN.wvthsc = model->HSM1_wvthsc;
|
||||||
sIN.nsti = model->HSM1_nsti;
|
sIN.nsti = model->HSM1_nsti;
|
||||||
sIN.wsti = model->HSM1_wsti;
|
sIN.wsti = model->HSM1_wsti;
|
||||||
|
|
@ -424,9 +509,6 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
if ( model->HSM1_type == NMOS ) sIN.bb = 2.0e0;
|
if ( model->HSM1_type == NMOS ) sIN.bb = 2.0e0;
|
||||||
else sIN.bb = 1.0e0;
|
else sIN.bb = 1.0e0;
|
||||||
|
|
||||||
sIN.vds0 = model->HSM1_vds0;
|
|
||||||
sIN.bc0 = model->HSM1_bc0;
|
|
||||||
sIN.bc1 = model->HSM1_bc1;
|
|
||||||
sIN.sub1 = model->HSM1_sub1;
|
sIN.sub1 = model->HSM1_sub1;
|
||||||
sIN.sub2 = model->HSM1_sub2;
|
sIN.sub2 = model->HSM1_sub2;
|
||||||
sIN.sub3 = model->HSM1_sub3;
|
sIN.sub3 = model->HSM1_sub3;
|
||||||
|
|
@ -474,7 +556,8 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
sIN.clm3 = model->HSM1_clm3;
|
sIN.clm3 = model->HSM1_clm3;
|
||||||
sIN.rpock1 = model->HSM1_rpock1;
|
sIN.rpock1 = model->HSM1_rpock1;
|
||||||
sIN.rpock2 = model->HSM1_rpock2;
|
sIN.rpock2 = model->HSM1_rpock2;
|
||||||
if (model->HSM1_version == 110) { /* HiSIM 1.1.0 */
|
if (model->HSM1_version == 112 ||
|
||||||
|
model->HSM1_version == 120) { /* HiSIM 1.1.2 / 1.2.0 */
|
||||||
sIN.rpocp1 = model->HSM1_rpocp1;
|
sIN.rpocp1 = model->HSM1_rpocp1;
|
||||||
sIN.rpocp2 = model->HSM1_rpocp2;
|
sIN.rpocp2 = model->HSM1_rpocp2;
|
||||||
}
|
}
|
||||||
|
|
@ -519,11 +602,23 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
sIN.coisub = model->HSM1_coisub;
|
sIN.coisub = model->HSM1_coisub;
|
||||||
sIN.coiigs = model->HSM1_coiigs;
|
sIN.coiigs = model->HSM1_coiigs;
|
||||||
sIN.cogidl = model->HSM1_cogidl;
|
sIN.cogidl = model->HSM1_cogidl;
|
||||||
|
sIN.cogisl = model->HSM1_cogisl;
|
||||||
sIN.coovlp = model->HSM1_coovlp;
|
sIN.coovlp = model->HSM1_coovlp;
|
||||||
sIN.conois = model->HSM1_conois;
|
sIN.conois = model->HSM1_conois;
|
||||||
if (model->HSM1_version == 110) { /* HiSIM 1.1.0 */
|
if (model->HSM1_version == 112 ||
|
||||||
|
model->HSM1_version == 120) { /* HiSIM 1.1.2 / 1.2.0 */
|
||||||
sIN.coisti = model->HSM1_coisti;
|
sIN.coisti = model->HSM1_coisti;
|
||||||
}
|
}
|
||||||
|
if (model->HSM1_version == 120) { /* HiSIM 1.2.0 */
|
||||||
|
sIN.cosmbi = model->HSM1_cosmbi;
|
||||||
|
sIN.glpart1 = model->HSM1_glpart1;
|
||||||
|
sIN.glpart2 = model->HSM1_glpart2;
|
||||||
|
sIN.kappa = model->HSM1_kappa;
|
||||||
|
sIN.xdiffd = model->HSM1_xdiffd;
|
||||||
|
sIN.pthrou = model->HSM1_pthrou;
|
||||||
|
sIN.vdiffj = model->HSM1_vdiffj;
|
||||||
|
}
|
||||||
|
sIN.version = model->HSM1_version ;
|
||||||
|
|
||||||
sIN.vbsc_prv = here->HSM1_vbsc_prv;
|
sIN.vbsc_prv = here->HSM1_vbsc_prv;
|
||||||
sIN.vdsc_prv = here->HSM1_vdsc_prv;
|
sIN.vdsc_prv = here->HSM1_vdsc_prv;
|
||||||
|
|
@ -565,21 +660,27 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
printf( "coisub = %s\n" , (sIN.coisub) ? "true" : "false" ) ;
|
printf( "coisub = %s\n" , (sIN.coisub) ? "true" : "false" ) ;
|
||||||
printf( "coiigs = %s\n" , (sIN.coiigs) ? "true" : "false" ) ;
|
printf( "coiigs = %s\n" , (sIN.coiigs) ? "true" : "false" ) ;
|
||||||
printf( "cogidl = %s\n" , (sIN.cogidl) ? "true" : "false" ) ;
|
printf( "cogidl = %s\n" , (sIN.cogidl) ? "true" : "false" ) ;
|
||||||
|
printf( "cogisl = %s\n" , (sIN.cogisl) ? "true" : "false" ) ;
|
||||||
printf( "coovlp = %s\n" , (sIN.coovlp) ? "true" : "false" ) ;
|
printf( "coovlp = %s\n" , (sIN.coovlp) ? "true" : "false" ) ;
|
||||||
printf( "conois = %s\n" , (sIN.conois) ? "true" : "false" ) ;
|
printf( "conois = %s\n" , (sIN.conois) ? "true" : "false" ) ;
|
||||||
if (model->HSM1_version == 110) { /* HiSIM 1.1.0 */
|
if (model->HSM1_version == 112 ||
|
||||||
|
model->HSM1_version == 120) { /* HiSIM 1.1.2 / 1.2.0 */
|
||||||
printf( "coisti = %s\n" , (sIN.coisti) ? "true" : "false" ) ;
|
printf( "coisti = %s\n" , (sIN.coisti) ? "true" : "false" ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* print inputs ------------AA */
|
/* print inputs ------------AA */
|
||||||
|
|
||||||
/* call model evaluation */
|
/* call model evaluation */
|
||||||
if (model->HSM1_version == 100) { /* HiSIM 1.0.0 */
|
if (model->HSM1_version == 102) { /* HiSIM 1.0.2 */
|
||||||
if ( HSM1evaluate1_0(sIN, &sOT, &sMS) == HiSIM_ERROR )
|
if ( HSM1evaluate102(sIN, &sOT, &sMS) == HiSIM_ERROR )
|
||||||
return (HiSIM_ERROR);
|
return (HiSIM_ERROR);
|
||||||
}
|
}
|
||||||
else if (model->HSM1_version == 110) { /* HiSIM 1.1.0 */
|
else if (model->HSM1_version == 112) { /* HiSIM 1.1.2 */
|
||||||
if ( HSM1evaluate1_1(sIN, &sOT, &sMS) == HiSIM_ERROR )
|
if ( HSM1evaluate112(sIN, &sOT, &sMS) == HiSIM_ERROR )
|
||||||
|
return (HiSIM_ERROR);
|
||||||
|
}
|
||||||
|
else if (model->HSM1_version == 120) { /* HiSIM 1.2.0 */
|
||||||
|
if ( HSM1evaluate120(sIN, &sOT, &sMS) == HiSIM_ERROR )
|
||||||
return (HiSIM_ERROR);
|
return (HiSIM_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -625,16 +726,6 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
here->HSM1_cgdo = sOT.cgdo ; /* G-D */
|
here->HSM1_cgdo = sOT.cgdo ; /* G-D */
|
||||||
here->HSM1_cgbo = sOT.cgbo ; /* G-B */
|
here->HSM1_cgbo = sOT.cgbo ; /* G-B */
|
||||||
|
|
||||||
/* capop */
|
|
||||||
/* pslot->capop = 13 ; capacitor selector ???
|
|
||||||
* no use in SPICE3f5 */
|
|
||||||
|
|
||||||
/* Meyer's capacitances */
|
|
||||||
/*
|
|
||||||
here->HSM1_capgs = sOT.capgs ;
|
|
||||||
here->HSM1_capgd = sOT.capgd ;
|
|
||||||
here->HSM1_capgb = sOT.capgb ; may be not necessary */
|
|
||||||
|
|
||||||
/* intrinsic charge ONLY */
|
/* intrinsic charge ONLY */
|
||||||
qgate = here->HSM1_qg = sOT.qg ; /* gate */
|
qgate = here->HSM1_qg = sOT.qg ; /* gate */
|
||||||
qdrn = here->HSM1_qd = sOT.qd ; /* drain */
|
qdrn = here->HSM1_qd = sOT.qd ; /* drain */
|
||||||
|
|
@ -677,6 +768,72 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
|
|
||||||
/* mobility added by K.M. */
|
/* mobility added by K.M. */
|
||||||
here->HSM1_mu = sOT.mu;
|
here->HSM1_mu = sOT.mu;
|
||||||
|
/* gate induced drain leakage */
|
||||||
|
here->HSM1_igidl = sOT.igidl;
|
||||||
|
here->HSM1_gigidlgs = sOT.ggidlgs;
|
||||||
|
here->HSM1_gigidlds = sOT.ggidlds;
|
||||||
|
here->HSM1_gigidlbs = sOT.ggidlbs;
|
||||||
|
if (model->HSM1_version == 120) { /* HiSIM 1.2.0 */
|
||||||
|
/* gate induced source leakage */
|
||||||
|
here->HSM1_igisl = sOT.igisl;
|
||||||
|
here->HSM1_gigislgd = sOT.ggislgd;
|
||||||
|
here->HSM1_gigislsd = sOT.ggislsd;
|
||||||
|
here->HSM1_gigislbd = sOT.ggislbd;
|
||||||
|
|
||||||
|
/* gate tunneling current (gate to bulk) */
|
||||||
|
here->HSM1_igb = sOT.igateb;
|
||||||
|
here->HSM1_gigbg = sOT.ggbgs;
|
||||||
|
here->HSM1_gigbd = sOT.ggbds;
|
||||||
|
here->HSM1_gigbb = sOT.ggbbs;
|
||||||
|
here->HSM1_gigbs = -( here->HSM1_gigbg + here->HSM1_gigbd
|
||||||
|
+ here->HSM1_gigbb );
|
||||||
|
/* gate tunneling current (gate to source) */
|
||||||
|
here->HSM1_igs = sOT.igates;
|
||||||
|
here->HSM1_gigsg = sOT.ggsgs;
|
||||||
|
here->HSM1_gigsd = sOT.ggsds;
|
||||||
|
here->HSM1_gigsb = sOT.ggsbs;
|
||||||
|
here->HSM1_gigss = -( here->HSM1_gigsg + here->HSM1_gigsd
|
||||||
|
+ here->HSM1_gigsb );
|
||||||
|
/* gate tunneling current (gate to drain) */
|
||||||
|
here->HSM1_igd = sOT.igated;
|
||||||
|
here->HSM1_gigdg = sOT.ggdgs;
|
||||||
|
here->HSM1_gigdd = sOT.ggdds;
|
||||||
|
here->HSM1_gigdb = sOT.ggdbs;
|
||||||
|
here->HSM1_gigds = -( here->HSM1_gigdg + here->HSM1_gigdd
|
||||||
|
+ here->HSM1_gigdb );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* gate induced source leakage */
|
||||||
|
here->HSM1_igisl = 0.0;
|
||||||
|
here->HSM1_gigislgd = 0.0;
|
||||||
|
here->HSM1_gigislsd = 0.0;
|
||||||
|
here->HSM1_gigislbd = 0.0;
|
||||||
|
|
||||||
|
/* gate tunneling current (gate to bulk) */
|
||||||
|
here->HSM1_igb = sOT.igate;
|
||||||
|
here->HSM1_gigbg = sOT.gggs;
|
||||||
|
here->HSM1_gigbd = sOT.ggds;
|
||||||
|
here->HSM1_gigbb = sOT.ggbs;
|
||||||
|
here->HSM1_gigbs = -( here->HSM1_gigbg + here->HSM1_gigbd
|
||||||
|
+ here->HSM1_gigbb );
|
||||||
|
/* gate tunneling current (gate to source) */
|
||||||
|
here->HSM1_igs = 0.0;
|
||||||
|
here->HSM1_gigsg = 0.0;
|
||||||
|
here->HSM1_gigsd = 0.0;
|
||||||
|
here->HSM1_gigsb = 0.0;
|
||||||
|
here->HSM1_gigss = 0.0;
|
||||||
|
/* gate tunneling current (gate to drain) */
|
||||||
|
here->HSM1_igd = 0.0;
|
||||||
|
here->HSM1_gigdg = 0.0;
|
||||||
|
here->HSM1_gigdd = 0.0;
|
||||||
|
here->HSM1_gigdb = 0.0;
|
||||||
|
here->HSM1_gigds = 0.0;
|
||||||
|
}
|
||||||
|
/* intrinsic charges without overlap charge etc. */
|
||||||
|
here->HSM1_qg_int = sOT.qg_int;
|
||||||
|
here->HSM1_qd_int = sOT.qd_int;
|
||||||
|
here->HSM1_qs_int = sOT.qs_int;
|
||||||
|
here->HSM1_qb_int = sOT.qb_int;
|
||||||
|
|
||||||
/* print all outputs ------------VV */
|
/* print all outputs ------------VV */
|
||||||
if ( sIN.info >= 4 ) {
|
if ( sIN.info >= 4 ) {
|
||||||
|
|
@ -694,10 +851,6 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
|
|
||||||
printf( "cgbo = %12.5e\n" , sOT.cgbo ) ;
|
printf( "cgbo = %12.5e\n" , sOT.cgbo ) ;
|
||||||
|
|
||||||
printf( "capgs = %12.5e\n" , sOT.capgs ) ;
|
|
||||||
printf( "capgd = %12.5e\n" , sOT.capgd ) ;
|
|
||||||
printf( "capgb = %12.5e\n" , sOT.capgb ) ;
|
|
||||||
|
|
||||||
printf( "qg = %12.5e\n" , sOT.qg ) ;
|
printf( "qg = %12.5e\n" , sOT.qg ) ;
|
||||||
printf( "qd = %12.5e\n" , sOT.qd ) ;
|
printf( "qd = %12.5e\n" , sOT.qd ) ;
|
||||||
printf( "qs = %12.5e\n" , sOT.qs ) ;
|
printf( "qs = %12.5e\n" , sOT.qs ) ;
|
||||||
|
|
@ -749,19 +902,77 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
/*
|
/*
|
||||||
* check convergence
|
* check convergence
|
||||||
*/
|
*/
|
||||||
|
isConv = 1;
|
||||||
if ( (here->HSM1_off == 0) || !(ckt->CKTmode & MODEINITFIX) ) {
|
if ( (here->HSM1_off == 0) || !(ckt->CKTmode & MODEINITFIX) ) {
|
||||||
if (Check == 1) {
|
if (Check == 1) {
|
||||||
ckt->CKTnoncon++;
|
ckt->CKTnoncon++;
|
||||||
|
isConv = 0;
|
||||||
|
}
|
||||||
|
#ifndef NEWCONV
|
||||||
|
//DW }
|
||||||
|
else {
|
||||||
|
if (here->HSM1_mode >= 0)
|
||||||
|
Idtot = here->HSM1_ids + here->HSM1_isub
|
||||||
|
- here->HSM1_ibd + here->HSM1_igidl;
|
||||||
|
else
|
||||||
|
Idtot = here->HSM1_ids + here->HSM1_ibd
|
||||||
|
- here->HSM1_igidl;
|
||||||
|
tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot))
|
||||||
|
+ ckt->CKTabstol;
|
||||||
|
tol2 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot))
|
||||||
|
+ ckt->CKTabstol;
|
||||||
|
tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot))
|
||||||
|
+ ckt->CKTabstol;
|
||||||
|
tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot))
|
||||||
|
+ ckt->CKTabstol;
|
||||||
|
if (fabs(cdhat - Idtot) >= tol) {
|
||||||
|
ckt->CKTnoncon++;
|
||||||
|
isConv = 0;
|
||||||
|
}
|
||||||
|
else if (fabs(cgbhat - Igbtot) >= tol2 ||
|
||||||
|
fabs(cgshat - Igstot) >= tol3 ||
|
||||||
|
fabs(cgdhat - Igdtot) >= tol4) {
|
||||||
|
ckt->CKTnoncon++;
|
||||||
|
isConv = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Ibtot = here->HSM1_ibs + here->HSM1_ibd
|
||||||
|
- here->HSM1_isub - here->HSM1_igidl - here->HSM1_igisl;
|
||||||
|
tol = ckt->CKTreltol *
|
||||||
|
MAX(fabs(cbhat), fabs(Ibtot)) + ckt->CKTabstol;
|
||||||
|
if (fabs(cbhat - Ibtot) > tol) {
|
||||||
|
ckt->CKTnoncon++;
|
||||||
|
isConv = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
#endif /* NEWCONV */
|
||||||
|
}
|
||||||
|
//DW }
|
||||||
*(ckt->CKTstate0 + here->HSM1vbs) = vbs;
|
*(ckt->CKTstate0 + here->HSM1vbs) = vbs;
|
||||||
*(ckt->CKTstate0 + here->HSM1vbd) = vbd;
|
*(ckt->CKTstate0 + here->HSM1vbd) = vbd;
|
||||||
*(ckt->CKTstate0 + here->HSM1vgs) = vgs;
|
*(ckt->CKTstate0 + here->HSM1vgs) = vgs;
|
||||||
*(ckt->CKTstate0 + here->HSM1vds) = vds;
|
*(ckt->CKTstate0 + here->HSM1vds) = vds;
|
||||||
|
|
||||||
if (model->HSM1_show_Given && showPhysVal) {
|
if ((ckt->CKTmode & MODEDC) &&
|
||||||
|
!(ckt->CKTmode & MODEINITFIX) && !(ckt->CKTmode & MODEINITJCT))
|
||||||
|
showPhysVal = 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
if ((ckt->CKTmode & MODEDC) && !(ckt->CKTmode & MODEINITFIX) &&
|
||||||
|
!(ckt->CKTmode & MODEINITJCT)) {
|
||||||
|
if ((!(ckt->CKTmode & MODEINITPRED) && vds != vds_pre) ||
|
||||||
|
((ckt->CKTmode & MODEINITPRED) && vds == vds_pre))
|
||||||
|
showPhysVal = 1;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (model->HSM1_show_Given && showPhysVal && isConv) {
|
||||||
static int isFirst = 1;
|
static int isFirst = 1;
|
||||||
ShowPhysVals(here, model->HSM1_show, isFirst, vds, vgs, vbs);
|
if (vds != vds_pre)
|
||||||
|
ShowPhysVals(here, model, isFirst, vds_pre, vgs, vbs, vgd, vbd, vgb);
|
||||||
|
else
|
||||||
|
ShowPhysVals(here, model, isFirst, vds, vgs, vbs, vgd, vbd, vgb);
|
||||||
if (isFirst) isFirst = 0;
|
if (isFirst) isFirst = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -775,7 +986,7 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
cgbo = here->HSM1_cgbo;
|
cgbo = here->HSM1_cgbo;
|
||||||
|
|
||||||
ag0 = ckt->CKTag[0];
|
ag0 = ckt->CKTag[0];
|
||||||
if (here->HSM1_mode > 0) { /* NORAMAL mode */
|
if (here->HSM1_mode > 0) { /* NORMAL mode */
|
||||||
gcggb = (here->HSM1_cggb + cgdo + cgso + cgbo ) * ag0;
|
gcggb = (here->HSM1_cggb + cgdo + cgso + cgbo ) * ag0;
|
||||||
gcgdb = (here->HSM1_cgdb - cgdo) * ag0;
|
gcgdb = (here->HSM1_cgdb - cgdo) * ag0;
|
||||||
gcgsb = (here->HSM1_cgsb - cgso) * ag0;
|
gcgsb = (here->HSM1_cgsb - cgso) * ag0;
|
||||||
|
|
@ -919,11 +1130,17 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
RevSum = 0.0;
|
RevSum = 0.0;
|
||||||
|
|
||||||
cdreq = model->HSM1_type *
|
cdreq = model->HSM1_type *
|
||||||
(cdrain - here->HSM1_gds * vds - gm * vgs - gmbs * vbs);
|
(cdrain - here->HSM1_gds * vds - here->HSM1_gm * vgs - here->HSM1_gmbs * vbs);
|
||||||
ceqbd = -model->HSM1_type *
|
ceqbd = -model->HSM1_type *
|
||||||
(here->HSM1_isub - here->HSM1_gbds * vds - here->HSM1_gbgs * vgs
|
(here->HSM1_isub + here->HSM1_igidl
|
||||||
- here->HSM1_gbbs * vbs);
|
- (here->HSM1_gbds + here->HSM1_gigidlds) * vds
|
||||||
ceqbs = 0.0;
|
- (here->HSM1_gbgs + here->HSM1_gigidlgs) * vgs
|
||||||
|
- (here->HSM1_gbbs + here->HSM1_gigidlbs) * vbs);
|
||||||
|
ceqbs = -model->HSM1_type *
|
||||||
|
(here->HSM1_igisl
|
||||||
|
+ here->HSM1_gigislsd * vds
|
||||||
|
- here->HSM1_gigislgd * vgd
|
||||||
|
- here->HSM1_gigislbd * vbd);
|
||||||
|
|
||||||
gbbdp = -here->HSM1_gbds;
|
gbbdp = -here->HSM1_gbds;
|
||||||
gbbsp = here->HSM1_gbds + here->HSM1_gbgs + here->HSM1_gbbs;
|
gbbsp = here->HSM1_gbds + here->HSM1_gbgs + here->HSM1_gbbs;
|
||||||
|
|
@ -937,6 +1154,48 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
gbspdp = 0.0;
|
gbspdp = 0.0;
|
||||||
gbspb = 0.0;
|
gbspb = 0.0;
|
||||||
gbspsp = 0.0;
|
gbspsp = 0.0;
|
||||||
|
|
||||||
|
if (model->HSM1_coiigs) {
|
||||||
|
gIbtotg = here->HSM1_gigbg;
|
||||||
|
gIbtotd = here->HSM1_gigbd;
|
||||||
|
gIbtots = here->HSM1_gigbs;
|
||||||
|
gIbtotb = here->HSM1_gigbb;
|
||||||
|
Ibtoteq = model->HSM1_type *
|
||||||
|
(here->HSM1_igb - here->HSM1_gigbg * vgs
|
||||||
|
- here->HSM1_gigbd * vds - here->HSM1_gigbb * vbs);
|
||||||
|
|
||||||
|
gIstotg = here->HSM1_gigsg;
|
||||||
|
gIstotd = here->HSM1_gigsd;
|
||||||
|
gIstots = here->HSM1_gigss;
|
||||||
|
gIstotb = here->HSM1_gigsb;
|
||||||
|
Istoteq = model->HSM1_type *
|
||||||
|
(here->HSM1_igs - here->HSM1_gigsg * vgs
|
||||||
|
- here->HSM1_gigsd * vds - here->HSM1_gigsb * vbs);
|
||||||
|
|
||||||
|
gIdtotg = here->HSM1_gigdg;
|
||||||
|
gIdtotd = here->HSM1_gigdd;
|
||||||
|
gIdtots = here->HSM1_gigds;
|
||||||
|
gIdtotb = here->HSM1_gigdb;
|
||||||
|
Idtoteq = model->HSM1_type *
|
||||||
|
(here->HSM1_igd - here->HSM1_gigdg * vgs
|
||||||
|
- here->HSM1_gigdd * vds - here->HSM1_gigdb * vbs);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0;
|
||||||
|
gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0;
|
||||||
|
gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (model->HSM1_coiigs) {
|
||||||
|
gIgtotg = gIbtotg + gIstotg + gIdtotg;
|
||||||
|
gIgtotd = gIbtotd + gIstotd + gIdtotd;
|
||||||
|
gIgtots = gIbtots + gIstots + gIdtots;
|
||||||
|
gIgtotb = gIbtotb + gIstotb + gIdtotb;
|
||||||
|
Igtoteq = Ibtoteq + Istoteq + Idtoteq;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0;
|
||||||
|
|
||||||
}
|
}
|
||||||
else { /* REVERSE mode */
|
else { /* REVERSE mode */
|
||||||
gm = -here->HSM1_gm;
|
gm = -here->HSM1_gm;
|
||||||
|
|
@ -945,11 +1204,18 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
RevSum = -(gm + gmbs);
|
RevSum = -(gm + gmbs);
|
||||||
|
|
||||||
cdreq = -model->HSM1_type *
|
cdreq = -model->HSM1_type *
|
||||||
(cdrain + here->HSM1_gds * vds + gm * vgd + gmbs * vbd);
|
(cdrain + here->HSM1_gds * vds
|
||||||
|
- here->HSM1_gm * vgd - here->HSM1_gmbs * vbd);
|
||||||
ceqbs = -model->HSM1_type *
|
ceqbs = -model->HSM1_type *
|
||||||
(here->HSM1_isub + here->HSM1_gbds * vds - here->HSM1_gbgs * vgd
|
(here->HSM1_isub + here->HSM1_igisl
|
||||||
- here->HSM1_gbbs * vbd);
|
+ (here->HSM1_gbds + here->HSM1_gigislsd) * vds
|
||||||
ceqbd = 0.0;
|
- (here->HSM1_gbgs + here->HSM1_gigislgd) * vgd
|
||||||
|
- (here->HSM1_gbbs + here->HSM1_gigislbd) * vbd);
|
||||||
|
ceqbd = -model->HSM1_type *
|
||||||
|
( here->HSM1_igidl
|
||||||
|
- here->HSM1_gigidlds * vds
|
||||||
|
- here->HSM1_gigidlgs * vgs
|
||||||
|
- here->HSM1_gigidlbs * vbs);
|
||||||
|
|
||||||
gbbsp = -here->HSM1_gbds;
|
gbbsp = -here->HSM1_gbds;
|
||||||
gbbdp = here->HSM1_gbds + here->HSM1_gbgs + here->HSM1_gbbs;
|
gbbdp = here->HSM1_gbds + here->HSM1_gbgs + here->HSM1_gbbs;
|
||||||
|
|
@ -963,6 +1229,47 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
gbspsp = here->HSM1_gbds;
|
gbspsp = here->HSM1_gbds;
|
||||||
gbspb = here->HSM1_gbbs;
|
gbspb = here->HSM1_gbbs;
|
||||||
gbspdp = -(gbspg + gbspsp + gbspb);
|
gbspdp = -(gbspg + gbspsp + gbspb);
|
||||||
|
|
||||||
|
if (model->HSM1_coiigs) {
|
||||||
|
gIbtotg = here->HSM1_gigbg;
|
||||||
|
gIbtotd = here->HSM1_gigbd;
|
||||||
|
gIbtots = here->HSM1_gigbs;
|
||||||
|
gIbtotb = here->HSM1_gigbb;
|
||||||
|
Ibtoteq = model->HSM1_type *
|
||||||
|
(here->HSM1_igb - here->HSM1_gigbg * vgd
|
||||||
|
+ here->HSM1_gigbs * vds - here->HSM1_gigbb * vbd);
|
||||||
|
|
||||||
|
gIstotg = here->HSM1_gigsg;
|
||||||
|
gIstotd = here->HSM1_gigsd;
|
||||||
|
gIstots = here->HSM1_gigss;
|
||||||
|
gIstotb = here->HSM1_gigsb;
|
||||||
|
Istoteq = model->HSM1_type *
|
||||||
|
(here->HSM1_igs - here->HSM1_gigsg * vgd
|
||||||
|
+ here->HSM1_gigss * vds - here->HSM1_gigsb * vbd);
|
||||||
|
gIdtotg = here->HSM1_gigdg;
|
||||||
|
gIdtotd = here->HSM1_gigdd;
|
||||||
|
gIdtots = here->HSM1_gigds;
|
||||||
|
gIdtotb = here->HSM1_gigdb;
|
||||||
|
Idtoteq = model->HSM1_type *
|
||||||
|
(here->HSM1_igd - here->HSM1_gigdg * vgd
|
||||||
|
+ here->HSM1_gigds * vds - here->HSM1_gigdb * vbd);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gIbtotg = gIbtotd = gIbtots = gIbtotb = Ibtoteq = 0.0;
|
||||||
|
gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0;
|
||||||
|
gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (model->HSM1_coiigs) {
|
||||||
|
gIgtotg = gIbtotg + gIstotg + gIdtotg;
|
||||||
|
gIgtotd = gIbtotd + gIstotd + gIdtotd;
|
||||||
|
gIgtots = gIbtots + gIstots + gIdtots;
|
||||||
|
gIgtotb = gIbtotb + gIstotb + gIdtotb;
|
||||||
|
Igtoteq = Ibtoteq + Istoteq + Idtoteq;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (model->HSM1_type > 0) {
|
if (model->HSM1_type > 0) {
|
||||||
|
|
@ -991,41 +1298,76 @@ int HSM1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
printf( "----------------------------------------------------\n" ) ;
|
printf( "----------------------------------------------------\n" ) ;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
*(ckt->CKTrhs + here->HSM1gNode) -= m * ceqqg;
|
*(ckt->CKTrhs + here->HSM1gNode) -= m * (ceqqg + Igtoteq);
|
||||||
*(ckt->CKTrhs + here->HSM1bNode) -= m * (ceqbs + ceqbd + ceqqb);
|
*(ckt->CKTrhs + here->HSM1bNode) -= m * (ceqbs + ceqbd + ceqqb - Ibtoteq);
|
||||||
*(ckt->CKTrhs + here->HSM1dNodePrime) += m * (ceqbd - cdreq - ceqqd);
|
*(ckt->CKTrhs + here->HSM1dNodePrime) += m * (ceqbd - cdreq - ceqqd + Idtoteq);
|
||||||
*(ckt->CKTrhs + here->HSM1sNodePrime) += m * (cdreq
|
*(ckt->CKTrhs + here->HSM1sNodePrime) += m * (cdreq + ceqbs + ceqqg + ceqqb + ceqqd + Istoteq);
|
||||||
+ ceqbs + ceqqg + ceqqb + ceqqd);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* load y matrix
|
* load y matrix
|
||||||
*/
|
*/
|
||||||
|
|
||||||
*(here->HSM1DdPtr) += m * here->HSM1drainConductance;
|
*(here->HSM1DdPtr) += m * here->HSM1drainConductance;
|
||||||
*(here->HSM1GgPtr) += m * gcggb;
|
*(here->HSM1GgPtr) += m * (gcggb + gIgtotg);
|
||||||
*(here->HSM1SsPtr) += m * here->HSM1sourceConductance;
|
*(here->HSM1SsPtr) += m * here->HSM1sourceConductance;
|
||||||
*(here->HSM1BbPtr) += m * (here->HSM1_gbd + here->HSM1_gbs
|
*(here->HSM1BbPtr) += m * (here->HSM1_gbd + here->HSM1_gbs
|
||||||
- gcbgb - gcbdb - gcbsb - here->HSM1_gbbs);
|
- gcbgb - gcbdb - gcbsb -
|
||||||
|
here->HSM1_gbbs - gIbtotb);
|
||||||
*(here->HSM1DPdpPtr) += m * (here->HSM1drainConductance
|
*(here->HSM1DPdpPtr) += m * (here->HSM1drainConductance
|
||||||
+ here->HSM1_gds + here->HSM1_gbd + RevSum + gcddb + gbdpdp);
|
+ here->HSM1_gds + here->HSM1_gbd
|
||||||
|
+ RevSum + gcddb + gbdpdp - gIdtotd);
|
||||||
*(here->HSM1SPspPtr) += m * (here->HSM1sourceConductance
|
*(here->HSM1SPspPtr) += m * (here->HSM1sourceConductance
|
||||||
+ here->HSM1_gds + here->HSM1_gbs + FwdSum + gcssb + gbspsp);
|
+ here->HSM1_gds + here->HSM1_gbs
|
||||||
|
+ FwdSum + gcssb + gbspsp - gIstots);
|
||||||
*(here->HSM1DdpPtr) -= m * here->HSM1drainConductance;
|
*(here->HSM1DdpPtr) -= m * here->HSM1drainConductance;
|
||||||
*(here->HSM1GbPtr) -= m * (gcggb + gcgdb + gcgsb);
|
*(here->HSM1GbPtr) -= m * (gcggb + gcgdb + gcgsb - gIgtotb);
|
||||||
*(here->HSM1GdpPtr) += m * gcgdb;
|
*(here->HSM1GdpPtr) += m * (gcgdb + gIgtotd);
|
||||||
*(here->HSM1GspPtr) += m * gcgsb;
|
*(here->HSM1GspPtr) += m * (gcgsb + gIgtots);
|
||||||
*(here->HSM1SspPtr) -= m * here->HSM1sourceConductance;
|
*(here->HSM1SspPtr) -= m * (here->HSM1sourceConductance);
|
||||||
*(here->HSM1BgPtr) += m * (gcbgb - here->HSM1_gbgs);
|
*(here->HSM1BgPtr) += m * (gcbgb - here->HSM1_gbgs - gIbtotg);
|
||||||
*(here->HSM1BdpPtr) += m * (gcbdb - here->HSM1_gbd + gbbdp);
|
*(here->HSM1BdpPtr) += m * (gcbdb - here->HSM1_gbd + gbbdp
|
||||||
*(here->HSM1BspPtr) += m * (gcbsb - here->HSM1_gbs + gbbsp);
|
- gIbtotd);
|
||||||
*(here->HSM1DPdPtr) -= m * here->HSM1drainConductance;
|
*(here->HSM1BspPtr) += m * (gcbsb - here->HSM1_gbs + gbbsp
|
||||||
*(here->HSM1DPgPtr) += m * (gm + gcdgb + gbdpg);
|
- gIbtots);
|
||||||
*(here->HSM1DPbPtr) -= m * (here->HSM1_gbd - gmbs + gcdgb + gcddb + gcdsb - gbdpb);
|
*(here->HSM1DPdPtr) -= m * (here->HSM1drainConductance);
|
||||||
*(here->HSM1DPspPtr) -= m * (here->HSM1_gds + FwdSum - gcdsb - gbdpsp);
|
*(here->HSM1DPgPtr) += m * (gm + gcdgb + gbdpg - gIdtotg);
|
||||||
*(here->HSM1SPgPtr) += m * (gcsgb - gm + gbspg);
|
*(here->HSM1DPbPtr) -= m * (here->HSM1_gbd - gmbs + gcdgb + gcddb
|
||||||
*(here->HSM1SPsPtr) -= m * here->HSM1sourceConductance;
|
+ gcdsb - gIdtotb);
|
||||||
*(here->HSM1SPbPtr) -= m * (here->HSM1_gbs + gmbs + gcsgb + gcsdb + gcssb - gbspb);
|
*(here->HSM1DPspPtr) -= m * (here->HSM1_gds + FwdSum - gcdsb - gbdpsp
|
||||||
*(here->HSM1SPdpPtr) -= m * (here->HSM1_gds + RevSum - gcsdb - gbspdp);
|
+ gIdtots);
|
||||||
|
*(here->HSM1SPgPtr) += m * (gcsgb - gm + gbspg - gIstotg);
|
||||||
|
*(here->HSM1SPsPtr) -= m * (here->HSM1sourceConductance);
|
||||||
|
*(here->HSM1SPbPtr) -= m * (here->HSM1_gbs + gmbs + gcsgb + gcsdb
|
||||||
|
+ gcssb - gbspb + gIstotb);
|
||||||
|
*(here->HSM1SPdpPtr) -= m * (here->HSM1_gds + RevSum - gcsdb - gbspdp
|
||||||
|
+ gIstotd);
|
||||||
|
|
||||||
|
/* stamp GIDL */
|
||||||
|
*(here->HSM1DPdpPtr) += m * here->HSM1_gigidlds;
|
||||||
|
*(here->HSM1DPgPtr) += m * here->HSM1_gigidlgs;
|
||||||
|
*(here->HSM1DPspPtr) -= m *(here->HSM1_gigidlgs
|
||||||
|
+ here->HSM1_gigidlds
|
||||||
|
+ here->HSM1_gigidlbs);
|
||||||
|
*(here->HSM1DPbPtr) += m * here->HSM1_gigidlbs;
|
||||||
|
*(here->HSM1BdpPtr) -= m * here->HSM1_gigidlds;
|
||||||
|
*(here->HSM1BgPtr) -= m * here->HSM1_gigidlgs;
|
||||||
|
*(here->HSM1BspPtr) += m * (here->HSM1_gigidlgs
|
||||||
|
+ here->HSM1_gigidlds
|
||||||
|
+ here->HSM1_gigidlbs);
|
||||||
|
*(here->HSM1BbPtr) -= m * here->HSM1_gigidlbs;
|
||||||
|
/* stamp GISL */
|
||||||
|
*(here->HSM1SPdpPtr) -= m * (here->HSM1_gigislsd
|
||||||
|
+ here->HSM1_gigislgd
|
||||||
|
+ here->HSM1_gigislbd);
|
||||||
|
*(here->HSM1SPgPtr) += m * here->HSM1_gigislgd;
|
||||||
|
*(here->HSM1SPspPtr) += m * here->HSM1_gigislsd;
|
||||||
|
*(here->HSM1SPbPtr) += m * here->HSM1_gigislbd;
|
||||||
|
*(here->HSM1BdpPtr) += m * (here->HSM1_gigislgd
|
||||||
|
+ here->HSM1_gigislsd
|
||||||
|
+ here->HSM1_gigislbd);
|
||||||
|
*(here->HSM1BgPtr) -= m * here->HSM1_gigislgd;
|
||||||
|
*(here->HSM1BspPtr) -= m * here->HSM1_gigislsd;
|
||||||
|
*(here->HSM1BbPtr) -= m * here->HSM1_gigislbd;
|
||||||
|
|
||||||
line1000:
|
line1000:
|
||||||
;
|
;
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,13 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1mask.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1mask.c of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "ifsim.h"
|
#include "ifsim.h"
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
|
|
@ -21,7 +16,8 @@
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
int HSM1mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
|
int
|
||||||
|
HSM1mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
|
||||||
{
|
{
|
||||||
HSM1model *model = (HSM1model *)inst;
|
HSM1model *model = (HSM1model *)inst;
|
||||||
switch (which) {
|
switch (which) {
|
||||||
|
|
@ -82,6 +78,9 @@ int HSM1mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
|
||||||
case HSM1_MOD_COGIDL:
|
case HSM1_MOD_COGIDL:
|
||||||
value->iValue = model->HSM1_cogidl;
|
value->iValue = model->HSM1_cogidl;
|
||||||
return(OK);
|
return(OK);
|
||||||
|
case HSM1_MOD_COGISL:
|
||||||
|
value->iValue = model->HSM1_cogisl;
|
||||||
|
return(OK);
|
||||||
case HSM1_MOD_COOVLP:
|
case HSM1_MOD_COOVLP:
|
||||||
value->iValue = model->HSM1_coovlp;
|
value->iValue = model->HSM1_coovlp;
|
||||||
return(OK);
|
return(OK);
|
||||||
|
|
@ -91,6 +90,9 @@ int HSM1mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
|
||||||
case HSM1_MOD_COISTI: /* HiSIM1.1 */
|
case HSM1_MOD_COISTI: /* HiSIM1.1 */
|
||||||
value->iValue = model->HSM1_coisti;
|
value->iValue = model->HSM1_coisti;
|
||||||
return(OK);
|
return(OK);
|
||||||
|
case HSM1_MOD_COSMBI: /* HiSIM1.2 */
|
||||||
|
value->iValue = model->HSM1_cosmbi;
|
||||||
|
return(OK);
|
||||||
case HSM1_MOD_VMAX:
|
case HSM1_MOD_VMAX:
|
||||||
value->rValue = model->HSM1_vmax;
|
value->rValue = model->HSM1_vmax;
|
||||||
return(OK);
|
return(OK);
|
||||||
|
|
@ -103,11 +105,11 @@ int HSM1mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
|
||||||
case HSM1_MOD_TOX:
|
case HSM1_MOD_TOX:
|
||||||
value->rValue = model->HSM1_tox;
|
value->rValue = model->HSM1_tox;
|
||||||
return(OK);
|
return(OK);
|
||||||
case HSM1_MOD_DL:
|
case HSM1_MOD_XLD:
|
||||||
value->rValue = model->HSM1_dl;
|
value->rValue = model->HSM1_xld;
|
||||||
return(OK);
|
return(OK);
|
||||||
case HSM1_MOD_DW:
|
case HSM1_MOD_XWD:
|
||||||
value->rValue = model->HSM1_dw;
|
value->rValue = model->HSM1_xwd;
|
||||||
return(OK);
|
return(OK);
|
||||||
case HSM1_MOD_XJ: /* HiSIM1.0 */
|
case HSM1_MOD_XJ: /* HiSIM1.0 */
|
||||||
value->rValue = model->HSM1_xj;
|
value->rValue = model->HSM1_xj;
|
||||||
|
|
@ -202,15 +204,6 @@ int HSM1mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
|
||||||
case HSM1_MOD_BB:
|
case HSM1_MOD_BB:
|
||||||
value->rValue = model->HSM1_bb;
|
value->rValue = model->HSM1_bb;
|
||||||
return(OK);
|
return(OK);
|
||||||
case HSM1_MOD_VDS0:
|
|
||||||
value->rValue = model->HSM1_vds0;
|
|
||||||
return(OK);
|
|
||||||
case HSM1_MOD_BC0:
|
|
||||||
value->rValue = model->HSM1_bc0;
|
|
||||||
return(OK);
|
|
||||||
case HSM1_MOD_BC1:
|
|
||||||
value->rValue = model->HSM1_bc1;
|
|
||||||
return(OK);
|
|
||||||
case HSM1_MOD_SUB1:
|
case HSM1_MOD_SUB1:
|
||||||
value->rValue = model->HSM1_sub1;
|
value->rValue = model->HSM1_sub1;
|
||||||
return(OK);
|
return(OK);
|
||||||
|
|
@ -361,6 +354,24 @@ int HSM1mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
|
||||||
case HSM1_MOD_CIT:
|
case HSM1_MOD_CIT:
|
||||||
value->rValue = model->HSM1_cit;
|
value->rValue = model->HSM1_cit;
|
||||||
return(OK);
|
return(OK);
|
||||||
|
case HSM1_MOD_GLPART1: /* HiSIM1.2 */
|
||||||
|
value->rValue = model->HSM1_glpart1;
|
||||||
|
return(OK);
|
||||||
|
case HSM1_MOD_GLPART2: /* HiSIM1.2 */
|
||||||
|
value->rValue = model->HSM1_glpart2;
|
||||||
|
return(OK);
|
||||||
|
case HSM1_MOD_KAPPA: /* HiSIM1.2 */
|
||||||
|
value->rValue = model->HSM1_kappa;
|
||||||
|
return(OK);
|
||||||
|
case HSM1_MOD_XDIFFD: /* HiSIM1.2 */
|
||||||
|
value->rValue = model->HSM1_xdiffd;
|
||||||
|
return(OK);
|
||||||
|
case HSM1_MOD_PTHROU: /* HiSIM1.2 */
|
||||||
|
value->rValue = model->HSM1_pthrou;
|
||||||
|
return(OK);
|
||||||
|
case HSM1_MOD_VDIFFJ: /* HiSIM1.2 */
|
||||||
|
value->rValue = model->HSM1_vdiffj;
|
||||||
|
return(OK);
|
||||||
case HSM1_MOD_KF:
|
case HSM1_MOD_KF:
|
||||||
value->rValue = model->HSM1_kf;
|
value->rValue = model->HSM1_kf;
|
||||||
return(OK);
|
return(OK);
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,20 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1mdel.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1mdel.c of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "hsm1def.h"
|
#include "hsm1def.h"
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
int HSM1mDelete(GENmodel **inModel, IFuid modname, GENmodel *kill)
|
int
|
||||||
|
HSM1mDelete(GENmodel **inModel, IFuid modname, GENmodel *kill)
|
||||||
{
|
{
|
||||||
HSM1model **model = (HSM1model**)inModel;
|
HSM1model **model = (HSM1model**)inModel;
|
||||||
HSM1model *modfast = (HSM1model*)kill;
|
HSM1model *modfast = (HSM1model*)kill;
|
||||||
|
|
|
||||||
|
|
@ -1,25 +1,21 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1mpar.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1mpar.c of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "hsm1def.h"
|
#include "hsm1def.h"
|
||||||
#include "ifsim.h"
|
#include "ifsim.h"
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
int HSM1mParam(int param, IFvalue *value, GENmodel *inMod)
|
int
|
||||||
|
HSM1mParam(int param, IFvalue *value, GENmodel *inMod)
|
||||||
{
|
{
|
||||||
HSM1model *mod = (HSM1model*)inMod;
|
HSM1model *mod = (HSM1model*)inMod;
|
||||||
switch (param) {
|
switch (param) {
|
||||||
|
|
@ -103,18 +99,26 @@ int HSM1mParam(int param, IFvalue *value, GENmodel *inMod)
|
||||||
mod->HSM1_cogidl = value->iValue;
|
mod->HSM1_cogidl = value->iValue;
|
||||||
mod->HSM1_cogidl_Given = TRUE;
|
mod->HSM1_cogidl_Given = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case HSM1_MOD_COGISL:
|
||||||
|
mod->HSM1_cogisl = value->iValue;
|
||||||
|
mod->HSM1_cogisl_Given = TRUE;
|
||||||
|
break;
|
||||||
case HSM1_MOD_COOVLP:
|
case HSM1_MOD_COOVLP:
|
||||||
mod->HSM1_coovlp = value->iValue;
|
mod->HSM1_coovlp = value->iValue;
|
||||||
mod->HSM1_coovlp_Given = TRUE;
|
mod->HSM1_coovlp_Given = TRUE;
|
||||||
break;
|
break;
|
||||||
case HSM1_MOD_CONOIS: /* HiSIM1.1 */
|
case HSM1_MOD_CONOIS:
|
||||||
mod->HSM1_conois = value->iValue;
|
mod->HSM1_conois = value->iValue;
|
||||||
mod->HSM1_conois_Given = TRUE;
|
mod->HSM1_conois_Given = TRUE;
|
||||||
break;
|
break;
|
||||||
case HSM1_MOD_COISTI:
|
case HSM1_MOD_COISTI: /* HiSIM1.1 */
|
||||||
mod->HSM1_coisti = value->iValue;
|
mod->HSM1_coisti = value->iValue;
|
||||||
mod->HSM1_coisti_Given = TRUE;
|
mod->HSM1_coisti_Given = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case HSM1_MOD_COSMBI: /* HiSIM1.2 */
|
||||||
|
mod->HSM1_cosmbi = value->iValue;
|
||||||
|
mod->HSM1_cosmbi_Given = TRUE;
|
||||||
|
break;
|
||||||
case HSM1_MOD_VMAX:
|
case HSM1_MOD_VMAX:
|
||||||
mod->HSM1_vmax = value->rValue;
|
mod->HSM1_vmax = value->rValue;
|
||||||
mod->HSM1_vmax_Given = TRUE;
|
mod->HSM1_vmax_Given = TRUE;
|
||||||
|
|
@ -131,13 +135,13 @@ int HSM1mParam(int param, IFvalue *value, GENmodel *inMod)
|
||||||
mod->HSM1_tox = value->rValue;
|
mod->HSM1_tox = value->rValue;
|
||||||
mod->HSM1_tox_Given = TRUE;
|
mod->HSM1_tox_Given = TRUE;
|
||||||
break;
|
break;
|
||||||
case HSM1_MOD_DL:
|
case HSM1_MOD_XLD:
|
||||||
mod->HSM1_dl = value->rValue;
|
mod->HSM1_xld = value->rValue;
|
||||||
mod->HSM1_dl_Given = TRUE;
|
mod->HSM1_xld_Given = TRUE;
|
||||||
break;
|
break;
|
||||||
case HSM1_MOD_DW:
|
case HSM1_MOD_XWD:
|
||||||
mod->HSM1_dw = value->rValue;
|
mod->HSM1_xwd = value->rValue;
|
||||||
mod->HSM1_dw_Given = TRUE;
|
mod->HSM1_xwd_Given = TRUE;
|
||||||
break;
|
break;
|
||||||
case HSM1_MOD_XJ: /* HiSIM1.0 */
|
case HSM1_MOD_XJ: /* HiSIM1.0 */
|
||||||
mod->HSM1_xj = value->rValue;
|
mod->HSM1_xj = value->rValue;
|
||||||
|
|
@ -263,18 +267,6 @@ int HSM1mParam(int param, IFvalue *value, GENmodel *inMod)
|
||||||
mod->HSM1_bb = value->rValue;
|
mod->HSM1_bb = value->rValue;
|
||||||
mod->HSM1_bb_Given = TRUE;
|
mod->HSM1_bb_Given = TRUE;
|
||||||
break;
|
break;
|
||||||
case HSM1_MOD_VDS0:
|
|
||||||
mod->HSM1_vds0 = value->rValue;
|
|
||||||
mod->HSM1_vds0_Given = TRUE;
|
|
||||||
break;
|
|
||||||
case HSM1_MOD_BC0:
|
|
||||||
mod->HSM1_bc0 = value->rValue;
|
|
||||||
mod->HSM1_bc0_Given = TRUE;
|
|
||||||
break;
|
|
||||||
case HSM1_MOD_BC1:
|
|
||||||
mod->HSM1_bc1 = value->rValue;
|
|
||||||
mod->HSM1_bc1_Given = TRUE;
|
|
||||||
break;
|
|
||||||
case HSM1_MOD_SUB1:
|
case HSM1_MOD_SUB1:
|
||||||
mod->HSM1_sub1 = value->rValue;
|
mod->HSM1_sub1 = value->rValue;
|
||||||
mod->HSM1_sub1_Given = TRUE;
|
mod->HSM1_sub1_Given = TRUE;
|
||||||
|
|
@ -475,6 +467,30 @@ int HSM1mParam(int param, IFvalue *value, GENmodel *inMod)
|
||||||
mod->HSM1_cit = value->rValue;
|
mod->HSM1_cit = value->rValue;
|
||||||
mod->HSM1_cit_Given = TRUE;
|
mod->HSM1_cit_Given = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case HSM1_MOD_GLPART1: /* HiSIM1.2 */
|
||||||
|
mod->HSM1_glpart1 = value->rValue;
|
||||||
|
mod->HSM1_glpart1_Given = TRUE;
|
||||||
|
break;
|
||||||
|
case HSM1_MOD_GLPART2: /* HiSIM1.2 */
|
||||||
|
mod->HSM1_glpart2 = value->rValue;
|
||||||
|
mod->HSM1_glpart2_Given = TRUE;
|
||||||
|
break;
|
||||||
|
case HSM1_MOD_KAPPA: /* HiSIM1.2 */
|
||||||
|
mod->HSM1_kappa = value->rValue;
|
||||||
|
mod->HSM1_kappa_Given = TRUE;
|
||||||
|
break;
|
||||||
|
case HSM1_MOD_XDIFFD: /* HiSIM1.2 */
|
||||||
|
mod->HSM1_xdiffd = value->rValue;
|
||||||
|
mod->HSM1_xdiffd_Given = TRUE;
|
||||||
|
break;
|
||||||
|
case HSM1_MOD_PTHROU: /* HiSIM1.2 */
|
||||||
|
mod->HSM1_pthrou = value->rValue;
|
||||||
|
mod->HSM1_pthrou_Given = TRUE;
|
||||||
|
break;
|
||||||
|
case HSM1_MOD_VDIFFJ: /* HiSIM1.2 */
|
||||||
|
mod->HSM1_vdiffj = value->rValue;
|
||||||
|
mod->HSM1_vdiffj_Given = TRUE;
|
||||||
|
break;
|
||||||
case HSM1_MOD_KF:
|
case HSM1_MOD_KF:
|
||||||
mod->HSM1_kf = value->rValue;
|
mod->HSM1_kf = value->rValue;
|
||||||
mod->HSM1_kf_Given = TRUE;
|
mod->HSM1_kf_Given = TRUE;
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,13 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1noi.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1noi.c of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "hsm1def.h"
|
#include "hsm1def.h"
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
|
|
@ -53,11 +48,12 @@
|
||||||
extern void NevalSrc();
|
extern void NevalSrc();
|
||||||
extern double Nintegrate();
|
extern double Nintegrate();
|
||||||
|
|
||||||
int HSM1noise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt,
|
int
|
||||||
Ndata *data, double *OnDens)
|
HSM1noise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt,
|
||||||
|
register Ndata *data, double *OnDens)
|
||||||
{
|
{
|
||||||
HSM1model *model = (HSM1model *)inModel;
|
register HSM1model *model = (HSM1model *)inModel;
|
||||||
HSM1instance *here;
|
register HSM1instance *here;
|
||||||
char name[N_MXVLNTH];
|
char name[N_MXVLNTH];
|
||||||
double tempOnoise;
|
double tempOnoise;
|
||||||
double tempInoise;
|
double tempInoise;
|
||||||
|
|
@ -84,6 +80,7 @@ int HSM1noise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt,
|
||||||
if (here->HSM1owner != ARCHme)
|
if (here->HSM1owner != ARCHme)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
case N_OPEN:
|
case N_OPEN:
|
||||||
/* see if we have to to produce a summary report */
|
/* see if we have to to produce a summary report */
|
||||||
|
|
@ -153,7 +150,7 @@ int HSM1noise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt,
|
||||||
I = here->HSM1_gm + here->HSM1_gds + here->HSM1_gmbs;
|
I = here->HSM1_gm + here->HSM1_gds + here->HSM1_gmbs;
|
||||||
I *= (I < 0.0) ? -1.0 : 1.0;
|
I *= (I < 0.0) ? -1.0 : 1.0;
|
||||||
I *= 2.0/3.0;
|
I *= 2.0/3.0;
|
||||||
I *= here->HSM1_m; /* PN */
|
I *= here->HSM1_m; /* PN */
|
||||||
NevalSrc(&noizDens[HSM1IDNOIZ], &lnNdens[HSM1IDNOIZ],
|
NevalSrc(&noizDens[HSM1IDNOIZ], &lnNdens[HSM1IDNOIZ],
|
||||||
ckt, THERMNOISE,
|
ckt, THERMNOISE,
|
||||||
here->HSM1dNodePrime, here->HSM1sNodePrime, I);
|
here->HSM1dNodePrime, here->HSM1sNodePrime, I);
|
||||||
|
|
@ -164,7 +161,7 @@ int HSM1noise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt,
|
||||||
/ (here->HSM1_weff * here->HSM1_leff);
|
/ (here->HSM1_weff * here->HSM1_leff);
|
||||||
I *= (I < 0.0) ? -1.0 : 1.0;
|
I *= (I < 0.0) ? -1.0 : 1.0;
|
||||||
I *= here->HSM1_mu;
|
I *= here->HSM1_mu;
|
||||||
I *= here->HSM1_m; /* PN */
|
I *= here->HSM1_m; /* PN */
|
||||||
NevalSrc(&noizDens[HSM1IDNOIZ], &lnNdens[HSM1IDNOIZ],
|
NevalSrc(&noizDens[HSM1IDNOIZ], &lnNdens[HSM1IDNOIZ],
|
||||||
ckt, THERMNOISE,
|
ckt, THERMNOISE,
|
||||||
here->HSM1dNodePrime, here->HSM1sNodePrime, I);
|
here->HSM1dNodePrime, here->HSM1sNodePrime, I);
|
||||||
|
|
@ -184,8 +181,8 @@ int HSM1noise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt,
|
||||||
switch ( model->HSM1_noise ) {
|
switch ( model->HSM1_noise ) {
|
||||||
case 1:
|
case 1:
|
||||||
case 4: /* SPICE2 model */
|
case 4: /* SPICE2 model */
|
||||||
noizDens[HSM1FLNOIZ] *= model->HSM1_kf
|
noizDens[HSM1FLNOIZ] *= here->HSM1_m * model->HSM1_kf
|
||||||
* exp(model->HSM1_af * log(MAX(fabs(here->HSM1_ids * here->HSM1_m), N_MINLOG)))
|
* exp(model->HSM1_af * log(MAX(fabs(here->HSM1_ids), N_MINLOG)))
|
||||||
/ (pow(data->freq, model->HSM1_ef) * here->HSM1_leff
|
/ (pow(data->freq, model->HSM1_ef) * here->HSM1_leff
|
||||||
* here->HSM1_leff * (3.453133e-11 / model->HSM1_tox));
|
* here->HSM1_leff * (3.453133e-11 / model->HSM1_tox));
|
||||||
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cox */
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cox */
|
||||||
|
|
|
||||||
|
|
@ -1,25 +1,21 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1par.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1par.c of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "ifsim.h"
|
#include "ifsim.h"
|
||||||
#include "hsm1def.h"
|
#include "hsm1def.h"
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
int HSM1param(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
|
int
|
||||||
|
HSM1param(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
|
||||||
{
|
{
|
||||||
HSM1instance *here = (HSM1instance*)inst;
|
HSM1instance *here = (HSM1instance*)inst;
|
||||||
switch (param) {
|
switch (param) {
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,13 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1pzld.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1pzld.c of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
#include "complex.h"
|
#include "complex.h"
|
||||||
|
|
@ -20,10 +15,12 @@
|
||||||
#include "hsm1def.h"
|
#include "hsm1def.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
int HSM1pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
|
int
|
||||||
|
HSM1pzLoad(GENmodel *inModel, register CKTcircuit *ckt,
|
||||||
|
register SPcomplex *s)
|
||||||
{
|
{
|
||||||
HSM1model *model = (HSM1model*)inModel;
|
register HSM1model *model = (HSM1model*)inModel;
|
||||||
HSM1instance *here;
|
register HSM1instance *here;
|
||||||
double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb;
|
double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb;
|
||||||
double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb;
|
double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb;
|
||||||
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, FwdSum, RevSum, gm, gmbs;
|
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, FwdSum, RevSum, gm, gmbs;
|
||||||
|
|
@ -31,8 +28,12 @@ int HSM1pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
|
||||||
double cgso, cgdo, cgbo;
|
double cgso, cgdo, cgbo;
|
||||||
double gbspsp, gbbdp, gbbsp, gbspg, gbspb;
|
double gbspsp, gbbdp, gbbsp, gbspg, gbspb;
|
||||||
double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp;
|
double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp;
|
||||||
|
double gIbtotg, gIbtotd, gIbtots, gIbtotb;
|
||||||
|
double gIgtotg, gIgtotd, gIgtots, gIgtotb;
|
||||||
|
double gIdtotg, gIdtotd, gIdtots, gIdtotb;
|
||||||
|
double gIstotg, gIstotd, gIstots, gIstotb;
|
||||||
|
|
||||||
double m;
|
double m; /* Multiplier */
|
||||||
|
|
||||||
for ( ;model != NULL ;model = model->HSM1nextModel ) {
|
for ( ;model != NULL ;model = model->HSM1nextModel ) {
|
||||||
for ( here = model->HSM1instances ;here!= NULL ;
|
for ( here = model->HSM1instances ;here!= NULL ;
|
||||||
|
|
@ -60,6 +61,38 @@ int HSM1pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
|
||||||
gbspb = 0.0;
|
gbspb = 0.0;
|
||||||
gbspsp = 0.0;
|
gbspsp = 0.0;
|
||||||
|
|
||||||
|
if (model->HSM1_coiigs) {
|
||||||
|
gIbtotg = here->HSM1_gigbg;
|
||||||
|
gIbtotd = here->HSM1_gigbd;
|
||||||
|
gIbtots = here->HSM1_gigbs;
|
||||||
|
gIbtotb = here->HSM1_gigbb;
|
||||||
|
|
||||||
|
gIstotg = here->HSM1_gigsg;
|
||||||
|
gIstotd = here->HSM1_gigsd;
|
||||||
|
gIstots = here->HSM1_gigss;
|
||||||
|
gIstotb = here->HSM1_gigsb;
|
||||||
|
|
||||||
|
gIdtotg = here->HSM1_gigdg;
|
||||||
|
gIdtotd = here->HSM1_gigdd;
|
||||||
|
gIdtots = here->HSM1_gigds;
|
||||||
|
gIdtotb = here->HSM1_gigdb;
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0;
|
||||||
|
gIstotg = gIstotd = gIstots = gIstotb = 0.0;
|
||||||
|
gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (model->HSM1_coiigs) {
|
||||||
|
gIgtotg = gIbtotg + gIstotg + gIdtotg;
|
||||||
|
gIgtotd = gIbtotd + gIstotd + gIdtotd;
|
||||||
|
gIgtots = gIbtots + gIstots + gIdtots;
|
||||||
|
gIgtotb = gIbtotb + gIstotb + gIdtotb;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0;
|
||||||
|
|
||||||
cggb = here->HSM1_cggb;
|
cggb = here->HSM1_cggb;
|
||||||
cgsb = here->HSM1_cgsb;
|
cgsb = here->HSM1_cgsb;
|
||||||
cgdb = here->HSM1_cgdb;
|
cgdb = here->HSM1_cgdb;
|
||||||
|
|
@ -87,6 +120,37 @@ int HSM1pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
|
||||||
gbdpb = 0.0;
|
gbdpb = 0.0;
|
||||||
gbdpdp = 0.0;
|
gbdpdp = 0.0;
|
||||||
|
|
||||||
|
if (model->HSM1_coiigs) {
|
||||||
|
gIbtotg = here->HSM1_gigbg;
|
||||||
|
gIbtotd = here->HSM1_gigbd;
|
||||||
|
gIbtots = here->HSM1_gigbs;
|
||||||
|
gIbtotb = here->HSM1_gigbb;
|
||||||
|
|
||||||
|
gIstotg = here->HSM1_gigsg;
|
||||||
|
gIstotd = here->HSM1_gigsd;
|
||||||
|
gIstots = here->HSM1_gigss;
|
||||||
|
gIstotb = here->HSM1_gigsb;
|
||||||
|
|
||||||
|
gIdtotg = here->HSM1_gigdg;
|
||||||
|
gIdtotd = here->HSM1_gigdd;
|
||||||
|
gIdtots = here->HSM1_gigds;
|
||||||
|
gIdtotb = here->HSM1_gigdb;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0;
|
||||||
|
gIstotg = gIstotd = gIstots = gIstotb = 0.0;
|
||||||
|
gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (model->HSM1_coiigs) {
|
||||||
|
gIgtotg = gIbtotg + gIstotg + gIdtotg;
|
||||||
|
gIgtotd = gIbtotd + gIstotd + gIdtotd;
|
||||||
|
gIgtots = gIbtots + gIstots + gIdtots;
|
||||||
|
gIgtotb = gIbtotb + gIstotb + gIdtotb;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0;
|
||||||
|
|
||||||
gbspg = here->HSM1_gbgs;
|
gbspg = here->HSM1_gbgs;
|
||||||
gbspsp = here->HSM1_gbds;
|
gbspsp = here->HSM1_gbds;
|
||||||
gbspb = here->HSM1_gbbs;
|
gbspb = here->HSM1_gbbs;
|
||||||
|
|
@ -117,8 +181,6 @@ int HSM1pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
|
||||||
cgdo = here->HSM1_cgdo;
|
cgdo = here->HSM1_cgdo;
|
||||||
cgbo = here->HSM1_cgbo;
|
cgbo = here->HSM1_cgbo;
|
||||||
|
|
||||||
m = here->HSM1_m;
|
|
||||||
|
|
||||||
xcdgb = (cdgb - cgdo);
|
xcdgb = (cdgb - cgdo);
|
||||||
xcddb = (cddb + capbd + cgdo);
|
xcddb = (cddb + capbd + cgdo);
|
||||||
xcdsb = cdsb;
|
xcdsb = cdsb;
|
||||||
|
|
@ -136,10 +198,14 @@ int HSM1pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
|
||||||
xcbsb = (cbsb - capbs);
|
xcbsb = (cbsb - capbs);
|
||||||
xcbbb = -(xcbgb + xcbdb + xcbsb);
|
xcbbb = -(xcbgb + xcbdb + xcbsb);
|
||||||
|
|
||||||
|
m = here->HSM1_m;
|
||||||
|
|
||||||
*(here->HSM1GgPtr ) += m * xcggb * s->real;
|
*(here->HSM1GgPtr ) += m * xcggb * s->real;
|
||||||
*(here->HSM1GgPtr +1) += m * xcggb * s->imag;
|
*(here->HSM1GgPtr +1) += m * xcggb * s->imag;
|
||||||
|
*(here->HSM1GgPtr) += m * gIgtotg;
|
||||||
*(here->HSM1BbPtr ) += m * xcbbb * s->real;
|
*(here->HSM1BbPtr ) += m * xcbbb * s->real;
|
||||||
*(here->HSM1BbPtr +1) += m * xcbbb * s->imag;
|
*(here->HSM1BbPtr +1) += m * xcbbb * s->imag;
|
||||||
|
*(here->HSM1GbPtr) += m * gIgtotb;
|
||||||
*(here->HSM1DPdpPtr ) += m * xcddb * s->real;
|
*(here->HSM1DPdpPtr ) += m * xcddb * s->real;
|
||||||
*(here->HSM1DPdpPtr +1) += m * xcddb * s->imag;
|
*(here->HSM1DPdpPtr +1) += m * xcddb * s->imag;
|
||||||
*(here->HSM1SPspPtr ) += m * xcssb * s->real;
|
*(here->HSM1SPspPtr ) += m * xcssb * s->real;
|
||||||
|
|
@ -149,8 +215,10 @@ int HSM1pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
|
||||||
*(here->HSM1GbPtr +1) += m * xcgbb * s->imag;
|
*(here->HSM1GbPtr +1) += m * xcgbb * s->imag;
|
||||||
*(here->HSM1GdpPtr ) += m * xcgdb * s->real;
|
*(here->HSM1GdpPtr ) += m * xcgdb * s->real;
|
||||||
*(here->HSM1GdpPtr +1) += m * xcgdb * s->imag;
|
*(here->HSM1GdpPtr +1) += m * xcgdb * s->imag;
|
||||||
|
*(here->HSM1GdpPtr) += m * gIgtotd;
|
||||||
*(here->HSM1GspPtr ) += m * xcgsb * s->real;
|
*(here->HSM1GspPtr ) += m * xcgsb * s->real;
|
||||||
*(here->HSM1GspPtr +1) += m * xcgsb * s->imag;
|
*(here->HSM1GspPtr +1) += m * xcgsb * s->imag;
|
||||||
|
*(here->HSM1GspPtr) += m * gIgtots;
|
||||||
|
|
||||||
*(here->HSM1BgPtr ) += m * xcbgb * s->real;
|
*(here->HSM1BgPtr ) += m * xcbgb * s->real;
|
||||||
*(here->HSM1BgPtr +1) += m * xcbgb * s->imag;
|
*(here->HSM1BgPtr +1) += m * xcbgb * s->imag;
|
||||||
|
|
@ -181,23 +249,47 @@ int HSM1pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
|
||||||
*(here->HSM1SspPtr) -= m * gspr;
|
*(here->HSM1SspPtr) -= m * gspr;
|
||||||
*(here->HSM1SPsPtr) -= m * gspr;
|
*(here->HSM1SPsPtr) -= m * gspr;
|
||||||
|
|
||||||
*(here->HSM1BgPtr) -= m * here->HSM1_gbgs;
|
*(here->HSM1BgPtr) -= m * (here->HSM1_gbgs + gIbtotg);
|
||||||
*(here->HSM1BbPtr) += m * (gbd + gbs - here->HSM1_gbbs);
|
*(here->HSM1BbPtr) += m * (gbd + gbs - here->HSM1_gbbs - gIbtotb);
|
||||||
*(here->HSM1BdpPtr) -= m * (gbd - gbbdp);
|
*(here->HSM1BdpPtr) -= m * (gbd - gbbdp + gIbtotd);
|
||||||
*(here->HSM1BspPtr) -= m * (gbs - gbbsp);
|
*(here->HSM1BspPtr) -= m * (gbs - gbbsp + gIbtots);
|
||||||
|
|
||||||
*(here->HSM1DPgPtr) += m * (gm + gbdpg);
|
*(here->HSM1DPgPtr) += m * (gm + gbdpg - gIdtotg);
|
||||||
*(here->HSM1DPdpPtr) += m * (gdpr + gds + gbd + RevSum + gbdpdp);
|
*(here->HSM1DPdpPtr) += m * (gdpr + gds + gbd + RevSum + gbdpdp
|
||||||
*(here->HSM1DPspPtr) -= m * (gds + FwdSum - gbdpsp);
|
- gIdtotd);
|
||||||
*(here->HSM1DPbPtr) -= m * (gbd - gmbs - gbdpb);
|
*(here->HSM1DPspPtr) -= m * (gds + FwdSum - gbdpsp + gIdtots);
|
||||||
|
*(here->HSM1DPbPtr) -= m * (gbd - gmbs - gbdpb + gIdtotb);
|
||||||
|
|
||||||
*(here->HSM1SPgPtr) -= m * (gm - gbspg);
|
*(here->HSM1SPgPtr) -= m * (gm - gbspg + gIstotg);
|
||||||
*(here->HSM1SPspPtr) += m * (gspr + gds + gbs + FwdSum + gbspsp);
|
*(here->HSM1SPspPtr) += m * (gspr + gds + gbs + FwdSum + gbspsp
|
||||||
*(here->HSM1SPbPtr) -= m * (gbs + gmbs - gbspb);
|
- gIstots);
|
||||||
*(here->HSM1SPdpPtr) -= m * (gds + RevSum - gbspdp);
|
*(here->HSM1SPbPtr) -= m * (gbs + gmbs - gbspb + gIstotb);
|
||||||
|
*(here->HSM1SPdpPtr) -= m * (gds + RevSum - gbspdp + gIstotd);
|
||||||
|
|
||||||
|
/* stamp gidl */
|
||||||
|
*(here->HSM1DPdpPtr) += m * here->HSM1_gigidlds;
|
||||||
|
*(here->HSM1DPgPtr) += m * here->HSM1_gigidlgs;
|
||||||
|
*(here->HSM1DPspPtr) -= m * (here->HSM1_gigidlgs +
|
||||||
|
here->HSM1_gigidlds + here->HSM1_gigidlbs);
|
||||||
|
*(here->HSM1DPbPtr) += m * here->HSM1_gigidlbs;
|
||||||
|
*(here->HSM1BdpPtr) -= m * here->HSM1_gigidlds;
|
||||||
|
*(here->HSM1BgPtr) -= m * here->HSM1_gigidlgs;
|
||||||
|
*(here->HSM1BspPtr) += m * (here->HSM1_gigidlgs +
|
||||||
|
here->HSM1_gigidlds + here->HSM1_gigidlbs);
|
||||||
|
*(here->HSM1BbPtr) -= m * here->HSM1_gigidlbs;
|
||||||
|
/* stamp gisl */
|
||||||
|
*(here->HSM1SPdpPtr) -= m * (here->HSM1_gigislsd +
|
||||||
|
here->HSM1_gigislgd + here->HSM1_gigislbd);
|
||||||
|
*(here->HSM1SPgPtr) += m * here->HSM1_gigislgd;
|
||||||
|
*(here->HSM1SPspPtr) += m * here->HSM1_gigislsd;
|
||||||
|
*(here->HSM1SPbPtr) += m * here->HSM1_gigislbd;
|
||||||
|
*(here->HSM1BdpPtr) += m * (here->HSM1_gigislgd +
|
||||||
|
here->HSM1_gigislsd + here->HSM1_gigislbd);
|
||||||
|
*(here->HSM1BgPtr) -= m * here->HSM1_gigislgd;
|
||||||
|
*(here->HSM1BspPtr) -= m * here->HSM1_gigislsd;
|
||||||
|
*(here->HSM1BbPtr) -= m * here->HSM1_gigislbd;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
... may nedeed in the future ...
|
|
||||||
*(here->HSM1GgPtr) -= m * xgtg;
|
*(here->HSM1GgPtr) -= m * xgtg;
|
||||||
*(here->HSM1GbPtr) -= m * xgtb;
|
*(here->HSM1GbPtr) -= m * xgtb;
|
||||||
*(here->HSM1GdpPtr) -= m * xgtd;
|
*(here->HSM1GdpPtr) -= m * xgtd;
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,13 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1set.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1set.c of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "smpdefs.h"
|
#include "smpdefs.h"
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
|
|
@ -21,14 +16,15 @@
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
int HSM1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
int
|
||||||
int *states)
|
HSM1setup(register SMPmatrix *matrix, register GENmodel *inModel,
|
||||||
|
register CKTcircuit *ckt, int *states)
|
||||||
/* load the HSM1 device structure with those pointers needed later
|
/* load the HSM1 device structure with those pointers needed later
|
||||||
* for fast matrix loading
|
* for fast matrix loading
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
HSM1model *model = (HSM1model*)inModel;
|
register HSM1model *model = (HSM1model*)inModel;
|
||||||
HSM1instance *here;
|
register HSM1instance *here;
|
||||||
int error;
|
int error;
|
||||||
CKTnode *tmp;
|
CKTnode *tmp;
|
||||||
|
|
||||||
|
|
@ -43,7 +39,31 @@ int HSM1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
||||||
/***/
|
/***/
|
||||||
if ( !model->HSM1_info_Given ) model->HSM1_info = 0 ;
|
if ( !model->HSM1_info_Given ) model->HSM1_info = 0 ;
|
||||||
if ( !model->HSM1_noise_Given) model->HSM1_noise = 5; /* select noise model 5 */
|
if ( !model->HSM1_noise_Given) model->HSM1_noise = 5; /* select noise model 5 */
|
||||||
if ( !model->HSM1_version_Given) model->HSM1_version = 100; /* default 100 */
|
if ( !model->HSM1_version_Given) {
|
||||||
|
model->HSM1_version = 120; /* default 120 */
|
||||||
|
printf(" 120 is selected for VERSION. (default) \n");
|
||||||
|
}
|
||||||
|
if ( model->HSM1_version == 100 || model->HSM1_version == 101) {
|
||||||
|
printf("warning(HiSIM1): For the model parameter VERSION, 102 or 112 or 120 is acceptable.\n");
|
||||||
|
printf(" 102 is selected for VERSION \n");
|
||||||
|
model->HSM1_version = 102 ;
|
||||||
|
}
|
||||||
|
else if ( model->HSM1_version == 110 || model->HSM1_version == 111) {
|
||||||
|
printf("warning(HiSIM1): For the model parameter VERSION, 102 or 112 or 120 is acceptable.\n");
|
||||||
|
printf(" 112 is selected for VERSION \n");
|
||||||
|
model->HSM1_version = 112 ;
|
||||||
|
}
|
||||||
|
else if ( model->HSM1_version != 102 &&
|
||||||
|
model->HSM1_version != 112 &&
|
||||||
|
model->HSM1_version != 120) {
|
||||||
|
printf("warning(HiSIM1): For the model parameter VERSION, 102 or 112 or 120 is acceptable.\n");
|
||||||
|
printf(" 120 is selected for VERSION compulsorily.\n");
|
||||||
|
model->HSM1_version = 120 ;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//DW printf(" %d is selected for VERSION \n", (int)model->HSM1_version);
|
||||||
|
}
|
||||||
|
|
||||||
if ( !model->HSM1_corsrd_Given ) model->HSM1_corsrd = 0 ;
|
if ( !model->HSM1_corsrd_Given ) model->HSM1_corsrd = 0 ;
|
||||||
if ( !model->HSM1_coiprv_Given ) model->HSM1_coiprv = 1 ;
|
if ( !model->HSM1_coiprv_Given ) model->HSM1_coiprv = 1 ;
|
||||||
if ( !model->HSM1_copprv_Given ) model->HSM1_copprv = 1 ;
|
if ( !model->HSM1_copprv_Given ) model->HSM1_copprv = 1 ;
|
||||||
|
|
@ -56,77 +76,133 @@ int HSM1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
||||||
if ( !model->HSM1_coisub_Given ) model->HSM1_coisub = 0 ;
|
if ( !model->HSM1_coisub_Given ) model->HSM1_coisub = 0 ;
|
||||||
if ( !model->HSM1_coiigs_Given ) model->HSM1_coiigs = 0 ;
|
if ( !model->HSM1_coiigs_Given ) model->HSM1_coiigs = 0 ;
|
||||||
if ( !model->HSM1_cogidl_Given ) model->HSM1_cogidl = 0 ;
|
if ( !model->HSM1_cogidl_Given ) model->HSM1_cogidl = 0 ;
|
||||||
|
if ( model->HSM1_version == 120 ) {/* HiSIM1.2.0 */
|
||||||
|
if ( !model->HSM1_cogisl_Given ) model->HSM1_cogisl = 0 ;
|
||||||
|
}
|
||||||
if ( !model->HSM1_coovlp_Given ) model->HSM1_coovlp = 0 ;
|
if ( !model->HSM1_coovlp_Given ) model->HSM1_coovlp = 0 ;
|
||||||
if ( !model->HSM1_conois_Given ) model->HSM1_conois = 0 ;
|
if ( !model->HSM1_conois_Given ) model->HSM1_conois = 0 ;
|
||||||
if ( model->HSM1_version == 110 ) {/* HiSIM1.1 */
|
if ( model->HSM1_version == 112 || model->HSM1_version == 120) {
|
||||||
|
/* HiSIM1.1.2 HiSIM1.2.0*/
|
||||||
if ( !model->HSM1_coisti_Given ) model->HSM1_coisti = 0 ;
|
if ( !model->HSM1_coisti_Given ) model->HSM1_coisti = 0 ;
|
||||||
}
|
}
|
||||||
|
if ( model->HSM1_version == 120 ) {/* HiSIM1.2.0 */
|
||||||
|
if ( !model->HSM1_cosmbi_Given ) model->HSM1_cosmbi = 0 ;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (model->HSM1_cosmbi_Given)
|
||||||
|
printf ("warning(HiSIM1): COSMBI is only available for VERSION = 120\n");
|
||||||
|
if ( model->HSM1_kappa_Given )
|
||||||
|
printf ("warning(HiSIM1): KAPPA is only available for VERSION = 120\n");
|
||||||
|
if ( model->HSM1_xdiffd_Given )
|
||||||
|
printf ("warning(HiSIM1): XDIFFD is only available for VERSION = 120\n");
|
||||||
|
if ( model->HSM1_vdiffj_Given )
|
||||||
|
printf ("warning(HiSIM1): VDIFFJ is only available for VERSION = 120\n");
|
||||||
|
if ( model->HSM1_pthrou_Given )
|
||||||
|
printf ("warning(HiSIM1): PTHROU is only available for VERSION = 120\n");
|
||||||
|
if ( model->HSM1_glpart1_Given )
|
||||||
|
printf ("warning(HiSIM1): GLPART1 is only available for VERSION = 120\n");
|
||||||
|
if ( model->HSM1_glpart2_Given )
|
||||||
|
printf ("warning(HiSIM1): GLPART2 is only available for VERSION = 120\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
printf (" This parameter is ignored.\n");
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
/***/
|
/***/
|
||||||
if ( !model->HSM1_vmax_Given ) model->HSM1_vmax = 1.00e+7 ;
|
if ( !model->HSM1_vmax_Given ) model->HSM1_vmax = 7.00e+6 ;
|
||||||
if ( !model->HSM1_bgtmp1_Given ) model->HSM1_bgtmp1 = 9.03e-5 ;
|
if ( !model->HSM1_bgtmp1_Given ) model->HSM1_bgtmp1 = 90.25e-6 ;
|
||||||
if ( !model->HSM1_bgtmp2_Given ) model->HSM1_bgtmp2 = 3.05e-7 ;
|
if ( !model->HSM1_bgtmp2_Given ) model->HSM1_bgtmp2 = 100.0e-9 ;
|
||||||
if ( !model->HSM1_tox_Given ) model->HSM1_tox = 3.60e-9 ;
|
if ( !model->HSM1_tox_Given ) model->HSM1_tox = 5.0e-9 ;
|
||||||
if ( !model->HSM1_dl_Given ) model->HSM1_dl = 0.0 ;
|
else if ( model->HSM1_tox < 0 ) {
|
||||||
if ( !model->HSM1_dw_Given ) model->HSM1_dw = 0.0 ;
|
printf("warning(HiSIM1): The model parameter TOX must be positive.\n");
|
||||||
if ( model->HSM1_version == 100 ) { /* HiSIM1.0 */
|
}
|
||||||
|
if ( !model->HSM1_xld_Given ) model->HSM1_xld = 0.0 ;
|
||||||
|
if ( !model->HSM1_xwd_Given ) model->HSM1_xwd = 0.0 ;
|
||||||
|
if ( model->HSM1_version == 102 ) { /* HiSIM1.0 */
|
||||||
if ( !model->HSM1_xj_Given ) model->HSM1_xj = 0.0 ;
|
if ( !model->HSM1_xj_Given ) model->HSM1_xj = 0.0 ;
|
||||||
|
else if ( model->HSM1_xj < 0 ) {
|
||||||
|
printf("warning(HiSIM1): The model parameter XJ must be positive.\n");
|
||||||
|
}
|
||||||
if ( model->HSM1_xqy_Given ) {
|
if ( model->HSM1_xqy_Given ) {
|
||||||
printf("warning(HiSIM): the model parameter XQY is only available in VERSION = 110.\n");
|
printf("warning(HiSIM1): XQY is only available for VERSION = 112 or 120\n");
|
||||||
printf(" XQY = %f - ignored\n", model->HSM1_xqy);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( model->HSM1_version == 110 ) { /* HiSIM1.1 */
|
else if ( model->HSM1_version == 112 ||
|
||||||
|
model->HSM1_version == 120 ) { /* HiSIM1.1.2 / 1.2.0 */
|
||||||
if ( !model->HSM1_xqy_Given ) model->HSM1_xqy = 0.0;
|
if ( !model->HSM1_xqy_Given ) model->HSM1_xqy = 0.0;
|
||||||
|
else if ( model->HSM1_xqy < 0 ) {
|
||||||
|
printf("warning(HiSIM1): The model parameter XQY must be positive.\n");
|
||||||
|
}
|
||||||
if ( model->HSM1_xj_Given ) {
|
if ( model->HSM1_xj_Given ) {
|
||||||
printf("warning(HiSIM): the model parameter XJ is only available in VERSION = 100.\n");
|
printf("warning(HiSIM1): XJ is only available for VERSION = 102\n");
|
||||||
printf(" XJ = %f - ignored\n", model->HSM1_xj);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( !model->HSM1_rs_Given ) model->HSM1_rs = 0.0 ;
|
if ( !model->HSM1_rs_Given ) model->HSM1_rs = 80.0e-6 ;
|
||||||
if ( !model->HSM1_rd_Given ) model->HSM1_rd = 0.0 ;
|
else if ( model->HSM1_rs < 0 ) {
|
||||||
if ( !model->HSM1_vfbc_Given ) model->HSM1_vfbc = -0.722729 ;
|
printf("warning(HiSIM1): The model parameter RS must be positive.\n");
|
||||||
if ( !model->HSM1_nsubc_Given ) model->HSM1_nsubc = 5.94e+17 ;
|
}
|
||||||
|
if ( !model->HSM1_rd_Given ) model->HSM1_rd = 80.0e-6 ;
|
||||||
|
else if ( model->HSM1_rd < 0 ) {
|
||||||
|
printf("warning(HiSIM1): The model parameter RD must be positive.\n");
|
||||||
|
}
|
||||||
|
if ( !model->HSM1_vfbc_Given ) model->HSM1_vfbc = -1.0 ;
|
||||||
|
if ( !model->HSM1_nsubc_Given ) model->HSM1_nsubc = 1.0e+17 ;
|
||||||
|
else if ( model->HSM1_nsubc < 0 ) {
|
||||||
|
printf("warning(HiSIM1): The model parameter NSUBC must be positive.\n");
|
||||||
|
}
|
||||||
|
if ( model->HSM1_version == 120 ) model->HSM1_parl1 = 1.0 ;
|
||||||
|
else {
|
||||||
if ( !model->HSM1_parl1_Given ) model->HSM1_parl1 = 1.0 ;
|
if ( !model->HSM1_parl1_Given ) model->HSM1_parl1 = 1.0 ;
|
||||||
if ( !model->HSM1_parl2_Given ) model->HSM1_parl2 = 2.20e-8 ;
|
}
|
||||||
if ( !model->HSM1_lp_Given ) model->HSM1_lp = 0.0 ;
|
if ( !model->HSM1_parl2_Given ) model->HSM1_parl2 = 0.0 ;
|
||||||
if ( !model->HSM1_nsubp_Given ) model->HSM1_nsubp = 5.94e+17 ;
|
if ( !model->HSM1_lp_Given ) model->HSM1_lp = 15.0e-9 ;
|
||||||
|
if ( !model->HSM1_nsubp_Given ) model->HSM1_nsubp = 1.0e+17 ;
|
||||||
|
else if ( model->HSM1_nsubp < 0 ) {
|
||||||
|
printf("warning(HiSIM1): The model parameter NSUBP must be positive.\n");
|
||||||
|
}
|
||||||
if ( !model->HSM1_scp1_Given ) model->HSM1_scp1 = 0.0 ;
|
if ( !model->HSM1_scp1_Given ) model->HSM1_scp1 = 0.0 ;
|
||||||
if ( !model->HSM1_scp2_Given ) model->HSM1_scp2 = 0.0 ;
|
if ( !model->HSM1_scp2_Given ) model->HSM1_scp2 = 0.0 ;
|
||||||
if ( !model->HSM1_scp3_Given ) model->HSM1_scp3 = 0.0 ;
|
if ( !model->HSM1_scp3_Given ) model->HSM1_scp3 = 0.0 ;
|
||||||
if ( !model->HSM1_sc1_Given ) model->HSM1_sc1 = 13.5 ;
|
if ( !model->HSM1_sc1_Given ) model->HSM1_sc1 = 0.0 ;
|
||||||
if ( !model->HSM1_sc2_Given ) model->HSM1_sc2 = 1.8 ;
|
if ( !model->HSM1_sc2_Given ) model->HSM1_sc2 = 0.0 ;
|
||||||
if ( !model->HSM1_sc3_Given ) model->HSM1_sc3 = 0.0 ;
|
if ( !model->HSM1_sc3_Given ) model->HSM1_sc3 = 0.0 ;
|
||||||
if ( !model->HSM1_pgd1_Given ) model->HSM1_pgd1 = 0.0 ;
|
if ( !model->HSM1_pgd1_Given ) model->HSM1_pgd1 = 10.0e-3 ;
|
||||||
if ( !model->HSM1_pgd2_Given ) model->HSM1_pgd2 = 0.0 ;
|
if ( !model->HSM1_pgd2_Given ) model->HSM1_pgd2 = 1.0 ;
|
||||||
if ( !model->HSM1_pgd3_Given ) model->HSM1_pgd3 = 0.0 ;
|
if ( !model->HSM1_pgd3_Given ) model->HSM1_pgd3 = 0.8 ;
|
||||||
if ( !model->HSM1_ndep_Given ) model->HSM1_ndep = 1.0 ;
|
if ( !model->HSM1_ndep_Given ) model->HSM1_ndep = 1.0 ;
|
||||||
if ( !model->HSM1_ninv_Given ) model->HSM1_ninv = 0.5 ;
|
if ( !model->HSM1_ninv_Given ) model->HSM1_ninv = 0.5 ;
|
||||||
if ( !model->HSM1_ninvd_Given ) model->HSM1_ninvd = 0.0 ;
|
if ( !model->HSM1_ninvd_Given ) model->HSM1_ninvd = 1.0e-9 ;
|
||||||
if ( !model->HSM1_muecb0_Given ) model->HSM1_muecb0 = 300.0 ;
|
if ( !model->HSM1_muecb0_Given ) model->HSM1_muecb0 = 300.0 ;
|
||||||
if ( !model->HSM1_muecb1_Given ) model->HSM1_muecb1 = 30.0 ;
|
if ( !model->HSM1_muecb1_Given ) model->HSM1_muecb1 = 30.0 ;
|
||||||
if ( !model->HSM1_mueph1_Given ) model->HSM1_mueph1 = 1.00e+7 ;
|
if ( !model->HSM1_mueph1_Given ) model->HSM1_mueph1 = 25.0e3 ;
|
||||||
if ( !model->HSM1_mueph0_Given ) model->HSM1_mueph0 = 0.295 ;
|
if ( !model->HSM1_mueph0_Given ) model->HSM1_mueph0 = 300.0e-3 ;
|
||||||
if ( !model->HSM1_mueph2_Given ) model->HSM1_mueph2 = 0.0 ;
|
if ( !model->HSM1_mueph2_Given ) model->HSM1_mueph2 = 0.0 ;
|
||||||
if ( !model->HSM1_w0_Given ) model->HSM1_w0 = 0.0 ;
|
if ( !model->HSM1_w0_Given ) model->HSM1_w0 = 0.0 ;
|
||||||
if ( !model->HSM1_muesr1_Given ) model->HSM1_muesr1 = 7.00e+8 ;
|
if ( !model->HSM1_muesr1_Given ) model->HSM1_muesr1 = 2.0e15;
|
||||||
if ( !model->HSM1_muesr0_Given ) model->HSM1_muesr0 = 1.0 ;
|
if ( !model->HSM1_muesr0_Given ) model->HSM1_muesr0 = 2.0 ;
|
||||||
if ( !model->HSM1_muetmp_Given ) model->HSM1_muetmp = 0.0 ;
|
if ( !model->HSM1_muetmp_Given ) model->HSM1_muetmp = 1.5 ;
|
||||||
/***/
|
/***/
|
||||||
if ( !model->HSM1_bb_Given ) {
|
if ( !model->HSM1_bb_Given ) {
|
||||||
if (model->HSM1_type == NMOS) model->HSM1_bb = 2.0 ;
|
if (model->HSM1_type == NMOS) model->HSM1_bb = 2.0 ;
|
||||||
else model->HSM1_bb = 1.0 ;
|
else model->HSM1_bb = 1.0 ;
|
||||||
}
|
}
|
||||||
/***/
|
/***/
|
||||||
if ( !model->HSM1_vds0_Given ) model->HSM1_vds0 = 0.05 ;
|
if ( !model->HSM1_sub1_Given ) model->HSM1_sub1 = 10.0 ;
|
||||||
if ( !model->HSM1_bc0_Given ) model->HSM1_bc0 = 0.0 ;
|
if ( !model->HSM1_sub2_Given ) model->HSM1_sub2 = 20.0 ;
|
||||||
if ( !model->HSM1_bc1_Given ) model->HSM1_bc1 = 0.0 ;
|
if ( !model->HSM1_sub3_Given ) model->HSM1_sub3 = 0.8 ;
|
||||||
if ( !model->HSM1_sub1_Given ) model->HSM1_sub1 = 0.0 ;
|
if ( model->HSM1_version == 112 ||
|
||||||
if ( !model->HSM1_sub2_Given ) model->HSM1_sub2 = -70.0 ;
|
model->HSM1_version == 120) { /* HiSIM1.1.2 / 1.2.0 */
|
||||||
if ( !model->HSM1_sub3_Given ) model->HSM1_sub3 = 1.0 ;
|
|
||||||
if ( model->HSM1_version == 110) { /* HiSIM1.1 */
|
|
||||||
if ( !model->HSM1_wvthsc_Given ) model->HSM1_wvthsc = 0.0 ;
|
if ( !model->HSM1_wvthsc_Given ) model->HSM1_wvthsc = 0.0 ;
|
||||||
if ( !model->HSM1_nsti_Given ) model->HSM1_nsti = 1.0e17 ;
|
if ( !model->HSM1_nsti_Given ) model->HSM1_nsti = 1.0e17 ;
|
||||||
if ( !model->HSM1_wsti_Given ) model->HSM1_wsti = 0.0 ;
|
if ( !model->HSM1_wsti_Given ) model->HSM1_wsti = 0.0 ;
|
||||||
|
} else {
|
||||||
|
if ( model->HSM1_wvthsc_Given )
|
||||||
|
printf ("warning(HiSIM1): WVTHSC is only available for VERSION = 112 or 120\n");
|
||||||
|
if ( model->HSM1_nsti_Given )
|
||||||
|
printf ("warning(HiSIM1): NSTI is only available for VERSION = 112 or 120\n");
|
||||||
|
if ( model->HSM1_wsti_Given )
|
||||||
|
printf ("warning(HiSIM1): WSTI is only available for VERSION = 112 or 120\n");
|
||||||
}
|
}
|
||||||
if ( !model->HSM1_tpoly_Given ) model->HSM1_tpoly = 0.0 ;
|
if ( !model->HSM1_tpoly_Given ) model->HSM1_tpoly = 0.0 ;
|
||||||
if ( !model->HSM1_js0_Given ) model->HSM1_js0 = 1.0e-4 ;
|
if ( !model->HSM1_js0_Given ) model->HSM1_js0 = 1.0e-4 ;
|
||||||
|
|
@ -134,7 +210,7 @@ int HSM1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
||||||
if ( !model->HSM1_nj_Given ) model->HSM1_nj = 1.0 ;
|
if ( !model->HSM1_nj_Given ) model->HSM1_nj = 1.0 ;
|
||||||
if ( !model->HSM1_njsw_Given ) model->HSM1_njsw = 1.0 ;
|
if ( !model->HSM1_njsw_Given ) model->HSM1_njsw = 1.0 ;
|
||||||
if ( !model->HSM1_xti_Given ) model->HSM1_xti = 3.0 ;
|
if ( !model->HSM1_xti_Given ) model->HSM1_xti = 3.0 ;
|
||||||
if ( !model->HSM1_cj_Given ) model->HSM1_cj = 8.397247e-04;
|
if ( !model->HSM1_cj_Given ) model->HSM1_cj = 5.0e-04 ;
|
||||||
if ( !model->HSM1_cjsw_Given ) model->HSM1_cjsw = 5.0e-10 ;
|
if ( !model->HSM1_cjsw_Given ) model->HSM1_cjsw = 5.0e-10 ;
|
||||||
if ( !model->HSM1_cjswg_Given ) model->HSM1_cjswg = 5.0e-10 ;
|
if ( !model->HSM1_cjswg_Given ) model->HSM1_cjswg = 5.0e-10 ;
|
||||||
if ( !model->HSM1_mj_Given ) model->HSM1_mj = 0.5 ;
|
if ( !model->HSM1_mj_Given ) model->HSM1_mj = 0.5 ;
|
||||||
|
|
@ -144,32 +220,60 @@ int HSM1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
||||||
if ( !model->HSM1_pbsw_Given ) model->HSM1_pbsw = 1.0 ;
|
if ( !model->HSM1_pbsw_Given ) model->HSM1_pbsw = 1.0 ;
|
||||||
if ( !model->HSM1_pbswg_Given ) model->HSM1_pbswg = 1.0 ;
|
if ( !model->HSM1_pbswg_Given ) model->HSM1_pbswg = 1.0 ;
|
||||||
if ( !model->HSM1_xpolyd_Given ) model->HSM1_xpolyd = 0.0 ;
|
if ( !model->HSM1_xpolyd_Given ) model->HSM1_xpolyd = 0.0 ;
|
||||||
if ( !model->HSM1_clm1_Given ) model->HSM1_clm1 = 0.3e0 ;
|
if ( !model->HSM1_clm1_Given ) model->HSM1_clm1 = 700.0e-3 ;
|
||||||
if ( !model->HSM1_clm2_Given ) model->HSM1_clm2 = 0.0 ;
|
if ( !model->HSM1_clm2_Given ) model->HSM1_clm2 = 2.0 ;
|
||||||
if ( !model->HSM1_clm3_Given ) model->HSM1_clm3 = 0.0 ;
|
if ( !model->HSM1_clm3_Given ) model->HSM1_clm3 = 1.0 ;
|
||||||
if ( !model->HSM1_rpock1_Given ) model->HSM1_rpock1 = 0.0 ;
|
if ( !model->HSM1_rpock1_Given ) {
|
||||||
if ( !model->HSM1_rpock2_Given ) model->HSM1_rpock2 = 0.0 ;
|
if ( model->HSM1_version == 102 ) {
|
||||||
if ( model->HSM1_version == 110 ) { /* HiSIM1.1 */
|
model->HSM1_rpock1 = 10.0e-3 ;
|
||||||
if ( !model->HSM1_rpocp1_Given ) model->HSM1_rpocp1 = 0.0 ;
|
} else if ( model->HSM1_version == 112 || model->HSM1_version == 120 ) {
|
||||||
if ( !model->HSM1_rpocp2_Given ) model->HSM1_rpocp2 = 0.0 ;
|
model->HSM1_rpock1 = 0.1e-3 ;
|
||||||
}
|
}
|
||||||
if ( !model->HSM1_vover_Given ) model->HSM1_vover = 0.0 ;
|
}
|
||||||
if ( !model->HSM1_voverp_Given ) model->HSM1_voverp = 0.0 ;
|
if ( !model->HSM1_rpock2_Given ) model->HSM1_rpock2 = 100.0e-3 ;
|
||||||
|
if ( model->HSM1_version == 112 ||
|
||||||
|
model->HSM1_version == 120) { /* HiSIM1.1.2 / 1.2.0 */
|
||||||
|
if ( !model->HSM1_rpocp1_Given ) model->HSM1_rpocp1 = 1.0 ;
|
||||||
|
if ( !model->HSM1_rpocp2_Given ) model->HSM1_rpocp2 = 0.5 ;
|
||||||
|
} else {
|
||||||
|
if ( model->HSM1_rpocp1_Given )
|
||||||
|
printf ("warning(HiSIM1): RPOCP1 is only available for VERSION = 112 or 120\n");
|
||||||
|
if ( model->HSM1_rpocp2_Given )
|
||||||
|
printf ("warning(HiSIM1): RPOCP2 is only available for VERSION = 112 or 120\n");
|
||||||
|
}
|
||||||
|
if ( !model->HSM1_vover_Given ) model->HSM1_vover = 10.0e-3 ;
|
||||||
|
if ( !model->HSM1_voverp_Given ) model->HSM1_voverp = 100.0e-3 ;
|
||||||
if ( !model->HSM1_wfc_Given ) model->HSM1_wfc = 0.0 ;
|
if ( !model->HSM1_wfc_Given ) model->HSM1_wfc = 0.0 ;
|
||||||
if ( !model->HSM1_qme1_Given ) model->HSM1_qme1 = 0.0 ;
|
if ( !model->HSM1_qme1_Given ) model->HSM1_qme1 = 40.0e-12 ;
|
||||||
if ( !model->HSM1_qme2_Given ) model->HSM1_qme2 = 0.0 ;
|
if ( !model->HSM1_qme2_Given ) model->HSM1_qme2 = 300.0e-12 ;
|
||||||
if ( !model->HSM1_qme3_Given ) model->HSM1_qme3 = 0.0 ;
|
if ( !model->HSM1_qme3_Given ) model->HSM1_qme3 = 0.0 ;
|
||||||
if ( !model->HSM1_gidl1_Given ) model->HSM1_gidl1 = 0.0 ;
|
if ( !model->HSM1_gidl1_Given ) {
|
||||||
if ( !model->HSM1_gidl2_Given ) model->HSM1_gidl2 = 0.0 ;
|
if (model->HSM1_version == 101) model->HSM1_gidl1 = 5.0e-3 ;
|
||||||
if ( !model->HSM1_gidl3_Given ) model->HSM1_gidl3 = 0.0 ;
|
else if (model->HSM1_version == 112 ||
|
||||||
if ( !model->HSM1_gleak1_Given ) model->HSM1_gleak1 = 0.0 ;
|
model->HSM1_version == 120) model->HSM1_gidl1 = 5.0e-6 ;
|
||||||
if ( !model->HSM1_gleak2_Given ) model->HSM1_gleak2 = 0.0 ;
|
}
|
||||||
if ( !model->HSM1_gleak3_Given ) model->HSM1_gleak3 = 0.0 ;
|
if ( !model->HSM1_gidl2_Given ) model->HSM1_gidl2 = 1.0e6 ;
|
||||||
if ( !model->HSM1_vzadd0_Given ) model->HSM1_vzadd0 = 1.0e-2 ;
|
if ( !model->HSM1_gidl3_Given ) model->HSM1_gidl3 = 300.0e-3 ;
|
||||||
if ( !model->HSM1_pzadd0_Given ) model->HSM1_pzadd0 = 1.0e-3 ;
|
if ( !model->HSM1_gleak1_Given ) {
|
||||||
if ( !model->HSM1_nftrp_Given ) model->HSM1_nftrp = 100e9 ;
|
if (model->HSM1_version == 101) model->HSM1_gleak1 = 0.01e6 ;
|
||||||
if ( !model->HSM1_nfalp_Given ) model->HSM1_nfalp = 2.00e-15 ;
|
else if (model->HSM1_version == 112 ||
|
||||||
|
model->HSM1_version == 120) model->HSM1_gleak1 = 10.0e3 ;
|
||||||
|
}
|
||||||
|
if ( !model->HSM1_gleak2_Given ) model->HSM1_gleak2 = 20.0e6 ;
|
||||||
|
if ( !model->HSM1_gleak3_Given ) model->HSM1_gleak3 = 300.0e-3 ;
|
||||||
|
if ( !model->HSM1_vzadd0_Given ) model->HSM1_vzadd0 = 10.0e-3 ;
|
||||||
|
if ( !model->HSM1_pzadd0_Given ) model->HSM1_pzadd0 = 5.0e-3 ;
|
||||||
|
if ( !model->HSM1_nftrp_Given ) model->HSM1_nftrp = 10e9 ;
|
||||||
|
if ( !model->HSM1_nfalp_Given ) model->HSM1_nfalp = 1.0e-16 ;
|
||||||
if ( !model->HSM1_cit_Given ) model->HSM1_cit = 0.0 ;
|
if ( !model->HSM1_cit_Given ) model->HSM1_cit = 0.0 ;
|
||||||
|
if ( model->HSM1_version == 120) { /* HiSIM1.2.0 */
|
||||||
|
if ( !model->HSM1_glpart1_Given ) model->HSM1_glpart1 = 1 ;
|
||||||
|
if ( !model->HSM1_glpart2_Given ) model->HSM1_glpart2 = 0.5 ;
|
||||||
|
if ( !model->HSM1_kappa_Given ) model->HSM1_kappa = 3.90 ;
|
||||||
|
if ( !model->HSM1_xdiffd_Given ) model->HSM1_xdiffd = 0.0;
|
||||||
|
if ( !model->HSM1_pthrou_Given ) model->HSM1_pthrou = 0.0;
|
||||||
|
if ( !model->HSM1_vdiffj_Given ) model->HSM1_vdiffj = 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
/* for flicker noise the same as BSIM3 */
|
/* for flicker noise the same as BSIM3 */
|
||||||
if ( !model->HSM1_ef_Given ) model->HSM1_ef = 0.0;
|
if ( !model->HSM1_ef_Given ) model->HSM1_ef = 0.0;
|
||||||
|
|
@ -188,10 +292,6 @@ int HSM1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* perform the parameter defaulting */
|
/* perform the parameter defaulting */
|
||||||
/*
|
|
||||||
if ( !here->HSM1_l_Given ) here->HSM1_l = 1.50e-4 ;
|
|
||||||
if ( !here->HSM1_w_Given ) here->HSM1_w = 5.55e-4 ;
|
|
||||||
*/
|
|
||||||
if ( !here->HSM1_l_Given ) here->HSM1_l = 5.0e-6 ;
|
if ( !here->HSM1_l_Given ) here->HSM1_l = 5.0e-6 ;
|
||||||
if ( !here->HSM1_w_Given ) here->HSM1_w = 5.0e-6 ;
|
if ( !here->HSM1_w_Given ) here->HSM1_w = 5.0e-6 ;
|
||||||
if ( !here->HSM1_m_Given ) here->HSM1_m = 1;
|
if ( !here->HSM1_m_Given ) here->HSM1_m = 1;
|
||||||
|
|
@ -208,9 +308,8 @@ int HSM1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
||||||
if ( !here->HSM1_icVDS_Given ) here->HSM1_icVDS = 0.0;
|
if ( !here->HSM1_icVDS_Given ) here->HSM1_icVDS = 0.0;
|
||||||
if ( !here->HSM1_icVGS_Given ) here->HSM1_icVGS = 0.0;
|
if ( !here->HSM1_icVGS_Given ) here->HSM1_icVGS = 0.0;
|
||||||
|
|
||||||
/* added by K.M. */
|
here->HSM1_weff = here->HSM1_w - 2.0e0 * model->HSM1_xdiffd - 2.0e0 * model->HSM1_xwd ;
|
||||||
here->HSM1_weff = here->HSM1_w - 2.0e0 * model->HSM1_dw;
|
here->HSM1_leff = here->HSM1_l - 2.0e0 * model->HSM1_xpolyd - 2.0e0 * model->HSM1_xld ;
|
||||||
here->HSM1_leff = here->HSM1_l - 2.0e0 * model->HSM1_dl;
|
|
||||||
|
|
||||||
/* process source/drain series resistance added by K.M. */
|
/* process source/drain series resistance added by K.M. */
|
||||||
/* Drain and source conductances are always zero,
|
/* Drain and source conductances are always zero,
|
||||||
|
|
@ -316,7 +415,6 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
|
||||||
return(OK);
|
return(OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
HSM1unsetup (GENmodel *inModel, CKTcircuit *ckt)
|
HSM1unsetup (GENmodel *inModel, CKTcircuit *ckt)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,13 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1temp.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1temp.c of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "smpdefs.h"
|
#include "smpdefs.h"
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
|
|
@ -21,15 +16,20 @@
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
int HSM1temp(GENmodel *inModel, CKTcircuit *ckt)
|
int
|
||||||
|
HSM1temp(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
{
|
{
|
||||||
/* "ckt->CKTtemp" dependence of HiSIM parameters is treated all in
|
/* "ckt->CKTtemp" dependence of HiSIM parameters is treated all in
|
||||||
* HSM1evaluate1_0/1_1(). So there is no task in HSM1temp().
|
* HSM1evaluate102/112/120(). So there is no task in HSM1temp().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/* PN:
|
||||||
|
* Hope the temp dependence treated in the evaluate function does
|
||||||
|
* not break the parallel code. Parallel code structure here suggests:
|
||||||
|
|
||||||
if (here->HSM1owner != ARCHme)
|
if (here->HSM1owner != ARCHme)
|
||||||
continue;
|
continue;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
return(OK);
|
return(OK);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,28 +1,24 @@
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
HiSIM v1.1.0
|
HiSIM (Hiroshima University STARC IGFET Model)
|
||||||
File: hsm1trunc.c of HiSIM v1.1.0
|
Copyright (C) 2003 STARC
|
||||||
|
|
||||||
Copyright (C) 2002 STARC
|
VERSION : HiSIM 1.2.0
|
||||||
|
FILE : hsm1trunc of HiSIM 1.2.0
|
||||||
|
|
||||||
June 30, 2002: developed by Hiroshima University and STARC
|
April 9, 2003 : released by STARC Physical Design Group
|
||||||
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Modified by Paolo Nenzi 2002
|
|
||||||
* ngspice integration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
#include "hsm1def.h"
|
#include "hsm1def.h"
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
int HSM1trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep)
|
int
|
||||||
|
HSM1trunc(GENmodel *inModel, register CKTcircuit *ckt, double *timeStep)
|
||||||
{
|
{
|
||||||
HSM1model *model = (HSM1model*)inModel;
|
register HSM1model *model = (HSM1model*)inModel;
|
||||||
HSM1instance *here;
|
register HSM1instance *here;
|
||||||
#ifdef STEPDEBUG
|
#ifdef STEPDEBUG
|
||||||
double debugtemp;
|
double debugtemp;
|
||||||
#endif /* STEPDEBUG */
|
#endif /* STEPDEBUG */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue