hsm1eval102.c

来自「ngspice又一个电子CAD仿真软件代码.功能更全」· C语言 代码 · 共 2,335 行 · 第 1/5 页

C
2,335
字号
/*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) Copyright (C) 2003 STARC VERSION : HiSIM 1.2.0 FILE : hsm1eval102.c of HiSIM 1.2.0 April 9, 2003 : released by STARC Physical Design Group***********************************************************************//********************************************************************** Memorandum on programming* * (1) Bias (x: b|d|g)*     . sIN.vxs : Input argument.*     . Vxse: External bias taking account device type (pMOS->nMOS).*     . Vxsc: Confined bias within a specified region. *     . Vxs : Internal bias taking account Rs/Rd.*     . Y_dVxs denotes the partial derivative of Y w.r.t. Vxs.* * (2) Device Mode*     . Normal mode (Vds>0 for nMOS) is assumed.*     . In case of reverse mode, parent routines have to properly *       transform or interchange inputs and outputs except ones *       related to junction diodes, which are regarded as being *       fixed to the nodal S/D.** (3) Modification for symmetry at Vds=0*     . Vxsz: Modified bias.*     . Ps0z: Modified Ps0.*     . The following variables are calculated as a function of *       modified biases or potential.*         Tox, Cox, (-- with quantum effect)*         Vth*, dVth*, dPpg, Qnm, Qbm, Igate, Igidl. *     . The following variables are calculated using a transform*       function.*         Lred, rp1(<-sIN.rpock1).*     * (4) Zones and Cases (terminology)* *       Chi:=beta*(Ps0-Vbs)=       0    3    5**                      Zone:    A  | D1 | D2 | D3*                                  |*                    (accumulation)|(depletion)*                                  |*                      Vgs =     Vgs_fb                Vth*                                              /       /*                      Case:    Nonconductive / Conductive*                                            /*             VgVt:=Qn0/Cox=             VgVt_small**     . Ids is regarded as zero in zone-A and -D1.*     . Procedure to calculate Psl and dependent variables is *       omitted in the nonconductive case. Ids and Qi are regarded*       as zero in this case.**********************************************************************//*===========================================================** Preamble.*=================*//*---------------------------------------------------** Header files.*-----------------*/#include <stdlib.h>#include <stdio.h>#include <math.h>#include <float.h>#ifdef __STDC__//# include <ieeefp.h>#endif/*-----------------------------------** HiSIM macros and structures.* - All inputs and outputs are defined here.*-----------------*/#include "hisim.h"#include "hsm1evalenv.h"/*===========================================================** Function hsm1eval. (HiSIM1.0.1)*=================*/#ifdef __STDC__int HSM1evaluate102( HiSIM_input     sIN, HiSIM_output    *pOT, HiSIM_messenger *pMS )#elseint HSM1evaluate102( sIN , pOT , pMS )      HiSIM_input     sIN ;     HiSIM_output    *pOT ;     HiSIM_messenger *pMS ;#endif{/*---------------------------------------------------** Local variables. *-----------------*//* Constans ----------------------- */int     lp_s0_max = 20 ;int     lp_sl_max = 20 ;int     lp_bs_max = 10 ;double  Ids_tol = 1.0e-10 ;double  Ids_maxvar = 1.0e-1 ;double  dP_max = 0.1e0 ;double  ps_conv = 5.0e-13 ;double  gs_conv = 1.0e-8 ;/** depletion **/double  znbd3 = 3.0e0 ;double  znbd5 = 5.0e0 ;double  cn_nc3 = C_SQRT_2 / 108e0 ;/* 5-degree, contact:Chi=5 */double  cn_nc51 =  0.707106781186548 ; /* sqrt(2)/2 */double  cn_nc52 = -0.117851130197758 ; /* -sqrt(2)/12 */double  cn_nc53 =  0.0178800506338833 ; /* (187 - 112*sqrt(2))/1600 */double  cn_nc54 = -0.00163730162779191 ; /* (-131 + 88*sqrt(2))/4000 */double  cn_nc55 =  6.36964918866352e-5 ; /* (1509-1040*sqrt(2))/600000 *//** inversion **//* 3-degree polynomial approx for ( exp[Chi]-1 )^{1/2} */double  cn_im53 =  2.9693154855770998e-1 ;double  cn_im54 = -7.0536542840097616e-2 ;double  cn_im55 =  6.1152888951331797e-3 ;/** initial guess **/double  c_ps0ini_2 = 8.0e-4 ;double  c_pslini_1 = 0.3e0 ;double  c_pslini_2 = 3.0e-2 ;double  VgVt_small = 1.0e-12 ;double  Vbs_max = 0.5e0 ; double  Vbs_min = -10.5e0 ;double  Vds_max = 10.5e0 ; double  Vgs_max = 10.5e0 ; double  Vbd_max = 20.0e0 ;double  Vbd_min = -10.0e0 ;double  epsm10 = 10.0e0 * C_EPS_M ;double  small = 1.0e-50 ;double  Gdsmin = 0.0e0 ;double  Gjmin = sIN.gmin ; /* modified by K.M. for SPICE3f5 */double  cclmmdf = 1.0e-1 ;double  qme_dlt = 1.0e-9 ;double  eef_dlt = 1.0e-2 ;double	sti_dlt = -3.0e-3 ;double  pol_dlt = 2.0e-1 ;/* Internal flags  --------------------*/int     flg_err = 0 ; /* error level */int     flg_ncnv = 0 ; /* Flag for negative conductance */int     flg_rsrd ; /* Flag for bias loop accounting Rs and Rd */int     flg_iprv ; /* Flag for initial guess of Ids */int     flg_pprv ; /* Flag for initial guesses of Ps0 and Pds */int     flg_noqi = 0 ; /* Flag for the cases regarding Qi=Qd=0 */int     flg_vbsc = 0 ; /* Flag for Vbs confining */int     flg_vdsc = 0 ; /* Flag for Vds confining */int     flg_vgsc = 0 ; /* Flag for Vgs confining */int     flg_vbdc = 0 ; /* Flag for Vbd confining */int     flg_vxxc = 0 ; /* Flag whether some bias was confined */int     flg_info = 0 ;  /* Important Variables in HiSIM -------*//* external bias */double  Vbse , Vdse , Vgse , Vbde ;/* confine bias */double  Vbsc , Vdsc , Vgsc , Vbdc ;double  Vbsc_dVbse = 1.0 ;/* internal bias */double  Vbs , Vds , Vgs ;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 = 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  = 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 = 0.0 ;double  Psl_dVbs = 0.0 , Psl_dVds = 0.0 , Psl_dVgs = 0.0 ;double  Psl_lim ;/* Pds := Psl - Ps0 */double  Pds = 0.0 ;double  Pds_dVbs = 0.0 , Pds_dVds = 0.0 , Pds_dVgs = 0.0 ;double  Pds_ini  = 0.0;double  Pds_max ;/* iteration numbers of Ps0 and Psl equations. */int     lp_s0 , lp_sl ;/* 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  Xi0p32_dVbs , Xi0p32_dVds , Xi0p32_dVgs ;/* Xil := beta * ( Psl - Vbs ) - 1. */double  Xilp12 ;double  Xilp32 ;double  Xil ;/* modified bias and potential for sym.*/double  Vbsz , Vdsz = 0.0, Vgsz = 0.0;double  Vbsz_dVbs , Vbsz_dVds ;double  Vdsz_dVds = 0.0 ;double  Vgsz_dVgs , Vgsz_dVds = 0.0 ;double  Vbs1 , Vbs2 , Vbsd ;double  Vbsd_dVbs , Vbsd_dVds ;double  Vzadd = 0.0 , Vzadd_dVds = 0.0;double  Ps0z , Ps0z_dVbs , Ps0z_dVds , Ps0z_dVgs ;double  Pzadd , Pzadd_dVbs , Pzadd_dVds , Pzadd_dVgs ;double  Ps0Vbsz , Ps0Vbsz_dVbs , Ps0Vbsz_dVds , Ps0Vbsz_dVgs ;double  Vgpz , Vgpz_dVbs , Vgpz_dVds , Vgpz_dVgs ;double  Xi0z ;double  Xi0z_dVbs , Xi0z_dVds , Xi0z_dVgs ;double  Xi0zp12 ;double  Xi0zp12_dVbs , Xi0zp12_dVds , Xi0zp12_dVgs ;/* Chi := beta * ( Ps{0/l} - Vbs ) */double  Chi ;double  Chi_dVbs , Chi_dVds , Chi_dVgs ;/* Rho := beta * ( Psl - Vds ) */double  Rho ;/* threshold voltage */double  Vth  = 0.0;double  Vth0 ;double  Vth0_dVbs , Vth0_dVds , Vth0_dVgs ;/* variation of threshold voltage */double  dVth  = 0.0;double  dVth_dVbs = 0.0 , dVth_dVds = 0.0 , dVth_dVgs = 0.0 ;double  dVth0 ;double  dVth0_dVbs , dVth0_dVds , dVth0_dVgs ;double  dVthSC ;double  dVthSC_dVbs , dVthSC_dVds , dVthSC_dVgs ;double  dVthW ;double  dVthW_dVbs , dVthW_dVds , dVthW_dVgs ;/* Alpha and related parameters */double  Alpha ;double  Alpha_dVbs , Alpha_dVds , Alpha_dVgs ;double  Achi = 0.0 ;double  Achi_dVbs , Achi_dVds , Achi_dVgs ;double  VgVt = 0.0 ;double  VgVt_dVbs , VgVt_dVds , VgVt_dVgs ;double  Delta  , Vdsat ;/* Q_B and capacitances */double  Qb = 0.0 , Qb_dVbs = 0.0 , Qb_dVds = 0.0 , Qb_dVgs = 0.0 ;double  Qb_dVbse , Qb_dVdse , Qb_dVgse ;/* Q_I and capacitances */double  Qi = 0.0 , Qi_dVbs = 0.0 , Qi_dVds = 0.0 , Qi_dVgs = 0.0 ;double  Qi_dVbse , Qi_dVdse , Qi_dVgse ;/* Q_D and capacitances */double  Qd = 0.0 , Qd_dVbs = 0.0 , Qd_dVds = 0.0 , Qd_dVgs = 0.0 ;double  Qd_dVbse , Qd_dVdse , Qd_dVgse ;/* channel current */double  Ids ;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 ;/* constants */double  beta ;double  beta2 ;double  Leff , Leff_inv ;double  Weff ;double  Ldby ;double  Nsub , q_Nsub ;double  Nin ;double  Pb2 ;double  Pb20 ;double  Pb2c ;double  Eg , Eg300 ;double  Vfb ;/* PART-1 */double  Psum ;double  Psum_dVbs ;double  Psum_dVds ;double  sqrt_Psum ;double  cnst0 , cnst1 ;double  fac1 ;double  fac1_dVbs , fac1_dVds , fac1_dVgs ;double  fac1p2 ;double  fs01 ;double  fs01_dPs0 , fs01_dChi ;double  fs01_dVbs , fs01_dVds , fs01_dVgs ;double  fs02 ;double  fs02_dPs0 , fs02_dChi ;double  fs02_dVbs , fs02_dVds , fs02_dVgs ;double  fsl1 ;double  fsl1_dPsl ;double  fsl1_dVbs , fsl1_dVds ;double  fsl2 ;double  fsl2_dPsl ;double  fsl2_dVbs , fsl2_dVds ;double  cfs1 ;double  fb , fb_dChi ;double  fi , fi_dChi ;double  exp_Chi , exp_Rho , exp_bVbs , exp_bVbsVds ;double  Fs0, Fsl ;double  Fs0_dPs0 , Fsl_dPsl ;double  dPs0 , dPsl ;double  Qn0 = 0.0 ;double  Qn0_dVbs , Qn0_dVds , Qn0_dVgs ;double  Qb0 ;double  Qb0_dVbs , Qb0_dVds , Qb0_dVgs = 0.0 ;double  Qn00 = 0.0 ;double  Qn00_dVbs = 0.0 , Qn00_dVds = 0.0 , Qn00_dVgs = 0.0 ;double  Qbnm ;double  Qbnm_dVbs , Qbnm_dVds , Qbnm_dVgs ;double  DtPds ;double  DtPds_dVbs , DtPds_dVds , DtPds_dVgs ;double  Qbm ;double  Qbm_dVbs , Qbm_dVds , Qbm_dVgs ;double  Qinm ;double  Qinm_dVbs , Qinm_dVds , Qinm_dVgs ;double  Qidn ;double  Qidn_dVbs , Qidn_dVds , Qidn_dVgs ;double  Qdnm ;double  Qdnm_dVbs , Qdnm_dVds , Qdnm_dVgs ;double  Qddn ;double  Qddn_dVbs , Qddn_dVds , Qddn_dVgs ;double  Quot ;double  Qdrat ;double  Qdrat_dVbs , Qdrat_dVds , Qdrat_dVgs ;double  Idd ;double  Idd_dVbs , Idd_dVds , Idd_dVgs ;double  Qnm ;double  Qnm_dVbs , Qnm_dVds , Qnm_dVgs ;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  Ey ;double  Ey_dVbs , Ey_dVds , Ey_dVgs ;double  Em ;double  Em_dVbs , Em_dVds , Em_dVgs ;double  Vmax ;double  Eta ;double  Eta_dVbs , Eta_dVds , Eta_dVgs ;double  Eta1 , Eta1p12 , Eta1p32 , Eta1p52 ;double  Zeta12 , Zeta32 , Zeta52 ;double  F00 ;double  F00_dVbs , F00_dVds , F00_dVgs ;double  F10 ;double  F10_dVbs , F10_dVds , F10_dVgs ;double  F30 ;double  F30_dVbs , F30_dVds , F30_dVgs ;double  F11 ;double  F11_dVbs , F11_dVds , F11_dVgs ;double  Ps0_min ;double  Acn , Acd , Ac1 , Ac2 , Ac3 , Ac4 , Ac31 , Ac41 ;double  Acn_dVbs , Acn_dVds , Acn_dVgs ;double  Acd_dVbs , Acd_dVds , Acd_dVgs ;double  Ac1_dVbs , Ac1_dVds , Ac1_dVgs ;double  Ac2_dVbs , Ac2_dVds , Ac2_dVgs ;double  Ac3_dVbs , Ac3_dVds , Ac3_dVgs ;double  Ac4_dVbs , Ac4_dVds , Ac4_dVgs ;double  Ac31_dVbs , Ac31_dVds , Ac31_dVgs ;/* PART-2 (Isub) */double  Isub ;double  Isub_dVbs , Isub_dVds , Isub_dVgs ;double  Isub_dVbse , Isub_dVdse , Isub_dVgse ;double  Vdep ;double  Vdep_dVbs , Vdep_dVds , Vdep_dVgs ;double  Epkf ;double  Epkf_dVbs , Epkf_dVds , Epkf_dVgs ;/* PART-3 (overlap) */double  yn , yn2 , yn3 ;double  yn_dVbs , yn_dVds , yn_dVgs ;double  Lov , Lov2;double  Qgos = 0.0 , Qgos_dVbs = 0.0 , Qgos_dVds = 0.0 , Qgos_dVgs = 0.0 ;double  Qgos_dVbse , Qgos_dVdse , Qgos_dVgse ;double  Qgod = 0.0 , Qgod_dVbs = 0.0 , Qgod_dVds = 0.0 , Qgod_dVgs = 0.0 ;double  Qgod_dVbse , Qgod_dVdse , Qgod_dVgse ;double  Cggo , Cgdo , Cgso , Cgbo ;/* fringing capacitance */double  Cf ;double  Qfd , Qfs ;/* PART-4 (junction diode) */double  Ibs , Ibd , Gbs , Gbd , Gbse , Gbde ;double  js ;double  jssw ;double  isbs ;double  isbd ;double  Nvtm ;/* junction capacitance */double  Qbs , Qbd , Capbs , Capbd , Capbse , Capbde ;double  czbd , czbdsw , czbdswg , czbs , czbssw , czbsswg ;double  arg , sarg ;/* PART-5 (noise) */double  NFalp , NFtrp , Cit , Nflic ;/* Bias iteration accounting Rs/Rd */int     lp_bs ;double  Ids_last ;double  vtol_iprv = 2.0e-1 ;double  vtol_pprv = 5.0e-2 ;double  Vbsc_dif = 0.0 , Vdsc_dif = 0.0 , Vgsc_dif = 0.0 , sum_vdif ;double  Rs , Rd ;double  Fbs , Fds , Fgs ;double  DJ , DJI = 0.0 ;double  JI11 , JI12 , JI13 , JI21 , JI22 , JI23 , JI31 , JI32 , JI33 ;double  dVbs = 0.0 , dVds = 0.0 , dVgs = 0.0 ;double  dV_sum ;/* Junction Bias */double  Vbsj , Vbdj ;/* Accumulation zone */double  Psa ;double  Psa_dVbs , Psa_dVds , Psa_dVgs ;/* CLM */double  Psdl = 0.0 , Psdl_dVbs = 0.0 , Psdl_dVds = 0.0 , Psdl_dVgs = 0.0 ;double  Ed , Ed_dVbs , Ed_dVds , Ed_dVgs ;double  Ec , Ec_dVbs , Ec_dVds , Ec_dVgs ;double  Lred = 0.0 , Lred_dVbs , Lred_dVds , Lred_dVgs ;double  Wd , Wd_dVbs , Wd_dVds , Wd_dVgs ;double  Aclm ;/* Pocket Implant */double Vthp, Vthp_dVbs, Vthp_dVds, Vthp_dVgs ;double dVthLP,dVthLP_dVbs,dVthLP_dVds,dVthLP_dVgs ;/* Poly-Depletion Effect */double dPpg = 0.0 , dPpg_dVds = 0.0 , dPpg_dVgs = 0.0 ;/* Quantum Effect */double Tox = 0.0 , Tox_dVbs = 0.0 , Tox_dVds = 0.0 , Tox_dVgs = 0.0 ;double dTox , dTox_dVbs , dTox_dVds , dTox_dVgs ;double Cox = 0.0 , Cox_dVbs , Cox_dVds , Cox_dVgs ;double Cox_inv , Cox_inv_dVbs , Cox_inv_dVds , Cox_inv_dVgs ;double Vthq, Vthq_dVbs , Vthq_dVds ;/* Igate , Igidl  */double  Egp12 , Egp32 ;double  E0 = 0.0 ;double  E1 , E1_dVbs , E1_dVds , E1_dVgs ;double  E2 , E2_dVbs , E2_dVds , E2_dVgs ;double  Etun , Etun_dVbs , Etun_dVds , Etun_dVgs ;double  Egidl , Egidl_dVbs , Egidl_dVds , Egidl_dVgs ;double  Igate , Igate_dVbs , Igate_dVds , Igate_dVgs ;double  Igate_dVbse , Igate_dVdse , Igate_dVgse ;double  Igidl , Igidl_dVbs , Igidl_dVds , Igidl_dVgs ;double  Igidl_dVbse , Igidl_dVdse , Igidl_dVgse ;double  Cox0 ;double  Lgate ;double  rp1 , rp1_dVds ;/* connecting function */double  FD2 = 0.0 , FD2_dVbs = 0.0 , FD2_dVds = 0.0 , FD2_dVgs = 0.0 ;double  FMD , FMD_dVds = 0.0 ;/* Phonon scattering */double	Wgate ;double	mueph ;/* temporary vars. */double  T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ;double  TX , TX_dVbs , TX_dVds , TX_dVgs ;double  TY , TY_dVbs , TY_dVds , TY_dVgs ;double  T1_dVbs , T1_dVds , T1_dVgs ;double  T2_dVbs , T2_dVds , T2_dVgs ;double  T3_dVbs , T3_dVds , T3_dVgs ;double  T4_dVbs , T4_dVds;double  T7_dVbs , T7_dVds , T7_dVgs ;double  T8_dVbs , T8_dVds , T8_dVgs ;double  T10 , T20 , T21 , T30 , T31 ;/* intrinsic fringing capacitance */double	Cgdf, Cgdfring ;/*================ Start of executable code.=================*/    flg_info = sIN.info ;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?