Browse Source

changes for hisim version 2.5.1

dwarning 15 years ago
parent
commit
5dd55910c7
  1. 2
      src/Makefile.am
  2. 2
      src/spicelib/devices/Makefile.am
  3. 8
      src/spicelib/devices/dev.c
  4. 4
      src/spicelib/devices/hisim2/hisim2.h
  5. 10
      src/spicelib/devices/hisim2/hsm2acld.c
  6. 4
      src/spicelib/devices/hisim2/hsm2def.h
  7. 189
      src/spicelib/devices/hisim2/hsm2eval.c
  8. 22
      src/spicelib/devices/hisim2/hsm2ext.h
  9. 17
      src/spicelib/devices/hisim2/hsm2ld.c
  10. 2
      src/spicelib/devices/hisim2/hsm2pzld.c
  11. 7
      src/spicelib/devices/hisim2/hsm2temp.c
  12. 2
      src/spicelib/parser/inp2m.c
  13. 14
      src/spicelib/parser/inpdomod.c
  14. 58
      visualc/vngspice.vcproj

2
src/Makefile.am

@ -65,7 +65,7 @@ DYNAMIC_DEVICELIBS = \
spicelib/devices/isrc/libisrc.la \
spicelib/devices/hfet1/libhfet.la \
spicelib/devices/hfet2/libhfet2.la \
spicelib/devices/hisim/libhisim.la \
spicelib/devices/hisim2/libhisim2.la \
spicelib/devices/hisimhv/libhisimhv.la \
spicelib/devices/jfet/libjfet.la \
spicelib/devices/jfet2/libjfet2.la \

2
src/spicelib/devices/Makefile.am

@ -28,7 +28,6 @@ SUBDIRS = \
isrc \
hfet1 \
hfet2 \
hisim \
hisim2 \
hisimhv \
jfet \
@ -90,7 +89,6 @@ DIST_SUBDIRS = \
isrc \
hfet1 \
hfet2 \
hisim \
hisim2 \
hisimhv \
jfet \

8
src/spicelib/devices/dev.c

@ -98,7 +98,7 @@ int add_udn(int,Evt_Udn_Info_t **);
#include "dio/dioitf.h"
#include "hfet1/hfetitf.h"
#include "hfet2/hfet2itf.h"
#include "hisim/hsm1itf.h"
#include "hisim2/hsm2itf.h"
#include "hisimhv/hsmhvitf.h"
#include "ind/inditf.h"
#include "isrc/isrcitf.h"
@ -208,7 +208,7 @@ spice_init_devices(void)
DEVices[23] = get_dio_info();
DEVices[24] = get_hfeta_info();
DEVices[25] = get_hfet2_info();
DEVices[26] = get_hsm1_info();
DEVices[26] = get_hsm2_info();
DEVices[27] = get_hsmhv_info();
DEVices[28] = get_ind_info();
DEVices[29] = get_mut_info();
@ -291,12 +291,12 @@ SPICEdev ** devices(void)
#ifdef ADMS
#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v2", "bsim4v3", "bsim4v4", "bsim4v5", \
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim", "hisimhv", \
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim2", "hisimhv", \
"cap", "cccs", "ccvs", "csw", "dio", "hfet", "hfet2", "ind", "isrc", "jfet", "ltra", "mes", "mesa" ,"mos1", "mos2", "mos3", \
"mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc", "hicum0", "hicum2", "mextram", "ekv", "psp102"}
#else
#define DEVICES_USED {"asrc", "bjt", "vbic", "bsim1", "bsim2", "bsim3", "bsim3v32", "bsim3v2", "bsim3v1", "bsim4", "bsim4v4", "bsim4v2", "bsim4v3", "bsim4v4", "bsim4v5", \
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim", "hisimhv", \
"bsim4soi", "bsim3soipd", "bsim3soifd", "bsim3soidd", "hisim2", "hisimhv", \
"cap", "cccs", "ccvs", "csw", "dio", "hfet", "hfet2", "ind", "isrc", "jfet", "ltra", "mes", "mesa" ,"mos1", "mos2", "mos3", \
"mos6", "mos9", "res", "soi3", "sw", "tra", "urc", "vccs", "vcvs", "vsrc"}
#endif

4
src/spicelib/devices/hisim2/hisim2.h

@ -51,7 +51,6 @@
#define HiSIM_FALSE 0
#define HiSIM_TRUE 1
#ifdef __STDC__
extern int HSM2evaluate
(
double ivds,
@ -63,8 +62,5 @@ extern int HSM2evaluate
HSM2model *model,
CKTcircuit *ckt
) ;
#else
extern int HSM2evaluate() ;
#endif
#endif /* _HiSIM2_H */

10
src/spicelib/devices/hisim2/hsm2acld.c

@ -39,10 +39,10 @@ int HSM2acLoad(
double gIgtotg, gIgtotd, gIgtots, gIgtotb;
double gIdtotg, gIdtotd, gIdtots, gIdtotb;
double gIstotg, gIstotd, gIstots, gIstotb;
double cggb_real, cgsb_real, cgdb_real, cggb_imag, cgsb_imag, cgdb_imag;
double cdgb_real, cdsb_real, cddb_real, cdgb_imag, cdsb_imag, cddb_imag;
double csgb_real, cssb_real, csdb_real, csgb_imag, cssb_imag, csdb_imag;
double cbgb_real, cbsb_real, cbdb_real, cbgb_imag, cbsb_imag, cbdb_imag;
double cggb_real = 0.0, cgsb_real = 0.0, cgdb_real = 0.0, cggb_imag = 0.0, cgsb_imag = 0.0, cgdb_imag = 0.0;
double cdgb_real = 0.0, cdsb_real = 0.0, cddb_real = 0.0, cdgb_imag = 0.0, cdsb_imag = 0.0, cddb_imag = 0.0;
double csgb_real = 0.0, cssb_real = 0.0, csdb_real = 0.0, csgb_imag = 0.0, cssb_imag = 0.0, csdb_imag = 0.0;
double cbgb_real = 0.0, cbsb_real = 0.0, cbdb_real = 0.0, cbgb_imag = 0.0, cbsb_imag = 0.0, cbdb_imag = 0.0;
double pyggb_r = 0.0, pygdb_r = 0.0, pygsb_r = 0.0, pygbb_r = 0.0;
double pybgb_r = 0.0, pybdb_r = 0.0, pybsb_r = 0.0, pybbb_r = 0.0;
double pydgb_r = 0.0, pyddb_r = 0.0, pydsb_r = 0.0, pydbb_r = 0.0;
@ -55,7 +55,7 @@ int HSM2acLoad(
double ybgb_r, ybdb_r, ybsb_r, ybbb_r, ybgb_i, ybdb_i, ybsb_i, ybbb_i;
double ydgb_r, yddb_r, ydsb_r, ydbb_r, ydgb_i, yddb_i, ydsb_i, ydbb_i;
double ysgb_r, ysdb_r, yssb_r, ysbb_r, ysgb_i, ysdb_i, yssb_i, ysbb_i;
double grg, pxcbdb_i, pxcbsb_i;
double grg = 0.0, pxcbdb_i = 0.0, pxcbsb_i = 0.0;
double Qi, Qi_dVgs, Qi_dVbs, Qi_dVds ;
double Qb, Qb_dVgs, Qb_dVbs, Qb_dVds ;

4
src/spicelib/devices/hisim2/hsm2def.h

@ -2155,14 +2155,10 @@ typedef struct sHSM2model { /* model structure for a resistor */
#include "hsm2ext.h"
/*
#ifdef __STDC__
extern void HSM2evaluate(double,double,double,HSM2instance*,HSM2model*,
double*,double*,double*, double*, double*, double*, double*,
double*, double*, double*, double*, double*, double*, double*,
double*, double*, double*, double*, CKTcircuit*);
#else
extern void HSM2evaluate();
#endif
*/
#endif /*HSM2*/

189
src/spicelib/devices/hisim2/hsm2eval.c

@ -139,6 +139,8 @@ using the HiSIM2 standard.
#endif
#include "cktdefs.h"
#include "ngspice.h"
/*-----------------------------------*
* HiSIM macros
*-----------------*/
@ -237,7 +239,6 @@ double TMF1 , TMF2 , TMF3 , TMF4 ;
* smoothZero: flooring to zero.
* y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) )
*-----------------*/
#if 0
static double smoothZero
(
double x,
@ -249,7 +250,6 @@ static double smoothZero
if (dx) *dx = 0.5 * ( 1.0 + x / sqr ) ;
return 0.5 * ( x + sqr ) ;
}
#endif
/*---------------------------------------------------*
* CeilingPow: ceiling for positive x, flooring for negative x.
* y = x * xmax / ( x^{2m} + xmax^{2m} )^{1/(2m)}
@ -258,7 +258,6 @@ static double smoothZero
* - -xmax < y < xmax.
* - dy/dx|_{x=0} = 1.
*-----------------*/
#if 0
static double CeilingPow
(
double x,
@ -301,7 +300,6 @@ static double CeilingPow
(*dx) = xmax * xmp * dnm / arg ;
return result ;
}
#endif
/*---------------------------------------------------*
* CeilingPow: ceiling for positive x, flooring for negative x.
@ -381,7 +379,6 @@ static double CeilingPow
/*===========================================================*
* Function hsm2evaluate.
*=================*/
#ifdef __STDC__
int HSM2evaluate
(
double vds,
@ -393,17 +390,6 @@ int HSM2evaluate
HSM2model *model,
CKTcircuit *ckt
)
#else
int HSM2evaluate( vds , vgs , vbs , vbs_jct, vbd_jct, here , model , ckt)
double vds ;
double vgs ;
double vbs ;
double vbs_jct ;
double vbd_jct ;
HSM2instance *here ;
HSM2model *model ;
CKTcircuit *ckt ;
#endif
{
HSM2binningParam *pParam = &here->pParam ;
/*-----------------------------------*
@ -467,7 +453,7 @@ int HSM2evaluate( vds , vgs , vbs , vbs_jct, vbd_jct, here , model , ckt)
int flg_rsrd = 0 ; /* Flag for bias loop accounting Rs and Rd */
int flg_iprv = 0 ; /* Flag for initial guess of Ids */
int flg_pprv = 0 ; /* Flag for initial guesses of Ps0 and Pds */
int flg_noqi ; /* Flag for the cases regarding Qi=Qd=0 */
int flg_noqi = 0 ; /* Flag for the cases regarding Qi=Qd=0 */
int flg_vbsc = 0 ; /* Flag for Vbs confining */
int flg_info = 0 ;
int flg_conv = 0 ; /* Flag for Poisson loop convergence */
@ -487,77 +473,77 @@ int HSM2evaluate( vds , vgs , vbs , vbs_jct, vbd_jct, here , model , ckt)
double Vbs_dVbse = 1.0 , Vbs_dVdse = 0.0 , Vbs_dVgse = 0.0 ;
double Vds_dVbse = 0.0 , Vds_dVdse = 1.0 , Vds_dVgse = 0.0 ;
double Vgs_dVbse = 0.0 , Vgs_dVdse = 0.0 , Vgs_dVgse = 1.0 ;
double Vgp ;
double Vgp_dVbs , Vgp_dVds , Vgp_dVgs ;
double Vgp = 0.0 ;
double Vgp_dVbs = 0.0 , Vgp_dVds = 0.0 , Vgp_dVgs = 0.0 ;
double Vgs_fb ;
/* Ps0 : surface potential at the source side */
double Ps0 ;
double Ps0_dVbs , Ps0_dVds , Ps0_dVgs ;
double Ps0_ini , Ps0_iniA , Ps0_iniB ;
double Ps0 = 0.0 ;
double Ps0_dVbs = 0.0 , Ps0_dVds = 0.0 , Ps0_dVgs = 0.0 ;
double Ps0_ini = 0.0 , Ps0_iniA , Ps0_iniB ;
/* Psl : surface potential at the drain side */
double Psl ;
double Psl_dVbs , Psl_dVds , Psl_dVgs ;
double Psl = 0.0 ;
double Psl_dVbs = 0.0 , Psl_dVds = 0.0 , Psl_dVgs = 0.0 ;
double Psl_lim , dPlim ;
/* Pds := Psl - Ps0 */
double Pds = 0.0 ;
double Pds_dVbs = 0.0, Pds_dVds = 0.0 , Pds_dVgs = 0.0 ;
double Pds_ini ;
double Pds_ini = 0.0 ;
double Pds_max ;
/* iteration numbers of Ps0 and Psl equations. */
int lp_s0 = 0 , lp_sl = 0 ;
/* Xi0 := beta * ( Ps0 - Vbs ) - 1. */
double Xi0 ;
double Xi0_dVbs , Xi0_dVds , Xi0_dVgs ;
double Xi0p12 ;
double Xi0p12_dVbs , Xi0p12_dVds , Xi0p12_dVgs ;
double Xi0p32 ;
double Xi0 = 0.0 ;
double Xi0_dVbs = 0.0 , Xi0_dVds = 0.0 , Xi0_dVgs = 0.0 ;
double Xi0p12 = 0.0 ;
double Xi0p12_dVbs = 0.0 , Xi0p12_dVds = 0.0 , Xi0p12_dVgs = 0.0 ;
double Xi0p32 = 0.0 ;
/* Xil := beta * ( Psl - Vbs ) - 1. */
double Xilp12 ;
double Xilp32 ;
double Xil ;
double Xilp12 = 0.0 ;
double Xilp32 = 0.0 ;
double Xil = 0.0 ;
/* modified bias and potential for sym.*/
double Vbsz , Vdsz , Vgsz ;
double Vbsz_dVbs , Vbsz_dVds ;
double Vdsz_dVds ;
double Vgsz_dVgs , Vgsz_dVds ;
double Vbsz = 0.0 , Vdsz = 0.0 , Vgsz = 0.0 ;
double Vbsz_dVbs = 0.0 , Vbsz_dVds = 0.0 ;
double Vdsz_dVds = 0.0 ;
double Vgsz_dVgs = 0.0 , Vgsz_dVds = 0.0 ;
double Vzadd , Vzadd_dVds ;
double Ps0z , Ps0z_dVbs , Ps0z_dVds , Ps0z_dVgs ;
double Ps0z = 0.0 , Ps0z_dVbs = 0.0 , Ps0z_dVds = 0.0 , Ps0z_dVgs = 0.0 ;
double Pzadd , Pzadd_dVbs , Pzadd_dVds , Pzadd_dVgs ;
double Vgpz , Vgpz_dVbs , Vgpz_dVds , Vgpz_dVgs ; /* (tmp) */
/* IBPC */
double dVbsIBPC , dVbsIBPC_dVbs , dVbsIBPC_dVds , dVbsIBPC_dVgs ;
double betaWL , betaWL_dVbs , betaWL_dVds , betaWL_dVgs ;
double Xi0p32_dVbs , Xi0p32_dVds , Xi0p32_dVgs ;
double Xil_dVbs , Xil_dVds , Xil_dVgs ;
double Xilp12_dVbs , Xilp12_dVds , Xilp12_dVgs ;
double Xilp32_dVbs , Xilp32_dVds , Xilp32_dVgs ;
double betaWL = 0.0 , betaWL_dVbs = 0.0 , betaWL_dVds = 0.0 , betaWL_dVgs = 0.0 ;
double Xi0p32_dVbs = 0.0 , Xi0p32_dVds = 0.0 , Xi0p32_dVgs = 0.0 ;
double Xil_dVbs = 0.0 , Xil_dVds = 0.0 , Xil_dVgs = 0.0 ;
double Xilp12_dVbs = 0.0 , Xilp12_dVds = 0.0 , Xilp12_dVgs = 0.0 ;
double Xilp32_dVbs = 0.0 , Xilp32_dVds = 0.0 , Xilp32_dVgs = 0.0 ;
double dG3 , dG3_dVbs , dG3_dVds , dG3_dVgs ;
double dG4 , dG4_dVbs , dG4_dVds , dG4_dVgs ;
double dIdd , dIdd_dVbs , dIdd_dVds , dIdd_dVgs ;
/* Chi := beta * ( Ps{0/l} - Vbs ) */
double Chi ;
double Chi = 0.0 ;
double Chi_dVbs , Chi_dVds , Chi_dVgs ;
/* Rho := beta * ( Psl - Vds ) */
double Rho ;
/* threshold voltage */
double Vth ;
double Vth0 ;
double Vth0_dVb , Vth0_dVd , Vth0_dVg ;
double Vth = 0.0 ;
double Vth0 = 0.0 ;
double Vth0_dVb = 0.0 , Vth0_dVd = 0.0 , Vth0_dVg = 0.0 ;
/* variation of threshold voltage */
double dVth ;
double dVth_dVb , dVth_dVd , dVth_dVg ;
double dVth0 ;
double dVth0_dVb , dVth0_dVd , dVth0_dVg ;
double dVthSC ;
double dVthSC_dVb , dVthSC_dVd , dVthSC_dVg ;
double dVth = 0.0 ;
double dVth_dVb = 0.0 , dVth_dVd = 0.0 , dVth_dVg = 0.0 ;
double dVth0 = 0.0 ;
double dVth0_dVb = 0.0 , dVth0_dVd = 0.0 , dVth0_dVg = 0.0 ;
double dVthSC = 0.0 ;
double dVthSC_dVb = 0.0 , dVthSC_dVd = 0.0 , dVthSC_dVg = 0.0 ;
double Pb20b ;
double Pb20b_dVg , Pb20b_dVb , Pb20b_dVd ;
double dVthW ;
double dVthW_dVb , dVthW_dVd , dVthW_dVg ;
/* Alpha and related parameters */
double Alpha ;
double Alpha = 0.0 ;
double Alpha_dVbs , Alpha_dVds , Alpha_dVgs ;
double Achi ;
double Achi_dVbs , Achi_dVds , Achi_dVgs ;
@ -569,11 +555,11 @@ int HSM2evaluate( vds , vgs , vbs , vbs_jct, vbd_jct, here , model , ckt)
double VdsatS_dVbs = 0.0, VdsatS_dVds = 0.0, VdsatS_dVgs = 0.0 ;
double Delta ;
/* Q_B and capacitances */
double Qb , Qb_dVbs , Qb_dVds , Qb_dVgs ;
double Qb = 0.0 , Qb_dVbs = 0.0 , Qb_dVds = 0.0 , Qb_dVgs = 0.0 ;
double Qb_dVbse , Qb_dVdse , Qb_dVgse ;
double Qbu = 0.0 , Qbu_dVbs = 0.0 , Qbu_dVds = 0.0 , Qbu_dVgs = 0.0 ;
/* Q_I and capacitances */
double Qi , Qi_dVbs , Qi_dVds , Qi_dVgs ;
double Qi = 0.0 , Qi_dVbs = 0.0 , Qi_dVds = 0.0 , Qi_dVgs = 0.0 ;
double Qi_dVbse , Qi_dVdse , Qi_dVgse ;
double Qiu = 0.0 , Qiu_dVbs = 0.0 , Qiu_dVds = 0.0 , Qiu_dVgs = 0.0 ;
/* Q_D and capacitances */
@ -582,7 +568,7 @@ int HSM2evaluate( vds , vgs , vbs , vbs_jct, vbd_jct, here , model , ckt)
double qd_dVgse, qd_dVdse, qd_dVbse, qd_dVsse ;
/* channel current */
double Ids ;
double Ids_dVbs , Ids_dVds , Ids_dVgs ;
double Ids_dVbs = 0.0 , Ids_dVds = 0.0 , Ids_dVgs = 0.0 ;
double Ids_dVbse , Ids_dVdse , Ids_dVgse ;
double Ids0 ;
double Ids0_dVbs , Ids0_dVds , Ids0_dVgs ;
@ -626,14 +612,14 @@ int HSM2evaluate( vds , vgs , vbs , vbs_jct, vbd_jct, here , model , ckt)
double Psa ;
double Psa_dVbs , Psa_dVds , Psa_dVgs ;
/* CLM*/
double Psdl , Psdl_dVbs , Psdl_dVds , Psdl_dVgs ;
double Lred , Lred_dVbs , Lred_dVds , Lred_dVgs ;
double Lch , Lch_dVbs , Lch_dVds , Lch_dVgs ;
double Psdl = 0.0 , Psdl_dVbs = 0.0 , Psdl_dVds = 0.0 , Psdl_dVgs = 0.0 ;
double Lred = 0.0 , Lred_dVbs = 0.0 , Lred_dVds = 0.0 , Lred_dVgs = 0.0 ;
double Lch = 0.0 , Lch_dVbs = 0.0 , Lch_dVds = 0.0 , Lch_dVgs = 0.0 ;
double Wd , Wd_dVbs , Wd_dVds , Wd_dVgs ;
double Aclm ;
/* Pocket Implant */
double Vthp, Vthp_dVb, Vthp_dVd, Vthp_dVg ;
double dVthLP, dVthLP_dVb, dVthLP_dVd, dVthLP_dVg ;
double dVthLP = 0.0, dVthLP_dVb = 0.0, dVthLP_dVd = 0.0, dVthLP_dVg = 0.0 ;
double bs12, bs12_dVb, bs12_dVd , bs12_dVg ;
double Qbmm, Qbmm_dVb, Qbmm_dVd , Qbmm_dVg ;
double dqb, dqb_dVb, dqb_dVg, dqb_dVd ;
@ -642,12 +628,12 @@ int HSM2evaluate( vds , vgs , vbs , vbs_jct, vbd_jct, here , model , ckt)
double Pbsum_dVb, Pbsum_dVd, Pbsum_dVg ;
/* Poly-Depletion Effect */
const double pol_b = 1.0 ;
double dPpg , dPpg_dVb , dPpg_dVd , dPpg_dVg ;
double dPpg = 0.0 , dPpg_dVb = 0.0 , dPpg_dVd = 0.0 , dPpg_dVg = 0.0 ;
/* Quantum Effect */
double Tox , Tox_dVb , Tox_dVd , Tox_dVg ;
double dTox , dTox_dVb , dTox_dVd , dTox_dVg ;
double Cox , Cox_dVb , Cox_dVd , Cox_dVg ;
double Cox_inv , Cox_inv_dVb , Cox_inv_dVd , Cox_inv_dVg ;
double Cox = 0.0 , Cox_dVb = 0.0 , Cox_dVd = 0.0 , Cox_dVg = 0.0 ;
double Cox_inv = 0.0 , Cox_inv_dVb , Cox_inv_dVd , Cox_inv_dVg ;
double Tox0 , Cox0 , Cox0_inv ;
double Vthq, Vthq_dVb , Vthq_dVd ;
/* Igate , Igidl , Igisl */
@ -672,35 +658,35 @@ int HSM2evaluate( vds , vgs , vbs , vbs_jct, vbd_jct, here , model , ckt)
double Igisl , Igisl_dVbs , Igisl_dVds , Igisl_dVgs ;
double Igisl_dVbse , Igisl_dVdse , Igisl_dVgse ;
/* connecting function */
double FD2 , FD2_dVbs , FD2_dVds , FD2_dVgs ;
double FMDVDS , FMDVDS_dVbs , FMDVDS_dVds , FMDVDS_dVgs ;
double FD2 = 0.0 , FD2_dVbs = 0.0 , FD2_dVds = 0.0 , FD2_dVgs = 0.0 ;
double FMDVDS = 0.0 , FMDVDS_dVbs = 0.0 , FMDVDS_dVds = 0.0 , FMDVDS_dVgs = 0.0 ;
double cnst0 , cnst1 ;
double cnstCoxi =0.0 , cnstCoxi_dVg =0.0 , cnstCoxi_dVd =0.0 , cnstCoxi_dVb =0.0 ;
double fac1 ;
double fac1 = 0.0 ;
double fac1_dVbs , fac1_dVds , fac1_dVgs ;
double fac1p2 ;
double fs01 ;
double fs01_dPs0 ;
double fs01 = 0.0 ;
double fs01_dPs0 = 0.0 ;
double fs01_dVbs , fs01_dVds , fs01_dVgs ;
double fs02 ;
double fs02_dPs0 ;
double fs02 = 0.0 ;
double fs02_dPs0 = 0.0 ;
double fs02_dVbs , fs02_dVds , fs02_dVgs ;
double fsl1 ;
double fsl1_dPsl ;
double fsl1_dVbs , fsl1_dVds , fsl1_dVgs ; /* Vdseff */
double fsl2 ;
double fsl2 = 0.0 ;
double fsl2_dPsl ;
double fsl2_dVbs , fsl2_dVds , fsl2_dVgs ; /* Vdseff */
double cfs1 ;
double fb , fb_dChi ;
double fi , fi_dChi ;
double exp_Chi , exp_Rho , exp_bVbs , exp_bVbsVds ;
double fb = 0.0 , fb_dChi = 0.0 ;
double fi = 0.0 , fi_dChi = 0.0 ;
double exp_Chi , exp_Rho = 0.0 , exp_bVbs , exp_bVbsVds ;
double Fs0, Fsl ;
double Fs0_dPs0 , Fsl_dPsl ;
double Fs0_dPs0 = 0.0 , Fsl_dPsl = 0.0 ;
double dPs0 , dPsl ;
double Qn0 = 0.0e0 ;
double Qn0_dVbs , Qn0_dVds , Qn0_dVgs ;
double Qn0_dVbs = 0.0 , Qn0_dVds = 0.0 , Qn0_dVgs = 0.0 ;
double Qb0 ;
double Qb0_dVb , Qb0_dVd , Qb0_dVg ;
double Qbnm ;
@ -719,18 +705,18 @@ int HSM2evaluate( vds , vgs , vbs , vbs_jct, vbd_jct, here , model , ckt)
double Qdrat = 0.5;
double Qdrat_dVbs = 0.0 , Qdrat_dVds = 0.0, Qdrat_dVgs = 0.0;
double Qdrat_dVbse , Qdrat_dVdse , Qdrat_dVgse ;
double Idd ;
double Idd_dVbs , Idd_dVds , Idd_dVgs ;
double Idd = 0.0 ;
double Idd_dVbs = 0.0 , Idd_dVds = 0.0 , Idd_dVgs = 0.0 ;
double Fdd ;
double Fdd_dVbs , Fdd_dVds , Fdd_dVgs ;
double Eeff ;
double Eeff_dVbs , Eeff_dVds , Eeff_dVgs ;
double Rns ;
double Mu = 0.0 ;
double Mu_dVbs , Mu_dVds , Mu_dVgs ;
double Muun , Muun_dVbs , Muun_dVds , Muun_dVgs ;
double Mu_dVbs = 0.0 , Mu_dVds = 0.0 , Mu_dVgs = 0.0 ;
double Muun = 0.0 , Muun_dVbs , Muun_dVds , Muun_dVgs ;
double Ey = 0e0 ;
double Ey_dVbs , Ey_dVds , Ey_dVgs ;
double Ey_dVbs = 0.0 , Ey_dVds = 0.0 , Ey_dVgs = 0.0 ;
double Em ;
double Em_dVbs , Em_dVds , Em_dVgs ;
double Vmax ;
@ -780,7 +766,7 @@ int HSM2evaluate( vds , vgs , vbs , vbs_jct, vbd_jct, here , model , ckt)
double Cf ;
double Qfd , Qfs ;
/* Cqy */
double Ec , Ec_dVbs , Ec_dVds , Ec_dVgs ;
double Ec = 0.0 , Ec_dVbs = 0.0 , Ec_dVds = 0.0 , Ec_dVgs = 0.0 ;
double Pslk , Pslk_dVbs , Pslk_dVds , Pslk_dVgs ;
double Qy ;
double Cqyd, Cqyg, Cqys, Cqyb ;
@ -794,27 +780,27 @@ int HSM2evaluate( vds , vgs , vbs , vbs_jct, vbd_jct, here , model , ckt)
double czbd , czbdsw , czbdswg , czbs , czbssw , czbsswg ;
double arg , sarg ;
/* PART-5 (NQS) */
double tau, Qi_prev ;
double tau_dVgs, tau_dVds, tau_dVbs ;
double tau_dVgse, tau_dVdse, tau_dVbse ;
double Qi_nqs ;
double Qi_dVbs_nqs, Qi_dVds_nqs, Qi_dVgs_nqs ;
double Qi_dVbse_nqs, Qi_dVdse_nqs, Qi_dVgse_nqs ;
double taub, Qb_prev ;
double taub_dVgs, taub_dVds, taub_dVbs ;
double taub_dVgse, taub_dVdse, taub_dVbse ;
double Qb_nqs ;
double Qb_dVbs_nqs, Qb_dVds_nqs, Qb_dVgs_nqs ;
double Qb_dVbse_nqs, Qb_dVdse_nqs, Qb_dVgse_nqs ;
double tau = 0.0, Qi_prev ;
double tau_dVgs = 0.0, tau_dVds = 0.0, tau_dVbs = 0.0 ;
double tau_dVgse = 0.0, tau_dVdse = 0.0, tau_dVbse = 0.0 ;
double Qi_nqs = 0.0 ;
double Qi_dVbs_nqs = 0.0, Qi_dVds_nqs = 0.0, Qi_dVgs_nqs = 0.0 ;
double Qi_dVbse_nqs = 0.0, Qi_dVdse_nqs = 0.0, Qi_dVgse_nqs = 0.0 ;
double taub = 0.0, Qb_prev ;
double taub_dVgs = 0.0, taub_dVds = 0.0, taub_dVbs = 0.0 ;
double taub_dVgse = 0.0, taub_dVdse = 0.0, taub_dVbse = 0.0 ;
double Qb_nqs = 0.0 ;
double Qb_dVbs_nqs = 0.0, Qb_dVds_nqs = 0.0, Qb_dVgs_nqs = 0.0 ;
double Qb_dVbse_nqs = 0.0, Qb_dVdse_nqs = 0.0, Qb_dVgse_nqs = 0.0 ;
/* PART-6 (noise) */
/* 1/f */
double NFalp , NFtrp , Cit , Nflic ;
/* thermal */
double Eyd, Mu_Ave, Nthrml, Mud_hoso ;
double Eyd, Mu_Ave, Nthrml, Mud_hoso = 0.0 ;
/* induced gate noise ( Part 0/3 ) */
double kusai00 , kusaidd , kusaiL , kusai00L ;
double kusai00 = 0.0 , kusaidd , kusaiL = 0.0 , kusai00L = 0.0 ;
int flg_ign = 0 ;
double sqrtkusaiL , kusai_ig , gds0_ign , gds0_h2 , GAMMA , crl_f ;
double sqrtkusaiL = 0.0 , kusai_ig = 0.0 , gds0_ign = 0.0 , gds0_h2 , GAMMA , crl_f = 0.0 ;
const double c_sqrt_15 = 3.872983346207417e0 ; /* sqrt(15) */
const double Cox_small = 1.0e-6 ;
const double c_16o135 = 1.185185185185185e-1 ; /* 16/135 */
@ -826,10 +812,10 @@ int HSM2evaluate( vds , vgs , vbs , vbs_jct, vbd_jct, here , model , ckt)
double vtol_iprv = 2.0e-1 ;
double vtol_pprv = 1.01e-1 ;
double Vbsc_dif , Vdsc_dif , Vgsc_dif , sum_vdif ;
double Vbsc_dif2 , Vdsc_dif2 , Vgsc_dif2 , sum_vdif2 ;
double Rs , Rd ;
double Vbsc_dif2 = 0.0 , Vdsc_dif2 = 0.0 , Vgsc_dif2 = 0.0 , sum_vdif2 ;
double Rs = 0.0 , Rd = 0.0 ;
double Fbs , Fds , Fgs ;
double DJ , DJI ;
double DJ , DJI = 0.0 ;
double JI11 , JI12 , JI13 , JI21 , JI22 , JI23 , JI31 , JI32 , JI33 ;
double dVbs , dVds , dVgs ;
double dV_sum ;
@ -921,7 +907,6 @@ int HSM2evaluate( vds , vgs , vbs , vbs_jct, vbd_jct, here , model , ckt)
/* modify Qy in accumulation region */
/* double eps_qy = 5.0e-3 ; */
double Aclm_eff, Aclm_eff_dVds, Aclm_eff_dVgs, Aclm_eff_dVbs ;
double Idd1 , Idd1_dVbs , Idd1_dVgs , Idd1_dVds ;

22
src/spicelib/devices/hisim2/hsm2ext.h

@ -13,7 +13,6 @@
Semiconductor Technology Academic Research Center (STARC)
***********************************************************************/
#ifdef __STDC__
extern int HSM2acLoad(GENmodel *,CKTcircuit*);
extern int HSM2ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*);
extern int HSM2convTest(GENmodel *,CKTcircuit*);
@ -36,24 +35,3 @@ extern int HSM2unsetup(GENmodel*,CKTcircuit*);
extern int HSM2temp(GENmodel*,CKTcircuit*);
extern int HSM2trunc(GENmodel*,CKTcircuit*,double*);
extern int HSM2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*);
#else /* stdc */
extern int HSM2acLoad();
extern int HSM2delete();
extern void HSM2destroy();
extern int HSM2getic();
extern int HSM2load();
extern int HSM2mDelete();
extern int HSM2ask();
extern int HSM2mAsk();
extern int HSM2convTest();
extern int HSM2temp();
extern int HSM2mParam();
extern void HSM2mosCap();
extern int HSM2param();
extern int HSM2pzLoad();
extern int HSM2setup();
extern int HSM2unsetup();
extern int HSM2trunc();
extern int HSM2noise();
#endif /* stdc */

17
src/spicelib/devices/hisim2/hsm2ld.c

@ -47,7 +47,6 @@ static double vsum0 = 1.0e5 ;
#endif
#ifdef __STDC__
static void ShowPhysVals
(
HSM2instance *here,
@ -60,18 +59,6 @@ static void ShowPhysVals
double vbd,
double vgb
)
#else
static void ShowPhysVals(here,model,isFirst,vds,vgs,vbs,vgd,vbd,vgb)
HSM2instance *here;
HSM2model *model;
int isFirst;
double vds;
double vgs;
double vbs;
double vgd;
double vbd;
double vgb;
#endif
{
NG_IGNORE(vgd);
NG_IGNORE(vbd);
@ -198,7 +185,7 @@ int HSM2load(
double cbhat, cdrain, cdhat, cdreq, cgbhat, cgshat, cgdhat;
double Ibtot, Idtot, Igbtot, Igstot, Igdtot;
double ceq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg;
double ceqjs, ceqjd, ceqqjs, ceqqjd;
double ceqjs, ceqjd, ceqqjs = 0.0, ceqqjd = 0.0;
double delvbd, delvbs, delvds, delvgd, delvgs;
double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb;
double gcgdb, gcggb, gcgsb, gcgbb, gcsdb, gcsgb, gcssb;
@ -234,7 +221,7 @@ int HSM2load(
? 1 : 0;
int showPhysVal;
int isConv;
double vds_pre;
double vds_pre = 0.0;
double reltol, abstol , voltTol ;
#ifdef MOS_MODEL_TIME

2
src/spicelib/devices/hisim2/hsm2pzld.c

@ -30,7 +30,7 @@ int HSM2pzLoad(
register HSM2instance *here;
double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb;
double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb;
double xcdbdb, xcsbsb;
double xcdbdb = 0.0, xcsbsb = 0.0;
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, FwdSum, RevSum, gm, gmbs;
double gjbd, gjbs, grg;
double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb;

7
src/spicelib/devices/hisim2/hsm2temp.c

@ -14,7 +14,6 @@
***********************************************************************/
#include "ngspice.h"
#include <stdio.h>
#include "smpdefs.h"
#include "cktdefs.h"
#include "hsm2def.h"
@ -23,15 +22,9 @@
#include "sperror.h"
#include "suffix.h"
#ifdef __STDC__
#define BINNING(param) pParam->HSM2_##param = model->HSM2_##param \
+ model->HSM2_l##param / Lbin + model->HSM2_w##param / Wbin \
+ model->HSM2_p##param / LWbin ;
#else
#define BINNING(param) pParam->HSM2_/**/param = model->HSM2_/**/param \
+ model->HSM2_l/**/param / Lbin + model->HSM2_w/**/param / Wbin \
+ model->HSM2_p/**/param / LWbin ;
#endif
#define RANGECHECK(param, min, max, pname) \
if ( (param) < (min) || (param) > (max) ) { \

2
src/spicelib/parser/inp2m.c

@ -231,7 +231,7 @@ INP2M (CKTcircuit *ckt, INPtables * tab, card * current)
&& thismodel->INPmodType != INPtypelook ("ekv")
&& thismodel->INPmodType != INPtypelook ("psp102")
#endif
&& thismodel->INPmodType != INPtypelook ("HiSIM1")
&& thismodel->INPmodType != INPtypelook ("HiSIM2")
&& thismodel->INPmodType != INPtypelook ("HiSIMHV")
)
{

14
src/spicelib/parser/inpdomod.c

@ -388,7 +388,7 @@ char *INPdomodel(CKTcircuit *ckt, card * image, INPtables * tab)
}
break;
case 61:
case 60:
type = INPtypelook("SOI3");
if (type < 0) {
err =
@ -396,20 +396,20 @@ char *INPdomodel(CKTcircuit *ckt, card * image, INPtables * tab)
("Device type SOI3 not available in this binary (STAG release)\n");
}
break;
case 62:
type = INPtypelook("HiSIMHV");
case 61:
type = INPtypelook("HiSIM2");
if (type < 0) {
err =
INPmkTemp
("Placeholder: Device type HiSIMHV not available in this binary\n");
("Placeholder: Device type HiSIM2 not available in this binary\n");
}
break;
case 64:
type = INPtypelook("HiSIM1");
case 62:
type = INPtypelook("HiSIMHV");
if (type < 0) {
err =
INPmkTemp
("Placeholder: Device type HiSIM1 not available in this binary\n");
("Placeholder: Device type HiSIMHV not available in this binary\n");
}
break;
default: /* placeholder; use level xxx for the next model */

58
visualc/vngspice.vcproj

@ -1887,7 +1887,7 @@
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hisim.h"
RelativePath="..\src\spicelib\devices\hisim2\hisim.h"
>
</File>
<File
@ -1903,23 +1903,23 @@
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1def.h"
RelativePath="..\src\spicelib\devices\hisim2\hsm2def.h"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1evalenv.h"
RelativePath="..\src\spicelib\devices\hisim2\hsm2evalenv.h"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1ext.h"
RelativePath="..\src\spicelib\devices\hisim2\hsm2ext.h"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1init.h"
RelativePath="..\src\spicelib\devices\hisim2\hsm2init.h"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1itf.h"
RelativePath="..\src\spicelib\devices\hisim2\hsm2itf.h"
>
</File>
<File
@ -5715,87 +5715,79 @@
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1acld.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2acld.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1ask.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2ask.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1cvtest.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2cvtest.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1del.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2del.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1dest.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2dest.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1eval102.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2eval.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1eval112.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2getic.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1eval120.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2init.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1getic.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2ld.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1init.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2mask.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1ld.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2mdel.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1mask.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2mpar.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1mdel.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2noi.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1mpar.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2par.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1noi.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2pzld.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1par.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2set.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1pzld.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2temp.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1set.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1temp.c"
>
</File>
<File
RelativePath="..\src\spicelib\devices\hisim\hsm1trunc.c"
RelativePath="..\src\spicelib\devices\hisim2\hsm2trunc.c"
>
</File>
<File

Loading…
Cancel
Save