📄 hsm1eval1_1.c
字号:
/*********************************************************************** HiSIM v1.1.0 File: hsm1eval1_1.c of HiSIM v1.1.0 Copyright (C) 2002 STARC June 30, 2002: developed by Hiroshima University and STARC June 30, 2002: posted by Keiichi MORIKAWA, STARC Physical Design Group***********************************************************************//* * Modified by Paolo Nenzi 2002 * ngspice integration *//********************************************************************** 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, Igs, Ilg. * . 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>/*-----------------------------------** HiSIM macros and structures.* - All inputs and outputs are defined here.*-----------------*/#include "hisim.h"#include "hsm1evalenv.h"/*===========================================================** Function hsm1eval.*=================*/int HSM1evaluate1_1( HiSIM_input sIN, HiSIM_output *pOT, HiSIM_messenger *pMS) {/*---------------------------------------------------** 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-dgree 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 ;/* 3-dgree polynomial approx for ( exp[Chi]-Chi-1 )^{1/2} */double cn_ik53 = 2.6864599830664019e-1 ;double cn_ik54 = -6.1399531828413338e-2 ;double cn_ik55 = 5.3528499428744690e-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 Vz_dlt = 5.0e-3 ;/*-----*/double Gdsmin = 1.0e-12 ;/*-----*//* double Gjmin = 1.0e-12 ; */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 sti1_dlt = -3.0e-3 ;double sti2_dlt = 2.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 ; /* 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 Vgs 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 ;double Vgp_dVbs , Vgp_dVds , Vgp_dVgs ;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 ;/* Psl : surface potential at the drain side */double Psl ;double Psl_dVbs , Psl_dVds , Psl_dVgs ;double Psl_lim ;/* Pds := Psl - Ps0 */double Pds ;double Pds_dVbs , Pds_dVds , Pds_dVgs ;double Pds_ini ;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 , Vgsz ;double Vbsz_dVbs , Vbsz_dVds ;double Vdsz_dVds ;double Vgsz_dVgs , Vgsz_dVds ;double Vbszm ; double Vbszm_dVbs , Vbszm_dVds ;double Vbs1 , Vbs2 , Vbsd ;double Vbsd_dVbs , Vbsd_dVds ;double Vzadd , Vzadd_dVds , Vzadd_dA ;double VzaddA , VzaddA_dVds ;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 ;double Vth_dVbs , Vth_dVds , Vth_dVgs ;double Vth0 ;double Vth0_dVbs , Vth0_dVds , Vth0_dVgs ;/* variation of threshold voltage */double dVth ;double dVth_dVbs , dVth_dVds , dVth_dVgs ;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 ;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 , Qb_dVbs , Qb_dVds , Qb_dVgs ;double Qb_dVbse , Qb_dVdse , Qb_dVgse ;/* Q_I and capacitances */double Qi , Qi_dVbs , Qi_dVds , Qi_dVgs ;double Qi_dVbse , Qi_dVdse , Qi_dVgse ;/* Q_D and capacitances */double Qd , Qd_dVbs , Qd_dVds , Qd_dVgs ;double Qd_dVbse , Qd_dVdse , Qd_dVgse ;/* channel current */double Ids ;double Ids_dVbs , Ids_dVds , Ids_dVgs ;double Ids_dVbse , Ids_dVdse , Ids_dVgse ;double Ids0 ;double Ids0_dVbs , Ids0_dVds , Ids0_dVgs ;/* STI */double Vgssti ;double Vgssti_dVbs , Vgssti_dVds , Vgssti_dVgs ;double costi0 , costi1 , costi2 , costi3 ;double costi4 , costi5 , costi6 , costi7 ;double Psasti ;double Psasti_dVbs , Psasti_dVds , Psasti_dVgs ;double Asti ;double Psbsti ;double Psbsti_dVbs , Psbsti_dVds , Psbsti_dVgs ;double Psab ;double Psab_dVbs , Psab_dVds , Psab_dVgs ;double Psti ;double Psti_dVbs , Psti_dVds , Psti_dVgs ;double expsti ;double sq1sti ;double sq1sti_dVbs , sq1sti_dVds , sq1sti_dVgs ;double sq2sti ;double sq2sti_dVbs , sq2sti_dVds , sq2sti_dVgs ;double Qn0sti ;double Qn0sti_dVbs , Qn0sti_dVds , Qn0sti_dVgs ;double Idssti ;double Idssti_dVbs , Idssti_dVds , Idssti_dVgs ;/* (for debug) */double user1 , user2 , user3 , user4 ;/* constants ------- */double beta ;double beta2 ;/* device instances */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 ;double Qn0_dVbs , Qn0_dVds , Qn0_dVgs ;double Qb0 ;double Qb0_dVbs , Qb0_dVds , Qb0_dVgs ;double Qn00 ;double Qn00_dVbs , Qn00_dVds , Qn00_dVgs ;/* unused:* double Qnl ;*//*-----*/double Qbnm ;double Qbnm_dVbs , Qbnm_dVds , Qbnm_dVgs ;double DtPds ;double DtPds_dVbs , DtPds_dVds , DtPds_dVgs ;/*-----*/double Fid2 ;double Fid2_dVbs , Fid2_dVds , Fid2_dVgs ;double Fid3 ;double Fid3_dVbs , Fid3_dVds , Fid3_dVgs ;double Fid4 ;double Fid4_dVbs , Fid4_dVds , Fid4_dVgs ;double Fid5 ;double Fid5_dVbs , Fid5_dVds , Fid5_dVgs ;/*-----*/double PVds0 ;double XiVds0 ;double XiVds0p12 ;double XiVds0p12_dVbs , XiVds0p12_dVds , XiVds0p12_dVgs ;double XiVds0p32 ;double XiVds0p32_dVbs , XiVds0p32_dVds , XiVds0p32_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 ;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 yned , yned2 ;double yned_dVbs , yned_dVds , yned_dVgs ;double Lov , Lov2 , Lov23 ; double Ndsat , Gjnp; double Qgos , Qgos_dVbs , Qgos_dVds , Qgos_dVgs ;double Qgos_dVbse , Qgos_dVdse , Qgos_dVgse ;double Qgod , Qgod_dVbs , Qgod_dVds , Qgod_dVgs ;double Qgod_dVbse , Qgod_dVdse , Qgod_dVgse ;double Cggo , Cgdo , Cgso , Cgbo ;/* fringing capacitance */double Cf ;double Qfd , Qfs ;/* Cqy */double Pslk , Pslk_dVbs , Pslk_dVds , Pslk_dVgs ;double Qy ;double Cqyd, Cqyg, Cqys, Cqyb ;double qy_dlt ;/* 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) *//* matsu */double NFalp , NFtrp , Freq , 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 , Vdsc_dif , Vgsc_dif , sum_vdif ;double Rs , Rd ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -