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 + -
显示快捷键?