Update hisim code to 1.2.0.

This commit is contained in:
pnenzi 2003-08-30 13:02:19 +00:00
parent 5ae9de6d52
commit 2522b8a8a3
28 changed files with 16308 additions and 785 deletions

View File

@ -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

View File

@ -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 */

View File

@ -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);

View File

@ -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;
*/
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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)

View File

@ -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*);

View File

@ -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) -

View File

@ -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
};

View File

@ -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

View File

@ -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

View File

@ -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:
;

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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 */

View File

@ -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;

View File

@ -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;
*/

View File

@ -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)
{

View File

@ -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);
}

View File

@ -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 */