Hisim model import.

This commit is contained in:
pnenzi 2003-08-11 20:13:47 +00:00
parent 9c438c1a45
commit 6df3c20240
27 changed files with 14464 additions and 0 deletions

View File

@ -0,0 +1,37 @@
## Process this file with automake to produce Makefile.in
noinst_LIBRARIES = libhisim.a
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
INCLUDES = -I$(top_srcdir)/src/include
MAINTAINERCLEANFILES = Makefile.in

View File

@ -0,0 +1,357 @@
/***********************************************************************
HiSIM v1.1.0
File: hisim.h of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#ifndef _HiSIM_H
#define _HiSIM_H
/*#define HiSIM_TIME 0*/
/* return value */
#ifndef OK
#define HiSIM_OK 0
#define HiSIM_ERROR 1
#else
#define HiSIM_OK OK
#define HiSIM_ERROR E_PANIC
#endif
/* MOS type */
#ifndef NMOS
#define NMOS 1
#define PMOS -1
#endif
/* device working mode */
#ifndef CMI_NORMAL_MODE
#define HiSIM_NORMAL_MODE 1
#define HiSIM_REVERSE_MODE -1
#else
#define HiSIM_NORMAL_MODE CMI_NORMAL_MODE
#define HiSIM_REVERSE_MODE CMI_REVERSE_MODE
#endif
/* others */
#ifndef NULL
#define NULL 0
#endif
#define HiSIM_FALSE 0
#define HiSIM_TRUE 1
/*-------------------------------------------------------------------*
* Structure for inputs of hisim.
*----------------*/
typedef struct sHiSIM_input {
/* Flags that must be set in parent routines. */
int type ; /* MOS type (1:NMOS, -1:PMOS) */
int mode ; /* MOS mode (1:normal, -1:reverse) */
int qflag ; /* qflag (toggle for charge calc. Unused!) */
int has_prv ; /* 1 if previous values are held. */
/* Bias conditions */
double vbs ; /* Vbs [V] */
double vds ; /* Vds [V] */
double vgs ; /* Vgs [V] */
/* frequency [Hz] */
double freq ;
/* Control options that can be set in a model parameter set. */
int info ; /* information level (for debug, etc.) */
int corsrd ; /* solve equations accounting Rs and Rd. */
int coiprv ; /* use ids_prv as initial guess of Ids */
int copprv ; /* use ps{0/l}_prv as initial guess of Ps{0/l} */
int cocgso ; /* calculate cgso */
int cocgdo ; /* calculate cgdo */
int cocgbo ; /* calculate cgbo */
int coadov ; /* add overlap to intrisic */
int coxx08 ; /* spare */
int coxx09 ; /* spare */
int coisub ; /* calculate isub */
int coiigs ; /* calculate igs */
int cogidl ; /* calculate ilg */
int coovlp ; /* calculate overlap charge */
int conois ; /* calculate 1/f noise */
int coisti ; /* calculate STI */
/* Previous values that may be used as initial guesses */
/* - derivatives are ones w.r.t. internal biases. */
double vbsc_prv ;
double vdsc_prv ;
double vgsc_prv ;
double ps0_prv ;
double ps0_dvbs_prv ;
double ps0_dvds_prv ;
double ps0_dvgs_prv ;
double pds_prv ;
double pds_dvbs_prv ;
double pds_dvds_prv ;
double pds_dvgs_prv ;
double ids_prv ;
double ids_dvbs_prv ;
double ids_dvds_prv ;
double ids_dvgs_prv ;
/* for noise calc. */
double nfc ;
/* Device instances */
double xl ; /* channel length [m] (L=xl-xld) */
double xw ; /* channel width [m] (W=xw-xwd) */
double ad ; /* area of drain diffusion [m^2] */
double as ; /* area of source diffusion [m^2] */
double pd ; /* perimeter of drain junction [m] */
double ps ; /* perimeter of source junction [m] */
double nrd ; /* equivalent num of squares of drain [-] (unused) */
double nrs ; /* equivalent num of squares of source [-] (unused) */
double temp ; /* lattice temperature [K] */
/* Model parameters */
double vmax ; /* saturation velocity [cm/s] */
double bgtmp1 ; /* first order temp. coeff. for band gap [V/K] */
double bgtmp2 ; /* second order temp. coeff. for band gap [V/K^2] */
double tox ; /* oxide thickness [m] */
double xld ; /* lateral diffusion of S/D under the gate [m] */
double xwd ; /* lateral diffusion along the width dir. [m] */
double xj ; /* HiSIM1.0 [m] */
double xqy ; /* HiSIM1.1 [m] */
/*--*/
double rd ; /* drain contact resistance [ohm m] */
double rs ; /* source contact resistance [ohm m] */
/**/
double vfbc ; /* constant part of Vfb [V] */
double nsubc ; /* constant part of Nsub [1/cm^3] */
double parl1 ; /* factor for L dependency of dVthSC [-] */
double parl2 ; /* under diffusion [m] */
double lp ; /* length of pocket potential [m] */
double nsubp ; /* [1/cm^3] */
double scp1 ; /* parameter for pocket [1/V] */
double scp2 ; /* parameter for pocket [1/V^2] */
double scp3 ; /* parameter for pocket [m/V^2] */
double sc1 ; /* parameter for SCE [1/V] */
double sc2 ; /* parameter for SCE [1/V^2] */
double sc3 ; /* parameter for SCE [m/V^2] */
double pgd1 ; /* parameter for gate-poly depletion [V] */
double pgd2 ; /* parameter for gate-poly depletion [V] */
double pgd3 ; /* parameter for gate-poly depletion [-] */
/**/
double ndep ; /* coeff. of Qbm for Eeff [-] */
double ninv ; /* coeff. of Qnm for Eeff [-] */
double ninvd ; /* parameter for universal mobility [1/V] */
double muecb0 ; /* const. part of coulomb scattering [cm^2/Vs] */
double muecb1 ; /* coeff. for coulomb scattering [cm^2/Vs] */
double mueph0 ; /* power of Eeff for phonon scattering [-] */
double mueph1 ;
double mueph2 ;
double w0 ;
double muesr0 ; /* power of Eeff for S.R. scattering [-] */
double muesr1 ; /* coeff. for S.R. scattering [-] */
double muetmp ; /* parameter for mobility [-] */
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 sub2 ; /* parameter for Isub [V] */
double sub3 ; /* parameter for Isub [-] */
/**/
double wvthsc ; /* parameter for STI [-] HiSIM1.1 */
double nsti ; /* parameter for STI [1/cm^3] HiSIM1.1 */
double wsti ; /* parameter for STI [m] HiSIM1.1 */
/**/
double cgso ; /* G-S overlap capacitance per unit W [F/m] */
double cgdo ; /* G-D overlap capacitance per unit W [F/m] */
double cgbo ; /* G-B overlap capacitance per unit L [F/m] */
/**/
double tpoly ; /* hight of poly gate [m] */
/**/
double js0 ; /* Saturation current density [A/m^2] */
double js0sw ; /* Side wall saturation current density [A/m] */
double nj ; /* Emission coefficient */
double njsw ; /* Emission coefficient (sidewall) */
double xti ; /* Junction current temparature exponent coefficient */
double cj ; /* Bottom junction capacitance per unit area
at zero bias [F/m^2]*/
double cjsw ; /* Source/drain sidewall junction capacitance grading
coefficient per unit length at zero bias [F/m] */
double cjswg ; /* Source/drain gate sidewall junction capacitance
per unit length at zero bias [F/m] */
double mj ; /* Bottom junction capacitance grading coefficient */
double mjsw ; /* Source/drain sidewall junction capacitance grading
coefficient */
double mjswg ; /* Source/drain gate sidewall junction capacitance grading
coefficient */
double pb ; /* Bottom junction build-in potential [V] */
double pbsw ; /* Source/drain sidewall junction build-in potential [V] */
double pbswg ; /* Source/drain gate sidewall junction build-in potential [V] */
double xpolyd ; /* parameter for Cov [m] */
/**/
double clm1 ; /* parameter for CLM [-] */
double clm2 ; /* parameter for CLM [1/m] */
double clm3 ; /* parameter for CLM [-] */
/**/
double rpock1 ; /* parameter for Ids [V] */
double rpock2 ; /* parameter for Ids [V^2 sqrt(m)/A] */
double rpocp1 ; /* parameter for Ids [-] HiSIM1.1 */
double rpocp2 ; /* parameter for Ids [-] HiSIM1.1 */
/**/
double vover ; /* parameter for overshoot [m^{voverp}]*/
double voverp ; /* parameter for overshoot [-] */
double wfc ; /* parameter for narrow channel effect [m*F/(cm^2)]*/
double qme1 ; /* parameter for quantum effect [mV]*/
double qme2 ; /* parameter for quantum effect [V]*/
double qme3 ; /* parameter for quantum effect [m]*/
double gidl1 ; /* parameter for GIDL [?] */
double gidl2 ; /* parameter for GIDL [?] */
double gidl3 ; /* parameter for GIDL [?] */
double gleak1 ; /* parameter for gate current [?] */
double gleak2 ; /* parameter for gate current [?] */
double gleak3 ; /* parameter for gate current [?] */
/**/
double vzadd0 ; /* Vzadd at Vds=0 [V] */
double pzadd0 ; /* Pzadd at Vds=0 [V] */
double nftrp ;
double nfalp ;
double cit ;
double gmin ; /* gmin = minimam conductance of SPICE3 K.M. */
} HiSIM_input ;
/*-------------------------------------------------------------------*
* structure for outputs of hisim.
*----------------*/
typedef struct sHiSIM_output {
double ids ; /* channel current [A] */
double gds ; /* channel conductance (dIds/dVds) [S] */
double gm ; /* trans conductance (dIds/dVgs) [S] */
double gmbs ; /* substrate trans conductance (dIds/dVbs) [S] */
/**/
double gd ; /* parasitic drain conductance [S] */
double gs ; /* parasitic source conductance [S] */
/**/
double cgso ; /* G-S overlap capacitance [F] */
double cgdo ; /* G-D overlap capacitance [F] */
double cgbo ; /* G-B overlap capacitance [F] */
/**/
double von ; /* Vth [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 ibd ; /* substrate drain leakage current [A] */
double gbs ; /* substrate source conductance [S] */
double gbd ; /* substrate drain conductance [S] */
/**/
double capbs ; /* substrate source capacitance [F] */
double capbd ; /* substrate drain capacitance [F] */
double qbs ; /* substrate source charge [C] */
double qbd ; /* substrate drain charge [C] */
/**/
double isub ; /* substrate impact ionization current [A] */
double gbgs ; /* substrate trans conductance (dIsub/dVgs) [S] */
double gbds ; /* substrate trans conductance (dIsub/dVds) [S] */
double gbbs ; /* substrate trans conductance (dIsub/dVbs) [S] */
/**/
double qg ; /* intrinsic gate charge [C] */
double qd ; /* intrinsic drain charge [C] */
double qs ; /* intrinsic source charge [C] */
/**/
double cggb ; /* intrinsic gate capacitance w.r.t. gate [F] */
double cgdb ; /* intrinsic gate capacitance w.r.t. drain [F] */
double cgsb ; /* intrinsic gate capacitance w.r.t. source [F] */
double cbgb ; /* intrinsic bulk capacitance w.r.t. gate [F] */
double cbdb ; /* intrinsic bulk capacitance w.r.t. drain [F] */
double cbsb ; /* intrinsic bulk capacitance w.r.t. source [F] */
double cdgb ; /* intrinsic drain capacitance w.r.t. gate [F] */
double cddb ; /* intrinsic drain capacitance w.r.t. drain [F] */
double cdsb ; /* intrinsic drain capacitance w.r.t. source [F] */
/**/
double igs ; /* gate current due to tunneling [A] */
double gggs ; /* trans conductance (dIgs/dVgs) [S] */
double ggds ; /* trans conductance (dIgs/dVds) [S] */
double ggbs ; /* trans conductance (dIgs/dVbs) [S] */
/**/
double ilg ; /* gate induced drain leakage [A] */
double glgs ; /* trans conductance (dIlg/dVgs) [S] */
double glds ; /* trans conductance (dIlg/dVds) [S] */
double glbs ; /* trans conductance (dIlg/dVbs) [S] */
/**/
double nois_idsfl ;
double nois_ird ;
double nois_irs ;
double nois_idsth ;
/**/
/* Outputs that may be used as initial guesses in the next calling */
double vbsc ;
double vdsc ;
double vgsc ;
double ps0 ;
double ps0_dvbs ;
double ps0_dvds ;
double ps0_dvgs ;
double pds ;
double pds_dvbs ;
double pds_dvds ;
double pds_dvgs ;
double ids_dvbs ;
double ids_dvds ;
double ids_dvgs ;
/* for noise calc. */
double nf ;
/* mobility added by K.M. */
double mu ;
} HiSIM_output ;
/*-------------------------------------------------------------------*
* structure for messengers to/from hisim.
*----------------*/
typedef struct sHiSIM_messenger {
int ims[20] ;
double dms[50] ;
/* Control options for alpha versions */
int opt_ntn ;
int opt_psl ;
int opt_rsc ;
int opt_sce ;
int opt_mbl ;
int opt_dp0 ;
int opt_inv ;
int opt_bas ;
int opt_01 ;
int opt_02 ;
int opt_03 ;
int opt_04 ;
int opt_05 ;
} HiSIM_messenger ;
/* note: -----------------------------------
* if HiSIM_TEST is defined.
* ims[ 1 ] :(in) =1: output physical capacitances instead of ones
* referenced to bulk.
* ims[11-12] , dms[11-39] :(ot) additional outputs.
* if CMI_OK is defined.
* dms[ 1 ] :(in) timepoint.
-------------------------------------------*/
#endif /* _HiSIM_H */

View File

@ -0,0 +1,166 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "devdefs.h"
#include "hsm1def.h"
#include "suffix.h"
IFparm HSM1pTable[] = { /* parameters */
IOP( "l", HSM1_L, IF_REAL , "Length"),
IOP( "w", HSM1_W, IF_REAL , "Width"),
IOP( "m", HSM1_M, IF_REAL , "Parallel multiplier"),
IOP( "ad", HSM1_AD, IF_REAL , "Drain area"),
IOP( "as", HSM1_AS, IF_REAL , "Source area"),
IOP( "pd", HSM1_PD, IF_REAL , "Drain perimeter"),
IOP( "ps", HSM1_PS, IF_REAL , "Source perimeter"),
IOP( "nrd", HSM1_NRD, IF_REAL , "Number of squares in drain"),
IOP( "nrs", HSM1_NRS, IF_REAL , "Number of squares in source"),
IOP( "temp", HSM1_TEMP, IF_REAL , "Lattice temperature"),
IOP( "dtemp", HSM1_DTEMP,IF_REAL , ""),
IOP( "off", HSM1_OFF, IF_FLAG , "Device is initially off"),
IP ( "ic", HSM1_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages")
};
IFparm HSM1mPTable[] = { /* model parameters */
IP("nmos", HSM1_MOD_NMOS, IF_FLAG, ""),
IP("pmos", HSM1_MOD_PMOS, IF_FLAG, ""),
IOP("level", HSM1_MOD_LEVEL, IF_INTEGER, ""),
IOP("info", HSM1_MOD_INFO, IF_INTEGER, "information level (for debug, etc.)"),
IOP("noise", HSM1_MOD_NOISE, IF_INTEGER, "noise model selector"),
IOP("version", HSM1_MOD_VERSION, IF_INTEGER, "model version 100 or 110"),
IOP("show", HSM1_MOD_SHOW, IF_INTEGER, "show physical value"),
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("copprv", HSM1_MOD_COPPRV, IF_INTEGER, "use ps{0/l}_prv as initial guess of Ps{0/l}"),
IOP("cocgso", HSM1_MOD_COCGSO, IF_INTEGER, "calculate cgso"),
IOP("cocgdo", HSM1_MOD_COCGDO, IF_INTEGER, "calculate cgdo"),
IOP("cocgbo", HSM1_MOD_COCGBO, IF_INTEGER, "calculate cgbo"),
IOP("coadov", HSM1_MOD_COADOV, IF_INTEGER, "add overlap to intrisic"),
IOP("coxx08", HSM1_MOD_COXX08, IF_INTEGER, "spare"),
IOP("coxx09", HSM1_MOD_COXX09, IF_INTEGER, "spare"),
IOP("coisub", HSM1_MOD_COISUB, IF_INTEGER, "calculate isub"),
IOP("coiigs", HSM1_MOD_COIIGS, IF_INTEGER, "calculate igs"),
IOP("cogidl", HSM1_MOD_COGIDL, IF_INTEGER, "calculate ilg"),
IOP("coovlp", HSM1_MOD_COOVLP, IF_INTEGER, "calculate overlap charge"),
IOP("conois", HSM1_MOD_CONOIS, IF_INTEGER, "calculate 1/f noise"),
IOP("coisti", HSM1_MOD_COISTI, IF_INTEGER, "calculate STI HiSIM1.1"),
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("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("dl", HSM1_MOD_DL, 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("xld", HSM1_MOD_DL, IF_REAL, "lateral diffusion of S/D under the gate [m]"),
IOP("xwd", HSM1_MOD_DW, IF_REAL, "lateral diffusion along the width dir. [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("rd", HSM1_MOD_RD, IF_REAL, "drain contact resistance [ohm m]"),
IOP("vfbc", HSM1_MOD_VFBC, IF_REAL, "constant part of Vfb [V]"),
IOP("nsubc", HSM1_MOD_NSUBC, IF_REAL, "constant part of Nsub [1/cm^3]"),
IOP("parl1", HSM1_MOD_PARL1, IF_REAL, "factor for L dependency of dVthSC [-]"),
IOP("parl2", HSM1_MOD_PARL2, IF_REAL, "under diffusion [m]"),
IOP("lp", HSM1_MOD_LP, IF_REAL, "length of pocket potential [m]"),
IOP("nsubp", HSM1_MOD_NSUBP, IF_REAL, "[1/cm^3]"),
IOP("scp1", HSM1_MOD_SCP1, IF_REAL, "parameter for pocket [1/V]"),
IOP("scp2", HSM1_MOD_SCP2, IF_REAL, "parameter for pocket [1/V^2]"),
IOP("scp3", HSM1_MOD_SCP3, IF_REAL, "parameter for pocket [m/V^2]"),
IOP("sc1", HSM1_MOD_SC1, IF_REAL, "parameter for SCE [1/V]"),
IOP("sc2", HSM1_MOD_SC2, IF_REAL, "parameter for SCE [1/V^2]"),
IOP("sc3", HSM1_MOD_SC3, IF_REAL, "parameter for SCE [m/V^2]"),
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("pgd3", HSM1_MOD_PGD3, IF_REAL, "parameter for gate-poly depletion [-]"),
IOP("ndep", HSM1_MOD_NDEP, IF_REAL, "coeff. of Qbm for Eeff [-]"),
IOP("ninv", HSM1_MOD_NINV, IF_REAL, "coeff. of Qnm for Eeff [-]"),
IOP("ninvd", HSM1_MOD_NINVD, IF_REAL, "parameter for universal mobility [1/V]"),
IOP("muecb0", HSM1_MOD_MUECB0, IF_REAL, "const. part of coulomb scattering [cm^2/Vs]"),
IOP("muecb1", HSM1_MOD_MUECB1, IF_REAL, "coeff. for coulomb scattering [cm^2/Vs]"),
IOP("mueph0", HSM1_MOD_MUEPH0, IF_REAL, "power of Eeff for phonon scattering [-]"),
IOP("mueph1", HSM1_MOD_MUEPH1, IF_REAL, ""),
IOP("mueph2", HSM1_MOD_MUEPH2, IF_REAL, ""),
IOP("w0", HSM1_MOD_W0, IF_REAL, ""),
IOP("muesr0", HSM1_MOD_MUESR0, IF_REAL, "power of Eeff 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("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("sub2", HSM1_MOD_SUB2, IF_REAL, "parameter for Isub [V]"),
IOP("sub3", HSM1_MOD_SUB3, IF_REAL, "parameter for Isub [-]"),
IOP("wvthsc", HSM1_MOD_WVTHSC, IF_REAL, "parameter for STI [-] HiSIM1.1"),
IOP("nsti", HSM1_MOD_NSTI, IF_REAL, "parameter for STI [1/cm^3] HiSIM1.1"),
IOP("wsti", HSM1_MOD_WSTI, IF_REAL, "parameter for STI [m] HiSIM1.1"),
IOP("cgso", HSM1_MOD_CGSO, IF_REAL, "G-S overlap capacitance per unit W [F/m]"),
IOP("cgdo", HSM1_MOD_CGDO, IF_REAL, "G-D overlap capacitance per unit W [F/m]"),
IOP("cgbo", HSM1_MOD_CGBO, IF_REAL, "G-B overlap capacitance per unit L [F/m]"),
IOP("tpoly", HSM1_MOD_TPOLY, IF_REAL, "hight of poly gate [m]"),
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("nj", HSM1_MOD_NJ, IF_REAL, "Emission coefficient"),
IOP("njsw", HSM1_MOD_NJSW, IF_REAL, "Emission coefficient (sidewall)"),
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("cjsw", HSM1_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient per unit length at zero bias [F/m]"),
IOP("cjswg", HSM1_MOD_CJSWG, IF_REAL, "Source/drain gate sidewall junction capacitance per unit length at zero bias [F/m]"),
IOP("mj", HSM1_MOD_MJ, IF_REAL, "Bottom junction capacitance grading coefficient"),
IOP("mjsw", HSM1_MOD_MJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient"),
IOP("mjswg", HSM1_MOD_MJSWG, IF_REAL, "Source/drain gate sidewall junction capacitance grading coefficient"),
IOP("pb", HSM1_MOD_PB, IF_REAL, "Bottom junction build-in potential [V]"),
IOP("pbsw", HSM1_MOD_PBSW, IF_REAL, "Source/drain sidewall junction build-in potential [V]"),
IOP("pbswg", HSM1_MOD_PBSWG, IF_REAL, "Source/drain gate sidewall junction build-in potential [V]"),
IOP("xpolyd", HSM1_MOD_XPOLYD, IF_REAL, "parameter for Cov [m]"),
IOP("clm1", HSM1_MOD_CLM1, IF_REAL, "parameter for CLM [-]"),
IOP("clm2", HSM1_MOD_CLM2, IF_REAL, "parameter for CLM [1/m]"),
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("rpock2", HSM1_MOD_RPOCK2, IF_REAL, "parameter for Ids [V]"),
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("vover", HSM1_MOD_VOVER, IF_REAL, "parameter for overshoot [m^{voverp}]"),
IOP("voverp", HSM1_MOD_VOVERP, IF_REAL, "parameter for overshoot [-]"),
IOP("wfc", HSM1_MOD_WFC, IF_REAL, "parameter for narrow channel effect [m*F/(cm^2)]"),
IOP("qme1", HSM1_MOD_QME1, IF_REAL, "parameter for quantum effect [mV]"),
IOP("qme2", HSM1_MOD_QME2, IF_REAL, "parameter for quantum effect [V]"),
IOP("qme3", HSM1_MOD_QME3, IF_REAL, "parameter for quantum effect [m]"),
IOP("gidl1", HSM1_MOD_GIDL1, IF_REAL, "parameter for GIDL [?]"),
IOP("gidl2", HSM1_MOD_GIDL2, IF_REAL, "parameter for GIDL [?]"),
IOP("gidl3", HSM1_MOD_GIDL3, IF_REAL, "parameter for GIDL [?]"),
IOP("gleak1", HSM1_MOD_GLEAK1, IF_REAL, "parameter for gate current [?]"),
IOP("gleak2", HSM1_MOD_GLEAK2, IF_REAL, "parameter for gate current [?]"),
IOP("gleak3", HSM1_MOD_GLEAK3, IF_REAL, "parameter for gate current [?]"),
IOP("vzadd0", HSM1_MOD_VZADD0, IF_REAL, "Vzadd at Vds=0 [V]"),
IOP("pzadd0", HSM1_MOD_PZADD0, IF_REAL, "Pzadd at Vds=0 [V]"),
IOP("nftrp", HSM1_MOD_NFTRP, IF_REAL, ""),
IOP("nfalp", HSM1_MOD_NFALP, IF_REAL, ""),
IOP("cit", HSM1_MOD_CIT, IF_REAL, ""),
IOP( "ef", HSM1_MOD_EF, IF_REAL, "flicker noise frequency exponent"),
IOP( "af", HSM1_MOD_AF, IF_REAL, "flicker noise exponent"),
IOP( "kf", HSM1_MOD_KF, IF_REAL, "flicker noise coefficient")
};
char *HSM1names[] = {
"Drain",
"Gate",
"Source",
"Bulk"
};
int HSM1nSize = NUMELEMS(HSM1names);
int HSM1pTSize = NUMELEMS(HSM1pTable);
int HSM1mPTSize = NUMELEMS(HSM1mPTable);
int HSM1iSize = sizeof(HSM1instance);
int HSM1mSize = sizeof(HSM1model);

View File

@ -0,0 +1,183 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1acld.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "cktdefs.h"
#include "hsm1def.h"
#include "sperror.h"
#include "suffix.h"
int HSM1acLoad(GENmodel *inModel, CKTcircuit *ckt)
{
HSM1model *model = (HSM1model*)inModel;
HSM1instance *here;
double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb;
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb;
double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb, omega;
double cgso, cgdo, cgbo, FwdSum, RevSum, gm, gmbs;
double gbspsp, gbbdp, gbbsp, gbspg, gbspb;
double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp;
double m;
omega = ckt->CKTomega;
for ( ; model != NULL; model = model->HSM1nextModel ) {
for ( here = model->HSM1instances; here!= NULL;
here = here->HSM1nextInstance ) {
if (here->HSM1owner != ARCHme)
continue;
if ( here->HSM1_mode >= 0 ) {
gm = here->HSM1_gm;
gmbs = here->HSM1_gmbs;
FwdSum = gm + gmbs;
RevSum = 0.0;
gbbdp = -here->HSM1_gbds;
gbbsp = here->HSM1_gbds + here->HSM1_gbgs + here->HSM1_gbbs;
gbdpg = here->HSM1_gbgs;
gbdpb = here->HSM1_gbbs;
gbdpdp = here->HSM1_gbds;
gbdpsp = -(gbdpg + gbdpb + gbdpdp);
gbspdp = 0.0;
gbspg = 0.0;
gbspb = 0.0;
gbspsp = 0.0;
cggb = here->HSM1_cggb;
cgsb = here->HSM1_cgsb;
cgdb = here->HSM1_cgdb;
cbgb = here->HSM1_cbgb;
cbsb = here->HSM1_cbsb;
cbdb = here->HSM1_cbdb;
cdgb = here->HSM1_cdgb;
cdsb = here->HSM1_cdsb;
cddb = here->HSM1_cddb;
}
else {
gm = -here->HSM1_gm;
gmbs = -here->HSM1_gmbs;
FwdSum = 0.0;
RevSum = -(gm + gmbs);
gbbsp = -here->HSM1_gbds;
gbbdp = here->HSM1_gbds + here->HSM1_gbgs + here->HSM1_gbbs;
gbdpg = 0.0;
gbdpsp = 0.0;
gbdpb = 0.0;
gbdpdp = 0.0;
gbspg = here->HSM1_gbgs;
gbspsp = here->HSM1_gbds;
gbspb = here->HSM1_gbbs;
gbspdp = -(gbspg + gbspsp + gbspb);
cggb = here->HSM1_cggb;
cgsb = here->HSM1_cgdb;
cgdb = here->HSM1_cgsb;
cbgb = here->HSM1_cbgb;
cbsb = here->HSM1_cbdb;
cbdb = here->HSM1_cbsb;
cdgb = -(here->HSM1_cdgb + cggb + cbgb);
cdsb = -(here->HSM1_cddb + cgsb + cbsb);
cddb = -(here->HSM1_cdsb + cgdb + cbdb);
}
gdpr = here->HSM1drainConductance;
gspr = here->HSM1sourceConductance;
gds = here->HSM1_gds;
gbd = here->HSM1_gbd;
gbs = here->HSM1_gbs;
capbd = here->HSM1_capbd;
capbs = here->HSM1_capbs;
cgso = here->HSM1_cgso;
cgdo = here->HSM1_cgdo;
cgbo = here->HSM1_cgbo;
xcdgb = (cdgb - cgdo) * omega;
xcddb = (cddb + capbd + cgdo) * omega;
xcdsb = cdsb * omega;
xcsgb = -(cggb + cbgb + cdgb + cgso) * omega;
xcsdb = -(cgdb + cbdb + cddb) * omega;
xcssb = (capbs + cgso - (cgsb + cbsb + cdsb)) * omega;
xcggb = (cggb + cgdo + cgso + cgbo) * omega;
xcgdb = (cgdb - cgdo) * omega;
xcgsb = (cgsb - cgso) * omega;
xcbgb = (cbgb - cgbo) * omega;
xcbdb = (cbdb - capbd) * omega;
xcbsb = (cbsb - capbs) * omega;
*(here->HSM1GgPtr +1) += m * xcggb;
*(here->HSM1BbPtr +1) -= m * (xcbgb + xcbdb + xcbsb);
*(here->HSM1DPdpPtr +1) += m * xcddb;
*(here->HSM1SPspPtr +1) += m * xcssb;
*(here->HSM1GbPtr +1) -= m * (xcggb + xcgdb + xcgsb);
*(here->HSM1GdpPtr +1) += m * xcgdb;
*(here->HSM1GspPtr +1) += m * xcgsb;
*(here->HSM1BgPtr +1) += m * xcbgb;
*(here->HSM1BdpPtr +1) += m * xcbdb;
*(here->HSM1BspPtr +1) += m * xcbsb;
*(here->HSM1DPgPtr +1) += m * xcdgb;
*(here->HSM1DPbPtr +1) -= m * (xcdgb + xcddb + xcdsb);
*(here->HSM1DPspPtr +1) += m * xcdsb;
*(here->HSM1SPgPtr +1) += m * xcsgb;
*(here->HSM1SPbPtr +1) -= m * (xcsgb + xcsdb + xcssb);
*(here->HSM1SPdpPtr +1) += m * xcsdb;
*(here->HSM1DdPtr) += m * gdpr;
*(here->HSM1SsPtr) += m * gspr;
*(here->HSM1BbPtr) += m * (gbd + gbs - here->HSM1_gbbs);
*(here->HSM1DPdpPtr) += m * (gdpr + gds + gbd + RevSum + gbdpdp);
*(here->HSM1SPspPtr) += m * (gspr + gds + gbs + FwdSum + gbspsp);
*(here->HSM1DdpPtr) -= m * gdpr;
*(here->HSM1SspPtr) -= m * gspr;
*(here->HSM1BgPtr) -= m * here->HSM1_gbgs;
*(here->HSM1BdpPtr) -= m * (gbd - gbbdp);
*(here->HSM1BspPtr) -= m * (gbs - gbbsp);
*(here->HSM1DPdPtr) -= m * gdpr;
*(here->HSM1DPgPtr) += m * (gm + gbdpg);
*(here->HSM1DPbPtr) -= m * (gbd - gmbs - gbdpb);
*(here->HSM1DPspPtr) -= m * (gds + FwdSum - gbdpsp);
*(here->HSM1SPgPtr) -= m * (gm - gbspg);
*(here->HSM1SPsPtr) -= m * gspr;
*(here->HSM1SPbPtr) -= m * (gbs + gmbs - gbspb);
*(here->HSM1SPdpPtr) -= m * (gds + RevSum - gbspdp);
/*
... just for the case ...
*(here->HSM1GgPtr) -= m * xgtg;
*(here->HSM1GbPtr) -= m * xgtb;
*(here->HSM1GdpPtr) -= m * xgtd;
*(here->HSM1GspPtr) -= m * xgts;
*/
}
}
return(OK);
}

View File

@ -0,0 +1,231 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1ask.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "ifsim.h"
#include "cktdefs.h"
#include "devdefs.h"
#include "hsm1def.h"
#include "sperror.h"
#include "suffix.h"
int HSM1ask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value,
IFvalue *select)
{
HSM1instance *here = (HSM1instance*)inst;
switch (which) {
case HSM1_L:
value->rValue = here->HSM1_l;
return(OK);
case HSM1_W:
value->rValue = here->HSM1_w;
return(OK);
case HSM1_M:
value->rValue = here->HSM1_m;
return(OK);
case HSM1_AS:
value->rValue = here->HSM1_as;
return(OK);
case HSM1_AD:
value->rValue = here->HSM1_ad;
return(OK);
case HSM1_PS:
value->rValue = here->HSM1_ps;
return(OK);
case HSM1_PD:
value->rValue = here->HSM1_pd;
return(OK);
case HSM1_NRS:
value->rValue = here->HSM1_nrs;
return(OK);
case HSM1_NRD:
value->rValue = here->HSM1_nrd;
return(OK);
case HSM1_TEMP:
value->rValue = here->HSM1_temp;
return(OK);
case HSM1_DTEMP:
value->rValue = here->HSM1_dtemp;
return(OK);
case HSM1_OFF:
value->iValue = here->HSM1_off;
return(OK);
case HSM1_IC_VBS:
value->rValue = here->HSM1_icVBS;
return(OK);
case HSM1_IC_VDS:
value->rValue = here->HSM1_icVDS;
return(OK);
case HSM1_IC_VGS:
value->rValue = here->HSM1_icVGS;
return(OK);
case HSM1_DNODE:
value->iValue = here->HSM1dNode;
return(OK);
case HSM1_GNODE:
value->iValue = here->HSM1gNode;
return(OK);
case HSM1_SNODE:
value->iValue = here->HSM1sNode;
return(OK);
case HSM1_BNODE:
value->iValue = here->HSM1bNode;
return(OK);
case HSM1_DNODEPRIME:
value->iValue = here->HSM1dNodePrime;
return(OK);
case HSM1_SNODEPRIME:
value->iValue = here->HSM1sNodePrime;
return(OK);
case HSM1_SOURCECONDUCT:
value->rValue = here->HSM1sourceConductance;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_DRAINCONDUCT:
value->rValue = here->HSM1drainConductance;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_VBD:
value->rValue = *(ckt->CKTstate0 + here->HSM1vbd);
return(OK);
case HSM1_VBS:
value->rValue = *(ckt->CKTstate0 + here->HSM1vbs);
return(OK);
case HSM1_VGS:
value->rValue = *(ckt->CKTstate0 + here->HSM1vgs);
return(OK);
case HSM1_VDS:
value->rValue = *(ckt->CKTstate0 + here->HSM1vds);
return(OK);
case HSM1_CD:
value->rValue = here->HSM1_ids;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CBS:
value->rValue = here->HSM1_ibs;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CBD:
value->rValue = here->HSM1_ibs;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_GM:
value->rValue = here->HSM1_gm;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_GDS:
value->rValue = here->HSM1_gds;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_GMBS:
value->rValue = here->HSM1_gmbs;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_GBD:
value->rValue = here->HSM1_gbd;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_GBS:
value->rValue = here->HSM1_gbs;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_QB:
value->rValue = *(ckt->CKTstate0 + here->HSM1qb);
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CQB:
value->rValue = *(ckt->CKTstate0 + here->HSM1cqb);
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_QG:
value->rValue = *(ckt->CKTstate0 + here->HSM1qg);
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CQG:
value->rValue = *(ckt->CKTstate0 + here->HSM1cqg);
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_QD:
value->rValue = *(ckt->CKTstate0 + here->HSM1qd);
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CQD:
value->rValue = *(ckt->CKTstate0 + here->HSM1cqd);
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CGG:
value->rValue = here->HSM1_cggb;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CGD:
value->rValue = here->HSM1_cgdb;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CGS:
value->rValue = here->HSM1_cgsb;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CDG:
value->rValue = here->HSM1_cdgb;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CDD:
value->rValue = here->HSM1_cddb;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CDS:
value->rValue = here->HSM1_cdsb;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CBG:
value->rValue = here->HSM1_cbgb;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CBDB:
value->rValue = here->HSM1_cbdb;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CBSB:
value->rValue = here->HSM1_cbsb;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CAPBD:
value->rValue = here->HSM1_capbd;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_CAPBS:
value->rValue = here->HSM1_capbs;
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_VON:
value->rValue = here->HSM1_von;
return(OK);
case HSM1_VDSAT:
value->rValue = here->HSM1_vdsat;
return(OK);
case HSM1_QBS:
value->rValue = *(ckt->CKTstate0 + here->HSM1qbs);
value->rValue *= here->HSM1_m;
return(OK);
case HSM1_QBD:
value->rValue = *(ckt->CKTstate0 + here->HSM1qbd);
value->rValue *= here->HSM1_m;
return(OK);
default:
return(E_BADPARM);
}
/* NOTREACHED */
}

View File

@ -0,0 +1,106 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1cvtest.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "cktdefs.h"
#include "hsm1def.h"
#include "trandefs.h"
#include "const.h"
#include "devdefs.h"
#include "sperror.h"
#include "suffix.h"
int HSM1convTest(GENmodel *inModel, CKTcircuit *ckt)
{
HSM1model *model = (HSM1model*)inModel;
HSM1instance *here;
double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds;
double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs;
/* loop through all the HSM1 device models */
for ( ; model != NULL; model = model->HSM1nextModel ) {
/* loop through all the instances of the model */
for ( here = model->HSM1instances; here != NULL ;
here = here->HSM1nextInstance ) {
if (here->HSM1owner != ARCHme)
continue;
vbs = model->HSM1_type *
(*(ckt->CKTrhsOld+here->HSM1bNode) -
*(ckt->CKTrhsOld+here->HSM1sNodePrime));
vgs = model->HSM1_type *
(*(ckt->CKTrhsOld+here->HSM1gNode) -
*(ckt->CKTrhsOld+here->HSM1sNodePrime));
vds = model->HSM1_type *
(*(ckt->CKTrhsOld+here->HSM1dNodePrime) -
*(ckt->CKTrhsOld+here->HSM1sNodePrime));
vbd = vbs - vds;
vgd = vgs - vds;
vgdo = *(ckt->CKTstate0 + here->HSM1vgs) -
*(ckt->CKTstate0 + here->HSM1vds);
delvbs = vbs - *(ckt->CKTstate0 + here->HSM1vbs);
delvbd = vbd - *(ckt->CKTstate0 + here->HSM1vbd);
delvgs = vgs - *(ckt->CKTstate0 + here->HSM1vgs);
delvds = vds - *(ckt->CKTstate0 + here->HSM1vds);
delvgd = vgd - vgdo;
cd = here->HSM1_ids - here->HSM1_ibd;
if ( here->HSM1_mode >= 0 ) {
cd += here->HSM1_isub;
cdhat = cd - here->HSM1_gbd * delvbd
+ (here->HSM1_gmbs + here->HSM1_gbbs) * delvbs
+ (here->HSM1_gm + here->HSM1_gbgs) * delvgs
+ (here->HSM1_gds + here->HSM1_gbds) * delvds;
}
else {
cdhat = cd + (here->HSM1_gmbs - here->HSM1_gbd) * delvbd
+ here->HSM1_gm * delvgd - here->HSM1_gds * delvds;
}
/*
* check convergence
*/
if ( here->HSM1_off == 0 || !(ckt->CKTmode & MODEINITFIX) ) {
tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(cd)) + ckt->CKTabstol;
if ( fabs(cdhat - cd) >= tol ) {
ckt->CKTnoncon++;
return(OK);
}
cbs = here->HSM1_ibs;
cbd = here->HSM1_ibd;
if ( here->HSM1_mode >= 0 ) {
cbhat = cbs + cbd - here->HSM1_isub + here->HSM1_gbd * delvbd
+ (here->HSM1_gbs - here->HSM1_gbbs) * delvbs
- here->HSM1_gbgs * delvgs - here->HSM1_gbds * delvds;
}
else {
cbhat = cbs + cbd - here->HSM1_isub
+ here->HSM1_gbs * delvbs
+ (here->HSM1_gbd - here->HSM1_gbbs) * delvbd
- here->HSM1_gbgs * delvgd + here->HSM1_gbds * delvds;
}
tol = ckt->CKTreltol *
MAX(fabs(cbhat), fabs(cbs + cbd - here->HSM1_isub)) + ckt->CKTabstol;
if ( fabs(cbhat - (cbs + cbd - here->HSM1_isub)) > tol ) {
ckt->CKTnoncon++;
return(OK);
}
}
}
}
return(OK);
}

View File

@ -0,0 +1,694 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1def.h of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#ifndef HSM1
#define HSM1
#include "ifsim.h"
#include "gendefs.h"
#include "cktdefs.h"
#include "complex.h"
#include "noisedef.h"
/* declarations for HiSIM1 MOSFETs */
/* information needed for each instance */
typedef struct sHSM1instance {
struct sHSM1model *HSM1modPtr; /* pointer to model */
struct sHSM1instance *HSM1nextInstance; /* pointer to next instance of
current model*/
IFuid HSM1name; /* pointer to character string naming this instance */
int HSM1owner; /* number of owner process */
int HSM1states; /* index into state table for this device */
int HSM1dNode; /* number of the drain node of the mosfet */
int HSM1gNode; /* number of the gate node of the mosfet */
int HSM1sNode; /* number of the source node of the mosfet */
int HSM1bNode; /* number of the bulk node of the mosfet */
int HSM1dNodePrime; /* number od the inner drain node */
int HSM1sNodePrime; /* number od the inner source node */
char HSM1_called[4]; /* string to check the first call */
/* previous values to evaluate initial guess */
double HSM1_vbsc_prv;
double HSM1_vdsc_prv;
double HSM1_vgsc_prv;
double HSM1_ps0_prv;
double HSM1_ps0_dvbs_prv;
double HSM1_ps0_dvds_prv;
double HSM1_ps0_dvgs_prv;
double HSM1_pds_prv;
double HSM1_pds_dvbs_prv;
double HSM1_pds_dvds_prv;
double HSM1_pds_dvgs_prv;
double HSM1_ids_prv;
double HSM1_ids_dvbs_prv;
double HSM1_ids_dvds_prv;
double HSM1_ids_dvgs_prv;
double HSM1_nfc; /* for noise calc. */
/* instance */
double HSM1_l; /* the length of the channel region */
double HSM1_w; /* the width of the channel region */
double HSM1_m; /* Parallel multiplier */
double HSM1_ad; /* the area of the drain diffusion */
double HSM1_as; /* the area of the source diffusion */
double HSM1_pd; /* perimeter of drain junction [m] */
double HSM1_ps; /* perimeter of source junction [m] */
double HSM1_nrd; /* equivalent num of squares of drain [-] (unused) */
double HSM1_nrs; /* equivalent num of squares of source [-] (unused) */
double HSM1_temp; /* lattice temperature [K] */
double HSM1_dtemp;
/* added by K.M. */
double HSM1_weff; /* the effectiv width of the channel region */
double HSM1_leff; /* the effectiv length of the channel region */
/* output */
int HSM1_capop;
double HSM1_gd;
double HSM1_gs;
double HSM1_cgso;
double HSM1_cgdo;
double HSM1_cgbo;
double HSM1_von; /* vth */
double HSM1_vdsat;
double HSM1_ids; /* cdrain, HSM1_cd */
double HSM1_gds;
double HSM1_gm;
double HSM1_gmbs;
double HSM1_ibs; /* HSM1_cbs */
double HSM1_ibd; /* HSM1_cbd */
double HSM1_gbs;
double HSM1_gbd;
double HSM1_capbs;
double HSM1_capbd;
/*
double HSM1_qbs;
double HSM1_qbd;
*/
double HSM1_capgs;
double HSM1_capgd;
double HSM1_capgb;
double HSM1_isub; /* HSM1_csub */
double HSM1_gbgs;
double HSM1_gbds;
double HSM1_gbbs;
double HSM1_qg;
double HSM1_qd;
/* double HSM1_qs; */
double HSM1_qb; /* bulk charge qb = -(qg + qd + qs) */
double HSM1_cggb;
double HSM1_cgdb;
double HSM1_cgsb;
double HSM1_cbgb;
double HSM1_cbdb;
double HSM1_cbsb;
double HSM1_cdgb;
double HSM1_cddb;
double HSM1_cdsb;
/* no use in SPICE3f5
double HSM1_nois_irs;
double HSM1_nois_ird;
double HSM1_nois_idsth;
double HSM1_nois_idsfl;
double HSM1_freq;
*/
/* added by K.M. */
double HSM1_mu; /* mobility */
/* no use in SPICE3f5
double HSM1drainSquares; the length of the drain in squares
double HSM1sourceSquares; the length of the source in squares */
double HSM1sourceConductance; /* cond. of source (or 0): set in setup */
double HSM1drainConductance; /* cond. of drain (or 0): set in setup */
double HSM1_icVBS; /* initial condition B-S voltage */
double HSM1_icVDS; /* initial condition D-S voltage */
double HSM1_icVGS; /* initial condition G-S voltage */
int HSM1_off; /* non-zero to indicate device is off for dc analysis */
int HSM1_mode; /* device mode : 1 = normal, -1 = inverse */
unsigned HSM1_l_Given :1;
unsigned HSM1_w_Given :1;
unsigned HSM1_m_Given :1;
unsigned HSM1_ad_Given :1;
unsigned HSM1_as_Given :1;
/* unsigned HSM1drainSquaresGiven :1;
unsigned HSM1sourceSquaresGiven :1;*/
unsigned HSM1_pd_Given :1;
unsigned HSM1_ps_Given :1;
unsigned HSM1_nrd_Given :1;
unsigned HSM1_nrs_Given :1;
unsigned HSM1_temp_Given :1;
unsigned HSM1_dtemp_Given :1;
unsigned HSM1dNodePrimeSet :1;
unsigned HSM1sNodePrimeSet :1;
unsigned HSM1_icVBS_Given :1;
unsigned HSM1_icVDS_Given :1;
unsigned HSM1_icVGS_Given :1;
/* pointer to sparse matrix */
double *HSM1DdPtr; /* pointer to sparse matrix element at
(Drain node,drain node) */
double *HSM1GgPtr; /* pointer to sparse matrix element at
(gate node,gate node) */
double *HSM1SsPtr; /* pointer to sparse matrix element at
(source node,source node) */
double *HSM1BbPtr; /* pointer to sparse matrix element at
(bulk node,bulk node) */
double *HSM1DPdpPtr; /* pointer to sparse matrix element at
(drain prime node,drain prime node) */
double *HSM1SPspPtr; /* pointer to sparse matrix element at
(source prime node,source prime node) */
double *HSM1DdpPtr; /* pointer to sparse matrix element at
(drain node,drain prime node) */
double *HSM1GbPtr; /* pointer to sparse matrix element at
(gate node,bulk node) */
double *HSM1GdpPtr; /* pointer to sparse matrix element at
(gate node,drain prime node) */
double *HSM1GspPtr; /* pointer to sparse matrix element at
(gate node,source prime node) */
double *HSM1SspPtr; /* pointer to sparse matrix element at
(source node,source prime node) */
double *HSM1BdpPtr; /* pointer to sparse matrix element at
(bulk node,drain prime node) */
double *HSM1BspPtr; /* pointer to sparse matrix element at
(bulk node,source prime node) */
double *HSM1DPspPtr; /* pointer to sparse matrix element at
(drain prime node,source prime node) */
double *HSM1DPdPtr; /* pointer to sparse matrix element at
(drain prime node,drain node) */
double *HSM1BgPtr; /* pointer to sparse matrix element at
(bulk node,gate node) */
double *HSM1DPgPtr; /* pointer to sparse matrix element at
(drain prime node,gate node) */
double *HSM1SPgPtr; /* pointer to sparse matrix element at
(source prime node,gate node) */
double *HSM1SPsPtr; /* pointer to sparse matrix element at
(source prime node,source node) */
double *HSM1DPbPtr; /* pointer to sparse matrix element at
(drain prime node,bulk node) */
double *HSM1SPbPtr; /* pointer to sparse matrix element at
(source prime node,bulk node) */
double *HSM1SPdpPtr; /* pointer to sparse matrix element at
(source prime node,drain prime node) */
/* common state values in hisim1 module */
#define HSM1vbd HSM1states+ 0
#define HSM1vbs HSM1states+ 1
#define HSM1vgs HSM1states+ 2
#define HSM1vds HSM1states+ 3
#define HSM1qb HSM1states+ 4
#define HSM1cqb HSM1states+ 5
#define HSM1qg HSM1states+ 6
#define HSM1cqg HSM1states+ 7
#define HSM1qd HSM1states+ 8
#define HSM1cqd HSM1states+ 9
#define HSM1qbs HSM1states+ 10
#define HSM1qbd HSM1states+ 11
#define HSM1numStates 12
/* indices to the array of HiSIM1 NOISE SOURCES (the same as BSIM3) */
#define HSM1RDNOIZ 0
#define HSM1RSNOIZ 1
#define HSM1IDNOIZ 2
#define HSM1FLNOIZ 3
#define HSM1TOTNOIZ 4
#define HSM1NSRCS 5 /* the number of HiSIM1 MOSFET noise sources */
#ifndef NONOISE
double HSM1nVar[NSTATVARS][HSM1NSRCS];
#else /* NONOISE */
double **HSM1nVar;
#endif /* NONOISE */
} HSM1instance ;
/* per model data */
typedef struct sHiSIM1model { /* model structure for a resistor */
int HSM1modType; /* type index of this device type */
struct sHiSIM1model *HSM1nextModel; /* pointer to next possible model
in linked list */
HSM1instance * HSM1instances; /* pointer to list of instances
that have this model */
IFuid HSM1modName; /* pointer to the name of this model */
int HSM1_type; /* device type: 1 = nmos, -1 = pmos */
int HSM1_level; /* level */
int HSM1_info; /* information */
int HSM1_noise; /* noise model selecter see hsm1noi.c */
int HSM1_version; /* model version 100/110 */
int HSM1_show; /* show physical value 1, 2, ... , 11 */
/* flags for initial guess */
int HSM1_corsrd ;
int HSM1_coiprv ;
int HSM1_copprv ;
int HSM1_cocgso ;
int HSM1_cocgdo ;
int HSM1_cocgbo ;
int HSM1_coadov ;
int HSM1_coxx08 ;
int HSM1_coxx09 ;
int HSM1_coisub ;
int HSM1_coiigs ;
int HSM1_cogidl ;
int HSM1_coovlp ;
int HSM1_conois ;
int HSM1_coisti ; /* HiSIM1.1 */
/* HiSIM original */
double HSM1_vmax ;
double HSM1_bgtmp1 ;
double HSM1_bgtmp2 ;
double HSM1_tox ;
double HSM1_dl ;
double HSM1_dw ;
double HSM1_xj ; /* HiSIM1.0 */
double HSM1_xqy ; /* HiSIM1.1 */
double HSM1_rs; /* source contact resistance */
double HSM1_rd; /* drain contact resistance */
double HSM1_vfbc ;
double HSM1_nsubc ;
double HSM1_parl1 ;
double HSM1_parl2 ;
double HSM1_lp ;
double HSM1_nsubp ;
double HSM1_scp1 ;
double HSM1_scp2 ;
double HSM1_scp3 ;
double HSM1_sc1 ;
double HSM1_sc2 ;
double HSM1_sc3 ;
double HSM1_pgd1 ;
double HSM1_pgd2 ;
double HSM1_pgd3 ;
double HSM1_ndep ;
double HSM1_ninv ;
double HSM1_ninvd ;
double HSM1_muecb0 ;
double HSM1_muecb1 ;
double HSM1_mueph1 ;
double HSM1_mueph0 ;
double HSM1_mueph2 ;
double HSM1_w0 ;
double HSM1_muesr1 ;
double HSM1_muesr0 ;
double HSM1_bb ;
double HSM1_vds0 ;
double HSM1_bc0 ;
double HSM1_bc1 ;
double HSM1_sub1 ;
double HSM1_sub2 ;
double HSM1_sub3 ;
double HSM1_wvthsc ; /* HiSIM1.1 */
double HSM1_nsti ; /* HiSIM1.1 */
double HSM1_wsti ; /* HiSIM1.1 */
double HSM1_cgso ;
double HSM1_cgdo ;
double HSM1_cgbo ;
double HSM1_tpoly ;
double HSM1_js0 ;
double HSM1_js0sw ;
double HSM1_nj ;
double HSM1_njsw ;
double HSM1_xti ;
double HSM1_cj ;
double HSM1_cjsw ;
double HSM1_cjswg ;
double HSM1_mj ;
double HSM1_mjsw ;
double HSM1_mjswg ;
double HSM1_pb ;
double HSM1_pbsw ;
double HSM1_pbswg ;
double HSM1_xpolyd ;
double HSM1_clm1 ;
double HSM1_clm2 ;
double HSM1_clm3 ;
double HSM1_muetmp ;
double HSM1_rpock1 ;
double HSM1_rpock2 ;
double HSM1_rpocp1 ; /* HiSIM 1.1 */
double HSM1_rpocp2 ; /* HiSIM 1.1 */
double HSM1_vover ;
double HSM1_voverp ;
double HSM1_wfc ;
double HSM1_qme1 ;
double HSM1_qme2 ;
double HSM1_qme3 ;
double HSM1_gidl1 ;
double HSM1_gidl2 ;
double HSM1_gidl3 ;
double HSM1_gleak1 ;
double HSM1_gleak2 ;
double HSM1_gleak3 ;
double HSM1_vzadd0 ;
double HSM1_pzadd0 ;
double HSM1_nftrp ;
double HSM1_nfalp ;
double HSM1_cit ;
/* for flicker noise of SPICE3 added by K.M. */
double HSM1_ef;
double HSM1_af;
double HSM1_kf;
/* flag for model */
unsigned HSM1_type_Given :1;
unsigned HSM1_level_Given :1;
unsigned HSM1_info_Given :1;
unsigned HSM1_noise_Given :1;
unsigned HSM1_version_Given :1;
unsigned HSM1_show_Given :1;
unsigned HSM1_corsrd_Given :1;
unsigned HSM1_coiprv_Given :1;
unsigned HSM1_copprv_Given :1;
unsigned HSM1_cocgso_Given :1;
unsigned HSM1_cocgdo_Given :1;
unsigned HSM1_cocgbo_Given :1;
unsigned HSM1_coadov_Given :1;
unsigned HSM1_coxx08_Given :1;
unsigned HSM1_coxx09_Given :1;
unsigned HSM1_coisub_Given :1;
unsigned HSM1_coiigs_Given :1;
unsigned HSM1_cogidl_Given :1;
unsigned HSM1_coovlp_Given :1;
unsigned HSM1_conois_Given :1;
unsigned HSM1_coisti_Given :1; /* HiSIM1.1 */
unsigned HSM1_vmax_Given :1;
unsigned HSM1_bgtmp1_Given :1;
unsigned HSM1_bgtmp2_Given :1;
unsigned HSM1_tox_Given :1;
unsigned HSM1_dl_Given :1;
unsigned HSM1_dw_Given :1;
unsigned HSM1_xj_Given :1; /* HiSIM1.0 */
unsigned HSM1_xqy_Given :1; /* HiSIM1.1 */
unsigned HSM1_rs_Given :1;
unsigned HSM1_rd_Given :1;
unsigned HSM1_vfbc_Given :1;
unsigned HSM1_nsubc_Given :1;
unsigned HSM1_parl1_Given :1;
unsigned HSM1_parl2_Given :1;
unsigned HSM1_lp_Given :1;
unsigned HSM1_nsubp_Given :1;
unsigned HSM1_scp1_Given :1;
unsigned HSM1_scp2_Given :1;
unsigned HSM1_scp3_Given :1;
unsigned HSM1_sc1_Given :1;
unsigned HSM1_sc2_Given :1;
unsigned HSM1_sc3_Given :1;
unsigned HSM1_pgd1_Given :1;
unsigned HSM1_pgd2_Given :1;
unsigned HSM1_pgd3_Given :1;
unsigned HSM1_ndep_Given :1;
unsigned HSM1_ninv_Given :1;
unsigned HSM1_ninvd_Given :1;
unsigned HSM1_muecb0_Given :1;
unsigned HSM1_muecb1_Given :1;
unsigned HSM1_mueph1_Given :1;
unsigned HSM1_mueph0_Given :1;
unsigned HSM1_mueph2_Given :1;
unsigned HSM1_w0_Given :1;
unsigned HSM1_muesr1_Given :1;
unsigned HSM1_muesr0_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_sub2_Given :1;
unsigned HSM1_sub3_Given :1;
unsigned HSM1_wvthsc_Given :1; /* HiSIM1.1 */
unsigned HSM1_nsti_Given :1; /* HiSIM1.1 */
unsigned HSM1_wsti_Given :1; /* HiSIM1.1 */
unsigned HSM1_cgso_Given :1;
unsigned HSM1_cgdo_Given :1;
unsigned HSM1_cgbo_Given :1;
unsigned HSM1_tpoly_Given :1;
unsigned HSM1_js0_Given :1;
unsigned HSM1_js0sw_Given :1;
unsigned HSM1_nj_Given :1;
unsigned HSM1_njsw_Given :1;
unsigned HSM1_xti_Given :1;
unsigned HSM1_cj_Given :1;
unsigned HSM1_cjsw_Given :1;
unsigned HSM1_cjswg_Given :1;
unsigned HSM1_mj_Given :1;
unsigned HSM1_mjsw_Given :1;
unsigned HSM1_mjswg_Given :1;
unsigned HSM1_pb_Given :1;
unsigned HSM1_pbsw_Given :1;
unsigned HSM1_pbswg_Given :1;
unsigned HSM1_xpolyd_Given :1;
unsigned HSM1_clm1_Given :1;
unsigned HSM1_clm2_Given :1;
unsigned HSM1_clm3_Given :1;
unsigned HSM1_muetmp_Given :1;
unsigned HSM1_rpock1_Given :1;
unsigned HSM1_rpock2_Given :1;
unsigned HSM1_rpocp1_Given :1; /* HiSIM1.1 */
unsigned HSM1_rpocp2_Given :1; /* HiSIM1.1 */
unsigned HSM1_vover_Given :1;
unsigned HSM1_voverp_Given :1;
unsigned HSM1_wfc_Given :1;
unsigned HSM1_qme1_Given :1;
unsigned HSM1_qme2_Given :1;
unsigned HSM1_qme3_Given :1;
unsigned HSM1_gidl1_Given :1;
unsigned HSM1_gidl2_Given :1;
unsigned HSM1_gidl3_Given :1;
unsigned HSM1_gleak1_Given :1;
unsigned HSM1_gleak2_Given :1;
unsigned HSM1_gleak3_Given :1;
unsigned HSM1_vzadd0_Given :1;
unsigned HSM1_pzadd0_Given :1;
unsigned HSM1_nftrp_Given :1;
unsigned HSM1_nfalp_Given :1;
unsigned HSM1_cit_Given :1;
unsigned HSM1_ef_Given :1;
unsigned HSM1_af_Given :1;
unsigned HSM1_kf_Given :1;
} HSM1model;
#ifndef NMOS
#define NMOS 1
#define PMOS -1
#endif /*NMOS*/
#define HSM1_BAD_PARAM -1
/* flags */
#define HSM1_MOD_NMOS 1
#define HSM1_MOD_PMOS 2
#define HSM1_MOD_LEVEL 3
#define HSM1_MOD_INFO 4
#define HSM1_MOD_NOISE 5
#define HSM1_MOD_VERSION 6
#define HSM1_MOD_SHOW 7
#define HSM1_MOD_CORSRD 11
#define HSM1_MOD_COIPRV 12
#define HSM1_MOD_COPPRV 13
#define HSM1_MOD_COCGSO 14
#define HSM1_MOD_COCGDO 15
#define HSM1_MOD_COCGBO 16
#define HSM1_MOD_COADOV 17
#define HSM1_MOD_COXX08 18
#define HSM1_MOD_COXX09 19
#define HSM1_MOD_COISUB 21
#define HSM1_MOD_COIIGS 22
#define HSM1_MOD_COGIDL 23
#define HSM1_MOD_COOVLP 24
#define HSM1_MOD_CONOIS 25
#define HSM1_MOD_COISTI 26 /* HiSIM1.1 */
/* device parameters */
#define HSM1_L 51
#define HSM1_W 52
#define HSM1_M 66
#define HSM1_AD 53
#define HSM1_AS 54
#define HSM1_PD 55
#define HSM1_PS 56
#define HSM1_NRD 57
#define HSM1_NRS 58
#define HSM1_TEMP 59
#define HSM1_DTEMP 60
#define HSM1_OFF 61
#define HSM1_IC_VBS 62
#define HSM1_IC_VDS 63
#define HSM1_IC_VGS 64
#define HSM1_IC 65
/* model parameters */
#define HSM1_MOD_VMAX 101
#define HSM1_MOD_BGTMP1 103
#define HSM1_MOD_BGTMP2 104
#define HSM1_MOD_TOX 105
#define HSM1_MOD_DL 106
#define HSM1_MOD_DW 107
#define HSM1_MOD_XJ 996 /* HiSIM1.0 */
#define HSM1_MOD_XQY 997 /* HiSIM1.1 */
#define HSM1_MOD_RS 108
#define HSM1_MOD_RD 109
#define HSM1_MOD_VFBC 110
#define HSM1_MOD_NSUBC 113
#define HSM1_MOD_PARL1 122
#define HSM1_MOD_PARL2 123
#define HSM1_MOD_SC1 124
#define HSM1_MOD_SC2 125
#define HSM1_MOD_SC3 126
#define HSM1_MOD_NDEP 129
#define HSM1_MOD_NINV 130
#define HSM1_MOD_MUECB0 131
#define HSM1_MOD_MUECB1 132
#define HSM1_MOD_MUEPH1 133
#define HSM1_MOD_MUEPH0 134
#define HSM1_MOD_MUEPH2 999
#define HSM1_MOD_W0 998
#define HSM1_MOD_MUESR1 135
#define HSM1_MOD_MUESR0 136
#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_SUB2 142
#define HSM1_MOD_SUB3 143
#define HSM1_MOD_CGSO 144
#define HSM1_MOD_CGDO 145
#define HSM1_MOD_CGBO 146
#define HSM1_MOD_JS0 147
#define HSM1_MOD_JS0SW 148
#define HSM1_MOD_NJ 149
#define HSM1_MOD_NJSW 150
#define HSM1_MOD_XTI 151
#define HSM1_MOD_CJ 152
#define HSM1_MOD_CJSW 156
#define HSM1_MOD_CJSWG 157
#define HSM1_MOD_MJ 160
#define HSM1_MOD_MJSW 161
#define HSM1_MOD_MJSWG 163
#define HSM1_MOD_PB 166
#define HSM1_MOD_PBSW 168
#define HSM1_MOD_PBSWG 169
#define HSM1_MOD_XPOLYD 170
#define HSM1_MOD_TPOLY 171
#define HSM1_MOD_LP 172
#define HSM1_MOD_NSUBP 173
#define HSM1_MOD_SCP1 174
#define HSM1_MOD_SCP2 175
#define HSM1_MOD_SCP3 176
#define HSM1_MOD_PGD1 177
#define HSM1_MOD_PGD2 178
#define HSM1_MOD_PGD3 179
#define HSM1_MOD_CLM1 180
#define HSM1_MOD_CLM2 181
#define HSM1_MOD_CLM3 182
#define HSM1_MOD_NINVD 183
#define HSM1_MOD_MUETMP 190
#define HSM1_MOD_RPOCK1 191
#define HSM1_MOD_RPOCK2 192
#define HSM1_MOD_VOVER 193
#define HSM1_MOD_VOVERP 194
#define HSM1_MOD_WFC 195
#define HSM1_MOD_QME1 196
#define HSM1_MOD_QME2 197
#define HSM1_MOD_QME3 198
#define HSM1_MOD_GIDL1 199
#define HSM1_MOD_GIDL2 200
#define HSM1_MOD_GIDL3 201
#define HSM1_MOD_GLEAK1 202
#define HSM1_MOD_GLEAK2 203
#define HSM1_MOD_GLEAK3 204
#define HSM1_MOD_VZADD0 205
#define HSM1_MOD_PZADD0 206
#define HSM1_MOD_WVTHSC 207 /* HiSIM1.1 */
#define HSM1_MOD_NSTI 208 /* HiSIM1.1 */
#define HSM1_MOD_WSTI 209 /* HiSIM1.1 */
#define HSM1_MOD_RPOCP1 210 /* HiSIM1.1 */
#define HSM1_MOD_RPOCP2 211 /* HiSIM1.1 */
#define HSM1_MOD_NFTRP 401
#define HSM1_MOD_NFALP 402
#define HSM1_MOD_CIT 403
#define HSM1_MOD_EF 500
#define HSM1_MOD_AF 501
#define HSM1_MOD_KF 502
/* device questions */
#define HSM1_DNODE 341
#define HSM1_GNODE 342
#define HSM1_SNODE 343
#define HSM1_BNODE 344
#define HSM1_DNODEPRIME 345
#define HSM1_SNODEPRIME 346
#define HSM1_VBD 347
#define HSM1_VBS 348
#define HSM1_VGS 349
#define HSM1_VDS 350
#define HSM1_CD 351
#define HSM1_CBS 352
#define HSM1_CBD 353
#define HSM1_GM 354
#define HSM1_GDS 355
#define HSM1_GMBS 356
#define HSM1_GBD 357
#define HSM1_GBS 358
#define HSM1_QB 359
#define HSM1_CQB 360
#define HSM1_QG 361
#define HSM1_CQG 362
#define HSM1_QD 363
#define HSM1_CQD 364
#define HSM1_CGG 365
#define HSM1_CGD 366
#define HSM1_CGS 367
#define HSM1_CBG 368
#define HSM1_CAPBD 369
#define HSM1_CQBD 370
#define HSM1_CAPBS 371
#define HSM1_CQBS 372
#define HSM1_CDG 373
#define HSM1_CDD 374
#define HSM1_CDS 375
#define HSM1_VON 376
#define HSM1_VDSAT 377
#define HSM1_QBS 378
#define HSM1_QBD 379
#define HSM1_SOURCECONDUCT 380
#define HSM1_DRAINCONDUCT 381
#define HSM1_CBDB 382
#define HSM1_CBSB 383
#include "hsm1ext.h"
/*
extern void HSM1evaluate(double,double,double,HSM1instance*,HSM1model*,
double*,double*,double*, double*, double*, double*, double*,
double*, double*, double*, double*, double*, double*, double*,
double*, double*, double*, double*, CKTcircuit*);
*/
#endif /*HSM1*/

View File

@ -0,0 +1,41 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1del.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "hsm1def.h"
#include "sperror.h"
#include "gendefs.h"
#include "suffix.h"
int HSM1delete(GENmodel *inModel, IFuid name, GENinstance **inInst)
{
HSM1instance **fast = (HSM1instance**)inInst;
HSM1model *model = (HSM1model*)inModel;
HSM1instance **prev = NULL;
HSM1instance *here;
for( ;model ;model = model->HSM1nextModel ) {
prev = &(model->HSM1instances);
for ( here = *prev ;here ;here = *prev ) {
if ( here->HSM1name == name || (fast && here==*fast) ) {
*prev= here->HSM1nextInstance;
FREE(here);
return(OK);
}
prev = &(here->HSM1nextInstance);
}
}
return(E_NODEV);
}

View File

@ -0,0 +1,41 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1dest.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "hsm1def.h"
#include "suffix.h"
void HSM1destroy(GENmodel **inModel)
{
HSM1model **model = (HSM1model**)inModel;
HSM1instance *here;
HSM1instance *prev = NULL;
HSM1model *mod = *model;
HSM1model *oldmod = NULL;
for ( ;mod ;mod = mod->HSM1nextModel ) {
if (oldmod) FREE(oldmod);
oldmod = mod;
prev = (HSM1instance *)NULL;
for ( here = mod->HSM1instances ;here ;here = here->HSM1nextInstance ) {
if (prev) FREE(prev);
prev = here;
}
if (prev) FREE(prev);
}
if (oldmod) FREE(oldmod);
*model = NULL;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,84 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1evalenv.h of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#ifndef HSM1_EVAL_ENV_H
#define HSM1_EVAL_ENV_H
/* macros and constants used in hsm1eval1_x.c */
/*---------------------------------------------------*
* Numerical constants. (macro)
*-----------------*/
/* machine epsilon */
#if defined(_FLOAT_H) && defined(DBL_EPSILON)
#define C_EPS_M (DBL_EPSILON)
#else
#define C_EPS_M (2.2204460492503131e-16)
#endif
/* sqrt(2) */
#define C_SQRT_2 (1.414213562373095e+00)
/* 1/3 */
#define C_1o3 (3.333333333333333e-01)
/* 2/3 */
#define C_2o3 (6.666666666666667e-01)
/* 2^(1/3) */
#define C_2p_1o3 (1.259921049894873e+00)
/* Pi */
#define C_Pi (3.141592653589793)
#define C_Pio2 (1.570796326794897)
/* Unit change */
#define C_m2cm (1.0e2)
#define C_m2cm_p2 (1.0e4)
#define C_m2cm_p1o2 (1.0e1)
/*---------------------------------------------------*
* Physical constants/properties. (macro)
*-----------------*/
/* Elemental charge */
#define C_QE (1.6021918e-19)
/* Boltzmann constant */
#define C_KB (1.3806226e-23)
/* Permitivity of Si and SiO2 */
#define C_ESI (1.034943e-12)
#define C_EOX (3.453133e-13)
/* Room temperature constants */
#define C_T300 (300e+00)
#define C_b300 (3.868283e+01)
#define C_Eg0 (1.1785e0)
/* Build-in potential */
#define C_Vbi (1.0e0)
/* Intrinsic carrier density at 300K */
#define C_Nin0 (1.04e+10)
/*---------------------------------------------------*
* Functions. (macro) Take care of the arguments.
*-----------------*/
#define Fn_Sqr(x) ( (x)*(x) ) /* x^2 */
#define Fn_Max(x,y) ( (x) >= (y) ? (x) : (y) ) /* max[x,y] */
#define Fn_Min(x,y) ( (x) <= (y) ? (x) : (y) ) /* min[x,y] */
#define Fn_Sgn(x) ( (x) >= 0 ? (1) : (-1) ) /* sign[x] */
#endif /* HSM1_EVAL_ENV_H */

View File

@ -0,0 +1,37 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1ext.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
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 HSM1ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*);
extern int HSM1convTest(GENmodel *,CKTcircuit*);
extern int HSM1delete(GENmodel*,IFuid,GENinstance**);
extern void HSM1destroy(GENmodel**);
extern int HSM1getic(GENmodel*,CKTcircuit*);
extern int HSM1load(GENmodel*,CKTcircuit*);
extern int HSM1mAsk(CKTcircuit*,GENmodel *,int, IFvalue*);
extern int HSM1mDelete(GENmodel**,IFuid,GENmodel*);
extern int HSM1mParam(int,IFvalue*,GENmodel*);
extern void HSM1mosCap(CKTcircuit*, double, double, double, double*,
double, double, double, double, double, double,
double*, double*, double*, double*, double*, double*, double*, double*,
double*, double*, double*, double*, double*, double*, double*,
double*);
extern int HSM1param(int,IFvalue*,GENinstance*,IFvalue*);
extern int HSM1pzLoad(GENmodel*,CKTcircuit*,SPcomplex*);
extern int HSM1setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
extern int HSM1unsetup(GENmodel*,CKTcircuit*);
extern int HSM1temp(GENmodel*,CKTcircuit*);
extern int HSM1trunc(GENmodel*,CKTcircuit*,double*);
extern int HSM1noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*);

View File

@ -0,0 +1,56 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1getic.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "cktdefs.h"
#include "hsm1def.h"
#include "sperror.h"
#include "suffix.h"
int HSM1getic(GENmodel *inModel, CKTcircuit *ckt)
{
HSM1model *model = (HSM1model*)inModel;
HSM1instance *here;
/*
* grab initial conditions out of rhs array. User specified, so use
* external nodes to get values
*/
for ( ;model ;model = model->HSM1nextModel ) {
for ( here = model->HSM1instances; here ;here = here->HSM1nextInstance ) {
if (here->HSM1owner != ARCHme)
continue;
if (!here->HSM1_icVBS_Given) {
here->HSM1_icVBS =
*(ckt->CKTrhs + here->HSM1bNode) -
*(ckt->CKTrhs + here->HSM1sNode);
}
if (!here->HSM1_icVDS_Given) {
here->HSM1_icVDS =
*(ckt->CKTrhs + here->HSM1dNode) -
*(ckt->CKTrhs + here->HSM1sNode);
}
if (!here->HSM1_icVGS_Given) {
here->HSM1_icVGS =
*(ckt->CKTrhs + here->HSM1gNode) -
*(ckt->CKTrhs + here->HSM1sNode);
}
}
}
return(OK);
}

View File

@ -0,0 +1,82 @@
#include <config.h>
#include <devdefs.h>
#include "hsm1itf.h"
#include "hsm1ext.h"
#include "hsm1init.h"
SPICEdev HSM1info = {
{
"HiSIM1",
"Hiroshima-university STARC IGFET Model 1.1.0",
&HSM1nSize,
&HSM1nSize,
HSM1names,
&HSM1pTSize,
HSM1pTable,
&HSM1mPTSize,
HSM1mPTable,
#ifdef XSPICE
/*---- Fixed by SDB 5.2.2003 to enable XSPICE/tclspice integration -----*/
NULL, /* This is a SPICE device, it has no MIF info data */
0, /* This is a SPICE device, it has no MIF info data */
NULL, /* This is a SPICE device, it has no MIF info data */
0, /* This is a SPICE device, it has no MIF info data */
NULL, /* This is a SPICE device, it has no MIF info data */
0, /* This is a SPICE device, it has no MIF info data */
NULL, /* This is a SPICE device, it has no MIF info data */
/*--------------------------- End of SDB fix -------------------------*/
#endif
DEV_DEFAULT
},
DEVparam : HSM1param,
DEVmodParam : HSM1mParam,
DEVload : HSM1load,
DEVsetup : HSM1setup,
DEVunsetup : HSM1unsetup,
DEVpzSetup : HSM1setup,
DEVtemperature: HSM1temp,
DEVtrunc : HSM1trunc,
DEVfindBranch : NULL,
DEVacLoad : HSM1acLoad,
DEVaccept : NULL,
DEVdestroy : HSM1destroy,
DEVmodDelete : HSM1mDelete,
DEVdelete : HSM1delete,
DEVsetic : HSM1getic,
DEVask : HSM1ask,
DEVmodAsk : HSM1mAsk,
DEVpzLoad : HSM1pzLoad,
DEVconvTest : HSM1convTest,
DEVsenSetup : NULL,
DEVsenLoad : NULL,
DEVsenUpdate : NULL,
DEVsenAcLoad : NULL,
DEVsenPrint : NULL,
DEVsenTrunc : NULL,
DEVdisto : NULL,
DEVnoise : HSM1noise,
#ifdef CIDER
DEVdump : NULL,
DEVacct : NULL,
#endif
DEVinstSize : &HSM1iSize,
DEVmodSize : &HSM1mSize
};
SPICEdev *
get_hsm1_info(void)
{
return &HSM1info;
}

View File

@ -0,0 +1,13 @@
#ifndef _HISIM1INIT_H
#define _HISIM1INIT_H
extern IFparm HSM1pTable[ ];
extern IFparm HSM1mPTable[ ];
extern char *HSM1names[ ];
extern int HSM1pTSize;
extern int HSM1mPTSize;
extern int HSM1nSize;
extern int HSM1iSize;
extern int HSM1mSize;
#endif

View File

@ -0,0 +1,13 @@
/**********
Copyright 2001 Regents of the University of California. All rights reserved.
Author: 2000 Weidong Liu, Xiaodong Jin.
Author: 2001 Xuemei Xi
File: bsim4itf.h
**********/
#ifndef DEV_HISIM1
#define DEV_HISIM1
SPICEdev *get_hsm1_info(void);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,379 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1mask.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "ifsim.h"
#include "cktdefs.h"
#include "devdefs.h"
#include "hsm1def.h"
#include "sperror.h"
#include "suffix.h"
int HSM1mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
{
HSM1model *model = (HSM1model *)inst;
switch (which) {
case HSM1_MOD_NMOS:
value->iValue = model->HSM1_type;
return(OK);
case HSM1_MOD_PMOS:
value->iValue = model->HSM1_type;
return(OK);
case HSM1_MOD_LEVEL:
value->iValue = model->HSM1_level;
return(OK);
case HSM1_MOD_INFO:
value->iValue = model->HSM1_info;
return(OK);
case HSM1_MOD_NOISE:
value->iValue = model->HSM1_noise;
return(OK);
case HSM1_MOD_VERSION:
value->iValue = model->HSM1_version;
return(OK);
case HSM1_MOD_SHOW:
value->iValue = model->HSM1_show;
return(OK);
case HSM1_MOD_CORSRD:
value->iValue = model->HSM1_corsrd;
return(OK);
case HSM1_MOD_COIPRV:
value->iValue = model->HSM1_coiprv;
return(OK);
case HSM1_MOD_COPPRV:
value->iValue = model->HSM1_copprv;
return(OK);
case HSM1_MOD_COCGSO:
value->iValue = model->HSM1_cocgso;
return(OK);
case HSM1_MOD_COCGDO:
value->iValue = model->HSM1_cocgdo;
return(OK);
case HSM1_MOD_COCGBO:
value->rValue = model->HSM1_cocgbo;
return(OK);
case HSM1_MOD_COADOV:
value->iValue = model->HSM1_coadov;
return(OK);
case HSM1_MOD_COXX08:
value->iValue = model->HSM1_coxx08;
return(OK);
case HSM1_MOD_COXX09:
value->iValue = model->HSM1_coxx09;
return(OK);
case HSM1_MOD_COISUB:
value->iValue = model->HSM1_coisub;
return(OK);
case HSM1_MOD_COIIGS:
value->iValue = model->HSM1_coiigs;
return(OK);
case HSM1_MOD_COGIDL:
value->iValue = model->HSM1_cogidl;
return(OK);
case HSM1_MOD_COOVLP:
value->iValue = model->HSM1_coovlp;
return(OK);
case HSM1_MOD_CONOIS:
value->iValue = model->HSM1_conois;
return(OK);
case HSM1_MOD_COISTI: /* HiSIM1.1 */
value->iValue = model->HSM1_coisti;
return(OK);
case HSM1_MOD_VMAX:
value->rValue = model->HSM1_vmax;
return(OK);
case HSM1_MOD_BGTMP1:
value->rValue = model->HSM1_bgtmp1;
return(OK);
case HSM1_MOD_BGTMP2:
value->rValue = model->HSM1_bgtmp2;
return(OK);
case HSM1_MOD_TOX:
value->rValue = model->HSM1_tox;
return(OK);
case HSM1_MOD_DL:
value->rValue = model->HSM1_dl;
return(OK);
case HSM1_MOD_DW:
value->rValue = model->HSM1_dw;
return(OK);
case HSM1_MOD_XJ: /* HiSIM1.0 */
value->rValue = model->HSM1_xj;
return(OK);
case HSM1_MOD_XQY: /* HiSIM1.1 */
value->rValue = model->HSM1_xqy;
return(OK);
case HSM1_MOD_RS:
value->rValue = model->HSM1_rs;
return(OK);
case HSM1_MOD_RD:
value->rValue = model->HSM1_rd;
return(OK);
case HSM1_MOD_VFBC:
value->rValue = model->HSM1_vfbc;
return(OK);
case HSM1_MOD_NSUBC:
value->rValue = model->HSM1_nsubc;
return(OK);
case HSM1_MOD_PARL1:
value->rValue = model->HSM1_parl1;
return(OK);
case HSM1_MOD_PARL2:
value->rValue = model->HSM1_parl2;
return(OK);
case HSM1_MOD_LP:
value->rValue = model->HSM1_lp;
return(OK);
case HSM1_MOD_NSUBP:
value->rValue = model->HSM1_nsubp;
return(OK);
case HSM1_MOD_SCP1:
value->rValue = model->HSM1_scp1;
return(OK);
case HSM1_MOD_SCP2:
value->rValue = model->HSM1_scp2;
return(OK);
case HSM1_MOD_SCP3:
value->rValue = model->HSM1_scp3;
return(OK);
case HSM1_MOD_SC1:
value->rValue = model->HSM1_sc1;
return(OK);
case HSM1_MOD_SC2:
value->rValue = model->HSM1_sc2;
return(OK);
case HSM1_MOD_SC3:
value->rValue = model->HSM1_sc3;
return(OK);
case HSM1_MOD_PGD1:
value->rValue = model->HSM1_pgd1;
return(OK);
case HSM1_MOD_PGD2:
value->rValue = model->HSM1_pgd2;
return(OK);
case HSM1_MOD_PGD3:
value->rValue = model->HSM1_pgd3;
return(OK);
case HSM1_MOD_NDEP:
value->rValue = model->HSM1_ndep;
return(OK);
case HSM1_MOD_NINV:
value->rValue = model->HSM1_ninv;
return(OK);
case HSM1_MOD_NINVD:
value->rValue = model->HSM1_ninvd;
return(OK);
case HSM1_MOD_MUECB0:
value->rValue = model->HSM1_muecb0;
return(OK);
case HSM1_MOD_MUECB1:
value->rValue = model->HSM1_muecb1;
return(OK);
case HSM1_MOD_MUEPH1:
value->rValue = model->HSM1_mueph1;
return(OK);
case HSM1_MOD_MUEPH0:
value->rValue = model->HSM1_mueph0;
return(OK);
case HSM1_MOD_MUEPH2:
value->rValue = model->HSM1_mueph2;
return(OK);
case HSM1_MOD_W0:
value->rValue = model->HSM1_w0;
return(OK);
case HSM1_MOD_MUESR1:
value->rValue = model->HSM1_muesr1;
return(OK);
case HSM1_MOD_MUESR0:
value->rValue = model->HSM1_muesr0;
return(OK);
case HSM1_MOD_BB:
value->rValue = model->HSM1_bb;
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:
value->rValue = model->HSM1_sub1;
return(OK);
case HSM1_MOD_SUB2:
value->rValue = model->HSM1_sub2;
return(OK);
case HSM1_MOD_SUB3:
value->rValue = model->HSM1_sub3;
return(OK);
case HSM1_MOD_WVTHSC: /* HiSIM1.1 */
value->rValue = model->HSM1_wvthsc;
return(OK);
case HSM1_MOD_NSTI: /* HiSIM1.1 */
value->rValue = model->HSM1_nsti;
return(OK);
case HSM1_MOD_WSTI: /* HiSIM1.1 */
value->rValue = model->HSM1_wsti;
return(OK);
case HSM1_MOD_CGSO:
value->rValue = model->HSM1_cgso;
return(OK);
case HSM1_MOD_CGDO:
value->rValue = model->HSM1_cgdo;
return(OK);
case HSM1_MOD_CGBO:
value->rValue = model->HSM1_cgbo;
return(OK);
case HSM1_MOD_TPOLY:
value->rValue = model->HSM1_tpoly;
return(OK);
case HSM1_MOD_JS0:
value->rValue = model->HSM1_js0;
return(OK);
case HSM1_MOD_JS0SW:
value->rValue = model->HSM1_js0sw;
return(OK);
case HSM1_MOD_NJ:
value->rValue = model->HSM1_nj;
return(OK);
case HSM1_MOD_NJSW:
value->rValue = model->HSM1_njsw;
return(OK);
case HSM1_MOD_XTI:
value->rValue = model->HSM1_xti;
return(OK);
case HSM1_MOD_CJ:
value->rValue = model->HSM1_cj;
return(OK);
case HSM1_MOD_CJSW:
value->rValue = model->HSM1_cjsw;
return(OK);
case HSM1_MOD_CJSWG:
value->rValue = model->HSM1_cjswg;
return(OK);
case HSM1_MOD_MJ:
value->rValue = model->HSM1_mj;
return(OK);
case HSM1_MOD_MJSW:
value->rValue = model->HSM1_mjsw;
return(OK);
case HSM1_MOD_MJSWG:
value->rValue = model->HSM1_mjswg;
return(OK);
case HSM1_MOD_PB:
value->rValue = model->HSM1_pbsw;
return(OK);
case HSM1_MOD_PBSW:
value->rValue = model->HSM1_pbsw;
return(OK);
case HSM1_MOD_PBSWG:
value->rValue = model->HSM1_pbswg;
return(OK);
case HSM1_MOD_XPOLYD:
value->rValue = model->HSM1_xpolyd;
return(OK);
case HSM1_MOD_CLM1:
value->rValue = model->HSM1_clm1;
return(OK);
case HSM1_MOD_CLM2:
value->rValue = model->HSM1_clm2;
return(OK);
case HSM1_MOD_CLM3:
value->rValue = model->HSM1_clm3;
return(OK);
case HSM1_MOD_MUETMP:
value->rValue = model->HSM1_muetmp;
return(OK);
case HSM1_MOD_RPOCK1:
value->rValue = model->HSM1_rpock1;
return(OK);
case HSM1_MOD_RPOCK2:
value->rValue = model->HSM1_rpock2;
return(OK);
case HSM1_MOD_RPOCP1: /* HiSIM1.1 */
value->rValue = model->HSM1_rpocp1;
return(OK);
case HSM1_MOD_RPOCP2: /* HiSIM1.1 */
value->rValue = model->HSM1_rpocp2;
return(OK);
case HSM1_MOD_VOVER:
value->rValue = model->HSM1_vover;
return(OK);
case HSM1_MOD_VOVERP:
value->rValue = model->HSM1_voverp;
return(OK);
case HSM1_MOD_WFC:
value->rValue = model->HSM1_wfc;
return(OK);
case HSM1_MOD_QME1:
value->rValue = model->HSM1_qme1;
return(OK);
case HSM1_MOD_QME2:
value->rValue = model->HSM1_qme2;
return(OK);
case HSM1_MOD_QME3:
value->rValue = model->HSM1_qme3;
return(OK);
case HSM1_MOD_GIDL1:
value->rValue = model->HSM1_gidl1;
return(OK);
case HSM1_MOD_GIDL2:
value->rValue = model->HSM1_gidl2;
return(OK);
case HSM1_MOD_GIDL3:
value->rValue = model->HSM1_gidl3;
return(OK);
case HSM1_MOD_GLEAK1:
value->rValue = model->HSM1_gleak1;
return(OK);
case HSM1_MOD_GLEAK2:
value->rValue = model->HSM1_gleak2;
return(OK);
case HSM1_MOD_GLEAK3:
value->rValue = model->HSM1_gleak3;
return(OK);
case HSM1_MOD_VZADD0:
value->rValue = model->HSM1_vzadd0;
return(OK);
case HSM1_MOD_PZADD0:
value->rValue = model->HSM1_pzadd0;
return(OK);
case HSM1_MOD_NFTRP:
value->rValue = model->HSM1_nftrp;
return(OK);
case HSM1_MOD_NFALP:
value->rValue = model->HSM1_nfalp;
return(OK);
case HSM1_MOD_CIT:
value->rValue = model->HSM1_cit;
return(OK);
case HSM1_MOD_KF:
value->rValue = model->HSM1_kf;
return(OK);
case HSM1_MOD_AF:
value->rValue = model->HSM1_af;
return(OK);
case HSM1_MOD_EF:
value->rValue = model->HSM1_ef;
return(OK);
default:
return(E_BADPARM);
}
/* NOTREACHED */
}

View File

@ -0,0 +1,48 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1mdel.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "hsm1def.h"
#include "sperror.h"
#include "suffix.h"
int HSM1mDelete(GENmodel **inModel, IFuid modname, GENmodel *kill)
{
HSM1model **model = (HSM1model**)inModel;
HSM1model *modfast = (HSM1model*)kill;
HSM1instance *here;
HSM1instance *prev = NULL;
HSM1model **oldmod;
oldmod = model;
for ( ;*model ;model = &((*model)->HSM1nextModel) ) {
if ( (*model)->HSM1modName == modname ||
(modfast && *model == modfast) ) goto delgot;
oldmod = model;
}
return(E_NOMOD);
delgot:
*oldmod = (*model)->HSM1nextModel; /* cut deleted device out of list */
for ( here = (*model)->HSM1instances ;
here ;here = here->HSM1nextInstance ) {
if (prev) FREE(prev);
prev = here;
}
if (prev) FREE(prev);
FREE(*model);
return(OK);
}

View File

@ -0,0 +1,495 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1mpar.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "hsm1def.h"
#include "ifsim.h"
#include "sperror.h"
#include "suffix.h"
int HSM1mParam(int param, IFvalue *value, GENmodel *inMod)
{
HSM1model *mod = (HSM1model*)inMod;
switch (param) {
case HSM1_MOD_NMOS :
if (value->iValue) {
mod->HSM1_type = 1;
mod->HSM1_type_Given = TRUE;
}
break;
case HSM1_MOD_PMOS :
if (value->iValue) {
mod->HSM1_type = - 1;
mod->HSM1_type_Given = TRUE;
}
break;
case HSM1_MOD_LEVEL:
mod->HSM1_level = value->iValue;
mod->HSM1_level_Given = TRUE;
break;
case HSM1_MOD_INFO:
mod->HSM1_info = value->iValue;
mod->HSM1_info_Given = TRUE;
break;
case HSM1_MOD_NOISE:
mod->HSM1_noise = value->iValue;
mod->HSM1_noise_Given = TRUE;
break;
case HSM1_MOD_VERSION:
mod->HSM1_version = value->iValue;
mod->HSM1_version_Given = TRUE;
break;
case HSM1_MOD_SHOW:
mod->HSM1_show = value->iValue;
mod->HSM1_show_Given = TRUE;
break;
case HSM1_MOD_CORSRD:
mod->HSM1_corsrd = value->iValue;
mod->HSM1_corsrd_Given = TRUE;
break;
case HSM1_MOD_COIPRV:
mod->HSM1_coiprv = value->iValue;
mod->HSM1_coiprv_Given = TRUE;
break;
case HSM1_MOD_COPPRV:
mod->HSM1_copprv = value->iValue;
mod->HSM1_copprv_Given = TRUE;
break;
case HSM1_MOD_COCGSO:
mod->HSM1_cocgso = value->iValue;
mod->HSM1_cocgso_Given = TRUE;
break;
case HSM1_MOD_COCGDO:
mod->HSM1_cocgdo = value->iValue;
mod->HSM1_cocgdo_Given = TRUE;
break;
case HSM1_MOD_COCGBO:
mod->HSM1_cocgbo = value->iValue;
mod->HSM1_cocgbo_Given = TRUE;
break;
case HSM1_MOD_COADOV:
mod->HSM1_coadov = value->iValue;
mod->HSM1_coadov_Given = TRUE;
break;
case HSM1_MOD_COXX08:
mod->HSM1_coxx08 = value->iValue;
mod->HSM1_coxx08_Given = TRUE;
break;
case HSM1_MOD_COXX09:
mod->HSM1_coxx09 = value->iValue;
mod->HSM1_coxx09_Given = TRUE;
break;
case HSM1_MOD_COISUB:
mod->HSM1_coisub = value->iValue;
mod->HSM1_coisub_Given = TRUE;
break;
case HSM1_MOD_COIIGS:
mod->HSM1_coiigs = value->iValue;
mod->HSM1_coiigs_Given = TRUE;
break;
case HSM1_MOD_COGIDL:
mod->HSM1_cogidl = value->iValue;
mod->HSM1_cogidl_Given = TRUE;
break;
case HSM1_MOD_COOVLP:
mod->HSM1_coovlp = value->iValue;
mod->HSM1_coovlp_Given = TRUE;
break;
case HSM1_MOD_CONOIS: /* HiSIM1.1 */
mod->HSM1_conois = value->iValue;
mod->HSM1_conois_Given = TRUE;
break;
case HSM1_MOD_COISTI:
mod->HSM1_coisti = value->iValue;
mod->HSM1_coisti_Given = TRUE;
break;
case HSM1_MOD_VMAX:
mod->HSM1_vmax = value->rValue;
mod->HSM1_vmax_Given = TRUE;
break;
case HSM1_MOD_BGTMP1:
mod->HSM1_bgtmp1 = value->rValue;
mod->HSM1_bgtmp1_Given = TRUE;
break;
case HSM1_MOD_BGTMP2:
mod->HSM1_bgtmp2 = value->rValue;
mod->HSM1_bgtmp2_Given = TRUE;
break;
case HSM1_MOD_TOX:
mod->HSM1_tox = value->rValue;
mod->HSM1_tox_Given = TRUE;
break;
case HSM1_MOD_DL:
mod->HSM1_dl = value->rValue;
mod->HSM1_dl_Given = TRUE;
break;
case HSM1_MOD_DW:
mod->HSM1_dw = value->rValue;
mod->HSM1_dw_Given = TRUE;
break;
case HSM1_MOD_XJ: /* HiSIM1.0 */
mod->HSM1_xj = value->rValue;
mod->HSM1_xj_Given = TRUE;
break;
case HSM1_MOD_XQY: /* HiSIM1.1 */
mod->HSM1_xqy = value->rValue;
mod->HSM1_xqy_Given = TRUE;
break;
case HSM1_MOD_RS:
mod->HSM1_rs = value->rValue;
mod->HSM1_rs_Given = TRUE;
break;
case HSM1_MOD_RD:
mod->HSM1_rd = value->rValue;
mod->HSM1_rd_Given = TRUE;
break;
case HSM1_MOD_VFBC:
mod->HSM1_vfbc = value->rValue;
mod->HSM1_vfbc_Given = TRUE;
break;
case HSM1_MOD_NSUBC:
mod->HSM1_nsubc = value->rValue;
mod->HSM1_nsubc_Given = TRUE;
break;
case HSM1_MOD_PARL1:
mod->HSM1_parl1 = value->rValue;
mod->HSM1_parl1_Given = TRUE;
break;
case HSM1_MOD_PARL2:
mod->HSM1_parl2 = value->rValue;
mod->HSM1_parl2_Given = TRUE;
break;
case HSM1_MOD_LP:
mod->HSM1_lp = value->rValue;
mod->HSM1_lp_Given = TRUE;
break;
case HSM1_MOD_NSUBP:
mod->HSM1_nsubp = value->rValue;
mod->HSM1_nsubp_Given = TRUE;
break;
case HSM1_MOD_SCP1:
mod->HSM1_scp1 = value->rValue;
mod->HSM1_scp1_Given = TRUE;
break;
case HSM1_MOD_SCP2:
mod->HSM1_scp2 = value->rValue;
mod->HSM1_scp2_Given = TRUE;
break;
case HSM1_MOD_SCP3:
mod->HSM1_scp3 = value->rValue;
mod->HSM1_scp3_Given = TRUE;
break;
case HSM1_MOD_SC1:
mod->HSM1_sc1 = value->rValue;
mod->HSM1_sc1_Given = TRUE;
break;
case HSM1_MOD_SC2:
mod->HSM1_sc2 = value->rValue;
mod->HSM1_sc2_Given = TRUE;
break;
case HSM1_MOD_SC3:
mod->HSM1_sc3 = value->rValue;
mod->HSM1_sc3_Given = TRUE;
break;
case HSM1_MOD_PGD1:
mod->HSM1_pgd1 = value->rValue;
mod->HSM1_pgd1_Given = TRUE;
break;
case HSM1_MOD_PGD2:
mod->HSM1_pgd2 = value->rValue;
mod->HSM1_pgd2_Given = TRUE;
break;
case HSM1_MOD_PGD3:
mod->HSM1_pgd3 = value->rValue;
mod->HSM1_pgd3_Given = TRUE;
break;
case HSM1_MOD_NDEP:
mod->HSM1_ndep = value->rValue;
mod->HSM1_ndep_Given = TRUE;
break;
case HSM1_MOD_NINV:
mod->HSM1_ninv = value->rValue;
mod->HSM1_ninv_Given = TRUE;
break;
case HSM1_MOD_NINVD:
mod->HSM1_ninvd = value->rValue;
mod->HSM1_ninvd_Given = TRUE;
break;
case HSM1_MOD_MUECB0:
mod->HSM1_muecb0 = value->rValue;
mod->HSM1_muecb0_Given = TRUE;
break;
case HSM1_MOD_MUECB1:
mod->HSM1_muecb1 = value->rValue;
mod->HSM1_muecb1_Given = TRUE;
break;
case HSM1_MOD_MUEPH1:
mod->HSM1_mueph1 = value->rValue;
mod->HSM1_mueph1_Given = TRUE;
break;
case HSM1_MOD_MUEPH0:
mod->HSM1_mueph0 = value->rValue;
mod->HSM1_mueph0_Given = TRUE;
break;
case HSM1_MOD_MUEPH2:
mod->HSM1_mueph2 = value->rValue;
mod->HSM1_mueph2_Given = TRUE;
break;
case HSM1_MOD_W0:
mod->HSM1_w0 = value->rValue;
mod->HSM1_w0_Given = TRUE;
break;
case HSM1_MOD_MUESR1:
mod->HSM1_muesr1 = value->rValue;
mod->HSM1_muesr1_Given = TRUE;
break;
case HSM1_MOD_MUESR0:
mod->HSM1_muesr0 = value->rValue;
mod->HSM1_muesr0_Given = TRUE;
break;
case HSM1_MOD_BB:
mod->HSM1_bb = value->rValue;
mod->HSM1_bb_Given = TRUE;
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:
mod->HSM1_sub1 = value->rValue;
mod->HSM1_sub1_Given = TRUE;
break;
case HSM1_MOD_SUB2:
mod->HSM1_sub2 = value->rValue;
mod->HSM1_sub2_Given = TRUE;
break;
case HSM1_MOD_SUB3:
mod->HSM1_sub3 = value->rValue;
mod->HSM1_sub3_Given = TRUE;
break;
case HSM1_MOD_WVTHSC: /* HiSIM1.1 */
mod->HSM1_wvthsc = value->rValue;
mod->HSM1_wvthsc_Given = TRUE;
break;
case HSM1_MOD_NSTI: /* HiSIM1.1 */
mod->HSM1_nsti = value->rValue;
mod->HSM1_nsti_Given = TRUE;
break;
case HSM1_MOD_WSTI: /* HiSIM1.1 */
mod->HSM1_wsti = value->rValue;
mod->HSM1_wsti_Given = TRUE;
break;
case HSM1_MOD_CGSO:
mod->HSM1_cgso = value->rValue;
mod->HSM1_cgso_Given = TRUE;
break;
case HSM1_MOD_CGDO:
mod->HSM1_cgdo = value->rValue;
mod->HSM1_cgdo_Given = TRUE;
break;
case HSM1_MOD_CGBO:
mod->HSM1_cgbo = value->rValue;
mod->HSM1_cgbo_Given = TRUE;
break;
case HSM1_MOD_TPOLY:
mod->HSM1_tpoly = value->rValue;
mod->HSM1_tpoly_Given = TRUE;
break;
case HSM1_MOD_JS0:
mod->HSM1_js0 = value->rValue;
mod->HSM1_js0_Given = TRUE;
break;
case HSM1_MOD_JS0SW:
mod->HSM1_js0sw = value->rValue;
mod->HSM1_js0sw_Given = TRUE;
break;
case HSM1_MOD_NJ:
mod->HSM1_nj = value->rValue;
mod->HSM1_nj_Given = TRUE;
break;
case HSM1_MOD_NJSW:
mod->HSM1_njsw = value->rValue;
mod->HSM1_njsw_Given = TRUE;
break;
case HSM1_MOD_XTI:
mod->HSM1_xti = value->rValue;
mod->HSM1_xti_Given = TRUE;
break;
case HSM1_MOD_CJ:
mod->HSM1_cj = value->rValue;
mod->HSM1_cj_Given = TRUE;
break;
case HSM1_MOD_CJSW:
mod->HSM1_cjsw = value->rValue;
mod->HSM1_cjsw_Given = TRUE;
break;
case HSM1_MOD_CJSWG:
mod->HSM1_cjswg = value->rValue;
mod->HSM1_cjswg_Given = TRUE;
break;
case HSM1_MOD_MJ:
mod->HSM1_mj = value->rValue;
mod->HSM1_mj_Given = TRUE;
break;
case HSM1_MOD_MJSW:
mod->HSM1_mjsw = value->rValue;
mod->HSM1_mjsw_Given = TRUE;
break;
case HSM1_MOD_MJSWG:
mod->HSM1_mjswg = value->rValue;
mod->HSM1_mjswg_Given = TRUE;
break;
case HSM1_MOD_PB:
mod->HSM1_pb = value->rValue;
mod->HSM1_pb_Given = TRUE;
break;
case HSM1_MOD_PBSW:
mod->HSM1_pbsw = value->rValue;
mod->HSM1_pbsw_Given = TRUE;
break;
case HSM1_MOD_PBSWG:
mod->HSM1_pbswg = value->rValue;
mod->HSM1_pbswg_Given = TRUE;
break;
case HSM1_MOD_XPOLYD:
mod->HSM1_xpolyd = value->rValue;
mod->HSM1_xpolyd_Given = TRUE;
break;
case HSM1_MOD_CLM1:
mod->HSM1_clm1 = value->rValue;
mod->HSM1_clm1_Given = TRUE;
break;
case HSM1_MOD_CLM2:
mod->HSM1_clm2 = value->rValue;
mod->HSM1_clm2_Given = TRUE;
break;
case HSM1_MOD_CLM3:
mod->HSM1_clm3 = value->rValue;
mod->HSM1_clm3_Given = TRUE;
break;
case HSM1_MOD_MUETMP:
mod->HSM1_muetmp = value->rValue;
mod->HSM1_muetmp_Given = TRUE;
break;
case HSM1_MOD_RPOCK1:
mod->HSM1_rpock1 = value->rValue;
mod->HSM1_rpock1_Given = TRUE;
break;
case HSM1_MOD_RPOCK2:
mod->HSM1_rpock2 = value->rValue;
mod->HSM1_rpock2_Given = TRUE;
break;
case HSM1_MOD_RPOCP1: /* HiSIM1.1 */
mod->HSM1_rpocp1 = value->rValue;
mod->HSM1_rpocp1_Given = TRUE;
break;
case HSM1_MOD_RPOCP2: /* HiSIM1.1 */
mod->HSM1_rpocp2 = value->rValue;
mod->HSM1_rpocp2_Given = TRUE;
break;
case HSM1_MOD_VOVER:
mod->HSM1_vover = value->rValue;
mod->HSM1_vover_Given = TRUE;
break;
case HSM1_MOD_VOVERP:
mod->HSM1_voverp = value->rValue;
mod->HSM1_voverp_Given = TRUE;
break;
case HSM1_MOD_WFC:
mod->HSM1_wfc = value->rValue;
mod->HSM1_wfc_Given = TRUE;
break;
case HSM1_MOD_QME1:
mod->HSM1_qme1 = value->rValue;
mod->HSM1_qme1_Given = TRUE;
break;
case HSM1_MOD_QME2:
mod->HSM1_qme2 = value->rValue;
mod->HSM1_qme2_Given = TRUE;
break;
case HSM1_MOD_QME3:
mod->HSM1_qme3 = value->rValue;
mod->HSM1_qme3_Given = TRUE;
break;
case HSM1_MOD_GIDL1:
mod->HSM1_gidl1 = value->rValue;
mod->HSM1_gidl1_Given = TRUE;
break;
case HSM1_MOD_GIDL2:
mod->HSM1_gidl2 = value->rValue;
mod->HSM1_gidl2_Given = TRUE;
break;
case HSM1_MOD_GIDL3:
mod->HSM1_gidl3 = value->rValue;
mod->HSM1_gidl3_Given = TRUE;
break;
case HSM1_MOD_GLEAK1:
mod->HSM1_gleak1 = value->rValue;
mod->HSM1_gleak1_Given = TRUE;
break;
case HSM1_MOD_GLEAK2:
mod->HSM1_gleak2 = value->rValue;
mod->HSM1_gleak2_Given = TRUE;
break;
case HSM1_MOD_GLEAK3:
mod->HSM1_gleak3 = value->rValue;
mod->HSM1_gleak3_Given = TRUE;
break;
case HSM1_MOD_VZADD0:
mod->HSM1_vzadd0 = value->rValue;
mod->HSM1_vzadd0_Given = TRUE;
break;
case HSM1_MOD_PZADD0:
mod->HSM1_pzadd0 = value->rValue;
mod->HSM1_pzadd0_Given = TRUE;
break;
case HSM1_MOD_NFTRP:
mod->HSM1_nftrp = value->rValue;
mod->HSM1_nftrp_Given = TRUE;
break;
case HSM1_MOD_NFALP:
mod->HSM1_nfalp = value->rValue;
mod->HSM1_nfalp_Given = TRUE;
break;
case HSM1_MOD_CIT:
mod->HSM1_cit = value->rValue;
mod->HSM1_cit_Given = TRUE;
break;
case HSM1_MOD_KF:
mod->HSM1_kf = value->rValue;
mod->HSM1_kf_Given = TRUE;
break;
case HSM1_MOD_AF:
mod->HSM1_af = value->rValue;
mod->HSM1_af_Given = TRUE;
break;
case HSM1_MOD_EF:
mod->HSM1_ef = value->rValue;
mod->HSM1_ef_Given = TRUE;
break;
default:
return(E_BADPARM);
}
return(OK);
}

View File

@ -0,0 +1,284 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1noi.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "hsm1def.h"
#include "cktdefs.h"
#include "iferrmsg.h"
#include "noisedef.h"
#include "suffix.h"
#include "const.h" /* jwan */
/*
* HSM1noise (mode, operation, firstModel, ckt, data, OnDens)
* This routine names and evaluates all of the noise sources
* associated with MOSFET's. It starts with the model *firstModel and
* traverses all of its insts. It then proceeds to any other models
* on the linked list. The total output noise density generated by
* all of the MOSFET's is summed with the variable "OnDens".
*/
/*
Channel thermal and flicker noises are calculated based on the value
of model->HSM1_noise.
If model->HSM1_noise = 1,
Channel thermal noise = SPICE2 model
Flicker noise = SPICE2 model
If model->HSM1_noise = 2,
Channel thermal noise = HiSIM1 model corresponding to BSIM3 model
Flicker noise = HiSIM1 model
If model->HSM1_noise = 3,
Channel thermal noise = SPICE2 model
Flicker noise = HiSIM1 model
If model->HSM1_noise = 4,
Channel thermal noise = HiSIM1 model corresponding to BSIM3 model
Flicker noise = SPICE2 model
If model->HSM1_noise = 5,
Channel thermal noise = NONE
Flicker noise = HiSIM1 model
*/
extern void NevalSrc();
extern double Nintegrate();
int HSM1noise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt,
Ndata *data, double *OnDens)
{
HSM1model *model = (HSM1model *)inModel;
HSM1instance *here;
char name[N_MXVLNTH];
double tempOnoise;
double tempInoise;
double noizDens[HSM1NSRCS];
double lnNdens[HSM1NSRCS];
register int error, i;
/* define the names of the noise sources */
static char * HSM1nNames[HSM1NSRCS] = {
/* Note that we have to keep the order
consistent with the index definitions
in hsm1defs.h */
".rd", /* noise due to rd */
".rs", /* noise due to rs */
".id", /* noise due to id */
".1ovf", /* flicker (1/f) noise */
"" /* total transistor noise */
};
for ( ;model != NULL; model = model->HSM1nextModel ) {
for ( here = model->HSM1instances; here != NULL;
here = here->HSM1nextInstance ) {
if (here->HSM1owner != ARCHme)
continue;
switch (operation) {
case N_OPEN:
/* see if we have to to produce a summary report */
/* if so, name all the noise generators */
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) {
switch (mode) {
case N_DENS:
for ( i = 0; i < HSM1NSRCS; i++ ) {
(void) sprintf(name, "onoise.%s%s",
(char *)here->HSM1name, HSM1nNames[i]);
data->namelist =
(IFuid *) xrealloc((char *) data->namelist,
(data->numPlots + 1) * sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid))
(ckt, &(data->namelist[data->numPlots++]),
(IFuid) NULL, name, UID_OTHER, (void **) NULL);
}
break;
case INT_NOIZ:
for ( i = 0; i < HSM1NSRCS; i++ ) {
(void) sprintf(name, "onoise_total.%s%s",
(char *)here->HSM1name, HSM1nNames[i]);
data->namelist =
(IFuid *) xrealloc((char *) data->namelist,
(data->numPlots + 1) * sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid))
(ckt, &(data->namelist[data->numPlots++]),
(IFuid) NULL, name, UID_OTHER, (void **) NULL);
(void) sprintf(name, "inoise_total.%s%s",
(char *)here->HSM1name, HSM1nNames[i]);
data->namelist =
(IFuid *) xrealloc((char *) data->namelist,
(data->numPlots + 1) * sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid))
(ckt, &(data->namelist[data->numPlots++]),
(IFuid) NULL, name, UID_OTHER, (void **)NULL);
}
break;
}
}
break;
case N_CALC:
switch (mode) {
case N_DENS:
NevalSrc(&noizDens[HSM1RDNOIZ], &lnNdens[HSM1RDNOIZ],
ckt, THERMNOISE,
here->HSM1dNodePrime, here->HSM1dNode,
here->HSM1drainConductance * here->HSM1_m);
NevalSrc(&noizDens[HSM1RSNOIZ], &lnNdens[HSM1RSNOIZ],
ckt, THERMNOISE,
here->HSM1sNodePrime, here->HSM1sNode,
here->HSM1sourceConductance * here->HSM1_m);
switch( model->HSM1_noise ) {
double I;
case 1:
case 3:
I = here->HSM1_gm + here->HSM1_gds + here->HSM1_gmbs;
I *= (I < 0.0) ? -1.0 : 1.0;
I *= 2.0/3.0;
I *= here->HSM1_m; /* PN */
NevalSrc(&noizDens[HSM1IDNOIZ], &lnNdens[HSM1IDNOIZ],
ckt, THERMNOISE,
here->HSM1dNodePrime, here->HSM1sNodePrime, I);
break;
case 2:
case 4:
I = -1.0 * (here->HSM1_qg + here->HSM1_qb)
/ (here->HSM1_weff * here->HSM1_leff);
I *= (I < 0.0) ? -1.0 : 1.0;
I *= here->HSM1_mu;
I *= here->HSM1_m; /* PN */
NevalSrc(&noizDens[HSM1IDNOIZ], &lnNdens[HSM1IDNOIZ],
ckt, THERMNOISE,
here->HSM1dNodePrime, here->HSM1sNodePrime, I);
break;
case 5:
NevalSrc(&noizDens[HSM1IDNOIZ], &lnNdens[HSM1IDNOIZ],
ckt, THERMNOISE,
here->HSM1dNodePrime, here->HSM1sNodePrime, 0.0);
break;
}
NevalSrc(&noizDens[HSM1FLNOIZ], (double*) NULL,
ckt, N_GAIN,
here->HSM1dNodePrime, here->HSM1sNodePrime,
(double) 0.0);
/* flicker noise */
switch ( model->HSM1_noise ) {
case 1:
case 4: /* SPICE2 model */
noizDens[HSM1FLNOIZ] *= model->HSM1_kf
* exp(model->HSM1_af * log(MAX(fabs(here->HSM1_ids * here->HSM1_m), N_MINLOG)))
/ (pow(data->freq, model->HSM1_ef) * here->HSM1_leff
* here->HSM1_leff * (3.453133e-11 / model->HSM1_tox));
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cox */
break;
case 2:
case 3:
case 5:
/* from HiSIM */
noizDens[HSM1FLNOIZ] *= here->HSM1_nfc / data->freq;
break;
}
lnNdens[HSM1FLNOIZ] = log(MAX(noizDens[HSM1FLNOIZ], N_MINLOG));
noizDens[HSM1TOTNOIZ] = noizDens[HSM1RDNOIZ] + noizDens[HSM1RSNOIZ]
+ noizDens[HSM1IDNOIZ] + noizDens[HSM1FLNOIZ];
lnNdens[HSM1TOTNOIZ] = log(MAX(noizDens[HSM1TOTNOIZ], N_MINLOG));
*OnDens += noizDens[HSM1TOTNOIZ];
if ( data->delFreq == 0.0 ) {
/* if we haven't done any previous
integration, we need to initialize our
"history" variables.
*/
for ( i = 0; i < HSM1NSRCS; i++ )
here->HSM1nVar[LNLSTDENS][i] = lnNdens[i];
/* clear out our integration variables
if it's the first pass
*/
if (data->freq == ((NOISEAN*) ckt->CKTcurJob)->NstartFreq) {
for (i = 0; i < HSM1NSRCS; i++) {
here->HSM1nVar[OUTNOIZ][i] = 0.0;
here->HSM1nVar[INNOIZ][i] = 0.0;
}
}
}
else {
/* data->delFreq != 0.0,
we have to integrate.
*/
for ( i = 0; i < HSM1NSRCS; i++ ) {
if ( i != HSM1TOTNOIZ ) {
tempOnoise =
Nintegrate(noizDens[i], lnNdens[i],
here->HSM1nVar[LNLSTDENS][i], data);
tempInoise =
Nintegrate(noizDens[i] * data->GainSqInv,
lnNdens[i] + data->lnGainInv,
here->HSM1nVar[LNLSTDENS][i] + data->lnGainInv,
data);
here->HSM1nVar[LNLSTDENS][i] = lnNdens[i];
data->outNoiz += tempOnoise;
data->inNoise += tempInoise;
if ( ((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0 ) {
here->HSM1nVar[OUTNOIZ][i] += tempOnoise;
here->HSM1nVar[OUTNOIZ][HSM1TOTNOIZ] += tempOnoise;
here->HSM1nVar[INNOIZ][i] += tempInoise;
here->HSM1nVar[INNOIZ][HSM1TOTNOIZ] += tempInoise;
}
}
}
}
if ( data->prtSummary ) {
for (i = 0; i < HSM1NSRCS; i++) {
/* print a summary report */
data->outpVector[data->outNumber++] = noizDens[i];
}
}
break;
case INT_NOIZ:
/* already calculated, just output */
if ( ((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0 ) {
for ( i = 0; i < HSM1NSRCS; i++ ) {
data->outpVector[data->outNumber++] = here->HSM1nVar[OUTNOIZ][i];
data->outpVector[data->outNumber++] = here->HSM1nVar[INNOIZ][i];
}
}
break;
}
break;
case N_CLOSE:
/* do nothing, the main calling routine will close */
return (OK);
break; /* the plots */
} /* switch (operation) */
} /* for here */
} /* for model */
return(OK);
}

View File

@ -0,0 +1,105 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1par.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "ifsim.h"
#include "hsm1def.h"
#include "sperror.h"
#include "suffix.h"
int HSM1param(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
{
HSM1instance *here = (HSM1instance*)inst;
switch (param) {
case HSM1_W:
here->HSM1_w = value->rValue;
here->HSM1_w_Given = TRUE;
break;
case HSM1_L:
here->HSM1_l = value->rValue;
here->HSM1_l_Given = TRUE;
break;
case HSM1_M:
here->HSM1_m = value->rValue;
here->HSM1_m_Given = TRUE;
break;
case HSM1_AS:
here->HSM1_as = value->rValue;
here->HSM1_as_Given = TRUE;
break;
case HSM1_AD:
here->HSM1_ad = value->rValue;
here->HSM1_ad_Given = TRUE;
break;
case HSM1_PS:
here->HSM1_ps = value->rValue;
here->HSM1_ps_Given = TRUE;
break;
case HSM1_PD:
here->HSM1_pd = value->rValue;
here->HSM1_pd_Given = TRUE;
break;
case HSM1_NRS:
here->HSM1_nrs = value->rValue;
here->HSM1_nrs_Given = TRUE;
break;
case HSM1_NRD:
here->HSM1_nrd = value->rValue;
here->HSM1_nrd_Given = TRUE;
break;
case HSM1_TEMP:
here->HSM1_temp = value->rValue;
here->HSM1_temp_Given = TRUE;
break;
case HSM1_DTEMP:
here->HSM1_dtemp = value->rValue;
here->HSM1_dtemp_Given = TRUE;
break;
case HSM1_OFF:
here->HSM1_off = value->iValue;
break;
case HSM1_IC_VBS:
here->HSM1_icVBS = value->rValue;
here->HSM1_icVBS_Given = TRUE;
break;
case HSM1_IC_VDS:
here->HSM1_icVDS = value->rValue;
here->HSM1_icVDS_Given = TRUE;
break;
case HSM1_IC_VGS:
here->HSM1_icVGS = value->rValue;
here->HSM1_icVGS_Given = TRUE;
break;
case HSM1_IC:
switch (value->v.numValue) {
case 3:
here->HSM1_icVBS = *(value->v.vec.rVec + 2);
here->HSM1_icVBS_Given = TRUE;
case 2:
here->HSM1_icVGS = *(value->v.vec.rVec + 1);
here->HSM1_icVGS_Given = TRUE;
case 1:
here->HSM1_icVDS = *(value->v.vec.rVec);
here->HSM1_icVDS_Given = TRUE;
break;
default:
return(E_BADPARM);
}
break;
default:
return(E_BADPARM);
}
return(OK);
}

View File

@ -0,0 +1,211 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1pzld.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "cktdefs.h"
#include "complex.h"
#include "sperror.h"
#include "hsm1def.h"
#include "suffix.h"
int HSM1pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
{
HSM1model *model = (HSM1model*)inModel;
HSM1instance *here;
double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb;
double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb;
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, FwdSum, RevSum, gm, gmbs;
double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb;
double cgso, cgdo, cgbo;
double gbspsp, gbbdp, gbbsp, gbspg, gbspb;
double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp;
double m;
for ( ;model != NULL ;model = model->HSM1nextModel ) {
for ( here = model->HSM1instances ;here!= NULL ;
here = here->HSM1nextInstance ) {
if (here->HSM1owner != ARCHme)
continue;
if ( here->HSM1_mode >= 0 ) {
gm = here->HSM1_gm;
gmbs = here->HSM1_gmbs;
FwdSum = gm + gmbs;
RevSum = 0.0;
gbbdp = -here->HSM1_gbds;
gbbsp = here->HSM1_gbds + here->HSM1_gbgs + here->HSM1_gbbs;
gbdpg = here->HSM1_gbgs;
gbdpdp = here->HSM1_gbds;
gbdpb = here->HSM1_gbbs;
gbdpsp = -(gbdpg + gbdpdp + gbdpb);
gbspg = 0.0;
gbspdp = 0.0;
gbspb = 0.0;
gbspsp = 0.0;
cggb = here->HSM1_cggb;
cgsb = here->HSM1_cgsb;
cgdb = here->HSM1_cgdb;
cbgb = here->HSM1_cbgb;
cbsb = here->HSM1_cbsb;
cbdb = here->HSM1_cbdb;
cdgb = here->HSM1_cdgb;
cdsb = here->HSM1_cdsb;
cddb = here->HSM1_cddb;
}
else {
gm = -here->HSM1_gm;
gmbs = -here->HSM1_gmbs;
FwdSum = 0.0;
RevSum = -(gm + gmbs);
gbbsp = -here->HSM1_gbds;
gbbdp = here->HSM1_gbds + here->HSM1_gbgs + here->HSM1_gbbs;
gbdpg = 0.0;
gbdpsp = 0.0;
gbdpb = 0.0;
gbdpdp = 0.0;
gbspg = here->HSM1_gbgs;
gbspsp = here->HSM1_gbds;
gbspb = here->HSM1_gbbs;
gbspdp = -(gbspg + gbspsp + gbspb);
cggb = here->HSM1_cggb;
cgsb = here->HSM1_cgdb;
cgdb = here->HSM1_cgsb;
cbgb = here->HSM1_cbgb;
cbsb = here->HSM1_cbdb;
cbdb = here->HSM1_cbsb;
cdgb = -(here->HSM1_cdgb + cggb + cbgb);
cdsb = -(here->HSM1_cddb + cgsb + cbsb);
cddb = -(here->HSM1_cdsb + cgdb + cbdb);
}
gdpr = here->HSM1drainConductance;
gspr = here->HSM1sourceConductance;
gds = here->HSM1_gds;
gbd = here->HSM1_gbd;
gbs = here->HSM1_gbs;
capbd = here->HSM1_capbd;
capbs = here->HSM1_capbs;
cgso = here->HSM1_cgso;
cgdo = here->HSM1_cgdo;
cgbo = here->HSM1_cgbo;
m = here->HSM1_m;
xcdgb = (cdgb - cgdo);
xcddb = (cddb + capbd + cgdo);
xcdsb = cdsb;
xcdbb = -(xcdgb + xcddb + xcdsb);
xcsgb = -(cggb + cbgb + cdgb + cgso);
xcsdb = -(cgdb + cbdb + cddb);
xcssb = (capbs + cgso - (cgsb + cbsb + cdsb));
xcsbb = -(xcsgb + xcsdb + xcssb);
xcggb = (cggb + cgdo + cgso + cgbo);
xcgdb = (cgdb - cgdo);
xcgsb = (cgsb - cgso);
xcgbb = -(xcggb + xcgdb + xcgsb);
xcbgb = (cbgb - cgbo);
xcbdb = (cbdb - capbd);
xcbsb = (cbsb - capbs);
xcbbb = -(xcbgb + xcbdb + xcbsb);
*(here->HSM1GgPtr ) += m * xcggb * s->real;
*(here->HSM1GgPtr +1) += m * xcggb * s->imag;
*(here->HSM1BbPtr ) += m * xcbbb * s->real;
*(here->HSM1BbPtr +1) += m * xcbbb * s->imag;
*(here->HSM1DPdpPtr ) += m * xcddb * s->real;
*(here->HSM1DPdpPtr +1) += m * xcddb * s->imag;
*(here->HSM1SPspPtr ) += m * xcssb * s->real;
*(here->HSM1SPspPtr +1) += m * xcssb * s->imag;
*(here->HSM1GbPtr ) += m * xcgbb * s->real;
*(here->HSM1GbPtr +1) += m * xcgbb * s->imag;
*(here->HSM1GdpPtr ) += m * xcgdb * s->real;
*(here->HSM1GdpPtr +1) += m * xcgdb * s->imag;
*(here->HSM1GspPtr ) += m * xcgsb * s->real;
*(here->HSM1GspPtr +1) += m * xcgsb * s->imag;
*(here->HSM1BgPtr ) += m * xcbgb * s->real;
*(here->HSM1BgPtr +1) += m * xcbgb * s->imag;
*(here->HSM1BdpPtr ) += m * xcbdb * s->real;
*(here->HSM1BdpPtr +1) += m * xcbdb * s->imag;
*(here->HSM1BspPtr ) += m * xcbsb * s->real;
*(here->HSM1BspPtr +1) += m * xcbsb * s->imag;
*(here->HSM1DPgPtr ) += m * xcdgb * s->real;
*(here->HSM1DPgPtr +1) += m * xcdgb * s->imag;
*(here->HSM1DPbPtr ) += m * xcdbb * s->real;
*(here->HSM1DPbPtr +1) += m * xcdbb * s->imag;
*(here->HSM1DPspPtr ) += m * xcdsb * s->real;
*(here->HSM1DPspPtr +1) += m * xcdsb * s->imag;
*(here->HSM1SPgPtr ) += m * xcsgb * s->real;
*(here->HSM1SPgPtr +1) += m * xcsgb * s->imag;
*(here->HSM1SPbPtr ) += m * xcsbb * s->real;
*(here->HSM1SPbPtr +1) += m * xcsbb * s->imag;
*(here->HSM1SPdpPtr ) += m * xcsdb * s->real;
*(here->HSM1SPdpPtr +1) += m * xcsdb * s->imag;
*(here->HSM1DdPtr) += m * gdpr;
*(here->HSM1DdpPtr) -= m * gdpr;
*(here->HSM1DPdPtr) -= m * gdpr;
*(here->HSM1SsPtr) += m * gspr;
*(here->HSM1SspPtr) -= m * gspr;
*(here->HSM1SPsPtr) -= m * gspr;
*(here->HSM1BgPtr) -= m * here->HSM1_gbgs;
*(here->HSM1BbPtr) += m * (gbd + gbs - here->HSM1_gbbs);
*(here->HSM1BdpPtr) -= m * (gbd - gbbdp);
*(here->HSM1BspPtr) -= m * (gbs - gbbsp);
*(here->HSM1DPgPtr) += m * (gm + gbdpg);
*(here->HSM1DPdpPtr) += m * (gdpr + gds + gbd + RevSum + gbdpdp);
*(here->HSM1DPspPtr) -= m * (gds + FwdSum - gbdpsp);
*(here->HSM1DPbPtr) -= m * (gbd - gmbs - gbdpb);
*(here->HSM1SPgPtr) -= m * (gm - gbspg);
*(here->HSM1SPspPtr) += m * (gspr + gds + gbs + FwdSum + gbspsp);
*(here->HSM1SPbPtr) -= m * (gbs + gmbs - gbspb);
*(here->HSM1SPdpPtr) -= m * (gds + RevSum - gbspdp);
/*
... may nedeed in the future ...
*(here->HSM1GgPtr) -= m * xgtg;
*(here->HSM1GbPtr) -= m * xgtb;
*(here->HSM1GdpPtr) -= m * xgtd;
*(here->HSM1GspPtr) -= m * xgts;
*/
}
}
return(OK);
}

View File

@ -0,0 +1,347 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1set.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "smpdefs.h"
#include "cktdefs.h"
#include "hsm1def.h"
#include "const.h"
#include "sperror.h"
#include "suffix.h"
int HSM1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
int *states)
/* load the HSM1 device structure with those pointers needed later
* for fast matrix loading
*/
{
HSM1model *model = (HSM1model*)inModel;
HSM1instance *here;
int error;
CKTnode *tmp;
CKTnode *tmpNode;
IFuid tmpName;
/* loop through all the HSM1 device models */
for ( ;model != NULL ;model = model->HSM1nextModel ) {
/* Default value Processing for HSM1 MOSFET Models */
if ( !model->HSM1_type_Given )
model->HSM1_type = NMOS ;
/***/
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_version_Given) model->HSM1_version = 100; /* default 100 */
if ( !model->HSM1_corsrd_Given ) model->HSM1_corsrd = 0 ;
if ( !model->HSM1_coiprv_Given ) model->HSM1_coiprv = 1 ;
if ( !model->HSM1_copprv_Given ) model->HSM1_copprv = 1 ;
if ( !model->HSM1_cocgso_Given ) model->HSM1_cocgso = 0 ;
if ( !model->HSM1_cocgdo_Given ) model->HSM1_cocgdo = 0 ;
if ( !model->HSM1_cocgbo_Given ) model->HSM1_cocgbo = 0 ;
if ( !model->HSM1_coadov_Given ) model->HSM1_coadov = 1 ;
if ( !model->HSM1_coxx08_Given ) model->HSM1_coxx08 = 0 ;
if ( !model->HSM1_coxx09_Given ) model->HSM1_coxx09 = 0 ;
if ( !model->HSM1_coisub_Given ) model->HSM1_coisub = 0 ;
if ( !model->HSM1_coiigs_Given ) model->HSM1_coiigs = 0 ;
if ( !model->HSM1_cogidl_Given ) model->HSM1_cogidl = 0 ;
if ( !model->HSM1_coovlp_Given ) model->HSM1_coovlp = 0 ;
if ( !model->HSM1_conois_Given ) model->HSM1_conois = 0 ;
if ( model->HSM1_version == 110 ) {/* HiSIM1.1 */
if ( !model->HSM1_coisti_Given ) model->HSM1_coisti = 0 ;
}
/***/
if ( !model->HSM1_vmax_Given ) model->HSM1_vmax = 1.00e+7 ;
if ( !model->HSM1_bgtmp1_Given ) model->HSM1_bgtmp1 = 9.03e-5 ;
if ( !model->HSM1_bgtmp2_Given ) model->HSM1_bgtmp2 = 3.05e-7 ;
if ( !model->HSM1_tox_Given ) model->HSM1_tox = 3.60e-9 ;
if ( !model->HSM1_dl_Given ) model->HSM1_dl = 0.0 ;
if ( !model->HSM1_dw_Given ) model->HSM1_dw = 0.0 ;
if ( model->HSM1_version == 100 ) { /* HiSIM1.0 */
if ( !model->HSM1_xj_Given ) model->HSM1_xj = 0.0 ;
if ( model->HSM1_xqy_Given ) {
printf("warning(HiSIM): the model parameter XQY is only available in VERSION = 110.\n");
printf(" XQY = %f - ignored\n", model->HSM1_xqy);
}
}
else if ( model->HSM1_version == 110 ) { /* HiSIM1.1 */
if ( !model->HSM1_xqy_Given ) model->HSM1_xqy = 0.0;
if ( model->HSM1_xj_Given ) {
printf("warning(HiSIM): the model parameter XJ is only available in VERSION = 100.\n");
printf(" XJ = %f - ignored\n", model->HSM1_xj);
}
}
if ( !model->HSM1_rs_Given ) model->HSM1_rs = 0.0 ;
if ( !model->HSM1_rd_Given ) model->HSM1_rd = 0.0 ;
if ( !model->HSM1_vfbc_Given ) model->HSM1_vfbc = -0.722729 ;
if ( !model->HSM1_nsubc_Given ) model->HSM1_nsubc = 5.94e+17 ;
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_nsubp_Given ) model->HSM1_nsubp = 5.94e+17 ;
if ( !model->HSM1_scp1_Given ) model->HSM1_scp1 = 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_sc1_Given ) model->HSM1_sc1 = 13.5 ;
if ( !model->HSM1_sc2_Given ) model->HSM1_sc2 = 1.8 ;
if ( !model->HSM1_sc3_Given ) model->HSM1_sc3 = 0.0 ;
if ( !model->HSM1_pgd1_Given ) model->HSM1_pgd1 = 0.0 ;
if ( !model->HSM1_pgd2_Given ) model->HSM1_pgd2 = 0.0 ;
if ( !model->HSM1_pgd3_Given ) model->HSM1_pgd3 = 0.0 ;
if ( !model->HSM1_ndep_Given ) model->HSM1_ndep = 1.0 ;
if ( !model->HSM1_ninv_Given ) model->HSM1_ninv = 0.5 ;
if ( !model->HSM1_ninvd_Given ) model->HSM1_ninvd = 0.0 ;
if ( !model->HSM1_muecb0_Given ) model->HSM1_muecb0 = 300.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_mueph0_Given ) model->HSM1_mueph0 = 0.295 ;
if ( !model->HSM1_mueph2_Given ) model->HSM1_mueph2 = 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_muesr0_Given ) model->HSM1_muesr0 = 1.0 ;
if ( !model->HSM1_muetmp_Given ) model->HSM1_muetmp = 0.0 ;
/***/
if ( !model->HSM1_bb_Given ) {
if (model->HSM1_type == NMOS) model->HSM1_bb = 2.0 ;
else model->HSM1_bb = 1.0 ;
}
/***/
if ( !model->HSM1_vds0_Given ) model->HSM1_vds0 = 0.05 ;
if ( !model->HSM1_bc0_Given ) model->HSM1_bc0 = 0.0 ;
if ( !model->HSM1_bc1_Given ) model->HSM1_bc1 = 0.0 ;
if ( !model->HSM1_sub1_Given ) model->HSM1_sub1 = 0.0 ;
if ( !model->HSM1_sub2_Given ) model->HSM1_sub2 = -70.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_nsti_Given ) model->HSM1_nsti = 1.0e17 ;
if ( !model->HSM1_wsti_Given ) model->HSM1_wsti = 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_js0sw_Given ) model->HSM1_js0sw = 0.0 ;
if ( !model->HSM1_nj_Given ) model->HSM1_nj = 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_cj_Given ) model->HSM1_cj = 8.397247e-04;
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_mj_Given ) model->HSM1_mj = 0.5 ;
if ( !model->HSM1_mjsw_Given ) model->HSM1_mjsw = 0.33 ;
if ( !model->HSM1_mjswg_Given ) model->HSM1_mjswg = 0.33 ;
if ( !model->HSM1_pb_Given ) model->HSM1_pb = 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_xpolyd_Given ) model->HSM1_xpolyd = 0.0 ;
if ( !model->HSM1_clm1_Given ) model->HSM1_clm1 = 0.3e0 ;
if ( !model->HSM1_clm2_Given ) model->HSM1_clm2 = 0.0 ;
if ( !model->HSM1_clm3_Given ) model->HSM1_clm3 = 0.0 ;
if ( !model->HSM1_rpock1_Given ) model->HSM1_rpock1 = 0.0 ;
if ( !model->HSM1_rpock2_Given ) model->HSM1_rpock2 = 0.0 ;
if ( model->HSM1_version == 110 ) { /* HiSIM1.1 */
if ( !model->HSM1_rpocp1_Given ) model->HSM1_rpocp1 = 0.0 ;
if ( !model->HSM1_rpocp2_Given ) model->HSM1_rpocp2 = 0.0 ;
}
if ( !model->HSM1_vover_Given ) model->HSM1_vover = 0.0 ;
if ( !model->HSM1_voverp_Given ) model->HSM1_voverp = 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_qme2_Given ) model->HSM1_qme2 = 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_gidl2_Given ) model->HSM1_gidl2 = 0.0 ;
if ( !model->HSM1_gidl3_Given ) model->HSM1_gidl3 = 0.0 ;
if ( !model->HSM1_gleak1_Given ) model->HSM1_gleak1 = 0.0 ;
if ( !model->HSM1_gleak2_Given ) model->HSM1_gleak2 = 0.0 ;
if ( !model->HSM1_gleak3_Given ) model->HSM1_gleak3 = 0.0 ;
if ( !model->HSM1_vzadd0_Given ) model->HSM1_vzadd0 = 1.0e-2 ;
if ( !model->HSM1_pzadd0_Given ) model->HSM1_pzadd0 = 1.0e-3 ;
if ( !model->HSM1_nftrp_Given ) model->HSM1_nftrp = 100e9 ;
if ( !model->HSM1_nfalp_Given ) model->HSM1_nfalp = 2.00e-15 ;
if ( !model->HSM1_cit_Given ) model->HSM1_cit = 0.0 ;
/* for flicker noise the same as BSIM3 */
if ( !model->HSM1_ef_Given ) model->HSM1_ef = 0.0;
if ( !model->HSM1_af_Given ) model->HSM1_af = 1.0;
if ( !model->HSM1_kf_Given ) model->HSM1_kf = 0.0;
/* loop through all the instances of the model */
for ( here = model->HSM1instances ;here != NULL ;
here = here->HSM1nextInstance ) {
if (here->HSM1owner == ARCHme)
{
/* allocate a chunk of the state vector */
here->HSM1states = *states;
*states += HSM1numStates;
}
/* 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_w_Given ) here->HSM1_w = 5.0e-6 ;
if ( !here->HSM1_m_Given ) here->HSM1_m = 1;
if ( !here->HSM1_ad_Given ) here->HSM1_ad = 0.0 ;
if ( !here->HSM1_as_Given ) here->HSM1_as = 0.0 ;
if ( !here->HSM1_pd_Given ) here->HSM1_pd = 0.0 ;
if ( !here->HSM1_ps_Given ) here->HSM1_ps = 0.0 ;
if ( !here->HSM1_nrd_Given ) here->HSM1_nrd = 0.0 ;
if ( !here->HSM1_nrs_Given ) here->HSM1_nrs = 0.0 ;
if ( !here->HSM1_temp_Given ) here->HSM1_temp = 300.15 ;
if ( !here->HSM1_dtemp_Given ) here->HSM1_dtemp = 0.0 ;
if ( !here->HSM1_icVBS_Given ) here->HSM1_icVBS = 0.0;
if ( !here->HSM1_icVDS_Given ) here->HSM1_icVDS = 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_dw;
here->HSM1_leff = here->HSM1_l - 2.0e0 * model->HSM1_dl;
/* process source/drain series resistance added by K.M. */
/* Drain and source conductances are always zero,
because there is no sheet resistance in HSM1 model param.
if ( model->HSM1_corsrd )
here->HSM1drainConductance = 0.0;
else
here->HSM1drainConductance = model->HSM1_rs / here->HSM1_weff;
if ( here->HSM1drainConductance > 0.0 )
here->HSM1drainConductance = 1.0 / here->HSM1drainConductance;
else
here->HSM1drainConductance = 0.0;
if ( model->HSM1_corsrd )
here->HSM1sourceConductance = 0.0;
else
here->HSM1sourceConductance = model->HSM1_rd / here->HSM1_weff;
if ( here->HSM1sourceConductance > 0.0 )
here->HSM1sourceConductance = 1.0 / here->HSM1sourceConductance;
else
here->HSM1sourceConductance = 0.0;
*/
here->HSM1drainConductance = 0.0;
here->HSM1sourceConductance = 0.0;
/* process drain series resistance */
if( here->HSM1drainConductance > 0.0 && here->HSM1dNodePrime == 0 ) {
error = CKTmkVolt(ckt, &tmp, here->HSM1name, "drain");
if (error) return(error);
here->HSM1dNodePrime = tmp->number;
if (ckt->CKTcopyNodesets) {
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
if (tmpNode->nsGiven) {
tmp->nodeset=tmpNode->nodeset;
tmp->nsGiven=tmpNode->nsGiven;
}
}
}
}
else {
here->HSM1dNodePrime = here->HSM1dNode;
}
/* process source series resistance */
if( here->HSM1sourceConductance > 0.0 && here->HSM1sNodePrime == 0 ) {
if ( here->HSM1sNodePrime == 0 ) {
error = CKTmkVolt(ckt, &tmp, here->HSM1name, "source");
if (error) return(error);
here->HSM1sNodePrime = tmp->number;
if (ckt->CKTcopyNodesets) {
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
if (tmpNode->nsGiven) {
tmp->nodeset=tmpNode->nodeset;
tmp->nsGiven=tmpNode->nsGiven;
}
}
}
}
}
else {
here->HSM1sNodePrime = here->HSM1sNode;
}
/* set Sparse Matrix Pointers */
/* macro to make elements with built in test for out of memory */
#define TSTALLOC(ptr,first,second) \
if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
return(E_NOMEM);\
}
TSTALLOC(HSM1DdPtr, HSM1dNode, HSM1dNode)
TSTALLOC(HSM1GgPtr, HSM1gNode, HSM1gNode)
TSTALLOC(HSM1SsPtr, HSM1sNode, HSM1sNode)
TSTALLOC(HSM1BbPtr, HSM1bNode, HSM1bNode)
TSTALLOC(HSM1DPdpPtr, HSM1dNodePrime, HSM1dNodePrime)
TSTALLOC(HSM1SPspPtr, HSM1sNodePrime, HSM1sNodePrime)
TSTALLOC(HSM1DdpPtr, HSM1dNode, HSM1dNodePrime)
TSTALLOC(HSM1GbPtr, HSM1gNode, HSM1bNode)
TSTALLOC(HSM1GdpPtr, HSM1gNode, HSM1dNodePrime)
TSTALLOC(HSM1GspPtr, HSM1gNode, HSM1sNodePrime)
TSTALLOC(HSM1SspPtr, HSM1sNode, HSM1sNodePrime)
TSTALLOC(HSM1BdpPtr, HSM1bNode, HSM1dNodePrime)
TSTALLOC(HSM1BspPtr, HSM1bNode, HSM1sNodePrime)
TSTALLOC(HSM1DPspPtr, HSM1dNodePrime, HSM1sNodePrime)
TSTALLOC(HSM1DPdPtr, HSM1dNodePrime, HSM1dNode)
TSTALLOC(HSM1BgPtr, HSM1bNode, HSM1gNode)
TSTALLOC(HSM1DPgPtr, HSM1dNodePrime, HSM1gNode)
TSTALLOC(HSM1SPgPtr, HSM1sNodePrime, HSM1gNode)
TSTALLOC(HSM1SPsPtr, HSM1sNodePrime, HSM1sNode)
TSTALLOC(HSM1DPbPtr, HSM1dNodePrime, HSM1bNode)
TSTALLOC(HSM1SPbPtr, HSM1sNodePrime, HSM1bNode)
TSTALLOC(HSM1SPdpPtr, HSM1sNodePrime, HSM1dNodePrime)
}
}
return(OK);
}
int
HSM1unsetup (GENmodel *inModel, CKTcircuit *ckt)
{
HSM1model *model;
HSM1instance *here;
for (model = (HSM1model *) inModel; model != NULL;
model = model->HSM1nextModel)
{
for (here = model->HSM1instances; here != NULL;
here = here->HSM1nextInstance)
{
if (here->HSM1dNodePrime
&& here->HSM1dNodePrime != here->HSM1dNode)
{
CKTdltNNum (ckt, here->HSM1dNodePrime);
here->HSM1dNodePrime = 0;
}
if (here->HSM1sNodePrime
&& here->HSM1sNodePrime != here->HSM1sNode)
{
CKTdltNNum (ckt, here->HSM1sNodePrime);
here->HSM1sNodePrime = 0;
}
}
}
return OK;
}

View File

@ -0,0 +1,35 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1temp.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "smpdefs.h"
#include "cktdefs.h"
#include "hsm1def.h"
#include "const.h"
#include "sperror.h"
#include "suffix.h"
int HSM1temp(GENmodel *inModel, CKTcircuit *ckt)
{
/* "ckt->CKTtemp" dependence of HiSIM parameters is treated all in
* HSM1evaluate1_0/1_1(). So there is no task in HSM1temp().
*/
/*
if (here->HSM1owner != ARCHme)
continue;
*/
return(OK);
}

View File

@ -0,0 +1,53 @@
/***********************************************************************
HiSIM v1.1.0
File: hsm1trunc.c of HiSIM v1.1.0
Copyright (C) 2002 STARC
June 30, 2002: developed by Hiroshima University and STARC
June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group
***********************************************************************/
/*
* Modified by Paolo Nenzi 2002
* ngspice integration
*/
#include "ngspice.h"
#include "cktdefs.h"
#include "hsm1def.h"
#include "sperror.h"
#include "suffix.h"
int HSM1trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep)
{
HSM1model *model = (HSM1model*)inModel;
HSM1instance *here;
#ifdef STEPDEBUG
double debugtemp;
#endif /* STEPDEBUG */
for ( ;model != NULL ;model = model->HSM1nextModel ) {
for ( here=model->HSM1instances ;here!=NULL ;
here = here->HSM1nextInstance ) {
if (here->HSM1owner != ARCHme)
continue;
#ifdef STEPDEBUG
debugtemp = *timeStep;
#endif /* STEPDEBUG */
CKTterr(here->HSM1qb,ckt,timeStep);
CKTterr(here->HSM1qg,ckt,timeStep);
CKTterr(here->HSM1qd,ckt,timeStep);
#ifdef STEPDEBUG
if ( debugtemp != *timeStep )
printf("device %s reduces step from %g to %g\n",
here->HSM1name, debugtemp, *timeStep);
#endif /* STEPDEBUG */
}
}
return(OK);
}