⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hsm1eval1_1.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 5 页
字号:
/*********************************************************************** 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 + -