changed to hisim2
This commit is contained in:
parent
5a2d6617db
commit
7d1dc4224e
|
|
@ -1,6 +0,0 @@
|
|||
Makefile.in
|
||||
Makefile
|
||||
.deps
|
||||
.libs
|
||||
*.lo
|
||||
*.la
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
EXTRA_DIST = hsm1eval1_0.c hsm1eval1_1.c
|
||||
|
||||
noinst_LTLIBRARIES = libhisim.la
|
||||
|
||||
libhisim_la_SOURCES = hisim.h \
|
||||
hsm1.c \
|
||||
hsm1acld.c \
|
||||
hsm1ask.c \
|
||||
hsm1cvtest.c \
|
||||
hsm1def.h \
|
||||
hsm1del.c \
|
||||
hsm1dest.c \
|
||||
hsm1eval102.c \
|
||||
hsm1eval112.c \
|
||||
hsm1eval120.c \
|
||||
hsm1evalenv.h \
|
||||
hsm1ext.h \
|
||||
hsm1getic.c \
|
||||
hsm1init.c \
|
||||
hsm1init.h \
|
||||
hsm1itf.h \
|
||||
hsm1ld.c \
|
||||
hsm1mask.c \
|
||||
hsm1mdel.c \
|
||||
hsm1mpar.c \
|
||||
hsm1noi.c \
|
||||
hsm1par.c \
|
||||
hsm1pzld.c \
|
||||
hsm1set.c \
|
||||
hsm1temp.c \
|
||||
hsm1trunc.c
|
||||
|
||||
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/src/include
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
|
|
@ -1,406 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hisim.h of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
#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 ;
|
||||
|
||||
/* version */
|
||||
double version ;
|
||||
|
||||
/* 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 igate */
|
||||
int cogidl ; /* calculate igidl */
|
||||
int cogisl ; /* calculate igisl */
|
||||
int coovlp ; /* calculate overlap charge */
|
||||
int conois ; /* calculate 1/f noise */
|
||||
int coisti ; /* calculate STI */
|
||||
int cosmbi ; /* bias smoothing in dVth */
|
||||
|
||||
/* 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] */
|
||||
double m ; /* multiplier */
|
||||
|
||||
/* 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 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 = minimum conductance of SPICE3 */
|
||||
/**/
|
||||
double glpart1 ; /* partition of gate leackage current */
|
||||
double glpart2 ;
|
||||
double kappa ; /* */
|
||||
double xdiffd ; /* */
|
||||
double pthrou ; /* */
|
||||
double vdiffj ; /* */
|
||||
|
||||
} 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 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 igate ; /* gate current due to tunneling [A] */
|
||||
double gggs ; /* trans conductance (dIgate/dVgs) [S] */
|
||||
double ggds ; /* trans conductance (dIgate/dVds) [S] */
|
||||
double ggbs ; /* trans conductance (dIgate/dVbs) [S] */
|
||||
/**/
|
||||
double igateb ; /* gate current due to tunneling [A] (G->B)*/
|
||||
double ggbgs ; /* trans conductance (dIgateb/dVgs) [S] */
|
||||
double ggbds ; /* trans conductance (dIgateb/dVds) [S] */
|
||||
double ggbbs ; /* trans conductance (dIgateb/dVbs) [S] */
|
||||
/**/
|
||||
double igates ; /* gate current due to tunneling [A] (G->S)*/
|
||||
double ggsgs ; /* trans conductance (dIgates/dVgs) [S] */
|
||||
double ggsds ; /* trans conductance (dIgates/dVds) [S] */
|
||||
double ggsbs ; /* trans conductance (dIgates/dVbs) [S] */
|
||||
/**/
|
||||
double igated ; /* gate current due to tunneling [A] (G->D)*/
|
||||
double ggdgs ; /* trans conductance (dIgated/dVgs) [S] */
|
||||
double ggdds ; /* trans conductance (dIgated/dVds) [S] */
|
||||
double ggdbs ; /* trans conductance (dIgated/dVbs) [S] */
|
||||
/**/
|
||||
double igidl ; /* gate induced drain leakage [A] */
|
||||
double ggidlgs ; /* trans conductance (dIgidl/dVgs) [S] */
|
||||
double ggidlds ; /* trans conductance (dIgidl/dVds) [S] */
|
||||
double ggidlbs ; /* trans conductance (dIgidl/dVbs) [S] */
|
||||
/**/
|
||||
double igisl ; /* gate induced source leakage [A] */
|
||||
double ggislgd ; /* trans conductance (dIgisl/dVgs) [S] */
|
||||
double ggislsd ; /* trans conductance (dIgisl/dVds) [S] */
|
||||
double ggislbd ; /* trans conductance (dIgisl/dVbs) [S] */
|
||||
/**/
|
||||
double nois_idsfl ;
|
||||
double nois_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 ;
|
||||
|
||||
/* intrinsic charges */
|
||||
double qg_int ;
|
||||
double qd_int ;
|
||||
double qs_int ;
|
||||
double qb_int ;
|
||||
|
||||
} 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.
|
||||
-------------------------------------------*/
|
||||
|
||||
|
||||
extern int HSM1evaluate102(
|
||||
HiSIM_input sIN,
|
||||
HiSIM_output *pOT,
|
||||
HiSIM_messenger *pMS
|
||||
) ;
|
||||
extern int HSM1evaluate112
|
||||
(
|
||||
HiSIM_input sIN,
|
||||
HiSIM_output *pOT,
|
||||
HiSIM_messenger *pMS
|
||||
) ;
|
||||
extern int HSM1evaluate120
|
||||
(
|
||||
HiSIM_input sIN,
|
||||
HiSIM_output *pOT,
|
||||
HiSIM_messenger *pMS
|
||||
) ;
|
||||
|
||||
#endif /* _HiSIM_H */
|
||||
|
|
@ -1,167 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1.c of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#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( "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"),
|
||||
IOP( "m", HSM1_M, IF_REAL , "Parallel multiplier")
|
||||
};
|
||||
|
||||
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 102 or 112 or 120"),
|
||||
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 igate"),
|
||||
IOP("cogidl", HSM1_MOD_COGIDL, IF_INTEGER, "calculate igidl"),
|
||||
IOP("cogisl", HSM1_MOD_COGISL, IF_INTEGER, "calculate igisl"),
|
||||
IOP("coovlp", HSM1_MOD_COOVLP, IF_INTEGER, "calculate overlap charge"),
|
||||
IOP("conois", HSM1_MOD_CONOIS, IF_INTEGER, "calculate 1/f noise"),
|
||||
IOP("coisti", HSM1_MOD_COISTI, IF_INTEGER, "calculate STI HiSIM1.1"),
|
||||
IOP("cosmbi", HSM1_MOD_COSMBI, IF_INTEGER, "biases smoothing in dvth HiSIM1.2"),
|
||||
IOP("vmax", HSM1_MOD_VMAX, IF_REAL, "saturation velocity [cm/s"),
|
||||
IOP("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("xld", HSM1_MOD_XLD, IF_REAL, "lateral diffusion of S/D under the gate [m]"),
|
||||
IOP("xwd", HSM1_MOD_XWD, IF_REAL, "lateral diffusion along the width dir. [m]"),
|
||||
IOP("xj", HSM1_MOD_XJ, IF_REAL, "HiSIM1.0.z [m]"),
|
||||
IOP("xqy", HSM1_MOD_XQY, IF_REAL, "HiSIM1.1.z or later [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 [-]"),
|
||||
IOP("scp2", HSM1_MOD_SCP2, IF_REAL, "parameter for pocket [1/V]"),
|
||||
IOP("scp3", HSM1_MOD_SCP3, IF_REAL, "parameter for pocket [m/V]"),
|
||||
IOP("sc1", HSM1_MOD_SC1, IF_REAL, "parameter for SCE [-]"),
|
||||
IOP("sc2", HSM1_MOD_SC2, IF_REAL, "parameter for SCE [1/V]"),
|
||||
IOP("sc3", HSM1_MOD_SC3, IF_REAL, "parameter for SCE [m/V]"),
|
||||
IOP("pgd1", HSM1_MOD_PGD1, IF_REAL, "parameter for gate-poly depletion [V]"),
|
||||
IOP("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("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, "Sidewall emission coefficient"),
|
||||
IOP("xti", HSM1_MOD_XTI, IF_REAL, "Junction current temparature exponent coefficient"),
|
||||
IOP("cj", HSM1_MOD_CJ, IF_REAL, "Bottom junction capacitance per unit area at zero bias [F/m^2]"),
|
||||
IOP("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]"),
|
||||
IOP("rpock2", HSM1_MOD_RPOCK2, IF_REAL, "parameter for Ids [V^2 sqrt(m)/A]"),
|
||||
IOP("rpocp1", HSM1_MOD_RPOCP1, IF_REAL, "parameter for Ids [-] HiSIM1.1"),
|
||||
IOP("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("glpart1", HSM1_MOD_GLPART1, IF_REAL, "partitoning of gate current HiSIM1.2"),
|
||||
IOP("glpart2", HSM1_MOD_GLPART2, IF_REAL, "partitoning of gate current HiSIM1.2"),
|
||||
IOP("kappa", HSM1_MOD_KAPPA, IF_REAL, "HiSIM1.2 dielectric constant for high-k stacked gate"),
|
||||
IOP("xdiffd", HSM1_MOD_XDIFFD, IF_REAL, "HiSIM1.2 parameter for W_design [m]"),
|
||||
IOP("pthrou", HSM1_MOD_PTHROU, IF_REAL, "HiSIM1.2 modify subthreshold sloop [-]"),
|
||||
IOP("vdiffj", HSM1_MOD_VDIFFJ, IF_REAL, "HiSIM1.2 threshold voltage for S/D junction diode [V]"),
|
||||
IOP( "ef", HSM1_MOD_EF, IF_REAL, "flicker noise frequency exponent"),
|
||||
IOP( "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);
|
||||
|
||||
|
|
@ -1,273 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1acld.c of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "cktdefs.h"
|
||||
#include "hsm1def.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
|
||||
int
|
||||
HSM1acLoad(GENmodel *inModel, register CKTcircuit *ckt)
|
||||
{
|
||||
register HSM1model *model = (HSM1model*)inModel;
|
||||
register 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 gIbtotg, gIbtotd, gIbtots, gIbtotb;
|
||||
double gIgtotg, gIgtotd, gIgtots, gIgtotb;
|
||||
double gIdtotg, gIdtotd, gIdtots, gIdtotb;
|
||||
double gIstotg, gIstotd, gIstots, gIstotb;
|
||||
|
||||
double m; /* Multiplier */
|
||||
|
||||
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;
|
||||
|
||||
if (model->HSM1_coiigs) {
|
||||
gIbtotg = here->HSM1_gigbg;
|
||||
gIbtotd = here->HSM1_gigbd;
|
||||
gIbtots = here->HSM1_gigbs;
|
||||
gIbtotb = here->HSM1_gigbb;
|
||||
|
||||
gIstotg = here->HSM1_gigsg;
|
||||
gIstotd = here->HSM1_gigsd;
|
||||
gIstots = here->HSM1_gigss;
|
||||
gIstotb = here->HSM1_gigsb;
|
||||
|
||||
gIdtotg = here->HSM1_gigdg;
|
||||
gIdtotd = here->HSM1_gigdd;
|
||||
gIdtots = here->HSM1_gigds;
|
||||
gIdtotb = here->HSM1_gigdb;
|
||||
}
|
||||
else {
|
||||
gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0;
|
||||
gIstotg = gIstotd = gIstots = gIstotb = 0.0;
|
||||
gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0;
|
||||
}
|
||||
|
||||
if (model->HSM1_coiigs) {
|
||||
gIgtotg = gIbtotg + gIstotg + gIdtotg;
|
||||
gIgtotd = gIbtotd + gIstotd + gIdtotd;
|
||||
gIgtots = gIbtots + gIstots + gIdtots;
|
||||
gIgtotb = gIbtotb + gIstotb + gIdtotb;
|
||||
}
|
||||
else
|
||||
gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0;
|
||||
|
||||
cggb = here->HSM1_cggb;
|
||||
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);
|
||||
|
||||
if (model->HSM1_coiigs) {
|
||||
gIbtotg = here->HSM1_gigbg;
|
||||
gIbtotd = here->HSM1_gigbd;
|
||||
gIbtots = here->HSM1_gigbs;
|
||||
gIbtotb = here->HSM1_gigbb;
|
||||
|
||||
gIstotg = here->HSM1_gigsg;
|
||||
gIstotd = here->HSM1_gigsd;
|
||||
gIstots = here->HSM1_gigss;
|
||||
gIstotb = here->HSM1_gigsb;
|
||||
|
||||
gIdtotg = here->HSM1_gigdg;
|
||||
gIdtotd = here->HSM1_gigdd;
|
||||
gIdtots = here->HSM1_gigds;
|
||||
gIdtotb = here->HSM1_gigdb;
|
||||
}
|
||||
else {
|
||||
gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0;
|
||||
gIstotg = gIstotd = gIstots = gIstotb = 0.0;
|
||||
gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0;
|
||||
}
|
||||
|
||||
if (model->HSM1_coiigs) {
|
||||
gIgtotg = gIbtotg + gIstotg + gIdtotg;
|
||||
gIgtotd = gIbtotd + gIstotd + gIdtotd;
|
||||
gIgtots = gIbtots + gIstots + gIdtots;
|
||||
gIgtotb = gIbtotb + gIstotb + gIdtotb;
|
||||
}
|
||||
else
|
||||
gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0;
|
||||
|
||||
cggb = here->HSM1_cggb;
|
||||
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;
|
||||
|
||||
m = here->HSM1_m;
|
||||
|
||||
*(here->HSM1GgPtr +1) += m * xcggb;
|
||||
*(here->HSM1GgPtr) += m * gIgtotg;
|
||||
*(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->HSM1GbPtr) += m * gIgtotb;
|
||||
*(here->HSM1GdpPtr +1) += m * xcgdb;
|
||||
*(here->HSM1GdpPtr) += m * gIgtotd;
|
||||
*(here->HSM1GspPtr +1) += m * xcgsb;
|
||||
*(here->HSM1GspPtr) += m * gIgtots;
|
||||
*(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 - gIbtotb);
|
||||
*(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 + gIbtotg);
|
||||
*(here->HSM1BdpPtr) -= m * (gbd - gbbdp + gIbtotd);
|
||||
*(here->HSM1BspPtr) -= m * (gbs - gbbsp + gIbtots);
|
||||
|
||||
*(here->HSM1DPdPtr) += m * (gdpr - gIdtotd);
|
||||
*(here->HSM1DPgPtr) += m * (gm + gbdpg - gIdtotg);
|
||||
*(here->HSM1DPbPtr) -= m * (gbd - gmbs - gbdpb + gIdtotb);
|
||||
*(here->HSM1DPspPtr) -= m * (gds + FwdSum - gbdpsp + gIdtots);
|
||||
|
||||
*(here->HSM1SPgPtr) -= m * (gm - gbspg + gIstotg);
|
||||
*(here->HSM1SPsPtr) -= m * (gspr - gIstots);
|
||||
*(here->HSM1SPbPtr) -= m * (gbs + gmbs - gbspb + gIstotb);
|
||||
*(here->HSM1SPdpPtr) -= m * (gds + RevSum - gbspdp + gIstotd);
|
||||
|
||||
/* stamp gidl */
|
||||
*(here->HSM1DPdpPtr) += m * here->HSM1_gigidlds;
|
||||
*(here->HSM1DPgPtr) += m * here->HSM1_gigidlgs;
|
||||
*(here->HSM1DPspPtr) -= m * (here->HSM1_gigidlgs +
|
||||
here->HSM1_gigidlds + here->HSM1_gigidlbs);
|
||||
*(here->HSM1DPbPtr) += m * here->HSM1_gigidlbs;
|
||||
*(here->HSM1BdpPtr) -= m * here->HSM1_gigidlds;
|
||||
*(here->HSM1BgPtr) -= m * here->HSM1_gigidlgs;
|
||||
*(here->HSM1BspPtr) += m * (here->HSM1_gigidlgs +
|
||||
here->HSM1_gigidlds + here->HSM1_gigidlbs);
|
||||
*(here->HSM1BbPtr) -= m * here->HSM1_gigidlbs;
|
||||
/* stamp gisl */
|
||||
*(here->HSM1SPdpPtr) -= m * (here->HSM1_gigislsd +
|
||||
here->HSM1_gigislgd + here->HSM1_gigislbd);
|
||||
*(here->HSM1SPgPtr) += m * here->HSM1_gigislgd;
|
||||
*(here->HSM1SPspPtr) += m * here->HSM1_gigislsd;
|
||||
*(here->HSM1SPbPtr) += m * here->HSM1_gigislbd;
|
||||
*(here->HSM1BdpPtr) += m * (here->HSM1_gigislgd +
|
||||
here->HSM1_gigislsd + here->HSM1_gigislbd);
|
||||
*(here->HSM1BgPtr) -= m * here->HSM1_gigislgd;
|
||||
*(here->HSM1BspPtr) -= m * here->HSM1_gigislsd;
|
||||
*(here->HSM1BbPtr) -= m * here->HSM1_gigislbd;
|
||||
|
||||
/*
|
||||
*(here->HSM1GgPtr) -= m * xgtg;
|
||||
*(here->HSM1GbPtr) -= m * xgtb;
|
||||
*(here->HSM1GdpPtr) -= m * xgtd;
|
||||
*(here->HSM1GspPtr) -= m * xgts;
|
||||
*/
|
||||
|
||||
}
|
||||
}
|
||||
return(OK);
|
||||
}
|
||||
|
|
@ -1,229 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1ask.c of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#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;
|
||||
|
||||
NG_IGNORE(select);
|
||||
|
||||
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 */
|
||||
}
|
||||
|
|
@ -1,120 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1cvtest.c of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#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, register CKTcircuit *ckt)
|
||||
{
|
||||
register HSM1model *model = (HSM1model*)inModel;
|
||||
register 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 ) {
|
||||
#ifdef XSPICE
|
||||
/* gtri - begin - wbk - report conv prob */
|
||||
if(ckt->enh->conv_debug.report_conv_probs) {
|
||||
ENHreport_conv_prob(ENH_ANALOG_INSTANCE,
|
||||
(char *) here->HSM1name,
|
||||
"");
|
||||
}
|
||||
/* gtri - end - wbk - report conv prob */
|
||||
#endif
|
||||
ckt->CKTnoncon++;
|
||||
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 ) {
|
||||
#ifdef XSPICE
|
||||
/* gtri - begin - wbk - report conv prob */
|
||||
if(ckt->enh->conv_debug.report_conv_probs) {
|
||||
ENHreport_conv_prob(ENH_ANALOG_INSTANCE,
|
||||
(char *) here->HSM1name,
|
||||
"");
|
||||
}
|
||||
/* gtri - end - wbk - report conv prob */
|
||||
#endif
|
||||
ckt->CKTnoncon++;
|
||||
return(OK);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return(OK);
|
||||
}
|
||||
|
|
@ -1,732 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1def.h of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#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 */
|
||||
/*DW next is additional in ngspice */
|
||||
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 effective width of the channel region */
|
||||
double HSM1_leff; /* the effective 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;
|
||||
*/
|
||||
|
||||
double HSM1_mu; /* mobility */
|
||||
double HSM1_igidl; /* gate induced drain leakage */
|
||||
double HSM1_gigidlgs;
|
||||
double HSM1_gigidlds;
|
||||
double HSM1_gigidlbs;
|
||||
double HSM1_igisl; /* gate induced source leakage */
|
||||
double HSM1_gigislgd;
|
||||
double HSM1_gigislsd;
|
||||
double HSM1_gigislbd;
|
||||
double HSM1_igb; /* gate tunneling current (gate to bulk) */
|
||||
double HSM1_gigbg;
|
||||
double HSM1_gigbd;
|
||||
double HSM1_gigbb;
|
||||
double HSM1_gigbs;
|
||||
double HSM1_igs; /* gate tunneling current (gate to source) */
|
||||
double HSM1_gigsg;
|
||||
double HSM1_gigsd;
|
||||
double HSM1_gigsb;
|
||||
double HSM1_gigss;
|
||||
double HSM1_igd; /* gate tunneling current (gate to drain) */
|
||||
double HSM1_gigdg;
|
||||
double HSM1_gigdd;
|
||||
double HSM1_gigdb;
|
||||
double HSM1_gigds;
|
||||
double HSM1_qg_int ;
|
||||
double HSM1_qd_int ;
|
||||
double HSM1_qs_int ;
|
||||
double HSM1_qb_int ;
|
||||
|
||||
/* no use in SPICE3f5
|
||||
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 101/111/120 */
|
||||
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_cogisl ;
|
||||
int HSM1_coovlp ;
|
||||
int HSM1_conois ;
|
||||
int HSM1_coisti ; /* HiSIM1.1 */
|
||||
int HSM1_cosmbi ; /* HiSIM1.2 */
|
||||
|
||||
/* HiSIM original */
|
||||
double HSM1_vmax ;
|
||||
double HSM1_bgtmp1 ;
|
||||
double HSM1_bgtmp2 ;
|
||||
double HSM1_tox ;
|
||||
double HSM1_xld ;
|
||||
double HSM1_xwd ;
|
||||
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_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 ;
|
||||
double HSM1_glpart1 ; /* HiSIM1.2 */
|
||||
double HSM1_glpart2 ; /* HiSIM1.2 */
|
||||
double HSM1_kappa ; /* HiSIM1.2 */
|
||||
double HSM1_xdiffd ; /* HiSIM1.2 */
|
||||
double HSM1_pthrou ; /* HiSIM1.2 */
|
||||
double HSM1_vdiffj ; /* HiSIM1.2 */
|
||||
|
||||
/* for flicker noise of SPICE3 added by K.M. */
|
||||
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_cogisl_Given :1;
|
||||
unsigned HSM1_coovlp_Given :1;
|
||||
unsigned HSM1_conois_Given :1;
|
||||
unsigned HSM1_coisti_Given :1; /* HiSIM1.1 */
|
||||
unsigned HSM1_cosmbi_Given :1; /* HiSIM1.2 */
|
||||
unsigned HSM1_glpart1_Given :1; /* HiSIM1.2 */
|
||||
unsigned HSM1_glpart2_Given :1; /* HiSIM1.2 */
|
||||
unsigned HSM1_kappa_Given :1; /* HiSIM1.2 */
|
||||
unsigned HSM1_xdiffd_Given :1; /* HiSIM1.2 */
|
||||
unsigned HSM1_pthrou_Given :1; /* HiSIM1.2 */
|
||||
unsigned HSM1_vdiffj_Given :1; /* HiSIM1.2 */
|
||||
unsigned HSM1_vmax_Given :1;
|
||||
unsigned HSM1_bgtmp1_Given :1;
|
||||
unsigned HSM1_bgtmp2_Given :1;
|
||||
unsigned HSM1_tox_Given :1;
|
||||
unsigned HSM1_xld_Given :1;
|
||||
unsigned HSM1_xwd_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_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 */
|
||||
#define HSM1_MOD_COSMBI 27 /* HiSIM1.2 */
|
||||
#define HSM1_MOD_COGISL 28 /* HiSIM1.2 */
|
||||
/* device parameters */
|
||||
#define HSM1_L 51
|
||||
#define HSM1_W 52
|
||||
#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
|
||||
#define HSM1_M 66
|
||||
|
||||
/* 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_XLD 106
|
||||
#define HSM1_MOD_XWD 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_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_GLPART1 212 /* HiSIM1.2 */
|
||||
#define HSM1_MOD_GLPART2 213 /* HiSIM1.2 */
|
||||
#define HSM1_MOD_KAPPA 214 /* HiSIM1.2 */
|
||||
#define HSM1_MOD_XDIFFD 215 /* HiSIM1.2 */
|
||||
#define HSM1_MOD_PTHROU 216 /* HiSIM1.2 */
|
||||
#define HSM1_MOD_VDIFFJ 217 /* HiSIM1.2 */
|
||||
#define HSM1_MOD_NFTRP 401
|
||||
#define HSM1_MOD_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*/
|
||||
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1del.c of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#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);
|
||||
}
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1dest.c of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#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 = 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
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,80 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1evalenv.h of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#ifndef HSM1_EVAL_ENV_H
|
||||
#define HSM1_EVAL_ENV_H
|
||||
|
||||
/* macros and constants used in hsm1eval1_y_z.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, SiO2 and vacuum */
|
||||
#define C_ESI (1.034943e-12)
|
||||
#define C_EOX (3.453133e-13)
|
||||
#define C_VAC (8.8541878e-14)
|
||||
|
||||
/* 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 */
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1ext.h of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
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*);
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1getic of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#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);
|
||||
}
|
||||
|
||||
|
|
@ -1,82 +0,0 @@
|
|||
#include "config.h"
|
||||
|
||||
#include "devdefs.h"
|
||||
|
||||
#include "hsm1def.h"
|
||||
#include "hsm1itf.h"
|
||||
#include "hsm1init.h"
|
||||
|
||||
SPICEdev HSM1info = {
|
||||
{ "HiSIM1",
|
||||
"Hiroshima University STARC IGFET Model 1.2.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;
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
#ifndef _HISIMINIT_H
|
||||
#define _HISIMINIT_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
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1itf.h of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#ifndef DEV_HISIM1
|
||||
#define DEV_HISIM1
|
||||
|
||||
SPICEdev *get_hsm1_info(void);
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,393 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1mask.c of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#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;
|
||||
|
||||
NG_IGNORE(ckt);
|
||||
|
||||
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_COGISL:
|
||||
value->iValue = model->HSM1_cogisl;
|
||||
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_COSMBI: /* HiSIM1.2 */
|
||||
value->iValue = model->HSM1_cosmbi;
|
||||
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_XLD:
|
||||
value->rValue = model->HSM1_xld;
|
||||
return(OK);
|
||||
case HSM1_MOD_XWD:
|
||||
value->rValue = model->HSM1_xwd;
|
||||
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_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_GLPART1: /* HiSIM1.2 */
|
||||
value->rValue = model->HSM1_glpart1;
|
||||
return(OK);
|
||||
case HSM1_MOD_GLPART2: /* HiSIM1.2 */
|
||||
value->rValue = model->HSM1_glpart2;
|
||||
return(OK);
|
||||
case HSM1_MOD_KAPPA: /* HiSIM1.2 */
|
||||
value->rValue = model->HSM1_kappa;
|
||||
return(OK);
|
||||
case HSM1_MOD_XDIFFD: /* HiSIM1.2 */
|
||||
value->rValue = model->HSM1_xdiffd;
|
||||
return(OK);
|
||||
case HSM1_MOD_PTHROU: /* HiSIM1.2 */
|
||||
value->rValue = model->HSM1_pthrou;
|
||||
return(OK);
|
||||
case HSM1_MOD_VDIFFJ: /* HiSIM1.2 */
|
||||
value->rValue = model->HSM1_vdiffj;
|
||||
return(OK);
|
||||
case HSM1_MOD_KF:
|
||||
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 */
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1mdel.c of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#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);
|
||||
}
|
||||
|
||||
|
|
@ -1,511 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1mpar.c of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#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_COGISL:
|
||||
mod->HSM1_cogisl = value->iValue;
|
||||
mod->HSM1_cogisl_Given = TRUE;
|
||||
break;
|
||||
case HSM1_MOD_COOVLP:
|
||||
mod->HSM1_coovlp = value->iValue;
|
||||
mod->HSM1_coovlp_Given = TRUE;
|
||||
break;
|
||||
case HSM1_MOD_CONOIS:
|
||||
mod->HSM1_conois = value->iValue;
|
||||
mod->HSM1_conois_Given = TRUE;
|
||||
break;
|
||||
case HSM1_MOD_COISTI: /* HiSIM1.1 */
|
||||
mod->HSM1_coisti = value->iValue;
|
||||
mod->HSM1_coisti_Given = TRUE;
|
||||
break;
|
||||
case HSM1_MOD_COSMBI: /* HiSIM1.2 */
|
||||
mod->HSM1_cosmbi = value->iValue;
|
||||
mod->HSM1_cosmbi_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_XLD:
|
||||
mod->HSM1_xld = value->rValue;
|
||||
mod->HSM1_xld_Given = TRUE;
|
||||
break;
|
||||
case HSM1_MOD_XWD:
|
||||
mod->HSM1_xwd = value->rValue;
|
||||
mod->HSM1_xwd_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_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_GLPART1: /* HiSIM1.2 */
|
||||
mod->HSM1_glpart1 = value->rValue;
|
||||
mod->HSM1_glpart1_Given = TRUE;
|
||||
break;
|
||||
case HSM1_MOD_GLPART2: /* HiSIM1.2 */
|
||||
mod->HSM1_glpart2 = value->rValue;
|
||||
mod->HSM1_glpart2_Given = TRUE;
|
||||
break;
|
||||
case HSM1_MOD_KAPPA: /* HiSIM1.2 */
|
||||
mod->HSM1_kappa = value->rValue;
|
||||
mod->HSM1_kappa_Given = TRUE;
|
||||
break;
|
||||
case HSM1_MOD_XDIFFD: /* HiSIM1.2 */
|
||||
mod->HSM1_xdiffd = value->rValue;
|
||||
mod->HSM1_xdiffd_Given = TRUE;
|
||||
break;
|
||||
case HSM1_MOD_PTHROU: /* HiSIM1.2 */
|
||||
mod->HSM1_pthrou = value->rValue;
|
||||
mod->HSM1_pthrou_Given = TRUE;
|
||||
break;
|
||||
case HSM1_MOD_VDIFFJ: /* HiSIM1.2 */
|
||||
mod->HSM1_vdiffj = value->rValue;
|
||||
mod->HSM1_vdiffj_Given = TRUE;
|
||||
break;
|
||||
case HSM1_MOD_KF:
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
@ -1,273 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1noi.c of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#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
|
||||
*/
|
||||
|
||||
|
||||
int
|
||||
HSM1noise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt,
|
||||
register Ndata *data, double *OnDens)
|
||||
{
|
||||
register HSM1model *model = (HSM1model *)inModel;
|
||||
register HSM1instance *here;
|
||||
char name[N_MXVLNTH];
|
||||
double tempOnoise;
|
||||
double tempInoise;
|
||||
double noizDens[HSM1NSRCS];
|
||||
double lnNdens[HSM1NSRCS];
|
||||
register int 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 =
|
||||
TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
||||
if (!data->namelist)
|
||||
return(E_NOMEM);
|
||||
SPfrontEnd->IFnewUid (ckt, &(data->namelist[data->numPlots++]),
|
||||
NULL, name, UID_OTHER, 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 =
|
||||
TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
||||
if (!data->namelist)
|
||||
return(E_NOMEM);
|
||||
SPfrontEnd->IFnewUid (ckt, &(data->namelist[data->numPlots++]),
|
||||
NULL, name, UID_OTHER, NULL);
|
||||
|
||||
(void) sprintf(name, "inoise_total.%s%s",
|
||||
(char *)here->HSM1name, HSM1nNames[i]);
|
||||
data->namelist =
|
||||
TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
||||
if (!data->namelist)
|
||||
return(E_NOMEM);
|
||||
SPfrontEnd->IFnewUid (ckt, &(data->namelist[data->numPlots++]),
|
||||
NULL, name, UID_OTHER, 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], 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] *= here->HSM1_m * model->HSM1_kf
|
||||
* exp(model->HSM1_af * log(MAX(fabs(here->HSM1_ids), 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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,104 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1par.c of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#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;
|
||||
|
||||
NG_IGNORE(select);
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
@ -1,305 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1pzld.c of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "cktdefs.h"
|
||||
#include "complex.h"
|
||||
#include "sperror.h"
|
||||
#include "hsm1def.h"
|
||||
#include "suffix.h"
|
||||
|
||||
int
|
||||
HSM1pzLoad(GENmodel *inModel, register CKTcircuit *ckt,
|
||||
register SPcomplex *s)
|
||||
{
|
||||
register HSM1model *model = (HSM1model*)inModel;
|
||||
register 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 gIbtotg, gIbtotd, gIbtots, gIbtotb;
|
||||
double gIgtotg, gIgtotd, gIgtots, gIgtotb;
|
||||
double gIdtotg, gIdtotd, gIdtots, gIdtotb;
|
||||
double gIstotg, gIstotd, gIstots, gIstotb;
|
||||
|
||||
double m; /* Multiplier */
|
||||
|
||||
NG_IGNORE(ckt);
|
||||
|
||||
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;
|
||||
|
||||
if (model->HSM1_coiigs) {
|
||||
gIbtotg = here->HSM1_gigbg;
|
||||
gIbtotd = here->HSM1_gigbd;
|
||||
gIbtots = here->HSM1_gigbs;
|
||||
gIbtotb = here->HSM1_gigbb;
|
||||
|
||||
gIstotg = here->HSM1_gigsg;
|
||||
gIstotd = here->HSM1_gigsd;
|
||||
gIstots = here->HSM1_gigss;
|
||||
gIstotb = here->HSM1_gigsb;
|
||||
|
||||
gIdtotg = here->HSM1_gigdg;
|
||||
gIdtotd = here->HSM1_gigdd;
|
||||
gIdtots = here->HSM1_gigds;
|
||||
gIdtotb = here->HSM1_gigdb;
|
||||
|
||||
}
|
||||
else {
|
||||
gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0;
|
||||
gIstotg = gIstotd = gIstots = gIstotb = 0.0;
|
||||
gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0;
|
||||
}
|
||||
|
||||
if (model->HSM1_coiigs) {
|
||||
gIgtotg = gIbtotg + gIstotg + gIdtotg;
|
||||
gIgtotd = gIbtotd + gIstotd + gIdtotd;
|
||||
gIgtots = gIbtots + gIstots + gIdtots;
|
||||
gIgtotb = gIbtotb + gIstotb + gIdtotb;
|
||||
}
|
||||
else
|
||||
gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0;
|
||||
|
||||
cggb = here->HSM1_cggb;
|
||||
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;
|
||||
|
||||
if (model->HSM1_coiigs) {
|
||||
gIbtotg = here->HSM1_gigbg;
|
||||
gIbtotd = here->HSM1_gigbd;
|
||||
gIbtots = here->HSM1_gigbs;
|
||||
gIbtotb = here->HSM1_gigbb;
|
||||
|
||||
gIstotg = here->HSM1_gigsg;
|
||||
gIstotd = here->HSM1_gigsd;
|
||||
gIstots = here->HSM1_gigss;
|
||||
gIstotb = here->HSM1_gigsb;
|
||||
|
||||
gIdtotg = here->HSM1_gigdg;
|
||||
gIdtotd = here->HSM1_gigdd;
|
||||
gIdtots = here->HSM1_gigds;
|
||||
gIdtotb = here->HSM1_gigdb;
|
||||
}
|
||||
else {
|
||||
gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0;
|
||||
gIstotg = gIstotd = gIstots = gIstotb = 0.0;
|
||||
gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0;
|
||||
}
|
||||
|
||||
if (model->HSM1_coiigs) {
|
||||
gIgtotg = gIbtotg + gIstotg + gIdtotg;
|
||||
gIgtotd = gIbtotd + gIstotd + gIdtotd;
|
||||
gIgtots = gIbtots + gIstots + gIdtots;
|
||||
gIgtotb = gIbtotb + gIstotb + gIdtotb;
|
||||
}
|
||||
else
|
||||
gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0;
|
||||
|
||||
gbspg = here->HSM1_gbgs;
|
||||
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);
|
||||
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);
|
||||
|
||||
m = here->HSM1_m;
|
||||
|
||||
*(here->HSM1GgPtr ) += m * xcggb * s->real;
|
||||
*(here->HSM1GgPtr +1) += m * xcggb * s->imag;
|
||||
*(here->HSM1GgPtr) += m * gIgtotg;
|
||||
*(here->HSM1BbPtr ) += m * xcbbb * s->real;
|
||||
*(here->HSM1BbPtr +1) += m * xcbbb * s->imag;
|
||||
*(here->HSM1GbPtr) += m * gIgtotb;
|
||||
*(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->HSM1GdpPtr) += m * gIgtotd;
|
||||
*(here->HSM1GspPtr ) += m * xcgsb * s->real;
|
||||
*(here->HSM1GspPtr +1) += m * xcgsb * s->imag;
|
||||
*(here->HSM1GspPtr) += m * gIgtots;
|
||||
|
||||
*(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 + gIbtotg);
|
||||
*(here->HSM1BbPtr) += m * (gbd + gbs - here->HSM1_gbbs - gIbtotb);
|
||||
*(here->HSM1BdpPtr) -= m * (gbd - gbbdp + gIbtotd);
|
||||
*(here->HSM1BspPtr) -= m * (gbs - gbbsp + gIbtots);
|
||||
|
||||
*(here->HSM1DPgPtr) += m * (gm + gbdpg - gIdtotg);
|
||||
*(here->HSM1DPdpPtr) += m * (gdpr + gds + gbd + RevSum + gbdpdp
|
||||
- gIdtotd);
|
||||
*(here->HSM1DPspPtr) -= m * (gds + FwdSum - gbdpsp + gIdtots);
|
||||
*(here->HSM1DPbPtr) -= m * (gbd - gmbs - gbdpb + gIdtotb);
|
||||
|
||||
*(here->HSM1SPgPtr) -= m * (gm - gbspg + gIstotg);
|
||||
*(here->HSM1SPspPtr) += m * (gspr + gds + gbs + FwdSum + gbspsp
|
||||
- gIstots);
|
||||
*(here->HSM1SPbPtr) -= m * (gbs + gmbs - gbspb + gIstotb);
|
||||
*(here->HSM1SPdpPtr) -= m * (gds + RevSum - gbspdp + gIstotd);
|
||||
|
||||
/* stamp gidl */
|
||||
*(here->HSM1DPdpPtr) += m * here->HSM1_gigidlds;
|
||||
*(here->HSM1DPgPtr) += m * here->HSM1_gigidlgs;
|
||||
*(here->HSM1DPspPtr) -= m * (here->HSM1_gigidlgs +
|
||||
here->HSM1_gigidlds + here->HSM1_gigidlbs);
|
||||
*(here->HSM1DPbPtr) += m * here->HSM1_gigidlbs;
|
||||
*(here->HSM1BdpPtr) -= m * here->HSM1_gigidlds;
|
||||
*(here->HSM1BgPtr) -= m * here->HSM1_gigidlgs;
|
||||
*(here->HSM1BspPtr) += m * (here->HSM1_gigidlgs +
|
||||
here->HSM1_gigidlds + here->HSM1_gigidlbs);
|
||||
*(here->HSM1BbPtr) -= m * here->HSM1_gigidlbs;
|
||||
/* stamp gisl */
|
||||
*(here->HSM1SPdpPtr) -= m * (here->HSM1_gigislsd +
|
||||
here->HSM1_gigislgd + here->HSM1_gigislbd);
|
||||
*(here->HSM1SPgPtr) += m * here->HSM1_gigislgd;
|
||||
*(here->HSM1SPspPtr) += m * here->HSM1_gigislsd;
|
||||
*(here->HSM1SPbPtr) += m * here->HSM1_gigislbd;
|
||||
*(here->HSM1BdpPtr) += m * (here->HSM1_gigislgd +
|
||||
here->HSM1_gigislsd + here->HSM1_gigislbd);
|
||||
*(here->HSM1BgPtr) -= m * here->HSM1_gigislgd;
|
||||
*(here->HSM1BspPtr) -= m * here->HSM1_gigislsd;
|
||||
*(here->HSM1BbPtr) -= m * here->HSM1_gigislbd;
|
||||
|
||||
/*
|
||||
*(here->HSM1GgPtr) -= m * xgtg;
|
||||
*(here->HSM1GbPtr) -= m * xgtb;
|
||||
*(here->HSM1GdpPtr) -= m * xgtd;
|
||||
*(here->HSM1GspPtr) -= m * xgts;
|
||||
*/
|
||||
|
||||
}
|
||||
}
|
||||
return(OK);
|
||||
}
|
||||
|
||||
|
|
@ -1,445 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1set.c of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "smpdefs.h"
|
||||
#include "cktdefs.h"
|
||||
#include "hsm1def.h"
|
||||
#include "const.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
int
|
||||
HSM1setup(register SMPmatrix *matrix, register GENmodel *inModel,
|
||||
register CKTcircuit *ckt, int *states)
|
||||
/* load the HSM1 device structure with those pointers needed later
|
||||
* for fast matrix loading
|
||||
*/
|
||||
{
|
||||
register HSM1model *model = (HSM1model*)inModel;
|
||||
register 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 = 120; /* default 120 */
|
||||
printf(" 120 is selected for VERSION. (default) \n");
|
||||
}
|
||||
if ( model->HSM1_version == 100 || model->HSM1_version == 101) {
|
||||
printf("warning(HiSIM1): For the model parameter VERSION, 102 or 112 or 120 is acceptable.\n");
|
||||
printf(" 102 is selected for VERSION \n");
|
||||
model->HSM1_version = 102 ;
|
||||
}
|
||||
else if ( model->HSM1_version == 110 || model->HSM1_version == 111) {
|
||||
printf("warning(HiSIM1): For the model parameter VERSION, 102 or 112 or 120 is acceptable.\n");
|
||||
printf(" 112 is selected for VERSION \n");
|
||||
model->HSM1_version = 112 ;
|
||||
}
|
||||
else if ( model->HSM1_version != 102 &&
|
||||
model->HSM1_version != 112 &&
|
||||
model->HSM1_version != 120) {
|
||||
printf("warning(HiSIM1): For the model parameter VERSION, 102 or 112 or 120 is acceptable.\n");
|
||||
printf(" 120 is selected for VERSION compulsorily.\n");
|
||||
model->HSM1_version = 120 ;
|
||||
}
|
||||
else {
|
||||
/* printf(" %d is selected for VERSION \n", (int)model->HSM1_version); */
|
||||
}
|
||||
|
||||
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_version == 120 ) {/* HiSIM1.2.0 */
|
||||
if ( !model->HSM1_cogisl_Given ) model->HSM1_cogisl = 0 ;
|
||||
}
|
||||
if ( !model->HSM1_coovlp_Given ) model->HSM1_coovlp = 0 ;
|
||||
if ( !model->HSM1_conois_Given ) model->HSM1_conois = 0 ;
|
||||
if ( model->HSM1_version == 112 || model->HSM1_version == 120) {
|
||||
/* HiSIM1.1.2 HiSIM1.2.0*/
|
||||
if ( !model->HSM1_coisti_Given ) model->HSM1_coisti = 0 ;
|
||||
}
|
||||
if ( model->HSM1_version == 120 ) {/* HiSIM1.2.0 */
|
||||
if ( !model->HSM1_cosmbi_Given ) model->HSM1_cosmbi = 0 ;
|
||||
}
|
||||
else {
|
||||
if (model->HSM1_cosmbi_Given)
|
||||
printf ("warning(HiSIM1): COSMBI is only available for VERSION = 120\n");
|
||||
if ( model->HSM1_kappa_Given )
|
||||
printf ("warning(HiSIM1): KAPPA is only available for VERSION = 120\n");
|
||||
if ( model->HSM1_xdiffd_Given )
|
||||
printf ("warning(HiSIM1): XDIFFD is only available for VERSION = 120\n");
|
||||
if ( model->HSM1_vdiffj_Given )
|
||||
printf ("warning(HiSIM1): VDIFFJ is only available for VERSION = 120\n");
|
||||
if ( model->HSM1_pthrou_Given )
|
||||
printf ("warning(HiSIM1): PTHROU is only available for VERSION = 120\n");
|
||||
if ( model->HSM1_glpart1_Given )
|
||||
printf ("warning(HiSIM1): GLPART1 is only available for VERSION = 120\n");
|
||||
if ( model->HSM1_glpart2_Given )
|
||||
printf ("warning(HiSIM1): GLPART2 is only available for VERSION = 120\n");
|
||||
|
||||
/*
|
||||
printf (" This parameter is ignored.\n");
|
||||
*/
|
||||
}
|
||||
|
||||
/***/
|
||||
if ( !model->HSM1_vmax_Given ) model->HSM1_vmax = 7.00e+6 ;
|
||||
if ( !model->HSM1_bgtmp1_Given ) model->HSM1_bgtmp1 = 90.25e-6 ;
|
||||
if ( !model->HSM1_bgtmp2_Given ) model->HSM1_bgtmp2 = 100.0e-9 ;
|
||||
if ( !model->HSM1_tox_Given ) model->HSM1_tox = 5.0e-9 ;
|
||||
else if ( model->HSM1_tox < 0 ) {
|
||||
printf("warning(HiSIM1): The model parameter TOX must be positive.\n");
|
||||
}
|
||||
if ( !model->HSM1_xld_Given ) model->HSM1_xld = 0.0 ;
|
||||
if ( !model->HSM1_xwd_Given ) model->HSM1_xwd = 0.0 ;
|
||||
if ( model->HSM1_version == 102 ) { /* HiSIM1.0 */
|
||||
if ( !model->HSM1_xj_Given ) model->HSM1_xj = 0.0 ;
|
||||
else if ( model->HSM1_xj < 0 ) {
|
||||
printf("warning(HiSIM1): The model parameter XJ must be positive.\n");
|
||||
}
|
||||
if ( model->HSM1_xqy_Given ) {
|
||||
printf("warning(HiSIM1): XQY is only available for VERSION = 112 or 120\n");
|
||||
}
|
||||
}
|
||||
else if ( model->HSM1_version == 112 ||
|
||||
model->HSM1_version == 120 ) { /* HiSIM1.1.2 / 1.2.0 */
|
||||
if ( !model->HSM1_xqy_Given ) model->HSM1_xqy = 0.0;
|
||||
else if ( model->HSM1_xqy < 0 ) {
|
||||
printf("warning(HiSIM1): The model parameter XQY must be positive.\n");
|
||||
}
|
||||
if ( model->HSM1_xj_Given ) {
|
||||
printf("warning(HiSIM1): XJ is only available for VERSION = 102\n");
|
||||
}
|
||||
}
|
||||
if ( !model->HSM1_rs_Given ) model->HSM1_rs = 80.0e-6 ;
|
||||
else if ( model->HSM1_rs < 0 ) {
|
||||
printf("warning(HiSIM1): The model parameter RS must be positive.\n");
|
||||
}
|
||||
if ( !model->HSM1_rd_Given ) model->HSM1_rd = 80.0e-6 ;
|
||||
else if ( model->HSM1_rd < 0 ) {
|
||||
printf("warning(HiSIM1): The model parameter RD must be positive.\n");
|
||||
}
|
||||
if ( !model->HSM1_vfbc_Given ) model->HSM1_vfbc = -1.0 ;
|
||||
if ( !model->HSM1_nsubc_Given ) model->HSM1_nsubc = 1.0e+17 ;
|
||||
else if ( model->HSM1_nsubc < 0 ) {
|
||||
printf("warning(HiSIM1): The model parameter NSUBC must be positive.\n");
|
||||
}
|
||||
if ( model->HSM1_version == 120 ) model->HSM1_parl1 = 1.0 ;
|
||||
else {
|
||||
if ( !model->HSM1_parl1_Given ) model->HSM1_parl1 = 1.0 ;
|
||||
}
|
||||
if ( !model->HSM1_parl2_Given ) model->HSM1_parl2 = 0.0 ;
|
||||
if ( !model->HSM1_lp_Given ) model->HSM1_lp = 15.0e-9 ;
|
||||
if ( !model->HSM1_nsubp_Given ) model->HSM1_nsubp = 1.0e+17 ;
|
||||
else if ( model->HSM1_nsubp < 0 ) {
|
||||
printf("warning(HiSIM1): The model parameter NSUBP must be positive.\n");
|
||||
}
|
||||
if ( !model->HSM1_scp1_Given ) model->HSM1_scp1 = 0.0 ;
|
||||
if ( !model->HSM1_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 = 0.0 ;
|
||||
if ( !model->HSM1_sc2_Given ) model->HSM1_sc2 = 0.0 ;
|
||||
if ( !model->HSM1_sc3_Given ) model->HSM1_sc3 = 0.0 ;
|
||||
if ( !model->HSM1_pgd1_Given ) model->HSM1_pgd1 = 10.0e-3 ;
|
||||
if ( !model->HSM1_pgd2_Given ) model->HSM1_pgd2 = 1.0 ;
|
||||
if ( !model->HSM1_pgd3_Given ) model->HSM1_pgd3 = 0.8 ;
|
||||
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 = 1.0e-9 ;
|
||||
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 = 25.0e3 ;
|
||||
if ( !model->HSM1_mueph0_Given ) model->HSM1_mueph0 = 300.0e-3 ;
|
||||
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 = 2.0e15;
|
||||
if ( !model->HSM1_muesr0_Given ) model->HSM1_muesr0 = 2.0 ;
|
||||
if ( !model->HSM1_muetmp_Given ) model->HSM1_muetmp = 1.5 ;
|
||||
/***/
|
||||
if ( !model->HSM1_bb_Given ) {
|
||||
if (model->HSM1_type == NMOS) model->HSM1_bb = 2.0 ;
|
||||
else model->HSM1_bb = 1.0 ;
|
||||
}
|
||||
/***/
|
||||
if ( !model->HSM1_sub1_Given ) model->HSM1_sub1 = 10.0 ;
|
||||
if ( !model->HSM1_sub2_Given ) model->HSM1_sub2 = 20.0 ;
|
||||
if ( !model->HSM1_sub3_Given ) model->HSM1_sub3 = 0.8 ;
|
||||
if ( model->HSM1_version == 112 ||
|
||||
model->HSM1_version == 120) { /* HiSIM1.1.2 / 1.2.0 */
|
||||
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 ;
|
||||
} else {
|
||||
if ( model->HSM1_wvthsc_Given )
|
||||
printf ("warning(HiSIM1): WVTHSC is only available for VERSION = 112 or 120\n");
|
||||
if ( model->HSM1_nsti_Given )
|
||||
printf ("warning(HiSIM1): NSTI is only available for VERSION = 112 or 120\n");
|
||||
if ( model->HSM1_wsti_Given )
|
||||
printf ("warning(HiSIM1): WSTI is only available for VERSION = 112 or 120\n");
|
||||
}
|
||||
if ( !model->HSM1_tpoly_Given ) model->HSM1_tpoly = 0.0 ;
|
||||
if ( !model->HSM1_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 = 5.0e-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 = 700.0e-3 ;
|
||||
if ( !model->HSM1_clm2_Given ) model->HSM1_clm2 = 2.0 ;
|
||||
if ( !model->HSM1_clm3_Given ) model->HSM1_clm3 = 1.0 ;
|
||||
if ( !model->HSM1_rpock1_Given ) {
|
||||
if ( model->HSM1_version == 102 ) {
|
||||
model->HSM1_rpock1 = 10.0e-3 ;
|
||||
} else if ( model->HSM1_version == 112 || model->HSM1_version == 120 ) {
|
||||
model->HSM1_rpock1 = 0.1e-3 ;
|
||||
}
|
||||
}
|
||||
if ( !model->HSM1_rpock2_Given ) model->HSM1_rpock2 = 100.0e-3 ;
|
||||
if ( model->HSM1_version == 112 ||
|
||||
model->HSM1_version == 120) { /* HiSIM1.1.2 / 1.2.0 */
|
||||
if ( !model->HSM1_rpocp1_Given ) model->HSM1_rpocp1 = 1.0 ;
|
||||
if ( !model->HSM1_rpocp2_Given ) model->HSM1_rpocp2 = 0.5 ;
|
||||
} else {
|
||||
if ( model->HSM1_rpocp1_Given )
|
||||
printf ("warning(HiSIM1): RPOCP1 is only available for VERSION = 112 or 120\n");
|
||||
if ( model->HSM1_rpocp2_Given )
|
||||
printf ("warning(HiSIM1): RPOCP2 is only available for VERSION = 112 or 120\n");
|
||||
}
|
||||
if ( !model->HSM1_vover_Given ) model->HSM1_vover = 10.0e-3 ;
|
||||
if ( !model->HSM1_voverp_Given ) model->HSM1_voverp = 100.0e-3 ;
|
||||
if ( !model->HSM1_wfc_Given ) model->HSM1_wfc = 0.0 ;
|
||||
if ( !model->HSM1_qme1_Given ) model->HSM1_qme1 = 40.0e-12 ;
|
||||
if ( !model->HSM1_qme2_Given ) model->HSM1_qme2 = 300.0e-12 ;
|
||||
if ( !model->HSM1_qme3_Given ) model->HSM1_qme3 = 0.0 ;
|
||||
if ( !model->HSM1_gidl1_Given ) {
|
||||
if (model->HSM1_version == 101) model->HSM1_gidl1 = 5.0e-3 ;
|
||||
else if (model->HSM1_version == 112 ||
|
||||
model->HSM1_version == 120) model->HSM1_gidl1 = 5.0e-6 ;
|
||||
}
|
||||
if ( !model->HSM1_gidl2_Given ) model->HSM1_gidl2 = 1.0e6 ;
|
||||
if ( !model->HSM1_gidl3_Given ) model->HSM1_gidl3 = 300.0e-3 ;
|
||||
if ( !model->HSM1_gleak1_Given ) {
|
||||
if (model->HSM1_version == 101) model->HSM1_gleak1 = 0.01e6 ;
|
||||
else if (model->HSM1_version == 112 ||
|
||||
model->HSM1_version == 120) model->HSM1_gleak1 = 10.0e3 ;
|
||||
}
|
||||
if ( !model->HSM1_gleak2_Given ) model->HSM1_gleak2 = 20.0e6 ;
|
||||
if ( !model->HSM1_gleak3_Given ) model->HSM1_gleak3 = 300.0e-3 ;
|
||||
if ( !model->HSM1_vzadd0_Given ) model->HSM1_vzadd0 = 10.0e-3 ;
|
||||
if ( !model->HSM1_pzadd0_Given ) model->HSM1_pzadd0 = 5.0e-3 ;
|
||||
if ( !model->HSM1_nftrp_Given ) model->HSM1_nftrp = 10e9 ;
|
||||
if ( !model->HSM1_nfalp_Given ) model->HSM1_nfalp = 1.0e-16 ;
|
||||
if ( !model->HSM1_cit_Given ) model->HSM1_cit = 0.0 ;
|
||||
if ( model->HSM1_version == 120) { /* HiSIM1.2.0 */
|
||||
if ( !model->HSM1_glpart1_Given ) model->HSM1_glpart1 = 1 ;
|
||||
if ( !model->HSM1_glpart2_Given ) model->HSM1_glpart2 = 0.5 ;
|
||||
if ( !model->HSM1_kappa_Given ) model->HSM1_kappa = 3.90 ;
|
||||
if ( !model->HSM1_xdiffd_Given ) model->HSM1_xdiffd = 0.0;
|
||||
if ( !model->HSM1_pthrou_Given ) model->HSM1_pthrou = 0.0;
|
||||
if ( !model->HSM1_vdiffj_Given ) model->HSM1_vdiffj = 0.5;
|
||||
}
|
||||
|
||||
/* for flicker noise the same as BSIM3 */
|
||||
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 = 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;
|
||||
|
||||
here->HSM1_weff = here->HSM1_w - 2.0e0 * model->HSM1_xdiffd - 2.0e0 * model->HSM1_xwd ;
|
||||
here->HSM1_leff = here->HSM1_l - 2.0e0 * model->HSM1_xpolyd - 2.0e0 * model->HSM1_xld ;
|
||||
|
||||
/* 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)) == 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;
|
||||
}
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1temp.c of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#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)
|
||||
{
|
||||
NG_IGNORE(inModel);
|
||||
NG_IGNORE(ckt);
|
||||
|
||||
/* "ckt->CKTtemp" dependence of HiSIM parameters is treated all in
|
||||
* HSM1evaluate102/112/120(). So there is no task in HSM1temp().
|
||||
*/
|
||||
|
||||
/* PN:
|
||||
* Hope the temp dependence treated in the evaluate function does
|
||||
* not break the parallel code. Parallel code structure here suggests:
|
||||
|
||||
if (here->HSM1owner != ARCHme)
|
||||
continue;
|
||||
*/
|
||||
|
||||
return(OK);
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
/***********************************************************************
|
||||
HiSIM (Hiroshima University STARC IGFET Model)
|
||||
Copyright (C) 2003 STARC
|
||||
|
||||
VERSION : HiSIM 1.2.0
|
||||
FILE : hsm1trunc of HiSIM 1.2.0
|
||||
|
||||
April 9, 2003 : released by STARC Physical Design Group
|
||||
***********************************************************************/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "cktdefs.h"
|
||||
#include "hsm1def.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
int
|
||||
HSM1trunc(GENmodel *inModel, register CKTcircuit *ckt, double *timeStep)
|
||||
{
|
||||
register HSM1model *model = (HSM1model*)inModel;
|
||||
register 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);
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue