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