add the HiSIM_HV model vers. 1.2.1

This commit is contained in:
dwarning 2011-04-29 16:47:55 +00:00
parent 46da3b066e
commit 1906903fb4
36 changed files with 31387 additions and 9007 deletions

View File

@ -1033,6 +1033,7 @@ AC_CONFIG_FILES([Makefile
src/spicelib/devices/hfet1/Makefile
src/spicelib/devices/hfet2/Makefile
src/spicelib/devices/hisim/Makefile
src/spicelib/devices/hisimhv/Makefile
src/spicelib/devices/jfet/Makefile
src/spicelib/devices/jfet2/Makefile
src/spicelib/devices/ltra/Makefile

View File

@ -66,6 +66,7 @@ DYNAMIC_DEVICELIBS = \
spicelib/devices/hfet1/libhfet.la \
spicelib/devices/hfet2/libhfet2.la \
spicelib/devices/hisim/libhisim.la \
spicelib/devices/hisimhv/libhisimhv.la \
spicelib/devices/jfet/libjfet.la \
spicelib/devices/jfet2/libjfet2.la \
spicelib/devices/ltra/libltra.la \

View File

@ -29,6 +29,7 @@ SUBDIRS = \
hfet1 \
hfet2 \
hisim \
hisimhv \
jfet \
jfet2 \
ltra \
@ -89,6 +90,7 @@ DIST_SUBDIRS = \
hfet1 \
hfet2 \
hisim \
hisimhv \
jfet \
jfet2 \
ltra \

View File

@ -98,6 +98,7 @@ int add_udn(int,Evt_Udn_Info_t **);
#include "hfet1/hfetitf.h"
#include "hfet2/hfet2itf.h"
#include "hisim/hsm1itf.h"
#include "hisimhv/hsmhvitf.h"
#include "ind/inditf.h"
#include "isrc/isrcitf.h"
#include "jfet/jfetitf.h"
@ -207,63 +208,64 @@ spice_init_devices(void)
DEVices[24] = get_hfeta_info();
DEVices[25] = get_hfet2_info();
DEVices[26] = get_hsm1_info();
DEVices[27] = get_ind_info();
DEVices[28] = get_mut_info();
DEVices[29] = get_isrc_info();
DEVices[30] = get_jfet_info();
DEVices[31] = get_jfet2_info();
DEVices[32] = get_ltra_info();
DEVices[33] = get_mes_info();
DEVices[34] = get_mesa_info();
DEVices[35] = get_mos1_info();
DEVices[36] = get_mos2_info();
DEVices[37] = get_mos3_info();
DEVices[38] = get_mos6_info();
DEVices[39] = get_mos9_info();
DEVices[40] = get_res_info();
DEVices[41] = get_soi3_info();
DEVices[42] = get_sw_info();
DEVices[43] = get_tra_info();
DEVices[44] = get_txl_info();
DEVices[45] = get_vbic_info();
DEVices[46] = get_vccs_info();
DEVices[47] = get_vcvs_info();
DEVices[48] = get_vsrc_info();
DEVices[27] = get_hsmhv_info();
DEVices[28] = get_ind_info();
DEVices[29] = get_mut_info();
DEVices[30] = get_isrc_info();
DEVices[31] = get_jfet_info();
DEVices[32] = get_jfet2_info();
DEVices[33] = get_ltra_info();
DEVices[34] = get_mes_info();
DEVices[35] = get_mesa_info();
DEVices[36] = get_mos1_info();
DEVices[37] = get_mos2_info();
DEVices[38] = get_mos3_info();
DEVices[39] = get_mos6_info();
DEVices[40] = get_mos9_info();
DEVices[41] = get_res_info();
DEVices[42] = get_soi3_info();
DEVices[43] = get_sw_info();
DEVices[44] = get_tra_info();
DEVices[45] = get_txl_info();
DEVices[46] = get_vbic_info();
DEVices[47] = get_vccs_info();
DEVices[48] = get_vcvs_info();
DEVices[49] = get_vsrc_info();
#ifdef CIDER
DEVices[49] = get_nbjt_info();
DEVices[50] = get_nbjt2_info();
DEVices[51] = get_numd_info();
DEVices[52] = get_numd2_info();
DEVices[53] = get_numos_info();
DEVices[50] = get_nbjt_info();
DEVices[51] = get_nbjt2_info();
DEVices[52] = get_numd_info();
DEVices[53] = get_numd2_info();
DEVices[54] = get_numos_info();
#else
DEVices[49] = NULL;
DEVices[50] = NULL;
DEVices[51] = NULL;
DEVices[52] = NULL;
DEVices[53] = NULL;
DEVices[53] = NULL;
DEVices[54] = NULL;
#endif
#ifdef ADMS
DEVices[54] = get_hicum0_info();
DEVices[55] = get_hicum2_info();
DEVices[56] = get_mextram_info();
DEVices[57] = get_ekv_info();
DEVices[58] = get_psp102_info();
DEVices[55] = get_hicum0_info();
DEVices[56] = get_hicum2_info();
DEVices[57] = get_mextram_info();
DEVices[58] = get_ekv_info();
DEVices[59] = get_psp102_info();
#else
DEVices[54] = NULL;
DEVices[55] = NULL;
DEVices[56] = NULL;
DEVices[57] = NULL;
DEVices[58] = NULL;
DEVices[59] = NULL;
#endif
#ifdef NDEV /* NDEV */
DEVices[59] = get_ndev_info();
DEVices[60] = get_ndev_info();
#else
DEVices[59] = NULL;
#endif
DEVices[60] = NULL;
#endif
DEVices[61] = NULL;
DEVices[62] = NULL;
return;
}
@ -288,12 +290,12 @@ SPICEdev ** devices(void)
#ifdef ADMS
#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v2", "bsim4v3", "bsim4v4", "bsim4v5", \
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim", \
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim", "hisimhv", \
"cap", "cccs", "ccvs", "csw", "dio", "hfet", "hfet2", "ind", "isrc", "jfet", "ltra", "mes", "mesa" ,"mos1", "mos2", "mos3", \
"mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc", "hicum0", "hicum2", "mextram", "ekv", "psp102"}
#else
#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v4", "bsim4v2", "bsim4v3", "bsim4v4", "bsim4v5", \
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim", \
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim", "hisimhv", \
"cap", "cccs", "ccvs", "csw", "dio", "hfet", "hfet2", "ind", "isrc", "jfet", "ltra", "mes", "mesa" ,"mos1", "mos2", "mos3", \
"mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc"}
#endif

View File

@ -0,0 +1,36 @@
## Process this file with automake to produce Makefile.in
noinst_LTLIBRARIES = libhisimhv.la
libhisimhv_la_SOURCES = hisimhv.h \
hsmhv.c \
hsmhvacld.c \
hsmhvask.c \
hsmhvcvtest.c \
hsmhvdef.h \
hsmhvdel.c \
hsmhvdest.c \
hsmhveval.c \
hsmhveval_qover.h \
hsmhvevalenv.h \
hsmhvext.h \
hsmhvgetic.c \
hsmhvinit.c \
hsmhvinit.h \
hsmhvitf.h \
hsmhvld.c \
hsmhvld_info_eval.h \
hsmhvmask.c \
hsmhvmdel.c \
hsmhvmpar.c \
hsmhvnoi.c \
hsmhvpar.c \
hsmhvpzld.c \
hsmhvset.c \
hsmhvtemp.c \
hsmhvtemp_eval.h \
hsmhvtrunc.c
AM_CPPFLAGS = -I$(top_srcdir)/src/include
MAINTAINERCLEANFILES = Makefile.in

View File

@ -0,0 +1,73 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hisimhv.h
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#include "hsmhvdef.h"
#include "cktdefs.h"
#ifndef _HiSIMHV_H
#define _HiSIMHV_H
/* 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
extern int HSMHVevaluate
(
double ivds,
double ivgs,
double ivbs,
double ivdsi,
double ivgsi,
double ivbsi,
double vbs_jct,
double vbd_jct,
double vsubs,
double deltemp,
HSMHVinstance *here,
HSMHVmodel *model,
CKTcircuit *ckt
) ;
#endif /* _HiSIMHV_H */

View File

@ -0,0 +1,740 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhv.c
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#include "ngspice.h"
#include <stdio.h>
#include "devdefs.h"
#include "hsmhvdef.h"
#include "suffix.h"
IFparm HSMHVpTable[] = { /* parameters */
IOP( "coselfheat", HSMHV_COSELFHEAT, IF_INTEGER, "Calculation of self heating model"),
IOP( "cosubnode", HSMHV_COSUBNODE, IF_INTEGER, "Switch tempNode to subNode"),
IOP( "l", HSMHV_L, IF_REAL , "Length"),
IOP( "w", HSMHV_W, IF_REAL , "Width"),
IOP( "ad", HSMHV_AD, IF_REAL , "Drain area"),
IOP( "as", HSMHV_AS, IF_REAL , "Source area"),
IOP( "pd", HSMHV_PD, IF_REAL , "Drain perimeter"),
IOP( "ps", HSMHV_PS, IF_REAL , "Source perimeter"),
IOP( "nrd", HSMHV_NRD, IF_REAL , "Number of squares in drain"),
IOP( "nrs", HSMHV_NRS, IF_REAL , "Number of squares in source"),
IOP( "dtemp", HSMHV_DTEMP,IF_REAL , ""),
IOP( "off", HSMHV_OFF, IF_FLAG , "Device is initially off"),
IP ( "ic", HSMHV_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"),
IOP("corbnet", HSMHV_CORBNET, IF_INTEGER, "Activate body resistance (1) or not (0)"),
IOP("rbpb", HSMHV_RBPB, IF_REAL, ""),
IOP("rbpd", HSMHV_RBPD, IF_REAL, ""),
IOP("rbps", HSMHV_RBPS, IF_REAL, ""),
IOP("rbdb", HSMHV_RBDB, IF_REAL, ""),
IOP("rbsb", HSMHV_RBSB, IF_REAL, ""),
IOP("corg", HSMHV_CORG, IF_INTEGER, "Activate gate resistance (1) or not (0)"),
IOP("ngcon", HSMHV_NGCON, IF_REAL, "Number of gate contacts"),
IOP("xgw", HSMHV_XGW, IF_REAL, "Distance from gate contact to channel edge"),
IOP("xgl", HSMHV_XGL, IF_REAL, "Offset of gate length due to variation in patterning"),
IOP("nf", HSMHV_NF, IF_REAL, "Number of fingers"),
IOP("sa", HSMHV_SA, IF_REAL, "Distance from STI edge to Gate edge [m]"),
IOP("sb", HSMHV_SB, IF_REAL, "Distance from STI edge to Gate edge [m]"),
IOP("sd", HSMHV_SD, IF_REAL, "Distance from Gate edge to Gate edge [m]"),
IOP("nsubcdfm", HSMHV_NSUBCDFM, IF_REAL, "Constant part of Nsub for DFM [1/cm^3]"),
IOP("m", HSMHV_M, IF_REAL, "Multiplication factor [-]"),
IOP("subld1", HSMHV_SUBLD1, IF_REAL, "Parameter for impact-ionization current in the drift region [-]"),
IOP("subld2", HSMHV_SUBLD2, IF_REAL, "Parameter for impact-ionization current in the drift region [m^{-1}*V^{3/2}]"),
IOP("lover", HSMHV_LOVER, IF_REAL, "Overlap length on source side [m]"),
IOP("lovers", HSMHV_LOVERS, IF_REAL, "Overlap length on source side [m]"),
IOP("loverld", HSMHV_LOVERLD, IF_REAL, "Overlap length on drain side [m]"),
IOP("ldrift1", HSMHV_LDRIFT1, IF_REAL, "Parameter for drift region length-1 [m]"),
IOP("ldrift2", HSMHV_LDRIFT2, IF_REAL, "Parameter for drift region length-2 [m]"),
IOP("ldrift1s", HSMHV_LDRIFT1S, IF_REAL, "Parameter for drift region length-1 on source side[m]"),
IOP("ldrift2s", HSMHV_LDRIFT2S, IF_REAL, "Parameter for drift region length-2 on source side[m]"),
/* Output Physical Values: */
OP ( "ids", HSMHV_CD, IF_REAL , "Ids"), /* Drain-Source current */
OP ( "isub", HSMHV_ISUB, IF_REAL , "Isub"), /* Substrate current */
OP ( "igidl", HSMHV_IGIDL, IF_REAL , "Igidl"), /* Gate-Induced Drain Leakage current */
OP ( "igisl", HSMHV_IGISL, IF_REAL , "Igisl"), /* Gate-Induced Source Leakage current */
OP ( "igd", HSMHV_IGD, IF_REAL , "Igd"), /* Gate-Drain current */
OP ( "igs", HSMHV_IGS, IF_REAL , "Igs"), /* Gate-Source current */
OP ( "igb", HSMHV_IGB, IF_REAL , "Igb"), /* Gate-Substrate current */
OP ( "gm", HSMHV_GM, IF_REAL , "Gm"), /* Transconductance */
OP ( "gds", HSMHV_GDS, IF_REAL , "Gds"), /* Channel conductance */
OP ( "gmbs", HSMHV_GMBS, IF_REAL , "Gmbs"), /* Body effect (Back gate) transconductance */
OP ( "gmt", HSMHV_GMT, IF_REAL , "GmT"), /* Temp - transconductance ----SHE----*/
OP ( "von", HSMHV_VON, IF_REAL , "Von"), /* Threshold voltage */
OP ( "vdsat", HSMHV_VDSAT, IF_REAL , "Vdsat"), /* Saturation voltage */
OP ( "qb", HSMHV_QB, IF_REAL , "Qb"), /* Bulk charge */
OP ( "qg", HSMHV_QG, IF_REAL , "Qg"), /* Gate charge */
OP ( "qd", HSMHV_QD, IF_REAL , "Qd"), /* Drain charge */
OP ( "cgg", HSMHV_CGG, IF_REAL , "Cgg"), /* MOSFET capacitance */
OP ( "cgd", HSMHV_CGD, IF_REAL , "Cgd"), /* MOSFET capacitance */
OP ( "cgs", HSMHV_CGS, IF_REAL , "Cgs"), /* MOSFET capacitance */
OP ( "cbg", HSMHV_CBG, IF_REAL , "Cbg"), /* MOSFET capacitance */
OP ( "cbs", HSMHV_CBSB, IF_REAL , "Cbs"), /* MOSFET capacitance */
OP ( "cbd", HSMHV_CBDB, IF_REAL , "Cbd"), /* MOSFET capacitance */
OP ( "cdg", HSMHV_CDG, IF_REAL , "Cdg"), /* MOSFET capacitance */
OP ( "cdd", HSMHV_CDD, IF_REAL , "Cdd"), /* MOSFET capacitance */
OP ( "cds", HSMHV_CDS, IF_REAL , "Cds"), /* MOSFET capacitance */
OP ( "cgdo", HSMHV_CGDO, IF_REAL , "Cgdo"), /* MOSFET overlap capacitance */
OP ( "cgso", HSMHV_CGSO, IF_REAL , "Cgso"), /* MOSFET overlap capacitance */
OP ( "cgbo", HSMHV_CGBO, IF_REAL , "Cgbo"), /* MOSFET overlap capacitance */
OP ( "ibd", HSMHV_CBD, IF_REAL , "Ibd"), /* Diode current */
OP ( "ibs", HSMHV_CBS, IF_REAL , "Ibs"), /* Diode current */
OP ( "gbd", HSMHV_GBD, IF_REAL , "Gbd"), /* Diode conductance */
OP ( "gbs", HSMHV_GBS, IF_REAL , "Gbs"), /* Diode conductance */
OP ( "capbd", HSMHV_CAPBD, IF_REAL , "Capbd"), /* Diode capacitance */
OP ( "capbs", HSMHV_CAPBS, IF_REAL , "Capbs") /* Diode capacitance */
};
IFparm HSMHVmPTable[] = { /* model parameters */
IP("nmos", HSMHV_MOD_NMOS, IF_FLAG, ""),
IP("pmos", HSMHV_MOD_PMOS, IF_FLAG, ""),
IOP("level", HSMHV_MOD_LEVEL, IF_INTEGER, ""),
IOP("info", HSMHV_MOD_INFO, IF_INTEGER, "Information level (for debug, etc.)"),
IOP("noise", HSMHV_MOD_NOISE, IF_INTEGER, "Noise model selector"),
IOP("version", HSMHV_MOD_VERSION, IF_STRING, "Model version"),
IOP("show", HSMHV_MOD_SHOW, IF_INTEGER, "Show physical value"),
IOP("corsrd", HSMHV_MOD_CORSRD, IF_INTEGER, "Handling of Rs and Rd"),
IOP("corg", HSMHV_MOD_CORG, IF_INTEGER, "Activate gate resistance (1) or not (0)"),
IOP("coiprv", HSMHV_MOD_COIPRV, IF_INTEGER, "Use ids_prv as initial guess of Ids (internal flag)"),
IOP("copprv", HSMHV_MOD_COPPRV, IF_INTEGER, "Use ps{0/l}_prv as initial guess of Ps{0/l} (internal flag)"),
IOP("coadov", HSMHV_MOD_COADOV, IF_INTEGER, "Add overlap to intrisic"),
IOP("coisub", HSMHV_MOD_COISUB, IF_INTEGER, "Calculate isub"),
IOP("coiigs", HSMHV_MOD_COIIGS, IF_INTEGER, "Calculate igate"),
IOP("cogidl", HSMHV_MOD_COGIDL, IF_INTEGER, "Calculate igidl"),
IOP("coovlp", HSMHV_MOD_COOVLP, IF_INTEGER, "Calculate overlap charge on the drain side"),
IOP("coovlps", HSMHV_MOD_COOVLPS, IF_INTEGER, "Calculate overlap charge on the source side"),
IOP("coflick", HSMHV_MOD_COFLICK, IF_INTEGER, "Calculate 1/f noise"),
IOP("coisti", HSMHV_MOD_COISTI, IF_INTEGER, "Calculate STI"),
IOP("conqs", HSMHV_MOD_CONQS, IF_INTEGER, "Calculate in nqs mode or qs mode"),
IOP("corbnet", HSMHV_MOD_CORBNET, IF_INTEGER, ""),
IOP("cothrml", HSMHV_MOD_COTHRML, IF_INTEGER, "Calculate thermal noise"),
IOP("coign", HSMHV_MOD_COIGN, IF_INTEGER, "Calculate induced gate noise"),
IOP("codfm", HSMHV_MOD_CODFM, IF_INTEGER, "Calculation of model for DFM"),
IOP("coqovsm", HSMHV_MOD_COQOVSM, IF_INTEGER, "select smoothing method of Qover"),
IOP("coselfheat", HSMHV_MOD_COSELFHEAT, IF_INTEGER, "Calculation of self heating model"),
IOP("cosubnode", HSMHV_MOD_COSUBNODE, IF_INTEGER, "Switch tempNode to subNode"),
IOP("cosym", HSMHV_MOD_COSYM, IF_INTEGER, "Model selector for symmetry device"),
IOP("cotemp", HSMHV_MOD_COTEMP, IF_INTEGER, "Model flag for temperature dependence"),
IOP("coldrift", HSMHV_MOD_COLDRIFT, IF_INTEGER, "selector for Ldrift parameter"),
IOP("vbsmin", HSMHV_MOD_VBSMIN, IF_REAL, "Minimum back bias voltage to be treated in hsmhveval [V]"),
IOP("vmax", HSMHV_MOD_VMAX, IF_REAL, "Saturation velocity [cm/s]"),
IOP("vmaxt1", HSMHV_MOD_VMAXT1, IF_REAL, "Saturation velocity coeff. [-]"),
IOP("vmaxt2", HSMHV_MOD_VMAXT2, IF_REAL, "Saturation velocity coeff. [-]"),
IOP("bgtmp1", HSMHV_MOD_BGTMP1, IF_REAL, "First order temp. coeff. for band gap [V/K]"),
IOP("bgtmp2", HSMHV_MOD_BGTMP2, IF_REAL, "Second order temp. coeff. for band gap [V/K^2]"),
IOP("eg0", HSMHV_MOD_EG0, IF_REAL, ""),
IOP("tox", HSMHV_MOD_TOX, IF_REAL, "Oxide thickness [m]"),
IOP("xld", HSMHV_MOD_XLD, IF_REAL, "Lateral diffusion of S/D under the gate [m]"),
IOP("xldld", HSMHV_MOD_XLDLD, IF_REAL, "Lateral diffusion of Drain under the gate [m]"),
IOP("xwdld", HSMHV_MOD_XWDLD, IF_REAL, ""),
IOP("lover", HSMHV_MOD_LOVER, IF_REAL, "Overlap length on source side [m], alias for lovers"),
IOP("lovers", HSMHV_MOD_LOVERS, IF_REAL, "Overlap length on source side [m]"),
IOP("rdov11", HSMHV_MOD_RDOV11, IF_REAL, "Dependence coeff. for overlap length"),
IOP("rdov12", HSMHV_MOD_RDOV12, IF_REAL, "Dependence coeff. for overlap length"),
IOP("rdov13", HSMHV_MOD_RDOV13, IF_REAL, "Dependence coeff. for overlap length"),
IOP("rdslp1", HSMHV_MOD_RDSLP1, IF_REAL, "LDRIFT1 dependence of resistance for CORSRD=1,3"),
IOP("rdict1", HSMHV_MOD_RDICT1, IF_REAL, "LDRIFT1 dependence of resistance for CORSRD=1,3"),
IOP("rdslp2", HSMHV_MOD_RDSLP2, IF_REAL, "LDRIFT2 dependence of resistance for CORSRD=1,3"),
IOP("rdict2", HSMHV_MOD_RDICT2, IF_REAL, "LDRIFT2 dependence of resistance for CORSRD=1,3"),
IOP("loverld", HSMHV_MOD_LOVERLD, IF_REAL, "Overlap length on the drain side"),
IOP("ldrift1", HSMHV_MOD_LDRIFT1, IF_REAL, "Drift region length-1 on the drain side[m]"),
IOP("ldrift2", HSMHV_MOD_LDRIFT2, IF_REAL, "Drift region length-2 on the drain side[m]"),
IOP("ldrift1s", HSMHV_MOD_LDRIFT1S, IF_REAL, "Drift region length-1 on the source side[m]"),
IOP("ldrift2s", HSMHV_MOD_LDRIFT2S, IF_REAL, "Drift region length-2 on the source side[m]"),
IOP("subld1", HSMHV_MOD_SUBLD1, IF_REAL, "Impact-ionization current in the drift region [-]"),
IOP("subld2", HSMHV_MOD_SUBLD2, IF_REAL, "Impact-ionization current in the drift region [m^{-1}*V^{3/2}]"),
IOP("ddltmax", HSMHV_MOD_DDLTMAX, IF_REAL, ""), /* Vdseff */
IOP("ddltslp", HSMHV_MOD_DDLTSLP, IF_REAL, ""), /* Vdseff */
IOP("ddltict", HSMHV_MOD_DDLTICT, IF_REAL, ""), /* Vdseff */
IOP("vfbover", HSMHV_MOD_VFBOVER, IF_REAL, ""),
IOP("nover", HSMHV_MOD_NOVER, IF_REAL, ""),
IOP("novers", HSMHV_MOD_NOVERS, IF_REAL, ""),
IOP("xwd", HSMHV_MOD_XWD, IF_REAL, "Lateral diffusion along the width dir. [m]"),
IOP("xwdc", HSMHV_MOD_XWDC, IF_REAL, "Lateral diffusion along the width dir. for capacitance [m]"),
IOP("xl", HSMHV_MOD_XL, IF_REAL, "Gate length offset due to mask/etch effect [m]"),
IOP("xw", HSMHV_MOD_XW, IF_REAL, "Gate width offset due to mask/etch effect [m]"),
IOP("saref", HSMHV_MOD_SAREF, IF_REAL, "Reference distance from STI edge to Gate edge [m]"),
IOP("sbref", HSMHV_MOD_SBREF, IF_REAL, "Reference distance from STI edge to Gate edge [m]"),
IOP("ll", HSMHV_MOD_LL, IF_REAL, "Gate length parameter"),
IOP("lld", HSMHV_MOD_LLD, IF_REAL, "Gate length parameter"),
IOP("lln", HSMHV_MOD_LLN, IF_REAL, "Gate length parameter"),
IOP("wl", HSMHV_MOD_WL, IF_REAL, "Gate width parameter"),
IOP("wl1", HSMHV_MOD_WL1, IF_REAL, "Gate width parameter"),
IOP("wl1p", HSMHV_MOD_WL1P, IF_REAL, "Gate width parameter"),
IOP("wl2", HSMHV_MOD_WL2, IF_REAL, "Gate width parameter"),
IOP("wl2p", HSMHV_MOD_WL2P, IF_REAL, "Gate width parameter"),
IOP("wld", HSMHV_MOD_WLD, IF_REAL, "Gate width parameter"),
IOP("wln", HSMHV_MOD_WLN, IF_REAL, "Gate width parameter"),
IOP("xqy", HSMHV_MOD_XQY, IF_REAL, "[m]"),
IOP("xqy1", HSMHV_MOD_XQY1, IF_REAL, "[F m^{XQY2}]"),
IOP("xqy2", HSMHV_MOD_XQY2, IF_REAL, "[-]"),
IOP("rs", HSMHV_MOD_RS, IF_REAL, "Source contact resistance [ohm m]"),
IOP("rd", HSMHV_MOD_RD, IF_REAL, "Drain contact resistance [ohm m]"),
IOP("rsh", HSMHV_MOD_RSH, IF_REAL, "Source/drain diffusion sheet resistance [ohm]"),
IOP("rshg", HSMHV_MOD_RSHG, IF_REAL, "Gate-elecrode sheet resistance"),
IOP("vfbc", HSMHV_MOD_VFBC, IF_REAL, "Constant part of Vfb [V]"),
IOP("vbi", HSMHV_MOD_VBI, IF_REAL, "Built-in potential [V]"),
IOP("nsubc", HSMHV_MOD_NSUBC, IF_REAL, "Constant part of Nsub [1/cm^3]"),
IOP("parl2", HSMHV_MOD_PARL2, IF_REAL, "Under diffusion [m]"),
IOP("lp", HSMHV_MOD_LP, IF_REAL, "Length of pocket potential [m]"),
IOP("nsubp", HSMHV_MOD_NSUBP, IF_REAL, "[1/cm^3]"),
IOP("nsubp0", HSMHV_MOD_NSUBP0, IF_REAL, "Pocket implant parameter"),
IOP("nsubwp", HSMHV_MOD_NSUBWP, IF_REAL, "Pocket implant parameter"),
IOP("scp1", HSMHV_MOD_SCP1, IF_REAL, "Parameter for pocket [-]"),
IOP("scp2", HSMHV_MOD_SCP2, IF_REAL, "Parameter for pocket [1/V]"),
IOP("scp3", HSMHV_MOD_SCP3, IF_REAL, "Parameter for pocket [m/V]"),
IOP("sc1", HSMHV_MOD_SC1, IF_REAL, "Parameter for SCE [-]"),
IOP("sc2", HSMHV_MOD_SC2, IF_REAL, "Parameter for SCE [1/V]"),
IOP("sc3", HSMHV_MOD_SC3, IF_REAL, "Parameter for SCE [m/V]"),
IOP("sc4", HSMHV_MOD_SC4, IF_REAL, "Parameter for SCE [1/V]"),
IOP("pgd1", HSMHV_MOD_PGD1, IF_REAL, "Parameter for gate-poly depletion [V]"),
IOP("pgd2", HSMHV_MOD_PGD2, IF_REAL, "Parameter for gate-poly depletion [V]"),
IOP("pgd3", HSMHV_MOD_PGD3, IF_REAL, "Parameter for gate-poly depletion [-]"),
IOP("pgd4", HSMHV_MOD_PGD4, IF_REAL, "Parameter for gate-poly depletion [-]"),
IOP("ndep", HSMHV_MOD_NDEP, IF_REAL, "Coeff. of Qbm for Eeff [-]"),
IOP("ndepl", HSMHV_MOD_NDEPL, IF_REAL, "Coeff. of Qbm for Eeff [-]"),
IOP("ndeplp", HSMHV_MOD_NDEPLP, IF_REAL, "Coeff. of Qbm for Eeff [-]"),
IOP("ninv", HSMHV_MOD_NINV, IF_REAL, "Coeff. of Qnm for Eeff [-]"),
IOP("ninvd", HSMHV_MOD_NINVD, IF_REAL, "Modification of Vdse dependence on Eeff [1/V]"),
IOP("ninvdw", HSMHV_MOD_NINVDW, IF_REAL, "Coeff of modification of Vdse dependence on Eeff [-]"),
IOP("ninvdwp", HSMHV_MOD_NINVDWP, IF_REAL, "Coeff of modification of Vdse dependence on Eeff [-]"),
IOP("ninvdt1", HSMHV_MOD_NINVDT1, IF_REAL, "Coeff of modification of Vdse dependence on Eeff [-]"),
IOP("ninvdt2", HSMHV_MOD_NINVDT2, IF_REAL, "Coeff of modification of Vdse dependence on Eeff [-]"),
IOP("muecb0", HSMHV_MOD_MUECB0, IF_REAL, "Const. part of coulomb scattering [cm^2/Vs]"),
IOP("muecb1", HSMHV_MOD_MUECB1, IF_REAL, "Coeff. for coulomb scattering [cm^2/Vs]"),
IOP("mueph0", HSMHV_MOD_MUEPH0, IF_REAL, "Power of Eeff for phonon scattering [-]"),
IOP("mueph1", HSMHV_MOD_MUEPH1, IF_REAL, ""),
IOP("muephw", HSMHV_MOD_MUEPHW, IF_REAL, ""),
IOP("muepwp", HSMHV_MOD_MUEPWP, IF_REAL, "Phonon scattering parameter"),
IOP("muephl", HSMHV_MOD_MUEPHL, IF_REAL, "Phonon scattering parameter"),
IOP("mueplp", HSMHV_MOD_MUEPLP, IF_REAL, "Phonon scattering parameter"),
IOP("muephs", HSMHV_MOD_MUEPHS, IF_REAL, ""),
IOP("muepsp", HSMHV_MOD_MUEPSP, IF_REAL, ""),
IOP("vtmp", HSMHV_MOD_VTMP, IF_REAL, ""),
IOP("wvth0", HSMHV_MOD_WVTH0, IF_REAL, ""),
IOP("muesr0", HSMHV_MOD_MUESR0, IF_REAL, "Power of Eeff for S.R. scattering [-]"),
IOP("muesr1", HSMHV_MOD_MUESR1, IF_REAL, "Coeff. for S.R. scattering [-]"),
IOP("muesrl", HSMHV_MOD_MUESRL, IF_REAL, "Surface roughness parameter"),
IOP("muesrw", HSMHV_MOD_MUESRW, IF_REAL, "Change of surface roughness related mobility"),
IOP("mueswp", HSMHV_MOD_MUESWP, IF_REAL, "Change of surface roughness related mobility"),
IOP("mueslp", HSMHV_MOD_MUESLP, IF_REAL, "Surface roughness parameter"),
IOP("muetmp", HSMHV_MOD_MUETMP, IF_REAL, "Parameter for mobility [-]"),
IOP("bb", HSMHV_MOD_BB, IF_REAL, "Empirical mobility model coefficient [-]"),
IOP("sub1", HSMHV_MOD_SUB1, IF_REAL, "Parameter for Isub [1/V]"),
IOP("sub2", HSMHV_MOD_SUB2, IF_REAL, "Parameter for Isub [V]"),
IOP("svgs", HSMHV_MOD_SVGS, IF_REAL, "Coefficient for Vg of Psislsat"),
IOP("svbs", HSMHV_MOD_SVBS, IF_REAL, "Coefficient for Vbs of Psislsat"),
IOP("svbsl", HSMHV_MOD_SVBSL, IF_REAL, " "),
IOP("svds", HSMHV_MOD_SVDS, IF_REAL, " "),
IOP("slg", HSMHV_MOD_SLG, IF_REAL, " "),
IOP("sub1l", HSMHV_MOD_SUB1L, IF_REAL, " "),
IOP("sub2l", HSMHV_MOD_SUB2L, IF_REAL, " "),
IOP("fn1", HSMHV_MOD_FN1, IF_REAL, " "),
IOP("fn2", HSMHV_MOD_FN2, IF_REAL, " "),
IOP("fn3", HSMHV_MOD_FN3, IF_REAL, " "),
IOP("fvbs", HSMHV_MOD_FVBS, IF_REAL, " "),
IOP("svgsl", HSMHV_MOD_SVGSL, IF_REAL, " "),
IOP("svgslp", HSMHV_MOD_SVGSLP, IF_REAL, " "),
IOP("svgswp", HSMHV_MOD_SVGSWP, IF_REAL, " "),
IOP("svgsw", HSMHV_MOD_SVGSW, IF_REAL, " "),
IOP("svbslp", HSMHV_MOD_SVBSLP, IF_REAL, " "),
IOP("slgl", HSMHV_MOD_SLGL, IF_REAL, " "),
IOP("slglp", HSMHV_MOD_SLGLP, IF_REAL, " "),
IOP("sub1lp", HSMHV_MOD_SUB1LP, IF_REAL, " "),
IOP("nsti", HSMHV_MOD_NSTI, IF_REAL, "Parameter for STI [1/cm^3]"),
IOP("wsti", HSMHV_MOD_WSTI, IF_REAL, "Parameter for STI [m]"),
IOP("wstil", HSMHV_MOD_WSTIL, IF_REAL, "Parameter for STI [?]"),
IOP("wstilp", HSMHV_MOD_WSTILP, IF_REAL, "Parameter for STI [?]"),
IOP("wstiw", HSMHV_MOD_WSTIW, IF_REAL, "Parameter for STI [?]"),
IOP("wstiwp", HSMHV_MOD_WSTIWP, IF_REAL, "Parameter for STI [?]"),
IOP("scsti1", HSMHV_MOD_SCSTI1, IF_REAL, "Parameter for STI [-]"),
IOP("scsti2", HSMHV_MOD_SCSTI2, IF_REAL, "Parameter for STI [1/V]"),
IOP("vthsti", HSMHV_MOD_VTHSTI, IF_REAL, "Parameter for STI"),
IOP("vdsti", HSMHV_MOD_VDSTI, IF_REAL, "Parameter for STI [-]"),
IOP("muesti1", HSMHV_MOD_MUESTI1, IF_REAL, "STI Stress mobility parameter"),
IOP("muesti2", HSMHV_MOD_MUESTI2, IF_REAL, "STI Stress mobility parameter"),
IOP("muesti3", HSMHV_MOD_MUESTI3, IF_REAL, "STI Stress mobility parameter"),
IOP("nsubpsti1", HSMHV_MOD_NSUBPSTI1, IF_REAL, "STI Stress pocket implant parameter"),
IOP("nsubpsti2", HSMHV_MOD_NSUBPSTI2, IF_REAL, "STI Stress pocket implant parameter"),
IOP("nsubpsti3", HSMHV_MOD_NSUBPSTI3, IF_REAL, "STI Stress pocket implant parameter"),
IOP("lpext", HSMHV_MOD_LPEXT, IF_REAL, "Pocket extension"),
IOP("npext", HSMHV_MOD_NPEXT, IF_REAL, "Pocket extension"),
IOP("scp22", HSMHV_MOD_SCP22, IF_REAL, ""),
IOP("scp21", HSMHV_MOD_SCP21, IF_REAL, ""),
IOP("bs1", HSMHV_MOD_BS1, IF_REAL, ""),
IOP("bs2", HSMHV_MOD_BS2, IF_REAL, ""),
IOP("cgso", HSMHV_MOD_CGSO, IF_REAL, "G-S overlap capacitance per unit W [F/m]"),
IOP("cgdo", HSMHV_MOD_CGDO, IF_REAL, "G-D overlap capacitance per unit W [F/m]"),
IOP("cgbo", HSMHV_MOD_CGBO, IF_REAL, "G-B overlap capacitance per unit L [F/m]"),
IOP("tpoly", HSMHV_MOD_TPOLY, IF_REAL, "Height of poly gate on the source side[m]"),
IOP("js0", HSMHV_MOD_JS0, IF_REAL, "Saturation current density [A/m^2]"),
IOP("js0sw", HSMHV_MOD_JS0SW, IF_REAL, "Side wall saturation current density [A/m]"),
IOP("nj", HSMHV_MOD_NJ, IF_REAL, "Emission coefficient [-]"),
IOP("njsw", HSMHV_MOD_NJSW, IF_REAL, "Sidewall emission coefficient"),
IOP("xti", HSMHV_MOD_XTI, IF_REAL, "Junction current temparature exponent coefficient [-]"),
IOP("cj", HSMHV_MOD_CJ, IF_REAL, "Bottom junction capacitance per unit area at zero bias [F/m^2]"),
IOP("cjsw", HSMHV_MOD_CJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient per unit length at zero bias [F/m]"),
IOP("cjswg", HSMHV_MOD_CJSWG, IF_REAL, "Source/drain gate sidewall junction capacitance per unit length at zero bias [F/m]"),
IOP("mj", HSMHV_MOD_MJ, IF_REAL, "Bottom junction capacitance grading coefficient"),
IOP("mjsw", HSMHV_MOD_MJSW, IF_REAL, "Source/drain sidewall junction capacitance grading coefficient"),
IOP("mjswg", HSMHV_MOD_MJSWG, IF_REAL, "Source/drain gate sidewall junction capacitance grading coefficient"),
IOP("pb", HSMHV_MOD_PB, IF_REAL, "Bottom junction build-in potential [V]"),
IOP("pbsw", HSMHV_MOD_PBSW, IF_REAL, "Source/drain sidewall junction build-in potential [V]"),
IOP("pbswg", HSMHV_MOD_PBSWG, IF_REAL, "Source/drain gate sidewall junction build-in potential [V]"),
IOP("xti2", HSMHV_MOD_XTI2, IF_REAL, "Temperature coefficient [-]"),
IOP("cisb", HSMHV_MOD_CISB, IF_REAL, "Reverse bias saturation current [-]"),
IOP("cvb", HSMHV_MOD_CVB, IF_REAL, "Bias dependence coefficient of cisb [-]"),
IOP("ctemp", HSMHV_MOD_CTEMP, IF_REAL, "Temperature coefficient [-]"),
IOP("cisbk", HSMHV_MOD_CISBK, IF_REAL, "Reverse bias saturation current [A]"),
IOP("cvbk", HSMHV_MOD_CVBK, IF_REAL, "Bias dependence coefficient of cisb [-]"),
IOP("divx", HSMHV_MOD_DIVX, IF_REAL, " [1/V]"),
IOP("clm1", HSMHV_MOD_CLM1, IF_REAL, "Parameter for CLM [-]"),
IOP("clm2", HSMHV_MOD_CLM2, IF_REAL, "Parameter for CLM [1/m]"),
IOP("clm3", HSMHV_MOD_CLM3, IF_REAL, "Parameter for CLM [-]"),
IOP("clm5", HSMHV_MOD_CLM5, IF_REAL, "Parameter for CLM [-]"),
IOP("clm6", HSMHV_MOD_CLM6, IF_REAL, "Parameter for CLM [um^{-clm5}]"),
IOP("vover", HSMHV_MOD_VOVER, IF_REAL, "Parameter for overshoot [m^{voverp}]"),
IOP("voverp", HSMHV_MOD_VOVERP, IF_REAL, "Parameter for overshoot [-]"),
IOP("vovers", HSMHV_MOD_VOVERS, IF_REAL, "Parameter for overshoot [-]"),
IOP("voversp", HSMHV_MOD_VOVERSP, IF_REAL, "Parameter for overshoot [-]"),
IOP("wfc", HSMHV_MOD_WFC, IF_REAL, "Parameter for narrow channel effect [m*F/(cm^2)]"),
IOP("nsubcw", HSMHV_MOD_NSUBCW, IF_REAL, "Parameter for narrow channel effect "),
IOP("nsubcwp", HSMHV_MOD_NSUBCWP, IF_REAL, "Parameter for narrow channel effect "),
IOP("qme1", HSMHV_MOD_QME1, IF_REAL, "Parameter for quantum effect [mV]"),
IOP("qme2", HSMHV_MOD_QME2, IF_REAL, "Parameter for quantum effect [V]"),
IOP("qme3", HSMHV_MOD_QME3, IF_REAL, "Parameter for quantum effect [m]"),
IOP("gidl1", HSMHV_MOD_GIDL1, IF_REAL, "Parameter for GIDL [?]"),
IOP("gidl2", HSMHV_MOD_GIDL2, IF_REAL, "Parameter for GIDL [?]"),
IOP("gidl3", HSMHV_MOD_GIDL3, IF_REAL, "Parameter for GIDL [?]"),
IOP("gidl4", HSMHV_MOD_GIDL4, IF_REAL, "Parameter for GIDL [?]"),
IOP("gidl5", HSMHV_MOD_GIDL5, IF_REAL, "Parameter for GIDL [?]"),
IOP("glpart1", HSMHV_MOD_GLPART1, IF_REAL, "Parameter for gate current [-]"),
IOP("gleak1", HSMHV_MOD_GLEAK1, IF_REAL, "Parameter for gate current [A*V^(-3/2)/C]"),
IOP("gleak2", HSMHV_MOD_GLEAK2, IF_REAL, "Parameter for gate current [V^(-1/2)/m ]"),
IOP("gleak3", HSMHV_MOD_GLEAK3, IF_REAL, "Parameter for gate current [-]"),
IOP("gleak4", HSMHV_MOD_GLEAK4, IF_REAL, "Parameter for gate current [1/m]"),
IOP("gleak5", HSMHV_MOD_GLEAK5, IF_REAL, "Parameter for gate current [V/m]"),
IOP("gleak6", HSMHV_MOD_GLEAK6, IF_REAL, "Parameter for gate current [V]"),
IOP("gleak7", HSMHV_MOD_GLEAK7, IF_REAL, "Parameter for gate current [m^2]"),
IOP("glksd1", HSMHV_MOD_GLKSD1, IF_REAL, "Parameter for gate current [A*m/V^2]"),
IOP("glksd2", HSMHV_MOD_GLKSD2, IF_REAL, "Parameter for gate current [1/(V*m)]"),
IOP("glksd3", HSMHV_MOD_GLKSD3, IF_REAL, "Parameter for gate current [1/m]"),
IOP("glkb1", HSMHV_MOD_GLKB1, IF_REAL, "Parameter for gate current [A/V^2]"),
IOP("glkb2", HSMHV_MOD_GLKB2, IF_REAL, "Parameter for gate current [m/V]"),
IOP("glkb3", HSMHV_MOD_GLKB3, IF_REAL, "Parameter for gate current [V]"),
IOP("egig", HSMHV_MOD_EGIG, IF_REAL, "Parameter for gate current [V]"),
IOP("igtemp2", HSMHV_MOD_IGTEMP2, IF_REAL, "Parameter for gate current [V*k]"),
IOP("igtemp3", HSMHV_MOD_IGTEMP3, IF_REAL, "Parameter for gate current [V*k^2]"),
IOP("vzadd0", HSMHV_MOD_VZADD0, IF_REAL, "Vzadd at Vds=0 [V]"),
IOP("pzadd0", HSMHV_MOD_PZADD0, IF_REAL, "Pzadd at Vds=0 [V]"),
IOP("nftrp", HSMHV_MOD_NFTRP, IF_REAL, ""),
IOP("nfalp", HSMHV_MOD_NFALP, IF_REAL, ""),
IOP("cit", HSMHV_MOD_CIT, IF_REAL, ""),
IOP("falph", HSMHV_MOD_FALPH, IF_REAL, "Parameter for 1/f noise"),
IOP("kappa", HSMHV_MOD_KAPPA, IF_REAL, "Dielectric constant for high-k stacked gate"),
IOP("pthrou", HSMHV_MOD_PTHROU, IF_REAL, "Modify subthreshold slope [-]"),
IOP("vdiffj", HSMHV_MOD_VDIFFJ, IF_REAL, "Threshold voltage for S/D junction diode [V]"),
IOP("dly1", HSMHV_MOD_DLY1, IF_REAL, "Parameter for transit time [-]"),
IOP("dly2", HSMHV_MOD_DLY2, IF_REAL, "Parameter for transit time [-]"),
IOP("dly3", HSMHV_MOD_DLY3, IF_REAL, "Parameter for transforming bulk charge [s/F]"),
IOP("dlyov", HSMHV_MOD_DLYOV, IF_REAL, "Parameter for transforming overlap charge [s/F]"), /* not used */
IOP("tnom", HSMHV_MOD_TNOM, IF_REAL, "Nominal temperature [K]"),
IOP("ovslp", HSMHV_MOD_OVSLP, IF_REAL, ""),
IOP("ovmag", HSMHV_MOD_OVMAG, IF_REAL, ""),
IOP("gbmin", HSMHV_MOD_GBMIN, IF_REAL, ""),
IOP("rbpb", HSMHV_MOD_RBPB, IF_REAL, ""),
IOP("rbpd", HSMHV_MOD_RBPD, IF_REAL, ""), /* not used */
IOP("rbps", HSMHV_MOD_RBPS, IF_REAL, ""), /* not used */
IOP("rbdb", HSMHV_MOD_RBDB, IF_REAL, ""),
IOP("rbsb", HSMHV_MOD_RBSB, IF_REAL, ""),
IOP("ibpc1", HSMHV_MOD_IBPC1, IF_REAL, "Parameter for impact-ionization induced bulk potential change"),
IOP("ibpc2", HSMHV_MOD_IBPC2, IF_REAL, "Parameter for impact-ionization induced bulk potential change"),
IOP("mphdfm", HSMHV_MOD_MPHDFM, IF_REAL, "NSUBCDFM dependence of phonon scattering for DFM"),
IOP("rdvg11", HSMHV_MOD_RDVG11, IF_REAL, ""),
IOP("rdvg12", HSMHV_MOD_RDVG12, IF_REAL, ""),
IOP("rth0", HSMHV_MOD_RTH0, IF_REAL, "Thermal resistance"), /* Self-heating model --SHE---*/
IOP("cth0", HSMHV_MOD_CTH0, IF_REAL, "Thermal capacitance"), /* Self-heating model --SHE--- */
IOP("powrat", HSMHV_MOD_POWRAT, IF_REAL, ""), /* Self-heating model --SHE--- */
IOP("rthtemp1", HSMHV_MOD_RTHTEMP1, IF_REAL, "Thermal resistance"), /* Self-heating model --SHE---*/
IOP("rthtemp2", HSMHV_MOD_RTHTEMP2, IF_REAL, "Thermal resistance"), /* Self-heating model --SHE---*/
IOP("prattemp1", HSMHV_MOD_PRATTEMP1, IF_REAL, ""), /* Self-heating model --SHE--- */
IOP("prattemp2", HSMHV_MOD_PRATTEMP2, IF_REAL, ""), /* Self-heating model --SHE--- */
IOP("tcjbd", HSMHV_MOD_TCJBD, IF_REAL, "Temperature dependence of cjbd"), /* Self-heating model --SHE--- */
IOP("tcjbs", HSMHV_MOD_TCJBS, IF_REAL, "Temperature dependence of cjbs"), /* Self-heating model --SHE--- */
IOP("tcjbdsw", HSMHV_MOD_TCJBDSW, IF_REAL, "Temperature dependence of cjbdsw"), /* Self-heating model --SHE--- */
IOP("tcjbssw", HSMHV_MOD_TCJBSSW, IF_REAL, "Temperature dependence of cjbssw"), /* Self-heating model --SHE--- */
IOP("tcjbdswg", HSMHV_MOD_TCJBDSWG, IF_REAL, "Temperature dependence of cjbdswg"), /* Self-heating model --SHE--- */
IOP("tcjbsswg", HSMHV_MOD_TCJBSSWG, IF_REAL, "Temperature dependence of cjbsswg"), /* Self-heating model --SHE--- */
IOP("qdftvd", HSMHV_MOD_QDFTVD, IF_REAL, "Qdrift Vd dependence "),
IOP("rdvd", HSMHV_MOD_RDVD, IF_REAL, ""),
IOP("rdvb", HSMHV_MOD_RDVB, IF_REAL, ""),
IOP("rd20", HSMHV_MOD_RD20, IF_REAL, ""),
IOP("rd21", HSMHV_MOD_RD21, IF_REAL, ""),
IOP("rd22", HSMHV_MOD_RD22, IF_REAL, ""),
IOP("rd22d", HSMHV_MOD_RD22D, IF_REAL, ""),
IOP("rd23", HSMHV_MOD_RD23, IF_REAL, ""),
IOP("rd24", HSMHV_MOD_RD24, IF_REAL, ""),
IOP("rd25", HSMHV_MOD_RD25, IF_REAL, ""),
IOP("rd26", HSMHV_MOD_RD26, IF_REAL, "alias for qovsm"),
IOP("rdvdl", HSMHV_MOD_RDVDL, IF_REAL, ""),
IOP("rdvdlp", HSMHV_MOD_RDVDLP, IF_REAL, ""),
IOP("rdvds", HSMHV_MOD_RDVDS, IF_REAL, ""),
IOP("rdvdsp", HSMHV_MOD_RDVDSP, IF_REAL, ""),
IOP("rd23l", HSMHV_MOD_RD23L, IF_REAL, ""),
IOP("rd23lp", HSMHV_MOD_RD23LP, IF_REAL, ""),
IOP("rd23s", HSMHV_MOD_RD23S, IF_REAL, ""),
IOP("rd23sp", HSMHV_MOD_RD23SP, IF_REAL, ""),
IOP("rds", HSMHV_MOD_RDS, IF_REAL, ""),
IOP("rdsp", HSMHV_MOD_RDSP, IF_REAL, ""),
IOP("qovsm", HSMHV_MOD_QOVSM, IF_REAL, "Smoothing Qover at depletion/inversion transition"),
IOP("ldrift", HSMHV_MOD_LDRIFT, IF_REAL, "alias for ldrift2"),
IOP("rdtemp1", HSMHV_MOD_RDTEMP1, IF_REAL, "Temperature-dependence of Rd"),
IOP("rdtemp2", HSMHV_MOD_RDTEMP2, IF_REAL, "Temperature-dependence of Rd"),
IOP("rth0r", HSMHV_MOD_RTH0R, IF_REAL, "Heat radiation for SHE"), /* not used */
IOP("rdvdtemp1", HSMHV_MOD_RDVDTEMP1, IF_REAL, "Temperature-dependence of RDVD"),
IOP("rdvdtemp2", HSMHV_MOD_RDVDTEMP2, IF_REAL, "Temperature-dependence of RDVD"),
IOP("rth0w", HSMHV_MOD_RTH0W, IF_REAL, "Width-dependence of RTH0"),
IOP("rth0wp", HSMHV_MOD_RTH0WP, IF_REAL, "Width-dependence of RTH0"),
IOP("rth0nf", HSMHV_MOD_RTH0NF, IF_REAL, "nf-dependence of RTH0"),
IOP("cvdsover", HSMHV_MOD_CVDSOVER, IF_REAL, "vds drop along the overlap"),
IOP("rdvsub", HSMHV_MOD_RDVSUB, IF_REAL, "model parameter for the substrate effect"),
IOP("rdvdsub", HSMHV_MOD_RDVDSUB, IF_REAL, "model parameter for the substrate effect"),
IOP("ddrift", HSMHV_MOD_DDRIFT, IF_REAL, "model parameter for the substrate effect"),
IOP("vbisub", HSMHV_MOD_VBISUB, IF_REAL, "model parameter for the substrate effect"),
IOP("nsubsub", HSMHV_MOD_NSUBSUB, IF_REAL, "model parameter for the substrate effect"),
IOP("shemax", HSMHV_MOD_SHEMAX, IF_REAL, "Maximum rise temperatue for SHE [C]"),
/* binning parameters */
IOP("lmin", HSMHV_MOD_LMIN, IF_REAL, "Minimum length for the model"),
IOP("lmax", HSMHV_MOD_LMAX, IF_REAL, "Maximum length for the model"),
IOP("wmin", HSMHV_MOD_WMIN, IF_REAL, "Minimum width for the model"),
IOP("wmax", HSMHV_MOD_WMAX, IF_REAL, "Maximum width for the model"),
IOP("lbinn", HSMHV_MOD_LBINN, IF_REAL, "L modulation coefficient for binning"),
IOP("wbinn", HSMHV_MOD_WBINN, IF_REAL, "W modulation coefficient for binning"),
/* Length dependence */
IOP("lvmax", HSMHV_MOD_LVMAX, IF_REAL, "Length dependence of vmax"),
IOP("lbgtmp1", HSMHV_MOD_LBGTMP1, IF_REAL, "Length dependence of bgtmp1"),
IOP("lbgtmp2", HSMHV_MOD_LBGTMP2, IF_REAL, "Length dependence of bgtmp2"),
IOP("leg0", HSMHV_MOD_LEG0, IF_REAL, "Length dependence of eg0"),
IOP("lvfbover", HSMHV_MOD_LVFBOVER, IF_REAL, "Length dependence of vfbover"),
IOP("lnover", HSMHV_MOD_LNOVER, IF_REAL, "Length dependence of nover"),
IOP("lnovers", HSMHV_MOD_LNOVERS, IF_REAL, "Length dependence of nover on source size"),
IOP("lwl2", HSMHV_MOD_LWL2, IF_REAL, "Length dependence of wl2"),
IOP("lvfbc", HSMHV_MOD_LVFBC, IF_REAL, "Length dependence of vfbc"),
IOP("lnsubc", HSMHV_MOD_LNSUBC, IF_REAL, "Length dependence of nsubc"),
IOP("lnsubp", HSMHV_MOD_LNSUBP, IF_REAL, "Length dependence of nsubp"),
IOP("lscp1", HSMHV_MOD_LSCP1, IF_REAL, "Length dependence of scp1"),
IOP("lscp2", HSMHV_MOD_LSCP2, IF_REAL, "Length dependence of scp2"),
IOP("lscp3", HSMHV_MOD_LSCP3, IF_REAL, "Length dependence of scp3"),
IOP("lsc1", HSMHV_MOD_LSC1, IF_REAL, "Length dependence of sc1"),
IOP("lsc2", HSMHV_MOD_LSC2, IF_REAL, "Length dependence of sc2"),
IOP("lsc3", HSMHV_MOD_LSC3, IF_REAL, "Length dependence of sc3"),
IOP("lpgd1", HSMHV_MOD_LPGD1, IF_REAL, "Length dependence of pgd1"),
IOP("lpgd3", HSMHV_MOD_LPGD3, IF_REAL, "Length dependence of pgd3"),
IOP("lndep", HSMHV_MOD_LNDEP, IF_REAL, "Length dependence of ndep"),
IOP("lninv", HSMHV_MOD_LNINV, IF_REAL, "Length dependence of ninv"),
IOP("lmuecb0", HSMHV_MOD_LMUECB0, IF_REAL, "Length dependence of muecb0"),
IOP("lmuecb1", HSMHV_MOD_LMUECB1, IF_REAL, "Length dependence of muecb1"),
IOP("lmueph1", HSMHV_MOD_LMUEPH1, IF_REAL, "Length dependence of mueph1"),
IOP("lvtmp", HSMHV_MOD_LVTMP, IF_REAL, "Length dependence of vtmp"),
IOP("lwvth0", HSMHV_MOD_LWVTH0, IF_REAL, "Length dependence of wvth0"),
IOP("lmuesr1", HSMHV_MOD_LMUESR1, IF_REAL, "Length dependence of muesr1"),
IOP("lmuetmp", HSMHV_MOD_LMUETMP, IF_REAL, "Length dependence of muetmp"),
IOP("lsub1", HSMHV_MOD_LSUB1, IF_REAL, "Length dependence of sub1"),
IOP("lsub2", HSMHV_MOD_LSUB2, IF_REAL, "Length dependence of sub2"),
IOP("lsvds", HSMHV_MOD_LSVDS, IF_REAL, "Length dependence of svds"),
IOP("lsvbs", HSMHV_MOD_LSVBS, IF_REAL, "Length dependence of svbs"),
IOP("lsvgs", HSMHV_MOD_LSVGS, IF_REAL, "Length dependence of svgs"),
IOP("lfn1", HSMHV_MOD_LFN1, IF_REAL, "Length dependence of fn1"),
IOP("lfn2", HSMHV_MOD_LFN2, IF_REAL, "Length dependence of fn2"),
IOP("lfn3", HSMHV_MOD_LFN3, IF_REAL, "Length dependence of fn3"),
IOP("lfvbs", HSMHV_MOD_LFVBS, IF_REAL, "Length dependence of fvbs"),
IOP("lnsti", HSMHV_MOD_LNSTI, IF_REAL, "Length dependence of nsti"),
IOP("lwsti", HSMHV_MOD_LWSTI, IF_REAL, "Length dependence of wsti"),
IOP("lscsti1", HSMHV_MOD_LSCSTI1, IF_REAL, "Length dependence of scsti1"),
IOP("lscsti2", HSMHV_MOD_LSCSTI2, IF_REAL, "Length dependence of scsti2"),
IOP("lvthsti", HSMHV_MOD_LVTHSTI, IF_REAL, "Length dependence of vthsti"),
IOP("lmuesti1", HSMHV_MOD_LMUESTI1, IF_REAL, "Length dependence of muesti1"),
IOP("lmuesti2", HSMHV_MOD_LMUESTI2, IF_REAL, "Length dependence of muesti2"),
IOP("lmuesti3", HSMHV_MOD_LMUESTI3, IF_REAL, "Length dependence of muesti3"),
IOP("lnsubpsti1", HSMHV_MOD_LNSUBPSTI1, IF_REAL, "Length dependence of nsubpsti1"),
IOP("lnsubpsti2", HSMHV_MOD_LNSUBPSTI2, IF_REAL, "Length dependence of nsubpsti2"),
IOP("lnsubpsti3", HSMHV_MOD_LNSUBPSTI3, IF_REAL, "Length dependence of nsubpsti3"),
IOP("lcgso", HSMHV_MOD_LCGSO, IF_REAL, "Length dependence of cgso"),
IOP("lcgdo", HSMHV_MOD_LCGDO, IF_REAL, "Length dependence of cgdo"),
IOP("ljs0", HSMHV_MOD_LJS0, IF_REAL, "Length dependence of js0"),
IOP("ljs0sw", HSMHV_MOD_LJS0SW, IF_REAL, "Length dependence of js0sw"),
IOP("lnj", HSMHV_MOD_LNJ, IF_REAL, "Length dependence of nj"),
IOP("lcisbk", HSMHV_MOD_LCISBK, IF_REAL, "Length dependence of cisbk"),
IOP("lclm1", HSMHV_MOD_LCLM1, IF_REAL, "Length dependence of clm1"),
IOP("lclm2", HSMHV_MOD_LCLM2, IF_REAL, "Length dependence of clm2"),
IOP("lclm3", HSMHV_MOD_LCLM3, IF_REAL, "Length dependence of clm3"),
IOP("lwfc", HSMHV_MOD_LWFC, IF_REAL, "Length dependence of wfc"),
IOP("lgidl1", HSMHV_MOD_LGIDL1, IF_REAL, "Length dependence of gidl1"),
IOP("lgidl2", HSMHV_MOD_LGIDL2, IF_REAL, "Length dependence of gidl2"),
IOP("lgleak1", HSMHV_MOD_LGLEAK1, IF_REAL, "Length dependence of gleak1"),
IOP("lgleak2", HSMHV_MOD_LGLEAK2, IF_REAL, "Length dependence of gleak2"),
IOP("lgleak3", HSMHV_MOD_LGLEAK3, IF_REAL, "Length dependence of gleak3"),
IOP("lgleak6", HSMHV_MOD_LGLEAK6, IF_REAL, "Length dependence of gleak6"),
IOP("lglksd1", HSMHV_MOD_LGLKSD1, IF_REAL, "Length dependence of glksd1"),
IOP("lglksd2", HSMHV_MOD_LGLKSD2, IF_REAL, "Length dependence of glksd2"),
IOP("lglkb1", HSMHV_MOD_LGLKB1, IF_REAL, "Length dependence of glkb1"),
IOP("lglkb2", HSMHV_MOD_LGLKB2, IF_REAL, "Length dependence of glkb2"),
IOP("lnftrp", HSMHV_MOD_LNFTRP, IF_REAL, "Length dependence of nftrp"),
IOP("lnfalp", HSMHV_MOD_LNFALP, IF_REAL, "Length dependence of nfalp"),
IOP("lpthrou", HSMHV_MOD_LPTHROU, IF_REAL, "Length dependence of pthrou"),
IOP("lvdiffj", HSMHV_MOD_LVDIFFJ, IF_REAL, "Length dependence of vdiffj"),
IOP("libpc1", HSMHV_MOD_LIBPC1, IF_REAL, "Length dependence of ibpc1"),
IOP("libpc2", HSMHV_MOD_LIBPC2, IF_REAL, "Length dependence of ibpc2"),
IOP("lcgbo", HSMHV_MOD_LCGBO, IF_REAL, "Length dependence of cgbo"),
IOP("lcvdsover", HSMHV_MOD_LCVDSOVER, IF_REAL, "Length dependence of cvdsover"),
IOP("lfalph", HSMHV_MOD_LFALPH, IF_REAL, "Length dependence of falph"),
IOP("lnpext", HSMHV_MOD_LNPEXT, IF_REAL, "Length dependence of npext"),
IOP("lpowrat", HSMHV_MOD_LPOWRAT, IF_REAL, "Length dependence of powrat"),
IOP("lrd", HSMHV_MOD_LRD, IF_REAL, "Length dependence of rd"),
IOP("lrd22", HSMHV_MOD_LRD22, IF_REAL, "Length dependence of rd22"),
IOP("lrd23", HSMHV_MOD_LRD23, IF_REAL, "Length dependence of rd23"),
IOP("lrd24", HSMHV_MOD_LRD24, IF_REAL, "Length dependence of rd24"),
IOP("lrdict1", HSMHV_MOD_LRDICT1, IF_REAL, "Length dependence of rdict1"),
IOP("lrdov13", HSMHV_MOD_LRDOV13, IF_REAL, "Length dependence of rdov13"),
IOP("lrdslp1", HSMHV_MOD_LRDSLP1, IF_REAL, "Length dependence of rdslp1"),
IOP("lrdvb", HSMHV_MOD_LRDVB, IF_REAL, "Length dependence of rdvb"),
IOP("lrdvd", HSMHV_MOD_LRDVD, IF_REAL, "Length dependence of rdvd"),
IOP("lrdvg11", HSMHV_MOD_LRDVG11, IF_REAL, "Length dependence of rdvg11"),
IOP("lrs", HSMHV_MOD_LRS, IF_REAL, "Length dependence of rs"),
IOP("lrth0", HSMHV_MOD_LRTH0, IF_REAL, "Length dependence of rth0"),
IOP("lvover", HSMHV_MOD_LVOVER, IF_REAL, "Length dependence of vover"),
/* Width dependence */
IOP("wvmax", HSMHV_MOD_WVMAX, IF_REAL, "Width dependence of vmax"),
IOP("wbgtmp1", HSMHV_MOD_WBGTMP1, IF_REAL, "Width dependence of bgtmp1"),
IOP("wbgtmp2", HSMHV_MOD_WBGTMP2, IF_REAL, "Width dependence of bgtmp2"),
IOP("weg0", HSMHV_MOD_WEG0, IF_REAL, "Width dependence of eg0"),
IOP("wvfbover", HSMHV_MOD_WVFBOVER, IF_REAL, "Width dependence of vfbover"),
IOP("wnover", HSMHV_MOD_WNOVER, IF_REAL, "Width dependence of nover"),
IOP("wnovers", HSMHV_MOD_WNOVERS, IF_REAL, "Width dependence of novers on source size"),
IOP("wwl2", HSMHV_MOD_WWL2, IF_REAL, "Width dependence of wl2"),
IOP("wvfbc", HSMHV_MOD_WVFBC, IF_REAL, "Width dependence of vfbc"),
IOP("wnsubc", HSMHV_MOD_WNSUBC, IF_REAL, "Width dependence of nsubc"),
IOP("wnsubp", HSMHV_MOD_WNSUBP, IF_REAL, "Width dependence of nsubp"),
IOP("wscp1", HSMHV_MOD_WSCP1, IF_REAL, "Width dependence of scp1"),
IOP("wscp2", HSMHV_MOD_WSCP2, IF_REAL, "Width dependence of scp2"),
IOP("wscp3", HSMHV_MOD_WSCP3, IF_REAL, "Width dependence of scp3"),
IOP("wsc1", HSMHV_MOD_WSC1, IF_REAL, "Width dependence of sc1"),
IOP("wsc2", HSMHV_MOD_WSC2, IF_REAL, "Width dependence of sc2"),
IOP("wsc3", HSMHV_MOD_WSC3, IF_REAL, "Width dependence of sc3"),
IOP("wpgd1", HSMHV_MOD_WPGD1, IF_REAL, "Width dependence of pgd1"),
IOP("wpgd3", HSMHV_MOD_WPGD3, IF_REAL, "Width dependence of pgd3"),
IOP("wndep", HSMHV_MOD_WNDEP, IF_REAL, "Width dependence of ndep"),
IOP("wninv", HSMHV_MOD_WNINV, IF_REAL, "Width dependence of ninv"),
IOP("wmuecb0", HSMHV_MOD_WMUECB0, IF_REAL, "Width dependence of muecb0"),
IOP("wmuecb1", HSMHV_MOD_WMUECB1, IF_REAL, "Width dependence of muecb1"),
IOP("wmueph1", HSMHV_MOD_WMUEPH1, IF_REAL, "Width dependence of mueph1"),
IOP("wvtmp", HSMHV_MOD_WVTMP, IF_REAL, "Width dependence of vtmp"),
IOP("wwvth0", HSMHV_MOD_WWVTH0, IF_REAL, "Width dependence of wvth0"),
IOP("wmuesr1", HSMHV_MOD_WMUESR1, IF_REAL, "Width dependence of muesr1"),
IOP("wmuetmp", HSMHV_MOD_WMUETMP, IF_REAL, "Width dependence of muetmp"),
IOP("wsub1", HSMHV_MOD_WSUB1, IF_REAL, "Width dependence of sub1"),
IOP("wsub2", HSMHV_MOD_WSUB2, IF_REAL, "Width dependence of sub2"),
IOP("wsvds", HSMHV_MOD_WSVDS, IF_REAL, "Width dependence of svds"),
IOP("wsvbs", HSMHV_MOD_WSVBS, IF_REAL, "Width dependence of svbs"),
IOP("wsvgs", HSMHV_MOD_WSVGS, IF_REAL, "Width dependence of svgs"),
IOP("wfn1", HSMHV_MOD_WFN1, IF_REAL, "Width dependence of fn1"),
IOP("wfn2", HSMHV_MOD_WFN2, IF_REAL, "Width dependence of fn2"),
IOP("wfn3", HSMHV_MOD_WFN3, IF_REAL, "Width dependence of fn3"),
IOP("wfvbs", HSMHV_MOD_WFVBS, IF_REAL, "Width dependence of fvbs"),
IOP("wnsti", HSMHV_MOD_WNSTI, IF_REAL, "Width dependence of nsti"),
IOP("wwsti", HSMHV_MOD_WWSTI, IF_REAL, "Width dependence of wsti"),
IOP("wscsti1", HSMHV_MOD_WSCSTI1, IF_REAL, "Width dependence of scsti1"),
IOP("wscsti2", HSMHV_MOD_WSCSTI2, IF_REAL, "Width dependence of scsti2"),
IOP("wvthsti", HSMHV_MOD_WVTHSTI, IF_REAL, "Width dependence of vthsti"),
IOP("wmuesti1", HSMHV_MOD_WMUESTI1, IF_REAL, "Width dependence of muesti1"),
IOP("wmuesti2", HSMHV_MOD_WMUESTI2, IF_REAL, "Width dependence of muesti2"),
IOP("wmuesti3", HSMHV_MOD_WMUESTI3, IF_REAL, "Width dependence of muesti3"),
IOP("wnsubpsti1", HSMHV_MOD_WNSUBPSTI1, IF_REAL, "Width dependence of nsubpsti1"),
IOP("wnsubpsti2", HSMHV_MOD_WNSUBPSTI2, IF_REAL, "Width dependence of nsubpsti2"),
IOP("wnsubpsti3", HSMHV_MOD_WNSUBPSTI3, IF_REAL, "Width dependence of nsubpsti3"),
IOP("wcgso", HSMHV_MOD_WCGSO, IF_REAL, "Width dependence of cgso"),
IOP("wcgdo", HSMHV_MOD_WCGDO, IF_REAL, "Width dependence of cgdo"),
IOP("wjs0", HSMHV_MOD_WJS0, IF_REAL, "Width dependence of js0"),
IOP("wjs0sw", HSMHV_MOD_WJS0SW, IF_REAL, "Width dependence of js0sw"),
IOP("wnj", HSMHV_MOD_WNJ, IF_REAL, "Width dependence of nj"),
IOP("wcisbk", HSMHV_MOD_WCISBK, IF_REAL, "Width dependence of cisbk"),
IOP("wclm1", HSMHV_MOD_WCLM1, IF_REAL, "Width dependence of clm1"),
IOP("wclm2", HSMHV_MOD_WCLM2, IF_REAL, "Width dependence of clm2"),
IOP("wclm3", HSMHV_MOD_WCLM3, IF_REAL, "Width dependence of clm3"),
IOP("wwfc", HSMHV_MOD_WWFC, IF_REAL, "Width dependence of wfc"),
IOP("wgidl1", HSMHV_MOD_WGIDL1, IF_REAL, "Width dependence of gidl1"),
IOP("wgidl2", HSMHV_MOD_WGIDL2, IF_REAL, "Width dependence of gidl2"),
IOP("wgleak1", HSMHV_MOD_WGLEAK1, IF_REAL, "Width dependence of gleak1"),
IOP("wgleak2", HSMHV_MOD_WGLEAK2, IF_REAL, "Width dependence of gleak2"),
IOP("wgleak3", HSMHV_MOD_WGLEAK3, IF_REAL, "Width dependence of gleak3"),
IOP("wgleak6", HSMHV_MOD_WGLEAK6, IF_REAL, "Width dependence of gleak6"),
IOP("wglksd1", HSMHV_MOD_WGLKSD1, IF_REAL, "Width dependence of glksd1"),
IOP("wglksd2", HSMHV_MOD_WGLKSD2, IF_REAL, "Width dependence of glksd2"),
IOP("wglkb1", HSMHV_MOD_WGLKB1, IF_REAL, "Width dependence of glkb1"),
IOP("wglkb2", HSMHV_MOD_WGLKB2, IF_REAL, "Width dependence of glkb2"),
IOP("wnftrp", HSMHV_MOD_WNFTRP, IF_REAL, "Width dependence of nftrp"),
IOP("wnfalp", HSMHV_MOD_WNFALP, IF_REAL, "Width dependence of nfalp"),
IOP("wpthrou", HSMHV_MOD_WPTHROU, IF_REAL, "Width dependence of pthrou"),
IOP("wvdiffj", HSMHV_MOD_WVDIFFJ, IF_REAL, "Width dependence of vdiffj"),
IOP("wibpc1", HSMHV_MOD_WIBPC1, IF_REAL, "Width dependence of ibpc1"),
IOP("wibpc2", HSMHV_MOD_WIBPC2, IF_REAL, "Width dependence of ibpc2"),
IOP("wcgbo", HSMHV_MOD_WCGBO, IF_REAL, "Width dependence of cgbo"),
IOP("wcvdsover", HSMHV_MOD_WCVDSOVER, IF_REAL, "Width dependence of cvdsover"),
IOP("wfalph", HSMHV_MOD_WFALPH, IF_REAL, "Width dependence of falph"),
IOP("wnpext", HSMHV_MOD_WNPEXT, IF_REAL, "Width dependence of npext"),
IOP("wpowrat", HSMHV_MOD_WPOWRAT, IF_REAL, "Width dependence of powrat"),
IOP("wrd", HSMHV_MOD_WRD, IF_REAL, "Width dependence of rd"),
IOP("wrd22", HSMHV_MOD_WRD22, IF_REAL, "Width dependence of rd22"),
IOP("wrd23", HSMHV_MOD_WRD23, IF_REAL, "Width dependence of rd23"),
IOP("wrd24", HSMHV_MOD_WRD24, IF_REAL, "Width dependence of rd24"),
IOP("wrdict1", HSMHV_MOD_WRDICT1, IF_REAL, "Width dependence of rdict1"),
IOP("wrdov13", HSMHV_MOD_WRDOV13, IF_REAL, "Width dependence of rdov13"),
IOP("wrdslp1", HSMHV_MOD_WRDSLP1, IF_REAL, "Width dependence of rdslp1"),
IOP("wrdvb", HSMHV_MOD_WRDVB, IF_REAL, "Width dependence of rdvb"),
IOP("wrdvd", HSMHV_MOD_WRDVD, IF_REAL, "Width dependence of rdvd"),
IOP("wrdvg11", HSMHV_MOD_WRDVG11, IF_REAL, "Width dependence of rdvg11"),
IOP("wrs", HSMHV_MOD_WRS, IF_REAL, "Width dependence of rs"),
IOP("wrth0", HSMHV_MOD_WRTH0, IF_REAL, "Width dependence of rth0"),
IOP("wvover", HSMHV_MOD_WVOVER, IF_REAL, "Width dependence of vover"),
/* Cross-term dependence */
IOP("pvmax", HSMHV_MOD_PVMAX, IF_REAL, "Cross-term dependence of vmax"),
IOP("pbgtmp1", HSMHV_MOD_PBGTMP1, IF_REAL, "Cross-term dependence of bgtmp1"),
IOP("pbgtmp2", HSMHV_MOD_PBGTMP2, IF_REAL, "Cross-term dependence of bgtmp2"),
IOP("peg0", HSMHV_MOD_PEG0, IF_REAL, "Cross-term dependence of eg0"),
IOP("pvfbover", HSMHV_MOD_PVFBOVER, IF_REAL, "Cross-term dependence of vfbover"),
IOP("pnover", HSMHV_MOD_PNOVER, IF_REAL, "Cross-term dependence of nover"),
IOP("pnovers", HSMHV_MOD_PNOVERS, IF_REAL, "Cross-term dependence of nover on source size"),
IOP("pwl2", HSMHV_MOD_PWL2, IF_REAL, "Cross-term dependence of wl2"),
IOP("pvfbc", HSMHV_MOD_PVFBC, IF_REAL, "Cross-term dependence of vfbc"),
IOP("pnsubc", HSMHV_MOD_PNSUBC, IF_REAL, "Cross-term dependence of nsubc"),
IOP("pnsubp", HSMHV_MOD_PNSUBP, IF_REAL, "Cross-term dependence of nsubp"),
IOP("pscp1", HSMHV_MOD_PSCP1, IF_REAL, "Cross-term dependence of scp1"),
IOP("pscp2", HSMHV_MOD_PSCP2, IF_REAL, "Cross-term dependence of scp2"),
IOP("pscp3", HSMHV_MOD_PSCP3, IF_REAL, "Cross-term dependence of scp3"),
IOP("psc1", HSMHV_MOD_PSC1, IF_REAL, "Cross-term dependence of sc1"),
IOP("psc2", HSMHV_MOD_PSC2, IF_REAL, "Cross-term dependence of sc2"),
IOP("psc3", HSMHV_MOD_PSC3, IF_REAL, "Cross-term dependence of sc3"),
IOP("ppgd1", HSMHV_MOD_PPGD1, IF_REAL, "Cross-term dependence of pgd1"),
IOP("ppgd3", HSMHV_MOD_PPGD3, IF_REAL, "Cross-term dependence of pgd3"),
IOP("pndep", HSMHV_MOD_PNDEP, IF_REAL, "Cross-term dependence of ndep"),
IOP("pninv", HSMHV_MOD_PNINV, IF_REAL, "Cross-term dependence of ninv"),
IOP("pmuecb0", HSMHV_MOD_PMUECB0, IF_REAL, "Cross-term dependence of muecb0"),
IOP("pmuecb1", HSMHV_MOD_PMUECB1, IF_REAL, "Cross-term dependence of muecb1"),
IOP("pmueph1", HSMHV_MOD_PMUEPH1, IF_REAL, "Cross-term dependence of mueph1"),
IOP("pvtmp", HSMHV_MOD_PVTMP, IF_REAL, "Cross-term dependence of vtmp"),
IOP("pwvth0", HSMHV_MOD_PWVTH0, IF_REAL, "Cross-term dependence of wvth0"),
IOP("pmuesr1", HSMHV_MOD_PMUESR1, IF_REAL, "Cross-term dependence of muesr1"),
IOP("pmuetmp", HSMHV_MOD_PMUETMP, IF_REAL, "Cross-term dependence of muetmp"),
IOP("psub1", HSMHV_MOD_PSUB1, IF_REAL, "Cross-term dependence of sub1"),
IOP("psub2", HSMHV_MOD_PSUB2, IF_REAL, "Cross-term dependence of sub2"),
IOP("psvds", HSMHV_MOD_PSVDS, IF_REAL, "Cross-term dependence of svds"),
IOP("psvbs", HSMHV_MOD_PSVBS, IF_REAL, "Cross-term dependence of svbs"),
IOP("psvgs", HSMHV_MOD_PSVGS, IF_REAL, "Cross-term dependence of svgs"),
IOP("pfn1", HSMHV_MOD_PFN1, IF_REAL, "Cross-term dependence of fn1"),
IOP("pfn2", HSMHV_MOD_PFN2, IF_REAL, "Cross-term dependence of fn2"),
IOP("pfn3", HSMHV_MOD_PFN3, IF_REAL, "Cross-term dependence of fn3"),
IOP("pfvbs", HSMHV_MOD_PFVBS, IF_REAL, "Cross-term dependence of fvbs"),
IOP("pnsti", HSMHV_MOD_PNSTI, IF_REAL, "Cross-term dependence of nsti"),
IOP("pwsti", HSMHV_MOD_PWSTI, IF_REAL, "Cross-term dependence of wsti"),
IOP("pscsti1", HSMHV_MOD_PSCSTI1, IF_REAL, "Cross-term dependence of scsti1"),
IOP("pscsti2", HSMHV_MOD_PSCSTI2, IF_REAL, "Cross-term dependence of scsti2"),
IOP("pvthsti", HSMHV_MOD_PVTHSTI, IF_REAL, "Cross-term dependence of vthsti"),
IOP("pmuesti1", HSMHV_MOD_PMUESTI1, IF_REAL, "Cross-term dependence of muesti1"),
IOP("pmuesti2", HSMHV_MOD_PMUESTI2, IF_REAL, "Cross-term dependence of muesti2"),
IOP("pmuesti3", HSMHV_MOD_PMUESTI3, IF_REAL, "Cross-term dependence of muesti3"),
IOP("pnsubpsti1", HSMHV_MOD_PNSUBPSTI1, IF_REAL, "Cross-term dependence of nsubpsti1"),
IOP("pnsubpsti2", HSMHV_MOD_PNSUBPSTI2, IF_REAL, "Cross-term dependence of nsubpsti2"),
IOP("pnsubpsti3", HSMHV_MOD_PNSUBPSTI3, IF_REAL, "Cross-term dependence of nsubpsti3"),
IOP("pcgso", HSMHV_MOD_PCGSO, IF_REAL, "Cross-term dependence of cgso"),
IOP("pcgdo", HSMHV_MOD_PCGDO, IF_REAL, "Cross-term dependence of cgdo"),
IOP("pjs0", HSMHV_MOD_PJS0, IF_REAL, "Cross-term dependence of js0"),
IOP("pjs0sw", HSMHV_MOD_PJS0SW, IF_REAL, "Cross-term dependence of js0sw"),
IOP("pnj", HSMHV_MOD_PNJ, IF_REAL, "Cross-term dependence of nj"),
IOP("pcisbk", HSMHV_MOD_PCISBK, IF_REAL, "Cross-term dependence of cisbk"),
IOP("pclm1", HSMHV_MOD_PCLM1, IF_REAL, "Cross-term dependence of clm1"),
IOP("pclm2", HSMHV_MOD_PCLM2, IF_REAL, "Cross-term dependence of clm2"),
IOP("pclm3", HSMHV_MOD_PCLM3, IF_REAL, "Cross-term dependence of clm3"),
IOP("pwfc", HSMHV_MOD_PWFC, IF_REAL, "Cross-term dependence of wfc"),
IOP("pgidl1", HSMHV_MOD_PGIDL1, IF_REAL, "Cross-term dependence of gidl1"),
IOP("pgidl2", HSMHV_MOD_PGIDL2, IF_REAL, "Cross-term dependence of gidl2"),
IOP("pgleak1", HSMHV_MOD_PGLEAK1, IF_REAL, "Cross-term dependence of gleak1"),
IOP("pgleak2", HSMHV_MOD_PGLEAK2, IF_REAL, "Cross-term dependence of gleak2"),
IOP("pgleak3", HSMHV_MOD_PGLEAK3, IF_REAL, "Cross-term dependence of gleak3"),
IOP("pgleak6", HSMHV_MOD_PGLEAK6, IF_REAL, "Cross-term dependence of gleak6"),
IOP("pglksd1", HSMHV_MOD_PGLKSD1, IF_REAL, "Cross-term dependence of glksd1"),
IOP("pglksd2", HSMHV_MOD_PGLKSD2, IF_REAL, "Cross-term dependence of glksd2"),
IOP("pglkb1", HSMHV_MOD_PGLKB1, IF_REAL, "Cross-term dependence of glkb1"),
IOP("pglkb2", HSMHV_MOD_PGLKB2, IF_REAL, "Cross-term dependence of glkb2"),
IOP("pnftrp", HSMHV_MOD_PNFTRP, IF_REAL, "Cross-term dependence of nftrp"),
IOP("pnfalp", HSMHV_MOD_PNFALP, IF_REAL, "Cross-term dependence of nfalp"),
IOP("ppthrou", HSMHV_MOD_PPTHROU, IF_REAL, "Cross-term dependence of pthrou"),
IOP("pvdiffj", HSMHV_MOD_PVDIFFJ, IF_REAL, "Cross-term dependence of vdiffj"),
IOP("pibpc1", HSMHV_MOD_PIBPC1, IF_REAL, "Cross-term dependence of ibpc1"),
IOP("pibpc2", HSMHV_MOD_PIBPC2, IF_REAL, "Cross-term dependence of ibpc2"),
IOP("pcgbo", HSMHV_MOD_PCGBO, IF_REAL, "Cross-term dependence of cgbo"),
IOP("pcvdsover", HSMHV_MOD_PCVDSOVER, IF_REAL, "Cross-term dependence of cvdsover"),
IOP("pfalph", HSMHV_MOD_PFALPH, IF_REAL, "Cross-term dependence of falph"),
IOP("pnpext", HSMHV_MOD_PNPEXT, IF_REAL, "Cross-term dependence of npext"),
IOP("ppowrat", HSMHV_MOD_PPOWRAT, IF_REAL, "Cross-term dependence of powrat"),
IOP("prd", HSMHV_MOD_PRD, IF_REAL, "Cross-term dependence of rd"),
IOP("prd22", HSMHV_MOD_PRD22, IF_REAL, "Cross-term dependence of rd22"),
IOP("prd23", HSMHV_MOD_PRD23, IF_REAL, "Cross-term dependence of rd23"),
IOP("prd24", HSMHV_MOD_PRD24, IF_REAL, "Cross-term dependence of rd24"),
IOP("prdict1", HSMHV_MOD_PRDICT1, IF_REAL, "Cross-term dependence of rdict1"),
IOP("prdov13", HSMHV_MOD_PRDOV13, IF_REAL, "Cross-term dependence of rdov13"),
IOP("prdslp1", HSMHV_MOD_PRDSLP1, IF_REAL, "Cross-term dependence of rdslp1"),
IOP("prdvb", HSMHV_MOD_PRDVB, IF_REAL, "Cross-term dependence of rdvb"),
IOP("prdvd", HSMHV_MOD_PRDVD, IF_REAL, "Cross-term dependence of rdvd"),
IOP("prdvg11", HSMHV_MOD_PRDVG11, IF_REAL, "Cross-term dependence of rdvg11"),
IOP("prs", HSMHV_MOD_PRS, IF_REAL, "Cross-term dependence of rs"),
IOP("prth0", HSMHV_MOD_PRTH0, IF_REAL, "Cross-term dependence of rth0"),
IOP("pvover", HSMHV_MOD_PVOVER, IF_REAL, "Cross-term dependence of vover")
};
char *HSMHVnames[] = {
"Drain",
"Gate",
"Source",
"Bulk",
"Substrate",
"Temp"
};
int HSMHVnSize = NUMELEMS(HSMHVnames);
int HSMHVpTSize = NUMELEMS(HSMHVpTable);
int HSMHVmPTSize = NUMELEMS(HSMHVmPTable);
int HSMHViSize = sizeof(HSMHVinstance);
int HSMHVmSize = sizeof(HSMHVmodel);

View File

@ -0,0 +1,295 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvacld.c
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#include <stdio.h>
#include "ngspice.h"
#include "cktdefs.h"
#include "sperror.h"
#include "suffix.h"
#include "hsmhvdef.h"
int HSMHVacLoad(
GENmodel *inModel,
register CKTcircuit *ckt)
{
register HSMHVmodel *model = (HSMHVmodel*)inModel;
register HSMHVinstance *here;
double omega=0.0 ;
int flg_nqs =0 ;
int flg_subNode = 0 ;
#define dNode 0
#define dNodePrime 1
#define gNode 2
#define gNodePrime 3
#define sNode 4
#define sNodePrime 5
#define bNodePrime 6
#define bNode 7
#define dbNode 8
#define sbNode 9
#define subNode 10
#define tempNode 11
#define qiNode 12
#define qbNode 13
omega = ckt->CKTomega;
for ( ; model != NULL; model = model->HSMHVnextModel ) {
for ( here = model->HSMHVinstances; here!= NULL; here = here->HSMHVnextInstance ) {
flg_nqs = model->HSMHV_conqs ;
flg_subNode = here->HSMHVsubNode ; /* if flg_subNode > 0, external(/internal) substrate node exists */
/* stamp matrix */
/*drain*/
*(here->HSMHVDdPtr) += here->HSMHV_ydc_d[dNode] ;
*(here->HSMHVDdPtr +1) += omega*here->HSMHV_ydyn_d[dNode] ;
*(here->HSMHVDdpPtr) += here->HSMHV_ydc_d[dNodePrime] ;
*(here->HSMHVDdpPtr +1) += omega*here->HSMHV_ydyn_d[dNodePrime];
*(here->HSMHVDgpPtr) += here->HSMHV_ydc_d[gNodePrime];
*(here->HSMHVDgpPtr +1) += omega*here->HSMHV_ydyn_d[gNodePrime];
*(here->HSMHVDsPtr) += here->HSMHV_ydc_d[sNode];
*(here->HSMHVDsPtr +1) += omega*here->HSMHV_ydyn_d[sNode];
*(here->HSMHVDbpPtr) += here->HSMHV_ydc_d[bNodePrime];
*(here->HSMHVDbpPtr +1) += omega*here->HSMHV_ydyn_d[bNodePrime];
*(here->HSMHVDdbPtr) += here->HSMHV_ydc_d[dbNode];
*(here->HSMHVDdbPtr +1) += omega*here->HSMHV_ydyn_d[dbNode];
if (flg_subNode > 0) {
*(here->HSMHVDsubPtr) += here->HSMHV_ydc_d[subNode];
}
if( here->HSMHVtempNode > 0) {
*(here->HSMHVDtempPtr) += model->HSMHV_type*here->HSMHV_ydc_d[tempNode];
*(here->HSMHVDtempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_d[tempNode];
}
/*drain prime*/
*(here->HSMHVDPdPtr) += here->HSMHV_ydc_dP[dNode] ;
*(here->HSMHVDPdPtr +1) += omega*here->HSMHV_ydyn_dP[dNode];
*(here->HSMHVDPdpPtr) += here->HSMHV_ydc_dP[dNodePrime];
*(here->HSMHVDPdpPtr +1) += omega*here->HSMHV_ydyn_dP[dNodePrime];
*(here->HSMHVDPgpPtr) += here->HSMHV_ydc_dP[gNodePrime];
*(here->HSMHVDPgpPtr +1) += omega*here->HSMHV_ydyn_dP[gNodePrime];
*(here->HSMHVDPsPtr) += here->HSMHV_ydc_dP[sNode] ;
*(here->HSMHVDPsPtr +1) += omega*here->HSMHV_ydyn_dP[sNode];
*(here->HSMHVDPspPtr) += here->HSMHV_ydc_dP[sNodePrime] ;
*(here->HSMHVDPspPtr +1) += omega*here->HSMHV_ydyn_dP[sNodePrime];
*(here->HSMHVDPbpPtr) += here->HSMHV_ydc_dP[bNodePrime] ;
*(here->HSMHVDPbpPtr +1) += omega*here->HSMHV_ydyn_dP[bNodePrime];
if (flg_subNode > 0) {
*(here->HSMHVDPsubPtr) += here->HSMHV_ydc_dP[subNode];
}
if( here->HSMHVtempNode > 0) {
*(here->HSMHVDPtempPtr) += model->HSMHV_type*here->HSMHV_ydc_dP[tempNode];
*(here->HSMHVDPtempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_dP[tempNode];
}
if (flg_nqs) {
*(here->HSMHVDPqiPtr) += model->HSMHV_type*here->HSMHV_ydc_dP[qiNode];
*(here->HSMHVDPqiPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_dP[qiNode];
}
/*gate*/
*(here->HSMHVGgPtr) += here->HSMHV_ydc_g[gNode] ;
*(here->HSMHVGgPtr +1) += omega*here->HSMHV_ydyn_g[gNode];
*(here->HSMHVGgpPtr) += here->HSMHV_ydc_g[gNodePrime] ;
*(here->HSMHVGgpPtr +1) += omega*here->HSMHV_ydyn_g[gNodePrime];
/*gate prime*/
*(here->HSMHVGPdPtr) += here->HSMHV_ydc_gP[dNode] ;
*(here->HSMHVGPdPtr +1) += omega*here->HSMHV_ydyn_gP[dNode];
*(here->HSMHVGPdpPtr) += here->HSMHV_ydc_gP[dNodePrime] ;
*(here->HSMHVGPdpPtr +1) += omega*here->HSMHV_ydyn_gP[dNodePrime];
*(here->HSMHVGPgPtr) += here->HSMHV_ydc_gP[gNode];
*(here->HSMHVGPgPtr +1) += omega*here->HSMHV_ydyn_gP[gNode];
*(here->HSMHVGPgpPtr) += here->HSMHV_ydc_gP[gNodePrime] ;
*(here->HSMHVGPgpPtr +1) += omega*here->HSMHV_ydyn_gP[gNodePrime];
*(here->HSMHVGPsPtr) += here->HSMHV_ydc_gP[sNode];
*(here->HSMHVGPsPtr +1) += omega*here->HSMHV_ydyn_gP[sNode];
*(here->HSMHVGPspPtr) += here->HSMHV_ydc_gP[sNodePrime] ;
*(here->HSMHVGPspPtr +1) += omega*here->HSMHV_ydyn_gP[sNodePrime];
*(here->HSMHVGPbpPtr) += here->HSMHV_ydc_gP[bNodePrime] ;
*(here->HSMHVGPbpPtr +1) += omega*here->HSMHV_ydyn_gP[bNodePrime];
if( here->HSMHVtempNode > 0) {
*(here->HSMHVGPtempPtr) += model->HSMHV_type*here->HSMHV_ydc_gP[tempNode] ;
*(here->HSMHVGPtempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_gP[tempNode];
}
if (flg_nqs) {
*(here->HSMHVGPqiPtr) += model->HSMHV_type*here->HSMHV_ydc_gP[qiNode];
*(here->HSMHVGPqiPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_gP[qiNode];
*(here->HSMHVGPqbPtr) += model->HSMHV_type*here->HSMHV_ydc_gP[qbNode];
*(here->HSMHVGPqbPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_gP[qbNode];
}
/*source*/
*(here->HSMHVSdPtr) += here->HSMHV_ydc_s[dNode];
*(here->HSMHVSdPtr +1) += omega*here->HSMHV_ydyn_s[dNode];
*(here->HSMHVSgpPtr) += here->HSMHV_ydc_s[gNodePrime];
*(here->HSMHVSgpPtr +1) += omega*here->HSMHV_ydyn_s[gNodePrime];
*(here->HSMHVSsPtr) += here->HSMHV_ydc_s[sNode] ;
*(here->HSMHVSsPtr +1) += omega*here->HSMHV_ydyn_s[sNode];
*(here->HSMHVSspPtr) += here->HSMHV_ydc_s[sNodePrime] ;
*(here->HSMHVSspPtr +1) += omega*here->HSMHV_ydyn_s[sNodePrime];
*(here->HSMHVSbpPtr) += here->HSMHV_ydc_s[bNodePrime];
*(here->HSMHVSbpPtr +1) += omega*here->HSMHV_ydyn_s[bNodePrime];
*(here->HSMHVSsbPtr) += here->HSMHV_ydc_s[sbNode] ;
*(here->HSMHVSsbPtr +1) += omega*here->HSMHV_ydyn_s[sbNode];
if (flg_subNode > 0) {
*(here->HSMHVSsubPtr) += here->HSMHV_ydc_s[subNode];
}
if( here->HSMHVtempNode > 0) {
*(here->HSMHVStempPtr) += model->HSMHV_type*here->HSMHV_ydc_s[tempNode];
*(here->HSMHVStempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_s[tempNode];
}
/*source prime*/
*(here->HSMHVSPdPtr) += here->HSMHV_ydc_sP[dNode] ;
*(here->HSMHVSPdPtr +1) += omega*here->HSMHV_ydyn_sP[dNode];
*(here->HSMHVSPdpPtr) += here->HSMHV_ydc_sP[dNodePrime] ;
*(here->HSMHVSPdpPtr +1) += omega*here->HSMHV_ydyn_sP[dNodePrime];
*(here->HSMHVSPgpPtr) += here->HSMHV_ydc_sP[gNodePrime] ;
*(here->HSMHVSPgpPtr +1) += omega*here->HSMHV_ydyn_sP[gNodePrime];
*(here->HSMHVSPsPtr) += here->HSMHV_ydc_sP[sNode] ;
*(here->HSMHVSPsPtr +1) += omega*here->HSMHV_ydyn_sP[sNode];
*(here->HSMHVSPspPtr) += here->HSMHV_ydc_sP[sNodePrime] ;
*(here->HSMHVSPspPtr +1) += omega*here->HSMHV_ydyn_sP[sNodePrime];
*(here->HSMHVSPbpPtr) += here->HSMHV_ydc_sP[bNodePrime];
*(here->HSMHVSPbpPtr +1) += omega*here->HSMHV_ydyn_sP[bNodePrime];
if (flg_subNode > 0) {
*(here->HSMHVSPsubPtr) += here->HSMHV_ydc_sP[subNode];
}
if( here->HSMHVtempNode > 0) {
*(here->HSMHVSPtempPtr) += model->HSMHV_type*here->HSMHV_ydc_sP[tempNode] ;
*(here->HSMHVSPtempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_sP[tempNode];
}
if (flg_nqs) {
*(here->HSMHVSPqiPtr) += model->HSMHV_type*here->HSMHV_ydc_sP[qiNode];
*(here->HSMHVSPqiPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_sP[qiNode];
}
/*bulk prime*/
*(here->HSMHVBPdpPtr) += here->HSMHV_ydc_bP[dNodePrime];
*(here->HSMHVBPdpPtr +1) += omega*here->HSMHV_ydyn_bP[dNodePrime];
*(here->HSMHVBPgpPtr) += here->HSMHV_ydc_bP[gNodePrime] ;
*(here->HSMHVBPgpPtr +1) += omega*here->HSMHV_ydyn_bP[gNodePrime];
*(here->HSMHVBPspPtr) += here->HSMHV_ydc_bP[sNodePrime];
*(here->HSMHVBPspPtr +1) += omega*here->HSMHV_ydyn_bP[sNodePrime];
*(here->HSMHVBPbpPtr) += here->HSMHV_ydc_bP[bNodePrime];
*(here->HSMHVBPbpPtr +1) += omega*here->HSMHV_ydyn_bP[bNodePrime];
*(here->HSMHVBPbPtr) += here->HSMHV_ydc_bP[bNode];
*(here->HSMHVBPbPtr +1) += omega*here->HSMHV_ydyn_bP[bNode];
*(here->HSMHVBPdbPtr) += here->HSMHV_ydc_bP[dbNode] ;
*(here->HSMHVBPdbPtr +1) += omega*here->HSMHV_ydyn_bP[dbNode];
*(here->HSMHVBPsbPtr) += here->HSMHV_ydc_bP[sbNode] ;
*(here->HSMHVBPsbPtr +1) += omega*here->HSMHV_ydyn_bP[sbNode];
if( here->HSMHVtempNode > 0) {
*(here->HSMHVBPtempPtr) += model->HSMHV_type*here->HSMHV_ydc_bP[tempNode] ;
*(here->HSMHVBPtempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_bP[tempNode];
}
if (flg_nqs) {
*(here->HSMHVBPqbPtr) += model->HSMHV_type*here->HSMHV_ydc_bP[qbNode];
*(here->HSMHVBPqbPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_bP[qbNode];
}
/*bulk*/
*(here->HSMHVBbpPtr) += here->HSMHV_ydc_b[bNodePrime] ;
*(here->HSMHVBbpPtr +1) += omega*here->HSMHV_ydyn_b[bNodePrime];
*(here->HSMHVBbPtr) += here->HSMHV_ydc_b[bNode] ;
*(here->HSMHVBbPtr +1) += omega*here->HSMHV_ydyn_b[bNode];
/*drain bulk*/
*(here->HSMHVDBdPtr) += here->HSMHV_ydc_db[dNode] ;
*(here->HSMHVDBdPtr +1) += omega*here->HSMHV_ydyn_db[dNode];
*(here->HSMHVDBbpPtr) += here->HSMHV_ydc_db[bNodePrime] ;
*(here->HSMHVDBbpPtr +1) += omega*here->HSMHV_ydyn_db[bNodePrime];
*(here->HSMHVDBdbPtr) += here->HSMHV_ydc_db[dbNode] ;
*(here->HSMHVDBdbPtr +1) += omega*here->HSMHV_ydyn_db[dbNode];
if( here->HSMHVtempNode > 0) {
*(here->HSMHVDBtempPtr) += model->HSMHV_type*here->HSMHV_ydc_db[tempNode] ;
*(here->HSMHVDBtempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_db[tempNode];
}
/*source bulk*/
*(here->HSMHVSBsPtr) += here->HSMHV_ydc_sb[sNode] ;
*(here->HSMHVSBsPtr +1) += omega*here->HSMHV_ydyn_sb[sNode];
*(here->HSMHVSBbpPtr) += here->HSMHV_ydc_sb[bNodePrime];
*(here->HSMHVSBbpPtr +1) += omega*here->HSMHV_ydyn_sb[bNodePrime];
*(here->HSMHVSBsbPtr) += here->HSMHV_ydc_sb[sbNode] ;
*(here->HSMHVSBsbPtr +1) += omega*here->HSMHV_ydyn_sb[sbNode];
if( here->HSMHVtempNode > 0) {
*(here->HSMHVSBtempPtr) += model->HSMHV_type*here->HSMHV_ydc_sb[tempNode];
*(here->HSMHVSBtempPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_sb[tempNode];
}
/*temp*/
if( here->HSMHVtempNode > 0) {
*(here->HSMHVTempdPtr) += model->HSMHV_type*here->HSMHV_ydc_t[dNode] ;
*(here->HSMHVTempdPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_t[dNode];
*(here->HSMHVTempdpPtr) += model->HSMHV_type*here->HSMHV_ydc_t[dNodePrime] ;
*(here->HSMHVTempdpPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_t[dNodePrime];
*(here->HSMHVTempgpPtr) += model->HSMHV_type*here->HSMHV_ydc_t[gNodePrime];
*(here->HSMHVTempgpPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_t[gNodePrime];
*(here->HSMHVTempsPtr) += model->HSMHV_type*here->HSMHV_ydc_t[sNode] ;
*(here->HSMHVTempsPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_t[sNode];
*(here->HSMHVTempspPtr) += model->HSMHV_type*here->HSMHV_ydc_t[sNodePrime] ;
*(here->HSMHVTempspPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_t[sNodePrime];
*(here->HSMHVTempbpPtr) += model->HSMHV_type*here->HSMHV_ydc_t[bNodePrime] ;
*(here->HSMHVTempbpPtr +1) += model->HSMHV_type*omega*here->HSMHV_ydyn_t[bNodePrime];
*(here->HSMHVTemptempPtr) += here->HSMHV_ydc_t[tempNode] ;
*(here->HSMHVTemptempPtr +1) += omega*here->HSMHV_ydyn_t[tempNode];
}
/* additional entries for flat nqs handling */
if ( flg_nqs ) {
/*qi*/
*(here->HSMHVQIdpPtr) += model->HSMHV_type*here->HSMHV_ydc_qi[dNodePrime];
*(here->HSMHVQIdpPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qi[dNodePrime];
*(here->HSMHVQIgpPtr) += model->HSMHV_type*here->HSMHV_ydc_qi[gNodePrime];
*(here->HSMHVQIgpPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qi[gNodePrime];
*(here->HSMHVQIspPtr) += model->HSMHV_type*here->HSMHV_ydc_qi[sNodePrime];
*(here->HSMHVQIspPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qi[sNodePrime];
*(here->HSMHVQIbpPtr) += model->HSMHV_type*here->HSMHV_ydc_qi[bNodePrime];
*(here->HSMHVQIbpPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qi[bNodePrime];
*(here->HSMHVQIqiPtr) += here->HSMHV_ydc_qi[qiNode];
*(here->HSMHVQIqiPtr+1) += omega*here->HSMHV_ydyn_qi[qiNode];
if ( here->HSMHVtempNode > 0 ) {
*(here->HSMHVQItempPtr) += here->HSMHV_ydc_qi[tempNode];
*(here->HSMHVQItempPtr+1) += omega*here->HSMHV_ydyn_qi[tempNode];
}
/*qb*/
*(here->HSMHVQBdpPtr) += model->HSMHV_type*here->HSMHV_ydc_qb[dNodePrime];
*(here->HSMHVQBdpPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qb[dNodePrime];
*(here->HSMHVQBgpPtr) += model->HSMHV_type*here->HSMHV_ydc_qb[gNodePrime];
*(here->HSMHVQBgpPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qb[gNodePrime];
*(here->HSMHVQBspPtr) += model->HSMHV_type*here->HSMHV_ydc_qb[sNodePrime];
*(here->HSMHVQBspPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qb[sNodePrime];
*(here->HSMHVQBbpPtr) += model->HSMHV_type*here->HSMHV_ydc_qb[bNodePrime];
*(here->HSMHVQBbpPtr+1) += model->HSMHV_type*omega*here->HSMHV_ydyn_qb[bNodePrime];
*(here->HSMHVQBqbPtr) += here->HSMHV_ydc_qb[qbNode];
*(here->HSMHVQBqbPtr+1) += omega*here->HSMHV_ydyn_qb[qbNode];
if ( here->HSMHVtempNode > 0 ) {
*(here->HSMHVQBtempPtr) += here->HSMHV_ydc_qb[tempNode];
*(here->HSMHVQBtempPtr+1) += omega*here->HSMHV_ydyn_qb[tempNode];
}
}
}
}
return(OK);
}

View File

@ -0,0 +1,421 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvask.c
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#include "ngspice.h"
#include <stdio.h>
#include "ifsim.h"
#include "cktdefs.h"
#include "devdefs.h"
#include "hsmhvdef.h"
#include "sperror.h"
#include "suffix.h"
int HSMHVask(
CKTcircuit *ckt,
GENinstance *inst,
int which,
IFvalue *value,
IFvalue *select)
{
HSMHVinstance *here = (HSMHVinstance*)inst;
int flg_nqs ;
double cggb_nqs, cgdb_nqs, cgsb_nqs, cdgb_nqs, cddb_nqs, cdsb_nqs, cbgb_nqs, cbdb_nqs, cbsb_nqs ;
double Qi_nqs, dQi_nqs_dVds, dQi_nqs_dVgs, dQi_nqs_dVbs,
dQb_nqs_dVds, dQb_nqs_dVgs, dQb_nqs_dVbs ;
double Qdrat, dQdrat_dVds, dQdrat_dVgs, dQdrat_dVbs,
dQi_dVds, dQi_dVgs, dQi_dVbs,
dQbulk_dVds, dQbulk_dVgs, dQbulk_dVbs ;
double dQd_nqs_dVds, dQd_nqs_dVgs, dQd_nqs_dVbs, dQd_nqs_dQi_nqs ;
double dQg_nqs_dQi_nqs, dQg_nqs_dQb_nqs ;
here->HSMHV_csdo = - (here->HSMHV_cddo + here->HSMHV_cgdo + here->HSMHV_cbdo) ;
here->HSMHV_csgo = - (here->HSMHV_cdgo + here->HSMHV_cggo + here->HSMHV_cbgo) ;
here->HSMHV_csbo = - (here->HSMHV_cdbo + here->HSMHV_cgbo + here->HSMHV_cbbo) ;
here->HSMHV_cdso = - (here->HSMHV_cddo + here->HSMHV_cdgo + here->HSMHV_cdbo) ;
here->HSMHV_cgso = - (here->HSMHV_cgdo + here->HSMHV_cggo + here->HSMHV_cgbo) ;
here->HSMHV_csso = - (here->HSMHV_csdo + here->HSMHV_csgo + here->HSMHV_csbo) ;
/* NQS? */
if (here->HSMHVQIqiPtr == (double *)NULL) {
flg_nqs = 0 ;
} else {
flg_nqs = 1 ;
}
/* printf("HSMHVask: flg_nqs = %d\n", flg_nqs) ; */
if (flg_nqs) { /* collect data for NQS case (DC operating point only!) */
Qi_nqs = *(ckt->CKTstate0 + here->HSMHVqi_nqs) ;
if ( here->HSMHV_mode > 0 ) { /* forward mode */
Qdrat = here->HSMHV_Xd ;
dQdrat_dVds = here->HSMHV_Xd_dVdsi ;
dQdrat_dVgs = here->HSMHV_Xd_dVgsi ;
dQdrat_dVbs = here->HSMHV_Xd_dVbsi ;
dQi_dVds = here->HSMHV_Qi_dVdsi ;
dQi_dVgs = here->HSMHV_Qi_dVgsi ;
dQi_dVbs = here->HSMHV_Qi_dVbsi ;
dQbulk_dVds = here->HSMHV_Qbulk_dVdsi ;
dQbulk_dVgs = here->HSMHV_Qbulk_dVgsi ;
dQbulk_dVbs = here->HSMHV_Qbulk_dVbsi ;
} else { /* reverse mode */
Qdrat = 1.0 - here->HSMHV_Xd ;
dQdrat_dVds = +(here->HSMHV_Xd_dVdsi + here->HSMHV_Xd_dVgsi + here->HSMHV_Xd_dVbsi) ;
dQdrat_dVgs = - here->HSMHV_Xd_dVgsi ;
dQdrat_dVbs = - here->HSMHV_Xd_dVbsi ;
dQi_dVds = -(here->HSMHV_Qi_dVdsi + here->HSMHV_Qi_dVgsi + here->HSMHV_Qi_dVbsi) ;
dQi_dVgs = here->HSMHV_Qi_dVgsi ;
dQi_dVbs = here->HSMHV_Qi_dVbsi ;
dQbulk_dVds = -(here->HSMHV_Qbulk_dVdsi + here->HSMHV_Qbulk_dVgsi + here->HSMHV_Qbulk_dVbsi) ;
dQbulk_dVgs = here->HSMHV_Qbulk_dVgsi ;
dQbulk_dVbs = here->HSMHV_Qbulk_dVbsi ;
}
/* from Qg_nqs = - Qi_nqs - Qb_nqs: */
dQg_nqs_dQi_nqs = - 1.0 ;
dQg_nqs_dQb_nqs = - 1.0 ;
/* from Qd_nqs = Qi_nqs * Qdrat: */
dQd_nqs_dVds = Qi_nqs * dQdrat_dVds ;
dQd_nqs_dVgs = Qi_nqs * dQdrat_dVgs ;
dQd_nqs_dVbs = Qi_nqs * dQdrat_dVbs ;
dQd_nqs_dQi_nqs = Qdrat ;
/* by implicit differentiation of the NQS equations (DC operating point only!): */
dQi_nqs_dVds = dQi_dVds ;
dQi_nqs_dVgs = dQi_dVgs ;
dQi_nqs_dVbs = dQi_dVbs ;
dQb_nqs_dVds = dQbulk_dVds ;
dQb_nqs_dVgs = dQbulk_dVgs ;
dQb_nqs_dVbs = dQbulk_dVbs ;
cggb_nqs = dQg_nqs_dQi_nqs * dQi_nqs_dVgs + dQg_nqs_dQb_nqs * dQb_nqs_dVgs ;
cgdb_nqs = dQg_nqs_dQi_nqs * dQi_nqs_dVds + dQg_nqs_dQb_nqs * dQb_nqs_dVds ;
cgsb_nqs = - dQg_nqs_dQi_nqs * (dQi_nqs_dVds + dQi_nqs_dVgs + dQi_nqs_dVbs)
- dQg_nqs_dQb_nqs * (dQb_nqs_dVds + dQb_nqs_dVgs + dQb_nqs_dVbs) ;
cdgb_nqs = dQd_nqs_dVgs + dQd_nqs_dQi_nqs * dQi_nqs_dVgs ;
cddb_nqs = dQd_nqs_dVds + dQd_nqs_dQi_nqs * dQi_nqs_dVds ;
cdsb_nqs = -(dQd_nqs_dVds + dQd_nqs_dVgs + dQd_nqs_dVbs) - dQd_nqs_dQi_nqs * (dQi_nqs_dVds + dQi_nqs_dVgs + dQi_nqs_dVbs) ;
cbgb_nqs = dQb_nqs_dVgs ;
cbdb_nqs = dQb_nqs_dVds ;
cbsb_nqs = -(dQb_nqs_dVds + dQb_nqs_dVgs + dQb_nqs_dVbs) ;
} else { /* QS case */
cggb_nqs = cgdb_nqs = cgsb_nqs = cdgb_nqs = cddb_nqs = cdsb_nqs = cbgb_nqs = cbdb_nqs = cbsb_nqs = 0.0 ;
}
switch (which) {
case HSMHV_COSELFHEAT:
value->iValue = here->HSMHV_coselfheat;
return(OK);
case HSMHV_COSUBNODE:
value->iValue = here->HSMHV_cosubnode;
return(OK);
case HSMHV_L:
value->rValue = here->HSMHV_l;
return(OK);
case HSMHV_W:
value->rValue = here->HSMHV_w;
return(OK);
case HSMHV_AS:
value->rValue = here->HSMHV_as;
return(OK);
case HSMHV_AD:
value->rValue = here->HSMHV_ad;
return(OK);
case HSMHV_PS:
value->rValue = here->HSMHV_ps;
return(OK);
case HSMHV_PD:
value->rValue = here->HSMHV_pd;
return(OK);
case HSMHV_NRS:
value->rValue = here->HSMHV_nrs;
return(OK);
case HSMHV_NRD:
value->rValue = here->HSMHV_nrd;
return(OK);
case HSMHV_DTEMP:
value->rValue = here->HSMHV_dtemp;
return(OK);
case HSMHV_OFF:
value->iValue = here->HSMHV_off;
return(OK);
case HSMHV_IC_VBS:
value->rValue = here->HSMHV_icVBS;
return(OK);
case HSMHV_IC_VDS:
value->rValue = here->HSMHV_icVDS;
return(OK);
case HSMHV_IC_VGS:
value->rValue = here->HSMHV_icVGS;
return(OK);
case HSMHV_DNODE:
value->iValue = here->HSMHVdNode;
return(OK);
case HSMHV_GNODE:
value->iValue = here->HSMHVgNode;
return(OK);
case HSMHV_SNODE:
value->iValue = here->HSMHVsNode;
return(OK);
case HSMHV_BNODE:
value->iValue = here->HSMHVbNode;
return(OK);
case HSMHV_DNODEPRIME:
value->iValue = here->HSMHVdNodePrime;
return(OK);
case HSMHV_SNODEPRIME:
value->iValue = here->HSMHVsNodePrime;
return(OK);
case HSMHV_SOURCECONDUCT:
value->rValue = here->HSMHVsourceConductance;
return(OK);
case HSMHV_DRAINCONDUCT:
value->rValue = here->HSMHVdrainConductance;
return(OK);
case HSMHV_VBD:
value->rValue = *(ckt->CKTstate0 + here->HSMHVvbd);
return(OK);
case HSMHV_VBS:
value->rValue = *(ckt->CKTstate0 + here->HSMHVvbs);
return(OK);
case HSMHV_VGS:
value->rValue = *(ckt->CKTstate0 + here->HSMHVvgs);
return(OK);
case HSMHV_VDS:
value->rValue = *(ckt->CKTstate0 + here->HSMHVvds);
return(OK);
case HSMHV_CD:
value->rValue = here->HSMHV_ids;
return(OK);
case HSMHV_ISUB:
value->rValue = here->HSMHV_isub;
return(OK);
case HSMHV_IGIDL:
value->rValue = here->HSMHV_igidl;
return(OK);
case HSMHV_IGISL:
value->rValue = here->HSMHV_igisl;
return(OK);
case HSMHV_IGD:
value->rValue = here->HSMHV_igd;
return(OK);
case HSMHV_IGS:
value->rValue = here->HSMHV_igs;
return(OK);
case HSMHV_IGB:
value->rValue = here->HSMHV_igb;
return(OK);
case HSMHV_CBS:
value->rValue = here->HSMHV_ibs;
return(OK);
case HSMHV_CBD:
value->rValue = here->HSMHV_ibd;
return(OK);
case HSMHV_GM:
value->rValue = here->HSMHV_dIds_dVgsi;
return(OK);
case HSMHV_GMT:
value->rValue = here->HSMHV_dIds_dTi;
return(OK);
case HSMHV_GDS:
value->rValue = here->HSMHV_dIds_dVdsi;
return(OK);
case HSMHV_GMBS:
value->rValue = here->HSMHV_dIds_dVbsi;
return(OK);
case HSMHV_GBD:
value->rValue = here->HSMHV_gbd;
return(OK);
case HSMHV_GBS:
value->rValue = here->HSMHV_gbs;
return(OK);
case HSMHV_QB:
value->rValue = *(ckt->CKTstate0 + here->HSMHVqb);
return(OK);
case HSMHV_CQB:
value->rValue = *(ckt->CKTstate0 + here->HSMHVcqb);
return(OK);
case HSMHV_QG:
value->rValue = *(ckt->CKTstate0 + here->HSMHVqg);
return(OK);
case HSMHV_CQG:
value->rValue = *(ckt->CKTstate0 + here->HSMHVcqg);
return(OK);
case HSMHV_QD:
value->rValue = *(ckt->CKTstate0 + here->HSMHVqd);
return(OK);
case HSMHV_CQD:
value->rValue = *(ckt->CKTstate0 + here->HSMHVcqd);
return(OK);
case HSMHV_CGG:
value->rValue = here->HSMHV_dQg_dVgsi - here->HSMHV_cggo;
if (flg_nqs) value->rValue += cggb_nqs;
return(OK);
case HSMHV_CGD:
value->rValue = (here->HSMHV_mode > 0) ? here->HSMHV_dQg_dVdsi - here->HSMHV_cgdo
: - (here->HSMHV_dQg_dVdsi + here->HSMHV_dQg_dVgsi + here->HSMHV_dQg_dVbsi)
- here->HSMHV_cgso;
if (flg_nqs) value->rValue += cgdb_nqs;
return(OK);
case HSMHV_CGS:
value->rValue = (here->HSMHV_mode > 0) ? - (here->HSMHV_dQg_dVdsi + here->HSMHV_dQg_dVgsi + here->HSMHV_dQg_dVbsi)
- here->HSMHV_cgso
: here->HSMHV_dQg_dVdsi - here->HSMHV_cgdo;
if (flg_nqs) value->rValue += cgsb_nqs;
return(OK);
case HSMHV_CDG:
value->rValue = (here->HSMHV_mode > 0) ? here->HSMHV_dQdi_dVgsi - here->HSMHV_cdgo
: here->HSMHV_dQsi_dVgsi - here->HSMHV_csgo;
if (flg_nqs) value->rValue += cdgb_nqs;
return(OK);
case HSMHV_CDD:
value->rValue = (here->HSMHV_mode > 0) ? here->HSMHV_dQdi_dVdsi - here->HSMHV_cddo
: - (here->HSMHV_dQsi_dVdsi + here->HSMHV_dQsi_dVgsi + here->HSMHV_dQsi_dVbsi)
- here->HSMHV_csso;
if (flg_nqs) value->rValue += cddb_nqs;
return(OK);
case HSMHV_CDS:
value->rValue = (here->HSMHV_mode > 0) ? - (here->HSMHV_dQdi_dVdsi + here->HSMHV_dQdi_dVgsi + here->HSMHV_dQdi_dVbsi)
- here->HSMHV_cdso
: here->HSMHV_dQsi_dVdsi - here->HSMHV_csdo;
if (flg_nqs) value->rValue += cdsb_nqs;
return(OK);
case HSMHV_CBG:
value->rValue = here->HSMHV_dQb_dVgsi - here->HSMHV_cbgo;
if (flg_nqs) value->rValue += cbgb_nqs;
return(OK);
case HSMHV_CBDB:
value->rValue = (here->HSMHV_mode > 0) ? here->HSMHV_dQb_dVdsi - here->HSMHV_cbdo
: - (here->HSMHV_dQb_dVdsi + here->HSMHV_dQb_dVgsi + here->HSMHV_dQb_dVbsi)
+ (here->HSMHV_cbdo+here->HSMHV_cbgo+here->HSMHV_cbbo);
if (flg_nqs) value->rValue += cbdb_nqs;
return(OK);
case HSMHV_CBSB:
value->rValue = (here->HSMHV_mode > 0) ? - (here->HSMHV_dQb_dVdsi + here->HSMHV_dQb_dVgsi + here->HSMHV_dQb_dVbsi)
+ (here->HSMHV_cbdo + here->HSMHV_cbgo + here->HSMHV_cbbo)
: here->HSMHV_dQb_dVdsi - here->HSMHV_cbdo;
if (flg_nqs) value->rValue += cbsb_nqs;
return(OK);
case HSMHV_CGDO:
value->rValue = (here->HSMHV_mode > 0) ? here->HSMHV_cgdo : here->HSMHV_cgso;
return(OK);
case HSMHV_CGSO:
value->rValue = (here->HSMHV_mode > 0) ? here->HSMHV_cgso : here->HSMHV_cgdo;
return(OK);
case HSMHV_CGBO:
value->rValue = here->HSMHV_cgbo;
return(OK);
case HSMHV_CAPBD:
value->rValue = here->HSMHV_capbd;
return(OK);
case HSMHV_CAPBS:
value->rValue = here->HSMHV_capbs;
return(OK);
case HSMHV_VON:
value->rValue = here->HSMHV_von;
return(OK);
case HSMHV_VDSAT:
value->rValue = here->HSMHV_vdsat;
return(OK);
case HSMHV_QBS:
value->rValue = *(ckt->CKTstate0 + here->HSMHVqbs);
return(OK);
case HSMHV_QBD:
value->rValue = *(ckt->CKTstate0 + here->HSMHVqbd);
return(OK);
case HSMHV_CORBNET:
value->iValue = here->HSMHV_corbnet;
return(OK);
case HSMHV_RBPB:
value->rValue = here->HSMHV_rbpb;
return (OK);
case HSMHV_RBPD:
value->rValue = here->HSMHV_rbpd;
return(OK);
case HSMHV_RBPS:
value->rValue = here->HSMHV_rbps;
return(OK);
case HSMHV_RBDB:
value->rValue = here->HSMHV_rbdb;
return(OK);
case HSMHV_RBSB:
value->rValue = here->HSMHV_rbsb;
return(OK);
case HSMHV_CORG:
value->iValue = here->HSMHV_corg;
return(OK);
case HSMHV_NGCON:
value->rValue = here->HSMHV_ngcon;
return(OK);
case HSMHV_XGW:
value->rValue = here->HSMHV_xgw;
return(OK);
case HSMHV_XGL:
value->rValue = here->HSMHV_xgl;
return(OK);
case HSMHV_NF:
value->rValue = here->HSMHV_nf;
return(OK);
case HSMHV_SA:
value->rValue = here->HSMHV_sa;
return(OK);
case HSMHV_SB:
value->rValue = here->HSMHV_sb;
return(OK);
case HSMHV_SD:
value->rValue = here->HSMHV_sd;
return(OK);
case HSMHV_NSUBCDFM:
value->rValue = here->HSMHV_nsubcdfm;
return(OK);
case HSMHV_M:
value->rValue = here->HSMHV_m;
return(OK);
case HSMHV_SUBLD1:
value->rValue = here->HSMHV_subld1;
return(OK);
case HSMHV_SUBLD2:
value->rValue = here->HSMHV_subld2;
return(OK);
case HSMHV_LOVER:
value->rValue = here->HSMHV_lover;
return(OK);
case HSMHV_LOVERS:
value->rValue = here->HSMHV_lovers;
return(OK);
case HSMHV_LOVERLD:
value->rValue = here->HSMHV_loverld;
return(OK);
case HSMHV_LDRIFT1:
value->rValue = here->HSMHV_ldrift1;
return(OK);
case HSMHV_LDRIFT2:
value->rValue = here->HSMHV_ldrift2;
return(OK);
case HSMHV_LDRIFT1S:
value->rValue = here->HSMHV_ldrift1s;
return(OK);
case HSMHV_LDRIFT2S:
value->rValue = here->HSMHV_ldrift2s;
return(OK);
default:
return(E_BADPARM);
}
/* NOTREACHED */
}

View File

@ -0,0 +1,254 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvcvtest.c
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "hsmhvdef.h"
#include "trandefs.h"
#include "const.h"
#include "devdefs.h"
#include "sperror.h"
#include "suffix.h"
int HSMHVconvTest(
GENmodel *inModel,
register CKTcircuit *ckt)
{
register HSMHVmodel *model = (HSMHVmodel*)inModel;
register HSMHVinstance *here;
double vds=0.0, vgs=0.0, vbs=0.0, vdse=0.0, vgse=0.0, vbse=0.0, vdbd=0.0, vsbs=0.0, deltemp =0.0 ;
double delvds=0.0, delvgs=0.0, delvbs=0.0, delvdse=0.0, delvgse=0.0, delvbse=0.0, delvdbd=0.0, delvsbs=0.0, deldeltemp =0.0 ;
double Ids=0.0, gds=0.0, gm=0.0, gmbs=0.0, gmT=0.0, gmbs_ext=0.0, gds_ext=0.0, gm_ext=0.0,
Isub=0.0, dIsub_dVds=0.0, dIsub_dVgs=0.0, dIsub_dVbs=0.0, dIsub_dT=0.0,
Isubs=0.0, dIsubs_dVds=0.0, dIsubs_dVgs=0.0, dIsubs_dVbs=0.0, dIsubs_dT=0.0,
Igidl=0.0, dIgidl_dVds=0.0, dIgidl_dVgs=0.0, dIgidl_dVbs=0.0, dIgidl_dT=0.0,
Igisl=0.0, dIgisl_dVds=0.0, dIgisl_dVgs=0.0, dIgisl_dVbs=0.0, dIgisl_dT=0.0,
Igd=0.0, dIgd_dVd=0.0, dIgd_dVg=0.0, dIgd_dVb=0.0, dIgd_dT=0.0,
Igs=0.0, dIgs_dVd=0.0, dIgs_dVg=0.0, dIgs_dVb=0.0, dIgs_dT=0.0,
Igb=0.0, dIgb_dVd=0.0, dIgb_dVg=0.0, dIgb_dVb=0.0, dIgb_dT=0.0,
Ibd=0.0, Gbd=0.0, Gbdt=0.0,
Ibs=0.0, Gbs=0.0, Gbst =0.0 ;
double i_dP=0.0, i_gP=0.0, i_sP=0.0, i_db=0.0, i_sb=0.0,
i_dP_hat=0.0, i_gP_hat=0.0, i_sP_hat=0.0, i_db_hat=0.0, i_sb_hat =0.0 ;
double tol0=0.0, tol1=0.0, tol2=0.0, tol3=0.0, tol4 =0.0 ;
/* loop through all the HSMHV device models */
for ( ; model != NULL; model = model->HSMHVnextModel ) {
/* loop through all the instances of the model */
for ( here = model->HSMHVinstances; here != NULL ;
here = here->HSMHVnextInstance ) {
vds = model->HSMHV_type *
(*(ckt->CKTrhsOld+here->HSMHVdNodePrime) -
*(ckt->CKTrhsOld+here->HSMHVsNodePrime));
vgs = model->HSMHV_type *
(*(ckt->CKTrhsOld+here->HSMHVgNodePrime) -
*(ckt->CKTrhsOld+here->HSMHVsNodePrime));
vbs = model->HSMHV_type *
(*(ckt->CKTrhsOld+here->HSMHVbNodePrime) -
*(ckt->CKTrhsOld+here->HSMHVsNodePrime));
vdse = model->HSMHV_type *
(*(ckt->CKTrhsOld+here->HSMHVdNode) -
*(ckt->CKTrhsOld+here->HSMHVsNode));
vgse = model->HSMHV_type *
(*(ckt->CKTrhsOld+here->HSMHVgNodePrime) -
*(ckt->CKTrhsOld+here->HSMHVsNode));
vbse = model->HSMHV_type *
(*(ckt->CKTrhsOld+here->HSMHVbNodePrime) -
*(ckt->CKTrhsOld+here->HSMHVsNode));
vdbd = model->HSMHV_type
* (*(ckt->CKTrhsOld + here->HSMHVdbNode)
- *(ckt->CKTrhsOld + here->HSMHVdNode));
vsbs = model->HSMHV_type
* (*(ckt->CKTrhsOld + here->HSMHVsbNode)
- *(ckt->CKTrhsOld + here->HSMHVsNode));
if( here->HSMHVtempNode > 0 ){
deltemp = *(ckt->CKTrhsOld + here->HSMHVtempNode);
} else {
deltemp = 0.0 ;
}
delvds = vds - *(ckt->CKTstate0 + here->HSMHVvds) ;
delvgs = vgs - *(ckt->CKTstate0 + here->HSMHVvgs) ;
delvbs = vbs - *(ckt->CKTstate0 + here->HSMHVvbs) ;
delvdse = vdse - *(ckt->CKTstate0 + here->HSMHVvdse) ;
delvgse = vgse - *(ckt->CKTstate0 + here->HSMHVvgse) ;
delvbse = vbse - *(ckt->CKTstate0 + here->HSMHVvbse) ;
delvdbd = vdbd - *(ckt->CKTstate0 + here->HSMHVvdbd) ;
delvsbs = vsbs - *(ckt->CKTstate0 + here->HSMHVvsbs) ;
if( here->HSMHVtempNode > 0 ){
deldeltemp = deltemp - *(ckt->CKTstate0 + here->HSMHVdeltemp) ;
} else {
deldeltemp = 0.0 ;
}
if ( here->HSMHV_mode > 0 ) { /* forward mode */
Ids = here->HSMHV_ids ;
gds = here->HSMHV_dIds_dVdsi ;
gm = here->HSMHV_dIds_dVgsi ;
gmbs = here->HSMHV_dIds_dVbsi ;
gmT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIds_dTi : 0.0 ;
gmbs_ext = here->HSMHV_dIds_dVbse;
gds_ext = here->HSMHV_dIds_dVdse ;
gm_ext = here->HSMHV_dIds_dVgse;
Isub = here->HSMHV_isub ;
dIsub_dVds = here->HSMHV_dIsub_dVdsi ;
dIsub_dVgs = here->HSMHV_dIsub_dVgsi ;
dIsub_dVbs = here->HSMHV_dIsub_dVbsi ;
dIsub_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ;
Isubs = 0.0 ;
dIsubs_dVds = 0.0 ;
dIsubs_dVgs = 0.0 ;
dIsubs_dVbs = 0.0 ;
dIsubs_dT = 0.0 ;
Igidl = here->HSMHV_igidl ;
dIgidl_dVds = here->HSMHV_dIgidl_dVdsi ;
dIgidl_dVgs = here->HSMHV_dIgidl_dVgsi ;
dIgidl_dVbs = here->HSMHV_dIgidl_dVbsi ;
dIgidl_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ;
Igisl = here->HSMHV_igisl ;
dIgisl_dVds = here->HSMHV_dIgisl_dVdsi ;
dIgisl_dVgs = here->HSMHV_dIgisl_dVgsi ;
dIgisl_dVbs = here->HSMHV_dIgisl_dVbsi ;
dIgisl_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ;
Igd = here->HSMHV_igd ;
dIgd_dVd = here->HSMHV_dIgd_dVdsi ;
dIgd_dVg = here->HSMHV_dIgd_dVgsi ;
dIgd_dVb = here->HSMHV_dIgd_dVbsi ;
dIgd_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgd_dTi : 0.0 ;
Igs = here->HSMHV_igs ;
dIgs_dVd = here->HSMHV_dIgs_dVdsi ;
dIgs_dVg = here->HSMHV_dIgs_dVgsi ;
dIgs_dVb = here->HSMHV_dIgs_dVbsi ;
dIgs_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgs_dTi : 0.0 ;
Igb = here->HSMHV_igb ;
dIgb_dVd = here->HSMHV_dIgb_dVdsi ;
dIgb_dVg = here->HSMHV_dIgb_dVgsi ;
dIgb_dVb = here->HSMHV_dIgb_dVbsi ;
dIgb_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ;
Ibd = here->HSMHV_ibd ;
Gbd = here->HSMHV_gbd ;
Gbdt = (here->HSMHVtempNode > 0) ? here->HSMHV_gbdT : 0.0 ;
Ibs = here->HSMHV_ibs ;
Gbs = here->HSMHV_gbs ;
Gbst = (here->HSMHVtempNode > 0) ? here->HSMHV_gbsT : 0.0 ;
} else { /* reverse mode */
Ids = - here->HSMHV_ids ;
gds = + (here->HSMHV_dIds_dVdsi + here->HSMHV_dIds_dVgsi + here->HSMHV_dIds_dVbsi) ;
gm = - here->HSMHV_dIds_dVgsi ;
gmbs = - here->HSMHV_dIds_dVbsi ;
gmT = (here->HSMHVtempNode > 0) ? - here->HSMHV_dIds_dTi : 0.0 ;
gds_ext = + (here->HSMHV_dIds_dVdse + here->HSMHV_dIds_dVgse + here->HSMHV_dIds_dVbse) ;
gm_ext = - here->HSMHV_dIds_dVgse;
gmbs_ext = - here->HSMHV_dIds_dVbse;
Isub = 0.0 ;
dIsub_dVds = 0.0 ;
dIsub_dVgs = 0.0 ;
dIsub_dVbs = 0.0 ;
dIsub_dT = 0.0 ;
Isubs = here->HSMHV_isub ;
dIsubs_dVds = - (here->HSMHV_dIsub_dVdsi + here->HSMHV_dIsub_dVgsi + here->HSMHV_dIsub_dVbsi) ;
dIsubs_dVgs = here->HSMHV_dIsub_dVgsi ;
dIsubs_dVbs = here->HSMHV_dIsub_dVbsi ;
dIsubs_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ;
Igidl = here->HSMHV_igisl ;
dIgidl_dVds = - (here->HSMHV_dIgisl_dVdsi + here->HSMHV_dIgisl_dVgsi + here->HSMHV_dIgisl_dVbsi) ;
dIgidl_dVgs = here->HSMHV_dIgisl_dVgsi ;
dIgidl_dVbs = here->HSMHV_dIgisl_dVbsi ;
dIgidl_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ;
Igisl = here->HSMHV_igidl ;
dIgisl_dVds = - (here->HSMHV_dIgidl_dVdsi + here->HSMHV_dIgidl_dVgsi + here->HSMHV_dIgidl_dVbsi) ;
dIgisl_dVgs = here->HSMHV_dIgidl_dVgsi ;
dIgisl_dVbs = here->HSMHV_dIgidl_dVbsi ;
dIgisl_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ;
Igd = here->HSMHV_igd ;
dIgd_dVd = - (here->HSMHV_dIgs_dVdsi + here->HSMHV_dIgs_dVgsi + here->HSMHV_dIgs_dVbsi) ;
dIgd_dVg = here->HSMHV_dIgs_dVgsi ;
dIgd_dVb = here->HSMHV_dIgs_dVbsi ;
dIgd_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgs_dTi : 0.0 ;
Igs = here->HSMHV_igs ;
dIgs_dVd = - (here->HSMHV_dIgd_dVdsi + here->HSMHV_dIgd_dVgsi + here->HSMHV_dIgd_dVbsi) ;
dIgs_dVg = here->HSMHV_dIgd_dVgsi ;
dIgs_dVb = here->HSMHV_dIgd_dVbsi ;
dIgs_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgd_dTi : 0.0 ;
Igb = here->HSMHV_igb ;
dIgb_dVd = - (here->HSMHV_dIgb_dVdsi + here->HSMHV_dIgb_dVgsi + here->HSMHV_dIgb_dVbsi) ;
dIgb_dVg = here->HSMHV_dIgb_dVgsi ;
dIgb_dVb = here->HSMHV_dIgb_dVbsi ;
dIgb_dT = (here->HSMHVtempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ;
Ibd = here->HSMHV_ibd ;
Gbd = here->HSMHV_gbd ;
Gbdt = (here->HSMHVtempNode > 0) ? here->HSMHV_gbdT : 0.0 ;
Ibs = here->HSMHV_ibs ;
Gbs = here->HSMHV_gbs ;
Gbst = (here->HSMHVtempNode > 0) ? here->HSMHV_gbsT : 0.0 ;
} /* end of reverse mode */
/* for convergence control, only nonlinear static currents are considered: */
i_dP = Ids + Isub + Igidl - Igd ;
i_dP_hat = i_dP + gm *delvgs + gds *delvds + gmbs *delvbs + gmT *deldeltemp
+ dIsub_dVgs *delvgs + dIsub_dVds *delvds + dIsub_dVbs *delvbs + dIsub_dT *deldeltemp
+ dIgidl_dVgs*delvgs + dIgidl_dVds*delvds + dIgidl_dVbs*delvbs + dIgidl_dT*deldeltemp
-(dIgd_dVg *delvgs + dIgd_dVd *delvds + dIgd_dVb *delvbs + dIgd_dT *deldeltemp)
+ gm_ext *delvgse + gds_ext *delvdse + gmbs_ext *delvbse ;
i_gP = Igd + Igs + Igb ;
i_gP_hat = i_gP + dIgd_dVg *delvgs + dIgd_dVd *delvds + dIgd_dVb *delvbs + dIgd_dT *deldeltemp
+ dIgs_dVg *delvgs + dIgs_dVd *delvds + dIgs_dVb *delvbs + dIgs_dT *deldeltemp
+ dIgb_dVg *delvgs + dIgb_dVd *delvds + dIgb_dVb *delvbs + dIgb_dT *deldeltemp ;
i_sP =-Ids + Isubs + Igisl - Igs ;
i_sP_hat = i_sP -(gm *delvgs + gds *delvds + gmbs *delvbs + gmT *deldeltemp)
+ dIsubs_dVgs*delvgs + dIsubs_dVds*delvds + dIsubs_dVbs*delvbs + dIsubs_dT*deldeltemp
+ dIgisl_dVgs*delvgs + dIgisl_dVds*delvds + dIgisl_dVbs*delvbs + dIgisl_dT*deldeltemp
-(dIgs_dVg *delvgs + dIgs_dVd *delvds + dIgs_dVb *delvbs + dIgs_dT *deldeltemp)
-(gm_ext *delvgse + gds_ext *delvdse + gmbs_ext *delvbse) ;
i_db = Ibd ;
i_db_hat = i_db + Gbd*delvdbd + Gbdt*deldeltemp ;
i_sb = Ibs ;
i_sb_hat = i_sb + Gbs*delvsbs + Gbst*deldeltemp ;
/* to be added: power source for thermal network */
/*
* check convergence
*/
if ( here->HSMHV_off == 0 || !(ckt->CKTmode & MODEINITFIX) ) {
tol0 = ckt->CKTreltol * MAX(fabs(i_dP_hat), fabs(i_dP)) + ckt->CKTabstol;
tol1 = ckt->CKTreltol * MAX(fabs(i_gP_hat), fabs(i_gP)) + ckt->CKTabstol;
tol2 = ckt->CKTreltol * MAX(fabs(i_sP_hat), fabs(i_sP)) + ckt->CKTabstol;
tol3 = ckt->CKTreltol * MAX(fabs(i_db_hat), fabs(i_db)) + ckt->CKTabstol;
tol4 = ckt->CKTreltol * MAX(fabs(i_sb_hat), fabs(i_sb)) + ckt->CKTabstol;
if ( (fabs(i_dP_hat - i_dP) >= tol0)
|| (fabs(i_gP_hat - i_gP) >= tol1)
|| (fabs(i_sP_hat - i_sP) >= tol2)
|| (fabs(i_db_hat - i_db) >= tol3)
|| (fabs(i_sb_hat - i_sb) >= tol4) ) {
ckt->CKTnoncon++;
return(OK);
}
}
}
}
return(OK);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,47 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvdel.c
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#include "ngspice.h"
#include <stdio.h>
#include "hsmhvdef.h"
#include "sperror.h"
#include "gendefs.h"
#include "suffix.h"
int HSMHVdelete(
GENmodel *inModel,
IFuid name,
GENinstance **inInst)
{
HSMHVinstance **fast = (HSMHVinstance**)inInst;
HSMHVmodel *model = (HSMHVmodel*)inModel;
HSMHVinstance **prev = NULL;
HSMHVinstance *here;
for( ;model ;model = model->HSMHVnextModel ) {
prev = &(model->HSMHVinstances);
for ( here = *prev ;here ;here = *prev ) {
if ( here->HSMHVname == name || (fast && here==*fast) ) {
*prev= here->HSMHVnextInstance;
FREE(here);
return(OK);
}
prev = &(here->HSMHVnextInstance);
}
}
return(E_NODEV);
}

View File

@ -0,0 +1,45 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvdest.c
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#include "ngspice.h"
#include <stdio.h>
#include "hsmhvdef.h"
#include "suffix.h"
void HSMHVdestroy(
GENmodel **inModel)
{
HSMHVmodel **model = (HSMHVmodel**)inModel;
HSMHVinstance *here;
HSMHVinstance *prev = NULL;
HSMHVmodel *mod = *model;
HSMHVmodel *oldmod = NULL;
for ( ;mod ;mod = mod->HSMHVnextModel ) {
if (oldmod) FREE(oldmod);
oldmod = mod;
prev = (HSMHVinstance *)NULL;
for ( here = mod->HSMHVinstances ;here ;here = here->HSMHVnextInstance ) {
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

View File

@ -0,0 +1,693 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhveval_qover.h
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
/* Begin HSMHVevalQover */
/*---------------------------------------------------*
* Clamp -Vxbgmt.
*-----------------*/
T0 = - Vxbgmt;
if ( T0 > Vbs_bnd ) {
T1 = T0 - Vbs_bnd;
T1_dT = - Vbs_bnd_dT;
T2 = Vbs_max - Vbs_bnd;
T2_dT = Vbs_max_dT - Vbs_bnd_dT;
Fn_SUPoly4m( TY, T1, T2, T11, T0 );
TY_dT = T1_dT * T11 + T2_dT * T0;
T10 = Vbs_bnd + TY ;
T10_dT = Vbs_bnd_dT + TY_dT ;
} else {
T10 = T0 ;
T11 = 1.0 ;
T10_dT = 0.0;
}
Vxbgmtcl = - T10;
Vxbgmtcl_dVxbgmt = T11;
Vxbgmtcl_dT = - T10_dT;
fac1 = cnst0over_func * Cox0_inv ;
fac1_dVbs = 0.0; fac1_dVds = 0.0; fac1_dVgs = 0.0;
fac1_dT = cnst0over_func_dT * Cox0_inv ;
fac1p2 = fac1 * fac1 ;
fac1p2_dT = 2.0 * fac1 * fac1_dT ;
VgpLD = - Vgbgmt + pParam->HSMHV_vfbover;
VgpLD_dVgb = - 1.0e0 ;
T0 = Nover_func / here->HSMHV_nin ;
Pb2over = 2.0 / beta * log( T0 ) ;
T0_dT = - T0 / here->HSMHV_nin * Nin_dT ;
Pb2over_dT = - Pb2over / beta * beta_dT + 2.0 / beta / T0 * T0_dT ;
Vgb_fb_LD = - Vxbgmtcl ;
/*-----------------------------------*
* QsuLD: total charge = Accumulation | Depletion+inversion
*-----------------*/
if ( VgpLD < Vgb_fb_LD ){
/*---------------------------*
* Accumulation
*-----------------*/
flg_ovzone = -1 ;
T1 = 1.0 / ( beta * cnst0over_func ) ;
T1_dT = - T1 * T1 * ( beta_dT * cnst0over_func + beta * cnst0over_func_dT ) ;
TY = T1 * Cox0 ;
Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ;
Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ;
TY_dT = T1_dT * Cox0 ;
Ac41_dT = 3.0 * C_SQRT_2 * TY_dT ;
Ac4_dT = 8.0 * 3.0 * Ac41 * Ac41 * Ac41_dT ;
Ps0_min = here->HSMHV_eg - Pb2over ;
Ps0_min_dT = Eg_dT - Pb2over_dT ;
TX = beta * ( VgpLD + Vxbgmtcl ) ;
TX_dVxb = beta * Vxbgmtcl_dVxbgmt ;
TX_dVgb = beta * VgpLD_dVgb ;
TX_dT = beta_dT * ( VgpLD + Vxbgmtcl ) + beta * Vxbgmtcl_dT;
Ac31 = 7.0 * C_SQRT_2 - 9.0 * TY * ( TX - 2.0 ) ;
Ac31_dVxb = - 9.0 * TY * TX_dVxb ;
Ac31_dVgb = - 9.0 * TY * TX_dVgb ;
Ac31_dT = - 9.0 * ( TY_dT * ( TX - 2.0 ) + TY * TX_dT );
Ac3 = Ac31 * Ac31 ;
T1 = 2.0 * Ac31 ;
Ac3_dVxb = T1 * Ac31_dVxb ;
Ac3_dVgb = T1 * Ac31_dVgb ;
Ac3_dT = T1 * Ac31_dT ;
Ac2 = sqrt( Ac4 + Ac3 ) ;
T1 = 0.5 / Ac2 ;
Ac2_dVxb = T1 * Ac3_dVxb ;
Ac2_dVgb = T1 * Ac3_dVgb ;
Ac2_dT = T1 * ( Ac4_dT + Ac3_dT );
Ac1 = -7.0 * C_SQRT_2 + Ac2 + 9.0 * TY * ( TX - 2.0 ) ;
Ac1_dVxb = Ac2_dVxb + 9.0 * TY * TX_dVxb ;
Ac1_dVgb = Ac2_dVgb + 9.0 * TY * TX_dVgb ;
Ac1_dT = Ac2_dT + 9.0 * ( TY_dT * ( TX - 2.0 ) + TY * TX_dT ) ;
Acd = pow( Ac1 , C_1o3 ) ;
T1 = C_1o3 / ( Acd * Acd ) ;
Acd_dVxb = Ac1_dVxb * T1 ;
Acd_dVgb = Ac1_dVgb * T1 ;
Acd_dT = Ac1_dT * T1 ;
Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ;
T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ;
Acn_dVxb = T1 * Acd_dVxb ;
Acn_dVgb = T1 * Acd_dVgb ;
Acn_dT = - 12.0 * TY_dT + T1 * Acd_dT ;
Chi = Acn / Acd ;
T1 = 1.0 / ( Acd * Acd ) ;
Chi_dVxb = ( Acn_dVxb * Acd - Acn * Acd_dVxb ) * T1 ;
Chi_dVgb = ( Acn_dVgb * Acd - Acn * Acd_dVgb ) * T1 ;
Chi_dT = ( Acn_dT * Acd - Acn * Acd_dT ) * T1 ;
Psa = Chi * beta_inv - Vxbgmtcl ;
Psa_dVxb = Chi_dVxb * beta_inv - Vxbgmtcl_dVxbgmt ;
Psa_dVgb = Chi_dVgb * beta_inv ;
Psa_dT = Chi_dT * beta_inv + Chi * beta_inv_dT - Vxbgmtcl_dT ;
T1 = Psa + Vxbgmtcl ;
T1_dT = Psa_dT + Vxbgmtcl_dT ;
T2 = T1 / Ps0_min ;
T2_dT = ( T1_dT * Ps0_min - T1 * Ps0_min_dT ) / ( Ps0_min * Ps0_min ) ;
T3 = sqrt( 1.0 + ( T2 * T2 ) ) ;
T9 = T2 / T3 / Ps0_min ;
T3_dVd = T9 * ( Psa_dVxb + Vxbgmtcl_dVxbgmt ) ;
T3_dVg = T9 * Psa_dVgb ;
T3_dT = T2_dT * T2 / T3;
Ps0LD = T1 / T3 - Vxbgmtcl ;
T9 = 1.0 / ( T3 * T3 ) ;
Ps0LD_dVxb = T9 * ( ( Psa_dVxb + Vxbgmtcl_dVxbgmt ) * T3 - T1 * T3_dVd ) - Vxbgmtcl_dVxbgmt ;
Ps0LD_dVgb = T9 * ( Psa_dVgb * T3 - T1 * T3_dVg );
Ps0LD_dT = T9 * ( T1_dT * T3 - T1 * T3_dT ) - Vxbgmtcl_dT;
T2 = ( VgpLD - Ps0LD ) ;
QsuLD = Cox0 * T2 ;
QsuLD_dVxb = - Cox0 * Ps0LD_dVxb ;
QsuLD_dVgb = Cox0 * ( VgpLD_dVgb - Ps0LD_dVgb ) ;
QsuLD_dT = Cox0 * ( - Ps0LD_dT ) ;
QbuLD = QsuLD ;
QbuLD_dVxb = QsuLD_dVxb ;
QbuLD_dVgb = QsuLD_dVgb ;
QbuLD_dT = QsuLD_dT ;
} else {
if ( model->HSMHV_coqovsm != 1 ) { /*-- COQOVSM != 1: Analytical solution --(Original)--*/
/*---------------------------*
* Depletion and inversion
*-----------------*/
/* initial value for a few fixpoint iterations
to get Ps0_iniA from simplified Poisson equation: */
flg_ovzone = 2 ;
Chi = znbd3 ;
Chi_dVxb = beta*Vxbgmtcl_dVxbgmt;
Chi_dVgb = Chi_dT = 0.0;
Ps0_iniA= Chi/beta - Vxbgmtcl ;
Ps0_iniA_dVxb = Chi_dVxb/beta - Vxbgmtcl_dVxbgmt ;
Ps0_iniA_dVgb = Chi_dVgb/beta ;
Ps0_iniA_dT = Chi_dT/beta - Chi*beta_dT/(beta*beta) - Vxbgmtcl_dT;
/* 3 .. 5 iterations should be sufficient */
for ( lp_ld = 1; lp_ld <= 3; lp_ld ++ ) {
TY = exp(-Chi);
TY_dVxb = -Chi_dVxb * TY;
TY_dVgb = -Chi_dVgb * TY;
TY_dT = - Chi_dT * TY;
TX = 1.0e0 + 4.0e0
* ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 + TY ) / ( fac1p2 * beta2 ) ;
TX_dVxb = 4.0e0 * ( beta * ( Vxbgmtcl_dVxbgmt ) + TY_dVxb ) / ( fac1p2 * beta2 );
TX_dVgb = 4.0e0 * ( beta * ( VgpLD_dVgb ) + TY_dVgb ) / ( fac1p2 * beta2 );
T1 = ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 + TY );
T1_dT = beta_dT * ( VgpLD + Vxbgmtcl ) + beta * Vxbgmtcl_dT + TY_dT;
T3 = fac1p2 * beta2 ;
T3_dT = fac1p2_dT * beta2 + fac1p2 * ( 2 * beta * beta_dT ) ;
TX_dT = 4 * ( T1_dT * T3 - T1 * T3_dT ) / ( T3 * T3 );
if ( TX < epsm10) {
TX = epsm10;
TX_dVxb = TX_dVgb = TX_dT = 0.0;
}
Ps0_iniA = VgpLD + fac1p2 * beta / 2.0e0 * ( 1.0e0 - sqrt( TX ) ) ;
Ps0_iniA_dVxb = - fac1p2 * beta / 2.0e0 * TX_dVxb * 0.5 / sqrt( TX );
Ps0_iniA_dVgb = VgpLD_dVgb - fac1p2 * beta / 2.0e0 * TX_dVgb * 0.5 / sqrt( TX );
T1 = fac1p2 * beta ;
T1_dT = fac1p2_dT * beta + fac1p2 * beta_dT ;
T2 = 1.0 - sqrt( TX );
T2_dT = - 1.0e0 / ( 2.0e0 * sqrt( TX ) ) * TX_dT ;
Ps0_iniA_dT = ( T1_dT * T2 + T1 * T2_dT ) / 2.0e0 ;
Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ;
Chi_dVxb = beta * ( Ps0_iniA_dVxb + Vxbgmtcl_dVxbgmt ) ;
Chi_dVgb = beta * ( Ps0_iniA_dVgb ) ;
Chi_dT = beta_dT * ( Ps0_iniA + Vxbgmtcl ) + beta * ( Ps0_iniA_dT + Vxbgmtcl_dT );
}
if ( Chi < znbd3 ) {
flg_ovzone = 1 ;
/*-----------------------------------*
* zone-D1
* - Ps0_iniA is the analytical solution of QovLD=Qb0 with
* Qb0 being approximated by 3-degree polynomial.
*
* new: Inclusion of exp(-Chi) term at right border
*-----------------*/
Tc = 0.7071067 + 1.0/(beta*fac1);
Tc_dT = - (beta_dT*fac1 + beta*fac1_dT)/(beta2*fac1p2);
Td = - (VgpLD + Vxbgmtcl) / fac1;
Td_dVxb = - Vxbgmtcl_dVxbgmt / fac1;
Td_dVgb = - VgpLD_dVgb / fac1;
Td_dT = - (Vxbgmtcl_dT*fac1 - (VgpLD+Vxbgmtcl)*fac1_dT)/fac1p2;
Tq = Tb*Tb*Tb / (27.0*Ta*Ta*Ta) - Tb*Tc/(6.0*Ta*Ta) + Td/(2.0*Ta);
Tq_dVxb = Td_dVxb/(2.0*Ta);
Tq_dVgb = Td_dVgb / (2.0*Ta);
Tq_dT = - Tb/(6.0*Ta*Ta)*Tc_dT + Td_dT/(2.0*Ta);
Tp = (3.0*Ta*Tc-Tb*Tb)/(9.0*Ta*Ta);
Tp_dT = Tc_dT/(3.0*Ta);
T5 = sqrt(Tq*Tq + Tp*Tp*Tp);
T5_dVxb = 2.0*Tq*Tq_dVxb / (2.0*T5);
T5_dVgb = 2.0*Tq*Tq_dVgb / (2.0*T5);
T5_dT = (2.0*Tq*Tq_dT + 3.0*Tp*Tp*Tp_dT) / (2.0*T5);
Tu = pow(-Tq + T5,C_1o3);
Tu_dVxb = Tu / (3.0 * (-Tq + T5)) * (-Tq_dVxb + T5_dVxb);
Tu_dVgb = Tu / (3.0 * (-Tq + T5)) * (-Tq_dVgb + T5_dVgb);
Tu_dT = Tu / (3.0 * (-Tq + T5)) * (-Tq_dT + T5_dT);
Tv = -pow(Tq + T5,C_1o3);
Tv_dVxb = Tv / (3.0 * (-Tq - T5)) * (-Tq_dVxb - T5_dVxb);
Tv_dVgb = Tv / (3.0 * (-Tq - T5)) * (-Tq_dVgb - T5_dVgb);
Tv_dT = Tv / (3.0 * (-Tq - T5)) * (-Tq_dT - T5_dT );
TX = Tu + Tv - Tb/(3.0*Ta);
TX_dVxb = Tu_dVxb + Tv_dVxb;
TX_dVgb = Tu_dVgb + Tv_dVgb;
TX_dT = Tu_dT + Tv_dT ;
Ps0_iniA = TX * beta_inv - Vxbgmtcl ;
Ps0_iniA_dVxb = TX_dVxb * beta_inv - Vxbgmtcl_dVxbgmt;
Ps0_iniA_dVgb = TX_dVgb * beta_inv;
Ps0_iniA_dT = TX_dT * beta_inv + TX * beta_inv_dT - Vxbgmtcl_dT;
Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ;
Chi_dVxb = beta * ( Ps0_iniA_dVxb + Vxbgmtcl_dVxbgmt ) ;
Chi_dVgb = beta * ( Ps0_iniA_dVgb ) ;
Chi_dT = beta_dT * ( Ps0_iniA + Vxbgmtcl ) + beta * ( Ps0_iniA_dT + Vxbgmtcl_dT );
}
if ( model->HSMHV_coqovsm > 0 ) {
/*-----------------------------------*
* - Ps0_iniB : upper bound.
*-----------------*/
flg_ovzone += 2;
VgpLD_shift = VgpLD + Vxbgmtcl + 0.5;
VgpLD_shift_dVgb = VgpLD_dVgb;
VgpLD_shift_dVxb = Vxbgmtcl_dVxbgmt;
VgpLD_shift_dT = Vxbgmtcl_dT;
exp_bVbs = exp( beta * - Vxbgmtcl ) ;
exp_bVbs_dVxb = - exp_bVbs * beta * Vxbgmtcl_dVxbgmt;
exp_bVbs_dT = - exp_bVbs * (beta_dT*Vxbgmtcl + beta*Vxbgmtcl_dT);
T0 = here->HSMHV_nin / Nover_func;
T0_dT = Nin_dT / Nover_func;
cnst1over = T0 * T0;
cnst1over_dT = 2.0 * T0 * T0_dT;
gamma = cnst1over * exp_bVbs;
gamma_dVxb = cnst1over * exp_bVbs_dVxb;
gamma_dT = cnst1over_dT * exp_bVbs + cnst1over * exp_bVbs_dT;
psi = beta*VgpLD_shift;
psi_dVgb = beta*VgpLD_shift_dVgb;
psi_dVxb = beta*VgpLD_shift_dVxb;
psi_dT = beta_dT*VgpLD_shift + beta*VgpLD_shift_dT;
T0 = beta2 * fac1p2;
T0_dT = 2.0 * beta * fac1 * (beta_dT*fac1+beta*fac1_dT);
Chi_B = log (1.0 + psi*psi/(gamma*T0) );
Chi_B_dpsi = 2.0 * psi/(gamma*T0)
/ (1.0 + psi*psi/(gamma*T0) );
Chi_B_dgamma = - psi*psi/(gamma*gamma*T0)
/ (1.0 + psi*psi/(gamma*T0) );
Chi_B_dT = - psi*psi/(gamma*T0*T0)
/ (1.0 + psi*psi/(gamma*T0) );
Chi_B_dVgb = Chi_B_dpsi * psi_dVgb;
Chi_B_dVxb = Chi_B_dpsi * psi_dVxb + Chi_B_dgamma * gamma_dVxb;
Chi_B_dT = Chi_B_dpsi * psi_dT + Chi_B_dgamma * gamma_dT
+ Chi_B_dT * T0_dT;
Ps0_iniB = Chi_B/beta - Vxbgmtcl ;
Ps0_iniB_dVgb = Chi_B_dVgb/beta;
Ps0_iniB_dVxb = Chi_B_dVxb/beta- Vxbgmtcl_dVxbgmt;
Ps0_iniB_dT = Chi_B_dT/beta - Chi_B/(beta*beta)*beta_dT - Vxbgmtcl_dT;
/* construction of Ps0LD by taking Ps0_iniB as an upper limit of Ps0_iniA
*
* Limiting is done for Chi rather than for Ps0LD, to avoid shifting
* for Fn_SU2 */
Chi_A = Chi;
Chi_A_dVxb = Chi_dVxb;
Chi_A_dVgb = Chi_dVgb;
Chi_A_dT = Chi_dT;
Fn_SU2( Chi, Chi_A, Chi_B, c_ps0ini_2*100.00, T1, T2 );
Chi_dVgb = Chi_A_dVgb * T1 + Chi_B_dVgb * T2;
Chi_dVxb = Chi_A_dVxb * T1 + Chi_B_dVxb * T2;
Chi_dT = Chi_A_dT * T1 + Chi_B_dT * T2;
/* updating Ps0LD */
Ps0LD= Chi/beta - Vxbgmtcl ;
Ps0LD_dVgb = Chi_dVgb/beta;
Ps0LD_dVxb = Chi_dVxb/beta- Vxbgmtcl_dVxbgmt;
Ps0LD_dT = Chi_dT/beta - Chi/(beta*beta)*beta_dT - Vxbgmtcl_dT;
}
T1 = Chi - 1.0 + exp(-Chi);
T1_dVxb = (1.0 - exp(-Chi)) * Chi_dVxb ;
T1_dVgb = (1.0 - exp(-Chi)) * Chi_dVgb ;
T1_dT = (1.0 - exp(-Chi)) * Chi_dT ;
if (T1 < epsm10) {
T1 = epsm10;
T1_dVxb = 0.0;
T1_dVgb = 0.0;
T1_dT = 0.0;
}
T2 = sqrt(T1);
QbuLD = cnst0over_func * T2 ;
T3 = cnst0over_func * 0.5 / T2 ;
QbuLD_dVxb = T3 * T1_dVxb ;
QbuLD_dVgb = T3 * T1_dVgb ;
QbuLD_dT = T3 * T1_dT + cnst0over_func_dT * T2 ;
/*-----------------------------------------------------------*
* QsuLD : Qovs or Qovd in unit area.
* note: QsuLD = Qdep+Qinv.
*-----------------*/
QsuLD = Cox0 * ( VgpLD - Ps0LD ) ;
QsuLD_dVxb = Cox0 * ( - Ps0LD_dVxb ) ;
QsuLD_dVgb = Cox0 * ( VgpLD_dVgb - Ps0LD_dVgb ) ;
QsuLD_dT = Cox0 * ( - Ps0LD_dT ) ;
} else { /*-- COQOVSM == 1: Iterative solution ---------------*/
Fn_SZ( T1 , Pb2over + Vxbgmtcl , 1e-3 , T0 ) ;
VthLD = Pb2over + 2.0 * pParam->HSMHV_vfbover
+ sqrt( 2 * C_QE * Nover_func * C_ESI * ( T1 ) ) * Cox0_inv ;
/*-----------------------------------*
* Depletion
*-----------------*/
TX = 1.0e0 + 4.0e0
* ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 ) / ( fac1p2 * beta2 ) ;
TX = Fn_Max( TX , epsm10 ) ;
Ps0_iniA = VgpLD + fac1p2 * beta / 2.0e0 * ( 1.0e0 - sqrt( TX ) ) ;
Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ;
if ( Chi < znbd3 ) {
/*-----------------------------------*
* zone-D1/D2
* - Ps0LD is the analytical solution of Qs=Qb0 with
* Qb0 being approximated to 3-degree polynomial.
*-----------------*/
TY = beta * ( VgpLD + Vxbgmtcl ) ;
T1 = 1.0e0 / ( cn_nc3 * beta * fac1 ) ;
T2 = 81.0 + 3.0 * T1 ;
T3 = -2916.0 - 81.0 * T1 + 27.0 * T1 * TY ;
T4 = 1458.0 - 81.0 * ( 54.0 + T1 ) + 27.0 * T1 * TY ;
T4 = T4 * T4 ;
T5 = pow( T3 + sqrt( 4 * T2 * T2 * T2 + T4 ) , C_1o3 ) ;
TX = 3.0 - ( C_2p_1o3 * T2 ) / ( 3.0 * T5 )
+ 1 / ( 3.0 * C_2p_1o3 ) * T5 ;
Ps0_iniA = TX * beta_inv - Vxbgmtcl ;
Ps0_ini = Ps0_iniA ;
} else if ( - Vgbgmt <= VthLD ) {
Ps0_ini = Ps0_iniA ;
} else {
/*-----------------------------------*
* Strong inversion zone.
* - Ps0_iniB : upper bound.
*-----------------*/
T1 = ps0ldinib_func; /* (1 / cnst1 / cnstCoxi) */
T2 = T1 * VgpLD * VgpLD ;
T3 = beta + 2.0 / VgpLD ;
Ps0_iniB = log( T2 + small ) / T3 ;
Fn_SU( Ps0_ini , Ps0_iniA, Ps0_iniB, c_ps0ini_2, T1) ;
}
TX = - Vxbgmtcl + 0.5 * ps_conv ;
if ( Ps0_ini < TX ) Ps0_ini = TX ;
/*---------------------------------------------------*
* Assign initial guess.
*-----------------*/
Ps0LD = Ps0_ini ;
/*---------------------------------------------------*
* Calculation of Ps0LD. (beginning of Newton loop)
* - Fs0 : Fs0 = 0 is the equation to be solved.
* - dPs0 : correction value.
*-----------------*/
exp_bVbs = exp( beta * - Vxbgmtcl ) ;
T0 = here->HSMHV_nin / Nover_func;
cnst1over = T0 * T0;
cnst1over_dT = 2.0 * T0 * ( Nin_dT / Nover_func );
cfs1 = cnst1over * exp_bVbs ;
flg_conv = 0 ;
for ( lp_s0 = 1 ; lp_s0 <= 2*lp_s0_max + 1 ; lp_s0 ++ ) {
Chi = beta * ( Ps0LD + Vxbgmtcl ) ;
if ( Chi < znbd5 ) {
/*-------------------------------------------*
* zone-D1/D2. (Ps0LD)
*-----------------*/
fi = Chi * Chi * Chi
* ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ;
fi_dChi = Chi * Chi
* ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ;
fs01 = cfs1 * fi * fi ;
fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ;
fb = Chi * ( cn_nc51
+ Chi * ( cn_nc52
+ Chi * ( cn_nc53
+ Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ;
fb_dChi = cn_nc51
+ Chi * ( 2 * cn_nc52
+ Chi * ( 3 * cn_nc53
+ Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ;
fs02 = sqrt( fb * fb + fs01 + small ) ;
fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ;
} else {
/*-------------------------------------------*
* zone-D3. (Ps0LD)
*-----------------*/
if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */
exp_Chi = exp( Chi ) ;
fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ;
fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ;
} else {
exp_bPs0 = exp( beta*Ps0LD ) ;
fs01 = cnst1over * ( exp_bPs0 - exp_bVbs ) ;
fs01_dPs0 = cnst1over * beta * exp_bPs0 ;
}
fs02 = sqrt( Chi - 1.0 + fs01 ) ;
fs02_dPs0 = ( beta + fs01_dPs0 ) / fs02 * 0.5 ;
} /* end of if ( Chi ... ) block */
/*-----------------------------------------------------------*
* Fs0
*-----------------*/
Fs0 = VgpLD - Ps0LD - fac1 * fs02 ;
Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ;
if ( flg_conv == 1 ) break ;
dPs0 = - Fs0 / Fs0_dPs0 ;
/*-------------------------------------------*
* Update Ps0LD .
*-----------------*/
dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0LD))) ;
if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ;
Ps0LD = Ps0LD + dPs0 ;
TX = -Vxbgmtcl + ps_conv / 2 ;
if ( Ps0LD < TX ) Ps0LD = TX ;
/*-------------------------------------------*
* Check convergence.
*-----------------*/
if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) {
flg_conv = 1 ;
}
} /* end of Ps0LD Newton loop */
/*-------------------------------------------*
* Procedure for diverged case.
*-----------------*/
if ( flg_conv == 0 ) {
fprintf( stderr ,
"*** warning(HiSIM): Went Over Iteration Maximum (Ps0LD)\n" ) ;
fprintf( stderr , " -Vxbgmtcl = %e Vgbgmt = %e\n" , -Vxbgmtcl , Vgbgmt ) ;
}
/*---------------------------------------------------*
* Evaluate derivatives of Ps0LD.
*-----------------*/
Chi_dT = beta_dT * ( Ps0LD + Vxbgmtcl ) + beta * Vxbgmtcl_dT;
exp_bVbs_dT = - ( beta_dT * Vxbgmtcl + beta * Vxbgmtcl_dT ) * exp_bVbs;
cfs1_dT = exp_bVbs * cnst1over_dT + exp_bVbs_dT * cnst1over;
if ( Chi < znbd5 ) {
fs01_dVbs = cfs1 * beta * fi * ( - fi + 2 * fi_dChi ) ; /* fs01_dVxbgmtcl */
fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ;
T2 = 1.0e0 / ( fs02 + fs02 ) ;
fs02_dVbs = ( + beta * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */
fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ;
} else {
if ( Chi < large_arg ) {
fs01_dVbs = + cfs1 * beta ; /* fs01_dVxbgmtcl */
exp_Chi_dT = exp_Chi * Chi_dT ;
fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ;
} else {
fs01_dVbs = + cfs1 * beta ;
exp_bPs0_dT = exp_bPs0 * Ps0LD * beta_dT ;
fs01_dT = cnst1over_dT*(exp_bPs0-exp_bVbs) + cnst1over*(exp_bPs0_dT-exp_bVbs_dT) ;
}
T2 = 0.5e0 / fs02 ;
fs02_dVbs = ( + beta + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */
fs02_dT = T2 * ( Chi_dT + fs01_dT ) ;
}
T1 = 1.0 / Fs0_dPs0 ;
Ps0LD_dVxb = - ( - fac1 * fs02_dVbs ) * T1 ;
Ps0LD_dVds = 0.0 ;
Ps0LD_dVgb = - ( VgpLD_dVgb - fac1_dVgs * fs02 ) * T1 ;
Ps0LD_dT = - ( - ( fac1 * fs02_dT + fac1_dT * fs02 ) ) * T1;
Chi_dT = beta_dT * ( Ps0LD + Vxbgmtcl ) + beta * ( Ps0LD_dT + Vxbgmtcl_dT );
if ( Chi < znbd5 ) {
/*-------------------------------------------*
* zone-D1/D2. (Ps0LD)
*-----------------*/
if ( Chi < znbd3 ) { flg_ovzone = 1; }
else { flg_ovzone = 2 ; }
Xi0 = fb * fb + epsm10 ;
T1 = 2 * fb * fb_dChi * beta ;
Xi0_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0_dVxbgmtcl */
Xi0_dVds = T1 * Ps0LD_dVds ;
Xi0_dVgs = T1 * Ps0LD_dVgb ;
Xi0_dT = 2 * fb * fb_dChi * Chi_dT ;
Xi0p12 = fb + epsm10 ;
T1 = fb_dChi * beta ;
Xi0p12_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0p12_dVxbgmtcl */
Xi0p12_dVds = T1 * Ps0LD_dVds ;
Xi0p12_dVgs = T1 * Ps0LD_dVgb ;
Xi0p12_dT = fb_dChi * Chi_dT ;
Xi0p32 = fb * fb * fb + epsm10 ;
T1 = 3 * fb * fb * fb_dChi * beta ;
Xi0p32_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0p32_dVxbgmtcl */
Xi0p32_dVds = T1 * Ps0LD_dVds ;
Xi0p32_dVgs = T1 * Ps0LD_dVgb ;
Xi0p32_dT = 3 * fb * fb * fb_dChi * Chi_dT ;
fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ;
fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ;
} else {
/*-------------------------------------------*
* zone-D3. (Ps0LD)
*-----------------*/
flg_ovzone = 3 ;
Xi0 = Chi - 1.0e0 ;
Xi0_dVbs = beta * ( Ps0LD_dVxb + 1.0e0 ) ; /* Xi0_dVxbgmtcl */
Xi0_dVds = beta * Ps0LD_dVds ;
Xi0_dVgs = beta * Ps0LD_dVgb ;
Xi0_dT = Chi_dT ;
Xi0p12 = sqrt( Xi0 ) ;
T1 = 0.5e0 / Xi0p12 ;
Xi0p12_dVbs = T1 * Xi0_dVbs ;
Xi0p12_dVds = T1 * Xi0_dVds ;
Xi0p12_dVgs = T1 * Xi0_dVgs ;
Xi0p12_dT = T1 * Xi0_dT ;
Xi0p32 = Xi0 * Xi0p12 ;
T1 = 1.5e0 * Xi0p12 ;
Xi0p32_dVbs = T1 * Xi0_dVbs ;
Xi0p32_dVds = T1 * Xi0_dVds ;
Xi0p32_dVgs = T1 * Xi0_dVgs ;
Xi0p32_dT = T1 * Xi0_dT ;
if ( Chi < large_arg ) {
exp_Chi_dT = exp_Chi * Chi_dT ;
fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ;
} else {
exp_bPs0_dT = exp_bPs0 * (beta_dT * Ps0LD + beta * Ps0LD_dT) ;
fs01_dT = cnst1over_dT*(exp_bPs0-exp_bVbs) + cnst1over*(exp_bPs0_dT-exp_bVbs_dT) ;
}
fs02_dT = T2 * ( Chi_dT + fs01_dT ) ;
} /* end of if ( Chi ... ) block */
/*-----------------------------------------------------------*
* - Recalculate the derivatives of fs01 and fs02.
*-----------------*/
fs01_dVbs = Ps0LD_dVxb * fs01_dPs0 + fs01_dVbs ;
fs01_dVds = Ps0LD_dVds * fs01_dPs0 ;
fs01_dVgs = Ps0LD_dVgb * fs01_dPs0 ;
fs02_dVbs = Ps0LD_dVxb * fs02_dPs0 + fs02_dVbs ;
fs02_dVxb = Ps0LD_dVds * fs02_dPs0 ;
fs02_dVgb = Ps0LD_dVgb * fs02_dPs0 ;
/*-----------------------------------------------------------*
* QbuLD and QiuLD
*-----------------*/
QbuLD = cnst0over_func * Xi0p12 ;
QbuLD_dVxb = cnst0over_func * Xi0p12_dVbs ;
QbuLD_dVgb = cnst0over_func * Xi0p12_dVgs ;
QbuLD_dT = cnst0over_func * Xi0p12_dT + cnst0over_func_dT * Xi0p12;
T1 = 1.0 / ( fs02 + Xi0p12 ) ;
QiuLD = cnst0over_func * fs01 * T1 ;
T2 = 1.0 / ( fs01 + epsm10 ) ;
QiuLD_dVbs = QiuLD * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ;
QiuLD_dVgs = QiuLD * ( fs01_dVgs * T2 - ( fs02_dVgb + Xi0p12_dVgs ) * T1 ) ;
T1_dT = - T1 * T1 * ( fs02_dT + Xi0p12_dT );
QiuLD_dT = cnst0over_func * ( fs01 * T1_dT + T1 * fs01_dT ) + fs01 * T1 * cnst0over_func_dT;
/*-----------------------------------------------------------*
* make QiuLD=0 if VgVt <= VgVt_small
*-----------------*/
if ( QiuLD * Cox_inv <= VgVt_small ) {
flg_ovzone = 4 ;
QiuLD = 0.0 ;
QiuLD_dVbs = 0.0 ;
QiuLD_dVgs = 0.0 ;
QiuLD_dT = 0.0 ;
}
/*-----------------------------------------------------------*
* Extrapolation: X_dVxbgmt = X_dVxbgmtcl * Vxbgmtcl_dVxbgmt
*-----------------*/
QbuLD_dVxb *= Vxbgmtcl_dVxbgmt;
QiuLD_dVbs *= Vxbgmtcl_dVxbgmt;
/*-----------------------------------------------------------*
* Total overlap charge
*-----------------*/
QsuLD = QbuLD + QiuLD;
QsuLD_dVxb = QbuLD_dVxb + QiuLD_dVbs;
QsuLD_dVgb = QbuLD_dVgb + QiuLD_dVgs;
QsuLD_dT = QbuLD_dT + QiuLD_dT;
} /* end of COQOVSM branches */
} /* end of Vgbgmt region blocks */
/* convert to source ref. */
QsuLD_dVbs = QsuLD_dVxb * Vxbgmt_dVbs + QsuLD_dVgb * Vgbgmt_dVbs ;
QsuLD_dVds = QsuLD_dVxb * Vxbgmt_dVds + QsuLD_dVgb * Vgbgmt_dVds ;
QsuLD_dVgs = QsuLD_dVxb * Vxbgmt_dVgs + QsuLD_dVgb * Vgbgmt_dVgs ;
QbuLD_dVbs = QbuLD_dVxb * Vxbgmt_dVbs + QbuLD_dVgb * Vgbgmt_dVbs ;
QbuLD_dVds = QbuLD_dVxb * Vxbgmt_dVds + QbuLD_dVgb * Vgbgmt_dVds ;
QbuLD_dVgs = QbuLD_dVxb * Vxbgmt_dVgs + QbuLD_dVgb * Vgbgmt_dVgs ;
/* additional Vds dependency */
/* QsuLD += model->HSMHV_cvdsover * Cox0 * Vdsgmt ; */
/* QsuLD_dVds += model->HSMHV_cvdsover * Cox0 ; */
/* inversion charge = total - depletion */
QiuLD = QsuLD - QbuLD ;
QiuLD_dVbs = QsuLD_dVbs - QbuLD_dVbs ;
QiuLD_dVds = QsuLD_dVds - QbuLD_dVds ;
QiuLD_dVgs = QsuLD_dVgs - QbuLD_dVgs ;
QiuLD_dT = QsuLD_dT - QbuLD_dT ;
/* End HSMHVevalQover */

View File

@ -0,0 +1,91 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvevalenv.h
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#ifndef HSMHV_EVAL_ENV_H
#define HSMHV_EVAL_ENV_H
/* macros and constants used in hsmhveval2yz.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
#define MAX_EXP 5.834617425e14
#define MIN_EXP 1.713908431e-15
#define EXP_THR 34.0
/* 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_p2 (1.0e4)
#define C_m2um (1.0e6)
/*---------------------------------------------------*
* 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-10)
#define C_EOX (3.453133e-11)
#define C_VAC (8.8541878e-12)
/* Room temperature constants */
#define C_T300 (300e+00)
#define C_b300 (3.868283e+01)
/* #define C_Eg0 (1.1785e0) */ /*changed to parameter sIN.eg0*/
/* Build-in potential */
/*#define C_Vbi (1.0e0)*/ /* changed to parameter sIN.vbi */
/* Intrinsic carrier density at 300K */
#define C_Nin0 (1.04e+16)
/*---------------------------------------------------*
* 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 /* HSMHV_EVAL_ENV_H */

View File

@ -0,0 +1,39 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvext.h
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
extern int HSMHVacLoad(GENmodel *,CKTcircuit*);
extern int HSMHVask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*);
extern int HSMHVconvTest(GENmodel *,CKTcircuit*);
extern int HSMHVdelete(GENmodel*,IFuid,GENinstance**);
extern void HSMHVdestroy(GENmodel**);
extern int HSMHVgetic(GENmodel*,CKTcircuit*);
extern int HSMHVload(GENmodel*,CKTcircuit*);
extern int HSMHVmAsk(CKTcircuit*,GENmodel *,int, IFvalue*);
extern int HSMHVmDelete(GENmodel**,IFuid,GENmodel*);
extern int HSMHVmParam(int,IFvalue*,GENmodel*);
extern void HSMHVmosCap(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 HSMHVparam(int,IFvalue*,GENinstance*,IFvalue*);
extern int HSMHVpzLoad(GENmodel*,CKTcircuit*,SPcomplex*);
extern int HSMHVsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
extern int HSMHVunsetup(GENmodel*,CKTcircuit*);
extern int HSMHVtemp(GENmodel*,CKTcircuit*);
extern int HSMHVtrunc(GENmodel*,CKTcircuit*,double*);
extern int HSMHVnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*);

View File

@ -0,0 +1,57 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvgetic.c
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "hsmhvdef.h"
#include "sperror.h"
#include "suffix.h"
int HSMHVgetic(
GENmodel *inModel,
CKTcircuit *ckt)
{
HSMHVmodel *model = (HSMHVmodel*)inModel;
HSMHVinstance *here;
/*
* grab initial conditions out of rhs array. User specified, so use
* external nodes to get values
*/
for ( ;model ;model = model->HSMHVnextModel ) {
for ( here = model->HSMHVinstances; here ;here = here->HSMHVnextInstance ) {
if (!here->HSMHV_icVBS_Given) {
here->HSMHV_icVBS =
*(ckt->CKTrhs + here->HSMHVbNode) -
*(ckt->CKTrhs + here->HSMHVsNode);
}
if (!here->HSMHV_icVDS_Given) {
here->HSMHV_icVDS =
*(ckt->CKTrhs + here->HSMHVdNode) -
*(ckt->CKTrhs + here->HSMHVsNode);
}
if (!here->HSMHV_icVGS_Given) {
here->HSMHV_icVGS =
*(ckt->CKTrhs + here->HSMHVgNode) -
*(ckt->CKTrhs + here->HSMHVsNode);
}
}
}
return(OK);
}

View File

@ -0,0 +1,82 @@
#include "config.h"
#include "devdefs.h"
#include "hsmhvdef.h"
#include "hsmhvitf.h"
#include "hsmhvinit.h"
SPICEdev HSMHVinfo = {
{ "HiSIMHV",
"Hiroshima University STARC IGFET Model - HiSIM_HV",
&HSMHVnSize,
&HSMHVnSize,
HSMHVnames,
&HSMHVpTSize,
HSMHVpTable,
&HSMHVmPTSize,
HSMHVmPTable,
#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 */ HSMHVparam,
/* DEVmodParam */ HSMHVmParam,
/* DEVload */ HSMHVload,
/* DEVsetup */ HSMHVsetup,
/* DEVunsetup */ HSMHVunsetup,
/* DEVpzSetup */ HSMHVsetup,
/* DEVtemperature*/ HSMHVtemp,
/* DEVtrunc */ HSMHVtrunc,
/* DEVfindBranch */ NULL,
/* DEVacLoad */ HSMHVacLoad,
/* DEVaccept */ NULL,
/* DEVdestroy */ HSMHVdestroy,
/* DEVmodDelete */ HSMHVmDelete,
/* DEVdelete */ HSMHVdelete,
/* DEVsetic */ HSMHVgetic,
/* DEVask */ HSMHVask,
/* DEVmodAsk */ HSMHVmAsk,
/* DEVpzLoad */ HSMHVpzLoad,
/* DEVconvTest */ HSMHVconvTest,
/* DEVsenSetup */ NULL,
/* DEVsenLoad */ NULL,
/* DEVsenUpdate */ NULL,
/* DEVsenAcLoad */ NULL,
/* DEVsenPrint */ NULL,
/* DEVsenTrunc */ NULL,
/* DEVdisto */ NULL,
/* DEVnoise */ HSMHVnoise,
#ifdef CIDER
/* DEVdump */ NULL,
/* DEVacct */ NULL,
#endif
/* DEVinstSize */ &HSMHViSize,
/* DEVmodSize */ &HSMHVmSize
};
SPICEdev *
get_hsmhv_info(void)
{
return &HSMHVinfo;
}

View File

@ -0,0 +1,13 @@
#ifndef _HISIMINIT_H
#define _HISIMINIT_H
extern IFparm HSMHVpTable[ ];
extern IFparm HSMHVmPTable[ ];
extern char *HSMHVnames[ ];
extern int HSMHVpTSize;
extern int HSMHVmPTSize;
extern int HSMHVnSize;
extern int HSMHViSize;
extern int HSMHVmSize;
#endif

View File

@ -0,0 +1,23 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvitf
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#ifndef DEV_HISIMHV
#define DEV_HISIMHV
SPICEdev *get_hsmhv_info(void);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,123 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvld_info_eval.h
DATE : 2010.11.02
recent changes: - 2009.01.09 some bugfixes
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
/* print all outputs ------------VV */
if ( model->HSMHV_info >= 4 ) {
here->HSMHV_csdo = - (here->HSMHV_cddo + here->HSMHV_cgdo + here->HSMHV_cbdo) ;
here->HSMHV_csgo = - (here->HSMHV_cdgo + here->HSMHV_cggo + here->HSMHV_cbgo) ;
here->HSMHV_csbo = - (here->HSMHV_cdbo + here->HSMHV_cgbo + here->HSMHV_cbbo) ;
here->HSMHV_cdso = - (here->HSMHV_cddo + here->HSMHV_cdgo + here->HSMHV_cdbo) ;
here->HSMHV_cgso = - (here->HSMHV_cgdo + here->HSMHV_cggo + here->HSMHV_cgbo) ;
here->HSMHV_csso = - (here->HSMHV_csdo + here->HSMHV_csgo + here->HSMHV_csbo) ;
cgdb = dQg_dVds - ((here->HSMHV_mode > 0) ? here->HSMHV_cgdo : here->HSMHV_cgso) ;
cggb = dQg_dVgs - here->HSMHV_cggo ;
cgsb = - (dQg_dVds + dQg_dVgs + dQg_dVbs) - ((here->HSMHV_mode > 0) ? here->HSMHV_cgso : here->HSMHV_cgdo) ;
cbdb = dQb_dVds - ((here->HSMHV_mode > 0) ? here->HSMHV_cbdo :
-(here->HSMHV_cbdo+here->HSMHV_cbgo+here->HSMHV_cbbo)) ;
cbgb = dQb_dVgs - here->HSMHV_cbgo ;
cbsb = - (dQb_dVds + dQb_dVgs + dQb_dVbs) - ((here->HSMHV_mode > 0) ? -(here->HSMHV_cbdo+here->HSMHV_cbgo+here->HSMHV_cbbo)
: here->HSMHV_cbdo) ;
cddb = dQd_dVds - ((here->HSMHV_mode > 0) ? here->HSMHV_cddo : here->HSMHV_csso) ;
cdgb = dQd_dVgs - ((here->HSMHV_mode > 0) ? here->HSMHV_cdgo : here->HSMHV_csgo) ;
cdsb = - (dQd_dVds + dQd_dVgs + dQd_dVbs) - ((here->HSMHV_mode > 0) ? here->HSMHV_cdso : here->HSMHV_csdo) ;
if (flg_nqs) {
/* by implicit differentiation of the nqs equations: */
dQi_nqs_dVds = (dQi_dVds + Iqi_nqs * dtau_dVds )/(1.0 + ag0 * tau ) ;
dQi_nqs_dVgs = (dQi_dVgs + Iqi_nqs * dtau_dVgs )/(1.0 + ag0 * tau ) ;
dQi_nqs_dVbs = (dQi_dVbs + Iqi_nqs * dtau_dVbs )/(1.0 + ag0 * tau ) ;
dQb_nqs_dVds = (dQbulk_dVds + Iqb_nqs * dtaub_dVds)/(1.0 + ag0 * taub) ;
dQb_nqs_dVgs = (dQbulk_dVgs + Iqb_nqs * dtaub_dVgs)/(1.0 + ag0 * taub) ;
dQb_nqs_dVbs = (dQbulk_dVbs + Iqb_nqs * dtaub_dVbs)/(1.0 + ag0 * taub) ;
cgdb_nqs = dQg_nqs_dQi_nqs * dQi_nqs_dVds + dQg_nqs_dQb_nqs * dQb_nqs_dVds ;
cggb_nqs = dQg_nqs_dQi_nqs * dQi_nqs_dVgs + dQg_nqs_dQb_nqs * dQb_nqs_dVgs ;
cgsb_nqs = - dQg_nqs_dQi_nqs * (dQi_nqs_dVds + dQi_nqs_dVgs + dQi_nqs_dVbs)
- dQg_nqs_dQb_nqs * (dQb_nqs_dVds + dQb_nqs_dVgs + dQb_nqs_dVbs) ;
cbdb_nqs = dQb_nqs_dVds ;
cbgb_nqs = dQb_nqs_dVgs ;
cbsb_nqs = -(dQb_nqs_dVds + dQb_nqs_dVgs + dQb_nqs_dVbs) ;
cddb_nqs = dQd_nqs_dVds + dQd_nqs_dQi_nqs * dQi_nqs_dVds ;
cdgb_nqs= dQd_nqs_dVgs + dQd_nqs_dQi_nqs * dQi_nqs_dVgs ;
cdsb_nqs= -(dQd_nqs_dVds + dQd_nqs_dVgs + dQd_nqs_dVbs) - dQd_nqs_dQi_nqs * (dQi_nqs_dVds + dQi_nqs_dVgs + dQi_nqs_dVbs) ;
} else {
cgdb_nqs = cggb_nqs = cgsb_nqs = cbdb_nqs = cbgb_nqs = cbsb_nqs = cddb_nqs = cdgb_nqs = cdsb_nqs = 0.0 ;
}
printf( "--- variables returned from HSMHVevaluate() ----\n" ) ;
printf( "von = %12.5e\n" , here->HSMHV_von ) ;
printf( "vdsat = %12.5e\n" , here->HSMHV_vdsat ) ;
printf( "ids = %12.5e\n" , here->HSMHV_ids ) ;
printf( "gds = %12.5e\n" , here->HSMHV_dIds_dVdsi ) ;
printf( "gm = %12.5e\n" , here->HSMHV_dIds_dVgsi ) ;
printf( "gmbs = %12.5e\n" , here->HSMHV_dIds_dVbsi ) ;
printf( "cggo = %12.5e\n" , here->HSMHV_cggo ) ;
printf( "cgdo = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_cgdo : here->HSMHV_cgso ) ;
printf( "cgso = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_cgso : here->HSMHV_cgdo ) ;
printf( "cdgo = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_cdgo : here->HSMHV_csgo ) ;
printf( "cddo = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_cddo : here->HSMHV_csso ) ;
printf( "cdso = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_cdso : here->HSMHV_csdo ) ;
printf( "csgo = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_csgo : here->HSMHV_cdgo ) ;
printf( "csdo = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_csdo : here->HSMHV_cdso ) ;
printf( "csso = %12.5e\n" , (here->HSMHV_mode > 0) ? here->HSMHV_csso : here->HSMHV_cddo ) ;
printf( "qg = %12.5e\n" , Qg + Qg_nqs) ;
printf( "qd = %12.5e\n" , Qd + Qd_nqs) ;
printf( "qs = %12.5e\n" , Qs + Qs_nqs) ;
printf( "cggb = %12.5e\n" , cggb + cggb_nqs ) ;
printf( "cgsb = %12.5e\n" , cgsb + cgsb_nqs ) ;
printf( "cgdb = %12.5e\n" , cgdb + cgdb_nqs ) ;
printf( "cbgb = %12.5e\n" , cbgb + cbgb_nqs ) ;
printf( "cbsb = %12.5e\n" , cbsb + cbsb_nqs ) ;
printf( "cbdb = %12.5e\n" , cbdb + cbdb_nqs ) ;
printf( "cdgb = %12.5e\n" , cdgb + cdgb_nqs ) ;
printf( "cdsb = %12.5e\n" , cdsb + cdsb_nqs ) ;
printf( "cddb = %12.5e\n" , cddb + cddb_nqs ) ;
printf( "ibd = %12.5e\n" , Ibd ) ;
printf( "ibs = %12.5e\n" , Ibs ) ;
printf( "gbd = %12.5e\n" , Gbd ) ;
printf( "gbs = %12.5e\n" , Gbs ) ;
printf( "capbd = %12.5e\n" , Cbd ) ;
printf( "capbs = %12.5e\n" , Cbs ) ;
printf( "qbd = %12.5e\n" , Qbd ) ;
printf( "qbs = %12.5e\n" , Qbs ) ;
printf( "isub = %12.5e\n" , here->HSMHV_isub ) ;
printf( "gbgs = %12.5e\n" , dIsub_dVgs + dIsubs_dVgs ) ;
printf( "gbds = %12.5e\n" , dIsub_dVds + dIsubs_dVds ) ;
printf( "gbbs = %12.5e\n" , dIsub_dVbs + dIsubs_dVbs ) ;
printf( "S_flicker_noise * ( freq / gain ) = %.16e\n" , here->HSMHV_noiflick ) ;
printf( "S_thermal_noise / ( gain * 4kT ) = %.16e\n" , here->HSMHV_noithrml ) ;
printf( "S_induced_gate_noise / ( gain * freq^2 ) = %.16e\n" , here->HSMHV_noiigate ) ;
printf( "cross-correlation coefficient (= Sigid/sqrt(Sig*Sid) ) = %.16e\n" , here->HSMHV_noicross ) ;
/* print Surface Potentials */
/* printf( "ivds %e ivgs %e ivbs %e Ps0 %.16e Pds %.16e\n" , */
/* ivds, ivgs, ivbs, here->HSMHV_ps0_prv, here->HSMHV_pds_prv ) ; */
}
/* print all outputs ------------AA */
/* End of HSMHVld_info_eval.h */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,54 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvmdel.c
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#include "ngspice.h"
#include <stdio.h>
#include "hsmhvdef.h"
#include "sperror.h"
#include "suffix.h"
int HSMHVmDelete(
GENmodel **inModel,
IFuid modname,
GENmodel *kill)
{
HSMHVmodel **model = (HSMHVmodel**)inModel;
HSMHVmodel *modfast = (HSMHVmodel*)kill;
HSMHVinstance *here;
HSMHVinstance *prev = NULL;
HSMHVmodel **oldmod;
oldmod = model;
for ( ;*model ;model = &((*model)->HSMHVnextModel) ) {
if ( (*model)->HSMHVmodName == modname ||
(modfast && *model == modfast) ) goto delgot;
oldmod = model;
}
return(E_NOMOD);
delgot:
*oldmod = (*model)->HSMHVnextModel; /* cut deleted device out of list */
for ( here = (*model)->HSMHVinstances ;
here ;here = here->HSMHVnextInstance ) {
if (prev) FREE(prev);
prev = here;
}
if (prev) FREE(prev);
FREE(*model);
return(OK);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,279 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvnoi.c
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#include "ngspice.h"
#include <stdio.h>
#include <math.h>
#include "hsmhvdef.h"
#include "cktdefs.h"
/* #include "fteconst.h" */
#include "iferrmsg.h"
#include "noisedef.h"
#include "suffix.h"
#include "const.h" /* jwan */
#include "hsmhvevalenv.h"
/* #include "hsmhvmacro.h" */
/*
* HSMHVnoise (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".
*/
extern void NevalSrc();
extern double Nintegrate();
int HSMHVnoise (
int mode, int operation,
GENmodel *inModel,
CKTcircuit *ckt,
register Ndata *data,
double *OnDens)
{
register HSMHVmodel *model = (HSMHVmodel *)inModel;
register HSMHVinstance *here;
char name[N_MXVLNTH];
double tempOnoise=0.0 ;
double tempInoise=0.0 ;
double noizDens[HSMHVNSRCS] ;
double lnNdens[HSMHVNSRCS] ;
register int i;
double G =0.0 ;
double TTEMP = 0.0 ;
/* define the names of the noise sources */
static char * HSMHVnNames[HSMHVNSRCS] = {
/* Note that we have to keep the order
consistent with the index definitions
in hsmhvdefs.h */
".rd", /* noise due to rd */
".rs", /* noise due to rs */
".id", /* noise due to id */
".1ovf", /* flicker (1/f) noise */
".ign", /* induced gate noise component at the drain node */
"" /* total transistor noise */
};
for ( ;model != NULL; model = model->HSMHVnextModel ) {
for ( here = model->HSMHVinstances; here != NULL;
here = here->HSMHVnextInstance ) {
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 < HSMHVNSRCS; i++ ) {
(void) sprintf(name, "onoise.%s%s",
(char *)here->HSMHVname, HSMHVnNames[i]);
data->namelist =
(IFuid *) trealloc((char *) data->namelist,
(data->numPlots + 1) * sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid))
(ckt, &(data->namelist[data->numPlots++]),
(IFuid) NULL, name, UID_OTHER, NULL);
}
break;
case INT_NOIZ:
for ( i = 0; i < HSMHVNSRCS; i++ ) {
(void) sprintf(name, "onoise_total.%s%s",
(char *)here->HSMHVname, HSMHVnNames[i]);
data->namelist =
(IFuid *) trealloc((char *) data->namelist,
(data->numPlots + 1) * sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid))
(ckt, &(data->namelist[data->numPlots++]),
(IFuid) NULL, name, UID_OTHER, NULL);
(void) sprintf(name, "inoise_total.%s%s",
(char *)here->HSMHVname, HSMHVnNames[i]);
data->namelist =
(IFuid *) trealloc((char *) data->namelist,
(data->numPlots + 1) * sizeof(IFuid));
if (!data->namelist)
return(E_NOMEM);
(*(SPfrontEnd->IFnewUid))
(ckt, &(data->namelist[data->numPlots++]),
(IFuid) NULL, name, UID_OTHER, NULL);
}
break;
}
}
break;
case N_CALC:
switch (mode) {
case N_DENS:
/* temperature */
TTEMP = ckt->CKTtemp;
if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; }
TTEMP = TTEMP + *(ckt->CKTstate0 + here->HSMHVdeltemp) ;
/* rs/rd thermal noise */
if ( model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3 ) {
NevalSrc(&noizDens[HSMHVRDNOIZ], (double*) NULL,
ckt, N_GAIN,
here->HSMHVdNodePrime, here->HSMHVdNode,
(double) 0.0);
noizDens[HSMHVRDNOIZ] *= 4 * C_KB * TTEMP * here->HSMHVdrainConductance ;
lnNdens[HSMHVRDNOIZ] = log( MAX(noizDens[HSMHVRDNOIZ],N_MINLOG) );
NevalSrc(&noizDens[HSMHVRSNOIZ], (double*) NULL,
ckt, N_GAIN,
here->HSMHVsNodePrime, here->HSMHVsNode,
(double) 0.0);
noizDens[HSMHVRSNOIZ] *= 4 * C_KB * TTEMP * here->HSMHVsourceConductance ;
lnNdens[HSMHVRSNOIZ] = log( MAX(noizDens[HSMHVRSNOIZ],N_MINLOG) );
} else {
noizDens[HSMHVRDNOIZ] = 0e0 ;
lnNdens[HSMHVRDNOIZ] = N_MINLOG ;
noizDens[HSMHVRSNOIZ] = 0e0 ;
lnNdens[HSMHVRSNOIZ] = N_MINLOG ;
}
/* channel thermal noise */
NevalSrc(&noizDens[HSMHVIDNOIZ], (double*) NULL,
ckt, N_GAIN,
here->HSMHVdNodePrime, here->HSMHVsNodePrime,
(double) 0.0);
switch( model->HSMHV_noise ) {
case 1:
/* HiSIMHV model */
G = here->HSMHV_noithrml ;
noizDens[HSMHVIDNOIZ] *= 4 * C_KB * TTEMP * G ;
lnNdens[HSMHVIDNOIZ] = log( MAX(noizDens[HSMHVIDNOIZ],N_MINLOG) );
break;
}
/* flicker noise */
NevalSrc(&noizDens[HSMHVFLNOIZ], (double*) NULL,
ckt, N_GAIN,
here->HSMHVdNodePrime, here->HSMHVsNodePrime,
(double) 0.0);
switch ( model->HSMHV_noise ) {
case 1:
/* HiSIM model */
noizDens[HSMHVFLNOIZ] *= here->HSMHV_noiflick / pow(data->freq, model->HSMHV_falph) ;
lnNdens[HSMHVFLNOIZ] = log(MAX(noizDens[HSMHVFLNOIZ], N_MINLOG));
break;
}
/* induced gate noise */
NevalSrc(&noizDens[HSMHVIGNOIZ], (double*) NULL,
ckt, N_GAIN,
here->HSMHVdNodePrime, here->HSMHVsNodePrime,
(double) 0.0);
switch ( model->HSMHV_noise ) {
case 1:
/* HiSIM model */
noizDens[HSMHVIGNOIZ] *= here->HSMHV_noiigate * here->HSMHV_noicross * here->HSMHV_noicross * data->freq * data->freq;
lnNdens[HSMHVIGNOIZ] = log(MAX(noizDens[HSMHVIGNOIZ], N_MINLOG));
break;
}
/* total */
noizDens[HSMHVTOTNOIZ] = noizDens[HSMHVRDNOIZ] + noizDens[HSMHVRSNOIZ]
+ noizDens[HSMHVIDNOIZ] + noizDens[HSMHVFLNOIZ] + noizDens[HSMHVIGNOIZ];
lnNdens[HSMHVTOTNOIZ] = log(MAX(noizDens[HSMHVTOTNOIZ], N_MINLOG));
*OnDens += noizDens[HSMHVTOTNOIZ];
if ( data->delFreq == 0.0 ) {
/* if we haven't done any previous
integration, we need to initialize our
"history" variables.
*/
for ( i = 0; i < HSMHVNSRCS; i++ )
here->HSMHVnVar[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 < HSMHVNSRCS; i++) {
here->HSMHVnVar[OUTNOIZ][i] = 0.0;
here->HSMHVnVar[INNOIZ][i] = 0.0;
}
}
}
else {
/* data->delFreq != 0.0,
we have to integrate.
*/
for ( i = 0; i < HSMHVNSRCS; i++ ) {
if ( i != HSMHVTOTNOIZ ) {
tempOnoise =
Nintegrate(noizDens[i], lnNdens[i],
here->HSMHVnVar[LNLSTDENS][i], data);
tempInoise =
Nintegrate(noizDens[i] * data->GainSqInv,
lnNdens[i] + data->lnGainInv,
here->HSMHVnVar[LNLSTDENS][i] + data->lnGainInv,
data);
here->HSMHVnVar[LNLSTDENS][i] = lnNdens[i];
data->outNoiz += tempOnoise;
data->inNoise += tempInoise;
if ( ((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0 ) {
here->HSMHVnVar[OUTNOIZ][i] += tempOnoise;
here->HSMHVnVar[OUTNOIZ][HSMHVTOTNOIZ] += tempOnoise;
here->HSMHVnVar[INNOIZ][i] += tempInoise;
here->HSMHVnVar[INNOIZ][HSMHVTOTNOIZ] += tempInoise;
}
}
}
}
if ( data->prtSummary ) {
for (i = 0; i < HSMHVNSRCS; 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 < HSMHVNSRCS; i++ ) {
data->outpVector[data->outNumber++] = here->HSMHVnVar[OUTNOIZ][i];
data->outpVector[data->outNumber++] = here->HSMHVnVar[INNOIZ][i];
}
}
break;
}
break;
case N_CLOSE:
/* do nothing, the main calling routine will close */
return (OK);
break; /* the plots */
} /* switch (operation) */
} /* for here */
} /* for model */
return(OK);
}

View File

@ -0,0 +1,212 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvpar.c
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#include "ngspice.h"
#include <stdio.h>
#include "ifsim.h"
#include "hsmhvdef.h"
#include "sperror.h"
#include "suffix.h"
int HSMHVparam(
int param,
IFvalue *value,
GENinstance *inst,
IFvalue *select)
{
HSMHVinstance *here = (HSMHVinstance*)inst;
switch (param) {
case HSMHV_COSELFHEAT:
here->HSMHV_coselfheat = value->iValue;
here->HSMHV_coselfheat_Given = TRUE;
break;
case HSMHV_COSUBNODE:
here->HSMHV_cosubnode = value->iValue;
here->HSMHV_cosubnode_Given = TRUE;
break;
case HSMHV_W:
here->HSMHV_w = value->rValue;
here->HSMHV_w_Given = TRUE;
break;
case HSMHV_L:
here->HSMHV_l = value->rValue;
here->HSMHV_l_Given = TRUE;
break;
case HSMHV_AS:
here->HSMHV_as = value->rValue;
here->HSMHV_as_Given = TRUE;
break;
case HSMHV_AD:
here->HSMHV_ad = value->rValue;
here->HSMHV_ad_Given = TRUE;
break;
case HSMHV_PS:
here->HSMHV_ps = value->rValue;
here->HSMHV_ps_Given = TRUE;
break;
case HSMHV_PD:
here->HSMHV_pd = value->rValue;
here->HSMHV_pd_Given = TRUE;
break;
case HSMHV_NRS:
here->HSMHV_nrs = value->rValue;
here->HSMHV_nrs_Given = TRUE;
break;
case HSMHV_NRD:
here->HSMHV_nrd = value->rValue;
here->HSMHV_nrd_Given = TRUE;
break;
case HSMHV_DTEMP:
here->HSMHV_dtemp = value->rValue;
here->HSMHV_dtemp_Given = TRUE;
break;
case HSMHV_OFF:
here->HSMHV_off = value->iValue;
break;
case HSMHV_IC_VBS:
here->HSMHV_icVBS = value->rValue;
here->HSMHV_icVBS_Given = TRUE;
break;
case HSMHV_IC_VDS:
here->HSMHV_icVDS = value->rValue;
here->HSMHV_icVDS_Given = TRUE;
break;
case HSMHV_IC_VGS:
here->HSMHV_icVGS = value->rValue;
here->HSMHV_icVGS_Given = TRUE;
break;
case HSMHV_IC:
switch (value->v.numValue) {
case 3:
here->HSMHV_icVBS = *(value->v.vec.rVec + 2);
here->HSMHV_icVBS_Given = TRUE;
case 2:
here->HSMHV_icVGS = *(value->v.vec.rVec + 1);
here->HSMHV_icVGS_Given = TRUE;
case 1:
here->HSMHV_icVDS = *(value->v.vec.rVec);
here->HSMHV_icVDS_Given = TRUE;
break;
default:
return(E_BADPARM);
}
break;
case HSMHV_CORBNET:
here->HSMHV_corbnet = value->iValue;
here->HSMHV_corbnet_Given = TRUE;
break;
case HSMHV_RBPB:
here->HSMHV_rbpb = value->rValue;
here->HSMHV_rbpb_Given = TRUE;
break;
case HSMHV_RBPD:
here->HSMHV_rbpd = value->rValue;
here->HSMHV_rbpd_Given = TRUE;
break;
case HSMHV_RBPS:
here->HSMHV_rbps = value->rValue;
here->HSMHV_rbps_Given = TRUE;
break;
case HSMHV_RBDB:
here->HSMHV_rbdb = value->rValue;
here->HSMHV_rbdb_Given = TRUE;
break;
case HSMHV_RBSB:
here->HSMHV_rbsb = value->rValue;
here->HSMHV_rbsb_Given = TRUE;
break;
case HSMHV_CORG:
here->HSMHV_corg = value->iValue;
here->HSMHV_corg_Given = TRUE;
break;
case HSMHV_NGCON:
here->HSMHV_ngcon = value->rValue;
here->HSMHV_ngcon_Given = TRUE;
break;
case HSMHV_XGW:
here->HSMHV_xgw = value->rValue;
here->HSMHV_xgw_Given = TRUE;
break;
case HSMHV_XGL:
here->HSMHV_xgl = value->rValue;
here->HSMHV_xgl_Given = TRUE;
break;
case HSMHV_NF:
here->HSMHV_nf = value->rValue;
here->HSMHV_nf_Given = TRUE;
break;
case HSMHV_SA:
here->HSMHV_sa = value->rValue;
here->HSMHV_sa_Given = TRUE;
break;
case HSMHV_SB:
here->HSMHV_sb = value->rValue;
here->HSMHV_sb_Given = TRUE;
break;
case HSMHV_SD:
here->HSMHV_sd = value->rValue;
here->HSMHV_sd_Given = TRUE;
break;
case HSMHV_NSUBCDFM:
here->HSMHV_nsubcdfm = value->rValue;
here->HSMHV_nsubcdfm_Given = TRUE;
break;
case HSMHV_M:
here->HSMHV_m = value->rValue;
here->HSMHV_m_Given = TRUE;
break;
case HSMHV_SUBLD1:
here->HSMHV_subld1 = value->rValue;
here->HSMHV_subld1_Given = TRUE;
break;
case HSMHV_SUBLD2:
here->HSMHV_subld2 = value->rValue;
here->HSMHV_subld2_Given = TRUE;
break;
case HSMHV_LOVER:
here->HSMHV_lover = value->rValue;
here->HSMHV_lover_Given = TRUE;
break;
case HSMHV_LOVERS:
here->HSMHV_lovers = value->rValue;
here->HSMHV_lovers_Given = TRUE;
break;
case HSMHV_LOVERLD:
here->HSMHV_loverld = value->rValue;
here->HSMHV_loverld_Given = TRUE;
break;
case HSMHV_LDRIFT1:
here->HSMHV_ldrift1 = value->rValue;
here->HSMHV_ldrift1_Given = TRUE;
break;
case HSMHV_LDRIFT2:
here->HSMHV_ldrift2 = value->rValue;
here->HSMHV_ldrift2_Given = TRUE;
break;
case HSMHV_LDRIFT1S:
here->HSMHV_ldrift1s = value->rValue;
here->HSMHV_ldrift1s_Given = TRUE;
break;
case HSMHV_LDRIFT2S:
here->HSMHV_ldrift2s = value->rValue;
here->HSMHV_ldrift2s_Given = TRUE;
break;
default:
return(E_BADPARM);
}
return(OK);
}

View File

@ -0,0 +1,280 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvpzld.c
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "complex.h"
#include "sperror.h"
#include "hsmhvdef.h"
#include "suffix.h"
int HSMHVpzLoad(
GENmodel *inModel,
register CKTcircuit *ckt,
register SPcomplex *s)
{
register HSMHVmodel *model = (HSMHVmodel*)inModel;
register HSMHVinstance *here;
int flg_nqs =0 ;
#define dNode 0
#define dNodePrime 1
#define gNode 2
#define gNodePrime 3
#define sNode 4
#define sNodePrime 5
#define bNodePrime 6
#define bNode 7
#define dbNode 8
#define sbNode 9
#define tempNode 10
#define qiNode 11
#define qbNode 12
for ( ;model != NULL ;model = model->HSMHVnextModel ) {
for ( here = model->HSMHVinstances ;here!= NULL ;
here = here->HSMHVnextInstance ) {
flg_nqs = model->HSMHV_conqs ;
/* stamp matrix */
/*drain*/
*(here->HSMHVDdPtr) += here->HSMHV_ydc_d[dNode] + here->HSMHV_ydyn_d[dNode] * s->real;
*(here->HSMHVDdPtr +1) += here->HSMHV_ydyn_d[dNode] * s->imag;
*(here->HSMHVDdpPtr) += here->HSMHV_ydc_d[dNodePrime] + here->HSMHV_ydyn_d[dNodePrime] * s->real;
*(here->HSMHVDdpPtr +1) += here->HSMHV_ydyn_d[dNodePrime] * s->imag;
*(here->HSMHVDgpPtr) += here->HSMHV_ydc_d[gNodePrime] + here->HSMHV_ydyn_d[gNodePrime] * s->real;
*(here->HSMHVDgpPtr +1) += here->HSMHV_ydyn_d[gNodePrime] * s->imag;
*(here->HSMHVDsPtr) += here->HSMHV_ydc_d[sNode] + here->HSMHV_ydyn_d[sNode] * s->real;
*(here->HSMHVDsPtr +1) += here->HSMHV_ydyn_d[sNode] * s->imag;
*(here->HSMHVDbpPtr) += here->HSMHV_ydc_d[bNodePrime] + here->HSMHV_ydyn_d[bNodePrime] * s->real;
*(here->HSMHVDbpPtr +1) += here->HSMHV_ydyn_d[bNodePrime] * s->imag;
*(here->HSMHVDdbPtr) += here->HSMHV_ydc_d[dbNode] + here->HSMHV_ydyn_d[dbNode] * s->real;
*(here->HSMHVDdbPtr +1) += here->HSMHV_ydyn_d[dbNode] * s->imag;
if( here->HSMHVtempNode > 0) {
*(here->HSMHVDtempPtr) += model->HSMHV_type * (here->HSMHV_ydc_d[tempNode] + here->HSMHV_ydyn_d[tempNode] * s->real);
*(here->HSMHVDtempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_d[tempNode] * s->imag;
}
/*drain prime*/
*(here->HSMHVDPdPtr) += here->HSMHV_ydc_dP[dNode] + here->HSMHV_ydyn_dP[dNode] * s->real;
*(here->HSMHVDPdPtr +1) += here->HSMHV_ydyn_dP[dNode] * s->imag;
*(here->HSMHVDPdpPtr) += here->HSMHV_ydc_dP[dNodePrime] + here->HSMHV_ydyn_dP[dNodePrime] * s->real;
*(here->HSMHVDPdpPtr +1) += here->HSMHV_ydyn_dP[dNodePrime] * s->imag;
*(here->HSMHVDPgpPtr) += here->HSMHV_ydc_dP[gNodePrime] + here->HSMHV_ydyn_dP[gNodePrime] * s->real;
*(here->HSMHVDPgpPtr +1) += here->HSMHV_ydyn_dP[gNodePrime] * s->imag;
*(here->HSMHVDPsPtr) += here->HSMHV_ydc_dP[sNode] + here->HSMHV_ydyn_dP[sNode] * s->real;
*(here->HSMHVDPsPtr +1) += here->HSMHV_ydyn_dP[sNode] * s->imag;
*(here->HSMHVDPspPtr) += here->HSMHV_ydc_dP[sNodePrime] + here->HSMHV_ydyn_dP[sNodePrime] * s->real;
*(here->HSMHVDPspPtr +1) += here->HSMHV_ydyn_dP[sNodePrime] * s->imag;
*(here->HSMHVDPbpPtr) += here->HSMHV_ydc_dP[bNodePrime] + here->HSMHV_ydyn_dP[bNodePrime] * s->real;
*(here->HSMHVDPbpPtr +1) += here->HSMHV_ydyn_dP[bNodePrime] * s->imag;
if( here->HSMHVtempNode > 0) {
*(here->HSMHVDPtempPtr) += model->HSMHV_type * (here->HSMHV_ydc_dP[tempNode] + here->HSMHV_ydyn_dP[tempNode] * s->real);
*(here->HSMHVDPtempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_dP[tempNode] * s->imag;
}
if (flg_nqs) {
*(here->HSMHVDPqiPtr) += model->HSMHV_type * (here->HSMHV_ydc_dP[qiNode] + here->HSMHV_ydyn_dP[qiNode] * s->real);
*(here->HSMHVDPqiPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_dP[qiNode] * s->imag;
}
/*gate*/
*(here->HSMHVGgPtr) += here->HSMHV_ydc_g[gNode] + here->HSMHV_ydyn_g[gNode] * s->real;
*(here->HSMHVGgPtr +1) += here->HSMHV_ydyn_g[gNode] * s->imag;
*(here->HSMHVGgpPtr) += here->HSMHV_ydc_g[gNodePrime] + here->HSMHV_ydyn_g[gNodePrime] * s->real;
*(here->HSMHVGgpPtr +1) += here->HSMHV_ydyn_g[gNodePrime] * s->imag;
/*gate prime*/
*(here->HSMHVGPdPtr) += here->HSMHV_ydc_gP[dNode] + here->HSMHV_ydyn_gP[dNode] * s->real;
*(here->HSMHVGPdPtr +1) += here->HSMHV_ydyn_gP[dNode] * s->imag;
*(here->HSMHVGPdpPtr) += here->HSMHV_ydc_gP[dNodePrime] + here->HSMHV_ydyn_gP[dNodePrime] * s->real;
*(here->HSMHVGPdpPtr +1) += here->HSMHV_ydyn_gP[dNodePrime] * s->imag;
*(here->HSMHVGPgPtr) += here->HSMHV_ydc_gP[gNode] + here->HSMHV_ydyn_gP[gNode] * s->real;
*(here->HSMHVGPgPtr +1) += here->HSMHV_ydyn_gP[gNode] * s->imag;
*(here->HSMHVGPgpPtr) += here->HSMHV_ydc_gP[gNodePrime] + here->HSMHV_ydyn_gP[gNodePrime] * s->real;
*(here->HSMHVGPgpPtr +1) += here->HSMHV_ydyn_gP[gNodePrime] * s->imag;
*(here->HSMHVGPsPtr) += here->HSMHV_ydc_gP[sNode] + here->HSMHV_ydyn_gP[sNode] * s->real;
*(here->HSMHVGPsPtr +1) += here->HSMHV_ydyn_gP[sNode] * s->imag;
*(here->HSMHVGPspPtr) += here->HSMHV_ydc_gP[sNodePrime] + here->HSMHV_ydyn_gP[sNodePrime] * s->real;
*(here->HSMHVGPspPtr +1) += here->HSMHV_ydyn_gP[sNodePrime] * s->imag;
*(here->HSMHVGPbpPtr) += here->HSMHV_ydc_gP[bNodePrime] + here->HSMHV_ydyn_gP[bNodePrime] * s->real;
*(here->HSMHVGPbpPtr +1) += here->HSMHV_ydyn_gP[bNodePrime] * s->imag;
if( here->HSMHVtempNode > 0) {
*(here->HSMHVGPtempPtr) += model->HSMHV_type * (here->HSMHV_ydc_gP[tempNode] + here->HSMHV_ydyn_gP[tempNode] * s->real);
*(here->HSMHVGPtempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_gP[tempNode] * s->imag;
}
if (flg_nqs) {
*(here->HSMHVGPqiPtr) += model->HSMHV_type * (here->HSMHV_ydc_gP[qiNode] + here->HSMHV_ydyn_gP[qiNode] * s->real);
*(here->HSMHVGPqiPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_gP[qiNode] * s->imag;
*(here->HSMHVGPqbPtr) += model->HSMHV_type * (here->HSMHV_ydc_gP[qbNode] + here->HSMHV_ydyn_gP[qbNode] * s->real);
*(here->HSMHVGPqbPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_gP[qbNode] * s->imag;
}
/*source*/
*(here->HSMHVSdPtr) += here->HSMHV_ydc_s[dNode] + here->HSMHV_ydyn_s[dNode] * s->real;
*(here->HSMHVSdPtr +1) += here->HSMHV_ydyn_s[dNode] * s->imag;
*(here->HSMHVSgpPtr) += here->HSMHV_ydc_s[gNodePrime] + here->HSMHV_ydyn_s[gNodePrime] * s->real;
*(here->HSMHVSgpPtr +1) += here->HSMHV_ydyn_s[gNodePrime] * s->imag;
*(here->HSMHVSsPtr) += here->HSMHV_ydc_s[sNode] + here->HSMHV_ydyn_s[sNode] * s->real;
*(here->HSMHVSsPtr +1) += here->HSMHV_ydyn_s[sNode] * s->imag;
*(here->HSMHVSspPtr) += here->HSMHV_ydc_s[sNodePrime] + here->HSMHV_ydyn_s[sNodePrime] * s->real;
*(here->HSMHVSspPtr +1) += here->HSMHV_ydyn_s[sNodePrime] * s->imag;
*(here->HSMHVSbpPtr) += here->HSMHV_ydc_s[bNodePrime] + here->HSMHV_ydyn_s[bNodePrime] * s->real;
*(here->HSMHVSbpPtr +1) += here->HSMHV_ydyn_s[bNodePrime] * s->imag;
*(here->HSMHVSsbPtr) += here->HSMHV_ydc_s[sbNode] + here->HSMHV_ydyn_s[sbNode] * s->real;
*(here->HSMHVSsbPtr +1) += here->HSMHV_ydyn_s[sbNode] * s->imag;
if( here->HSMHVtempNode > 0) {
*(here->HSMHVStempPtr) += model->HSMHV_type * (here->HSMHV_ydc_s[tempNode] + here->HSMHV_ydyn_s[tempNode] * s->real);
*(here->HSMHVStempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_s[tempNode] * s->imag;
}
/*source prime*/
*(here->HSMHVSPdPtr) += here->HSMHV_ydc_sP[dNode] + here->HSMHV_ydyn_sP[dNode] * s->real;
*(here->HSMHVSPdPtr +1) += here->HSMHV_ydyn_sP[dNode] * s->imag;
*(here->HSMHVSPdpPtr) += here->HSMHV_ydc_sP[dNodePrime] + here->HSMHV_ydyn_sP[dNodePrime] * s->real;
*(here->HSMHVSPdpPtr +1) += here->HSMHV_ydyn_sP[dNodePrime] * s->imag;
*(here->HSMHVSPgpPtr) += here->HSMHV_ydc_sP[gNodePrime] + here->HSMHV_ydyn_sP[gNodePrime] * s->real;
*(here->HSMHVSPgpPtr +1) += here->HSMHV_ydyn_sP[gNodePrime] * s->imag;
*(here->HSMHVSPsPtr) += here->HSMHV_ydc_sP[sNode] + here->HSMHV_ydyn_sP[sNode] * s->real;
*(here->HSMHVSPsPtr +1) += here->HSMHV_ydyn_sP[sNode] * s->imag;
*(here->HSMHVSPspPtr) += here->HSMHV_ydc_sP[sNodePrime] + here->HSMHV_ydyn_sP[sNodePrime] * s->real;
*(here->HSMHVSPspPtr +1) += here->HSMHV_ydyn_sP[sNodePrime] * s->imag;
*(here->HSMHVSPbpPtr) += here->HSMHV_ydc_sP[bNodePrime] + here->HSMHV_ydyn_sP[bNodePrime] * s->real;
*(here->HSMHVSPbpPtr +1) += here->HSMHV_ydyn_sP[bNodePrime] * s->imag;
if( here->HSMHVtempNode > 0) {
*(here->HSMHVSPtempPtr) += model->HSMHV_type * (here->HSMHV_ydc_sP[tempNode] + here->HSMHV_ydyn_sP[tempNode] * s->real);
*(here->HSMHVSPtempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_sP[tempNode] * s->imag;
}
if (flg_nqs) {
*(here->HSMHVSPqiPtr) += model->HSMHV_type * (here->HSMHV_ydc_sP[qiNode] + here->HSMHV_ydyn_sP[qiNode] * s->real);
*(here->HSMHVSPqiPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_sP[qiNode] * s->imag;
}
/*bulk prime*/
*(here->HSMHVBPdpPtr) += here->HSMHV_ydc_bP[dNodePrime] + here->HSMHV_ydyn_bP[dNodePrime] * s->real;
*(here->HSMHVBPdpPtr +1) += here->HSMHV_ydyn_bP[dNodePrime] * s->imag;
*(here->HSMHVBPgpPtr) += here->HSMHV_ydc_bP[gNodePrime] + here->HSMHV_ydyn_bP[gNodePrime] * s->real;
*(here->HSMHVBPgpPtr +1) += here->HSMHV_ydyn_bP[gNodePrime] * s->imag;
*(here->HSMHVBPspPtr) += here->HSMHV_ydc_bP[sNodePrime] + here->HSMHV_ydyn_bP[sNodePrime] * s->real;
*(here->HSMHVBPspPtr +1) += here->HSMHV_ydyn_bP[sNodePrime] * s->imag;
*(here->HSMHVBPbpPtr) += here->HSMHV_ydc_bP[bNodePrime] + here->HSMHV_ydyn_bP[bNodePrime] * s->real;
*(here->HSMHVBPbpPtr +1) += here->HSMHV_ydyn_bP[bNodePrime] * s->imag;
*(here->HSMHVBPbPtr) += here->HSMHV_ydc_bP[bNode] + here->HSMHV_ydyn_bP[bNode] * s->real;
*(here->HSMHVBPbPtr +1) += here->HSMHV_ydyn_bP[bNode] * s->imag;
*(here->HSMHVBPdbPtr) += here->HSMHV_ydc_bP[dbNode] + here->HSMHV_ydyn_bP[dbNode] * s->real;
*(here->HSMHVBPdbPtr +1) += here->HSMHV_ydyn_bP[dbNode] * s->imag;
*(here->HSMHVBPsbPtr) += here->HSMHV_ydc_bP[sbNode] + here->HSMHV_ydyn_bP[sbNode] * s->real;
*(here->HSMHVBPsbPtr +1) += here->HSMHV_ydyn_bP[sbNode] * s->imag;
if( here->HSMHVtempNode > 0) {
*(here->HSMHVBPtempPtr) += model->HSMHV_type * (here->HSMHV_ydc_bP[tempNode] + here->HSMHV_ydyn_bP[tempNode] * s->real);
*(here->HSMHVBPtempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_bP[tempNode] * s->imag;
}
if (flg_nqs) {
*(here->HSMHVBPqbPtr) += model->HSMHV_type * (here->HSMHV_ydc_bP[qbNode] + here->HSMHV_ydyn_bP[qbNode] * s->real);
*(here->HSMHVBPqbPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_bP[qbNode] * s->imag;
}
/*bulk*/
*(here->HSMHVBbpPtr) += here->HSMHV_ydc_b[bNodePrime] + here->HSMHV_ydyn_b[bNodePrime] * s->real;
*(here->HSMHVBbpPtr +1) += here->HSMHV_ydyn_b[bNodePrime] * s->imag;
*(here->HSMHVBbPtr) += here->HSMHV_ydc_b[bNode] + here->HSMHV_ydyn_b[bNode] * s->real;
*(here->HSMHVBbPtr +1) += here->HSMHV_ydyn_b[bNode] * s->imag;
/*drain bulk*/
*(here->HSMHVDBdPtr) += here->HSMHV_ydc_db[dNode] + here->HSMHV_ydyn_db[dNode] * s->real;
*(here->HSMHVDBdPtr +1) += here->HSMHV_ydyn_db[dNode] * s->imag;
*(here->HSMHVDBbpPtr) += here->HSMHV_ydc_db[bNodePrime] + here->HSMHV_ydyn_db[bNodePrime] * s->real;
*(here->HSMHVDBbpPtr +1) += here->HSMHV_ydyn_db[bNodePrime] * s->imag;
*(here->HSMHVDBdbPtr) += here->HSMHV_ydc_db[dbNode] + here->HSMHV_ydyn_db[dbNode] * s->real;
*(here->HSMHVDBdbPtr +1) += here->HSMHV_ydyn_db[dbNode] * s->imag;
if( here->HSMHVtempNode > 0) {
*(here->HSMHVDBtempPtr) += model->HSMHV_type * (here->HSMHV_ydc_db[tempNode] + here->HSMHV_ydyn_db[tempNode] * s->real);
*(here->HSMHVDBtempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_db[tempNode] * s->imag;
}
/*source bulk*/
*(here->HSMHVSBsPtr) += here->HSMHV_ydc_sb[sNode] + here->HSMHV_ydyn_sb[sNode] * s->real;
*(here->HSMHVSBsPtr +1) += here->HSMHV_ydyn_sb[sNode] * s->imag;
*(here->HSMHVSBbpPtr) += here->HSMHV_ydc_sb[bNodePrime] + here->HSMHV_ydyn_sb[bNodePrime] * s->real;
*(here->HSMHVSBbpPtr +1) += here->HSMHV_ydyn_sb[bNodePrime] * s->imag;
*(here->HSMHVSBsbPtr) += here->HSMHV_ydc_sb[sbNode] + here->HSMHV_ydyn_sb[sbNode] * s->real;
*(here->HSMHVSBsbPtr +1) += here->HSMHV_ydyn_sb[sbNode] * s->imag;
if( here->HSMHVtempNode > 0) {
*(here->HSMHVSBtempPtr) += model->HSMHV_type * (here->HSMHV_ydc_sb[tempNode] + here->HSMHV_ydyn_sb[tempNode] * s->real);
*(here->HSMHVSBtempPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_sb[tempNode] * s->imag;
}
/*temp*/
if( here->HSMHVtempNode > 0) {
*(here->HSMHVTempdPtr) += model->HSMHV_type * (here->HSMHV_ydc_t[dNode] + here->HSMHV_ydyn_t[dNode] * s->real);
*(here->HSMHVTempdPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_t[dNode] * s->imag;
*(here->HSMHVTempdpPtr) += model->HSMHV_type * (here->HSMHV_ydc_t[dNodePrime] + here->HSMHV_ydyn_t[dNodePrime] * s->real);
*(here->HSMHVTempdpPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_t[dNodePrime] * s->imag;
*(here->HSMHVTempgpPtr) += model->HSMHV_type * (here->HSMHV_ydc_t[gNodePrime] + here->HSMHV_ydyn_t[gNodePrime] * s->real);
*(here->HSMHVTempgpPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_t[gNodePrime] * s->imag;
*(here->HSMHVTempsPtr) += model->HSMHV_type * (here->HSMHV_ydc_t[sNode] + here->HSMHV_ydyn_t[sNode] * s->real);
*(here->HSMHVTempsPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_t[sNode] * s->imag;
*(here->HSMHVTempspPtr) += model->HSMHV_type * (here->HSMHV_ydc_t[sNodePrime] + here->HSMHV_ydyn_t[sNodePrime] * s->real);
*(here->HSMHVTempspPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_t[sNodePrime] * s->imag;
*(here->HSMHVTempbpPtr) += model->HSMHV_type * (here->HSMHV_ydc_t[bNodePrime] + here->HSMHV_ydyn_t[bNodePrime] * s->real);
*(here->HSMHVTempbpPtr +1) += model->HSMHV_type * here->HSMHV_ydyn_t[bNodePrime] * s->imag;
*(here->HSMHVTemptempPtr) += here->HSMHV_ydc_t[tempNode] + here->HSMHV_ydyn_t[tempNode] * s->real;
*(here->HSMHVTemptempPtr +1) += here->HSMHV_ydyn_t[tempNode] * s->imag;
}
/* additional entries for flat nqs handling */
if ( flg_nqs ) {
/*qi*/
*(here->HSMHVQIdpPtr) += model->HSMHV_type * (here->HSMHV_ydc_qi[dNodePrime] + here->HSMHV_ydyn_qi[dNodePrime] * s->real);
*(here->HSMHVQIdpPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qi[dNodePrime] * s->imag;
*(here->HSMHVQIgpPtr) += model->HSMHV_type * (here->HSMHV_ydc_qi[gNodePrime] + here->HSMHV_ydyn_qi[gNodePrime] * s->real);
*(here->HSMHVQIgpPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qi[gNodePrime] * s->imag;
*(here->HSMHVQIspPtr) += model->HSMHV_type * (here->HSMHV_ydc_qi[sNodePrime] + here->HSMHV_ydyn_qi[sNodePrime] * s->real);
*(here->HSMHVQIspPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qi[sNodePrime] * s->imag;
*(here->HSMHVQIbpPtr) += model->HSMHV_type * (here->HSMHV_ydc_qi[bNodePrime] + here->HSMHV_ydyn_qi[bNodePrime] * s->real);
*(here->HSMHVQIbpPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qi[bNodePrime] * s->imag;
*(here->HSMHVQIqiPtr) += here->HSMHV_ydc_qi[qiNode] + here->HSMHV_ydyn_qi[qiNode] * s->real;
*(here->HSMHVQIqiPtr+1) += here->HSMHV_ydyn_qi[qiNode] * s->imag;
if ( here->HSMHVtempNode > 0 ) {
*(here->HSMHVQItempPtr) += here->HSMHV_ydc_qi[tempNode] + here->HSMHV_ydyn_qi[tempNode] * s->real;
*(here->HSMHVQItempPtr+1) += here->HSMHV_ydyn_qi[tempNode] * s->imag;
}
/*qb*/
*(here->HSMHVQBdpPtr) += model->HSMHV_type * (here->HSMHV_ydc_qb[dNodePrime] + here->HSMHV_ydyn_qb[dNodePrime] * s->real);
*(here->HSMHVQBdpPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qb[dNodePrime] * s->imag;
*(here->HSMHVQBgpPtr) += model->HSMHV_type * (here->HSMHV_ydc_qb[gNodePrime] + here->HSMHV_ydyn_qb[gNodePrime] * s->real);
*(here->HSMHVQBgpPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qb[gNodePrime] * s->imag;
*(here->HSMHVQBspPtr) += model->HSMHV_type * (here->HSMHV_ydc_qb[sNodePrime] + here->HSMHV_ydyn_qb[sNodePrime] * s->real);
*(here->HSMHVQBspPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qb[sNodePrime] * s->imag;
*(here->HSMHVQBbpPtr) += model->HSMHV_type * (here->HSMHV_ydc_qb[bNodePrime] + here->HSMHV_ydyn_qb[bNodePrime] * s->real);
*(here->HSMHVQBbpPtr+1) += model->HSMHV_type * here->HSMHV_ydyn_qb[bNodePrime] * s->imag;
*(here->HSMHVQBqbPtr) += here->HSMHV_ydc_qb[qbNode] + here->HSMHV_ydyn_qb[qbNode] * s->real;
*(here->HSMHVQBqbPtr+1) += here->HSMHV_ydyn_qb[qbNode] * s->imag;
if ( here->HSMHVtempNode > 0 ) {
*(here->HSMHVQBtempPtr) += here->HSMHV_ydc_qb[tempNode] + here->HSMHV_ydyn_qb[tempNode] * s->real;
*(here->HSMHVQBtempPtr+1) += here->HSMHV_ydyn_qb[tempNode] * s->imag;
}
}
}
}
return(OK);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,419 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvtemp.c
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#include "ngspice.h"
#include <stdio.h>
#include "smpdefs.h"
#include "cktdefs.h"
#include "hsmhvdef.h"
#include "hsmhvevalenv.h"
#include "const.h"
#include "sperror.h"
#include "suffix.h"
#define RANGECHECK(param, min, max, pname) \
if ( (param) < (min) || (param) > (max) ) { \
printf("warning(HiSIMHV): The model/instance parameter %s (= %e) must be in the range [%e , %e].\n", \
(pname), (param), (min), (max) ); \
}
#define Fn_SU( y , x , xmax , delta , dx ) { \
TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
TMF2 = sqrt ( TMF1 * TMF1 + 4.0 * ( xmax ) * ( delta) ) ; \
dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
}
#define Fn_SL( y , x , xmin , delta , dx ) { \
TMF1 = ( x ) - ( xmin ) - ( delta ) ; \
TMF2 = sqrt ( TMF1 * TMF1 + 4.0 * ( xmin ) * ( delta ) ) ; \
dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \
}
#ifdef POW_TO_EXP_AND_LOG
#define Fn_Pow( x , y ) exp( y * log( x ) )
#else
#define Fn_Pow( x , y ) pow( x , y )
#endif
#define C_m2cm (1.0e2)
int HSMHVtemp(
GENmodel *inModel,
CKTcircuit *ckt)
{
register HSMHVmodel *model = (HSMHVmodel *)inModel ;
register HSMHVinstance *here ;
HSMHVbinningParam *pParam ;
HSMHVmodelMKSParam *modelMKS ;
HSMHVhereMKSParam *hereMKS ;
double mueph =0.0 ;
double Leff=0.0, dL =0.0, dLLD=0.0, LG=0.0, Weff=0.0, dW =0.0, dWLD=0.0, dWCV=0.0, WG =0.0, WL =0.0, Lgate =0.0, Wgate =0.0 ;
double Nsubpp=0.0, Nsubps=0.0, Nsub=0.0, q_Nsub=0.0, Nsubb=0.0, Npext =0.0 ;
double Lod_half=0.0, Lod_half_ref =0.0 ;
double T0, T1, T2, T3, T4, T5, T6, T7 ;
/* temperature-dependent variables */
double Eg =0.0, TTEMP0=0.0, TTEMP=0.0, beta=0.0, Nin=0.0 ;
double Tdiff0 = 0.0, Tdiff0_2 = 0.0, Tdiff = 0.0, Tdiff_2 = 0.0 ;
double js=0.0, jssw=0.0, js2=0.0, jssw2 =0.0 ;
int i=0 ;
double TMF1 , TMF2 ;
const double small = 1.0e-50 ;
const double dlt_rd23 = 1.0e-6 / C_m2cm ;
for ( ;model ;model = model->HSMHVnextModel ) {
modelMKS = &model->modelMKS ;
model->HSMHV_vcrit = CONSTvt0 * log( CONSTvt0 / (CONSTroot2 * 1.0e-14) ) ;
/* Quantum Mechanical Effect */
if ( ( model->HSMHV_qme1 == 0.0 && model->HSMHV_qme3 == 0.0 ) || model->HSMHV_qme2 == 0.0 ) {
model->HSMHV_flg_qme = 0 ;
} else {
model->HSMHV_flg_qme = 1 ;
model->HSMHV_qme12 = model->HSMHV_qme1 / ( model->HSMHV_qme2 * model->HSMHV_qme2 ) ;
}
for ( here = model->HSMHVinstances; here; here = here->HSMHVnextInstance ) {
pParam = &here->pParam ;
hereMKS = &here->hereMKS ;
here->HSMHV_lgate = Lgate = here->HSMHV_l + model->HSMHV_xl ;
Wgate = here->HSMHV_w / here->HSMHV_nf + model->HSMHV_xw ;
LG = Lgate * C_m2um ;
here->HSMHV_wg = WG = Wgate * C_m2um ;
WL = WG * LG ;
/* Band gap */
here->HSMHV_egtnom = pParam->HSMHV_eg0 - model->HSMHV_ktnom
* ( 90.25e-6 + model->HSMHV_ktnom * 1.0e-7 ) ;
/* C_EOX */
here->HSMHV_cecox = C_VAC * model->HSMHV_kappa ;
/* Vth reduction for small Vds */
here->HSMHV_msc = model->HSMHV_scp22 ;
/* Poly-Si Gate Depletion */
if ( pParam->HSMHV_pgd1 == 0.0 ) {
here->HSMHV_flg_pgd = 0 ;
} else {
here->HSMHV_flg_pgd = 1 ;
}
/* CLM5 & CLM6 */
here->HSMHV_clmmod = 1e0 + pow( LG , model->HSMHV_clm5 ) * model->HSMHV_clm6 ;
/* Half length of diffusion */
T1 = 1.0 / (model->HSMHV_saref + 0.5 * here->HSMHV_l)
+ 1.0 / (model->HSMHV_sbref + 0.5 * here->HSMHV_l);
Lod_half_ref = 2.0 / T1 ;
if (here->HSMHV_sa > 0.0 && here->HSMHV_sb > 0.0 &&
(here->HSMHV_nf == 1.0 ||
(here->HSMHV_nf > 1.0 && here->HSMHV_sd > 0.0))) {
T1 = 0.0;
for (i = 0; i < here->HSMHV_nf; i++) {
T1 += 1.0 / (here->HSMHV_sa + 0.5 * here->HSMHV_l
+ i * (here->HSMHV_sd + here->HSMHV_l))
+ 1.0 / (here->HSMHV_sb + 0.5 * here->HSMHV_l
+ i * (here->HSMHV_sd + here->HSMHV_l));
}
Lod_half = 2.0 * here->HSMHV_nf / T1;
} else {
Lod_half = 0.0;
}
Npext = pParam->HSMHV_npext ;
/* DFM */
if ( model->HSMHV_codfm == 1 && here->HSMHV_nsubcdfm_Given ) {
RANGECHECK(hereMKS->HSMHV_nsubcdfm, 1.0e16, 1.0e19, "NSUBCDFM") ;
pParam->HSMHV_mueph1 *= model->HSMHV_mphdfm
* ( log(hereMKS->HSMHV_nsubcdfm) - log(pParam->HSMHV_nsubc) ) + 1.0 ;
pParam->HSMHV_nsubp += hereMKS->HSMHV_nsubcdfm - pParam->HSMHV_nsubc ;
Npext += hereMKS->HSMHV_nsubcdfm - pParam->HSMHV_nsubc ;
pParam->HSMHV_nsubc = hereMKS->HSMHV_nsubcdfm ;
}
/* Phonon Scattering (temperature-independent part) */
mueph = pParam->HSMHV_mueph1
* (1.0e0 + (model->HSMHV_muephw / pow( WG, model->HSMHV_muepwp)))
* (1.0e0 + (model->HSMHV_muephl / pow( LG, model->HSMHV_mueplp)))
* (1.0e0 + (model->HSMHV_muephs / pow( WL, model->HSMHV_muepsp)));
if (Lod_half > 0.0) {
T1 = 1.0e0 / (1.0e0 + pParam->HSMHV_muesti2) ;
T2 = pow (pParam->HSMHV_muesti1 / Lod_half, pParam->HSMHV_muesti3) ;
T3 = pow (pParam->HSMHV_muesti1 / Lod_half_ref, pParam->HSMHV_muesti3) ;
here->HSMHV_mueph = mueph * (1.0e0 + T1 * T2) / (1.0e0 + T1 * T3);
} else {
here->HSMHV_mueph = mueph;
}
/* Surface Roughness Scattering */
here->HSMHV_muesr = model->HSMHV_muesr0
* (1.0e0 + (model->HSMHV_muesrl / pow (LG, model->HSMHV_mueslp)))
* (1.0e0 + (model->HSMHV_muesrw / pow (WG, model->HSMHV_mueswp))) ;
/* Coefficients of Qbm for Eeff */
T1 = pow( LG, model->HSMHV_ndeplp ) ;
here->HSMHV_ndep_o_esi = ( pParam->HSMHV_ndep * T1 ) / ( T1 + model->HSMHV_ndepl )
/ C_ESI ;
here->HSMHV_ninv_o_esi = pParam->HSMHV_ninv / C_ESI ;
here->HSMHV_ninvd0 = model->HSMHV_ninvd * ( 1.0 + (model->HSMHV_ninvdw / pow( WG, model->HSMHV_ninvdwp)));
/* Metallurgical channel geometry */
dL = model->HSMHV_xld
+ (modelMKS->HSMHV_ll / pow (Lgate + model->HSMHV_lld, model->HSMHV_lln)) ;
dLLD = model->HSMHV_xldld
+ (modelMKS->HSMHV_ll / pow (Lgate + model->HSMHV_lld, model->HSMHV_lln)) ;
dW = model->HSMHV_xwd
+ (modelMKS->HSMHV_wl / pow (Wgate + model->HSMHV_wld, model->HSMHV_wln)) ;
dWLD = model->HSMHV_xwdld
+ (modelMKS->HSMHV_wl / pow (Wgate + model->HSMHV_wld, model->HSMHV_wln)) ;
dWCV = model->HSMHV_xwdc
+ (modelMKS->HSMHV_wl / pow (Wgate + model->HSMHV_wld, model->HSMHV_wln)) ;
Leff = Lgate - ( dL + dLLD ) ;
if ( Leff <= 0.0 ) {
IFuid namarr[2];
namarr[0] = model->HSMHVmodName;
namarr[1] = here->HSMHVname;
(*(SPfrontEnd->IFerror))
(
ERR_FATAL,
"HiSIM_HV: MOSFET(%s) MODEL(%s): effective channel length is negative or 0",
namarr
);
return (E_BADPARM);
}
here->HSMHV_leff = Leff ;
/* Wg dependence for short channel devices */
here->HSMHV_lgatesm = Lgate + model->HSMHV_wl1 / pow( WL , model->HSMHV_wl1p ) ;
here->HSMHV_dVthsm = pParam->HSMHV_wl2 / pow( WL , model->HSMHV_wl2p ) ;
/* Lg dependence of wsti */
T1 = 1.0e0 + model->HSMHV_wstil / pow( here->HSMHV_lgatesm * C_m2um , model->HSMHV_wstilp ) ;
T2 = 1.0e0 + model->HSMHV_wstiw / pow( WG , model->HSMHV_wstiwp ) ;
here->HSMHV_wsti = pParam->HSMHV_wsti * T1 * T2 ;
here->HSMHV_weff = Weff = Wgate - 2.0e0 * dW ;
here->HSMHV_weff_ld = Wgate - 2.0e0 * dWLD ;
here->HSMHV_weff_cv = Wgate - 2.0e0 * dWCV ;
if ( Weff <= 0.0 ) {
IFuid namarr[2];
namarr[0] = model->HSMHVmodName;
namarr[1] = here->HSMHVname;
(*(SPfrontEnd->IFerror))
(
ERR_FATAL,
"HiSIM_HV: MOSFET(%s) MODEL(%s): effective channel width is negative or 0",
namarr
);
return (E_BADPARM);
}
here->HSMHV_weff_nf = Weff * here->HSMHV_nf ;
here->HSMHV_weffcv_nf = here->HSMHV_weff_cv * here->HSMHV_nf ;
/* Surface impurity profile */
/* Note: Sign Changed --> */
Nsubpp = pParam->HSMHV_nsubp
* (1.0e0 + (model->HSMHV_nsubp0 / pow (WG, model->HSMHV_nsubwp))) ;
/* <-- Note: Sign Changed */
if (Lod_half > 0.0) {
T1 = 1.0e0 / (1.0e0 + pParam->HSMHV_nsubpsti2) ;
T2 = pow (pParam->HSMHV_nsubpsti1 / Lod_half, pParam->HSMHV_nsubpsti3) ;
T3 = pow (pParam->HSMHV_nsubpsti1 / Lod_half_ref, pParam->HSMHV_nsubpsti3) ;
Nsubps = Nsubpp * (1.0e0 + T1 * T2) / (1.0e0 + T1 * T3) ;
} else {
Nsubps = Nsubpp ;
}
pParam->HSMHV_nsubc *= 1.0e0 + ( model->HSMHV_nsubcw / pow ( WG, model->HSMHV_nsubcwp )) ;
if( Lgate > model->HSMHV_lp ){
Nsub = (pParam->HSMHV_nsubc * (Lgate - model->HSMHV_lp)
+ Nsubps * model->HSMHV_lp) / Lgate ;
} else {
Nsub = Nsubps
+ (Nsubps - pParam->HSMHV_nsubc) * (model->HSMHV_lp - Lgate)
/ model->HSMHV_lp ;
}
T3 = 0.5e0 * Lgate - model->HSMHV_lp ;
T1 = 1.0e0 / ( 1.0e0 / T3 + 1.0e0 / model->HSMHV_lpext ) ;
T2 = Fn_Max (0.0e0, T1) ;
here->HSMHV_nsub =
Nsub = Nsub + T2 * (Npext - pParam->HSMHV_nsubc) / Lgate ;
here->HSMHV_qnsub = q_Nsub = C_QE * Nsub ;
here->HSMHV_qnsub_esi = q_Nsub * C_ESI ;
here->HSMHV_2qnsub_esi = 2.0 * here->HSMHV_qnsub_esi ;
/* Pocket Overlap (temperature-independent part) */
if ( Lgate <= 2.0e0 * model->HSMHV_lp ) {
Nsubb = 2.0e0 * Nsubps
- (Nsubps - pParam->HSMHV_nsubc) * Lgate
/ model->HSMHV_lp - pParam->HSMHV_nsubc ;
here->HSMHV_ptovr0 = log (Nsubb / pParam->HSMHV_nsubc) ;
/* here->HSMHV_ptovr0 will be divided by beta later. */
} else {
here->HSMHV_ptovr0 = 0.0e0 ;
}
/* costi0 and costi1 for STI transistor model (temperature-independent part) */
here->HSMHV_costi00 = sqrt (2.0 * C_QE * pParam->HSMHV_nsti * C_ESI ) ;
here->HSMHV_nsti_p2 = 1.0 / ( pParam->HSMHV_nsti * pParam->HSMHV_nsti ) ;
/* Velocity Temperature Dependence (Temperature-dependent part will be multiplied later.) */
here->HSMHV_vmax0 = (1.0e0 + (pParam->HSMHV_vover / pow (LG, model->HSMHV_voverp)))
* (1.0e0 + (model->HSMHV_vovers / pow (WL, model->HSMHV_voversp))) ;
/* 2 phi_B (temperature-independent) */
/* @300K, with pocket */
here->HSMHV_pb20 = 2.0e0 / C_b300 * log (Nsub / C_Nin0) ;
/* @300K, w/o pocket */
here->HSMHV_pb2c = 2.0e0 / C_b300 * log (pParam->HSMHV_nsubc / C_Nin0) ;
/* constant for Poly depletion */
here->HSMHV_cnstpgd = pow ( 1e0 + 1e0 / LG , model->HSMHV_pgd4 )
* pParam->HSMHV_pgd1 ;
/* Gate resistance */
if ( here->HSMHV_corg == 1 ) {
T1 = here->HSMHV_xgw + Weff / (3.0e0 * here->HSMHV_ngcon);
T2 = Lgate - here->HSMHV_xgl;
here->HSMHV_grg = model->HSMHV_rshg * T1 / (here->HSMHV_ngcon * T2 * here->HSMHV_nf);
if (here->HSMHV_grg > 1.0e-3) here->HSMHV_grg = here->HSMHV_m / here->HSMHV_grg;
else {
here->HSMHV_grg = here->HSMHV_m * 1.0e3;
printf("warning(HiSIM_HV): The gate conductance reset to 1.0e3 mho.\n");
}
}
/* Process source/drain series resistamce */
if ( model->HSMHV_rsh > 0.0 ) {
here->HSMHV_rd0 = model->HSMHV_rsh * here->HSMHV_nrd ;
} else {
here->HSMHV_rd0 = 0.0 ;
}
if ( pParam->HSMHV_rd > 0.0 || pParam->HSMHV_rs > 0.0 ) {
here->HSMHV_rdtemp0 = 1.0 + model->HSMHV_rds / pow( here->HSMHV_w * C_m2um * LG , model->HSMHV_rdsp ) ;
if( pParam->HSMHV_rdvd != 0.0 ){
T7 = ( 1.0 + model->HSMHV_rdvds / pow( here->HSMHV_w * C_m2um * LG , model->HSMHV_rdvdsp ) );
T6 = exp( - model->HSMHV_rdvdl * pow( LG , model->HSMHV_rdvdlp ) ) ;
here->HSMHV_rdvdtemp0 = T6 * T7 ;
}
}
if( pParam->HSMHV_rd23 != 0.0 ){
T2 = ( 1.0 + model->HSMHV_rd23s / pow( here->HSMHV_w * C_m2um * LG , model->HSMHV_rd23sp ) );
T1 = exp( - model->HSMHV_rd23l * pow( LG , model->HSMHV_rd23lp ) ) ;
T3 = pParam->HSMHV_rd23 * T2 * T1 ;
here->HSMHV_rd23 = 0.5 * ( T3 + sqrt ( T3 * T3 + 4.0 * dlt_rd23 * dlt_rd23 ) ) ;
} else {
here->HSMHV_rd23 = 0.0 ;
}
if ( model->HSMHV_rsh > 0.0 ) {
here->HSMHV_rs0 = model->HSMHV_rsh * here->HSMHV_nrs ;
} else {
here->HSMHV_rs0 = 0.0 ;
}
/* Body resistance */
if ( here->HSMHV_corbnet == 1 ) {
if (here->HSMHV_rbpb < 1.0e-3) here->HSMHV_grbpb = here->HSMHV_m * 1.0e3 ;
else here->HSMHV_grbpb = here->HSMHV_m * ( model->HSMHV_gbmin + 1.0 / here->HSMHV_rbpb ) ;
if (here->HSMHV_rbps < 1.0e-3) here->HSMHV_grbps = here->HSMHV_m * 1.0e3 ;
else here->HSMHV_grbps = here->HSMHV_m * ( model->HSMHV_gbmin + 1.0 / here->HSMHV_rbps ) ;
if (here->HSMHV_rbpd < 1.0e-3) here->HSMHV_grbpd = here->HSMHV_m * 1.0e3 ;
else here->HSMHV_grbpd = here->HSMHV_m * ( model->HSMHV_gbmin + 1.0 / here->HSMHV_rbpd ) ;
}
/* Vdseff */
T1 = model->HSMHV_ddltslp * LG + model->HSMHV_ddltict ;
if ( T1 < 0.0 ) { T1 = 0.0 ; }
here->HSMHV_ddlt = T1 * model->HSMHV_ddltmax / ( T1 + model->HSMHV_ddltmax ) + 1.0 ;
/* Isub */
T2 = pow( Weff , model->HSMHV_svgswp ) ;
here->HSMHV_vg2const = pParam->HSMHV_svgs
* ( 1.0e0
+ modelMKS->HSMHV_svgsl / pow( here->HSMHV_lgate , model->HSMHV_svgslp ) )
* ( T2 / ( T2 + modelMKS->HSMHV_svgsw ) ) ;
here->HSMHV_xvbs = pParam->HSMHV_svbs
* ( 1.0e0
+ modelMKS->HSMHV_svbsl / pow( here->HSMHV_lgate , model->HSMHV_svbslp ) ) ;
here->HSMHV_xgate = modelMKS->HSMHV_slg
* ( 1.0
+ modelMKS->HSMHV_slgl / pow( here->HSMHV_lgate , model->HSMHV_slglp ) ) ;
here->HSMHV_xsub1 = pParam->HSMHV_sub1
* ( 1.0
+ modelMKS->HSMHV_sub1l / pow( here->HSMHV_lgate , model->HSMHV_sub1lp ) ) ;
here->HSMHV_xsub2 = pParam->HSMHV_sub2
* ( 1.0 + modelMKS->HSMHV_sub2l / here->HSMHV_lgate ) ;
/* Fringing capacitance */
here->HSMHV_cfrng = C_EOX / ( C_Pi / 2.0e0 ) * here->HSMHV_weff_nf
* log( 1.0e0 + model->HSMHV_tpoly / model->HSMHV_tox ) ;
/* Additional term of lateral-field-induced capacitance */
here->HSMHV_cqyb0 = C_m2um * here->HSMHV_weff_nf
* model->HSMHV_xqy1 / pow( LG , model->HSMHV_xqy2 ) ;
/* Self heating */
pParam->HSMHV_rth = pParam->HSMHV_rth0 / ( here->HSMHV_m * here->HSMHV_weff_nf )
* ( 1.0 + model->HSMHV_rth0w / pow( here->HSMHV_w * C_m2um , model->HSMHV_rth0wp ) );
pParam->HSMHV_cth = modelMKS->HSMHV_cth0 * ( here->HSMHV_m * here->HSMHV_weff_nf ) ;
pParam->HSMHV_rth *= ( 1.0 / pow( here->HSMHV_nf , model->HSMHV_rth0nf ) ) ;
here->HSMHV_rthtemp0 = 1.0 / pow( here->HSMHV_nf , model->HSMHV_rth0nf ) / ( here->HSMHV_m * here->HSMHV_weff_nf )
* ( 1.0 + model->HSMHV_rth0w / pow( here->HSMHV_w * C_m2um , model->HSMHV_rth0wp ) );
/*-----------------------------------------------------------*
* Temperature dependent constants.
*-----------------*/
if ( here->HSMHVtempNode < 0 || pParam->HSMHV_rth0 == 0.0 ) {
#include "hsmhvtemp_eval.h"
} /* end of if ( here->HSMHVtempNode < 0 || pParam->HSMHV_rth0 == 0.0 ) */
}
}
return(OK);
}

View File

@ -0,0 +1,382 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvtemp_eval.h
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#define C_rdtemp_min 5.0e-3
#define C_rdtemp_dlt 1.0e-2
TTEMP = ckt->CKTtemp;
if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; }
TTEMP0 = TTEMP ;
#ifdef HSMHVEVAL
/* Self heating */
TTEMP = TTEMP + deltemp ;
#endif
Tdiff0 = TTEMP0 - model->HSMHV_ktnom ;
Tdiff0_2 = TTEMP0 * TTEMP0 - model->HSMHV_ktnom * model->HSMHV_ktnom ;
Tdiff = TTEMP - model->HSMHV_ktnom ;
Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ;
/* Band gap */
T1 = TTEMP - model->HSMHV_ktnom ;
T2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ;
here->HSMHV_eg = Eg = here->HSMHV_egtnom - pParam->HSMHV_bgtmp1 * T1
- pParam->HSMHV_bgtmp2 * T2 ;
here->HSMHV_sqrt_eg = sqrt( Eg ) ;
#ifdef HSMHVEVAL
Eg_dT = -pParam->HSMHV_bgtmp1 - 2.0e0 * TTEMP * pParam->HSMHV_bgtmp2 ;
#endif
T1 = 1.0 / TTEMP ;
T2 = 1.0 / model->HSMHV_ktnom ;
T3 = here->HSMHV_egtnom + model->HSMHV_egig
+ model->HSMHV_igtemp2 * ( T1 - T2 )
+ model->HSMHV_igtemp3 * ( T1 * T1 - T2 * T2 ) ;
here->HSMHV_egp12 = sqrt ( T3 ) ;
here->HSMHV_egp32 = T3 * here->HSMHV_egp12 ;
/* Inverse of the thermal voltage */
here->HSMHV_beta = beta = C_QE / (C_KB * TTEMP) ;
here->HSMHV_beta_inv = 1.0 / beta ;
here->HSMHV_beta2 = beta * beta ;
here->HSMHV_betatnom = C_QE / (C_KB * model->HSMHV_ktnom) ;
#ifdef HSMHVEVAL
beta_dT=-C_QE/(C_KB*TTEMP*TTEMP);
beta_inv_dT = C_KB / C_QE ;
#endif
/* Intrinsic carrier concentration */
here->HSMHV_nin = Nin = C_Nin0 * Fn_Pow (TTEMP / model->HSMHV_ktnom, 1.5e0)
* exp (- Eg / 2.0e0 * beta + here->HSMHV_egtnom / 2.0e0 * here->HSMHV_betatnom) ;
#ifdef HSMHVEVAL
Nin_dT = C_Nin0 * exp (- Eg / 2.0e0 * beta + here->HSMHV_egtnom / 2.0e0 * here->HSMHV_betatnom)
* 1.5e0 * Fn_Pow ( TTEMP / model->HSMHV_ktnom , 0.5e0 ) / model->HSMHV_ktnom
+ C_Nin0 * Fn_Pow (TTEMP / model->HSMHV_ktnom, 1.5e0)
* exp (- Eg / 2.0e0 * beta + here->HSMHV_egtnom / 2.0e0 * here->HSMHV_betatnom)
* ( - Eg / 2.0e0 * beta_dT - beta / 2.0e0 * Eg_dT );
#endif
/* Phonon Scattering (temperature-dependent part) */
T1 = Fn_Pow (TTEMP / model->HSMHV_ktnom, pParam->HSMHV_muetmp) ;
here->HSMHV_mphn0 = T1 / here->HSMHV_mueph ;
here->HSMHV_mphn1 = here->HSMHV_mphn0 * model->HSMHV_mueph0 ;
#ifdef HSMHVEVAL
T1_dT = pParam->HSMHV_muetmp * Fn_Pow(TTEMP / model->HSMHV_ktnom, pParam->HSMHV_muetmp - 1.0 )
/ model->HSMHV_ktnom ;
mphn0_dT = T1_dT / here->HSMHV_mueph ;
#endif
/* Pocket Overlap (temperature-dependent part) */
here->HSMHV_ptovr = here->HSMHV_ptovr0 / beta ;
#ifdef HSMHVEVAL
ptovr_dT = here->HSMHV_ptovr0 * beta_inv_dT ;
#endif
/* Velocity Temperature Dependence */
T1 = TTEMP / model->HSMHV_ktnom ;
T3 = TTEMP0 - model->HSMHV_ktnom ;
T4 = TTEMP0 * TTEMP0 - model->HSMHV_ktnom * model->HSMHV_ktnom ;
T0 = 1.8 + 0.4 * T1 + 0.1 * T1 * T1 - pParam->HSMHV_vtmp * (1.0 - T1) ;
if ( model->HSMHV_cotemp != 2 ) { /* without deltemp (COTEMP=0,1,3) */
here->HSMHV_vmax = here->HSMHV_vmax0 * pParam->HSMHV_vmax
/ T0
* ( 1.0 + model->HSMHV_vmaxt1 * T3 + model->HSMHV_vmaxt2 * T4 ) ;
#ifdef HSMHVEVAL
Vmax_dT=-here->HSMHV_vmax0 * pParam->HSMHV_vmax
/ ( T0 * T0 ) * ( 1.0 + model->HSMHV_vmaxt1 * T3 + model->HSMHV_vmaxt2 * T4 )
* 1/model->HSMHV_ktnom * (0.4 + 0.2 * T1 + pParam->HSMHV_vtmp) ;
#endif
} else { /* with deltemp (COTEMP=2) */
here->HSMHV_vmax = here->HSMHV_vmax0 * pParam->HSMHV_vmax
/ T0
* ( 1.0 + model->HSMHV_vmaxt1 * Tdiff + model->HSMHV_vmaxt2 * Tdiff_2 ) ;
#ifdef HSMHVEVAL
/* under development */
Vmax_dT = here->HSMHV_vmax0 * pParam->HSMHV_vmax
/ ( T0 * T0 )
* ( ( model->HSMHV_vmaxt1 + 2.0 * TTEMP * model->HSMHV_vmaxt2 ) * T0
- ( 1.0 + model->HSMHV_vmaxt1 * Tdiff + model->HSMHV_vmaxt2 * Tdiff_2 )
* 1/model->HSMHV_ktnom * (0.4 + 0.2 * T1 + pParam->HSMHV_vtmp) ) ;
#endif
}
if ( model->HSMHV_cotemp != 2 ) { /* without deltemp (COTEMP=0,1,3) */
here->HSMHV_ninvd = here->HSMHV_ninvd0 * ( 1.0 + model->HSMHV_ninvdt1 * T3 + model->HSMHV_ninvdt2 * T4 ) ;
#ifdef HSMHVEVAL
ninvd_dT = 0.0 ;
#endif
} else { /* with deltemp (COTEMP=2) */
/* under development */
here->HSMHV_ninvd = here->HSMHV_ninvd0 * ( 1.0 + model->HSMHV_ninvdt1 * Tdiff + model->HSMHV_ninvdt2 * Tdiff_2 ) ;
#ifdef HSMHVEVAL
ninvd_dT = here->HSMHV_ninvd0 * ( model->HSMHV_ninvdt1 + 2.0 * TTEMP * model->HSMHV_ninvdt2 ) ;
#endif
}
/* Temperature Dependence of RTH0 */
pParam->HSMHV_rth = ( pParam->HSMHV_rth0 + model->HSMHV_rthtemp1 * T3 + model->HSMHV_rthtemp2 * T4 ) * here->HSMHV_rthtemp0 ;
/* Temperature Dependence of POWRAT */
T2 = pParam->HSMHV_powrat + model->HSMHV_prattemp1 * T3 + model->HSMHV_prattemp2 * T4 ;
Fn_SL( T2 , T2 , 0 , 0.05 , T0 );
Fn_SU( here->HSMHV_powratio , T2 , 1 , 0.05 , T0 );
/* 2 phi_B (temperature-dependent) */
/* @temp, with pocket */
here->HSMHV_pb2 = 2.0e0 / beta * log (here->HSMHV_nsub / Nin) ;
#ifdef HSMHVEVAL
Pb2_dT = - (here->HSMHV_pb2 * beta_dT + 2.0e0 / Nin * Nin_dT ) / beta ;
#endif
/* Depletion Width */
T1 = 2.0e0 * C_ESI / C_QE ;
here->HSMHV_wdpl = sqrt ( T1 / here->HSMHV_nsub ) ;
here->HSMHV_wdplp = sqrt( T1 / ( pParam->HSMHV_nsubp ) ) ;
/* Coefficient of the F function for bulk charge */
here->HSMHV_cnst0 = sqrt ( 2.0 * C_ESI * C_QE * here->HSMHV_nsub / beta ) ;
/* cnst1: n_{p0} / p_{p0} */
T1 = Nin / here->HSMHV_nsub ;
here->HSMHV_cnst1 = T1 * T1 ;
#ifdef HSMHVEVAL
cnst0_dT = 0.5e0 / here->HSMHV_cnst0 * 2.0 * C_ESI * C_QE * here->HSMHV_nsub * beta_inv_dT ;
cnst1_dT = 2.0e0 * Nin * Nin_dT / here->HSMHV_nsub / here->HSMHV_nsub ;
#endif
if ( pParam->HSMHV_nover != 0.0 ) {
here->HSMHV_cnst0over = here->HSMHV_cnst0 * sqrt( pParam->HSMHV_nover / here->HSMHV_nsub ) ;
#ifdef HSMHVEVAL
cnst0over_dT = cnst0_dT * sqrt( pParam->HSMHV_nover / here->HSMHV_nsub ) ;
#endif
/* ps0ldinib : Ps0_iniB for Ps0LD */
T1 = here->HSMHV_cnst0over * model->HSMHV_tox / here->HSMHV_cecox ;
T2 = pParam->HSMHV_nover / Nin ;
here->HSMHV_ps0ldinib = T2 * T2 / ( T1 * T1 );
#ifdef HSMHVEVAL
T1_dT = cnst0over_dT * model->HSMHV_tox / here->HSMHV_cecox ;
T2_dT = - Nin_dT * T2 / Nin;
ps0ldinib_dT = 2.0 * here->HSMHV_ps0ldinib * ( T2_dT * T1 - T2 * T1_dT ) / ( T1 * T2 );
#endif
}
if ( pParam->HSMHV_novers != 0.0 ) {
here->HSMHV_cnst0overs = here->HSMHV_cnst0 * sqrt( pParam->HSMHV_novers / here->HSMHV_nsub ) ;
#ifdef HSMHVEVAL
cnst0overs_dT = cnst0_dT * sqrt( pParam->HSMHV_novers / here->HSMHV_nsub ) ;
#endif
/* ps0ldinib : Ps0_iniB for Ps0LD */
T1 = here->HSMHV_cnst0overs * model->HSMHV_tox / here->HSMHV_cecox ;
T2 = pParam->HSMHV_novers / Nin ;
here->HSMHV_ps0ldinibs = T2 * T2 / ( T1 * T1 );
#ifdef HSMHVEVAL
T1_dT = cnst0overs_dT * model->HSMHV_tox / here->HSMHV_cecox ;
T2_dT = - Nin_dT * T2 / Nin;
ps0ldinibs_dT = 2.0 * here->HSMHV_ps0ldinibs * ( T2_dT * T1 - T2 * T1_dT ) / ( T1 * T2 );
#endif
}
/* temperature-dependent resistance model */
T3 = model->HSMHV_ktnom ;
T1 = TTEMP0 - T3 ;
T4 = TTEMP0 * TTEMP0 - T3 * T3 ;
/* drain side */
if ( pParam->HSMHV_rd > 0.0 ) {
T2 = here->HSMHV_rdtemp0
* ( here->HSMHV_ldrift1 * pParam->HSMHV_rdslp1 * C_m2um + pParam->HSMHV_rdict1 )
* ( here->HSMHV_ldrift2 * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ;
if ( model->HSMHV_cotemp == 1 ) { /* without deltemp (COTEMP=1) */
here->HSMHV_rd = ( pParam->HSMHV_rd + T1 * modelMKS->HSMHV_rdtemp1 + modelMKS->HSMHV_rdtemp2 * T4 ) * T2 ;
Fn_SL( here->HSMHV_rd, here->HSMHV_rd, C_rdtemp_min * pParam->HSMHV_rd, C_rdtemp_dlt * pParam->HSMHV_rd, T0 );
#ifdef HSMHVEVAL
Rd0_dT = 0.0 ;
#endif
} else { /* with deltemp (COTEMP=0,2,3) */
here->HSMHV_rd = ( pParam->HSMHV_rd + modelMKS->HSMHV_rdtemp1 * Tdiff + modelMKS->HSMHV_rdtemp2 * Tdiff_2 ) * T2 ;
Fn_SL( here->HSMHV_rd, here->HSMHV_rd, C_rdtemp_min * pParam->HSMHV_rd, C_rdtemp_dlt * pParam->HSMHV_rd, T0 );
#ifdef HSMHVEVAL
Rd0_dT = ( modelMKS->HSMHV_rdtemp1 + 2.0 * TTEMP * modelMKS->HSMHV_rdtemp2 ) * T2 * T0 ;
#endif
}
} else {
here->HSMHV_rd = 0.0 ;
}
/* source side (asymmetric case) */
if ( pParam->HSMHV_rs > 0.0 ) {
T2 = here->HSMHV_rdtemp0
* ( here->HSMHV_ldrift1s * pParam->HSMHV_rdslp1 * C_m2um + pParam->HSMHV_rdict1 )
* ( here->HSMHV_ldrift2s * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ;
if ( model->HSMHV_cotemp == 1 ) { /* without deltemp (COTEMP=1) */
here->HSMHV_rs = ( pParam->HSMHV_rs + T1 * modelMKS->HSMHV_rdtemp1 + modelMKS->HSMHV_rdtemp2 * T4 ) * T2 ;
Fn_SL( here->HSMHV_rs, here->HSMHV_rs, C_rdtemp_min * pParam->HSMHV_rs, C_rdtemp_dlt * pParam->HSMHV_rs, T0 );
#ifdef HSMHVEVAL
Rs0_dT = 0.0 ;
#endif
} else { /* with deltemp (COTEMP=0,2,3) */
here->HSMHV_rs = ( pParam->HSMHV_rs + modelMKS->HSMHV_rdtemp1 * Tdiff + modelMKS->HSMHV_rdtemp2 * Tdiff_2 ) * T2 ;
Fn_SL( here->HSMHV_rs, here->HSMHV_rs, C_rdtemp_min * pParam->HSMHV_rs, C_rdtemp_dlt * pParam->HSMHV_rs, T0 );
#ifdef HSMHVEVAL
Rs0_dT = ( modelMKS->HSMHV_rdtemp1 + 2.0 * TTEMP * modelMKS->HSMHV_rdtemp2 ) * T2 * T0 ;
#endif
}
} else {
here->HSMHV_rs = 0.0 ;
}
if ( pParam->HSMHV_rdvd > 0.0 ) {
T4 = here->HSMHV_rdvdtemp0 * ( here->HSMHV_ldrift1 * pParam->HSMHV_rdslp1 * C_m2um + pParam->HSMHV_rdict1 )
* ( here->HSMHV_ldrift2 * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ;
T1 = ( 1 - pParam->HSMHV_rdov13 ) * here->HSMHV_loverld * C_m2um ;
T0 = - model->HSMHV_rdov11 / ( model->HSMHV_rdov12 + small ) ;
T3 = ( T0 * here->HSMHV_loverld * C_m2um + 1.0 + model->HSMHV_rdov11 ) ;
Fn_SL( T5 , T3 * T4 , T4 , 10.0e-3 , T6 ) ;
Fn_SU( T7 , T5 , T4 * ( model->HSMHV_rdov11 + 1.0) , 50.0e-6 , T6 ) ;
Fn_SL( T2 , T7 + T1 * T4 , 0, 50.0e-6 , T6 ) ;
T3 = model->HSMHV_ktnom ;
T1 = TTEMP0 - T3 ;
if ( model->HSMHV_cotemp == 0 || model->HSMHV_cotemp == 1 ) { /* without deltemp (COTEMP=0,1) */
here->HSMHV_rdvd = ( pParam->HSMHV_rdvd + T1 * modelMKS->HSMHV_rdvdtemp1 + modelMKS->HSMHV_rdvdtemp2 * ( TTEMP0 * TTEMP0 - T3 * T3 ) ) * T2 ;
Fn_SL( here->HSMHV_rdvd, here->HSMHV_rdvd, C_rdtemp_min * pParam->HSMHV_rdvd, C_rdtemp_dlt * pParam->HSMHV_rdvd, T0 );
#ifdef HSMHVEVAL
Rdvd_dT = 0.0 ;
#endif
} else { /* with deltemp (COTEMP=2,3) */
here->HSMHV_rdvd = ( pParam->HSMHV_rdvd + modelMKS->HSMHV_rdvdtemp1 * Tdiff + modelMKS->HSMHV_rdvdtemp2 * Tdiff_2 ) * T2 ;
Fn_SL( here->HSMHV_rdvd, here->HSMHV_rdvd, C_rdtemp_min * pParam->HSMHV_rdvd, C_rdtemp_dlt * pParam->HSMHV_rdvd, T0 );
#ifdef HSMHVEVAL
Rdvd_dT = ( modelMKS->HSMHV_rdvdtemp1 + 2.0 * TTEMP * modelMKS->HSMHV_rdvdtemp2 ) * T2 * T0 ;
#endif
}
T4 = here->HSMHV_rdvdtemp0 * ( here->HSMHV_ldrift1s * pParam->HSMHV_rdslp1 * C_m2um + pParam->HSMHV_rdict1 )
* ( here->HSMHV_ldrift2s * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ;
T1 = ( 1 - pParam->HSMHV_rdov13 ) * here->HSMHV_lovers * C_m2um ;
T0 = - model->HSMHV_rdov11 / ( model->HSMHV_rdov12 + small ) ;
T3 = ( T0 * here->HSMHV_lovers * C_m2um + 1.0 + model->HSMHV_rdov11 ) ;
Fn_SL( T5 , T3 * T4 , T4 , 10.0e-3 , T6 ) ;
Fn_SU( T7 , T5 , T4 * ( model->HSMHV_rdov11 + 1.0) , 50.0e-6 , T6 ) ;
Fn_SL( T2 , T7 + T1 * T4 , 0, 50.0e-6 , T6 ) ;
T3 = model->HSMHV_ktnom ;
T1 = TTEMP0 - T3 ;
if ( model->HSMHV_cotemp == 0 || model->HSMHV_cotemp == 1 ) { /* without deltemp (COTEMP=0,1) */
here->HSMHV_rsvd = ( pParam->HSMHV_rdvd + T1 * modelMKS->HSMHV_rdvdtemp1 + modelMKS->HSMHV_rdvdtemp2 * ( TTEMP0 * TTEMP0 - T3 * T3 ) ) * T2 ;
Fn_SL( here->HSMHV_rsvd, here->HSMHV_rsvd, C_rdtemp_min * pParam->HSMHV_rdvd, C_rdtemp_dlt * pParam->HSMHV_rdvd, T0 );
#ifdef HSMHVEVAL
Rsvd_dT = 0.0 ;
#endif
} else { /* with deltemp (COTEMP=2,3) */
here->HSMHV_rsvd = ( pParam->HSMHV_rdvd + modelMKS->HSMHV_rdvdtemp1 * Tdiff + modelMKS->HSMHV_rdvdtemp2 * Tdiff_2 ) * T2 ;
Fn_SL( here->HSMHV_rsvd, here->HSMHV_rsvd, C_rdtemp_min * pParam->HSMHV_rdvd, C_rdtemp_dlt * pParam->HSMHV_rdvd, T0 );
#ifdef HSMHVEVAL
Rsvd_dT = ( modelMKS->HSMHV_rdvdtemp1 + 2.0 * TTEMP * modelMKS->HSMHV_rdvdtemp2 ) * T2 * T0 ;
#endif
}
} else {
here->HSMHV_rdvd = 0.0 ;
here->HSMHV_rsvd = 0.0 ;
}
/* for substrate-source/drain junction diode. */
js = pParam->HSMHV_js0
* exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta
+ model->HSMHV_xti * log (TTEMP / model->HSMHV_ktnom)) / pParam->HSMHV_nj) ;
jssw = pParam->HSMHV_js0sw
* exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta
+ model->HSMHV_xti * log (TTEMP / model->HSMHV_ktnom)) / model->HSMHV_njsw) ;
js2 = pParam->HSMHV_js0
* exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta
+ model->HSMHV_xti2 * log (TTEMP / model->HSMHV_ktnom)) / pParam->HSMHV_nj) ;
jssw2 = pParam->HSMHV_js0sw
* exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta
+ model->HSMHV_xti2 * log (TTEMP / model->HSMHV_ktnom)) / model->HSMHV_njsw) ;
#ifdef HSMHVEVAL
T0 = - Eg * beta_dT - Eg_dT * beta ; /* Self heating */
T1 = T0 + model->HSMHV_xti / TTEMP ; /* Self heating */
T2 = T0 + model->HSMHV_xti2 / TTEMP ; /* Self heating */
js_dT = js * T1 / pParam->HSMHV_nj; /* Self heating */
jssw_dT = jssw * T1/ model->HSMHV_njsw ; /* Self heating */
js2_dT = js2 * T2 / pParam->HSMHV_nj; /* Self heating */
jssw2_dT = jssw2 * T2 / model->HSMHV_njsw; /* Self heating */
#endif
here->HSMHV_isbd = here->HSMHV_ad * js + here->HSMHV_pd * jssw ;
here->HSMHV_isbd2 = here->HSMHV_ad * js2 + here->HSMHV_pd * jssw2 ;
here->HSMHV_isbs = here->HSMHV_as * js + here->HSMHV_ps * jssw ;
here->HSMHV_isbs2 = here->HSMHV_as * js2 + here->HSMHV_ps * jssw2 ;
#ifdef HSMHVEVAL
isbd_dT = here->HSMHV_ad * js_dT + here->HSMHV_pd * jssw_dT ; /* Self heating */
isbd2_dT = here->HSMHV_ad * js2_dT + here->HSMHV_pd * jssw2_dT ; /* Self heating */
isbs_dT = here->HSMHV_as * js_dT + here->HSMHV_ps * jssw_dT ; /* Self heating */
isbs2_dT = here->HSMHV_as * js2_dT + here->HSMHV_ps * jssw2_dT ; /* Self heating */
#endif
T1 = TTEMP / model->HSMHV_ktnom ;
T0 = T1 * T1 ;
T2 = here->HSMHV_isbd + small ;
T3 = here->HSMHV_isbs + small ;
#ifdef HSMHVEVAL
T1_dT = 1.0 / model->HSMHV_ktnom ; /* Self heating */
T0_dT = 2.0 * T1 * T1_dT ; /* Self heating */
T2_dT = isbd_dT ; /* Self heating */
T3_dT = isbs_dT ; /* Self heating */
#endif
here->HSMHV_vbdt = pParam->HSMHV_nj / beta
* log ( pParam->HSMHV_vdiffj * T0 / T2 + 1.0 ) ;
here->HSMHV_vbst = pParam->HSMHV_nj / beta
* log ( pParam->HSMHV_vdiffj * T0 / T3 + 1.0 ) ;
here->HSMHV_exptemp = exp (( T1 - 1.0 ) * model->HSMHV_ctemp ) ;
#ifdef HSMHVEVAL
vbdt_dT = - beta_dT / beta * here->HSMHV_vbdt
+ pParam->HSMHV_nj / beta * pParam->HSMHV_vdiffj / ( pParam->HSMHV_vdiffj * T0 / T2 + 1.0 )
* ( T0_dT / T2 - T0 / T2 / T2 * T2_dT ) ; /* Self heating */
vbst_dT = - beta_dT / beta * here->HSMHV_vbst
+ pParam->HSMHV_nj / beta * pParam->HSMHV_vdiffj / ( pParam->HSMHV_vdiffj * T0 / T3 + 1.0 )
* ( T0_dT / T3 - T0 / T3 / T3 * T3_dT ) ; /* Self heating */
#endif
here->HSMHV_jd_nvtm_inv = 1.0 / ( pParam->HSMHV_nj / beta ) ;
here->HSMHV_jd_expcd = exp (here->HSMHV_vbdt * here->HSMHV_jd_nvtm_inv ) ;
here->HSMHV_jd_expcs = exp (here->HSMHV_vbst * here->HSMHV_jd_nvtm_inv ) ;
#ifdef HSMHVEVAL
exptemp_dT = model->HSMHV_ctemp / model->HSMHV_ktnom * here->HSMHV_exptemp ; /* Self heating */
jd_nvtm_inv_dT = beta_dT / pParam->HSMHV_nj ; /* Self heating */
jd_expcd_dT = here->HSMHV_jd_expcd
* ( vbdt_dT * here->HSMHV_jd_nvtm_inv + here->HSMHV_vbdt * jd_nvtm_inv_dT ) ; /* Self heating */
jd_expcs_dT = here->HSMHV_jd_expcs
* ( vbst_dT * here->HSMHV_jd_nvtm_inv + here->HSMHV_vbst * jd_nvtm_inv_dT ) ; /* Self heating */
#endif
/* costi0 and costi1 for STI transistor model (temperature-dependent part) */
here->HSMHV_costi0 = here->HSMHV_costi00 * sqrt(here->HSMHV_beta_inv) ;
here->HSMHV_costi0_p2 = here->HSMHV_costi0 * here->HSMHV_costi0 ;
here->HSMHV_costi1 = here->HSMHV_nin * here->HSMHV_nin * here->HSMHV_nsti_p2 ;
/* end of HSMHVtemp_eval.h */

View File

@ -0,0 +1,61 @@
/***********************************************************************
HiSIM (Hiroshima University STARC IGFET Model)
Copyright (C) 2010 Hiroshima University & STARC
MODEL NAME : HiSIM_HV
( VERSION : 1 SUBVERSION : 2 REVISION : 1 )
Model Parameter VERSION : 1.21
FILE : hsmhvtrunc.c
DATE : 2010.11.02
released by
Hiroshima University &
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "hsmhvdef.h"
#include "sperror.h"
#include "suffix.h"
int HSMHVtrunc(
GENmodel *inModel,
register CKTcircuit *ckt,
double *timeStep)
{
register HSMHVmodel *model = (HSMHVmodel*)inModel;
register HSMHVinstance *here;
#ifdef STEPDEBUG
double debugtemp=0.0 ;
#endif /* STEPDEBUG */
for ( ;model != NULL ;model = model->HSMHVnextModel ) {
for ( here=model->HSMHVinstances ;here!=NULL ;
here = here->HSMHVnextInstance ) {
#ifdef STEPDEBUG
debugtemp = *timeStep;
#endif /* STEPDEBUG */
CKTterr(here->HSMHVqb,ckt,timeStep);
CKTterr(here->HSMHVqg,ckt,timeStep);
CKTterr(here->HSMHVqd,ckt,timeStep);
CKTterr(here->HSMHVqbs,ckt,timeStep);
CKTterr(here->HSMHVqbd,ckt,timeStep);
CKTterr(here->HSMHVqfd,ckt,timeStep);
CKTterr(here->HSMHVqfs,ckt,timeStep);
#ifdef STEPDEBUG
if ( debugtemp != *timeStep )
printf("device %s reduces step from %g to %g\n",
here->HSMHVname, debugtemp, *timeStep);
#endif /* STEPDEBUG */
}
}
return(OK);
}

View File

@ -22,41 +22,41 @@ INP2M (CKTcircuit *ckt, INPtables * tab, card * current)
* [IC=<val>,<val>,<val>]
*/
int type; /* the type the model says it is */
char *line; /* the part of the current line left to parse */
char *name; /* the resistor's name */
char *nname1; /* the first node's name */
char *nname2; /* the second node's name */
char *nname3; /* the third node's name */
char *nname4; /* the fourth node's name */
char *nname5; /* the fifth node's name */
char *nname6; /* the sixt node's name */
char *nname7; /* the seventh node's name */
char *save; /* saj - used to save the posn of the start of
the parameters if the model is a mosfet*/
CKTnode *node1; /* the first node's node pointer */
CKTnode *node2; /* the second node's node pointer */
CKTnode *node3; /* the third node's node pointer */
CKTnode *node4; /* the fourth node's node pointer */
CKTnode *node5; /* the fifth node's node pointer */
CKTnode *node6; /* the sixth node's node pointer */
CKTnode *node7; /* the seventh node's node pointer */
int error; /* error code temporary */
int nodeflag; /* flag indicating 4 or 5 (or 6 or 7) nodes */
GENinstance *fast; /* pointer to the actual instance */
int waslead; /* flag to indicate that funny unlabeled number was found */
double leadval; /* actual value of unlabeled number */
char *model; /* the name of the model */
INPmodel *thismodel; /* pointer to model description for user's model */
GENmodel *mdfast; /* pointer to the actual model */
IFuid uid; /* uid for default model */
int type; /* the type the model says it is */
char *line; /* the part of the current line left to parse */
char *name; /* the resistor's name */
char *nname1; /* the first node's name */
char *nname2; /* the second node's name */
char *nname3; /* the third node's name */
char *nname4; /* the fourth node's name */
char *nname5; /* the fifth node's name */
char *nname6; /* the sixt node's name */
char *nname7; /* the seventh node's name */
char *save; /* saj - used to save the posn of the start of
the parameters if the model is a mosfet*/
CKTnode *node1; /* the first node's node pointer */
CKTnode *node2; /* the second node's node pointer */
CKTnode *node3; /* the third node's node pointer */
CKTnode *node4; /* the fourth node's node pointer */
CKTnode *node5; /* the fifth node's node pointer */
CKTnode *node6; /* the sixth node's node pointer */
CKTnode *node7; /* the seventh node's node pointer */
int error; /* error code temporary */
int nodeflag; /* flag indicating 4 or 5 (or 6 or 7) nodes */
GENinstance *fast; /* pointer to the actual instance */
int waslead; /* flag to indicate that funny unlabeled number was found */
double leadval; /* actual value of unlabeled number */
char *model; /* the name of the model */
INPmodel *thismodel; /* pointer to model description for user's model */
GENmodel *mdfast; /* pointer to the actual model */
IFuid uid; /* uid for default model */
char* err_msg;
#ifdef TRACE
printf("INP2M: Parsing '%s'\n",current->line);
#endif
nodeflag = 0; /* initially specify a 4 terminal device */
nodeflag = 0; /* initially specify a 4 terminal device */
line = current->line;
INPgetTok (&line, &name, 1);
INPinsert (&name, tab);
@ -71,9 +71,9 @@ INP2M (CKTcircuit *ckt, INPtables * tab, card * current)
/* See if 5th token after device specification is a model name */
INPgetNetTok (&line, &nname5, 1); /* get 5th token */
save = line; /*saj - save the posn for later if
the default mosfet model is used */
INPgetNetTok (&line, &nname5, 1); /* get 5th token */
save = line; /* saj - save the posn for later if
the default mosfet model is used */
thismodel = NULL;
#ifdef TRACE
printf("INP2M: checking for 4 node device\n");
@ -86,106 +86,107 @@ INP2M (CKTcircuit *ckt, INPtables * tab, card * current)
}
if (thismodel == NULL)
{ /* 5th token is not a model in the table */
nodeflag = 1; /* now specify a 5 node device */
INPgetNetTok (&line, &nname6, 1); /* get next token */
{ /* 5th token is not a model in the table */
nodeflag = 1; /* now specify a 5 node device */
INPgetNetTok (&line, &nname6, 1); /* get next token */
thismodel = NULL;
#ifdef TRACE
printf("INP2M: checking for 5 node device\n");
#endif
INPgetMod (ckt, nname6, &thismodel, tab);
if (thismodel == NULL)
{ /* 6th token is not a model in the table */
nodeflag = 2; /* now specify a 6 node device */
INPgetNetTok (&line, &nname7, 1); /* get next token */
thismodel = NULL;
{ /* 6th token is not a model in the table */
nodeflag = 2; /* now specify a 6 node device */
INPgetNetTok (&line, &nname7, 1); /* get next token */
thismodel = NULL;
#ifdef TRACE
printf("INP2M: checking for 6 node device\n");
printf("INP2M: checking for 6 node device\n");
#endif
INPgetMod (ckt, nname7, &thismodel, tab);
if (thismodel == NULL)
{ /* 7th token is not a model in the table */
nodeflag = 3; /* now specify a 7 node device */
INPgetTok (&line, &model, 1); /* get model name */
INPgetMod (ckt, nname7, &thismodel, tab);
if (thismodel == NULL)
{ /* 7th token is not a model in the table */
nodeflag = 3; /* now specify a 7 node device */
INPgetTok (&line, &model, 1); /* get model name */
#ifdef TRACE
printf("INP2M: checking for 7 node device\n");
printf("INP2M: checking for 7 node device\n");
#endif
INPgetMod (ckt, model, &thismodel, tab); /* get pointer to the model */
if (thismodel != NULL)
{
if ((thismodel->INPmodType != INPtypelook ("B4SOI")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIPD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIFD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIDD"))
)
{
/* if model is not variable node B3SOIPD/FD/DD model, error! */
LITERR ("only level 55-58: B3SOI(PD|FD|DD) and B4SOI can have 7 nodes") return;
}
else
{ /* if looking at B3SOIPD/FD/DD model, allocate the 7th node */
INPtermInsert (ckt, &nname5, tab, &node5);
INPtermInsert (ckt, &nname6, tab, &node6);
INPtermInsert (ckt, &nname7, tab, &node7);
}
}
/*saj unbreak the default model creation*/
else{
#ifdef TRACE
printf("INP2M: couldn't workout number of nodes, assuming 4\n");
#endif
model = nname5;/*mosfet*/
line = save; /* reset the posn to what it sould be */
}
/*saj*/
}
else
{ /* 7th token is a model - only have 6 terminal device */
if ((thismodel->INPmodType != INPtypelook ("B4SOI")) &&
INPgetMod (ckt, model, &thismodel, tab); /* get pointer to the model */
if (thismodel != NULL)
{
if ((thismodel->INPmodType != INPtypelook ("B4SOI")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIPD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIFD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIDD")) &&
(thismodel->INPmodType != INPtypelook ("SOI3"))
)
{
/* if model is not variable node B3SOIPD/FD/DD or STAG model, error! */
LITERR ("only level 55-58,60: B3SOI(PD|FD|DD), B4SOI and STAG (SOI3) can have 6 nodes") return;
}
else
{ /* if looking at B3SOIPD/FD/DD or STAG (SOI3) model, allocate the 6th node */
INPtermInsert (ckt, &nname5, tab, &node5);
INPtermInsert (ckt, &nname6, tab, &node6);
model = nname7;
}
}
}
(thismodel->INPmodType != INPtypelook ("B3SOIFD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIDD"))
)
{
/* if model is not variable node B3SOIPD/FD/DD model, error! */
LITERR ("only level 55-58: B3SOI(PD|FD|DD) and B4SOI can have 7 nodes") return;
}
else
{ /* if looking at B3SOIPD/FD/DD or B4SOI model, allocate the 7th node */
INPtermInsert (ckt, &nname5, tab, &node5);
INPtermInsert (ckt, &nname6, tab, &node6);
INPtermInsert (ckt, &nname7, tab, &node7);
}
}
/* saj - unbreak the default model creation*/
else{
#ifdef TRACE
printf("INP2M: couldn't workout number of nodes, assuming 4\n");
#endif
model = nname5;/* mosfet*/
line = save; /* reset the posn to what it sould be */
}
/*saj*/
}
else
{ /* 7th token is a model - only have 6 terminal device */
if ((thismodel->INPmodType != INPtypelook ("B4SOI")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIPD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIFD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIDD")) &&
(thismodel->INPmodType != INPtypelook ("HiSIMHV")) &&
(thismodel->INPmodType != INPtypelook ("SOI3"))
)
{
/* if model is not variable node B3SOIPD/FD/DD or STAG model, error! */
LITERR ("only level 55-58,61,62: B3SOI(PD|FD|DD), B4SOI, STAG (SOI3) and HiSIMHV can have 6 nodes") return;
}
else
{ /* if looking at B3SOIPD/FD/DD, B4SOI, STAG (SOI3) or HiSIMHV model, allocate the 6th node */
INPtermInsert (ckt, &nname5, tab, &node5);
INPtermInsert (ckt, &nname6, tab, &node6);
model = nname7;
}
}
}
else
{ /* 6th token is a model - only have 5 terminal device */
if ((thismodel->INPmodType != INPtypelook ("B4SOI")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIPD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIFD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIDD")) &&
(thismodel->INPmodType != INPtypelook ("SOI3"))
)
{
/* if model is not variable node B3SOIPD/FD/DD model, error! */
LITERR ("only level 55-58,60: B3SOI(PD|FD|DD), B4SOI and STAG (SOI3) can have 5 nodes") return;
}
else
{ /* if looking at B3SOIPD/FD/DD or STAG (SOI3) model, allocate the 5th node */
INPtermInsert (ckt, &nname5, tab, &node5);
model = nname6; /* make model point to the correct token */
}
}
{ /* 6th token is a model - only have 5 terminal device */
if ((thismodel->INPmodType != INPtypelook ("B4SOI")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIPD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIFD")) &&
(thismodel->INPmodType != INPtypelook ("B3SOIDD")) &&
(thismodel->INPmodType != INPtypelook ("HiSIMHV")) &&
(thismodel->INPmodType != INPtypelook ("SOI3"))
)
{
/* if model is not variable node B3SOIPD/FD/DD model, error! */
LITERR ("only level 55-58,61,62: B3SOI(PD|FD|DD), B4SOI, STAG (SOI3) and HiSIMHV can have 5 nodes") return;
}
else
{ /* if looking at B3SOIPD/FD/DD, B4SOI, STAG (SOI3) or HiSIMHV model, allocate the 5th node */
INPtermInsert (ckt, &nname5, tab, &node5);
model = nname6; /* make model point to the correct token */
}
}
}
else
{ /* 5th token is a model - only have 4 terminal device */
model = nname5; /* make model point to the correct token */
{ /* 5th token is a model - only have 4 terminal device */
model = nname5; /* make model point to the correct token */
}
INPinsert (&model, tab);
thismodel = NULL;
#ifdef TRACE
@ -200,42 +201,43 @@ INP2M (CKTcircuit *ckt, INPtables * tab, card * current)
if (thismodel != NULL)
{
if (thismodel->INPmodType != INPtypelook ("Mos1")
&& thismodel->INPmodType != INPtypelook ("Mos2")
&& thismodel->INPmodType != INPtypelook ("Mos3")
&& thismodel->INPmodType != INPtypelook ("Mos5")
&& thismodel->INPmodType != INPtypelook ("Mos6")
&& thismodel->INPmodType != INPtypelook ("Mos8")
&& thismodel->INPmodType != INPtypelook ("Mos9")
&& thismodel->INPmodType != INPtypelook ("BSIM1")
&& thismodel->INPmodType != INPtypelook ("BSIM2")
&& thismodel->INPmodType != INPtypelook ("BSIM3")
&& thismodel->INPmodType != INPtypelook ("BSIM3v32")
&& thismodel->INPmodType != INPtypelook ("B4SOI")
&& thismodel->INPmodType != INPtypelook ("B3SOIPD")
&& thismodel->INPmodType != INPtypelook ("B3SOIFD")
&& thismodel->INPmodType != INPtypelook ("B3SOIDD")
&& thismodel->INPmodType != INPtypelook ("BSIM4")
&& thismodel->INPmodType != INPtypelook ("BSIM4v2")
&& thismodel->INPmodType != INPtypelook ("BSIM4v3")
&& thismodel->INPmodType != INPtypelook ("BSIM4v4")
&& thismodel->INPmodType != INPtypelook ("BSIM4v5")
&& thismodel->INPmodType != INPtypelook ("BSIM3v0")
&& thismodel->INPmodType != INPtypelook ("BSIM3v1")
&& thismodel->INPmodType != INPtypelook ("SOI3")
if (thismodel->INPmodType != INPtypelook ("Mos1")
&& thismodel->INPmodType != INPtypelook ("Mos2")
&& thismodel->INPmodType != INPtypelook ("Mos3")
&& thismodel->INPmodType != INPtypelook ("Mos5")
&& thismodel->INPmodType != INPtypelook ("Mos6")
&& thismodel->INPmodType != INPtypelook ("Mos8")
&& thismodel->INPmodType != INPtypelook ("Mos9")
&& thismodel->INPmodType != INPtypelook ("BSIM1")
&& thismodel->INPmodType != INPtypelook ("BSIM2")
&& thismodel->INPmodType != INPtypelook ("BSIM3")
&& thismodel->INPmodType != INPtypelook ("BSIM3v32")
&& thismodel->INPmodType != INPtypelook ("B4SOI")
&& thismodel->INPmodType != INPtypelook ("B3SOIPD")
&& thismodel->INPmodType != INPtypelook ("B3SOIFD")
&& thismodel->INPmodType != INPtypelook ("B3SOIDD")
&& thismodel->INPmodType != INPtypelook ("BSIM4")
&& thismodel->INPmodType != INPtypelook ("BSIM4v2")
&& thismodel->INPmodType != INPtypelook ("BSIM4v3")
&& thismodel->INPmodType != INPtypelook ("BSIM4v4")
&& thismodel->INPmodType != INPtypelook ("BSIM4v5")
&& thismodel->INPmodType != INPtypelook ("BSIM3v0")
&& thismodel->INPmodType != INPtypelook ("BSIM3v1")
&& thismodel->INPmodType != INPtypelook ("SOI3")
#ifdef CIDER
&& thismodel->INPmodType != INPtypelook ("NUMOS")
&& thismodel->INPmodType != INPtypelook ("NUMOS")
#endif
#ifdef ADMS
&& thismodel->INPmodType != INPtypelook ("ekv")
&& thismodel->INPmodType != INPtypelook ("psp102")
#endif
&& thismodel->INPmodType != INPtypelook ("HiSIM1")
)
{
LITERR ("incorrect model type");
return;
}
&& thismodel->INPmodType != INPtypelook ("ekv")
&& thismodel->INPmodType != INPtypelook ("psp102")
#endif
&& thismodel->INPmodType != INPtypelook ("HiSIM1")
&& thismodel->INPmodType != INPtypelook ("HiSIMHV")
)
{
LITERR ("incorrect model type");
return;
}
type = thismodel->INPmodType;
mdfast = (thismodel->INPmodfast);
}
@ -243,16 +245,16 @@ INP2M (CKTcircuit *ckt, INPtables * tab, card * current)
{
type = INPtypelook ("Mos1");
if (type < 0)
{
LITERR ("Device type MOS1 not supported by this binary\n");
return;
}
{
LITERR ("Device type MOS1 not supported by this binary\n");
return;
}
if (!tab->defMmod)
{
/* create default M model */
IFnewUid (ckt, &uid, NULL, "M", UID_MODEL, NULL);
IFC (newModel, (ckt, type, &(tab->defMmod), uid));
}
{
/* create default M model */
IFnewUid (ckt, &uid, NULL, "M", UID_MODEL, NULL);
IFC (newModel, (ckt, type, &(tab->defMmod), uid));
}
mdfast = tab->defMmod;
}
IFC (newInstance, (ckt, mdfast, &fast, name));
@ -260,37 +262,39 @@ INP2M (CKTcircuit *ckt, INPtables * tab, card * current)
IFC (bindNode, (ckt, fast, 2, node2));
IFC (bindNode, (ckt, fast, 3, node3));
IFC (bindNode, (ckt, fast, 4, node4));
/*use type not thismodel->INPmodType as it might not exist!*/
/* use type - not thismodel->INPmodType as it might not exist! */
if ((type == INPtypelook ("B4SOI")) ||
(type == INPtypelook ("B3SOIPD")) ||
(type == INPtypelook ("B3SOIFD")) ||
(type == INPtypelook ("B3SOIDD")) ||
(type == INPtypelook ("HiSIMHV")) ||
(type == INPtypelook ("SOI3")))
{
switch (nodeflag)
{
case 0:
fast->GENnode5 = -1;
fast->GENnode6 = -1;
fast->GENnode7 = -1;
break;
case 1:
IFC (bindNode, (ckt, fast, 5, node5))
fast->GENnode6 = -1;
fast->GENnode7 = -1;
break;
case 2:
IFC (bindNode, (ckt, fast, 5, node5))
IFC (bindNode, (ckt, fast, 6, node6))
fast->GENnode7 = -1;
break;
case 3:
IFC (bindNode, (ckt, fast, 5, node5))
IFC (bindNode, (ckt, fast, 6, node6))
IFC (bindNode, (ckt, fast, 7, node7)) break;
default:
break;
}
{
case 0:
fast->GENnode5 = -1;
fast->GENnode6 = -1;
fast->GENnode7 = -1;
break;
case 1:
IFC (bindNode, (ckt, fast, 5, node5))
fast->GENnode6 = -1;
fast->GENnode7 = -1;
break;
case 2:
IFC (bindNode, (ckt, fast, 5, node5))
IFC (bindNode, (ckt, fast, 6, node6))
fast->GENnode7 = -1;
break;
case 3:
IFC (bindNode, (ckt, fast, 5, node5))
IFC (bindNode, (ckt, fast, 6, node6))
IFC (bindNode, (ckt, fast, 7, node7))
break;
default:
break;
}
}
PARSECALL ((&line, ckt, type, fast, &leadval, &waslead, tab));

View File

@ -395,6 +395,14 @@ char *INPdomodel(CKTcircuit *ckt, card * image, INPtables * tab)
("Device type SOI3 not available in this binary (STAG release)\n");
}
break;
case 62:
type = INPtypelook("HiSIMHV");
if (type < 0) {
err =
INPmkTemp
("Placeholder: Device type HiSIMHV not available in this binary\n");
}
break;
case 64:
type = INPtypelook("HiSIM1");
if (type < 0) {
@ -407,9 +415,9 @@ char *INPdomodel(CKTcircuit *ckt, card * image, INPtables * tab)
err =
INPmkTemp
#ifdef ADMS
("Only MOS device levels 1-6,8-10,14,44,45,49,54-58,61,64 are supported in this binary\n");
("Only MOS device levels 1-6,8-10,14,44,45,49,54-58,61,62,64 are supported in this binary\n");
#else
("Only MOS device levels 1-6,8-10,14,49,54-58,61,64 are supported in this binary\n");
("Only MOS device levels 1-6,8-10,14,49,54-58,61,62,64 are supported in this binary\n");
#endif
break;
}

File diff suppressed because it is too large Load Diff