diff --git a/src/spicelib/devices/adms/bsimbulk/admsva/bsimbulk.va b/src/spicelib/devices/adms/bsimbulk/admsva/bsimbulk.va index 591daff4b..11c13895f 100644 --- a/src/spicelib/devices/adms/bsimbulk/admsva/bsimbulk.va +++ b/src/spicelib/devices/adms/bsimbulk/admsva/bsimbulk.va @@ -189,7 +189,7 @@ `define BSIMBULKRdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEnd, rgeo, SRCFLAG, Rend) \ if (SRCFLAG == 1) begin \ - case(rgeo) \ + case (rgeo) \ 1, 2, 5: begin \ if (nuEnd == 0.0) begin \ Rend = 0.0; \ @@ -213,7 +213,7 @@ end \ endcase \ end else begin \ - case(rgeo) \ + case (rgeo) \ 1, 3, 7: begin \ if (nuEnd == 0.0) begin \ Rend = 0.0; \ @@ -242,7 +242,7 @@ `define BSIMBULKRdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEnd, rgeo, SRCFLAG, Rend) \ begin \ if (SRCFLAG == 1) begin \ - case(rgeo) \ + case (rgeo) \ 1, 2, 5: begin \ if (nuEnd == 0.0) begin \ Rend = 0.0; \ @@ -267,7 +267,7 @@ end \ endcase \ end else begin \ - case(rgeo) \ + case (rgeo) \ 1, 3, 7: begin \ if (nuEnd == 0.0) begin \ Rend = 0.0; \ @@ -314,7 +314,7 @@ end \ end \ end \ - case(geo) \ + case (geo) \ 0: begin \ if (SRCFLAG == 1) begin \ `BSIMBULKRdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEndS, \ @@ -457,7 +457,7 @@ ADsha = DMCG * Weffcj;\ ASmer = DMDG * Weffcj; \ ADmer = DMDG * Weffcj; \ - case(geo) \ + case (geo) \ 0: begin \ Ps = nuEndS * PSiso + nuIntS * PSsha;\ Pd = nuEndD * PDiso + nuIntD * PDsha;\ @@ -2770,7 +2770,7 @@ analog begin end if (ASYMMOD != 0) begin VSATR_t = VSATR_i * pow(TRatio, -AT_i); - if(VSATR_t < 100.0) begin + if (VSATR_t < 100.0) begin $strobe("Warning: VSATR(%f) = %e is less than 100, setting it to 100.", DevTemp, VSATR_t); VSATR_t = 100.0; end @@ -3335,7 +3335,7 @@ analog begin // Channel length modulation, Ref: BSIM4 Model Vasat = Vdssat + EsatL; - if(PCLM_a != 0.0) begin + if (PCLM_a != 0.0) begin if (PCLMG < 0.0) begin T1 = PCLM_a / (1.0 - PCLMG * qia / EsatL) / Fp; end else begin @@ -3792,7 +3792,7 @@ analog begin T0d = (Nl + Nstar) * (Nl + Nstar); T0e = NOIA * `q * Vt; if (FNOIMOD == 1) begin - if(LINTNOI >= (Leff - LH) / 2.0) begin + if (LINTNOI >= (Leff - LH) / 2.0) begin $strobe("Warning: LINTNOI = %e is too large - Leff for noise is negative. Re-setting LINTNOI = 0.", LINTNOI); LINTNOI_i = 0.0; end else begin diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg.va b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg.va index 5f15f3875..42ef83a14 100644 --- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg.va +++ b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg.va @@ -4,7 +4,7 @@ // ******************************************************** // // ******************************************************** -// * Copyright 2016 Regents of the University of California. +// * Copyright 2016 Regents of the University of California. // * All rights reserved. // * // * Project Director: Prof. Chenming Hu. @@ -18,7 +18,7 @@ // support. The University of California and its employees are not liable // for the condition or performance of the software. // The University of California owns the copyright and grants users a perpetual, -// irrevocable, worldwide, non-exclusive, royalty-free license with +// irrevocable, worldwide, non-exclusive, royalty-free license with // respect to the software as set forth below. // The University of California hereby disclaims all implied warranties. // The University of California grants the users the right to modify, copy, @@ -35,8 +35,8 @@ // the software on any copy or modification of such made available // to others // Agreed to on __Jan 01, 2016__________________ -// By: ___University of California, Berkeley____ -// ___Chenming Hu_____________________ +// By: ___University of California, Berkeley____ +// ___Chenming Hu_____________________ // ___Professor in Graduate School _______ // ******************************************************** @@ -65,7 +65,7 @@ // // In Verilog-A the number of internal nodes cannot be controlled by // a model parameter. Therefore we use `define statements -// to control it. Comment the following lines whenever +// to control it. Comment the following lines whenever // possible for best computational efficiency. `define __OPINFO__ `define __DEBUG__ @@ -81,35 +81,35 @@ module bsimcmg(d, g, s, e, t); - inout g, d, s, e, t; - electrical g, d, s, e; - electrical si, di; + inout g, d, s, e, t; + electrical g, d, s, e; + electrical si, di; `ifdef __NQSMOD1__ - electrical gi; + electrical gi; `endif `ifdef __NQSMOD2__ - electrical q; + electrical q; `endif `ifdef __RGATEMOD__ - electrical ge; + electrical ge; `endif `ifdef __SHMOD__ - thermal t; - branch (t) rth_branch; - branch (t) ith_branch; + thermal t; + branch (t) rth_branch; + branch (t) ith_branch; `else - thermal t; -`endif + thermal t; +`endif -// Internal node controlled by Correlated Thermal Noise Switch + // Internal node controlled by Correlated Thermal Noise Switch `ifdef __TNOIMOD1__ electrical N; `endif - + `include "bsimcmg_body.include" diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_binning_parameters.include b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_binning_parameters.include index f55c5d9ed..c620ceb04 100644 --- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_binning_parameters.include +++ b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_binning_parameters.include @@ -4,11 +4,11 @@ // ******************************************************** // // ******************************************************** -// * Copyright 2016 Regents of the University of California. +// * Copyright 2016 Regents of the University of California. // * All rights reserved. // * // * Project Director: Prof. Chenming Hu. -// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal +// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Darsen Lu, Sourabh Khandelwal // * Chung-Hsun Lin, Mohan Dunga, Shijing Yao, // * Ali Niknejad, Chenming Hu // ******************************************************** @@ -18,7 +18,7 @@ // support. The University of California and its employees are not liable // for the condition or performance of the software. // The University of California owns the copyright and grants users a perpetual, -// irrevocable, worldwide, non-exclusive, royalty-free license with +// irrevocable, worldwide, non-exclusive, royalty-free license with // respect to the software as set forth below. // The University of California hereby disclaims all implied warranties. // The University of California grants the users the right to modify, copy, @@ -35,722 +35,722 @@ // the software on any copy or modification of such made available // to others // Agreed to on __Jan 01, 2016_________________ -// By: ___University of California, Berkeley____ -// ___Chenming Hu_____________________ +// By: ___University of California, Berkeley____ +// ___Chenming Hu_____________________ // ___Professor in Graduate School _______ // ******************************************************** -`MPRnb( LNBODY ,0.0 ,"m^-2" ,"" ) -`MPRnb( NNBODY ,0.0 ,"m^-2" ,"" ) -`MPRnb( PNBODY ,0.0 ,"m^-1" ,"" ) +`MPRnb( LNBODY ,0.0 ,"m^-2" ,"" ) +`MPRnb( NNBODY ,0.0 ,"m^-2" ,"" ) +`MPRnb( PNBODY ,0.0 ,"m^-1" ,"" ) -`MPRnb( LPHIG ,0.0 ,"m*eV" ,"" ) -`MPRnb( NPHIG ,0.0 ,"m*eV" ,"" ) -`MPRnb( PPHIG ,0.0 ,"(m^2)*eV" ,"" ) +`MPRnb( LPHIG ,0.0 ,"m*eV" ,"" ) +`MPRnb( NPHIG ,0.0 ,"m*eV" ,"" ) +`MPRnb( PPHIG ,0.0 ,"(m^2)*eV" ,"" ) -`MPRnb( LNGATE ,0.0 ,"m^-2" ,"" ) -`MPRnb( NNGATE ,0.0 ,"m^-2" ,"" ) -`MPRnb( PNGATE ,0.0 ,"m^-1" ,"" ) +`MPRnb( LNGATE ,0.0 ,"m^-2" ,"" ) +`MPRnb( NNGATE ,0.0 ,"m^-2" ,"" ) +`MPRnb( PNGATE ,0.0 ,"m^-1" ,"" ) -`MPRnb( LCIT ,0.0 ,"F/m" ,"" ) -`MPRnb( NCIT ,0.0 ,"F/m" ,"" ) -`MPRnb( PCIT ,0.0 ,"F" ,"" ) +`MPRnb( LCIT ,0.0 ,"F/m" ,"" ) +`MPRnb( NCIT ,0.0 ,"F/m" ,"" ) +`MPRnb( PCIT ,0.0 ,"F" ,"" ) `MPRnb( LCITR ,LCIT ,"" ,"" ) -`MPRnb( NCITR ,NCIT ,"" ,"" ) -`MPRnb( PCITR ,PCIT ,"" ,"" ) +`MPRnb( NCITR ,NCIT ,"" ,"" ) +`MPRnb( PCITR ,PCIT ,"" ,"" ) -`MPRnb( LCDSC ,0.0 ,"F/m" ,"" ) -`MPRnb( NCDSC ,0.0 ,"F/m" ,"" ) -`MPRnb( PCDSC ,0.0 ,"F" ,"" ) +`MPRnb( LCDSC ,0.0 ,"F/m" ,"" ) +`MPRnb( NCDSC ,0.0 ,"F/m" ,"" ) +`MPRnb( PCDSC ,0.0 ,"F" ,"" ) -`MPRnb( LCDSCD ,0.0 ,"F/m" ,"" ) -`MPRnb( NCDSCD ,0.0 ,"F/m" ,"" ) -`MPRnb( PCDSCD ,0.0 ,"F" ,"" ) +`MPRnb( LCDSCD ,0.0 ,"F/m" ,"" ) +`MPRnb( NCDSCD ,0.0 ,"F/m" ,"" ) +`MPRnb( PCDSCD ,0.0 ,"F" ,"" ) -`MPRnb( LCDSCDR ,LCDSCD ,"F/m" ,"" ) -`MPRnb( NCDSCDR ,NCDSCD ,"F/m" ,"" ) -`MPRnb( PCDSCDR ,PCDSCD ,"F" ,"" ) +`MPRnb( LCDSCDR ,LCDSCD ,"F/m" ,"" ) +`MPRnb( NCDSCDR ,NCDSCD ,"F/m" ,"" ) +`MPRnb( PCDSCDR ,PCDSCD ,"F" ,"" ) -`MPRnb( LDVT0 ,0.0 ,"" ,"" ) -`MPRnb( NDVT0 ,0.0 ,"" ,"" ) -`MPRnb( PDVT0 ,0.0 ,"" ,"" ) +`MPRnb( LDVT0 ,0.0 ,"" ,"" ) +`MPRnb( NDVT0 ,0.0 ,"" ,"" ) +`MPRnb( PDVT0 ,0.0 ,"" ,"" ) -`MPRnb( LDVT1 ,0.0 ,"" ,"" ) -`MPRnb( NDVT1 ,0.0 ,"" ,"" ) -`MPRnb( PDVT1 ,0.0 ,"" ,"" ) +`MPRnb( LDVT1 ,0.0 ,"" ,"" ) +`MPRnb( NDVT1 ,0.0 ,"" ,"" ) +`MPRnb( PDVT1 ,0.0 ,"" ,"" ) -`MPRnb( LDVT1SS ,LDVT1 ,"" ,"" ) -`MPRnb( NDVT1SS ,NDVT1 ,"" ,"" ) -`MPRnb( PDVT1SS ,PDVT1 ,"" ,"" ) +`MPRnb( LDVT1SS ,LDVT1 ,"" ,"" ) +`MPRnb( NDVT1SS ,NDVT1 ,"" ,"" ) +`MPRnb( PDVT1SS ,PDVT1 ,"" ,"" ) -`MPRnb( LPHIN ,0.0 ,"m*V" ,"" ) -`MPRnb( NPHIN ,0.0 ,"m*V" ,"" ) -`MPRnb( PPHIN ,0.0 ,"(m^2)*V" ,"" ) +`MPRnb( LPHIN ,0.0 ,"m*V" ,"" ) +`MPRnb( NPHIN ,0.0 ,"m*V" ,"" ) +`MPRnb( PPHIN ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( LETA0 ,0.0 ,"" ,"" ) -`MPRnb( NETA0 ,0.0 ,"" ,"" ) -`MPRnb( PETA0 ,0.0 ,"" ,"" ) +`MPRnb( LETA0 ,0.0 ,"" ,"" ) +`MPRnb( NETA0 ,0.0 ,"" ,"" ) +`MPRnb( PETA0 ,0.0 ,"" ,"" ) -`MPRnb( LETA0R ,LETA0 ,"" ,"" ) -`MPRnb( NETA0R ,NETA0 ,"" ,"" ) -`MPRnb( PETA0R ,PETA0 ,"" ,"" ) +`MPRnb( LETA0R ,LETA0 ,"" ,"" ) +`MPRnb( NETA0R ,NETA0 ,"" ,"" ) +`MPRnb( PETA0R ,PETA0 ,"" ,"" ) -`MPRnb( LDSUB ,0.0 ,"" ,"" ) -`MPRnb( NDSUB ,0.0 ,"" ,"" ) -`MPRnb( PDSUB ,0.0 ,"" ,"" ) +`MPRnb( LDSUB ,0.0 ,"" ,"" ) +`MPRnb( NDSUB ,0.0 ,"" ,"" ) +`MPRnb( PDSUB ,0.0 ,"" ,"" ) -`MPRnb( LK1RSCE ,0.0 ,"m*V^(1/2)" ,"" ) -`MPRnb( NK1RSCE ,0.0 ,"m*V^(1/2)" ,"" ) -`MPRnb( PK1RSCE ,0.0 ,"(m^2)*V^(1/2)" ,"" ) +`MPRnb( LK1RSCE ,0.0 ,"m*V^(1/2)" ,"" ) +`MPRnb( NK1RSCE ,0.0 ,"m*V^(1/2)" ,"" ) +`MPRnb( PK1RSCE ,0.0 ,"(m^2)*V^(1/2)" ,"" ) -`MPRnb( LLPE0 ,0.0 ,"m^2" ,"" ) -`MPRnb( NLPE0 ,0.0 ,"m^2" ,"" ) -`MPRnb( PLPE0 ,0.0 ,"m^3" ,"" ) +`MPRnb( LLPE0 ,0.0 ,"m^2" ,"" ) +`MPRnb( NLPE0 ,0.0 ,"m^2" ,"" ) +`MPRnb( PLPE0 ,0.0 ,"m^3" ,"" ) -`MPRnb( LDVTSHIFT ,0.0 ,"m*V" ,"" ) -`MPRnb( NDVTSHIFT ,0.0 ,"m*V" ,"" ) -`MPRnb( PDVTSHIFT ,0.0 ,"(m^2)*V" ,"" ) +`MPRnb( LDVTSHIFT ,0.0 ,"m*V" ,"" ) +`MPRnb( NDVTSHIFT ,0.0 ,"m*V" ,"" ) +`MPRnb( PDVTSHIFT ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( LDVTSHIFTR ,LDVTSHIFT ,"" ,"" ) -`MPRnb( NDVTSHIFTR ,NDVTSHIFT ,"" ,"" ) -`MPRnb( PDVTSHIFTR ,PDVTSHIFT ,"" ,"" ) +`MPRnb( LDVTSHIFTR ,LDVTSHIFT ,"" ,"" ) +`MPRnb( NDVTSHIFTR ,NDVTSHIFT ,"" ,"" ) +`MPRnb( PDVTSHIFTR ,PDVTSHIFT ,"" ,"" ) -`MPRnb( LPHIBE ,0.0 ,"m*V" ,"" ) -`MPRnb( NPHIBE ,0.0 ,"m*V" ,"" ) -`MPRnb( PPHIBE ,0.0 ,"(m^2)*V" ,"" ) +`MPRnb( LPHIBE ,0.0 ,"m*V" ,"" ) +`MPRnb( NPHIBE ,0.0 ,"m*V" ,"" ) +`MPRnb( PPHIBE ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( LK0 ,0.0 ,"m*V" ,"" ) -`MPRnb( NK0 ,0.0 ,"m*V" ,"" ) -`MPRnb( PK0 ,0.0 ,"(m^2)*V" ,"" ) +`MPRnb( LK0 ,0.0 ,"m*V" ,"" ) +`MPRnb( NK0 ,0.0 ,"m*V" ,"" ) +`MPRnb( PK0 ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( LK01 ,0.0 ,"(m*V)/K" ,"" ) -`MPRnb( NK01 ,0.0 ,"(m*V)/K" ,"" ) -`MPRnb( PK01 ,0.0 ,"(m^2*V)/K" ,"" ) +`MPRnb( LK01 ,0.0 ,"(m*V)/K" ,"" ) +`MPRnb( NK01 ,0.0 ,"(m*V)/K" ,"" ) +`MPRnb( PK01 ,0.0 ,"(m^2*V)/K" ,"" ) -`MPRnb( LK0SI ,0.0 ,"" ,"" ) -`MPRnb( NK0SI ,0.0 ,"" ,"" ) -`MPRnb( PK0SI ,0.0 ,"" ,"" ) +`MPRnb( LK0SI ,0.0 ,"" ,"" ) +`MPRnb( NK0SI ,0.0 ,"" ,"" ) +`MPRnb( PK0SI ,0.0 ,"" ,"" ) -`MPRnb( LK0SI1 ,0.0 ,"m/K" ,"" ) -`MPRnb( NK0SI1 ,0.0 ,"m/K" ,"" ) -`MPRnb( PK0SI1 ,0.0 ,"(m^2)/K" ,"" ) +`MPRnb( LK0SI1 ,0.0 ,"m/K" ,"" ) +`MPRnb( NK0SI1 ,0.0 ,"m/K" ,"" ) +`MPRnb( PK0SI1 ,0.0 ,"(m^2)/K" ,"" ) -`MPRnb( LK1 ,0.0 ,"m*V^(1/2)" ,"" ) -`MPRnb( NK1 ,0.0 ,"m*V^(1/2)" ,"" ) -`MPRnb( PK1 ,0.0 ,"(m^2)*V^(1/2)" ,"" ) +`MPRnb( LK1 ,0.0 ,"m*V^(1/2)" ,"" ) +`MPRnb( NK1 ,0.0 ,"m*V^(1/2)" ,"" ) +`MPRnb( PK1 ,0.0 ,"(m^2)*V^(1/2)" ,"" ) -`MPRnb( LK11 ,0.0 ,"(m*V^(-1/2))/K" ,"" ) -`MPRnb( NK11 ,0.0 ,"(m*V^(-1/2))/K" ,"" ) -`MPRnb( PK11 ,0.0 ,"(m^2*V^(-1/2))/K" ,"" ) +`MPRnb( LK11 ,0.0 ,"(m*V^(-1/2))/K" ,"" ) +`MPRnb( NK11 ,0.0 ,"(m*V^(-1/2))/K" ,"" ) +`MPRnb( PK11 ,0.0 ,"(m^2*V^(-1/2))/K" ,"" ) -`MPRnb( LK2SI ,LK0SI ,"" ,"" ) -`MPRnb( NK2SI ,NK0SI ,"" ,"" ) -`MPRnb( PK2SI ,PK0SI ,"" ,"" ) +`MPRnb( LK2SI ,LK0SI ,"" ,"" ) +`MPRnb( NK2SI ,NK0SI ,"" ,"" ) +`MPRnb( PK2SI ,PK0SI ,"" ,"" ) -`MPRnb( LK2SI1 ,LK0SI1 ,"" ,"" ) -`MPRnb( NK2SI1 ,NK0SI1 ,"" ,"" ) -`MPRnb( PK2SI1 ,PK0SI1 ,"" ,"" ) +`MPRnb( LK2SI1 ,LK0SI1 ,"" ,"" ) +`MPRnb( NK2SI1 ,NK0SI1 ,"" ,"" ) +`MPRnb( PK2SI1 ,PK0SI1 ,"" ,"" ) -`MPRnb( LK0SISAT ,0.0 ,"" ,"" ) -`MPRnb( NK0SISAT ,0.0 ,"" ,"" ) -`MPRnb( PK0SISAT ,0.0 ,"" ,"" ) +`MPRnb( LK0SISAT ,0.0 ,"" ,"" ) +`MPRnb( NK0SISAT ,0.0 ,"" ,"" ) +`MPRnb( PK0SISAT ,0.0 ,"" ,"" ) -`MPRnb( LK0SISAT1 ,0.0 ,"" ,"" ) -`MPRnb( NK0SISAT1 ,0.0 ,"" ,"" ) -`MPRnb( PK0SISAT1 ,0.0 ,"" ,"" ) +`MPRnb( LK0SISAT1 ,0.0 ,"" ,"" ) +`MPRnb( NK0SISAT1 ,0.0 ,"" ,"" ) +`MPRnb( PK0SISAT1 ,0.0 ,"" ,"" ) -`MPRnb( LK2SISAT ,LK0SISAT ,"" ,"" ) -`MPRnb( NK2SISAT ,NK0SISAT ,"" ,"" ) -`MPRnb( PK2SISAT ,PK0SISAT ,"" ,"" ) +`MPRnb( LK2SISAT ,LK0SISAT ,"" ,"" ) +`MPRnb( NK2SISAT ,NK0SISAT ,"" ,"" ) +`MPRnb( PK2SISAT ,PK0SISAT ,"" ,"" ) -`MPRnb( LK2SISAT1 ,LK0SISAT1 ,"" ,"" ) -`MPRnb( NK2SISAT1 ,NK0SISAT1 ,"" ,"" ) -`MPRnb( PK2SISAT1 ,PK0SISAT1 ,"" ,"" ) +`MPRnb( LK2SISAT1 ,LK0SISAT1 ,"" ,"" ) +`MPRnb( NK2SISAT1 ,NK0SISAT1 ,"" ,"" ) +`MPRnb( PK2SISAT1 ,PK0SISAT1 ,"" ,"" ) -`MPRnb( LK2SAT ,0.0 ,"" ,"" ) -`MPRnb( NK2SAT ,0.0 ,"" ,"" ) -`MPRnb( PK2SAT ,0.0 ,"" ,"" ) +`MPRnb( LK2SAT ,0.0 ,"" ,"" ) +`MPRnb( NK2SAT ,0.0 ,"" ,"" ) +`MPRnb( PK2SAT ,0.0 ,"" ,"" ) -`MPRnb( LK2SAT1 ,0.0 ,"" ,"" ) -`MPRnb( NK2SAT1 ,0.0 ,"" ,"" ) -`MPRnb( PK2SAT1 ,0.0 ,"" ,"" ) +`MPRnb( LK2SAT1 ,0.0 ,"" ,"" ) +`MPRnb( NK2SAT1 ,0.0 ,"" ,"" ) +`MPRnb( PK2SAT1 ,0.0 ,"" ,"" ) -`MPRnb( LK2 ,0.0 ,"" ,"" ) -`MPRnb( NK2 ,0.0 ,"" ,"" ) -`MPRnb( PK2 ,0.0 ,"" ,"" ) +`MPRnb( LK2 ,0.0 ,"" ,"" ) +`MPRnb( NK2 ,0.0 ,"" ,"" ) +`MPRnb( PK2 ,0.0 ,"" ,"" ) -`MPRnb( LK21 ,0.0 ,"" ,"" ) -`MPRnb( NK21 ,0.0 ,"" ,"" ) -`MPRnb( PK21 ,0.0 ,"" ,"" ) +`MPRnb( LK21 ,0.0 ,"" ,"" ) +`MPRnb( NK21 ,0.0 ,"" ,"" ) +`MPRnb( PK21 ,0.0 ,"" ,"" ) -`MPRnb( LDVTB ,0.0 ,"" ,"" ) -`MPRnb( NDVTB ,0.0 ,"" ,"" ) -`MPRnb( PDVTB ,0.0 ,"" ,"" ) +`MPRnb( LDVTB ,0.0 ,"" ,"" ) +`MPRnb( NDVTB ,0.0 ,"" ,"" ) +`MPRnb( PDVTB ,0.0 ,"" ,"" ) -`MPRnb( LLPEB ,0.0 ,"" ,"" ) -`MPRnb( NLPEB ,0.0 ,"" ,"" ) -`MPRnb( PLPEB ,0.0 ,"" ,"" ) +`MPRnb( LLPEB ,0.0 ,"" ,"" ) +`MPRnb( NLPEB ,0.0 ,"" ,"" ) +`MPRnb( PLPEB ,0.0 ,"" ,"" ) -`MPRnb( LQMFACTOR ,0.0 ,"" ,"" ) -`MPRnb( NQMFACTOR ,0.0 ,"" ,"" ) -`MPRnb( PQMFACTOR ,0.0 ,"" ,"" ) +`MPRnb( LQMFACTOR ,0.0 ,"" ,"" ) +`MPRnb( NQMFACTOR ,0.0 ,"" ,"" ) +`MPRnb( PQMFACTOR ,0.0 ,"" ,"" ) -`MPRnb( LQMTCENCV ,0.0 ,"" ,"" ) -`MPRnb( NQMTCENCV ,0.0 ,"" ,"" ) -`MPRnb( PQMTCENCV ,0.0 ,"" ,"" ) +`MPRnb( LQMTCENCV ,0.0 ,"" ,"" ) +`MPRnb( NQMTCENCV ,0.0 ,"" ,"" ) +`MPRnb( PQMTCENCV ,0.0 ,"" ,"" ) -`MPRnb( LQMTCENCVA ,0.0 ,"" ,"" ) -`MPRnb( NQMTCENCVA ,0.0 ,"" ,"" ) -`MPRnb( PQMTCENCVA ,0.0 ,"" ,"" ) +`MPRnb( LQMTCENCVA ,0.0 ,"" ,"" ) +`MPRnb( NQMTCENCVA ,0.0 ,"" ,"" ) +`MPRnb( PQMTCENCVA ,0.0 ,"" ,"" ) -`MPRnb( LVSAT ,0.0 ,"(m^2)/s" ,"" ) -`MPRnb( NVSAT ,0.0 ,"(m^2)/s" ,"" ) -`MPRnb( PVSAT ,0.0 ,"(m^3)/s" ,"" ) +`MPRnb( LVSAT ,0.0 ,"(m^2)/s" ,"" ) +`MPRnb( NVSAT ,0.0 ,"(m^2)/s" ,"" ) +`MPRnb( PVSAT ,0.0 ,"(m^3)/s" ,"" ) -`MPRnb( LVSATR ,LVSAT ,"" ,"" ) -`MPRnb( NVSATR ,NVSAT ,"" ,"" ) -`MPRnb( PVSATR ,PVSAT ,"" ,"" ) +`MPRnb( LVSATR ,LVSAT ,"" ,"" ) +`MPRnb( NVSATR ,NVSAT ,"" ,"" ) +`MPRnb( PVSATR ,PVSAT ,"" ,"" ) -`MPRnb( LVSAT1 ,LVSAT ,"" ,"" ) -`MPRnb( NVSAT1 ,NVSAT ,"" ,"" ) -`MPRnb( PVSAT1 ,PVSAT ,"" ,"" ) +`MPRnb( LVSAT1 ,LVSAT ,"" ,"" ) +`MPRnb( NVSAT1 ,NVSAT ,"" ,"" ) +`MPRnb( PVSAT1 ,PVSAT ,"" ,"" ) -`MPRnb( LVSAT1R ,LVSAT1 ,"(m^2)/s" ,"" ) -`MPRnb( NVSAT1R ,NVSAT1 ,"(m^2)/s" ,"" ) -`MPRnb( PVSAT1R ,PVSAT1 ,"(m^3)/s" ,"" ) +`MPRnb( LVSAT1R ,LVSAT1 ,"(m^2)/s" ,"" ) +`MPRnb( NVSAT1R ,NVSAT1 ,"(m^2)/s" ,"" ) +`MPRnb( PVSAT1R ,PVSAT1 ,"(m^3)/s" ,"" ) -`MPRnb( LPSAT ,0.0 ,"" ,"" ) -`MPRnb( NPSAT ,0.0 ,"" ,"" ) -`MPRnb( PPSAT ,0.0 ,"" ,"" ) +`MPRnb( LPSAT ,0.0 ,"" ,"" ) +`MPRnb( NPSAT ,0.0 ,"" ,"" ) +`MPRnb( PPSAT ,0.0 ,"" ,"" ) -`MPRnb( LDELTAVSAT ,0.0 ,"" ,"" ) -`MPRnb( NDELTAVSAT ,0.0 ,"" ,"" ) -`MPRnb( PDELTAVSAT ,0.0 ,"" ,"" ) +`MPRnb( LDELTAVSAT ,0.0 ,"" ,"" ) +`MPRnb( NDELTAVSAT ,0.0 ,"" ,"" ) +`MPRnb( PDELTAVSAT ,0.0 ,"" ,"" ) -`MPRnb( LKSATIV ,0.0 ,"" ,"" ) -`MPRnb( NKSATIV ,0.0 ,"" ,"" ) -`MPRnb( PKSATIV ,0.0 ,"" ,"" ) +`MPRnb( LKSATIV ,0.0 ,"" ,"" ) +`MPRnb( NKSATIV ,0.0 ,"" ,"" ) +`MPRnb( PKSATIV ,0.0 ,"" ,"" ) -`MPRnb( LKSATIVR ,LKSATIV ,"" ,"" ) -`MPRnb( NKSATIVR ,NKSATIV ,"" ,"" ) -`MPRnb( PKSATIVR ,PKSATIV ,"" ,"" ) +`MPRnb( LKSATIVR ,LKSATIV ,"" ,"" ) +`MPRnb( NKSATIVR ,NKSATIV ,"" ,"" ) +`MPRnb( PKSATIVR ,PKSATIV ,"" ,"" ) -`MPRnb( LVSATCV ,0.0 ,"(m^2)/s" ,"" ) -`MPRnb( NVSATCV ,0.0 ,"(m^2)/s" ,"" ) -`MPRnb( PVSATCV ,0.0 ,"(m^3)/s" ,"" ) +`MPRnb( LVSATCV ,0.0 ,"(m^2)/s" ,"" ) +`MPRnb( NVSATCV ,0.0 ,"(m^2)/s" ,"" ) +`MPRnb( PVSATCV ,0.0 ,"(m^3)/s" ,"" ) -`MPRnb( LPSATCV ,0.0 ,"" ,"" ) -`MPRnb( NPSATCV ,0.0 ,"" ,"" ) -`MPRnb( PPSATCV ,0.0 ,"" ,"" ) +`MPRnb( LPSATCV ,0.0 ,"" ,"" ) +`MPRnb( NPSATCV ,0.0 ,"" ,"" ) +`MPRnb( PPSATCV ,0.0 ,"" ,"" ) -`MPRnb( LDELTAVSATCV ,0.0 ,"" ,"" ) -`MPRnb( NDELTAVSATCV ,0.0 ,"" ,"" ) -`MPRnb( PDELTAVSATCV ,0.0 ,"" ,"" ) +`MPRnb( LDELTAVSATCV ,0.0 ,"" ,"" ) +`MPRnb( NDELTAVSATCV ,0.0 ,"" ,"" ) +`MPRnb( PDELTAVSATCV ,0.0 ,"" ,"" ) -`MPRnb( LMEXP ,0.0 ,"" ,"" ) -`MPRnb( NMEXP ,0.0 ,"" ,"" ) -`MPRnb( PMEXP ,0.0 ,"" ,"" ) +`MPRnb( LMEXP ,0.0 ,"" ,"" ) +`MPRnb( NMEXP ,0.0 ,"" ,"" ) +`MPRnb( PMEXP ,0.0 ,"" ,"" ) -`MPRnb( LMEXPR ,LMEXP ,"" ,"" ) -`MPRnb( NMEXPR ,NMEXP ,"" ,"" ) -`MPRnb( PMEXPR ,PMEXP ,"" ,"" ) +`MPRnb( LMEXPR ,LMEXP ,"" ,"" ) +`MPRnb( NMEXPR ,NMEXP ,"" ,"" ) +`MPRnb( PMEXPR ,PMEXP ,"" ,"" ) -`MPRnb( LPTWG ,0.0 ,"m*(V^-2)" ,"" ) -`MPRnb( NPTWG ,0.0 ,"m*(V^-2)" ,"" ) -`MPRnb( PPTWG ,0.0 ,"m^2*(V^-2)" ,"" ) +`MPRnb( LPTWG ,0.0 ,"m*(V^-2)" ,"" ) +`MPRnb( NPTWG ,0.0 ,"m*(V^-2)" ,"" ) +`MPRnb( PPTWG ,0.0 ,"m^2*(V^-2)" ,"" ) -`MPRnb( LPTWGR ,LPTWG ,"m*(V^-2)" ,"" ) -`MPRnb( NPTWGR ,NPTWG ,"m*(V^-2)" ,"" ) -`MPRnb( PPTWGR ,PPTWG ,"m^2*(V^-2)" ,"" ) +`MPRnb( LPTWGR ,LPTWG ,"m*(V^-2)" ,"" ) +`MPRnb( NPTWGR ,NPTWG ,"m*(V^-2)" ,"" ) +`MPRnb( PPTWGR ,PPTWG ,"m^2*(V^-2)" ,"" ) -`MPRnb( LU0 ,0.0 ,"(m^3)/V*s" ,"" ) -`MPRnb( NU0 ,0.0 ,"(m^3)/V*s" ,"" ) -`MPRnb( PU0 ,0.0 ,"(m^4)/V*s" ,"" ) +`MPRnb( LU0 ,0.0 ,"(m^3)/V*s" ,"" ) +`MPRnb( NU0 ,0.0 ,"(m^3)/V*s" ,"" ) +`MPRnb( PU0 ,0.0 ,"(m^4)/V*s" ,"" ) -`MPRnb( LU0R ,LU0 ,"" ,"" ) -`MPRnb( NU0R ,NU0 ,"" ,"" ) -`MPRnb( PU0R ,PU0 ,"" ,"" ) +`MPRnb( LU0R ,LU0 ,"" ,"" ) +`MPRnb( NU0R ,NU0 ,"" ,"" ) +`MPRnb( PU0R ,PU0 ,"" ,"" ) -`MPRnb( LETAMOB ,0.0 ,"" ,"" ) -`MPRnb( NETAMOB ,0.0 ,"" ,"" ) -`MPRnb( PETAMOB ,0.0 ,"" ,"" ) +`MPRnb( LETAMOB ,0.0 ,"" ,"" ) +`MPRnb( NETAMOB ,0.0 ,"" ,"" ) +`MPRnb( PETAMOB ,0.0 ,"" ,"" ) -`MPRnb( LUP ,0.0 ,"m*(um^LPA)" ,"" ) -`MPRnb( NUP ,0.0 ,"m*(um^LPA)" ,"" ) -`MPRnb( PUP ,0.0 ,"m^2*(um^LPA)" ,"" ) +`MPRnb( LUP ,0.0 ,"m*(um^LPA)" ,"" ) +`MPRnb( NUP ,0.0 ,"m*(um^LPA)" ,"" ) +`MPRnb( PUP ,0.0 ,"m^2*(um^LPA)" ,"" ) -`MPRnb( LUPR ,LUP ,"" ,"" ) -`MPRnb( NUPR ,NUP ,"" ,"" ) -`MPRnb( PUPR ,PUP ,"" ,"" ) +`MPRnb( LUPR ,LUP ,"" ,"" ) +`MPRnb( NUPR ,NUP ,"" ,"" ) +`MPRnb( PUPR ,PUP ,"" ,"" ) -`MPRnb( LUA ,0.0 ,"m*((cm/MV)^EU)" ,"" ) -`MPRnb( NUA ,0.0 ,"m*((cm/MV)^EU)" ,"" ) -`MPRnb( PUA ,0.0 ,"m^2*((cm/MV)^EU)" ,"" ) +`MPRnb( LUA ,0.0 ,"m*((cm/MV)^EU)" ,"" ) +`MPRnb( NUA ,0.0 ,"m*((cm/MV)^EU)" ,"" ) +`MPRnb( PUA ,0.0 ,"m^2*((cm/MV)^EU)" ,"" ) -`MPRnb( LUAR ,LUA ,"" ,"" ) -`MPRnb( NUAR ,NUA ,"" ,"" ) -`MPRnb( PUAR ,PUA ,"" ,"" ) +`MPRnb( LUAR ,LUA ,"" ,"" ) +`MPRnb( NUAR ,NUA ,"" ,"" ) +`MPRnb( PUAR ,PUA ,"" ,"" ) -`MPRnb( LUC ,0.0 ,"" ,"" ) -`MPRnb( NUC ,0.0 ,"" ,"" ) -`MPRnb( PUC ,0.0 ,"" ,"" ) +`MPRnb( LUC ,0.0 ,"" ,"" ) +`MPRnb( NUC ,0.0 ,"" ,"" ) +`MPRnb( PUC ,0.0 ,"" ,"" ) -`MPRnb( LUCR ,LUC ,"" ,"" ) -`MPRnb( NUCR ,NUC ,"" ,"" ) -`MPRnb( PUCR ,PUC ,"" ,"" ) +`MPRnb( LUCR ,LUC ,"" ,"" ) +`MPRnb( NUCR ,NUC ,"" ,"" ) +`MPRnb( PUCR ,PUC ,"" ,"" ) -`MPRnb( LEU ,0.0 ,"m*(cm/MV)" ,"" ) -`MPRnb( NEU ,0.0 ,"m*(cm/MV)" ,"" ) -`MPRnb( PEU ,0.0 ,"m^2*(cm/MV)" ,"" ) +`MPRnb( LEU ,0.0 ,"m*(cm/MV)" ,"" ) +`MPRnb( NEU ,0.0 ,"m*(cm/MV)" ,"" ) +`MPRnb( PEU ,0.0 ,"m^2*(cm/MV)" ,"" ) -`MPRnb( LEUR ,LEU ,"" ,"" ) -`MPRnb( NEUR ,NEU ,"" ,"" ) -`MPRnb( PEUR ,PEU ,"" ,"" ) +`MPRnb( LEUR ,LEU ,"" ,"" ) +`MPRnb( NEUR ,NEU ,"" ,"" ) +`MPRnb( PEUR ,PEU ,"" ,"" ) -`MPRnb( LUD ,0.0 ,"m*(cm/MV)" ,"" ) -`MPRnb( NUD ,0.0 ,"m*(cm/MV)" ,"" ) -`MPRnb( PUD ,0.0 ,"m^2*(cm/MV)" ,"" ) +`MPRnb( LUD ,0.0 ,"m*(cm/MV)" ,"" ) +`MPRnb( NUD ,0.0 ,"m*(cm/MV)" ,"" ) +`MPRnb( PUD ,0.0 ,"m^2*(cm/MV)" ,"" ) -`MPRnb( LUDR ,LUD ,"" ,"" ) -`MPRnb( NUDR ,NUD ,"" ,"" ) -`MPRnb( PUDR ,PUD ,"" ,"" ) +`MPRnb( LUDR ,LUD ,"" ,"" ) +`MPRnb( NUDR ,NUD ,"" ,"" ) +`MPRnb( PUDR ,PUD ,"" ,"" ) -`MPRnb( LUCS ,0.0 ,"" ,"" ) -`MPRnb( NUCS ,0.0 ,"" ,"" ) -`MPRnb( PUCS ,0.0 ,"" ,"" ) +`MPRnb( LUCS ,0.0 ,"" ,"" ) +`MPRnb( NUCS ,0.0 ,"" ,"" ) +`MPRnb( PUCS ,0.0 ,"" ,"" ) -`MPRnb( LPCLM ,0.0 ,"" ,"" ) -`MPRnb( NPCLM ,0.0 ,"" ,"" ) -`MPRnb( PPCLM ,0.0 ,"" ,"" ) +`MPRnb( LPCLM ,0.0 ,"" ,"" ) +`MPRnb( NPCLM ,0.0 ,"" ,"" ) +`MPRnb( PPCLM ,0.0 ,"" ,"" ) -`MPRnb( LPCLMR ,LPCLM ,"" ,"" ) -`MPRnb( NPCLMR ,NPCLM ,"" ,"" ) -`MPRnb( PPCLMR ,PPCLM ,"" ,"" ) +`MPRnb( LPCLMR ,LPCLM ,"" ,"" ) +`MPRnb( NPCLMR ,NPCLM ,"" ,"" ) +`MPRnb( PPCLMR ,PPCLM ,"" ,"" ) -`MPRnb( LPCLMG ,0.0 ,"" ,"" ) -`MPRnb( NPCLMG ,0.0 ,"" ,"" ) -`MPRnb( PPCLMG ,0.0 ,"" ,"" ) +`MPRnb( LPCLMG ,0.0 ,"" ,"" ) +`MPRnb( NPCLMG ,0.0 ,"" ,"" ) +`MPRnb( PPCLMG ,0.0 ,"" ,"" ) -`MPRnb( LPCLMCV ,LPCLM ,"" ,"" ) -`MPRnb( NPCLMCV ,NPCLM ,"" ,"" ) -`MPRnb( PPCLMCV ,PPCLM ,"" ,"" ) +`MPRnb( LPCLMCV ,LPCLM ,"" ,"" ) +`MPRnb( NPCLMCV ,NPCLM ,"" ,"" ) +`MPRnb( PPCLMCV ,PPCLM ,"" ,"" ) -`MPRnb( LA1 ,0.0 ,"m*(V^-2)" ,"" ) -`MPRnb( NA1 ,0.0 ,"m*(V^-2)" ,"" ) -`MPRnb( PA1 ,0.0 ,"m^2*(V^-2)" ,"" ) +`MPRnb( LA1 ,0.0 ,"m*(V^-2)" ,"" ) +`MPRnb( NA1 ,0.0 ,"m*(V^-2)" ,"" ) +`MPRnb( PA1 ,0.0 ,"m^2*(V^-2)" ,"" ) -`MPRnb( LA11 ,0.0 ,"m*(V^-2/K)" ,"" ) -`MPRnb( NA11 ,0.0 ,"m*(V^-2/K)" ,"" ) -`MPRnb( PA11 ,0.0 ,"m^2*(V^-2/K)" ,"" ) +`MPRnb( LA11 ,0.0 ,"m*(V^-2/K)" ,"" ) +`MPRnb( NA11 ,0.0 ,"m*(V^-2/K)" ,"" ) +`MPRnb( PA11 ,0.0 ,"m^2*(V^-2/K)" ,"" ) -`MPRnb( LA2 ,0.0 ,"m*(V^-1)" ,"" ) -`MPRnb( NA2 ,0.0 ,"m*(V^-1)" ,"" ) -`MPRnb( PA2 ,0.0 ,"m^2*(V^-1)" ,"" ) +`MPRnb( LA2 ,0.0 ,"m*(V^-1)" ,"" ) +`MPRnb( NA2 ,0.0 ,"m*(V^-1)" ,"" ) +`MPRnb( PA2 ,0.0 ,"m^2*(V^-1)" ,"" ) -`MPRnb( LA21 ,0.0 ,"m*(V^-1/K)" ,"" ) -`MPRnb( NA21 ,0.0 ,"m*(V^-1/K)" ,"" ) -`MPRnb( PA21 ,0.0 ,"m^2*(V^-1/K)" ,"" ) +`MPRnb( LA21 ,0.0 ,"m*(V^-1/K)" ,"" ) +`MPRnb( NA21 ,0.0 ,"m*(V^-1/K)" ,"" ) +`MPRnb( PA21 ,0.0 ,"m^2*(V^-1/K)" ,"" ) -`MPRnb( LRDSW ,0.0 ,"m*(ohm-um^WR)" ,"" ) -`MPRnb( NRDSW ,0.0 ,"m*(ohm-um^WR)" ,"" ) -`MPRnb( PRDSW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" ) +`MPRnb( LRDSW ,0.0 ,"m*(ohm-um^WR)" ,"" ) +`MPRnb( NRDSW ,0.0 ,"m*(ohm-um^WR)" ,"" ) +`MPRnb( PRDSW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" ) -`MPRnb( LRSW ,0.0 ,"m*(ohm-um^WR)" ,"" ) -`MPRnb( NRSW ,0.0 ,"m*(ohm-um^WR)" ,"" ) -`MPRnb( PRSW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" ) +`MPRnb( LRSW ,0.0 ,"m*(ohm-um^WR)" ,"" ) +`MPRnb( NRSW ,0.0 ,"m*(ohm-um^WR)" ,"" ) +`MPRnb( PRSW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" ) -`MPRnb( LRDW ,0.0 ,"m*(ohm-um^WR)" ,"" ) -`MPRnb( NRDW ,0.0 ,"m*(ohm-um^WR)" ,"" ) -`MPRnb( PRDW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" ) +`MPRnb( LRDW ,0.0 ,"m*(ohm-um^WR)" ,"" ) +`MPRnb( NRDW ,0.0 ,"m*(ohm-um^WR)" ,"" ) +`MPRnb( PRDW ,0.0 ,"(m^2)*(ohm-um^WR)" ,"" ) -`MPRnb( LPRWGS ,0.0 ,"m/V" ,"" ) -`MPRnb( NPRWGS ,0.0 ,"m/V" ,"" ) -`MPRnb( PPRWGS ,0.0 ,"(m^2)/V" ,"" ) +`MPRnb( LPRWGS ,0.0 ,"m/V" ,"" ) +`MPRnb( NPRWGS ,0.0 ,"m/V" ,"" ) +`MPRnb( PPRWGS ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( LPRWGD ,0.0 ,"m/V" ,"" ) -`MPRnb( NPRWGD ,0.0 ,"m/V" ,"" ) -`MPRnb( PPRWGD ,0.0 ,"(m^2)/V" ,"" ) +`MPRnb( LPRWGD ,0.0 ,"m/V" ,"" ) +`MPRnb( NPRWGD ,0.0 ,"m/V" ,"" ) +`MPRnb( PPRWGD ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( LWR ,0.0 ,"" ,"" ) -`MPRnb( NWR ,0.0 ,"" ,"" ) -`MPRnb( PWR ,0.0 ,"" ,"" ) +`MPRnb( LWR ,0.0 ,"" ,"" ) +`MPRnb( NWR ,0.0 ,"" ,"" ) +`MPRnb( PWR ,0.0 ,"" ,"" ) -`MPRnb( LPDIBL1 ,0.0 ,"" ,"" ) -`MPRnb( NPDIBL1 ,0.0 ,"" ,"" ) -`MPRnb( PPDIBL1 ,0.0 ,"" ,"" ) +`MPRnb( LPDIBL1 ,0.0 ,"" ,"" ) +`MPRnb( NPDIBL1 ,0.0 ,"" ,"" ) +`MPRnb( PPDIBL1 ,0.0 ,"" ,"" ) -`MPRnb( LPDIBL1R ,LPDIBL1 ,"" ,"" ) -`MPRnb( NPDIBL1R ,NPDIBL1 ,"" ,"" ) -`MPRnb( PPDIBL1R ,PPDIBL1 ,"" ,"" ) +`MPRnb( LPDIBL1R ,LPDIBL1 ,"" ,"" ) +`MPRnb( NPDIBL1R ,NPDIBL1 ,"" ,"" ) +`MPRnb( PPDIBL1R ,PPDIBL1 ,"" ,"" ) -`MPRnb( LPDIBL2 ,0.0 ,"" ,"" ) -`MPRnb( NPDIBL2 ,0.0 ,"" ,"" ) -`MPRnb( PPDIBL2 ,0.0 ,"" ,"" ) +`MPRnb( LPDIBL2 ,0.0 ,"" ,"" ) +`MPRnb( NPDIBL2 ,0.0 ,"" ,"" ) +`MPRnb( PPDIBL2 ,0.0 ,"" ,"" ) -`MPRnb( LPDIBL2R ,LPDIBL2 ,"" ,"" ) -`MPRnb( NPDIBL2R ,NPDIBL2 ,"" ,"" ) -`MPRnb( PPDIBL2R ,PPDIBL2 ,"" ,"" ) +`MPRnb( LPDIBL2R ,LPDIBL2 ,"" ,"" ) +`MPRnb( NPDIBL2R ,NPDIBL2 ,"" ,"" ) +`MPRnb( PPDIBL2R ,PPDIBL2 ,"" ,"" ) -`MPRnb( LDROUT ,0.0 ,"" ,"" ) -`MPRnb( NDROUT ,0.0 ,"" ,"" ) -`MPRnb( PDROUT ,0.0 ,"" ,"" ) +`MPRnb( LDROUT ,0.0 ,"" ,"" ) +`MPRnb( NDROUT ,0.0 ,"" ,"" ) +`MPRnb( PDROUT ,0.0 ,"" ,"" ) -`MPRnb( LPVAG ,0.0 ,"" ,"" ) -`MPRnb( NPVAG ,0.0 ,"" ,"" ) -`MPRnb( PPVAG ,0.0 ,"" ,"" ) +`MPRnb( LPVAG ,0.0 ,"" ,"" ) +`MPRnb( NPVAG ,0.0 ,"" ,"" ) +`MPRnb( PPVAG ,0.0 ,"" ,"" ) -`MPRnb( LAIGBINV ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( NAIGBINV ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( PAIGBINV ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" ) +`MPRnb( LAIGBINV ,0.0 ,"(F*s^2/g)^0.5" ,"" ) +`MPRnb( NAIGBINV ,0.0 ,"(F*s^2/g)^0.5" ,"" ) +`MPRnb( PAIGBINV ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" ) -`MPRnb( LAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( NAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( PAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" ) +`MPRnb( LAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) +`MPRnb( NAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) +`MPRnb( PAIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" ) -`MPRnb( LBIGBINV ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( NBIGBINV ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( PBIGBINV ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" ) +`MPRnb( LBIGBINV ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) +`MPRnb( NBIGBINV ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) +`MPRnb( PBIGBINV ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" ) -`MPRnb( LCIGBINV ,0.0 ,"m/V" ,"" ) -`MPRnb( NCIGBINV ,0.0 ,"m/V" ,"" ) -`MPRnb( PCIGBINV ,0.0 ,"(m^2)/V" ,"" ) +`MPRnb( LCIGBINV ,0.0 ,"m/V" ,"" ) +`MPRnb( NCIGBINV ,0.0 ,"m/V" ,"" ) +`MPRnb( PCIGBINV ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( LEIGBINV ,0.0 ,"m*V" ,"" ) -`MPRnb( NEIGBINV ,0.0 ,"m*V" ,"" ) -`MPRnb( PEIGBINV ,0.0 ,"(m^2)*V" ,"" ) +`MPRnb( LEIGBINV ,0.0 ,"m*V" ,"" ) +`MPRnb( NEIGBINV ,0.0 ,"m*V" ,"" ) +`MPRnb( PEIGBINV ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( LNIGBINV ,0.0 ,"" ,"" ) -`MPRnb( NNIGBINV ,0.0 ,"" ,"" ) -`MPRnb( PNIGBINV ,0.0 ,"" ,"" ) +`MPRnb( LNIGBINV ,0.0 ,"" ,"" ) +`MPRnb( NNIGBINV ,0.0 ,"" ,"" ) +`MPRnb( PNIGBINV ,0.0 ,"" ,"" ) -`MPRnb( LAIGBACC ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( NAIGBACC ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( PAIGBACC ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" ) +`MPRnb( LAIGBACC ,0.0 ,"(F*s^2/g)^0.5" ,"" ) +`MPRnb( NAIGBACC ,0.0 ,"(F*s^2/g)^0.5" ,"" ) +`MPRnb( PAIGBACC ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" ) -`MPRnb( LAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( NAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( PAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" ) +`MPRnb( LAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) +`MPRnb( NAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) +`MPRnb( PAIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" ) -`MPRnb( LBIGBACC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( NBIGBACC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( PBIGBACC ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" ) +`MPRnb( LBIGBACC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) +`MPRnb( NBIGBACC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) +`MPRnb( PBIGBACC ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" ) -`MPRnb( LCIGBACC ,0.0 ,"m/V" ,"" ) -`MPRnb( NCIGBACC ,0.0 ,"m/V" ,"" ) -`MPRnb( PCIGBACC ,0.0 ,"(m^2)/V" ,"" ) +`MPRnb( LCIGBACC ,0.0 ,"m/V" ,"" ) +`MPRnb( NCIGBACC ,0.0 ,"m/V" ,"" ) +`MPRnb( PCIGBACC ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( LNIGBACC ,0.0 ,"" ,"" ) -`MPRnb( NNIGBACC ,0.0 ,"" ,"" ) -`MPRnb( PNIGBACC ,0.0 ,"" ,"" ) +`MPRnb( LNIGBACC ,0.0 ,"" ,"" ) +`MPRnb( NNIGBACC ,0.0 ,"" ,"" ) +`MPRnb( PNIGBACC ,0.0 ,"" ,"" ) -`MPRnb( LAIGC ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( NAIGC ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( PAIGC ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" ) +`MPRnb( LAIGC ,0.0 ,"(F*s^2/g)^0.5" ,"" ) +`MPRnb( NAIGC ,0.0 ,"(F*s^2/g)^0.5" ,"" ) +`MPRnb( PAIGC ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" ) -`MPRnb( LAIGC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( NAIGC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( PAIGC1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" ) +`MPRnb( LAIGC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) +`MPRnb( NAIGC1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) +`MPRnb( PAIGC1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" ) -`MPRnb( LBIGC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( NBIGC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( PBIGC ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" ) +`MPRnb( LBIGC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) +`MPRnb( NBIGC ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) +`MPRnb( PBIGC ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" ) -`MPRnb( LCIGC ,0.0 ,"m/V" ,"" ) -`MPRnb( NCIGC ,0.0 ,"m/V" ,"" ) -`MPRnb( PCIGC ,0.0 ,"(m^2)/V" ,"" ) +`MPRnb( LCIGC ,0.0 ,"m/V" ,"" ) +`MPRnb( NCIGC ,0.0 ,"m/V" ,"" ) +`MPRnb( PCIGC ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( LPIGCD ,0.0 ,"" ,"" ) -`MPRnb( NPIGCD ,0.0 ,"" ,"" ) -`MPRnb( PPIGCD ,0.0 ,"" ,"" ) +`MPRnb( LPIGCD ,0.0 ,"" ,"" ) +`MPRnb( NPIGCD ,0.0 ,"" ,"" ) +`MPRnb( PPIGCD ,0.0 ,"" ,"" ) -`MPRnb( LAIGS ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( NAIGS ,0.0 ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( PAIGS ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" ) +`MPRnb( LAIGS ,0.0 ,"(F*s^2/g)^0.5" ,"" ) +`MPRnb( NAIGS ,0.0 ,"(F*s^2/g)^0.5" ,"" ) +`MPRnb( PAIGS ,0.0 ,"((F*s^2/g)^0.5)*m" ,"" ) -`MPRnb( LAIGS1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( NAIGS1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( PAIGS1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" ) +`MPRnb( LAIGS1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) +`MPRnb( NAIGS1 ,0.0 ,"((F*s^2/g)^0.5)/K" ,"" ) +`MPRnb( PAIGS1 ,0.0 ,"((F*s^2/g)^0.5)*(m/K)" ,"" ) -`MPRnb( LBIGS ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( NBIGS ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( PBIGS ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" ) +`MPRnb( LBIGS ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) +`MPRnb( NBIGS ,0.0 ,"((F*s^2/g)^0.5)/V" ,"" ) +`MPRnb( PBIGS ,0.0 ,"((F*s^2/g)^0.5)*(m/V)" ,"" ) -`MPRnb( LCIGS ,0.0 ,"m/V" ,"" ) -`MPRnb( NCIGS ,0.0 ,"m/V" ,"" ) -`MPRnb( PCIGS ,0.0 ,"(m^2)/V" ,"" ) +`MPRnb( LCIGS ,0.0 ,"m/V" ,"" ) +`MPRnb( NCIGS ,0.0 ,"m/V" ,"" ) +`MPRnb( PCIGS ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( LAIGD ,LAIGS ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( NAIGD ,NAIGS ,"(F*s^2/g)^0.5" ,"" ) -`MPRnb( PAIGD ,PAIGS ,"((F*s^2/g)^0.5)*m" ,"" ) +`MPRnb( LAIGD ,LAIGS ,"(F*s^2/g)^0.5" ,"" ) +`MPRnb( NAIGD ,NAIGS ,"(F*s^2/g)^0.5" ,"" ) +`MPRnb( PAIGD ,PAIGS ,"((F*s^2/g)^0.5)*m" ,"" ) -`MPRnb( LAIGD1 ,LAIGS1 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( NAIGD1 ,NAIGS1 ,"((F*s^2/g)^0.5)/K" ,"" ) -`MPRnb( PAIGD1 ,PAIGS1 ,"((F*s^2/g)^0.5)*(m/K)" ,"" ) +`MPRnb( LAIGD1 ,LAIGS1 ,"((F*s^2/g)^0.5)/K" ,"" ) +`MPRnb( NAIGD1 ,NAIGS1 ,"((F*s^2/g)^0.5)/K" ,"" ) +`MPRnb( PAIGD1 ,PAIGS1 ,"((F*s^2/g)^0.5)*(m/K)" ,"" ) -`MPRnb( LBIGD ,LBIGS ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( NBIGD ,NBIGS ,"((F*s^2/g)^0.5)/V" ,"" ) -`MPRnb( PBIGD ,PBIGS ,"((F*s^2/g)^0.5)*(m/V)" ,"" ) +`MPRnb( LBIGD ,LBIGS ,"((F*s^2/g)^0.5)/V" ,"" ) +`MPRnb( NBIGD ,NBIGS ,"((F*s^2/g)^0.5)/V" ,"" ) +`MPRnb( PBIGD ,PBIGS ,"((F*s^2/g)^0.5)*(m/V)" ,"" ) -`MPRnb( LCIGD ,LCIGS ,"m/V" ,"" ) -`MPRnb( NCIGD ,NCIGS ,"m/V" ,"" ) -`MPRnb( PCIGD ,PCIGS ,"(m^2)/V" ,"" ) +`MPRnb( LCIGD ,LCIGS ,"m/V" ,"" ) +`MPRnb( NCIGD ,NCIGS ,"m/V" ,"" ) +`MPRnb( PCIGD ,PCIGS ,"(m^2)/V" ,"" ) -`MPRnb( LNTOX ,0.0 ,"" ,"" ) -`MPRnb( NNTOX ,0.0 ,"" ,"" ) -`MPRnb( PNTOX ,0.0 ,"" ,"" ) +`MPRnb( LNTOX ,0.0 ,"" ,"" ) +`MPRnb( NNTOX ,0.0 ,"" ,"" ) +`MPRnb( PNTOX ,0.0 ,"" ,"" ) -`MPRnb( LPOXEDGE ,0.0 ,"" ,"" ) -`MPRnb( NPOXEDGE ,0.0 ,"" ,"" ) -`MPRnb( PPOXEDGE ,0.0 ,"" ,"" ) +`MPRnb( LPOXEDGE ,0.0 ,"" ,"" ) +`MPRnb( NPOXEDGE ,0.0 ,"" ,"" ) +`MPRnb( PPOXEDGE ,0.0 ,"" ,"" ) -`MPRnb( LAGISL ,0.0 ,"m/ohm" ,"" ) -`MPRnb( NAGISL ,0.0 ,"m/ohm" ,"" ) -`MPRnb( PAGISL ,0.0 ,"(m^2)/ohm" ,"" ) +`MPRnb( LAGISL ,0.0 ,"m/ohm" ,"" ) +`MPRnb( NAGISL ,0.0 ,"m/ohm" ,"" ) +`MPRnb( PAGISL ,0.0 ,"(m^2)/ohm" ,"" ) -`MPRnb( LBGISL ,0.0 ,"V" ,"" ) -`MPRnb( NBGISL ,0.0 ,"V" ,"" ) -`MPRnb( PBGISL ,0.0 ,"m*V" ,"" ) +`MPRnb( LBGISL ,0.0 ,"V" ,"" ) +`MPRnb( NBGISL ,0.0 ,"V" ,"" ) +`MPRnb( PBGISL ,0.0 ,"m*V" ,"" ) -`MPRnb( LCGISL ,0.0 ,"m*(V^3)" ,"" ) -`MPRnb( NCGISL ,0.0 ,"m*(V^3)" ,"" ) -`MPRnb( PCGISL ,0.0 ,"(m^2)*(V^3)" ,"" ) +`MPRnb( LCGISL ,0.0 ,"m*(V^3)" ,"" ) +`MPRnb( NCGISL ,0.0 ,"m*(V^3)" ,"" ) +`MPRnb( PCGISL ,0.0 ,"(m^2)*(V^3)" ,"" ) -`MPRnb( LEGISL ,0.0 ,"m*V" ,"" ) -`MPRnb( NEGISL ,0.0 ,"m*V" ,"" ) -`MPRnb( PEGISL ,0.0 ,"(m^2)*V" ,"" ) +`MPRnb( LEGISL ,0.0 ,"m*V" ,"" ) +`MPRnb( NEGISL ,0.0 ,"m*V" ,"" ) +`MPRnb( PEGISL ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( LPGISL ,0.0 ,"" ,"" ) -`MPRnb( NPGISL ,0.0 ,"" ,"" ) -`MPRnb( PPGISL ,0.0 ,"" ,"" ) +`MPRnb( LPGISL ,0.0 ,"" ,"" ) +`MPRnb( NPGISL ,0.0 ,"" ,"" ) +`MPRnb( PPGISL ,0.0 ,"" ,"" ) -`MPRnb( LAGIDL ,LAGISL ,"m/ohm" ,"" ) -`MPRnb( NAGIDL ,NAGISL ,"m/ohm" ,"" ) -`MPRnb( PAGIDL ,PAGISL ,"(m^2)/ohm" ,"" ) +`MPRnb( LAGIDL ,LAGISL ,"m/ohm" ,"" ) +`MPRnb( NAGIDL ,NAGISL ,"m/ohm" ,"" ) +`MPRnb( PAGIDL ,PAGISL ,"(m^2)/ohm" ,"" ) -`MPRnb( LBGIDL ,LBGISL ,"V" ,"" ) -`MPRnb( NBGIDL ,NBGISL ,"V" ,"" ) -`MPRnb( PBGIDL ,PBGISL ,"m*V" ,"" ) +`MPRnb( LBGIDL ,LBGISL ,"V" ,"" ) +`MPRnb( NBGIDL ,NBGISL ,"V" ,"" ) +`MPRnb( PBGIDL ,PBGISL ,"m*V" ,"" ) -`MPRnb( LCGIDL ,LCGISL ,"m*(V^3)" ,"" ) -`MPRnb( NCGIDL ,NCGISL ,"m*(V^3)" ,"" ) -`MPRnb( PCGIDL ,PCGISL ,"(m^2)*(V^3)" ,"" ) +`MPRnb( LCGIDL ,LCGISL ,"m*(V^3)" ,"" ) +`MPRnb( NCGIDL ,NCGISL ,"m*(V^3)" ,"" ) +`MPRnb( PCGIDL ,PCGISL ,"(m^2)*(V^3)" ,"" ) -`MPRnb( LEGIDL ,LEGISL ,"m*V" ,"" ) -`MPRnb( NEGIDL ,NEGISL ,"m*V" ,"" ) -`MPRnb( PEGIDL ,PEGISL ,"(m^2)*V" ,"" ) +`MPRnb( LEGIDL ,LEGISL ,"m*V" ,"" ) +`MPRnb( NEGIDL ,NEGISL ,"m*V" ,"" ) +`MPRnb( PEGIDL ,PEGISL ,"(m^2)*V" ,"" ) -`MPRnb( LPGIDL ,LPGISL ,"" ,"" ) -`MPRnb( NPGIDL ,NPGISL ,"" ,"" ) -`MPRnb( PPGIDL ,PPGISL ,"" ,"" ) +`MPRnb( LPGIDL ,LPGISL ,"" ,"" ) +`MPRnb( NPGIDL ,NPGISL ,"" ,"" ) +`MPRnb( PPGIDL ,PPGISL ,"" ,"" ) -`MPRnb( LALPHA0 ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( NALPHA0 ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( PALPHA0 ,0.0 ,"(m^3)/V" ,"" ) +`MPRnb( LALPHA0 ,0.0 ,"(m^2)/V" ,"" ) +`MPRnb( NALPHA0 ,0.0 ,"(m^2)/V" ,"" ) +`MPRnb( PALPHA0 ,0.0 ,"(m^3)/V" ,"" ) -`MPRnb( LALPHA1 ,0.0 ,"m/V" ,"" ) -`MPRnb( NALPHA1 ,0.0 ,"m/V" ,"" ) -`MPRnb( PALPHA1 ,0.0 ,"(m^2)/V" ,"" ) +`MPRnb( LALPHA1 ,0.0 ,"m/V" ,"" ) +`MPRnb( NALPHA1 ,0.0 ,"m/V" ,"" ) +`MPRnb( PALPHA1 ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( LALPHAII0 ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( NALPHAII0 ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( PALPHAII0 ,0.0 ,"(m^3)/V" ,"" ) +`MPRnb( LALPHAII0 ,0.0 ,"(m^2)/V" ,"" ) +`MPRnb( NALPHAII0 ,0.0 ,"(m^2)/V" ,"" ) +`MPRnb( PALPHAII0 ,0.0 ,"(m^3)/V" ,"" ) -`MPRnb( LALPHAII1 ,0.0 ,"m/V" ,"" ) -`MPRnb( NALPHAII1 ,0.0 ,"m/V" ,"" ) -`MPRnb( PALPHAII1 ,0.0 ,"(m^2)/V" ,"" ) +`MPRnb( LALPHAII1 ,0.0 ,"m/V" ,"" ) +`MPRnb( NALPHAII1 ,0.0 ,"m/V" ,"" ) +`MPRnb( PALPHAII1 ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( LBETA0 ,0.0 ,"m/V" ,"" ) -`MPRnb( NBETA0 ,0.0 ,"m/V" ,"" ) -`MPRnb( PBETA0 ,0.0 ,"(m^2)/V" ,"" ) +`MPRnb( LBETA0 ,0.0 ,"m/V" ,"" ) +`MPRnb( NBETA0 ,0.0 ,"m/V" ,"" ) +`MPRnb( PBETA0 ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( LBETAII0 ,0.0 ,"m/V" ,"" ) -`MPRnb( NBETAII0 ,0.0 ,"m/V" ,"" ) -`MPRnb( PBETAII0 ,0.0 ,"(m^2)/V" ,"" ) +`MPRnb( LBETAII0 ,0.0 ,"m/V" ,"" ) +`MPRnb( NBETAII0 ,0.0 ,"m/V" ,"" ) +`MPRnb( PBETAII0 ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( LBETAII1 ,0.0 ,"" ,"" ) -`MPRnb( NBETAII1 ,0.0 ,"" ,"" ) -`MPRnb( PBETAII1 ,0.0 ,"" ,"" ) +`MPRnb( LBETAII1 ,0.0 ,"" ,"" ) +`MPRnb( NBETAII1 ,0.0 ,"" ,"" ) +`MPRnb( PBETAII1 ,0.0 ,"" ,"" ) -`MPRnb( LBETAII2 ,0.0 ,"m*V" ,"" ) -`MPRnb( NBETAII2 ,0.0 ,"m*V" ,"" ) -`MPRnb( PBETAII2 ,0.0 ,"(m^2)*V" ,"" ) +`MPRnb( LBETAII2 ,0.0 ,"m*V" ,"" ) +`MPRnb( NBETAII2 ,0.0 ,"m*V" ,"" ) +`MPRnb( PBETAII2 ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( LESATII ,0.0 ,"V" ,"" ) -`MPRnb( NESATII ,0.0 ,"V" ,"" ) -`MPRnb( PESATII ,0.0 ,"m*V" ,"" ) +`MPRnb( LESATII ,0.0 ,"V" ,"" ) +`MPRnb( NESATII ,0.0 ,"V" ,"" ) +`MPRnb( PESATII ,0.0 ,"m*V" ,"" ) -`MPRnb( LLII ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( NLII ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( PLII ,0.0 ,"(m^3)*V" ,"" ) +`MPRnb( LLII ,0.0 ,"(m^2)*V" ,"" ) +`MPRnb( NLII ,0.0 ,"(m^2)*V" ,"" ) +`MPRnb( PLII ,0.0 ,"(m^3)*V" ,"" ) -`MPRnb( LSII0 ,0.0 ,"m/V" ,"" ) -`MPRnb( NSII0 ,0.0 ,"m/V" ,"" ) -`MPRnb( PSII0 ,0.0 ,"(m^2)/V" ,"" ) +`MPRnb( LSII0 ,0.0 ,"m/V" ,"" ) +`MPRnb( NSII0 ,0.0 ,"m/V" ,"" ) +`MPRnb( PSII0 ,0.0 ,"(m^2)/V" ,"" ) -`MPRnb( LSII1 ,0.0 ,"" ,"" ) -`MPRnb( NSII1 ,0.0 ,"" ,"" ) -`MPRnb( PSII1 ,0.0 ,"" ,"" ) +`MPRnb( LSII1 ,0.0 ,"" ,"" ) +`MPRnb( NSII1 ,0.0 ,"" ,"" ) +`MPRnb( PSII1 ,0.0 ,"" ,"" ) -`MPRnb( LSII2 ,0.0 ,"m*V" ,"" ) -`MPRnb( NSII2 ,0.0 ,"m*V" ,"" ) -`MPRnb( PSII2 ,0.0 ,"(m^2)*V" ,"" ) +`MPRnb( LSII2 ,0.0 ,"m*V" ,"" ) +`MPRnb( NSII2 ,0.0 ,"m*V" ,"" ) +`MPRnb( PSII2 ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( LSIID ,0.0 ,"m*V" ,"" ) -`MPRnb( NSIID ,0.0 ,"m*V" ,"" ) -`MPRnb( PSIID ,0.0 ,"(m^2)*V" ,"" ) +`MPRnb( LSIID ,0.0 ,"m*V" ,"" ) +`MPRnb( NSIID ,0.0 ,"m*V" ,"" ) +`MPRnb( PSIID ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( LCFS ,0.0 ,"F" ,"" ) -`MPRnb( NCFS ,0.0 ,"F" ,"" ) -`MPRnb( PCFS ,0.0 ,"F*m" ,"" ) +`MPRnb( LCFS ,0.0 ,"F" ,"" ) +`MPRnb( NCFS ,0.0 ,"F" ,"" ) +`MPRnb( PCFS ,0.0 ,"F*m" ,"" ) -`MPRnb( LCFD ,LCFS ,"F" ,"" ) -`MPRnb( NCFD ,NCFS ,"F" ,"" ) -`MPRnb( PCFD ,PCFS ,"F*m" ,"" ) +`MPRnb( LCFD ,LCFS ,"F" ,"" ) +`MPRnb( NCFD ,NCFS ,"F" ,"" ) +`MPRnb( PCFD ,PCFS ,"F*m" ,"" ) -`MPRnb( LCOVS ,0.0 ,"F" ,"" ) -`MPRnb( NCOVS ,0.0 ,"F" ,"" ) -`MPRnb( PCOVS ,0.0 ,"F*m" ,"" ) +`MPRnb( LCOVS ,0.0 ,"F" ,"" ) +`MPRnb( NCOVS ,0.0 ,"F" ,"" ) +`MPRnb( PCOVS ,0.0 ,"F*m" ,"" ) -`MPRnb( LCOVD ,LCOVS ,"F" ,"" ) -`MPRnb( NCOVD ,NCOVS ,"F" ,"" ) -`MPRnb( PCOVD ,PCOVS ,"F*m" ,"" ) +`MPRnb( LCOVD ,LCOVS ,"F" ,"" ) +`MPRnb( NCOVD ,NCOVS ,"F" ,"" ) +`MPRnb( PCOVD ,PCOVS ,"F*m" ,"" ) -`MPRnb( LCGSL ,0.0 ,"F" ,"" ) -`MPRnb( NCGSL ,0.0 ,"F" ,"" ) -`MPRnb( PCGSL ,0.0 ,"F*m" ,"" ) +`MPRnb( LCGSL ,0.0 ,"F" ,"" ) +`MPRnb( NCGSL ,0.0 ,"F" ,"" ) +`MPRnb( PCGSL ,0.0 ,"F*m" ,"" ) -`MPRnb( LCGDL ,LCGSL ,"F" ,"" ) -`MPRnb( NCGDL ,NCGSL ,"F" ,"" ) -`MPRnb( PCGDL ,PCGSL ,"F*m" ,"" ) +`MPRnb( LCGDL ,LCGSL ,"F" ,"" ) +`MPRnb( NCGDL ,NCGSL ,"F" ,"" ) +`MPRnb( PCGDL ,PCGSL ,"F*m" ,"" ) -`MPRnb( LCKAPPAS ,0.0 ,"m*V" ,"" ) -`MPRnb( NCKAPPAS ,0.0 ,"m*V" ,"" ) -`MPRnb( PCKAPPAS ,0.0 ,"(m^2)*V" ,"" ) +`MPRnb( LCKAPPAS ,0.0 ,"m*V" ,"" ) +`MPRnb( NCKAPPAS ,0.0 ,"m*V" ,"" ) +`MPRnb( PCKAPPAS ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( LCKAPPAD ,LCKAPPAS ,"m*V" ,"" ) -`MPRnb( NCKAPPAD ,NCKAPPAS ,"m*V" ,"" ) -`MPRnb( PCKAPPAD ,PCKAPPAS ,"(m^2)*V" ,"" ) +`MPRnb( LCKAPPAD ,LCKAPPAS ,"m*V" ,"" ) +`MPRnb( NCKAPPAD ,NCKAPPAS ,"m*V" ,"" ) +`MPRnb( PCKAPPAD ,PCKAPPAS ,"(m^2)*V" ,"" ) -`MPRnb( LCGBL ,0.0 ,"F" ,"" ) -`MPRnb( NCGBL ,0.0 ,"F" ,"" ) -`MPRnb( PCGBL ,0.0 ,"F*m" ,"" ) +`MPRnb( LCGBL ,0.0 ,"F" ,"" ) +`MPRnb( NCGBL ,0.0 ,"F" ,"" ) +`MPRnb( PCGBL ,0.0 ,"F*m" ,"" ) -`MPRnb( LCKAPPAB ,0.0 ,"m*V" ,"" ) -`MPRnb( NCKAPPAB ,0.0 ,"m*V" ,"" ) -`MPRnb( PCKAPPAB ,0.0 ,"(m^2)*V" ,"" ) +`MPRnb( LCKAPPAB ,0.0 ,"m*V" ,"" ) +`MPRnb( NCKAPPAB ,0.0 ,"m*V" ,"" ) +`MPRnb( PCKAPPAB ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( LNTGEN ,0.0 ,"" ,"" ) -`MPRnb( NNTGEN ,0.0 ,"" ,"" ) -`MPRnb( PNTGEN ,0.0 ,"" ,"" ) +`MPRnb( LNTGEN ,0.0 ,"" ,"" ) +`MPRnb( NNTGEN ,0.0 ,"" ,"" ) +`MPRnb( PNTGEN ,0.0 ,"" ,"" ) -`MPRnb( LAIGEN ,0.0 ,"(m^-2)*(V^-1)" ,"" ) -`MPRnb( NAIGEN ,0.0 ,"(m^-2)*(V^-1)" ,"" ) -`MPRnb( PAIGEN ,0.0 ,"(m^-1)*(V^-1)" ,"" ) +`MPRnb( LAIGEN ,0.0 ,"(m^-2)*(V^-1)" ,"" ) +`MPRnb( NAIGEN ,0.0 ,"(m^-2)*(V^-1)" ,"" ) +`MPRnb( PAIGEN ,0.0 ,"(m^-1)*(V^-1)" ,"" ) -`MPRnb( LBIGEN ,0.0 ,"(m^-2)*(V^-3)" ,"" ) -`MPRnb( NBIGEN ,0.0 ,"(m^-2)*(V^-3)" ,"" ) -`MPRnb( PBIGEN ,0.0 ,"(m^-1)*(V^-3)" ,"" ) +`MPRnb( LBIGEN ,0.0 ,"(m^-2)*(V^-3)" ,"" ) +`MPRnb( NBIGEN ,0.0 ,"(m^-2)*(V^-3)" ,"" ) +`MPRnb( PBIGEN ,0.0 ,"(m^-1)*(V^-3)" ,"" ) -`MPRnb( LXRCRG1 ,0.0 ,"" ,"" ) -`MPRnb( NXRCRG1 ,0.0 ,"" ,"" ) -`MPRnb( PXRCRG1 ,0.0 ,"" ,"" ) +`MPRnb( LXRCRG1 ,0.0 ,"" ,"" ) +`MPRnb( NXRCRG1 ,0.0 ,"" ,"" ) +`MPRnb( PXRCRG1 ,0.0 ,"" ,"" ) -`MPRnb( LXRCRG2 ,0.0 ,"" ,"" ) -`MPRnb( NXRCRG2 ,0.0 ,"" ,"" ) -`MPRnb( PXRCRG2 ,0.0 ,"" ,"" ) +`MPRnb( LXRCRG2 ,0.0 ,"" ,"" ) +`MPRnb( NXRCRG2 ,0.0 ,"" ,"" ) +`MPRnb( PXRCRG2 ,0.0 ,"" ,"" ) -`MPRnb( LUTE ,0.0 ,"" ,"" ) -`MPRnb( NUTE ,0.0 ,"" ,"" ) -`MPRnb( PUTE ,0.0 ,"" ,"" ) +`MPRnb( LUTE ,0.0 ,"" ,"" ) +`MPRnb( NUTE ,0.0 ,"" ,"" ) +`MPRnb( PUTE ,0.0 ,"" ,"" ) -`MPRnb( LUTER ,LUTE ,"" ,"" ) -`MPRnb( NUTER ,NUTE ,"" ,"" ) -`MPRnb( PUTER ,PUTE ,"" ,"" ) +`MPRnb( LUTER ,LUTE ,"" ,"" ) +`MPRnb( NUTER ,NUTE ,"" ,"" ) +`MPRnb( PUTER ,PUTE ,"" ,"" ) -`MPRnb( LUTL ,0.0 ,"" ,"" ) -`MPRnb( NUTL ,0.0 ,"" ,"" ) -`MPRnb( PUTL ,0.0 ,"" ,"" ) +`MPRnb( LUTL ,0.0 ,"" ,"" ) +`MPRnb( NUTL ,0.0 ,"" ,"" ) +`MPRnb( PUTL ,0.0 ,"" ,"" ) -`MPRnb( LUTLR ,LUTL ,"" ,"" ) -`MPRnb( NUTLR ,NUTL ,"" ,"" ) -`MPRnb( PUTLR ,PUTL ,"" ,"" ) +`MPRnb( LUTLR ,LUTL ,"" ,"" ) +`MPRnb( NUTLR ,NUTL ,"" ,"" ) +`MPRnb( PUTLR ,PUTL ,"" ,"" ) -`MPRnb( LEMOBT ,0.0 ,"" ,"" ) -`MPRnb( NEMOBT ,0.0 ,"" ,"" ) -`MPRnb( PEMOBT ,0.0 ,"" ,"" ) +`MPRnb( LEMOBT ,0.0 ,"" ,"" ) +`MPRnb( NEMOBT ,0.0 ,"" ,"" ) +`MPRnb( PEMOBT ,0.0 ,"" ,"" ) -`MPRnb( LUA1 ,0.0 ,"" ,"" ) -`MPRnb( NUA1 ,0.0 ,"" ,"" ) -`MPRnb( PUA1 ,0.0 ,"" ,"" ) +`MPRnb( LUA1 ,0.0 ,"" ,"" ) +`MPRnb( NUA1 ,0.0 ,"" ,"" ) +`MPRnb( PUA1 ,0.0 ,"" ,"" ) -`MPRnb( LUA1R ,LUA1 ,"" ,"" ) -`MPRnb( NUA1R ,NUA1 ,"" ,"" ) -`MPRnb( PUA1R ,PUA1 ,"" ,"" ) +`MPRnb( LUA1R ,LUA1 ,"" ,"" ) +`MPRnb( NUA1R ,NUA1 ,"" ,"" ) +`MPRnb( PUA1R ,PUA1 ,"" ,"" ) -`MPRnb( LUC1 ,0.0 ,"" ,"" ) -`MPRnb( NUC1 ,0.0 ,"" ,"" ) -`MPRnb( PUC1 ,0.0 ,"" ,"" ) +`MPRnb( LUC1 ,0.0 ,"" ,"" ) +`MPRnb( NUC1 ,0.0 ,"" ,"" ) +`MPRnb( PUC1 ,0.0 ,"" ,"" ) -`MPRnb( LUC1R ,LUC1 ,"" ,"" ) -`MPRnb( NUC1R ,NUC1 ,"" ,"" ) -`MPRnb( PUC1R ,PUC1 ,"" ,"" ) +`MPRnb( LUC1R ,LUC1 ,"" ,"" ) +`MPRnb( NUC1R ,NUC1 ,"" ,"" ) +`MPRnb( PUC1R ,PUC1 ,"" ,"" ) -`MPRnb( LUD1 ,0.0 ,"" ,"" ) -`MPRnb( NUD1 ,0.0 ,"" ,"" ) -`MPRnb( PUD1 ,0.0 ,"" ,"" ) +`MPRnb( LUD1 ,0.0 ,"" ,"" ) +`MPRnb( NUD1 ,0.0 ,"" ,"" ) +`MPRnb( PUD1 ,0.0 ,"" ,"" ) -`MPRnb( LUD1R ,LUD1 ,"" ,"" ) -`MPRnb( NUD1R ,NUD1 ,"" ,"" ) -`MPRnb( PUD1R ,PUD1 ,"" ,"" ) +`MPRnb( LUD1R ,LUD1 ,"" ,"" ) +`MPRnb( NUD1R ,NUD1 ,"" ,"" ) +`MPRnb( PUD1R ,PUD1 ,"" ,"" ) -`MPRnb( LUCSTE ,0.0 ,"" ,"" ) -`MPRnb( NUCSTE ,0.0 ,"" ,"" ) -`MPRnb( PUCSTE ,0.0 ,"" ,"" ) +`MPRnb( LUCSTE ,0.0 ,"" ,"" ) +`MPRnb( NUCSTE ,0.0 ,"" ,"" ) +`MPRnb( PUCSTE ,0.0 ,"" ,"" ) -`MPRnb( LPTWGT ,0.0 ,"m/K" ,"" ) -`MPRnb( NPTWGT ,0.0 ,"m/K" ,"" ) -`MPRnb( PPTWGT ,0.0 ,"(m^2)/K" ,"" ) +`MPRnb( LPTWGT ,0.0 ,"m/K" ,"" ) +`MPRnb( NPTWGT ,0.0 ,"m/K" ,"" ) +`MPRnb( PPTWGT ,0.0 ,"(m^2)/K" ,"" ) -`MPRnb( LAT ,0.0 ,"m/K" ,"" ) -`MPRnb( NAT ,0.0 ,"m/K" ,"" ) -`MPRnb( PAT ,0.0 ,"(m^2)/K" ,"" ) +`MPRnb( LAT ,0.0 ,"m/K" ,"" ) +`MPRnb( NAT ,0.0 ,"m/K" ,"" ) +`MPRnb( PAT ,0.0 ,"(m^2)/K" ,"" ) -`MPRnb( LATR ,LAT ,"" ,"" ) -`MPRnb( NATR ,NAT ,"" ,"" ) -`MPRnb( PATR ,PAT ,"" ,"" ) +`MPRnb( LATR ,LAT ,"" ,"" ) +`MPRnb( NATR ,NAT ,"" ,"" ) +`MPRnb( PATR ,PAT ,"" ,"" ) -`MPRnb( LATCV ,0.0 ,"m/K" ,"" ) -`MPRnb( NATCV ,0.0 ,"m/K" ,"" ) -`MPRnb( PATCV ,0.0 ,"(m^2)/K" ,"" ) +`MPRnb( LATCV ,0.0 ,"m/K" ,"" ) +`MPRnb( NATCV ,0.0 ,"m/K" ,"" ) +`MPRnb( PATCV ,0.0 ,"(m^2)/K" ,"" ) -`MPRnb( LSTTHETASAT ,0.0 ,"" ,"" ) -`MPRnb( NSTTHETASAT ,0.0 ,"" ,"" ) -`MPRnb( PSTTHETASAT ,0.0 ,"" ,"" ) +`MPRnb( LSTTHETASAT ,0.0 ,"" ,"" ) +`MPRnb( NSTTHETASAT ,0.0 ,"" ,"" ) +`MPRnb( PSTTHETASAT ,0.0 ,"" ,"" ) -`MPRnb( LPRT ,0.0 ,"m/K" ,"" ) -`MPRnb( NPRT ,0.0 ,"m/K" ,"" ) -`MPRnb( PPRT ,0.0 ,"(m^2)/K" ,"" ) +`MPRnb( LPRT ,0.0 ,"m/K" ,"" ) +`MPRnb( NPRT ,0.0 ,"m/K" ,"" ) +`MPRnb( PPRT ,0.0 ,"(m^2)/K" ,"" ) -`MPRnb( LKT1 ,0.0 ,"m*V" ,"" ) -`MPRnb( NKT1 ,0.0 ,"m*V" ,"" ) -`MPRnb( PKT1 ,0.0 ,"(m^2)*V" ,"" ) +`MPRnb( LKT1 ,0.0 ,"m*V" ,"" ) +`MPRnb( NKT1 ,0.0 ,"m*V" ,"" ) +`MPRnb( PKT1 ,0.0 ,"(m^2)*V" ,"" ) -`MPRnb( LTSS ,0.0 ,"" ,"" ) -`MPRnb( NTSS ,0.0 ,"" ,"" ) -`MPRnb( PTSS ,0.0 ,"" ,"" ) +`MPRnb( LTSS ,0.0 ,"" ,"" ) +`MPRnb( NTSS ,0.0 ,"" ,"" ) +`MPRnb( PTSS ,0.0 ,"" ,"" ) -`MPRnb( LIIT ,0.0 ,"" ,"" ) -`MPRnb( NIIT ,0.0 ,"" ,"" ) -`MPRnb( PIIT ,0.0 ,"" ,"" ) +`MPRnb( LIIT ,0.0 ,"" ,"" ) +`MPRnb( NIIT ,0.0 ,"" ,"" ) +`MPRnb( PIIT ,0.0 ,"" ,"" ) -`MPRnb( LTII ,0.0 ,"" ,"" ) -`MPRnb( NTII ,0.0 ,"" ,"" ) -`MPRnb( PTII ,0.0 ,"" ,"" ) +`MPRnb( LTII ,0.0 ,"" ,"" ) +`MPRnb( NTII ,0.0 ,"" ,"" ) +`MPRnb( PTII ,0.0 ,"" ,"" ) -`MPRnb( LTGIDL ,0.0 ,"m/K" ,"" ) -`MPRnb( NTGIDL ,0.0 ,"m/K" ,"" ) -`MPRnb( PTGIDL ,0.0 ,"(m^2)/K" ,"" ) +`MPRnb( LTGIDL ,0.0 ,"m/K" ,"" ) +`MPRnb( NTGIDL ,0.0 ,"m/K" ,"" ) +`MPRnb( PTGIDL ,0.0 ,"(m^2)/K" ,"" ) -`MPRnb( LIGT ,0.0 ,"" ,"" ) -`MPRnb( NIGT ,0.0 ,"" ,"" ) -`MPRnb( PIGT ,0.0 ,"" ,"" ) +`MPRnb( LIGT ,0.0 ,"" ,"" ) +`MPRnb( NIGT ,0.0 ,"" ,"" ) +`MPRnb( PIGT ,0.0 ,"" ,"" ) diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_body.include b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_body.include index 6d47e3a5a..fdb851974 100644 --- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_body.include +++ b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_body.include @@ -5,11 +5,11 @@ // ******************************************************** // // ******************************************************** -// * Copyright 2016 Regents of the University of California. +// * Copyright 2016 Regents of the University of California. // * All rights reserved. // * // * Project Director: Prof. Chenming Hu. -// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Sourabh Khandelwal, Darsen Lu, +// * Authors: Sriramkumar V., Navid Paydavosi, Juan Duarte, Sourabh Khandelwal, Darsen Lu, // * Chung-Hsun Lin, Mohan Dunga, Shijing Yao, // * Ali Niknejad, Chenming Hu // ******************************************************** @@ -19,7 +19,7 @@ // support. The University of California and its employees are not liable // for the condition or performance of the software. // The University of California owns the copyright and grants users a perpetual, -// irrevocable, worldwide, non-exclusive, royalty-free license with +// irrevocable, worldwide, non-exclusive, royalty-free license with // respect to the software as set forth below. // The University of California hereby disclaims all implied warranties. // The University of California grants the users the right to modify, copy, @@ -36,81 +36,81 @@ // the software on any copy or modification of such made available // to others // Agreed to on __Jan 01, 2016__________________ -// By: ___University of California, Berkeley____ -// ___Chenming Hu_____________________ +// By: ___University of California, Berkeley____ +// ___Chenming Hu_____________________ // ___Professor in Graduate School _______ // ******************************************************** // Clamped Exponential Function analog function real lexp; - input x; - real x; - - begin - if (x > `EXPL_THRESHOLD) begin - lexp = `MAX_EXPL * (1.0 + x - `EXPL_THRESHOLD); - end else if (x < -`EXPL_THRESHOLD) begin - lexp = `MIN_EXPL; - end else begin - lexp = exp(x); - end - end + input x; + real x; + + begin + if (x > `EXPL_THRESHOLD) begin + lexp = `MAX_EXPL * (1.0 + x - `EXPL_THRESHOLD); + end else if (x < -`EXPL_THRESHOLD) begin + lexp = `MIN_EXPL; + end else begin + lexp = exp(x); + end + end endfunction // Clamped log Function analog function real lln; - input x; - real x; + input x; + real x; - begin - lln = ln(max(x, `N_MINLOG)); - end + begin + lln = ln(max(x, `N_MINLOG)); + end endfunction // Hyperbolic Smoothing Function analog function real hypsmooth; - input x, c; - real x, c; + input x, c; + real x, c; - begin - hypsmooth = 0.5 * (x + sqrt(x * x + 4.0 * c * c)); - end + begin + hypsmooth = 0.5 * (x + sqrt(x * x + 4.0 * c * c)); + end endfunction // Hyperbolic Smoothing max Function analog function real hypmax; - input x, xmin, c; - real x, xmin, c; + input x, xmin, c; + real x, xmin, c; - begin - hypmax = xmin + 0.5 * (x - xmin - c + sqrt((x - xmin - c) * (x - xmin - c) - 4.0 * xmin * c)); - end + begin + hypmax = xmin + 0.5 * (x - xmin - c + sqrt((x - xmin - c) * (x - xmin - c) - 4.0 * xmin * c)); + end endfunction // Temperature Dependence Type analog function real Tempdep; - input PARAML, PARAMT, DELTEMP, TEMPMOD; - real PARAML, PARAMT, DELTEMP, TEMPMOD; - - begin - if (TEMPMOD != 0) begin - Tempdep = PARAML + hypmax(PARAMT * DELTEMP, -PARAML, 1.0e-6); - end else begin - Tempdep = PARAML * hypsmooth(1.0 + PARAMT * DELTEMP - 1.0e-6, 1.0e-3); - end - end + input PARAML, PARAMT, DELTEMP, TEMPMOD; + real PARAML, PARAMT, DELTEMP, TEMPMOD; + + begin + if (TEMPMOD != 0) begin + Tempdep = PARAML + hypmax(PARAMT * DELTEMP, -PARAML, 1.0e-6); + end else begin + Tempdep = PARAML * hypsmooth(1.0 + PARAMT * DELTEMP - 1.0e-6, 1.0e-3); + end + end endfunction // Node Definitions `ifdef __RGATEMOD__ - `define GateEdgeNode ge + `define GateEdgeNode ge `else - `define GateEdgeNode g + `define GateEdgeNode g `endif `ifdef __NQSMOD1__ - `define IntrinsicGate gi + `define IntrinsicGate gi `else - `define IntrinsicGate `GateEdgeNode + `define IntrinsicGate `GateEdgeNode `endif // *************************** @@ -118,727 +118,727 @@ endfunction // *************************** // Note: Some instance parameters are also model parameters. Please refer to the technical note for details. -`IPRco( L ,3.0e-8 ,"m" ,1.0e-9 ,inf ,"Designed gate length" ) -`IPRco( D ,4.0e-8 ,"m" ,1.0e-9 ,inf ,"Diameter of the cylinder (GEOMOD=3)" ) -`IPRco( TFIN ,1.5e-8 ,"m" ,1.0e-9 ,inf ,"Body (fin) thickness" ) -`IPRco( FPITCH ,8.0e-8 ,"m" ,TFIN ,inf ,"Fin pitch" ) -`IPIco( NF ,1 ,"" ,1 ,inf ,"Number of fingers" ) -`IPRoz( NFIN ,1.0 ,"" ,"Number of fins per finger (real number enables optimization)" ) -`IPIcc( NGCON ,1 ,"" ,1 ,2 ,"Number of gate contact (1 or 2 sided)" ) -`IPRcz( ASEO ,0.0 ,"m^2" ,"Source-to-substrate overlap area through oxide" ) -`IPRcz( ADEO ,0.0 ,"m^2" ,"Drain-to-substrate overlap area through oxide" ) -`IPRcz( PSEO ,0.0 ,"m" ,"Perimeter of source-to-substrate overlap region through oxide" ) -`IPRcz( PDEO ,0.0 ,"m" ,"Perimeter of drain-to-substrate overlap region through oxide" ) -`IPRcz( ASEJ ,0.0 ,"m^2" ,"Source junction area (BULKMOD=1 or 2)" ) -`IPRcz( ADEJ ,0.0 ,"m^2" ,"Drain junction area (BULKMOD=1 or 2)" ) -`IPRcz( PSEJ ,0.0 ,"m" ,"Source-to-substrate PN junction perimeter (BULKMOD=1 or 2)" ) -`IPRcz( PDEJ ,0.0 ,"m" ,"Drain-to-substrate PN junction perimeter (BULKMOD=1 or 2)" ) -`IPRcz( COVS ,0.0 ,"F/m" ,"Constant gate-to-source overlap capacitance (CGEOMOD=1)" ) -`IPRcz( COVD ,COVS ,"F/m" ,"Constant gate-to-drain overlap capacitance (CGEOMOD=1)" ) -`IPRcz( CGSP ,0.0 ,"F/m" ,"Constant gate-to-source fringe capacitance (CGEOMOD=1)" ) -`IPRcz( CGDP ,0.0 ,"F/m" ,"Constant gate-to-drain fringe capacitance (CGEOMOD=1)" ) -`IPRcz( CDSP ,0.0 ,"F" ,"Constant drain-to-source fringe capacitance (all CGEOMOD)" ) -`IPRcz( NRS ,0.0 ,"" ,"Number of source diffusion squares" ) -`IPRcz( NRD ,0.0 ,"" ,"Number of source diffusion squares" ) -`IPRoz( LRSD ,L ,"m" ,"Length of the source/drain" ) -`IPRoz( NFINNOM ,1.0 ,"" ,"Nominal number of fins per finger" ) +`IPRco( L ,3.0e-8 ,"m" ,1.0e-9 ,inf ,"Designed gate length" ) +`IPRco( D ,4.0e-8 ,"m" ,1.0e-9 ,inf ,"Diameter of the cylinder (GEOMOD=3)" ) +`IPRco( TFIN ,1.5e-8 ,"m" ,1.0e-9 ,inf ,"Body (fin) thickness" ) +`IPRco( FPITCH ,8.0e-8 ,"m" ,TFIN ,inf ,"Fin pitch" ) +`IPIco( NF ,1 ,"" ,1 ,inf ,"Number of fingers" ) +`IPRoz( NFIN ,1.0 ,"" ,"Number of fins per finger (real number enables optimization)" ) +`IPIcc( NGCON ,1 ,"" ,1 ,2 ,"Number of gate contact (1 or 2 sided)" ) +`IPRcz( ASEO ,0.0 ,"m^2" ,"Source-to-substrate overlap area through oxide" ) +`IPRcz( ADEO ,0.0 ,"m^2" ,"Drain-to-substrate overlap area through oxide" ) +`IPRcz( PSEO ,0.0 ,"m" ,"Perimeter of source-to-substrate overlap region through oxide" ) +`IPRcz( PDEO ,0.0 ,"m" ,"Perimeter of drain-to-substrate overlap region through oxide" ) +`IPRcz( ASEJ ,0.0 ,"m^2" ,"Source junction area (BULKMOD=1 or 2)" ) +`IPRcz( ADEJ ,0.0 ,"m^2" ,"Drain junction area (BULKMOD=1 or 2)" ) +`IPRcz( PSEJ ,0.0 ,"m" ,"Source-to-substrate PN junction perimeter (BULKMOD=1 or 2)" ) +`IPRcz( PDEJ ,0.0 ,"m" ,"Drain-to-substrate PN junction perimeter (BULKMOD=1 or 2)" ) +`IPRcz( COVS ,0.0 ,"F/m" ,"Constant gate-to-source overlap capacitance (CGEOMOD=1)" ) +`IPRcz( COVD ,COVS ,"F/m" ,"Constant gate-to-drain overlap capacitance (CGEOMOD=1)" ) +`IPRcz( CGSP ,0.0 ,"F/m" ,"Constant gate-to-source fringe capacitance (CGEOMOD=1)" ) +`IPRcz( CGDP ,0.0 ,"F/m" ,"Constant gate-to-drain fringe capacitance (CGEOMOD=1)" ) +`IPRcz( CDSP ,0.0 ,"F" ,"Constant drain-to-source fringe capacitance (all CGEOMOD)" ) +`IPRcz( NRS ,0.0 ,"" ,"Number of source diffusion squares" ) +`IPRcz( NRD ,0.0 ,"" ,"Number of source diffusion squares" ) +`IPRoz( LRSD ,L ,"m" ,"Length of the source/drain" ) +`IPRoz( NFINNOM ,1.0 ,"" ,"Nominal number of fins per finger" ) // Variability Handles -`MPRnb( XL ,0.0 ,"m" ,"L offset for channel length due to mask/etch effect" ) -`MPRnb( DTEMP ,0.0 ,"Celsius" ,"Variability in device temperature" ) -`MPRnb( DELVTRAND ,0.0 ,"V" ,"Variability in Vth" ) -`MPRcz( U0MULT ,1.0 ,"" ,"Variability in carrier mobility" ) -`MPRcz( IDS0MULT ,1.0 ,"" ,"Variability in drain current for miscellaneous reasons" ) +`MPRnb( XL ,0.0 ,"m" ,"L offset for channel length due to mask/etch effect" ) +`MPRnb( DTEMP ,0.0 ,"Celsius" ,"Variability in device temperature" ) +`MPRnb( DELVTRAND ,0.0 ,"V" ,"Variability in Vth" ) +`MPRcz( U0MULT ,1.0 ,"" ,"Variability in carrier mobility" ) +`MPRcz( IDS0MULT ,1.0 ,"" ,"Variability in drain current for miscellaneous reasons" ) // ************************ // * Model Parameters * // ************************ -`MPIcc( DEVTYPE ,`ntype ,"" ,`ptype ,`ntype ,"0: PMOS; 1: NMOS" ) -`MPIcc( TYPE ,DEVTYPE ,"" ,`ptype ,`ntype ,"0: PMOS; 1: NMOS" ) -`MPIcc( BULKMOD ,0 ,"" ,0 ,2 ,"0: SOI multi-gate; 1: Bulk multi-gate; 2: for decoupled bulk multi-gate" ) -`MPIcc( GEOMOD ,0 ,"" ,0 ,4 ,"0: Double gate; 1: Triple gate; 2: Quadruple gate; 3: Cylindrical gate; 4: Unified fin Shape" ) -`MPIcc( CGEO1SW ,0 ,"" ,0 ,1 ,"For CGEOMOD=1 only, this switch enables the parameters COVS, COVD, CGSP, and CGDP to be in F per fin, per gate-finger, per unit channel width" ) -`MPIcc( RDSMOD ,0 ,"" ,0 ,2 ,"0: Internal S/D resistance model; 1: External S/D resistance model; 2: Both bias dependent and independent part of S/D resistance internal" ) -`MPIcc( ASYMMOD ,0 ,"" ,0 ,1 ,"0: Turn off asymmetry model - forward mode parameters used; 1: Turn on asymmetry model" ) -`MPIcc( IGCMOD ,0 ,"" ,0 ,1 ,"0: Turn off Igc, Igs and Igd; 1: Turn on Igc, Igs and Igd" ) -`MPIcc( IGBMOD ,0 ,"" ,0 ,1 ,"0: Turn off Igb; 1: Turn on Igb" ) -`MPIcc( GIDLMOD ,0 ,"" ,0 ,1 ,"0: Turn off GIDL/GISL current; 1: Turn on GIDL/GISL current" ) -`MPIcc( IIMOD ,0 ,"" ,0 ,2 ,"0: Turn off impact ionization current; 1: BSIM4-based model; 2: BSIMSOI-based model" ) -`MPIcc( TNOIMOD ,0 ,"" ,0 ,1 ,"0: Charge-based, 1: Correlated thermal noise model" ) -`MPIcc( NQSMOD ,0 ,"" ,0 ,2 ,"0: Turn off NQS model; 1: NQS gate resistance (with gi node); 2: NQS charge deficit model from BSIM4 (with q node)" ) -`MPIcc( SHMOD ,0 ,"" ,0 ,1 ,"0: Turn off self-heating; 1: Turn on self-heating" ) -`MPIcc( TEMPMOD ,0 ,"" ,0 ,1 ,"1: Change temperature dependence of specific parameters" ) -`MPIcc( RGATEMOD ,0 ,"" ,0 ,1 ,"0: Turn off gate electrode resistance (without ge node); 1: Turn on gate electrode resistance (with ge node)" ) -`MPIcc( RGEOMOD ,0 ,"" ,0 ,1 ,"Geometry-dependent source/drain resistance; 0: RSH-based; 1: Holistic" ) +`MPIcc( DEVTYPE ,`ntype ,"" ,`ptype ,`ntype ,"0: PMOS; 1: NMOS" ) +`MPIcc( TYPE ,DEVTYPE ,"" ,`ptype ,`ntype ,"0: PMOS; 1: NMOS" ) +`MPIcc( BULKMOD ,0 ,"" ,0 ,2 ,"0: SOI multi-gate; 1: Bulk multi-gate; 2: for decoupled bulk multi-gate" ) +`MPIcc( GEOMOD ,0 ,"" ,0 ,4 ,"0: Double gate; 1: Triple gate; 2: Quadruple gate; 3: Cylindrical gate; 4: Unified fin Shape" ) +`MPIcc( CGEO1SW ,0 ,"" ,0 ,1 ,"For CGEOMOD=1 only, this switch enables the parameters COVS, COVD, CGSP, and CGDP to be in F per fin, per gate-finger, per unit channel width" ) +`MPIcc( RDSMOD ,0 ,"" ,0 ,2 ,"0: Internal S/D resistance model; 1: External S/D resistance model; 2: Both bias dependent and independent part of S/D resistance internal" ) +`MPIcc( ASYMMOD ,0 ,"" ,0 ,1 ,"0: Turn off asymmetry model - forward mode parameters used; 1: Turn on asymmetry model" ) +`MPIcc( IGCMOD ,0 ,"" ,0 ,1 ,"0: Turn off Igc, Igs and Igd; 1: Turn on Igc, Igs and Igd" ) +`MPIcc( IGBMOD ,0 ,"" ,0 ,1 ,"0: Turn off Igb; 1: Turn on Igb" ) +`MPIcc( GIDLMOD ,0 ,"" ,0 ,1 ,"0: Turn off GIDL/GISL current; 1: Turn on GIDL/GISL current" ) +`MPIcc( IIMOD ,0 ,"" ,0 ,2 ,"0: Turn off impact ionization current; 1: BSIM4-based model; 2: BSIMSOI-based model" ) +`MPIcc( TNOIMOD ,0 ,"" ,0 ,1 ,"0: Charge-based, 1: Correlated thermal noise model" ) +`MPIcc( NQSMOD ,0 ,"" ,0 ,2 ,"0: Turn off NQS model; 1: NQS gate resistance (with gi node); 2: NQS charge deficit model from BSIM4 (with q node)" ) +`MPIcc( SHMOD ,0 ,"" ,0 ,1 ,"0: Turn off self-heating; 1: Turn on self-heating" ) +`MPIcc( TEMPMOD ,0 ,"" ,0 ,1 ,"1: Change temperature dependence of specific parameters" ) +`MPIcc( RGATEMOD ,0 ,"" ,0 ,1 ,"0: Turn off gate electrode resistance (without ge node); 1: Turn on gate electrode resistance (with ge node)" ) +`MPIcc( RGEOMOD ,0 ,"" ,0 ,1 ,"Geometry-dependent source/drain resistance; 0: RSH-based; 1: Holistic" ) `MPIcc( CGEOMOD ,0 ,"" ,0 ,2 ,"Geometry-dependent parasitic capacitance model selector" ) `MPIcc( SH_WARN ,0 ,"" ,0 ,1 ,"0: Disable self-heating warnings; 1: Enable self-heating warnings" ) `MPIcc( IGCLAMP ,1 ,"" ,0 ,1 ,"0: Disable gate current clamps; 1: Enable gate current clamps" ) -`MPRnb( LINT ,0.0 ,"m" ,"Length reduction parameter (dopant diffusion effect)" ) -`MPRnb( LL ,0.0 ,"m^(LLN+1)" ,"Length reduction parameter (dopant diffusion effect)" ) -`MPRnb( LLN ,1.0 ,"" ,"Length reduction parameter (dopant diffusion effect)" ) -`MPRnb( DLC ,0.0 ,"m" ,"Delta L for C-V model" ) -`MPRnb( DLCACC ,0.0 ,"m" ,"Delta L for C-V model in accumulation region (BULKMOD=1 or 2)" ) -`MPRnb( DLBIN ,0.0 ,"m" ,"Delta L for binning" ) -`MPRnb( LLC ,0.0 ,"m^(LLN+1)" ,"Length reduction parameter (dopant diffusion effect)" ) -`MPRco( EOT ,1.0e-9 ,"m" ,1.0e-10 ,inf ,"Equivalent oxide thickness" ) -`MPRco( TOXP ,1.2e-9 ,"m" ,1.0e-10 ,inf ,"Physical oxide thickness" ) -`MPRco( EOTBOX ,1.4e-7 ,"m" ,1.0e-9 ,inf ,"Equivalent oxide thickness of the buried oxide (SOI FinFET)" ) -`MPRco( HFIN ,3.0e-8 ,"m" ,1.0e-9 ,inf ,"Fin height" ) -`MPRcz( FECH ,1.0 ,"" ,"End-channel factor for different orientation/shape" ) -`MPRnb( DELTAW ,0.0 ,"m" ,"Change of effective width due to shape of fin/cylinder" ) -`MPRcz( FECHCV ,1.0 ,"" ,"CV end-channel factor for different orientation/shape" ) -`MPRnb( DELTAWCV ,0.0 ,"m" ,"CV change of effective width due to shape of fin/cylinder" ) -`MPRnb( NBODY ,1.0e22 ,"/m^3" ,"Channel (body) doping" ) -`MPRnb( NBODYN1 ,0.0 ,"" ,"NFIN dependence of channel (body) doping" ) -`MPRex( NBODYN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of channel (body) doping" ) -`MPRcc( NSD ,2.0e26 ,"/m^3" ,2.0e25 ,1.0e27 ,"Source/drain active doping concentration" ) -`MPRcz( PHIG ,4.61 ,"eV" ,"Gate workfunction" ) -`MPRnb( PHIGL ,0.0 ,"eV/m" ,"Length dependence of gate workfunction" ) -`MPRnb( PHIGLT ,0.0 ,"/m" ,"Coupled NFIN and length dependence of gate workfunction" ) -`MPRnb( PHIGN1 ,0.0 ,"" ,"NFIN dependence of gate workfunction" ) -`MPRex( PHIGN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of gate workfunction" ) -`MPRco( EPSROX ,3.9 ,"" ,1.0 ,inf ,"Relative dielectric constant of the gate dielectric" ) -`MPRco( EPSRSUB ,11.9 ,"" ,1.0 ,inf ,"Relative dielectric constant of the channel material" ) -`MPRcz( EASUB ,4.05 ,"eV" ,"Electron affinity of substrate" ) -`MPRnb( NI0SUB ,1.1e16 ,"/m^3" ,"Intrinsic carrier constant at 300.15K" ) -`MPRnb( BG0SUB ,1.12 ,"eV" ,"Bandgap of substrate at 300.15K" ) -`MPRnb( NC0SUB ,2.86e25 ,"/m^3" ,"Conduction band density of states" ) -`MPRnb( NGATE ,0.0 ,"/m^3" ,"Parameter for poly gate doping. For metal gate please set NGATE = 0" ) -`MPRnb( Imin ,1.0e-15 ,"A/m^2" ,"Parameter for Vgs clamping for inversion region calculation in accumulation" ) +`MPRnb( LINT ,0.0 ,"m" ,"Length reduction parameter (dopant diffusion effect)" ) +`MPRnb( LL ,0.0 ,"m^(LLN+1)" ,"Length reduction parameter (dopant diffusion effect)" ) +`MPRnb( LLN ,1.0 ,"" ,"Length reduction parameter (dopant diffusion effect)" ) +`MPRnb( DLC ,0.0 ,"m" ,"Delta L for C-V model" ) +`MPRnb( DLCACC ,0.0 ,"m" ,"Delta L for C-V model in accumulation region (BULKMOD=1 or 2)" ) +`MPRnb( DLBIN ,0.0 ,"m" ,"Delta L for binning" ) +`MPRnb( LLC ,0.0 ,"m^(LLN+1)" ,"Length reduction parameter (dopant diffusion effect)" ) +`MPRco( EOT ,1.0e-9 ,"m" ,1.0e-10 ,inf ,"Equivalent oxide thickness" ) +`MPRco( TOXP ,1.2e-9 ,"m" ,1.0e-10 ,inf ,"Physical oxide thickness" ) +`MPRco( EOTBOX ,1.4e-7 ,"m" ,1.0e-9 ,inf ,"Equivalent oxide thickness of the buried oxide (SOI FinFET)" ) +`MPRco( HFIN ,3.0e-8 ,"m" ,1.0e-9 ,inf ,"Fin height" ) +`MPRcz( FECH ,1.0 ,"" ,"End-channel factor for different orientation/shape" ) +`MPRnb( DELTAW ,0.0 ,"m" ,"Change of effective width due to shape of fin/cylinder" ) +`MPRcz( FECHCV ,1.0 ,"" ,"CV end-channel factor for different orientation/shape" ) +`MPRnb( DELTAWCV ,0.0 ,"m" ,"CV change of effective width due to shape of fin/cylinder" ) +`MPRnb( NBODY ,1.0e22 ,"/m^3" ,"Channel (body) doping" ) +`MPRnb( NBODYN1 ,0.0 ,"" ,"NFIN dependence of channel (body) doping" ) +`MPRex( NBODYN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of channel (body) doping" ) +`MPRcc( NSD ,2.0e26 ,"/m^3" ,2.0e25 ,1.0e27 ,"Source/drain active doping concentration" ) +`MPRcz( PHIG ,4.61 ,"eV" ,"Gate workfunction" ) +`MPRnb( PHIGL ,0.0 ,"eV/m" ,"Length dependence of gate workfunction" ) +`MPRnb( PHIGLT ,0.0 ,"/m" ,"Coupled NFIN and length dependence of gate workfunction" ) +`MPRnb( PHIGN1 ,0.0 ,"" ,"NFIN dependence of gate workfunction" ) +`MPRex( PHIGN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of gate workfunction" ) +`MPRco( EPSROX ,3.9 ,"" ,1.0 ,inf ,"Relative dielectric constant of the gate dielectric" ) +`MPRco( EPSRSUB ,11.9 ,"" ,1.0 ,inf ,"Relative dielectric constant of the channel material" ) +`MPRcz( EASUB ,4.05 ,"eV" ,"Electron affinity of substrate" ) +`MPRnb( NI0SUB ,1.1e16 ,"/m^3" ,"Intrinsic carrier constant at 300.15K" ) +`MPRnb( BG0SUB ,1.12 ,"eV" ,"Bandgap of substrate at 300.15K" ) +`MPRnb( NC0SUB ,2.86e25 ,"/m^3" ,"Conduction band density of states" ) +`MPRnb( NGATE ,0.0 ,"/m^3" ,"Parameter for poly gate doping. For metal gate please set NGATE = 0" ) +`MPRnb( Imin ,1.0e-15 ,"A/m^2" ,"Parameter for Vgs clamping for inversion region calculation in accumulation" ) // Short Channel Effects -`MPRnb( CIT ,0.0 ,"F/m^2" ,"Parameter for interface trap" ) -`MPRnb( CITR ,CIT ,"" ,"Parameter for interface trap in reverse mode for asymmetric model" ) -`MPRnb( CDSC ,7.0e-3 ,"F/m^2" ,"Coupling capacitance between S/D and channel" ) -`MPRnb( CDSCN1 ,0.0 ,"" ,"NFIN dependence of CDSC" ) -`MPRnb( CDSCN2 ,1.0e5 ,"" ,"NFIN dependence of CDSC" ) -`MPRnb( CDSCD ,7.0e-3 ,"F/m^2" ,"Drain-bias sensitivity of CDSC" ) -`MPRnb( CDSCDN1 ,0.0 ,"" ,"NFIN dependence of CDSCD" ) -`MPRex( CDSCDN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of CDSCD" ) -`MPRnb( CDSCDR ,CDSCD ,"F/m^2" ,"Reverse-mode drain-bias sensitivity of CDSC" ) -`MPRnb( CDSCDRN1 ,CDSCDN1 ,"" ,"NFIN dependence of CDSCD" ) -`MPRex( CDSCDRN2 ,CDSCDN2 ,"" ,0.0 ,"NFIN dependence of CDSCD" ) -`MPRnb( DVT0 ,0.0 ,"" ,"SCE coefficient" ) -`MPRnb( DVT1 ,0.6 ,"" ,"SCE exponent coefficient. After binning it should be within (0:inf)" ) -`MPRnb( DVT1SS ,DVT1 ,"" ,"Subthreshold swing exponent coefficient. After binning it should be within (0:inf)" ) -`MPRnb( PHIN ,0.05 ,"V" ,"Nonuniform vertical doping effect on surface potential" ) -`MPRnb( ETA0 ,0.6 ,"" ,"DIBL coefficient" ) -`MPRnb( ETA0N1 ,0.0 ,"" ,"NFIN dependence of ETA0" ) -`MPRco( ETA0N2 ,1.0e5 ,"" ,1.0e-5 ,inf ,"NFIN dependence of ETA0" ) -`MPRnb( ETA0LT ,0.0 ,"/m" ,"Coupled NFIN and length dependence of ETA0" ) -`MPRnb( TETA0 ,0.0 ,"/K" ,"Temperature dependence of DIBL coefficient" ) -`MPRnb( ETA0R ,ETA0 ,"" ,"Reverse-mode DIBL coefficient" ) -`MPRnb( TETA0R ,TETA0 ,"/K" ,"Temperature dependence of reverse-mode DIBL coefficient" ) -`MPRnb( DSUB ,1.06 ,"" ,"DIBL exponent coefficient" ) -`MPRnb( DVTP0 ,0.0 ,"" ,"Coefficient for drain-induced Vth shift (DITS)" ) -`MPRnb( DVTP1 ,0.0 ,"" ,"DITS exponent coefficient" ) -`MPRnb( ADVTP0 ,0.0 ,"" ,"Pre-exponential coefficient for DITS" ) -`MPRex( BDVTP0 ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for DITS" ) -`MPRnb( ADVTP1 ,0.0 ,"" ,"Pre-exponential coefficient for DVTP1" ) -`MPRex( BDVTP1 ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for DVTP1" ) -`MPRnb( DVTP2 ,0.0 ,"" ,"DITS model parameter" ) -`MPRnb( K1RSCE ,0.0 ,"/V^(0.5)" ,"K1 for reverse short channel effect calculation" ) -`MPRnb( LPE0 ,5.0e-9 ,"m" ,"Equivalent length of pocket region at zero bias" ) -`MPRnb( DVTSHIFT ,0.0 ,"V" ,"Vth shift handle" ) -`MPRnb( DVTSHIFTR ,DVTSHIFT ,"" ,"Vth shift handle for asymmetric mode" ) -`MPRnb( THETASCE ,0.0 ,"" ,"Vth roll-off length dependence. If defined by user, it will overwrite Theta_SCE in the code") -`MPRnb( THETADIBL ,0.0 ,"" ,"DIBL length dependence. If defined by user, will overwrite Theta_DIBL in the code" ) -`MPRnb( THETASW ,0.0 ,"" ,"Subthreshold swing length dependence. If defined by user, it will overwrite Theta_SW in the code" ) -`MPRnb( NVTM ,0.0 ,"V" ,"Subthreshold swing factor multiplied by Vtm. If defined by user, it will overwrite nVtm in the code" ) +`MPRnb( CIT ,0.0 ,"F/m^2" ,"Parameter for interface trap" ) +`MPRnb( CITR ,CIT ,"" ,"Parameter for interface trap in reverse mode for asymmetric model" ) +`MPRnb( CDSC ,7.0e-3 ,"F/m^2" ,"Coupling capacitance between S/D and channel" ) +`MPRnb( CDSCN1 ,0.0 ,"" ,"NFIN dependence of CDSC" ) +`MPRnb( CDSCN2 ,1.0e5 ,"" ,"NFIN dependence of CDSC" ) +`MPRnb( CDSCD ,7.0e-3 ,"F/m^2" ,"Drain-bias sensitivity of CDSC" ) +`MPRnb( CDSCDN1 ,0.0 ,"" ,"NFIN dependence of CDSCD" ) +`MPRex( CDSCDN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of CDSCD" ) +`MPRnb( CDSCDR ,CDSCD ,"F/m^2" ,"Reverse-mode drain-bias sensitivity of CDSC" ) +`MPRnb( CDSCDRN1 ,CDSCDN1 ,"" ,"NFIN dependence of CDSCD" ) +`MPRex( CDSCDRN2 ,CDSCDN2 ,"" ,0.0 ,"NFIN dependence of CDSCD" ) +`MPRnb( DVT0 ,0.0 ,"" ,"SCE coefficient" ) +`MPRnb( DVT1 ,0.6 ,"" ,"SCE exponent coefficient. After binning it should be within (0:inf)" ) +`MPRnb( DVT1SS ,DVT1 ,"" ,"Subthreshold swing exponent coefficient. After binning it should be within (0:inf)" ) +`MPRnb( PHIN ,0.05 ,"V" ,"Nonuniform vertical doping effect on surface potential" ) +`MPRnb( ETA0 ,0.6 ,"" ,"DIBL coefficient" ) +`MPRnb( ETA0N1 ,0.0 ,"" ,"NFIN dependence of ETA0" ) +`MPRco( ETA0N2 ,1.0e5 ,"" ,1.0e-5 ,inf ,"NFIN dependence of ETA0" ) +`MPRnb( ETA0LT ,0.0 ,"/m" ,"Coupled NFIN and length dependence of ETA0" ) +`MPRnb( TETA0 ,0.0 ,"/K" ,"Temperature dependence of DIBL coefficient" ) +`MPRnb( ETA0R ,ETA0 ,"" ,"Reverse-mode DIBL coefficient" ) +`MPRnb( TETA0R ,TETA0 ,"/K" ,"Temperature dependence of reverse-mode DIBL coefficient" ) +`MPRnb( DSUB ,1.06 ,"" ,"DIBL exponent coefficient" ) +`MPRnb( DVTP0 ,0.0 ,"" ,"Coefficient for drain-induced Vth shift (DITS)" ) +`MPRnb( DVTP1 ,0.0 ,"" ,"DITS exponent coefficient" ) +`MPRnb( ADVTP0 ,0.0 ,"" ,"Pre-exponential coefficient for DITS" ) +`MPRex( BDVTP0 ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for DITS" ) +`MPRnb( ADVTP1 ,0.0 ,"" ,"Pre-exponential coefficient for DVTP1" ) +`MPRex( BDVTP1 ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for DVTP1" ) +`MPRnb( DVTP2 ,0.0 ,"" ,"DITS model parameter" ) +`MPRnb( K1RSCE ,0.0 ,"/V^(0.5)" ,"K1 for reverse short channel effect calculation" ) +`MPRnb( LPE0 ,5.0e-9 ,"m" ,"Equivalent length of pocket region at zero bias" ) +`MPRnb( DVTSHIFT ,0.0 ,"V" ,"Vth shift handle" ) +`MPRnb( DVTSHIFTR ,DVTSHIFT ,"" ,"Vth shift handle for asymmetric mode" ) +`MPRnb( THETASCE ,0.0 ,"" ,"Vth roll-off length dependence. If defined by user, it will overwrite Theta_SCE in the code") +`MPRnb( THETADIBL ,0.0 ,"" ,"DIBL length dependence. If defined by user, will overwrite Theta_DIBL in the code" ) +`MPRnb( THETASW ,0.0 ,"" ,"Subthreshold swing length dependence. If defined by user, it will overwrite Theta_SW in the code" ) +`MPRnb( NVTM ,0.0 ,"V" ,"Subthreshold swing factor multiplied by Vtm. If defined by user, it will overwrite nVtm in the code" ) // Lateral non-uniform doping effect (IV-CV Vth shift) -`MPRnb( K0 ,0.0 ,"V" ,"Lateral NUD voltage parameter" ) -`MPRnb( K01 ,0.0 ,"V/K" ,"Temperature dependence of lateral NUD voltage parameter" ) -`MPRnb( K0SI ,1.0 ,"" ,"Correction factor for strong inversion used in Mnud. After binning it should be within (0:inf)" ) -`MPRnb( K0SI1 ,0.0 ,"/K" ,"Temperature dependence of K0SI" ) -`MPRnb( K2SI ,K0SI ,"" ,"Correction factor for strong inversion used in Mob" ) -`MPRnb( K2SI1 ,K0SI1 ,"" ,"Temperature dependence of K2SI" ) -`MPRnb( K0SISAT ,0.0 ,"" ,"Correction factor for strong inversion used in Mnud" ) -`MPRnb( K0SISAT1 ,0.0 ,"" ,"Temperature dependence of K0SISAT" ) -`MPRnb( K2SISAT ,K0SISAT ,"" ,"Correction factor for strong inversion used in Mob" ) -`MPRnb( K2SISAT1 ,K0SISAT1 ,"" ,"Temperature dependence of K2SISAT" ) +`MPRnb( K0 ,0.0 ,"V" ,"Lateral NUD voltage parameter" ) +`MPRnb( K01 ,0.0 ,"V/K" ,"Temperature dependence of lateral NUD voltage parameter" ) +`MPRnb( K0SI ,1.0 ,"" ,"Correction factor for strong inversion used in Mnud. After binning it should be within (0:inf)" ) +`MPRnb( K0SI1 ,0.0 ,"/K" ,"Temperature dependence of K0SI" ) +`MPRnb( K2SI ,K0SI ,"" ,"Correction factor for strong inversion used in Mob" ) +`MPRnb( K2SI1 ,K0SI1 ,"" ,"Temperature dependence of K2SI" ) +`MPRnb( K0SISAT ,0.0 ,"" ,"Correction factor for strong inversion used in Mnud" ) +`MPRnb( K0SISAT1 ,0.0 ,"" ,"Temperature dependence of K0SISAT" ) +`MPRnb( K2SISAT ,K0SISAT ,"" ,"Correction factor for strong inversion used in Mob" ) +`MPRnb( K2SISAT1 ,K0SISAT1 ,"" ,"Temperature dependence of K2SISAT" ) // Body Effect for MG Devices on Bulk Substrate (ex: FinFETs on BULK) -`MPRnb( PHIBE ,0.7 ,"V" ,"Body effect voltage parameter. After binning it should be within [0.2:1.2]" ) -`MPRco( K1 ,1.0e-6 ,"V^(0.5)" ,1.0e-6 ,inf ,"Body effect coefficient for subthreshold region" ) -`MPRnb( K11 ,0.0 ,"V^(0.5)/K" ,"Temperature dependence of K1" ) -`MPRnb( K2SAT ,0.0 ,"" ,"Correction factor for K2 in saturation (high Vds)" ) -`MPRnb( K2SAT1 ,0.0 ,"" ,"Temperature dependence of K2SAT" ) -`MPRnb( K2 ,0.0 ,"" ,"Body effect coefficient for BULKMOD==2" ) -`MPRnb( K21 ,0.0 ,"" ,"Temperature dependence of K2" ) +`MPRnb( PHIBE ,0.7 ,"V" ,"Body effect voltage parameter. After binning it should be within [0.2:1.2]" ) +`MPRco( K1 ,1.0e-6 ,"V^(0.5)" ,1.0e-6 ,inf ,"Body effect coefficient for subthreshold region" ) +`MPRnb( K11 ,0.0 ,"V^(0.5)/K" ,"Temperature dependence of K1" ) +`MPRnb( K2SAT ,0.0 ,"" ,"Correction factor for K2 in saturation (high Vds)" ) +`MPRnb( K2SAT1 ,0.0 ,"" ,"Temperature dependence of K2SAT" ) +`MPRnb( K2 ,0.0 ,"" ,"Body effect coefficient for BULKMOD==2" ) +`MPRnb( K21 ,0.0 ,"" ,"Temperature dependence of K2" ) // Quantum Mechanical Effect -`MPRnb( QMFACTOR ,0.0 ,"" ,"Prefactor + switch for QM Vth correction" ) -`MPRnb( QMTCENCV ,0.0 ,"" ,"Prefactor + switch for QM Width and Toxeff correction for CV" ) -`MPRnb( QMTCENCVA ,0.0 ,"" ,"Prefactor + switch for QM Width and Toxeff correction for CV (accumulation region)" ) -`MPRnb( AQMTCEN ,0.0 ,"" ,"Parameter for geometric dependence of Tcen on R/TFIN/HFIN" ) -`MPRex( BQMTCEN ,1.2e-8 ,"" ,0.0 ,"Parameter for geometric dependence of Tcen on R/TFIN/HFIN" ) -`MPRnb( ETAQM ,0.54 ,"" ,"Bulk charge coefficient for Tcen" ) -`MPRnb( QM0 ,1.0e-3 ,"V" ,"Knee-point for Tcen in inversion (Charge normalized to Cox)" ) -`MPRnb( PQM ,0.66 ,"" ,"Slope of normalized Tcen in inversion" ) -`MPRnb( QM0ACC ,1.0e-3 ,"V" ,"Knee-point for Tcen in accumulation (Charge normalized to Cox)" ) -`MPRnb( PQMACC ,0.66 ,"" ,"Slope of normalized Tcen in accumulation" ) +`MPRnb( QMFACTOR ,0.0 ,"" ,"Prefactor + switch for QM Vth correction" ) +`MPRnb( QMTCENCV ,0.0 ,"" ,"Prefactor + switch for QM Width and Toxeff correction for CV" ) +`MPRnb( QMTCENCVA ,0.0 ,"" ,"Prefactor + switch for QM Width and Toxeff correction for CV (accumulation region)" ) +`MPRnb( AQMTCEN ,0.0 ,"" ,"Parameter for geometric dependence of Tcen on R/TFIN/HFIN" ) +`MPRex( BQMTCEN ,1.2e-8 ,"" ,0.0 ,"Parameter for geometric dependence of Tcen on R/TFIN/HFIN" ) +`MPRnb( ETAQM ,0.54 ,"" ,"Bulk charge coefficient for Tcen" ) +`MPRnb( QM0 ,1.0e-3 ,"V" ,"Knee-point for Tcen in inversion (Charge normalized to Cox)" ) +`MPRnb( PQM ,0.66 ,"" ,"Slope of normalized Tcen in inversion" ) +`MPRnb( QM0ACC ,1.0e-3 ,"V" ,"Knee-point for Tcen in accumulation (Charge normalized to Cox)" ) +`MPRnb( PQMACC ,0.66 ,"" ,"Slope of normalized Tcen in accumulation" ) // Velocity Saturation Model -`MPRnb( VSAT ,8.5e4 ,"m/s" ,"Saturation velocity for the saturation region" ) -`MPRnb( VSATR ,VSAT ,"m/s" ,"Saturation velocity for the saturation region in the reverse mode" ) -`MPRnb( VSATN1 ,0.0 ,"" ,"NFIN dependence of VSAT" ) -`MPRex( VSATN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of VSAT" ) -`MPRnb( VSATRN1 ,VSATN1 ,"" ,"NFIN dependence of VSATR" ) -`MPRex( VSATRN2 ,VSATN2 ,"" ,0.0 ,"NFIN dependence of VSATR" ) -`MPRnb( AVSAT ,0.0 ,"" ,"Pre-exponential coefficient for VSAT" ) -`MPRex( BVSAT ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for VSAT" ) -`MPRnb( VSAT1 ,VSAT ,"m/s" ,"Velocity saturation parameter for Ion degradation - forward mode" ) -`MPRnb( VSAT1N1 ,VSATN1 ,"" ,"NFIN dependence of VSAT1" ) -`MPRex( VSAT1N2 ,VSATN2 ,"" ,0.0 ,"NFIN dependence of VSAT1" ) -`MPRnb( VSAT1R ,VSAT1 ,"m/s" ,"Velocity saturation parameter for Ion degradation - reverse mode" ) -`MPRnb( VSAT1RN1 ,VSAT1N1 ,"" ,"NFIN dependence of VSAT1R" ) -`MPRex( VSAT1RN2 ,VSAT1N2 ,"" ,0.0 ,"NFIN dependence of VSAT1R" ) -`MPRnb( AVSAT1 ,AVSAT ,"" ,"Pre-exponential coefficient for VSAT1" ) -`MPRex( BVSAT1 ,BVSAT ,"" ,0.0 ,"Exponential coefficient for VSAT1" ) -`MPRnb( DELTAVSAT ,1.0 ,"" ,"velocity saturation parameter in the linear region" ) -`MPRnb( PSAT ,2.0 ,"" ,"Velocity saturation exponent, after binnig should be from [2.0:inf)" ) -`MPRnb( APSAT ,0.0 ,"" ,"Pre-exponential coefficient for PSAT" ) -`MPRex( BPSAT ,1.0 ,"" ,0.0 ,"Exponential coefficient for PSAT" ) -`MPRnb( KSATIV ,1.0 ,"" ,"Parameter for long channel Vdsat" ) -`MPRnb( KSATIVR ,KSATIV ,"" ,"KSATIV in asymmetric mode" ) -`MPRnb( VSATCV ,VSAT ,"m/s" ,"Velocity saturation parameter for CV" ) -`MPRnb( AVSATCV ,AVSAT ,"" ,"Pre-exponential coefficient for VSATCV" ) -`MPRex( BVSATCV ,BVSAT ,"" ,0.0 ,"Exponential coefficient for VSATCV" ) -`MPRnb( DELTAVSATCV ,DELTAVSAT ,"" ,"Velocity saturation parameter in the linear region for the capacitance model" ) -`MPRnb( PSATCV ,PSAT ,"" ,"Velocity saturation exponent for C-V" ) -`MPRnb( APSATCV ,APSAT ,"" ,"Pre-exponential coefficient for PSATCV" ) -`MPRex( BPSATCV ,BPSAT ,"" ,0.0 ,"Exponential coefficient for PSATCV" ) -`MPRnb( MEXP ,4.0 ,"" ,"Smoothing function factor for Vdsat" ) -`MPRnb( AMEXP ,0.0 ,"" ,"Pre-exponential coefficient for MEXP" ) -`MPRnb( BMEXP ,1.0 ,"" ,"Exponential coefficient for MEXP" ) -`MPRnb( MEXPR ,MEXP ,"" ,"Reverse-mode smoothing function factor for Vdsat" ) -`MPRnb( AMEXPR ,AMEXP ,"" ,"Pre-exponential coefficient for MEXPR" ) -`MPRnb( BMEXPR ,BMEXP ,"" ,"Exponential coefficient for MEXPR" ) -`MPRnb( PTWG ,0.0 ,"/V^2" ,"Gmsat degradation parameter - forward mode" ) -`MPRnb( PTWGR ,PTWG ,"/V^2" ,"Gmsat degradation parameter - reverse mode" ) -`MPRnb( APTWG ,0.0 ,"" ,"Pre-exponential coefficient for PTWG" ) -`MPRex( BPTWG ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for PTWG" ) -`MPRnb( AT ,-1.56e-3 ,"/K" ,"Saturation velocity temperature coefficient" ) -`MPRnb( ATR ,AT ,"" ,"Reverse-mode saturation velocity temperature coefficient" ) -`MPRnb( ATCV ,AT ,"/K" ,"Saturation velocity temperature coefficient for CV" ) -`MPRnb( TMEXP ,0.0 ,"/K" ,"Temperature coefficient for Vdseff smoothing" ) -`MPRnb( TMEXPR ,TMEXP ,"/K" ,"Reverse-mode temperature coefficient for Vdseff smoothing" ) -`MPRnb( PTWGT ,4.0e-3 ,"/K" ,"PTWG temperature coefficient" ) +`MPRnb( VSAT ,8.5e4 ,"m/s" ,"Saturation velocity for the saturation region" ) +`MPRnb( VSATR ,VSAT ,"m/s" ,"Saturation velocity for the saturation region in the reverse mode" ) +`MPRnb( VSATN1 ,0.0 ,"" ,"NFIN dependence of VSAT" ) +`MPRex( VSATN2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of VSAT" ) +`MPRnb( VSATRN1 ,VSATN1 ,"" ,"NFIN dependence of VSATR" ) +`MPRex( VSATRN2 ,VSATN2 ,"" ,0.0 ,"NFIN dependence of VSATR" ) +`MPRnb( AVSAT ,0.0 ,"" ,"Pre-exponential coefficient for VSAT" ) +`MPRex( BVSAT ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for VSAT" ) +`MPRnb( VSAT1 ,VSAT ,"m/s" ,"Velocity saturation parameter for Ion degradation - forward mode" ) +`MPRnb( VSAT1N1 ,VSATN1 ,"" ,"NFIN dependence of VSAT1" ) +`MPRex( VSAT1N2 ,VSATN2 ,"" ,0.0 ,"NFIN dependence of VSAT1" ) +`MPRnb( VSAT1R ,VSAT1 ,"m/s" ,"Velocity saturation parameter for Ion degradation - reverse mode" ) +`MPRnb( VSAT1RN1 ,VSAT1N1 ,"" ,"NFIN dependence of VSAT1R" ) +`MPRex( VSAT1RN2 ,VSAT1N2 ,"" ,0.0 ,"NFIN dependence of VSAT1R" ) +`MPRnb( AVSAT1 ,AVSAT ,"" ,"Pre-exponential coefficient for VSAT1" ) +`MPRex( BVSAT1 ,BVSAT ,"" ,0.0 ,"Exponential coefficient for VSAT1" ) +`MPRnb( DELTAVSAT ,1.0 ,"" ,"velocity saturation parameter in the linear region" ) +`MPRnb( PSAT ,2.0 ,"" ,"Velocity saturation exponent, after binnig should be from [2.0:inf)" ) +`MPRnb( APSAT ,0.0 ,"" ,"Pre-exponential coefficient for PSAT" ) +`MPRex( BPSAT ,1.0 ,"" ,0.0 ,"Exponential coefficient for PSAT" ) +`MPRnb( KSATIV ,1.0 ,"" ,"Parameter for long channel Vdsat" ) +`MPRnb( KSATIVR ,KSATIV ,"" ,"KSATIV in asymmetric mode" ) +`MPRnb( VSATCV ,VSAT ,"m/s" ,"Velocity saturation parameter for CV" ) +`MPRnb( AVSATCV ,AVSAT ,"" ,"Pre-exponential coefficient for VSATCV" ) +`MPRex( BVSATCV ,BVSAT ,"" ,0.0 ,"Exponential coefficient for VSATCV" ) +`MPRnb( DELTAVSATCV ,DELTAVSAT ,"" ,"Velocity saturation parameter in the linear region for the capacitance model" ) +`MPRnb( PSATCV ,PSAT ,"" ,"Velocity saturation exponent for C-V" ) +`MPRnb( APSATCV ,APSAT ,"" ,"Pre-exponential coefficient for PSATCV" ) +`MPRex( BPSATCV ,BPSAT ,"" ,0.0 ,"Exponential coefficient for PSATCV" ) +`MPRnb( MEXP ,4.0 ,"" ,"Smoothing function factor for Vdsat" ) +`MPRnb( AMEXP ,0.0 ,"" ,"Pre-exponential coefficient for MEXP" ) +`MPRnb( BMEXP ,1.0 ,"" ,"Exponential coefficient for MEXP" ) +`MPRnb( MEXPR ,MEXP ,"" ,"Reverse-mode smoothing function factor for Vdsat" ) +`MPRnb( AMEXPR ,AMEXP ,"" ,"Pre-exponential coefficient for MEXPR" ) +`MPRnb( BMEXPR ,BMEXP ,"" ,"Exponential coefficient for MEXPR" ) +`MPRnb( PTWG ,0.0 ,"/V^2" ,"Gmsat degradation parameter - forward mode" ) +`MPRnb( PTWGR ,PTWG ,"/V^2" ,"Gmsat degradation parameter - reverse mode" ) +`MPRnb( APTWG ,0.0 ,"" ,"Pre-exponential coefficient for PTWG" ) +`MPRex( BPTWG ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for PTWG" ) +`MPRnb( AT ,-1.56e-3 ,"/K" ,"Saturation velocity temperature coefficient" ) +`MPRnb( ATR ,AT ,"" ,"Reverse-mode saturation velocity temperature coefficient" ) +`MPRnb( ATCV ,AT ,"/K" ,"Saturation velocity temperature coefficient for CV" ) +`MPRnb( TMEXP ,0.0 ,"/K" ,"Temperature coefficient for Vdseff smoothing" ) +`MPRnb( TMEXPR ,TMEXP ,"/K" ,"Reverse-mode temperature coefficient for Vdseff smoothing" ) +`MPRnb( PTWGT ,4.0e-3 ,"/K" ,"PTWG temperature coefficient" ) // Mobility Model -`MPRnb( U0 ,3.0e-2 ,"m^2/(V*s)" ,"Low-field mobility" ) -`MPRnb( U0R ,U0 ,"m^2/(V*s)" ,"Reverse-mode low-field mobility" ) -`MPRnb( U0N1 ,0.0 ,"" ,"NFIN dependence of U0" ) -`MPRnb( U0N1R ,U0N1 ,"" ,"Reverse-mode NFIN dependence of U0" ) -`MPRex( U0N2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of U0" ) -`MPRex( U0N2R ,U0N2 ,"" ,0.0 ,"Reverse-mode NFIN dependence of U0" ) -`MPRnb( U0LT ,0.0 ,"/m" ,"Coupled NFIN and length dependence of U0" ) -`MPRnb( ETAMOB ,2.0 ,"" ,"Effective field parameter" ) -`MPRnb( UP ,0.0 ,"um^LPA" ,"Mobility L coefficient" ) -`MPRnb( LPA ,1.0 ,"" ,"Mobility L power coefficient" ) -`MPRnb( UPR ,UP ,"um^LPA" ,"Reverse-mode mobility L coefficient" ) -`MPRnb( LPAR ,LPA ,"" ,"Reverse-mode mobility L power coefficient" ) -`MPRnb( UA ,0.3 ,"(cm/MV)^EU" ,"Phonon/surface roughness scattering parameter" ) -`MPRnb( UAR ,UA ,"(cm/MV)^EU" ,"Reverse-mode phonon/surface roughness scattering parameter" ) -`MPRnb( AUA ,0.0 ,"" ,"Pre-exponential coefficient for UA" ) -`MPRnb( AUAR ,AUA ,"" ,"Reverse-mode pre-exponential coefficient for UA" ) -`MPRex( BUA ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for UA" ) -`MPRex( BUAR ,BUA ,"" ,0.0 ,"Reverse-mode exponential coefficient for UAR" ) -`MPRnb( UC ,0.0 ,"(1e-6*cm/MV^2)^EU" ,"Body effect for mobility degradation parameter - BULKMOD=1 or 2" ) -`MPRnb( UCR ,UC ,"" ,"Reverse-mode body effect for mobility degradation parameter - BULKMOD=1 or 2" ) -`MPRnb( EU ,2.5 ,"cm/MV" ,"Phonon/surface roughness scattering parameter" ) -`MPRnb( EUR ,EU ,"cm/MV" ,"Reverse-mode phonon/surface roughness scattering parameter" ) -`MPRnb( AEU ,0.0 ,"" ,"Pre-exponential coefficient for EU" ) -`MPRnb( AEUR ,AEU ,"" ,"Reverse-mode pre-exponential coefficient for EU" ) -`MPRex( BEU ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for EU" ) -`MPRex( BEUR ,BEU ,"" ,0.0 ,"Reverse-mode exponential coefficient for EU" ) -`MPRnb( UD ,0.0 ,"cm/MV" ,"Columbic scattering parameter" ) -`MPRnb( UDR ,UD ,"cm/MV" ,"Reverse-mode columbic scattering parameter" ) -`MPRnb( AUD ,0.0 ,"" ,"Pre-exponential coefficient for UD" ) -`MPRnb( AUDR ,AUD ,"" ,"Reverse-mode pre-exponential coefficient for UD" ) -`MPRex( BUD ,5.0e-8 ,"" ,0.0 ,"Exponential coefficient for UD" ) -`MPRex( BUDR ,BUD ,"" ,0.0 ,"Reverse-mode exponential coefficient for UD" ) -`MPRnb( UCS ,1.0 ,"" ,"Columbic scattering parameter" ) -`MPRnb( UTE ,0.0 ,"" ,"Mobility temperature coefficient" ) -`MPRnb( UTER ,UTE ,"" ,"Reverse-mode for mobility temperature coefficient" ) -`MPRnb( UTL ,-1.5e-3 ,"" ,"Mobility temperature coefficient" ) -`MPRnb( UTLR ,UTL ,"" ,"Reverse-mode for mobility temperature coefficient" ) -`MPRnb( EMOBT ,0.0 ,"" ,"Temperature coefficient of ETAMOB" ) -`MPRnb( UA1 ,1.032e-3 ,"" ,"Mobility temperature coefficient for UA" ) -`MPRnb( UA1R ,UA1 ,"" ,"Reverse-mode mobility temperature coefficient for UA" ) -`MPRnb( UC1 ,5.6e-11 ,"" ,"Mobility temperature coefficient for UC" ) -`MPRnb( UC1R ,UC1 ,"" ,"Reverse-mode mobility temperature coefficient for UC" ) -`MPRnb( UD1 ,0.0 ,"" ,"Mobility temperature coefficient for UC" ) -`MPRnb( UD1R ,UD1 ,"" ,"Reverse-mode mobility temperature coefficient for UD" ) -`MPRnb( UCSTE ,-4.775e-3 ,"" ,"Mobility temperature coefficient" ) -`MPRcc( CHARGEWF ,0.0 ,"" ,-1.0 ,1.0 ,"Average channel charge weighting factor, +1: source-side, 0: middle, -1: drain-side" ) +`MPRnb( U0 ,3.0e-2 ,"m^2/(V*s)" ,"Low-field mobility" ) +`MPRnb( U0R ,U0 ,"m^2/(V*s)" ,"Reverse-mode low-field mobility" ) +`MPRnb( U0N1 ,0.0 ,"" ,"NFIN dependence of U0" ) +`MPRnb( U0N1R ,U0N1 ,"" ,"Reverse-mode NFIN dependence of U0" ) +`MPRex( U0N2 ,1.0e5 ,"" ,0.0 ,"NFIN dependence of U0" ) +`MPRex( U0N2R ,U0N2 ,"" ,0.0 ,"Reverse-mode NFIN dependence of U0" ) +`MPRnb( U0LT ,0.0 ,"/m" ,"Coupled NFIN and length dependence of U0" ) +`MPRnb( ETAMOB ,2.0 ,"" ,"Effective field parameter" ) +`MPRnb( UP ,0.0 ,"um^LPA" ,"Mobility L coefficient" ) +`MPRnb( LPA ,1.0 ,"" ,"Mobility L power coefficient" ) +`MPRnb( UPR ,UP ,"um^LPA" ,"Reverse-mode mobility L coefficient" ) +`MPRnb( LPAR ,LPA ,"" ,"Reverse-mode mobility L power coefficient" ) +`MPRnb( UA ,0.3 ,"(cm/MV)^EU" ,"Phonon/surface roughness scattering parameter" ) +`MPRnb( UAR ,UA ,"(cm/MV)^EU" ,"Reverse-mode phonon/surface roughness scattering parameter" ) +`MPRnb( AUA ,0.0 ,"" ,"Pre-exponential coefficient for UA" ) +`MPRnb( AUAR ,AUA ,"" ,"Reverse-mode pre-exponential coefficient for UA" ) +`MPRex( BUA ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for UA" ) +`MPRex( BUAR ,BUA ,"" ,0.0 ,"Reverse-mode exponential coefficient for UAR" ) +`MPRnb( UC ,0.0 ,"(1e-6*cm/MV^2)^EU" ,"Body effect for mobility degradation parameter - BULKMOD=1 or 2" ) +`MPRnb( UCR ,UC ,"" ,"Reverse-mode body effect for mobility degradation parameter - BULKMOD=1 or 2" ) +`MPRnb( EU ,2.5 ,"cm/MV" ,"Phonon/surface roughness scattering parameter" ) +`MPRnb( EUR ,EU ,"cm/MV" ,"Reverse-mode phonon/surface roughness scattering parameter" ) +`MPRnb( AEU ,0.0 ,"" ,"Pre-exponential coefficient for EU" ) +`MPRnb( AEUR ,AEU ,"" ,"Reverse-mode pre-exponential coefficient for EU" ) +`MPRex( BEU ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for EU" ) +`MPRex( BEUR ,BEU ,"" ,0.0 ,"Reverse-mode exponential coefficient for EU" ) +`MPRnb( UD ,0.0 ,"cm/MV" ,"Columbic scattering parameter" ) +`MPRnb( UDR ,UD ,"cm/MV" ,"Reverse-mode columbic scattering parameter" ) +`MPRnb( AUD ,0.0 ,"" ,"Pre-exponential coefficient for UD" ) +`MPRnb( AUDR ,AUD ,"" ,"Reverse-mode pre-exponential coefficient for UD" ) +`MPRex( BUD ,5.0e-8 ,"" ,0.0 ,"Exponential coefficient for UD" ) +`MPRex( BUDR ,BUD ,"" ,0.0 ,"Reverse-mode exponential coefficient for UD" ) +`MPRnb( UCS ,1.0 ,"" ,"Columbic scattering parameter" ) +`MPRnb( UTE ,0.0 ,"" ,"Mobility temperature coefficient" ) +`MPRnb( UTER ,UTE ,"" ,"Reverse-mode for mobility temperature coefficient" ) +`MPRnb( UTL ,-1.5e-3 ,"" ,"Mobility temperature coefficient" ) +`MPRnb( UTLR ,UTL ,"" ,"Reverse-mode for mobility temperature coefficient" ) +`MPRnb( EMOBT ,0.0 ,"" ,"Temperature coefficient of ETAMOB" ) +`MPRnb( UA1 ,1.032e-3 ,"" ,"Mobility temperature coefficient for UA" ) +`MPRnb( UA1R ,UA1 ,"" ,"Reverse-mode mobility temperature coefficient for UA" ) +`MPRnb( UC1 ,5.6e-11 ,"" ,"Mobility temperature coefficient for UC" ) +`MPRnb( UC1R ,UC1 ,"" ,"Reverse-mode mobility temperature coefficient for UC" ) +`MPRnb( UD1 ,0.0 ,"" ,"Mobility temperature coefficient for UC" ) +`MPRnb( UD1R ,UD1 ,"" ,"Reverse-mode mobility temperature coefficient for UD" ) +`MPRnb( UCSTE ,-4.775e-3 ,"" ,"Mobility temperature coefficient" ) +`MPRcc( CHARGEWF ,0.0 ,"" ,-1.0 ,1.0 ,"Average channel charge weighting factor, +1: source-side, 0: middle, -1: drain-side" ) // Access Resistance Model -`MPRnb( RDSWMIN ,0.0 ,"ohm*(um^(WR))" ,"RDSMOD = 0 S/D extension resistance per unit width at high Vgs" ) -`MPRnb( RDSW ,1.0e2 ,"ohm*(um^(WR))" ,"RDSMOD = 0 zero bias S/D extension resistance per unit width" ) -`MPRnb( ARDSW ,0.0 ,"" ,"Pre-exponential coefficient for RDSW" ) -`MPRex( BRDSW ,1.0e-7 ,"" ,0.0 ,"exponential coefficient for RDSW" ) -`MPRnb( RSWMIN ,0.0 ,"ohm*(um^(WR))" ,"RDSMOD = 1 source extension resistance per unit width at high Vgs" ) -`MPRnb( RSW ,5.0e1 ,"ohm*(um^(WR))" ,"RDSMOD = 1 zero bias source extension resistance per unit width" ) -`MPRnb( ARSW ,0.0 ,"" ,"Pre-exponential coefficient for RSW" ) -`MPRex( BRSW ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for RSW" ) -`MPRnb( RDWMIN ,0.0 ,"ohm*(um^(WR))" ,"RDSMOD = 1 drain extension resistance per unit width at high Vgs" ) -`MPRnb( RDW ,5.0e1 ,"" ,"RDSMOD = 1 zero bias drain extension resistance per unit width" ) -`MPRnb( ARDW ,0.0 ,"" ,"Pre-exponential coefficient for RDW" ) -`MPRex( BRDW ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for RDW" ) -`MPRcz( RSDR ,0.0 ,"V^(-PRSDR)" ,"Source-side drift resistance parameter - forward mode" ) -`MPRcz( RSDRR ,RSDR ,"V^(-PRSDR)" ,"Source-side drift resistance parameter - reverse mode" ) -`MPRcz( RDDR ,RSDR ,"V^(-PRDDR)" ,"Drain-side drift resistance parameter - forward mode" ) -`MPRcz( RDDRR ,RDDR ,"V^(-PRDDR)" ,"Drain-side drift resistance parameter - reverse mode" ) -`MPRnb( PRSDR ,1.0 ,"" ,"Source-side quasi-saturation parameter" ) -`MPRnb( PRDDR ,PRSDR ,"" ,"Drain-side quasi-saturation parameter" ) -`MPRnb( PRWGS ,0.0 ,"/V" ,"Gate bias dependence of source extension resistance" ) -`MPRnb( PRWGD ,PRWGS ,"/V" ,"Gate bias dependence of drain extension resistance" ) -`MPRnb( WR ,1.0 ,"" ,"W dependence parameter of S/D extension resistance" ) -`MPRnb( PRT ,1.0e-3 ,"/K" ,"Series resistance temperature coefficient" ) -`MPRnb( TRSDR ,0.0 ,"/K" ,"Source-side drift resistance temperature coefficient" ) -`MPRnb( TRDDR ,TRSDR ,"/K" ,"Drain-side drift resistance temperature coefficient" ) +`MPRnb( RDSWMIN ,0.0 ,"ohm*(um^(WR))" ,"RDSMOD = 0 S/D extension resistance per unit width at high Vgs" ) +`MPRnb( RDSW ,1.0e2 ,"ohm*(um^(WR))" ,"RDSMOD = 0 zero bias S/D extension resistance per unit width" ) +`MPRnb( ARDSW ,0.0 ,"" ,"Pre-exponential coefficient for RDSW" ) +`MPRex( BRDSW ,1.0e-7 ,"" ,0.0 ,"exponential coefficient for RDSW" ) +`MPRnb( RSWMIN ,0.0 ,"ohm*(um^(WR))" ,"RDSMOD = 1 source extension resistance per unit width at high Vgs" ) +`MPRnb( RSW ,5.0e1 ,"ohm*(um^(WR))" ,"RDSMOD = 1 zero bias source extension resistance per unit width" ) +`MPRnb( ARSW ,0.0 ,"" ,"Pre-exponential coefficient for RSW" ) +`MPRex( BRSW ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for RSW" ) +`MPRnb( RDWMIN ,0.0 ,"ohm*(um^(WR))" ,"RDSMOD = 1 drain extension resistance per unit width at high Vgs" ) +`MPRnb( RDW ,5.0e1 ,"" ,"RDSMOD = 1 zero bias drain extension resistance per unit width" ) +`MPRnb( ARDW ,0.0 ,"" ,"Pre-exponential coefficient for RDW" ) +`MPRex( BRDW ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for RDW" ) +`MPRcz( RSDR ,0.0 ,"V^(-PRSDR)" ,"Source-side drift resistance parameter - forward mode" ) +`MPRcz( RSDRR ,RSDR ,"V^(-PRSDR)" ,"Source-side drift resistance parameter - reverse mode" ) +`MPRcz( RDDR ,RSDR ,"V^(-PRDDR)" ,"Drain-side drift resistance parameter - forward mode" ) +`MPRcz( RDDRR ,RDDR ,"V^(-PRDDR)" ,"Drain-side drift resistance parameter - reverse mode" ) +`MPRnb( PRSDR ,1.0 ,"" ,"Source-side quasi-saturation parameter" ) +`MPRnb( PRDDR ,PRSDR ,"" ,"Drain-side quasi-saturation parameter" ) +`MPRnb( PRWGS ,0.0 ,"/V" ,"Gate bias dependence of source extension resistance" ) +`MPRnb( PRWGD ,PRWGS ,"/V" ,"Gate bias dependence of drain extension resistance" ) +`MPRnb( WR ,1.0 ,"" ,"W dependence parameter of S/D extension resistance" ) +`MPRnb( PRT ,1.0e-3 ,"/K" ,"Series resistance temperature coefficient" ) +`MPRnb( TRSDR ,0.0 ,"/K" ,"Source-side drift resistance temperature coefficient" ) +`MPRnb( TRDDR ,TRSDR ,"/K" ,"Drain-side drift resistance temperature coefficient" ) // DIBL Model -`MPRnb( PDIBL1 ,1.3 ,"" ,"DIBL output conductance parameter - forward mode" ) -`MPRnb( PDIBL1R ,PDIBL1 ,"" ,"DIBL output conductance parameter - reverse mode" ) -`MPRnb( PDIBL2 ,2.0e-4 ,"" ,"DIBL output conductance parameter" ) -`MPRnb( PDIBL2R ,PDIBL2 ,"" ,"DIBL output conductance parameter - reverse mode" ) -`MPRnb( DROUT ,1.06 ,"" ,"L dependence of DIBL effect on Rout" ) -`MPRnb( PVAG ,1.0 ,"" ,"Vgs dependence on early voltage" ) +`MPRnb( PDIBL1 ,1.3 ,"" ,"DIBL output conductance parameter - forward mode" ) +`MPRnb( PDIBL1R ,PDIBL1 ,"" ,"DIBL output conductance parameter - reverse mode" ) +`MPRnb( PDIBL2 ,2.0e-4 ,"" ,"DIBL output conductance parameter" ) +`MPRnb( PDIBL2R ,PDIBL2 ,"" ,"DIBL output conductance parameter - reverse mode" ) +`MPRnb( DROUT ,1.06 ,"" ,"L dependence of DIBL effect on Rout" ) +`MPRnb( PVAG ,1.0 ,"" ,"Vgs dependence on early voltage" ) // Channel Length Modulation Effect -`MPRnb( PCLM ,1.3e-2 ,"" ,"Channel length modulation (CLM) parameter" ) -`MPRnb( PCLMR ,PCLM ,"" ,"Reverse model PCLM parameter" ) -`MPRnb( APCLM ,0.0 ,"" ,"Pre-exponential coefficient for PCLM" ) -`MPRnb( APCLMR ,APCLM ,"" ,"Reverse-mode pre-exponential coefficient for PCLM" ) -`MPRex( BPCLM ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for PCLM" ) -`MPRex( BPCLMR ,BPCLM ,"" ,0.0 ,"Reverse-mode exponential coefficient for PCLM" ) -`MPRnb( PCLMG ,0.0 ,"" ,"Gate bias dependence parameter for CLM" ) -`MPRnb( PCLMCV ,PCLM ,"" ,"CLM parameter for short-channel CV" ) +`MPRnb( PCLM ,1.3e-2 ,"" ,"Channel length modulation (CLM) parameter" ) +`MPRnb( PCLMR ,PCLM ,"" ,"Reverse model PCLM parameter" ) +`MPRnb( APCLM ,0.0 ,"" ,"Pre-exponential coefficient for PCLM" ) +`MPRnb( APCLMR ,APCLM ,"" ,"Reverse-mode pre-exponential coefficient for PCLM" ) +`MPRex( BPCLM ,1.0e-7 ,"" ,0.0 ,"Exponential coefficient for PCLM" ) +`MPRex( BPCLMR ,BPCLM ,"" ,0.0 ,"Reverse-mode exponential coefficient for PCLM" ) +`MPRnb( PCLMG ,0.0 ,"" ,"Gate bias dependence parameter for CLM" ) +`MPRnb( PCLMCV ,PCLM ,"" ,"CLM parameter for short-channel CV" ) // Non-Saturation Effect -`MPRnb( A1 ,0.0 ,"" ,"Non-saturation effect parameter for strong inversion Region" ) -`MPRnb( A11 ,0.0 ,"(V^-2)/K" ,"Temperature dependence of A1" ) -`MPRnb( A2 ,0.0 ,"" ,"Non-saturation effect parameter for moderate Inversion Region" ) -`MPRnb( A21 ,0.0 ,"(V^-1)/K" ,"Temperature dependence of A2" ) +`MPRnb( A1 ,0.0 ,"" ,"Non-saturation effect parameter for strong inversion Region" ) +`MPRnb( A11 ,0.0 ,"(V^-2)/K" ,"Temperature dependence of A1" ) +`MPRnb( A2 ,0.0 ,"" ,"Non-saturation effect parameter for moderate Inversion Region" ) +`MPRnb( A21 ,0.0 ,"(V^-1)/K" ,"Temperature dependence of A2" ) // Gate Electrode Resistance -`MPRcz( RGEXT ,0.0 ,"ohm" ,"Effective gate electrode external resistance" ) -`MPRco( RGFIN ,1.0e-3 ,"ohm" ,1.0e-3 ,inf ,"Effective gate electrode per finger per fin resistance" ) +`MPRcz( RGEXT ,0.0 ,"ohm" ,"Effective gate electrode external resistance" ) +`MPRco( RGFIN ,1.0e-3 ,"ohm" ,1.0e-3 ,inf ,"Effective gate electrode per finger per fin resistance" ) // Geometry Dependent Source/Drain Resistance of RGEOMOD = 0 -`MPRnb( RSHS ,0.0 ,"ohm" ,"Source-side sheet resistance" ) -`MPRnb( RSHD ,RSHS ,"ohm" ,"Drain-side sheet resistance" ) +`MPRnb( RSHS ,0.0 ,"ohm" ,"Source-side sheet resistance" ) +`MPRnb( RSHD ,RSHS ,"ohm" ,"Drain-side sheet resistance" ) // Geometry Dependent Source/Drain Resistance of RGEOMOD = 1 for variability modeling // These parameters are shared with CGEOMOD = 2 -`MPRnb( HEPI ,1.0e-8 ,"m" ,"Height of the raised source/drain on top of the fin" ) -`MPRnb( TSILI ,1.0e-8 ,"m" ,"Thickness of the silicide on top of the raised source/drain" ) -`MPRcc( RHOC ,1.0e-12 ,"ohm*(m^2)" ,1.0e-18 ,1.0e-9 ,"Contact resistivity at the silicon/silicide interface" ) -`MPRoz( RHORSD ,1.0 ,"ohm*(m)" ,"Average resistivity of silicon in the raised source/drain region" ) -`MPRcc( CRATIO ,0.5 ,"" ,0.0 ,1.0 ,"Ratio of the corner area filled with silicon to the total corner area" ) -`MPRoo( DELTAPRSD ,0.0 ,"m" ,-FPITCH ,inf ,"Change in silicon/silicide interface length due to non-rectangular epi" ) -`MPIcc( SDTERM ,0 ,"" ,0 ,1 ,"Indicator of whether the source/drain are terminated with silicide" ) -`MPRnb( LSP ,-1 ,"m" ,"Thickness of the gate sidewall spacer" ) -`MPRco( EPSRSP ,3.9 ,"" ,1.0 ,inf ,"Relative dielectric constant of the spacer" ) -`MPRoz( TGATE ,3.0e-8 ,"m" ,"Gate height on top of the hard mask" ) -`MPRcz( TMASK ,3.0e-8 ,"m" ,"Height of hard mask on top of the fin" ) -`MPRcz( ASILIEND ,0.0 ,"m^2" ,"Extra silicide cross sectional area at the two ends of the FinFET" ) -`MPRcz( ARSDEND ,0.0 ,"m^2" ,"Extra raised source/drain cross sectional areaat the two ends of the FinFET" ) -`MPRcz( PRSDEND ,0.0 ,"m" ,"Extra silicon/silicide interface perimeter at the two ends of the FinFET" ) -`MPRcc( NSDE ,2.0e25 ,"/(m^3)" ,1.0e25 ,1.0e26 ,"Source/drain active doping concentration at Leff edge" ) -`MPRnb( RGEOA ,1.0 ,"" ,"Fitting parameter for RGEOMOD=1" ) -`MPRnb( RGEOB ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" ) -`MPRnb( RGEOC ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" ) -`MPRnb( RGEOD ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" ) -`MPRnb( RGEOE ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" ) -`MPRnb( CGEOA ,1.0 ,"" ,"Fitting parameter for CGEOMOD=2" ) -`MPRnb( CGEOB ,0.0 ,"/m" ,"Fitting parameter for CGEOMOD=2" ) -`MPRnb( CGEOC ,0.0 ,"/m" ,"Fitting parameter for CGEOMOD=2" ) -`MPRnb( CGEOD ,0.0 ,"/m" ,"Fitting parameter for CGEOMOD=2" ) -`MPRcz( CGEOE ,1.0 ,"" ,"Fitting parameter for CGEOMOD=2" ) +`MPRnb( HEPI ,1.0e-8 ,"m" ,"Height of the raised source/drain on top of the fin" ) +`MPRnb( TSILI ,1.0e-8 ,"m" ,"Thickness of the silicide on top of the raised source/drain" ) +`MPRcc( RHOC ,1.0e-12 ,"ohm*(m^2)" ,1.0e-18 ,1.0e-9 ,"Contact resistivity at the silicon/silicide interface" ) +`MPRoz( RHORSD ,1.0 ,"ohm*(m)" ,"Average resistivity of silicon in the raised source/drain region" ) +`MPRcc( CRATIO ,0.5 ,"" ,0.0 ,1.0 ,"Ratio of the corner area filled with silicon to the total corner area" ) +`MPRoo( DELTAPRSD ,0.0 ,"m" ,-FPITCH ,inf ,"Change in silicon/silicide interface length due to non-rectangular epi" ) +`MPIcc( SDTERM ,0 ,"" ,0 ,1 ,"Indicator of whether the source/drain are terminated with silicide" ) +`MPRnb( LSP ,-1 ,"m" ,"Thickness of the gate sidewall spacer" ) +`MPRco( EPSRSP ,3.9 ,"" ,1.0 ,inf ,"Relative dielectric constant of the spacer" ) +`MPRoz( TGATE ,3.0e-8 ,"m" ,"Gate height on top of the hard mask" ) +`MPRcz( TMASK ,3.0e-8 ,"m" ,"Height of hard mask on top of the fin" ) +`MPRcz( ASILIEND ,0.0 ,"m^2" ,"Extra silicide cross sectional area at the two ends of the FinFET" ) +`MPRcz( ARSDEND ,0.0 ,"m^2" ,"Extra raised source/drain cross sectional areaat the two ends of the FinFET" ) +`MPRcz( PRSDEND ,0.0 ,"m" ,"Extra silicon/silicide interface perimeter at the two ends of the FinFET" ) +`MPRcc( NSDE ,2.0e25 ,"/(m^3)" ,1.0e25 ,1.0e26 ,"Source/drain active doping concentration at Leff edge" ) +`MPRnb( RGEOA ,1.0 ,"" ,"Fitting parameter for RGEOMOD=1" ) +`MPRnb( RGEOB ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" ) +`MPRnb( RGEOC ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" ) +`MPRnb( RGEOD ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" ) +`MPRnb( RGEOE ,0.0 ,"/m" ,"Fitting parameter for RGEOMOD=1" ) +`MPRnb( CGEOA ,1.0 ,"" ,"Fitting parameter for CGEOMOD=2" ) +`MPRnb( CGEOB ,0.0 ,"/m" ,"Fitting parameter for CGEOMOD=2" ) +`MPRnb( CGEOC ,0.0 ,"/m" ,"Fitting parameter for CGEOMOD=2" ) +`MPRnb( CGEOD ,0.0 ,"/m" ,"Fitting parameter for CGEOMOD=2" ) +`MPRcz( CGEOE ,1.0 ,"" ,"Fitting parameter for CGEOMOD=2" ) // Gate Current -`MPRnb( AIGBINV ,1.11e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igb in inversion" ) -`MPRnb( AIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igb in inversion" ) -`MPRnb( BIGBINV ,9.49e-4 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igb in inversion" ) -`MPRnb( CIGBINV ,6.0e-3 ,"/V" ,"Parameter for Igb in inversion" ) -`MPRnb( EIGBINV ,1.1 ,"V" ,"Parameter for Igb in inversion" ) -`MPRnb( NIGBINV ,3.0 ,"" ,"Parameter for Igb in inversion" ) -`MPRnb( AIGBACC ,1.36e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igb in accumulation" ) -`MPRnb( AIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igb in accumulation" ) -`MPRnb( BIGBACC ,1.71e-3 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igb in accumulation" ) -`MPRnb( CIGBACC ,7.5e-2 ,"/V" ,"Parameter for Igb in accumulation" ) -`MPRnb( NIGBACC ,1.0 ,"" ,"Parameter for Igb in accumulation" ) -`MPRnb( AIGC ,1.36e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igc in inversion" ) -`MPRnb( AIGC1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igc in inversion" ) -`MPRnb( BIGC ,1.71e-3 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igc in inversion" ) -`MPRnb( CIGC ,7.5e-2 ,"/V" ,"Parameter for Igc in inversion" ) -`MPRnb( PIGCD ,1.0 ,"" ,"Parameter for Igc partition" ) -`MPRnb( DLCIGS ,0.0 ,"m" ,"Delta L for Igs model" ) -`MPRnb( AIGS ,1.36e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igs in inversion" ) -`MPRnb( AIGS1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igs in inversion" ) -`MPRnb( BIGS ,1.71e-3 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igs in inversion" ) -`MPRnb( CIGS ,7.5e-2 ,"/V" ,"Parameter for Igs in inversion" ) -`MPRnb( DLCIGD ,DLCIGS ,"m" ,"Delta L for Igd model" ) -`MPRnb( AIGD ,AIGS ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igd in inversion" ) -`MPRnb( AIGD1 ,AIGS1 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igd in inversion" ) -`MPRnb( BIGD ,BIGS ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igd in inversion" ) -`MPRnb( CIGD ,CIGS ,"/V" ,"Parameter for Igd in inversion" ) -`MPRnb( VFBSD ,0.0 ,"V" ,"Flatband voltage for S/D region" ) -`MPRnb( VFBSDCV ,VFBSD ,"V" ,"Flatband voltage for S/D region for C-V calculations" ) -`MPRoz( TOXREF ,1.2e-9 ,"m" ,"Target tox value" ) -`MPRnb( TOXG ,TOXP ,"m" ,"Oxide thickness for gate current model" ) -`MPRnb( NTOX ,1.0 ,"" ,"Exponent for Tox ratio" ) -`MPRnb( POXEDGE ,1.0 ,"" ,"Factor for the gate edge Tox" ) +`MPRnb( AIGBINV ,1.11e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igb in inversion" ) +`MPRnb( AIGBINV1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igb in inversion" ) +`MPRnb( BIGBINV ,9.49e-4 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igb in inversion" ) +`MPRnb( CIGBINV ,6.0e-3 ,"/V" ,"Parameter for Igb in inversion" ) +`MPRnb( EIGBINV ,1.1 ,"V" ,"Parameter for Igb in inversion" ) +`MPRnb( NIGBINV ,3.0 ,"" ,"Parameter for Igb in inversion" ) +`MPRnb( AIGBACC ,1.36e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igb in accumulation" ) +`MPRnb( AIGBACC1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igb in accumulation" ) +`MPRnb( BIGBACC ,1.71e-3 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igb in accumulation" ) +`MPRnb( CIGBACC ,7.5e-2 ,"/V" ,"Parameter for Igb in accumulation" ) +`MPRnb( NIGBACC ,1.0 ,"" ,"Parameter for Igb in accumulation" ) +`MPRnb( AIGC ,1.36e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igc in inversion" ) +`MPRnb( AIGC1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igc in inversion" ) +`MPRnb( BIGC ,1.71e-3 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igc in inversion" ) +`MPRnb( CIGC ,7.5e-2 ,"/V" ,"Parameter for Igc in inversion" ) +`MPRnb( PIGCD ,1.0 ,"" ,"Parameter for Igc partition" ) +`MPRnb( DLCIGS ,0.0 ,"m" ,"Delta L for Igs model" ) +`MPRnb( AIGS ,1.36e-2 ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igs in inversion" ) +`MPRnb( AIGS1 ,0.0 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igs in inversion" ) +`MPRnb( BIGS ,1.71e-3 ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igs in inversion" ) +`MPRnb( CIGS ,7.5e-2 ,"/V" ,"Parameter for Igs in inversion" ) +`MPRnb( DLCIGD ,DLCIGS ,"m" ,"Delta L for Igd model" ) +`MPRnb( AIGD ,AIGS ,"((F*s^2/g)^0.5)*m^-1" ,"Parameter for Igd in inversion" ) +`MPRnb( AIGD1 ,AIGS1 ,"((F*s^2/g)^0.5)*m^-1/K" ,"Parameter for Igd in inversion" ) +`MPRnb( BIGD ,BIGS ,"((F*s^2/g)^0.5)*(m*V)^-1" ,"Parameter for Igd in inversion" ) +`MPRnb( CIGD ,CIGS ,"/V" ,"Parameter for Igd in inversion" ) +`MPRnb( VFBSD ,0.0 ,"V" ,"Flatband voltage for S/D region" ) +`MPRnb( VFBSDCV ,VFBSD ,"V" ,"Flatband voltage for S/D region for C-V calculations" ) +`MPRoz( TOXREF ,1.2e-9 ,"m" ,"Target tox value" ) +`MPRnb( TOXG ,TOXP ,"m" ,"Oxide thickness for gate current model" ) +`MPRnb( NTOX ,1.0 ,"" ,"Exponent for Tox ratio" ) +`MPRnb( POXEDGE ,1.0 ,"" ,"Factor for the gate edge Tox" ) // GIDL/GISL Current -`MPRnb( AGISL ,6.055e-12 ,"mho" ,"Pre-exponential coefficient for GISL" ) -`MPRnb( BGISL ,3.0e8 ,"V/m" ,"Exponential coefficient for GISL" ) -`MPRnb( CGISL ,0.5 ,"V^3" ,"Parameter for body-effect of GISL" ) -`MPRnb( EGISL ,0.2 ,"V" ,"Band bending parameter for GISL" ) -`MPRnb( PGISL ,1.0 ,"" ,"Parameter for body-bias effect on GISL" ) -`MPRnb( AGIDL ,AGISL ,"mho" ,"Pre-exponential coefficient for GIDL" ) -`MPRnb( BGIDL ,BGISL ,"V/m" ,"Exponential coefficient for GIDL" ) -`MPRnb( CGIDL ,CGISL ,"V^3" ,"Parameter for body-effect of GIDL" ) -`MPRnb( EGIDL ,EGISL ,"V" ,"Band bending parameter for GIDL" ) -`MPRnb( PGIDL ,PGISL ,"" ,"Parameter for body-bias effect on GIDL" ) +`MPRnb( AGISL ,6.055e-12 ,"mho" ,"Pre-exponential coefficient for GISL" ) +`MPRnb( BGISL ,3.0e8 ,"V/m" ,"Exponential coefficient for GISL" ) +`MPRnb( CGISL ,0.5 ,"V^3" ,"Parameter for body-effect of GISL" ) +`MPRnb( EGISL ,0.2 ,"V" ,"Band bending parameter for GISL" ) +`MPRnb( PGISL ,1.0 ,"" ,"Parameter for body-bias effect on GISL" ) +`MPRnb( AGIDL ,AGISL ,"mho" ,"Pre-exponential coefficient for GIDL" ) +`MPRnb( BGIDL ,BGISL ,"V/m" ,"Exponential coefficient for GIDL" ) +`MPRnb( CGIDL ,CGISL ,"V^3" ,"Parameter for body-effect of GIDL" ) +`MPRnb( EGIDL ,EGISL ,"V" ,"Band bending parameter for GIDL" ) +`MPRnb( PGIDL ,PGISL ,"" ,"Parameter for body-bias effect on GIDL" ) // Impact Ionization Current -// IIMOD = 1 -`MPRnb( ALPHA0 ,0.0 ,"m/V" ,"First parameter of Iii" ) -`MPRnb( ALPHA01 ,0.0 ,"m/V/K" ,"Temperature dependence of ALPHA0" ) -`MPRnb( ALPHA1 ,0.0 ,"/V" ,"L scaling parameter of Iii" ) -`MPRnb( ALPHA11 ,0.0 ,"/V/K" ,"Temperature dependence ALPHA1" ) -`MPRnb( BETA0 ,0.0 ,"/V" ,"Vds dependence parameter of Iii" ) +// IIMOD = 1 +`MPRnb( ALPHA0 ,0.0 ,"m/V" ,"First parameter of Iii" ) +`MPRnb( ALPHA01 ,0.0 ,"m/V/K" ,"Temperature dependence of ALPHA0" ) +`MPRnb( ALPHA1 ,0.0 ,"/V" ,"L scaling parameter of Iii" ) +`MPRnb( ALPHA11 ,0.0 ,"/V/K" ,"Temperature dependence ALPHA1" ) +`MPRnb( BETA0 ,0.0 ,"/V" ,"Vds dependence parameter of Iii" ) // IIMOD = 2 -`MPRnb( ALPHAII0 ,0.0 ,"m/V" ,"First parameter of Iii for IIMOD=2" ) -`MPRnb( ALPHAII01 ,0.0 ,"m/V/K" ,"Temperature dependence of ALPHAII0" ) -`MPRnb( ALPHAII1 ,0.0 ,"/V" ,"L scaling parameter of Iii for IIMOD=2" ) -`MPRnb( ALPHAII11 ,0.0 ,"m/V/K" ,"Temperature dependence of ALPHAII1" ) -`MPRnb( BETAII0 ,0.0 ,"/V" ,"Vds dependence parameter of Iii" ) -`MPRnb( BETAII1 ,0.0 ,"" ,"Vds dependence parameter of Iii" ) -`MPRnb( BETAII2 ,0.1 ,"V" ,"Vds dependence parameter of Iii" ) -`MPRnb( ESATII ,1.0e7 ,"V/m" ,"Saturation channel E-field for Iii" ) -`MPRnb( LII ,0.5e-9 ,"V*m" ,"Channel length dependence parameter of Iii" ) -`MPRnb( SII0 ,0.5 ,"/V" ,"Vgs dependence parameter of Iii" ) -`MPRnb( SII1 ,0.1 ,"" ,"1st Vgs dependence parameter of Iii" ) -`MPRnb( SII2 ,0.0 ,"V" ,"2nd Vgs dependence parameter of Iii" ) -`MPRnb( SIID ,0.0 ,"V" ,"3rd Vds dependence parameter of Iii" ) -`MPRoo( IIMOD2CLAMP1 ,0.1 ,"V" ,0.0 ,inf ,"Clamp1 of SII1*Vg term in IIMOD=2 model" ) -`MPRoo( IIMOD2CLAMP2 ,0.1 ,"V" ,0.0 ,inf ,"Clamp2 of SII0*Vg term in IIMOD=2 model" ) -`MPRoo( IIMOD2CLAMP3 ,0.1 ,"V" ,0.0 ,inf ,"Clamp3 of Ratio term in IIMOD=2 model" ) +`MPRnb( ALPHAII0 ,0.0 ,"m/V" ,"First parameter of Iii for IIMOD=2" ) +`MPRnb( ALPHAII01 ,0.0 ,"m/V/K" ,"Temperature dependence of ALPHAII0" ) +`MPRnb( ALPHAII1 ,0.0 ,"/V" ,"L scaling parameter of Iii for IIMOD=2" ) +`MPRnb( ALPHAII11 ,0.0 ,"m/V/K" ,"Temperature dependence of ALPHAII1" ) +`MPRnb( BETAII0 ,0.0 ,"/V" ,"Vds dependence parameter of Iii" ) +`MPRnb( BETAII1 ,0.0 ,"" ,"Vds dependence parameter of Iii" ) +`MPRnb( BETAII2 ,0.1 ,"V" ,"Vds dependence parameter of Iii" ) +`MPRnb( ESATII ,1.0e7 ,"V/m" ,"Saturation channel E-field for Iii" ) +`MPRnb( LII ,0.5e-9 ,"V*m" ,"Channel length dependence parameter of Iii" ) +`MPRnb( SII0 ,0.5 ,"/V" ,"Vgs dependence parameter of Iii" ) +`MPRnb( SII1 ,0.1 ,"" ,"1st Vgs dependence parameter of Iii" ) +`MPRnb( SII2 ,0.0 ,"V" ,"2nd Vgs dependence parameter of Iii" ) +`MPRnb( SIID ,0.0 ,"V" ,"3rd Vds dependence parameter of Iii" ) +`MPRoo( IIMOD2CLAMP1 ,0.1 ,"V" ,0.0 ,inf ,"Clamp1 of SII1*Vg term in IIMOD=2 model" ) +`MPRoo( IIMOD2CLAMP2 ,0.1 ,"V" ,0.0 ,inf ,"Clamp2 of SII0*Vg term in IIMOD=2 model" ) +`MPRoo( IIMOD2CLAMP3 ,0.1 ,"V" ,0.0 ,inf ,"Clamp3 of Ratio term in IIMOD=2 model" ) // Accumulation Capacitance -`MPRco( EOTACC ,EOT ,"m" ,1.0e-10 ,inf ,"Equivalent oxide thickness for accumulation region" ) -`MPRnb( DELVFBACC ,0.0 ,"V" ,"Change in flatband voltage: Vfb_accumulation - Vfb_inversion" ) +`MPRco( EOTACC ,EOT ,"m" ,1.0e-10 ,inf ,"Equivalent oxide thickness for accumulation region" ) +`MPRnb( DELVFBACC ,0.0 ,"V" ,"Change in flatband voltage: Vfb_accumulation - Vfb_inversion" ) // Fringe Capacitance // CGEOMOD=0 -`MPRcz( CFS ,2.5e-11 ,"F/m" ,"Outer fringe capacitance at source side" ) -`MPRcz( CFD ,CFS ,"F/m" ,"Outer fringe capacitance at drain side" ) +`MPRcz( CFS ,2.5e-11 ,"F/m" ,"Outer fringe capacitance at source side" ) +`MPRcz( CFD ,CFS ,"F/m" ,"Outer fringe capacitance at drain side" ) // Overlap Capacitance for CGEOMOD = 0 and 2 -`MPRcz( CGSO ,0.0 ,"F/m" ,"Non LDD region source-gate overlap capacitance per unit channel width" ) -`MPRcz( CGDO ,CGSO ,"F/m" ,"Non LDD region drain-gate overlap capacitance per unit channel width" ) -`MPRcz( CGSL ,0.0 ,"F/m" ,"Overlap capacitance between gate and lightly-doped source region (for CGEOMOD = 0, 2)" ) -`MPRcz( CGDL ,CGSL ,"F/m" ,"Overlap capacitance between gate and lightly-doped drain region (for CGEOMOD = 0, 2)" ) -`MPRco( CKAPPAS ,0.6 ,"V" ,2.0e-2 ,inf ,"Coefficient of bias-dependent overlap capacitance for the source side (for CGEOMOD = 0, 2)" ) -`MPRco( CKAPPAD ,CKAPPAS ,"V" ,2.0e-2 ,inf ,"Coefficient of bias-dependent overlap capacitance for the drain side (for CGEOMOD = 0, 2)" ) -`MPRcz( CGBO ,0.0 ,"F/m" ,"Gate-to-substrate overlap capacitance per unit channel length per finger per NGCON" ) -`MPRcz( CGBN ,0.0 ,"F/m" ,"Gate-to-substrate overlap capacitance per unit channel length per fin per finger" ) -`MPRcz( CGBL ,0.0 ,"F/m" ,"Bias dependent component of gate-to-substrate overlap capacitance per unit channel length per fin per finger" ) -`MPRco( CKAPPAB ,0.6 ,"" ,2.0e-2 ,inf ,"Bias dependent gate-to-substrate parasitic capacitance" ) +`MPRcz( CGSO ,0.0 ,"F/m" ,"Non LDD region source-gate overlap capacitance per unit channel width" ) +`MPRcz( CGDO ,CGSO ,"F/m" ,"Non LDD region drain-gate overlap capacitance per unit channel width" ) +`MPRcz( CGSL ,0.0 ,"F/m" ,"Overlap capacitance between gate and lightly-doped source region (for CGEOMOD = 0, 2)" ) +`MPRcz( CGDL ,CGSL ,"F/m" ,"Overlap capacitance between gate and lightly-doped drain region (for CGEOMOD = 0, 2)" ) +`MPRco( CKAPPAS ,0.6 ,"V" ,2.0e-2 ,inf ,"Coefficient of bias-dependent overlap capacitance for the source side (for CGEOMOD = 0, 2)" ) +`MPRco( CKAPPAD ,CKAPPAS ,"V" ,2.0e-2 ,inf ,"Coefficient of bias-dependent overlap capacitance for the drain side (for CGEOMOD = 0, 2)" ) +`MPRcz( CGBO ,0.0 ,"F/m" ,"Gate-to-substrate overlap capacitance per unit channel length per finger per NGCON" ) +`MPRcz( CGBN ,0.0 ,"F/m" ,"Gate-to-substrate overlap capacitance per unit channel length per fin per finger" ) +`MPRcz( CGBL ,0.0 ,"F/m" ,"Bias dependent component of gate-to-substrate overlap capacitance per unit channel length per fin per finger" ) +`MPRco( CKAPPAB ,0.6 ,"" ,2.0e-2 ,inf ,"Bias dependent gate-to-substrate parasitic capacitance" ) // Source/Drain-to-Substrate Sidewall Capacitance -`MPRcz( CSDESW ,0.0 ,"F/m" ,"Coefficient for source/drain-to-substrate sidewall capacitance" ) +`MPRcz( CSDESW ,0.0 ,"F/m" ,"Coefficient for source/drain-to-substrate sidewall capacitance" ) // Junction Current and Capacitance // Junction Capacitance -`MPRnb( CJS ,5.0e-4 ,"F/m^2" ,"Unit area source-side junction capacitance at zero bias" ) -`MPRnb( CJD ,CJS ,"F/m^2" ,"Unit area drain-side junction capacitance at zero bias" ) -`MPRnb( CJSWS ,5.0e-10 ,"F/m" ,"Unit length source-side sidewall junction capacitance at zero bias" ) -`MPRnb( CJSWD ,CJSWS ,"F/m" ,"Unit length drain-side sidewall junction capacitance at zero bias" ) -`MPRnb( CJSWGS ,0.0 ,"F/m" ,"Unit length source-side gate sidewall junction capacitance at zero bias" ) -`MPRnb( CJSWGD ,CJSWGS ,"F/m" ,"Unit length drain-side gate sidewall junction capacitance at zero bias" ) -`MPRnb( PBS ,1.0 ,"V" ,"Source-side bulk junction built-in potential" ) -`MPRnb( PBD ,PBS ,"V" ,"Drain-side bulk junction built-in potential" ) -`MPRnb( PBSWS ,1.0 ,"V" ,"Built-in potential for Source-side sidewall junction capacitance" ) -`MPRnb( PBSWD ,PBSWS ,"V" ,"Built-in potential for Drain-side sidewall junction capacitance" ) -`MPRnb( PBSWGS ,PBSWS ,"V" ,"Built-in potential for Source-side gate sidewall junction capacitance" ) -`MPRnb( PBSWGD ,PBSWGS ,"V" ,"Built-in potential for Drain-side gate sidewall junction capacitance" ) -`MPRnb( MJS ,0.5 ,"" ,"Source bottom junction capacitance grading coefficient" ) -`MPRnb( MJD ,MJS ,"" ,"Drain bottom junction capacitance grading coefficient" ) -`MPRnb( MJSWS ,0.33 ,"" ,"Source sidewall junction capacitance grading coefficient" ) -`MPRnb( MJSWD ,MJSWS ,"" ,"Drain sidewall junction capacitance grading coefficient" ) -`MPRnb( MJSWGS ,MJSWS ,"" ,"Source-side gate sidewall junction capacitance grading coefficient" ) -`MPRnb( MJSWGD ,MJSWGS ,"" ,"Drain-side gate sidewall junction capacitance grading coefficient" ) - -// Second Junction for Two-Step Junction Capacitance -`MPRcz( SJS ,0.0 ,"" ,"Constant for source-side two-step second junction" ) -`MPRcz( SJD ,SJS ,"" ,"Constant for drain-side two-step second junction" ) -`MPRcz( SJSWS ,0.0 ,"" ,"Constant for source-side sidewall two-step second junction" ) -`MPRcz( SJSWD ,SJSWS ,"" ,"Constant for drain-side sidewall two-step second junction" ) -`MPRcz( SJSWGS ,0.0 ,"" ,"Constant for source-side gate sidewall two-step second junction" ) -`MPRcz( SJSWGD ,SJSWGS ,"" ,"Constant for source-side gate sidewall two-step second junction" ) -`MPRnb( MJS2 ,1.25e-1 ,"" ,"Source bottom two-step second junction capacitance grading coefficient" ) -`MPRnb( MJD2 ,MJS2 ,"" ,"Drain bottom two-step second junction capacitance grading coefficient" ) -`MPRnb( MJSWS2 ,8.3e-2 ,"" ,"Source sidewall two-step second junction capacitance grading coefficient" ) -`MPRnb( MJSWD2 ,MJSWS2 ,"" ,"Drain sidewall two-step second junction capacitance grading coefficient" ) -`MPRnb( MJSWGS2 ,MJSWS2 ,"" ,"Source-side gate sidewall two-step second junction capacitance grading coefficient" ) -`MPRnb( MJSWGD2 ,MJSWGS2 ,"" ,"Drain-side gate sidewall two-step second junction capacitance grading coefficient" ) +`MPRnb( CJS ,5.0e-4 ,"F/m^2" ,"Unit area source-side junction capacitance at zero bias" ) +`MPRnb( CJD ,CJS ,"F/m^2" ,"Unit area drain-side junction capacitance at zero bias" ) +`MPRnb( CJSWS ,5.0e-10 ,"F/m" ,"Unit length source-side sidewall junction capacitance at zero bias" ) +`MPRnb( CJSWD ,CJSWS ,"F/m" ,"Unit length drain-side sidewall junction capacitance at zero bias" ) +`MPRnb( CJSWGS ,0.0 ,"F/m" ,"Unit length source-side gate sidewall junction capacitance at zero bias" ) +`MPRnb( CJSWGD ,CJSWGS ,"F/m" ,"Unit length drain-side gate sidewall junction capacitance at zero bias" ) +`MPRnb( PBS ,1.0 ,"V" ,"Source-side bulk junction built-in potential" ) +`MPRnb( PBD ,PBS ,"V" ,"Drain-side bulk junction built-in potential" ) +`MPRnb( PBSWS ,1.0 ,"V" ,"Built-in potential for Source-side sidewall junction capacitance" ) +`MPRnb( PBSWD ,PBSWS ,"V" ,"Built-in potential for Drain-side sidewall junction capacitance" ) +`MPRnb( PBSWGS ,PBSWS ,"V" ,"Built-in potential for Source-side gate sidewall junction capacitance" ) +`MPRnb( PBSWGD ,PBSWGS ,"V" ,"Built-in potential for Drain-side gate sidewall junction capacitance" ) +`MPRnb( MJS ,0.5 ,"" ,"Source bottom junction capacitance grading coefficient" ) +`MPRnb( MJD ,MJS ,"" ,"Drain bottom junction capacitance grading coefficient" ) +`MPRnb( MJSWS ,0.33 ,"" ,"Source sidewall junction capacitance grading coefficient" ) +`MPRnb( MJSWD ,MJSWS ,"" ,"Drain sidewall junction capacitance grading coefficient" ) +`MPRnb( MJSWGS ,MJSWS ,"" ,"Source-side gate sidewall junction capacitance grading coefficient" ) +`MPRnb( MJSWGD ,MJSWGS ,"" ,"Drain-side gate sidewall junction capacitance grading coefficient" ) + +// Second Junction for Two-Step Junction Capacitance +`MPRcz( SJS ,0.0 ,"" ,"Constant for source-side two-step second junction" ) +`MPRcz( SJD ,SJS ,"" ,"Constant for drain-side two-step second junction" ) +`MPRcz( SJSWS ,0.0 ,"" ,"Constant for source-side sidewall two-step second junction" ) +`MPRcz( SJSWD ,SJSWS ,"" ,"Constant for drain-side sidewall two-step second junction" ) +`MPRcz( SJSWGS ,0.0 ,"" ,"Constant for source-side gate sidewall two-step second junction" ) +`MPRcz( SJSWGD ,SJSWGS ,"" ,"Constant for source-side gate sidewall two-step second junction" ) +`MPRnb( MJS2 ,1.25e-1 ,"" ,"Source bottom two-step second junction capacitance grading coefficient" ) +`MPRnb( MJD2 ,MJS2 ,"" ,"Drain bottom two-step second junction capacitance grading coefficient" ) +`MPRnb( MJSWS2 ,8.3e-2 ,"" ,"Source sidewall two-step second junction capacitance grading coefficient" ) +`MPRnb( MJSWD2 ,MJSWS2 ,"" ,"Drain sidewall two-step second junction capacitance grading coefficient" ) +`MPRnb( MJSWGS2 ,MJSWS2 ,"" ,"Source-side gate sidewall two-step second junction capacitance grading coefficient" ) +`MPRnb( MJSWGD2 ,MJSWGS2 ,"" ,"Drain-side gate sidewall two-step second junction capacitance grading coefficient" ) // Junction Current -`MPRnb( JSS ,1.0e-4 ,"A/m^2" ,"Bottom source junction reverse saturation current density" ) -`MPRnb( JSD ,JSS ,"A/m^2" ,"Bottom drain junction reverse saturation current density" ) -`MPRnb( JSWS ,0.0 ,"A/m" ,"Unit length reverse saturation current for sidewall source junction" ) -`MPRnb( JSWD ,JSWS ,"A/m" ,"Unit length reverse saturation current for sidewall drain junction" ) -`MPRnb( JSWGS ,0.0 ,"A/m" ,"Unit length reverse saturation current for gate-edge sidewall source junction" ) -`MPRnb( JSWGD ,JSWGS ,"A/m" ,"Unit length reverse saturation current for gate-edge sidewall drain junction" ) -`MPRex( NJS ,1.0 ,"" ,0.0 ,"Source junction emission coefficient" ) -`MPRex( NJD ,NJS ,"" ,0.0 ,"Drain junction emission coefficient" ) -`MPRnb( IJTHSFWD ,0.1 ,"A" ,"Forward source diode breakdown limiting current" ) -`MPRnb( IJTHDFWD ,IJTHSFWD ,"A" ,"Forward drain diode breakdown limiting current" ) -`MPRnb( IJTHSREV ,0.1 ,"A" ,"Reverse source diode breakdown limiting current" ) -`MPRnb( IJTHDREV ,IJTHSREV ,"A" ,"Reverse drain diode breakdown limiting current" ) -`MPRnb( BVS ,1.0e1 ,"V" ,"Source diode breakdown voltage" ) -`MPRnb( BVD ,BVS ,"V" ,"Drain diode breakdown voltage" ) -`MPRnb( XJBVS ,1.0 ,"" ,"Fitting parameter for source diode breakdown current" ) -`MPRnb( XJBVD ,XJBVS ,"" ,"Fitting parameter for drain diode breakdown current" ) +`MPRnb( JSS ,1.0e-4 ,"A/m^2" ,"Bottom source junction reverse saturation current density" ) +`MPRnb( JSD ,JSS ,"A/m^2" ,"Bottom drain junction reverse saturation current density" ) +`MPRnb( JSWS ,0.0 ,"A/m" ,"Unit length reverse saturation current for sidewall source junction" ) +`MPRnb( JSWD ,JSWS ,"A/m" ,"Unit length reverse saturation current for sidewall drain junction" ) +`MPRnb( JSWGS ,0.0 ,"A/m" ,"Unit length reverse saturation current for gate-edge sidewall source junction" ) +`MPRnb( JSWGD ,JSWGS ,"A/m" ,"Unit length reverse saturation current for gate-edge sidewall drain junction" ) +`MPRex( NJS ,1.0 ,"" ,0.0 ,"Source junction emission coefficient" ) +`MPRex( NJD ,NJS ,"" ,0.0 ,"Drain junction emission coefficient" ) +`MPRnb( IJTHSFWD ,0.1 ,"A" ,"Forward source diode breakdown limiting current" ) +`MPRnb( IJTHDFWD ,IJTHSFWD ,"A" ,"Forward drain diode breakdown limiting current" ) +`MPRnb( IJTHSREV ,0.1 ,"A" ,"Reverse source diode breakdown limiting current" ) +`MPRnb( IJTHDREV ,IJTHSREV ,"A" ,"Reverse drain diode breakdown limiting current" ) +`MPRnb( BVS ,1.0e1 ,"V" ,"Source diode breakdown voltage" ) +`MPRnb( BVD ,BVS ,"V" ,"Drain diode breakdown voltage" ) +`MPRnb( XJBVS ,1.0 ,"" ,"Fitting parameter for source diode breakdown current" ) +`MPRnb( XJBVD ,XJBVS ,"" ,"Fitting parameter for drain diode breakdown current" ) // Tunneling Component of Junction Current -`MPRnb( JTSS ,0.0 ,"A/m^2" ,"Bottom source junction trap-assisted saturation current density" ) -`MPRnb( JTSD ,JTSS ,"A/m^2" ,"Bottom drain junction trap-assisted saturation current density" ) -`MPRnb( JTSSWS ,0.0 ,"A/m" ,"Unit length trap-assisted saturation current for sidewall source junction" ) -`MPRnb( JTSSWD ,JTSSWS ,"A/m" ,"Unit length trap-assisted saturation current for sidewall drain junction" ) -`MPRnb( JTSSWGS ,0.0 ,"A/m" ,"Unit length trap-assisted saturation current for gate-edge sidewall source junction" ) -`MPRnb( JTSSWGD ,JTSSWGS ,"A/m" ,"Unit length trap-assisted saturation current for gate-edge sidewall drain junction" ) -`MPRnb( JTWEFF ,0.0 ,"m" ,"Trap-assisted tunneling current width dependence" ) -`MPRnb( NJTS ,2.0e1 ,"" ,"Non-ideality factor for JTSS" ) -`MPRnb( NJTSD ,NJTS ,"" ,"Non-ideality factor for JTSD" ) -`MPRnb( NJTSSW ,2.0e1 ,"" ,"Non-ideality factor for JTSSWS" ) -`MPRnb( NJTSSWD ,NJTSSW ,"" ,"Non-ideality factor for JTSSWD" ) -`MPRnb( NJTSSWG ,2.0e1 ,"" ,"Non-ideality factor for JTSSWGS" ) -`MPRnb( NJTSSWGD ,NJTSSWG ,"" ,"Non-ideality factor for JTSSWGD" ) -`MPRnb( VTSS ,1.0e1 ,"V" ,"Bottom source junction trap-assisted current voltage dependent parameter" ) -`MPRnb( VTSD ,VTSS ,"V" ,"Bottom drain junction trap-assisted current voltage dependent parameter" ) -`MPRnb( VTSSWS ,1.0e1 ,"V" ,"Unit length trap-assisted current voltage dependent parameter for sidewall source junction" ) -`MPRnb( VTSSWD ,VTSSWS ,"V" ,"Unit length trap-assisted current voltage dependent parameter for sidewall drain junction" ) -`MPRnb( VTSSWGS ,1.0e1 ,"V" ,"Unit length trap-assisted current voltage dependent parameter for gate-edge sidewall source junction" ) +`MPRnb( JTSS ,0.0 ,"A/m^2" ,"Bottom source junction trap-assisted saturation current density" ) +`MPRnb( JTSD ,JTSS ,"A/m^2" ,"Bottom drain junction trap-assisted saturation current density" ) +`MPRnb( JTSSWS ,0.0 ,"A/m" ,"Unit length trap-assisted saturation current for sidewall source junction" ) +`MPRnb( JTSSWD ,JTSSWS ,"A/m" ,"Unit length trap-assisted saturation current for sidewall drain junction" ) +`MPRnb( JTSSWGS ,0.0 ,"A/m" ,"Unit length trap-assisted saturation current for gate-edge sidewall source junction" ) +`MPRnb( JTSSWGD ,JTSSWGS ,"A/m" ,"Unit length trap-assisted saturation current for gate-edge sidewall drain junction" ) +`MPRnb( JTWEFF ,0.0 ,"m" ,"Trap-assisted tunneling current width dependence" ) +`MPRnb( NJTS ,2.0e1 ,"" ,"Non-ideality factor for JTSS" ) +`MPRnb( NJTSD ,NJTS ,"" ,"Non-ideality factor for JTSD" ) +`MPRnb( NJTSSW ,2.0e1 ,"" ,"Non-ideality factor for JTSSWS" ) +`MPRnb( NJTSSWD ,NJTSSW ,"" ,"Non-ideality factor for JTSSWD" ) +`MPRnb( NJTSSWG ,2.0e1 ,"" ,"Non-ideality factor for JTSSWGS" ) +`MPRnb( NJTSSWGD ,NJTSSWG ,"" ,"Non-ideality factor for JTSSWGD" ) +`MPRnb( VTSS ,1.0e1 ,"V" ,"Bottom source junction trap-assisted current voltage dependent parameter" ) +`MPRnb( VTSD ,VTSS ,"V" ,"Bottom drain junction trap-assisted current voltage dependent parameter" ) +`MPRnb( VTSSWS ,1.0e1 ,"V" ,"Unit length trap-assisted current voltage dependent parameter for sidewall source junction" ) +`MPRnb( VTSSWD ,VTSSWS ,"V" ,"Unit length trap-assisted current voltage dependent parameter for sidewall drain junction" ) +`MPRnb( VTSSWGS ,1.0e1 ,"V" ,"Unit length trap-assisted current voltage dependent parameter for gate-edge sidewall source junction" ) `MPRnb( VTSSWGD ,VTSSWGS ,"V" ,"Unit length trap-assisted current voltage dependent parameter for gate-edge sidewall drain junction" ) - + // Recombination-Generation Current -`MPRnb( LINTIGEN ,0.0 ,"m" ,"Lint for thermal generation current" ) -`MPRnb( NTGEN ,1.0 ,"" ,"Thermal generation current parameter" ) -`MPRnb( AIGEN ,0.0 ,"(m^-3)*(V^-1)" ,"Thermal generation current parameter" ) -`MPRnb( BIGEN ,0.0 ,"(m^-3)*(V^-3)" ,"Thermal generation current parameter" ) +`MPRnb( LINTIGEN ,0.0 ,"m" ,"Lint for thermal generation current" ) +`MPRnb( NTGEN ,1.0 ,"" ,"Thermal generation current parameter" ) +`MPRnb( AIGEN ,0.0 ,"(m^-3)*(V^-1)" ,"Thermal generation current parameter" ) +`MPRnb( BIGEN ,0.0 ,"(m^-3)*(V^-3)" ,"Thermal generation current parameter" ) // NQS Gate Resistance Model & NQS Charge Deficit Model // For NQSMOD=1, Set XRCRG1=0 to turn off NQS gate resistance -`MPRnb( XRCRG1 ,1.2e1 ,"" ,"Parameter for non-quasistatic gate resistance (NQSMOD = 1) and NQSMOD = 2" ) -`MPRnb( XRCRG2 ,1.0 ,"" ,"Parameter for non-quasistatic gate resistance (NQSMOD = 1) and NQSMOD = 2" ) +`MPRnb( XRCRG1 ,1.2e1 ,"" ,"Parameter for non-quasistatic gate resistance (NQSMOD = 1) and NQSMOD = 2" ) +`MPRnb( XRCRG2 ,1.0 ,"" ,"Parameter for non-quasistatic gate resistance (NQSMOD = 1) and NQSMOD = 2" ) // NQS Charge Segmentation Model -`MPIcc( NSEG ,4 ,"" ,4 ,10 ,"Number of segments for NQSMOD=3 (3, 5 & 10 supported)" ) +`MPIcc( NSEG ,4 ,"" ,4 ,10 ,"Number of segments for NQSMOD=3 (3, 5 & 10 supported)" ) // Flicker Noise -`MPRnb( EF ,1.0 ,"" ,"Flicker noise frequency exponent" ) -`MPRnb( EM ,4.1e7 ,"V/m" ,"Flicker noise parameter" ) -`MPRnb( NOIA ,6.25e39 ,"(eV^-1)*(s^(1-EF))*(m^-3)" ,"Flicker noise parameter" ) -`MPRnb( NOIB ,3.125e24 ,"(eV^-1)*(s^(1-EF))*(m^-1)" ,"Flicker noise parameter" ) -`MPRnb( NOIC ,8.75e7 ,"(eV^-1)*(s^(1-EF))*(m)" ,"Flicker noise parameter" ) +`MPRnb( EF ,1.0 ,"" ,"Flicker noise frequency exponent" ) +`MPRnb( EM ,4.1e7 ,"V/m" ,"Flicker noise parameter" ) +`MPRnb( NOIA ,6.25e39 ,"(eV^-1)*(s^(1-EF))*(m^-3)" ,"Flicker noise parameter" ) +`MPRnb( NOIB ,3.125e24 ,"(eV^-1)*(s^(1-EF))*(m^-1)" ,"Flicker noise parameter" ) +`MPRnb( NOIC ,8.75e7 ,"(eV^-1)*(s^(1-EF))*(m)" ,"Flicker noise parameter" ) `MPRnb( LINTNOI ,0.0 ,"m^2" ,"L offset for flicker noise calculation" ) // Thermal Noise -`MPRcz( NTNOI ,1.0 ,"" ,"Thermal noise parameter" ) -`MPRnb( TNOIA ,1.5 ,"/m" ,"Thermal noise parameter" ) -`MPRnb( TNOIB ,3.5 ,"/m" ,"Thermal noise parameter" ) -`MPRnb( RNOIA ,5.77e-1 ,"" ,"Thermal noise coefficient" ) -`MPRnb( RNOIB ,3.7e-1 ,"" ,"Thermal noise coefficient" ) +`MPRcz( NTNOI ,1.0 ,"" ,"Thermal noise parameter" ) +`MPRnb( TNOIA ,1.5 ,"/m" ,"Thermal noise parameter" ) +`MPRnb( TNOIB ,3.5 ,"/m" ,"Thermal noise parameter" ) +`MPRnb( RNOIA ,5.77e-1 ,"" ,"Thermal noise coefficient" ) +`MPRnb( RNOIB ,3.7e-1 ,"" ,"Thermal noise coefficient" ) // Parameters Controlled by Correlated Thermal Noise Switch `ifdef __TNOIMOD1__ -`MPRnb( TNOIC ,3.5 ,"" ,"Thermal noise parameter for TNOIMOD=1" ) -`MPRnb( RNOIC ,3.95e-1 ,"" ,"Thermal noise coefficient for TNOIMOD=1" ) -`MPRex( SCALEN ,1.0e5 ,"" ,0.0 ,"Noise scaling parameter for TNOIMOD=1" ) + `MPRnb( TNOIC ,3.5 ,"" ,"Thermal noise parameter for TNOIMOD=1" ) + `MPRnb( RNOIC ,3.95e-1 ,"" ,"Thermal noise coefficient for TNOIMOD=1" ) + `MPRex( SCALEN ,1.0e5 ,"" ,0.0 ,"Noise scaling parameter for TNOIMOD=1" ) `endif // Temperature Effects -`MPRco( TNOM ,27.0 ,"Celsius" ,-`P_CELSIUS0,inf ,"Temperature at which the model is extracted" ) -`MPRnb( TBGASUB ,7.02e-4 ,"eV/K" ,"Bandgap temperature coefficient" ) -`MPRnb( TBGBSUB ,1.108e3 ,"K" ,"Bandgap temperature coefficient" ) -`MPRnb( KT1 ,0.0 ,"V" ,"Vth temperature coefficient" ) -`MPRnb( KT1L ,0.0 ,"V*m" ,"Vth temperature L coefficient" ) -`MPRnb( TSS ,0.0 ,"/K" ,"Swing temperature coefficient" ) -`MPRnb( IIT ,-0.5 ,"" ,"Impact ionization temperature dependence for IIMOD = 1" ) -`MPRnb( TII ,0.0 ,"" ,"Impact ionization temperature dependence for IIMOD = 2" ) -`MPRnb( TGIDL ,-3.0e-3 ,"/K" ,"GIDL/GISL temperature dependence" ) -`MPRnb( IGT ,2.5 ,"" ,"Gate current temperature dependence" ) -`MPRnb( TCJ ,0.0 ,"/K" ,"Temperature coefficient for CJS/CJD" ) -`MPRnb( TCJSW ,0.0 ,"/K" ,"Temperature coefficient for CJSWS/CJSWD" ) -`MPRnb( TCJSWG ,0.0 ,"/K" ,"Temperature coefficient for CJSWGS/CJSWGD" ) -`MPRnb( TPB ,0.0 ,"/K" ,"Temperature coefficient for PBS/PBD" ) -`MPRnb( TPBSW ,0.0 ,"/K" ,"Temperature coefficient for PBSWS/PBSWD" ) -`MPRnb( TPBSWG ,0.0 ,"/K" ,"Temperature coefficient for PBSWGS/PBSWGD" ) -`MPRnb( XTIS ,3.0 ,"" ,"Source junction current temperature exponent" ) -`MPRnb( XTID ,XTIS ,"" ,"Drain junction current temperature exponent" ) -`MPRnb( XTSS ,2.0e-2 ,"" ,"Power dependence of JTSS on temperature" ) -`MPRnb( XTSD ,XTSS ,"" ,"Power dependence of JTSD on temperature" ) -`MPRnb( XTSSWS ,2.0e-2 ,"" ,"Power dependence of JTSSWS on temperature" ) -`MPRnb( XTSSWD ,XTSSWS ,"" ,"Power dependence of JTSSWD on temperature" ) -`MPRnb( XTSSWGS ,2.0e-2 ,"" ,"Power dependence of JTSSWGS on temperature" ) -`MPRnb( XTSSWGD ,XTSSWGS ,"" ,"Power dependence of JTSSWGD on temperature" ) -`MPRnb( TNJTS ,0.0 ,"" ,"Temperature coefficient for NJTS" ) -`MPRnb( TNJTSD ,TNJTS ,"" ,"Temperature coefficient for NJTSD" ) -`MPRnb( TNJTSSW ,0.0 ,"" ,"Temperature coefficient for NJTSSW" ) -`MPRnb( TNJTSSWD ,TNJTSSW ,"" ,"Temperature coefficient for NJTSSWD" ) -`MPRnb( TNJTSSWG ,0.0 ,"" ,"Temperature coefficient for NJTSSWG" ) -`MPRnb( TNJTSSWGD ,TNJTSSWG ,"" ,"Temperature coefficient for NJTSSWGD" ) +`MPRco( TNOM ,27.0 ,"Celsius" ,-`P_CELSIUS0,inf ,"Temperature at which the model is extracted" ) +`MPRnb( TBGASUB ,7.02e-4 ,"eV/K" ,"Bandgap temperature coefficient" ) +`MPRnb( TBGBSUB ,1.108e3 ,"K" ,"Bandgap temperature coefficient" ) +`MPRnb( KT1 ,0.0 ,"V" ,"Vth temperature coefficient" ) +`MPRnb( KT1L ,0.0 ,"V*m" ,"Vth temperature L coefficient" ) +`MPRnb( TSS ,0.0 ,"/K" ,"Swing temperature coefficient" ) +`MPRnb( IIT ,-0.5 ,"" ,"Impact ionization temperature dependence for IIMOD = 1" ) +`MPRnb( TII ,0.0 ,"" ,"Impact ionization temperature dependence for IIMOD = 2" ) +`MPRnb( TGIDL ,-3.0e-3 ,"/K" ,"GIDL/GISL temperature dependence" ) +`MPRnb( IGT ,2.5 ,"" ,"Gate current temperature dependence" ) +`MPRnb( TCJ ,0.0 ,"/K" ,"Temperature coefficient for CJS/CJD" ) +`MPRnb( TCJSW ,0.0 ,"/K" ,"Temperature coefficient for CJSWS/CJSWD" ) +`MPRnb( TCJSWG ,0.0 ,"/K" ,"Temperature coefficient for CJSWGS/CJSWGD" ) +`MPRnb( TPB ,0.0 ,"/K" ,"Temperature coefficient for PBS/PBD" ) +`MPRnb( TPBSW ,0.0 ,"/K" ,"Temperature coefficient for PBSWS/PBSWD" ) +`MPRnb( TPBSWG ,0.0 ,"/K" ,"Temperature coefficient for PBSWGS/PBSWGD" ) +`MPRnb( XTIS ,3.0 ,"" ,"Source junction current temperature exponent" ) +`MPRnb( XTID ,XTIS ,"" ,"Drain junction current temperature exponent" ) +`MPRnb( XTSS ,2.0e-2 ,"" ,"Power dependence of JTSS on temperature" ) +`MPRnb( XTSD ,XTSS ,"" ,"Power dependence of JTSD on temperature" ) +`MPRnb( XTSSWS ,2.0e-2 ,"" ,"Power dependence of JTSSWS on temperature" ) +`MPRnb( XTSSWD ,XTSSWS ,"" ,"Power dependence of JTSSWD on temperature" ) +`MPRnb( XTSSWGS ,2.0e-2 ,"" ,"Power dependence of JTSSWGS on temperature" ) +`MPRnb( XTSSWGD ,XTSSWGS ,"" ,"Power dependence of JTSSWGD on temperature" ) +`MPRnb( TNJTS ,0.0 ,"" ,"Temperature coefficient for NJTS" ) +`MPRnb( TNJTSD ,TNJTS ,"" ,"Temperature coefficient for NJTSD" ) +`MPRnb( TNJTSSW ,0.0 ,"" ,"Temperature coefficient for NJTSSW" ) +`MPRnb( TNJTSSWD ,TNJTSSW ,"" ,"Temperature coefficient for NJTSSWD" ) +`MPRnb( TNJTSSWG ,0.0 ,"" ,"Temperature coefficient for NJTSSWG" ) +`MPRnb( TNJTSSWGD ,TNJTSSWG ,"" ,"Temperature coefficient for NJTSSWGD" ) // Self Heating -`MPRcz( RTH0 ,1.0e-2 ,"ohm*m*K/W" ,"Thermal resistance" ) -`MPRcz( CTH0 ,1.0e-5 ,"W*s/m/K" ,"Thermal capacitance" ) +`MPRcz( RTH0 ,1.0e-2 ,"ohm*m*K/W" ,"Thermal resistance" ) +`MPRcz( CTH0 ,1.0e-5 ,"W*s/m/K" ,"Thermal capacitance" ) `MPRcz( WTH0 ,0.0 ,"m" ,"Width dependence coefficient for Rth and Cth" ) -`MPRcz( ASHEXP ,1.0 ,"" ,"Exponent to tune RTH dependence of NFINTOTAL" ) -`MPRcz( BSHEXP ,1.0 ,"" ,"Exponent to tune RTH dependence of NF" ) +`MPRcz( ASHEXP ,1.0 ,"" ,"Exponent to tune RTH dependence of NFINTOTAL" ) +`MPRcz( BSHEXP ,1.0 ,"" ,"Exponent to tune RTH dependence of NF" ) // Unified Model -`MPRoz( ACH_UFCM ,1.0 ,"m^2" ,"Area of the channel for the unified Model" ) -`MPRoz( CINS_UFCM ,1.0 ,"F/m" ,"Insulator capacitance for the unified Model" ) -`MPRoz( W_UFCM ,1.0 ,"m" ,"Effective channel width for the unified Model" ) -`MPRcz( TFIN_TOP ,1.5e-8 ,"m" ,"Top body (fin) thickness for trapezoidal triple gate" ) -`MPRco( TFIN_BASE ,1.5e-8 ,"m" ,1.0e-9 ,inf ,"Base body (fin) thickness for trapezoidal triple gate" ) -`MPRcz( QMFACTORCV ,0.0 ,"" ,"Charge dependence taking QM effects into account" ) -`MPRcz( ALPHA_UFCM ,0.5556 ,"" ,"Mobile charge scaling term taking QM effects into account" ) +`MPRoz( ACH_UFCM ,1.0 ,"m^2" ,"Area of the channel for the unified Model" ) +`MPRoz( CINS_UFCM ,1.0 ,"F/m" ,"Insulator capacitance for the unified Model" ) +`MPRoz( W_UFCM ,1.0 ,"m" ,"Effective channel width for the unified Model" ) +`MPRcz( TFIN_TOP ,1.5e-8 ,"m" ,"Top body (fin) thickness for trapezoidal triple gate" ) +`MPRco( TFIN_BASE ,1.5e-8 ,"m" ,1.0e-9 ,inf ,"Base body (fin) thickness for trapezoidal triple gate" ) +`MPRcz( QMFACTORCV ,0.0 ,"" ,"Charge dependence taking QM effects into account" ) +`MPRcz( ALPHA_UFCM ,0.5556 ,"" ,"Mobile charge scaling term taking QM effects into account" ) // Binning Parameters `include "bsimcmg_binning_parameters.include" // Output Variables `ifdef __OPINFO__ - (* desc= "WEFF" *) real WEFF; - (* desc= "LEFF" *) real LEFF; - (* desc= "WEFFCV" *) real WEFFCV; - (* desc= "LEFFCV" *) real LEFFCV; - (* desc= "IDS" *) real IDS; - (* desc= "IDEFF" *) real IDEFF; - (* desc= "ISEFF" *) real ISEFF; - (* desc= "IGTOT" *) real IGTOT; - (* desc= "IDSGEN" *) real IDSGEN; - (* desc= "III" *) real III; - (* desc= "IGS" *) real IGS; - (* desc= "IGD" *) real IGD; - (* desc= "IGCS" *) real IGCS; - (* desc= "IGCD" *) real IGCD; - (* desc= "IGBS" *) real IGBS; - (* desc= "IGBD" *) real IGBD; - (* desc= "IGIDL" *) real IGIDL; - (* desc= "IGISL" *) real IGISL; - (* desc= "IJSB" *) real IJSB; - (* desc= "IJDB" *) real IJDB; - (* desc= "ISUB" *) real ISUB; - (* desc= "BETA" *) real BETA; - (* desc= "VTH" *) real VTH; - (* desc= "VDSSAT" *) real VDSSAT; - (* desc= "VFB" *) real VFB; - (* desc= "GM" *) real GM; - (* desc= "GDS" *) real GDS; - (* desc= "GMBS" *) real GMBS; - (* desc= "QGI" *) real QGI; - (* desc= "QDI" *) real QDI; - (* desc= "QSI" *) real QSI; - (* desc= "QBI" *) real QBI; - (* desc= "QG" *) real QG; - (* desc= "QD" *) real QD; - (* desc= "QS" *) real QS; - (* desc= "QB" *) real QB; - (* desc= "CGGI" *) real CGGI; - (* desc= "CGSI" *) real CGSI; - (* desc= "CGDI" *) real CGDI; - (* desc= "CGEI" *) real CGEI; - (* desc= "CDGI" *) real CDGI; - (* desc= "CDDI" *) real CDDI; - (* desc= "CDSI" *) real CDSI; - (* desc= "CDEI" *) real CDEI; - (* desc= "CSGI" *) real CSGI; - (* desc= "CSDI" *) real CSDI; - (* desc= "CSSI" *) real CSSI; - (* desc= "CSEI" *) real CSEI; - (* desc= "CEGI" *) real CEGI; - (* desc= "CEDI" *) real CEDI; - (* desc= "CESI" *) real CESI; - (* desc= "CEEI" *) real CEEI; - (* desc= "CGG" *) real CGG; - (* desc= "CGS" *) real CGS; - (* desc= "CGD" *) real CGD; - (* desc= "CGE" *) real CGE; - (* desc= "CDG" *) real CDG; - (* desc= "CDD" *) real CDD; - (* desc= "CDS" *) real CDS; - (* desc= "CDE" *) real CDE; - (* desc= "CSG" *) real CSG; - (* desc= "CSD" *) real CSD; - (* desc= "CSS" *) real CSS; - (* desc= "CSE" *) real CSE; - (* desc= "CEG" *) real CEG; - (* desc= "CED" *) real CED; - (* desc= "CES" *) real CES; - (* desc= "CEE" *) real CEE; - (* desc= "CGSEXT" *) real CGSEXT; - (* desc= "CGDEXT" *) real CGDEXT; - (* desc= "CGBOV" *) real CGBOV; - (* desc= "CJST" *) real CJST; - (* desc= "CJDT" *) real CJDT; - (* desc= "RSGEO" *) real RSGEO; - (* desc= "RDGEO" *) real RDGEO; - (* desc= "CFGEO" *) real CFGEO; - (* desc= "T_TOTAL_K" *) real T_TOTAL_K; - (* desc= "T_TOTAL_C" *) real T_TOTAL_C; - (* desc= "T_DELTA_SH" *) real T_DELTA_SH; - - `ifdef __DEBUG__ - (* desc= "IGBACC" *) real IGBACC; - (* desc= "IGBINV" *) real IGBINV; - (* desc= "DIDSDVG" *) real DIDSDVG; - (* desc= "DIDSDVS" *) real DIDSDVS; - (* desc= "DIDSDVD" *) real DIDSDVD; - (* desc= "DIGSDVG" *) real DIGSDVG; - (* desc= "DIGSDVS" *) real DIGSDVS; - (* desc= "DIGSDVD" *) real DIGSDVD; - (* desc= "DIGDDVG" *) real DIGDDVG; - (* desc= "DIGDDVS" *) real DIGDDVS; - (* desc= "DIGDDVD" *) real DIGDDVD; - (* desc= "DIIIDVG" *) real DIIIDVG; - (* desc= "DIIIDVS" *) real DIIIDVS; - (* desc= "DIIIDVD" *) real DIIIDVD; - (* desc= "DIGIDLDVG" *) real DIGIDLDVG; - (* desc= "DIGIDLDVS" *) real DIGIDLDVS; - (* desc= "DIGIDLDVD" *) real DIGIDLDVD; - (* desc= "DIGISLDVG" *) real DIGISLDVG; - (* desc= "DIGISLDVS" *) real DIGISLDVS; - (* desc= "DIGISLDVD" *) real DIGISLDVD; - - `ifdef __SHMOD__ - (* desc= "CGT" *) real CGT; - (* desc= "CST" *) real CST; - (* desc= "CDT" *) real CDT; - (* desc= "DIDSDVTH" *) real DIDSDVTH; - (* desc= "DIGSDVTH" *) real DIGSDVTH; - (* desc= "DIGDDVTH" *) real DIGDDVTH; - (* desc= "DIIIDVTH" *) real DIIIDVTH; - (* desc= "DIGIDLDVTH" *) real DIGIDLDVTH; - (* desc= "DIGISLDVTH" *) real DIGISLDVTH; - (* desc= "DITHDVTH" *) real DITHDVTH; - `endif - - (* desc= "ITH" *) real ITH; - (* desc= "DITHDVG" *) real DITHDVG; - (* desc= "DITHDVS" *) real DITHDVS; - (* desc= "DITHDVD" *) real DITHDVD; - `endif + (* desc= "WEFF" *) real WEFF; + (* desc= "LEFF" *) real LEFF; + (* desc= "WEFFCV" *) real WEFFCV; + (* desc= "LEFFCV" *) real LEFFCV; + (* desc= "IDS" *) real IDS; + (* desc= "IDEFF" *) real IDEFF; + (* desc= "ISEFF" *) real ISEFF; + (* desc= "IGTOT" *) real IGTOT; + (* desc= "IDSGEN" *) real IDSGEN; + (* desc= "III" *) real III; + (* desc= "IGS" *) real IGS; + (* desc= "IGD" *) real IGD; + (* desc= "IGCS" *) real IGCS; + (* desc= "IGCD" *) real IGCD; + (* desc= "IGBS" *) real IGBS; + (* desc= "IGBD" *) real IGBD; + (* desc= "IGIDL" *) real IGIDL; + (* desc= "IGISL" *) real IGISL; + (* desc= "IJSB" *) real IJSB; + (* desc= "IJDB" *) real IJDB; + (* desc= "ISUB" *) real ISUB; + (* desc= "BETA" *) real BETA; + (* desc= "VTH" *) real VTH; + (* desc= "VDSSAT" *) real VDSSAT; + (* desc= "VFB" *) real VFB; + (* desc= "GM" *) real GM; + (* desc= "GDS" *) real GDS; + (* desc= "GMBS" *) real GMBS; + (* desc= "QGI" *) real QGI; + (* desc= "QDI" *) real QDI; + (* desc= "QSI" *) real QSI; + (* desc= "QBI" *) real QBI; + (* desc= "QG" *) real QG; + (* desc= "QD" *) real QD; + (* desc= "QS" *) real QS; + (* desc= "QB" *) real QB; + (* desc= "CGGI" *) real CGGI; + (* desc= "CGSI" *) real CGSI; + (* desc= "CGDI" *) real CGDI; + (* desc= "CGEI" *) real CGEI; + (* desc= "CDGI" *) real CDGI; + (* desc= "CDDI" *) real CDDI; + (* desc= "CDSI" *) real CDSI; + (* desc= "CDEI" *) real CDEI; + (* desc= "CSGI" *) real CSGI; + (* desc= "CSDI" *) real CSDI; + (* desc= "CSSI" *) real CSSI; + (* desc= "CSEI" *) real CSEI; + (* desc= "CEGI" *) real CEGI; + (* desc= "CEDI" *) real CEDI; + (* desc= "CESI" *) real CESI; + (* desc= "CEEI" *) real CEEI; + (* desc= "CGG" *) real CGG; + (* desc= "CGS" *) real CGS; + (* desc= "CGD" *) real CGD; + (* desc= "CGE" *) real CGE; + (* desc= "CDG" *) real CDG; + (* desc= "CDD" *) real CDD; + (* desc= "CDS" *) real CDS; + (* desc= "CDE" *) real CDE; + (* desc= "CSG" *) real CSG; + (* desc= "CSD" *) real CSD; + (* desc= "CSS" *) real CSS; + (* desc= "CSE" *) real CSE; + (* desc= "CEG" *) real CEG; + (* desc= "CED" *) real CED; + (* desc= "CES" *) real CES; + (* desc= "CEE" *) real CEE; + (* desc= "CGSEXT" *) real CGSEXT; + (* desc= "CGDEXT" *) real CGDEXT; + (* desc= "CGBOV" *) real CGBOV; + (* desc= "CJST" *) real CJST; + (* desc= "CJDT" *) real CJDT; + (* desc= "RSGEO" *) real RSGEO; + (* desc= "RDGEO" *) real RDGEO; + (* desc= "CFGEO" *) real CFGEO; + (* desc= "T_TOTAL_K" *) real T_TOTAL_K; + (* desc= "T_TOTAL_C" *) real T_TOTAL_C; + (* desc= "T_DELTA_SH" *) real T_DELTA_SH; + + `ifdef __DEBUG__ + (* desc= "IGBACC" *) real IGBACC; + (* desc= "IGBINV" *) real IGBINV; + (* desc= "DIDSDVG" *) real DIDSDVG; + (* desc= "DIDSDVS" *) real DIDSDVS; + (* desc= "DIDSDVD" *) real DIDSDVD; + (* desc= "DIGSDVG" *) real DIGSDVG; + (* desc= "DIGSDVS" *) real DIGSDVS; + (* desc= "DIGSDVD" *) real DIGSDVD; + (* desc= "DIGDDVG" *) real DIGDDVG; + (* desc= "DIGDDVS" *) real DIGDDVS; + (* desc= "DIGDDVD" *) real DIGDDVD; + (* desc= "DIIIDVG" *) real DIIIDVG; + (* desc= "DIIIDVS" *) real DIIIDVS; + (* desc= "DIIIDVD" *) real DIIIDVD; + (* desc= "DIGIDLDVG" *) real DIGIDLDVG; + (* desc= "DIGIDLDVS" *) real DIGIDLDVS; + (* desc= "DIGIDLDVD" *) real DIGIDLDVD; + (* desc= "DIGISLDVG" *) real DIGISLDVG; + (* desc= "DIGISLDVS" *) real DIGISLDVS; + (* desc= "DIGISLDVD" *) real DIGISLDVD; + + `ifdef __SHMOD__ + (* desc= "CGT" *) real CGT; + (* desc= "CST" *) real CST; + (* desc= "CDT" *) real CDT; + (* desc= "DIDSDVTH" *) real DIDSDVTH; + (* desc= "DIGSDVTH" *) real DIGSDVTH; + (* desc= "DIGDDVTH" *) real DIGDDVTH; + (* desc= "DIIIDVTH" *) real DIIIDVTH; + (* desc= "DIGIDLDVTH" *) real DIGIDLDVTH; + (* desc= "DIGISLDVTH" *) real DIGISLDVTH; + (* desc= "DITHDVTH" *) real DITHDVTH; + `endif + + (* desc= "ITH" *) real ITH; + (* desc= "DITHDVG" *) real DITHDVG; + (* desc= "DITHDVS" *) real DITHDVS; + (* desc= "DITHDVD" *) real DITHDVD; + `endif `endif // Variables Inside the Model @@ -903,23 +903,23 @@ real Vdseff, qis, qid, qbs, Dmobs; // Midpoint Potential and Charge real qia, qia2, qba, dqi; real qb0; -real eta_mu, eta_mu_cv, Eeffm, Eeffm_cv, Dmob, Dmob_cv, u0, ueff, u0_a, u0r; +real eta_mu, eta_mu_cv, Eeffm, Eeffm_cv, Dmob, Dmob_cv, u0, ueff, u0_a, u0r; real UA_t, UAR_t, UC_t, UCR_t, UCS_t, UD_t, UDR_t, U0_t, U0R_t, ETAMOB_t, Eeffs, EeffFactor; -real Dr, WeffWRFactor; -real RSourceGeo, RDrainGeo; -real RDSWMIN_i, RDWMIN_i, RSWMIN_i; -real Rdrain, Rsource; +real Dr, WeffWRFactor; +real RSourceGeo, RDrainGeo; +real RDSWMIN_i, RDWMIN_i, RSWMIN_i; +real Rdrain, Rsource; real rdstemp, Rdsi, Rdss; real RSDR_t, RSDRR_t, RDDR_t, RDDRR_t; -real DIBLfactor, PVAGfactor, diffVds, VaDIBL, Vgst2Vtm, Moc, Mclm; +real DIBLfactor, PVAGfactor, diffVds, VaDIBL, Vgst2Vtm, Moc, Mclm; real MclmCV, inv_MclmCV; -real Dvsat, Vdsat, inv_MEXP, DvsatCV, Nsat; -real VSAT_t, VSAT1_t, VSAT1R_t, VSATCV_t, MEXP_t, MEXPR_t, Esat, EsatL, Esat1, Esat1L, EsatCV, EsatCVL; -real WVCox, Ta, Tb, Tc; +real Dvsat, Vdsat, inv_MEXP, DvsatCV, Nsat; +real VSAT_t, VSAT1_t, VSAT1R_t, VSATCV_t, MEXP_t, MEXPR_t, Esat, EsatL, Esat1, Esat1L, EsatCV, EsatCVL; +real WVCox, Ta, Tb, Tc; // Asymmetry Model real VSAT1_a, MEXP_a, PTWG_a, RSDR_a, RDDR_a, PDIBL1_a, VSAT_a; @@ -935,7 +935,7 @@ real Hg, Wg, Trsd, Hrsd, Cgg_top, Cgg_side, Cfr_geo, Acorner, Ccorner; // Gate Electrode Resistance `ifdef __RGATEMOD__ - real ggeltd, Rgeltd; + real ggeltd, Rgeltd; `endif // Gate Current @@ -971,14 +971,14 @@ real igentemp, idsgen, LINTIGEN_i; // NQS Gate Resistance `ifdef __NQSMOD1__ - real gcrg, XRCRG1_i, XRCRG2_i; - real IdovVds; + real gcrg, XRCRG1_i, XRCRG2_i; + real IdovVds; `endif // NQS Charge Deficit Model `ifdef __NQSMOD2__ - real xdpart, gtau, gcrg, XRCRG1_i, XRCRG2_i; - real IdovVds; + real xdpart, gtau, gcrg, XRCRG1_i, XRCRG2_i; + real IdovVds; `endif // Flicker Noise @@ -993,14 +993,14 @@ real gspr, gdpr; // Variables Controlled by Correlated Thermal Noise Switch `ifdef __TNOIMOD1__ - real Abulk, etaa, gamma, delta, epsilon, gche; - real npart_beta, npart_theta, ctnoi, npart_c; - real noiGd0, GammaGd0, C0, sf; + real Abulk, etaa, gamma, delta, epsilon, gche; + real npart_beta, npart_theta, ctnoi, npart_c; + real noiGd0, GammaGd0, C0, sf; `endif // Self Heating `ifdef __SHMOD__ - real gth, cth; + real gth, cth; `endif // Binning @@ -1030,7 +1030,7 @@ real MEXP_i, MEXPR_i; real PCLM_i, PCLMG_i, PCLMCV_i, PCLM_a, PCLMR_i; real A1_i, A2_i, A11_i, A21_i; real K1RSCE_i, LPE0_i, DVTSHIFT_i, DVTSHIFT_a, DVTSHIFTR_i ; -real UA_i, UC_i, EU_i, UD_i, UCS_i, UAR_i, EUR_i, UCR_i, UDR_i, UA_a, UD_a, UC_a, EU_a; +real UA_i, UC_i, EU_i, UD_i, UCS_i, UAR_i, EUR_i, UCR_i, UDR_i, UA_a, UD_a, UC_a, EU_a; real UA1_i, UA1R_i, UC1_i, UD1_i, UCSTE_i, UTE_i, UTL_i, EMOBT_i, UC1R_i, UD1R_i, UTER_i, UTLR_i; real PTWGT_i; real AT_i, ATCV_i, ATR_i; @@ -1054,290 +1054,290 @@ real LSP_i; // analog block begins //=================================================== analog begin - - // ************************************************ - // * Geometry dependent calculations * - // ************************************************ - begin : CMGBiasIndepCalc - - // Variable Initialization to Prevent Hidden States - qid = 0.0; - qis = 0.0; - qba = 0.0; - T11 = 0.0; - T12 = 0.0; - ids = 0.0; - sigvds = 0.0; - Iii = 0.0; - qd = 0.0; - qg = 0.0; - qs = 0.0; - qb = 0.0; - Weff0 = 0.0; - WeffCV0 = 0.0; - CJS_t = 0.0; - CJSWS_t = 0.0; - CJSWGS_t = 0.0; - CJD_t = 0.0; - CJSWD_t = 0.0; - CJSWGD_t = 0.0; - PBS_t = 0.0; - PBSWS_t = 0.0; - PBSWGS_t = 0.0; - PBD_t = 0.0; - PBSWD_t = 0.0; - PBSWGD_t = 0.0; - JSS_t = 0.0; - JSWS_t = 0.0; - JSWGS_t = 0.0; - JSD_t = 0.0; - JSWD_t = 0.0; - JSWGD_t = 0.0; - JTSS_t = 0.0; - JTSSWS_t = 0.0; - JTSSWGS_t = 0.0; - JTSD_t = 0.0; - JTSSWD_t = 0.0; - JTSSWGD_t = 0.0; - NJTS_t = 0.0; - NJTSSW_t = 0.0; - NJTSSWG_t = 0.0; - NJTSD_t = 0.0; - NJTSSWD_t = 0.0; - NJTSSWGD_t = 0.0; - Ies = 0.0; - Ied = 0.0; - Czbs = 0.0; - Czbssw = 0.0; - Czbsswg = 0.0; - Czbd = 0.0; - Czbdsw = 0.0; - Czbdswg = 0.0; - Qes = 0.0; - Qed = 0.0; - Qeg = 0.0; - Isbs = 0.0; - Isbd = 0.0; - Nvtms = 0.0; - Nvtmd = 0.0; - SslpRev = 0.0; - IVjsmRev = 0.0; - VjsmRev = 0.0; - SslpFwd = 0.0; - IVjsmFwd = 0.0; - VjsmFwd = 0.0; - DslpRev = 0.0; - IVjdmRev = 0.0; - VjdmRev = 0.0; - DslpFwd = 0.0; - IVjdmFwd = 0.0; - VjdmFwd = 0.0; - XExpBVS = 0.0; - XExpBVD = 0.0; - idsgen = 0.0; - q0 = 0.0; - Tcen = 0.0; - MTcen = 0.0; - Rdrain = 0.0; - Rsource = 0.0; - Cfr_geo = 0.0; - igbinv = 0.0; - igbs = 0.0; - igbd = 0.0; - igbacc = 0.0; - igcs = 0.0; - igcd = 0.0; - igidl = 0.0; - igisl = 0.0; - igs = 0.0; - igd = 0.0; - cox_acc = 0.0; - CGSO_i = 0.0; - CGDO_i = 0.0; - qb_acc = 0.0; - qg_acc = 0.0; - qgs_fr = 0.0; - qgd_fr = 0.0; - qds_fr = 0.0; - qgs_parasitic = 0.0; - qgd_parasitic = 0.0; - FNPowerAt1Hz = 0.0; - Gtnoi = 0.0; - gspr = 0.0; - gdpr = 0.0; - Dr = 1.0; - CDSCDR_i = 0.0; - ETA0R_i = 0.0; - VSAT1R_i = 0.0; - VSAT1R_t = 0.0; - MEXPR_i = 0.0; - MEXPR_t = 0.0; - PTWGR_i = 0.0; - PTWGR_t = 0.0; - PDIBL1R_i = 0.0; - PDIBL2R_i = 0.0; - PHIBE_i = 0.0; - K1_i = 0.0; - K11_i = 0.0; - K2SAT_i = 0.0; - K2SAT1_i = 0.0; - KSATIVR_i = 0.0; - K2_i = 0.0; - K21_i = 0.0; - UC_i = 0.0; - UC1_i = 0.0; - UC_t = 0.0; - U0R_i = 0.0; - UPR_i = 0.0; - EUR_i = 0.0; - ATR_i = 0.0; - CITR_i = 0.0; - ETA0R_i = 0.0; - DVTP0_i = 0.0; - DVTP1_i = 0.0; - PDIBL2R_i = 0.0; - PCLMR_i = 0.0; - LeffCV_acc = 0.0; - RDDRR_t = 0.0; - RSDRR_t = 0.0; - Rdsi = 0.0; - T3y = 0.0; - Tcen0 = 0.0; - veseff = 0.0; - U0R_t = 0.0; - UAR_t = 0.0; - UCR_t = 0.0; - UDR_t = 0.0; - VSAT_a = 0.0; - DVTSHIFTR_i = 0.0; - UA1R_i = 0.0; - UAR_i = 0.0; - UC1R_i = 0.0; - UCR_i = 0.0; - UD1R_i = 0.0; - UDR_i = 0.0; - UTER_i = 0.0; - UTLR_i = 0.0; - VSATR_i = 0.0; - VSATR_t = 0.0; - u0r = 0.0; - - // Thermal Noise - sid = 0.0; - - `ifdef __TNOIMOD1__ - ctnoi = 0.0; - sf = 0.0; - C0 = 0.0; - gamma = 0.0; - delta = 0.0; - `endif - - `ifdef __RGATEMOD__ - ggeltd = 0.0; - `endif - - // Unified FinFET Model - qm = 1.0; - Cins = 1.0; - Ach = 1.0; - Weff_UFCM = 1.0; - qdep = -1.0; - rc = 1.0; - vth_fixed_factor_Sub = 1.0; - vth_fixed_factor_SI = 1.0; - qi_acc_for_QM = 0.0; - fieldnormalizationfactor = 0.0; - auxQMfact = 0.0; - QMFACTORCVfinal = 0.0; - psipclamp = 1.0; - sqrtpsip = 1.0; - nq = 1.0; - F0 = 0.0; - e0 = 0.0; - e1 = 0.0; - e2 = 0.0; - Qdep_ov_Cins = 0.0; - - // Constants - if ( TYPE == `ntype ) begin - devsign = 1; - end else begin - devsign = -1; - end - - epssub = EPSRSUB * `EPS0; - epssp = EPSRSP * `EPS0; - cbox = EPSROX * `EPS0 / EOTBOX; - epsratio = EPSRSUB / EPSROX; - - if ($port_connected(t) == 1) begin - `ifdef __SHMOD__ - if (SHMOD == 0) begin - if (SH_WARN == 1) begin - $strobe("The optional 5th terminal is present but not active because SHMOD=0."); - end - end - `else + + // ************************************************ + // * Geometry dependent calculations * + // ************************************************ + begin : CMGBiasIndepCalc + + // Variable Initialization to Prevent Hidden States + qid = 0.0; + qis = 0.0; + qba = 0.0; + T11 = 0.0; + T12 = 0.0; + ids = 0.0; + sigvds = 0.0; + Iii = 0.0; + qd = 0.0; + qg = 0.0; + qs = 0.0; + qb = 0.0; + Weff0 = 0.0; + WeffCV0 = 0.0; + CJS_t = 0.0; + CJSWS_t = 0.0; + CJSWGS_t = 0.0; + CJD_t = 0.0; + CJSWD_t = 0.0; + CJSWGD_t = 0.0; + PBS_t = 0.0; + PBSWS_t = 0.0; + PBSWGS_t = 0.0; + PBD_t = 0.0; + PBSWD_t = 0.0; + PBSWGD_t = 0.0; + JSS_t = 0.0; + JSWS_t = 0.0; + JSWGS_t = 0.0; + JSD_t = 0.0; + JSWD_t = 0.0; + JSWGD_t = 0.0; + JTSS_t = 0.0; + JTSSWS_t = 0.0; + JTSSWGS_t = 0.0; + JTSD_t = 0.0; + JTSSWD_t = 0.0; + JTSSWGD_t = 0.0; + NJTS_t = 0.0; + NJTSSW_t = 0.0; + NJTSSWG_t = 0.0; + NJTSD_t = 0.0; + NJTSSWD_t = 0.0; + NJTSSWGD_t = 0.0; + Ies = 0.0; + Ied = 0.0; + Czbs = 0.0; + Czbssw = 0.0; + Czbsswg = 0.0; + Czbd = 0.0; + Czbdsw = 0.0; + Czbdswg = 0.0; + Qes = 0.0; + Qed = 0.0; + Qeg = 0.0; + Isbs = 0.0; + Isbd = 0.0; + Nvtms = 0.0; + Nvtmd = 0.0; + SslpRev = 0.0; + IVjsmRev = 0.0; + VjsmRev = 0.0; + SslpFwd = 0.0; + IVjsmFwd = 0.0; + VjsmFwd = 0.0; + DslpRev = 0.0; + IVjdmRev = 0.0; + VjdmRev = 0.0; + DslpFwd = 0.0; + IVjdmFwd = 0.0; + VjdmFwd = 0.0; + XExpBVS = 0.0; + XExpBVD = 0.0; + idsgen = 0.0; + q0 = 0.0; + Tcen = 0.0; + MTcen = 0.0; + Rdrain = 0.0; + Rsource = 0.0; + Cfr_geo = 0.0; + igbinv = 0.0; + igbs = 0.0; + igbd = 0.0; + igbacc = 0.0; + igcs = 0.0; + igcd = 0.0; + igidl = 0.0; + igisl = 0.0; + igs = 0.0; + igd = 0.0; + cox_acc = 0.0; + CGSO_i = 0.0; + CGDO_i = 0.0; + qb_acc = 0.0; + qg_acc = 0.0; + qgs_fr = 0.0; + qgd_fr = 0.0; + qds_fr = 0.0; + qgs_parasitic = 0.0; + qgd_parasitic = 0.0; + FNPowerAt1Hz = 0.0; + Gtnoi = 0.0; + gspr = 0.0; + gdpr = 0.0; + Dr = 1.0; + CDSCDR_i = 0.0; + ETA0R_i = 0.0; + VSAT1R_i = 0.0; + VSAT1R_t = 0.0; + MEXPR_i = 0.0; + MEXPR_t = 0.0; + PTWGR_i = 0.0; + PTWGR_t = 0.0; + PDIBL1R_i = 0.0; + PDIBL2R_i = 0.0; + PHIBE_i = 0.0; + K1_i = 0.0; + K11_i = 0.0; + K2SAT_i = 0.0; + K2SAT1_i = 0.0; + KSATIVR_i = 0.0; + K2_i = 0.0; + K21_i = 0.0; + UC_i = 0.0; + UC1_i = 0.0; + UC_t = 0.0; + U0R_i = 0.0; + UPR_i = 0.0; + EUR_i = 0.0; + ATR_i = 0.0; + CITR_i = 0.0; + ETA0R_i = 0.0; + DVTP0_i = 0.0; + DVTP1_i = 0.0; + PDIBL2R_i = 0.0; + PCLMR_i = 0.0; + LeffCV_acc = 0.0; + RDDRR_t = 0.0; + RSDRR_t = 0.0; + Rdsi = 0.0; + T3y = 0.0; + Tcen0 = 0.0; + veseff = 0.0; + U0R_t = 0.0; + UAR_t = 0.0; + UCR_t = 0.0; + UDR_t = 0.0; + VSAT_a = 0.0; + DVTSHIFTR_i = 0.0; + UA1R_i = 0.0; + UAR_i = 0.0; + UC1R_i = 0.0; + UCR_i = 0.0; + UD1R_i = 0.0; + UDR_i = 0.0; + UTER_i = 0.0; + UTLR_i = 0.0; + VSATR_i = 0.0; + VSATR_t = 0.0; + u0r = 0.0; + + // Thermal Noise + sid = 0.0; + + `ifdef __TNOIMOD1__ + ctnoi = 0.0; + sf = 0.0; + C0 = 0.0; + gamma = 0.0; + delta = 0.0; + `endif + + `ifdef __RGATEMOD__ + ggeltd = 0.0; + `endif + + // Unified FinFET Model + qm = 1.0; + Cins = 1.0; + Ach = 1.0; + Weff_UFCM = 1.0; + qdep = -1.0; + rc = 1.0; + vth_fixed_factor_Sub = 1.0; + vth_fixed_factor_SI = 1.0; + qi_acc_for_QM = 0.0; + fieldnormalizationfactor = 0.0; + auxQMfact = 0.0; + QMFACTORCVfinal = 0.0; + psipclamp = 1.0; + sqrtpsip = 1.0; + nq = 1.0; + F0 = 0.0; + e0 = 0.0; + e1 = 0.0; + e2 = 0.0; + Qdep_ov_Cins = 0.0; + + // Constants + if ( TYPE == `ntype ) begin + devsign = 1; + end else begin + devsign = -1; + end + + epssub = EPSRSUB * `EPS0; + epssp = EPSRSP * `EPS0; + cbox = EPSROX * `EPS0 / EOTBOX; + epsratio = EPSRSUB / EPSROX; + + if ($port_connected(t) == 1) begin + `ifdef __SHMOD__ + if (SHMOD == 0) begin + if (SH_WARN == 1) begin + $strobe("The optional 5th terminal is present but not active because SHMOD=0."); + end + end + `else Temp(t) <+ 0.0; if (SH_WARN == 1) begin - $strobe("The optional 5th terminal is present but not active because the model was not compiled with self-heating enabled (__SHMOD__ was not activated)."); + $strobe("The optional 5th terminal is present but not active because the model was not compiled with self-heating enabled (__SHMOD__ was not activated)."); end - `endif - end - - // Constants for Quantum Mechanical Effects - mx = 0.916 * `MEL; - mxprime = 0.190 * `MEL; - md = 0.190 * `MEL; - mdprime = 0.417 * `MEL; - gprime = 4.0; - gfactor = 2.0; - - // Effective Channel Length for I-V / C-V - Lg = L + XL; - deltaL = LINT + LL * pow(Lg, -LLN); - deltaL1 = LINT + LL * pow(Lg+DLBIN, -LLN); - deltaLCV = DLC + LLC * pow(Lg, -LLN); - Leff = Lg - 2.0 * deltaL; - Leff1 = Lg + DLBIN - 2.0 * deltaL1; //Used in the binning equations only - LeffCV = Lg - 2.0 * deltaLCV; - if (BULKMOD != 0) LeffCV_acc = LeffCV - DLCACC; - - // Total Fins - NFINtotal = NFIN * NF; - - // Range Checking on Leff and Leff1 - if (Leff <= 0.0) begin - $strobe("Fatal: Leff = %e is not positive.", Leff); - $finish(0); - end else if (Leff <= 1.0e-9) begin - $strobe("Warning: Leff = %e <= 1.0e-9.", Leff); - end - - if (Leff1 <= 0.0) begin - $strobe("Fatal: Leff1 = %e is not positive.", Leff1); - $finish(0); - end else if (Leff1 <= 1.0e-9) begin - $strobe("Warning: Leff1 = %e <= 1.0e-9.", Leff1); - end - - // Binning - Inv_L = 1.0e-6 / (Leff1); - Inv_NFIN = 1.0 / NFIN; - Inv_LNFIN = 1.0e-6 / (Leff1 * NFIN); - - // Nbody Binning Equation for UFCM Parameters - NBODY_i = NBODY + Inv_L * LNBODY + Inv_NFIN * NNBODY + Inv_LNFIN * PNBODY; - - if (NBODYN1 != 0.0) begin - NBODY_i = NBODY_i * (1.0 + NBODYN1/NFIN * lln(1.0 + NFIN/NBODYN2)); - end - - // Model Parameters for Unified FinFET Compact Model by Juan Duarte 10/2013 - case (GEOMOD) - 0: begin // Double Gate - if (!$param_given(TFIN_TOP) || !$param_given(TFIN_BASE)) begin + `endif + end + + // Constants for Quantum Mechanical Effects + mx = 0.916 * `MEL; + mxprime = 0.190 * `MEL; + md = 0.190 * `MEL; + mdprime = 0.417 * `MEL; + gprime = 4.0; + gfactor = 2.0; + + // Effective Channel Length for I-V / C-V + Lg = L + XL; + deltaL = LINT + LL * pow(Lg, -LLN); + deltaL1 = LINT + LL * pow(Lg+DLBIN, -LLN); + deltaLCV = DLC + LLC * pow(Lg, -LLN); + Leff = Lg - 2.0 * deltaL; + Leff1 = Lg + DLBIN - 2.0 * deltaL1; //Used in the binning equations only + LeffCV = Lg - 2.0 * deltaLCV; + if (BULKMOD != 0) LeffCV_acc = LeffCV - DLCACC; + + // Total Fins + NFINtotal = NFIN * NF; + + // Range Checking on Leff and Leff1 + if (Leff <= 0.0) begin + $strobe("Fatal: Leff = %e is not positive.", Leff); + $finish(0); + end else if (Leff <= 1.0e-9) begin + $strobe("Warning: Leff = %e <= 1.0e-9.", Leff); + end + + if (Leff1 <= 0.0) begin + $strobe("Fatal: Leff1 = %e is not positive.", Leff1); + $finish(0); + end else if (Leff1 <= 1.0e-9) begin + $strobe("Warning: Leff1 = %e <= 1.0e-9.", Leff1); + end + + // Binning + Inv_L = 1.0e-6 / (Leff1); + Inv_NFIN = 1.0 / NFIN; + Inv_LNFIN = 1.0e-6 / (Leff1 * NFIN); + + // Nbody Binning Equation for UFCM Parameters + NBODY_i = NBODY + Inv_L * LNBODY + Inv_NFIN * NNBODY + Inv_LNFIN * PNBODY; + + if (NBODYN1 != 0.0) begin + NBODY_i = NBODY_i * (1.0 + NBODYN1/NFIN * lln(1.0 + NFIN/NBODYN2)); + end + + // Model Parameters for Unified FinFET Compact Model by Juan Duarte 10/2013 + case (GEOMOD) + 0: begin // Double Gate + if (!$param_given(TFIN_TOP) || !$param_given(TFIN_BASE)) begin Weff_UFCM = 2.0 * HFIN; Cins = Weff_UFCM * EPSROX * `EPS0 / EOT; Ach = HFIN * TFIN; @@ -1350,7 +1350,7 @@ analog begin rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach)); Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins; end - end + end 1: begin // Triple Gate if (!$param_given(TFIN_TOP) || !$param_given(TFIN_BASE)) begin Weff_UFCM = 2.0 * HFIN + TFIN; @@ -1364,7 +1364,7 @@ analog begin Ach = HFIN * (TFIN_TOP + TFIN_BASE) / 2.0; rc = (2.0 * Cins /(Weff_UFCM * Weff_UFCM * epssub / Ach)); Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins; - end + end end 2: begin // Quadruple Gate if (!$param_given(TFIN_TOP) || !$param_given(TFIN_BASE)) begin @@ -1379,8 +1379,8 @@ analog begin Ach = HFIN * (TFIN_TOP + TFIN_BASE) / 2.0; rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach)); Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins; - end - end + end + end 3: begin // Cylindrical Gate Weff_UFCM = `M_PI * D; Cins = 2.0 * `M_PI * EPSROX * `EPS0 / ln(1.0 + 2.0 * EOT / D); @@ -1395,1606 +1395,1606 @@ analog begin rc = (2.0 * Cins / (Weff_UFCM * Weff_UFCM * epssub / Ach)); Qdep_ov_Cins = -`q * NBODY_i * Ach / Cins; end - endcase - - // Cox Definition - cox = Cins / Weff_UFCM; - if (BULKMOD != 0) begin - cox_acc = cox * EOT / EOTACC; - end - - // Effective Width Calculation - Weff0 = Weff_UFCM - DELTAW; - WeffCV0 = Weff_UFCM - DELTAWCV; - - // SCE Scaling Length - scl = sqrt((epssub * Ach / Cins) * (1.0 + Ach * Cins / (2.0 * epssub * Weff_UFCM * Weff_UFCM))); - - // Binning Equations (Process Parameters) - PHIG_i = PHIG + Inv_L * LPHIG + Inv_NFIN * NPHIG + Inv_LNFIN * PPHIG; - NGATE_i = NGATE + Inv_L * LNGATE + Inv_NFIN * NNGATE + Inv_LNFIN * PNGATE; - - // Binning Equations (Model Parameters) - CIT_i = CIT + Inv_L * LCIT + Inv_NFIN * NCIT + Inv_LNFIN * PCIT; - CDSC_i = CDSC + Inv_L * LCDSC + Inv_NFIN * NCDSC + Inv_LNFIN * PCDSC; - CDSCD_i = CDSCD + Inv_L * LCDSCD + Inv_NFIN * NCDSCD + Inv_LNFIN * PCDSCD; - DVT0_i = DVT0 + Inv_L * LDVT0 + Inv_NFIN * NDVT0 + Inv_LNFIN * PDVT0; - DVT1_i = DVT1 + Inv_L * LDVT1 + Inv_NFIN * NDVT1 + Inv_LNFIN * PDVT1; - DVT1SS_i = DVT1SS + Inv_L * LDVT1SS + Inv_NFIN * NDVT1SS + Inv_LNFIN * PDVT1SS; - PHIN_i = PHIN + Inv_L * LPHIN + Inv_NFIN * NPHIN + Inv_LNFIN * PPHIN; - ETA0_i = ETA0 + Inv_L * LETA0 + Inv_NFIN * NETA0 + Inv_LNFIN * PETA0; - DSUB_i = DSUB + Inv_L * LDSUB + Inv_NFIN * NDSUB + Inv_LNFIN * PDSUB; - K1RSCE_i = K1RSCE + Inv_L * LK1RSCE + Inv_NFIN * NK1RSCE + Inv_LNFIN * PK1RSCE; - LPE0_i = LPE0 + Inv_L * LLPE0 + Inv_NFIN * NLPE0 + Inv_LNFIN * PLPE0; - DVTSHIFT_i = DVTSHIFT + Inv_L * LDVTSHIFT + Inv_NFIN * NDVTSHIFT + Inv_LNFIN * PDVTSHIFT; - K0_i = K0 + Inv_L * LK0 + Inv_NFIN * NK0 + Inv_LNFIN * PK0; - K01_i = K01 + Inv_L * LK01 + Inv_NFIN * NK01 + Inv_LNFIN * PK01; - K0SI_i = K0SI + Inv_L * LK0SI + Inv_NFIN * NK0SI + Inv_LNFIN * PK0SI; - K0SI1_i = K0SI1 + Inv_L * LK0SI1 + Inv_NFIN * NK0SI1 + Inv_LNFIN * PK0SI1; - K2SI_i = K2SI + Inv_L * LK2SI + Inv_NFIN * NK2SI + Inv_LNFIN * PK2SI; - K2SI1_i = K2SI1 + Inv_L * LK2SI1 + Inv_NFIN * NK2SI1 + Inv_LNFIN * PK2SI1; - K0SISAT_i = K0SISAT + Inv_L * LK0SISAT + Inv_NFIN * NK0SISAT + Inv_LNFIN * PK0SISAT; - K0SISAT1_i = K0SISAT1 + Inv_L * LK0SISAT1 + Inv_NFIN * NK0SISAT1 + Inv_LNFIN * PK0SISAT1; - K2SISAT_i = K2SISAT + Inv_L * LK2SISAT + Inv_NFIN * NK2SISAT + Inv_LNFIN * PK2SISAT; - K2SISAT1_i = K2SISAT1 + Inv_L * LK2SISAT1 + Inv_NFIN * NK2SISAT1 + Inv_LNFIN * PK2SISAT1; - - if (BULKMOD != 0) begin - if (BULKMOD == 2) begin - K2_i = K2 + Inv_L * LK2 + Inv_NFIN * NK2 + Inv_LNFIN * PK2; - K21_i = K21 + Inv_L * LK21 + Inv_NFIN * NK21 + Inv_LNFIN * PK21; - K2SAT_i = K2SAT + Inv_L * LK2SAT + Inv_NFIN * NK2SAT + Inv_LNFIN * PK2SAT; - K2SAT1_i = K2SAT1 + Inv_L * LK2SAT1 + Inv_NFIN * NK2SAT1 + Inv_LNFIN * PK2SAT1; - end - PHIBE_i = PHIBE + Inv_L * LPHIBE + Inv_NFIN * NPHIBE + Inv_LNFIN * PPHIBE; - K1_i = K1 + Inv_L * LK1 + Inv_NFIN * NK1 + Inv_LNFIN * PK1; - K11_i = K11 + Inv_L * LK11 + Inv_NFIN * NK11 + Inv_LNFIN * PK11; - end - QMFACTOR_i = QMFACTOR + Inv_L * LQMFACTOR + Inv_NFIN * NQMFACTOR + Inv_LNFIN * PQMFACTOR; - QMTCENCV_i = QMTCENCV + Inv_L * LQMTCENCV + Inv_NFIN * NQMTCENCV + Inv_LNFIN * PQMTCENCV; - QMTCENCVA_i = QMTCENCVA + Inv_L * LQMTCENCVA + Inv_NFIN * NQMTCENCVA + Inv_LNFIN * PQMTCENCVA; - VSAT_i = VSAT + Inv_L * LVSAT + Inv_NFIN * NVSAT + Inv_LNFIN * PVSAT; - VSAT1_i = VSAT1 + Inv_L * LVSAT1 + Inv_NFIN * NVSAT1 + Inv_LNFIN * PVSAT1; - VSATCV_i = VSATCV + Inv_L * LVSATCV + Inv_NFIN * NVSATCV + Inv_LNFIN * PVSATCV; - DELTAVSAT_i = DELTAVSAT + Inv_L * LDELTAVSAT + Inv_NFIN * NDELTAVSAT + Inv_LNFIN * PDELTAVSAT; - PSAT_i = PSAT + Inv_L * LPSAT + Inv_NFIN * NPSAT + Inv_LNFIN * PPSAT; - DELTAVSATCV_i = DELTAVSATCV + Inv_L * LDELTAVSATCV + Inv_NFIN * NDELTAVSATCV + Inv_LNFIN * PDELTAVSATCV; - PSATCV_i = PSATCV + Inv_L * LPSATCV + Inv_NFIN * NPSATCV + Inv_LNFIN * PPSATCV; - KSATIV_i = KSATIV + Inv_L * LKSATIV + Inv_NFIN * NKSATIV + Inv_LNFIN * PKSATIV; - MEXP_i = MEXP + Inv_L * LMEXP + Inv_NFIN * NMEXP + Inv_LNFIN * PMEXP; - PTWG_i = PTWG + Inv_L * LPTWG + Inv_NFIN * NPTWG + Inv_LNFIN * PPTWG; - U0_i = U0 + Inv_L * LU0 + Inv_NFIN * NU0 + Inv_LNFIN * PU0; - ETAMOB_i = ETAMOB + Inv_L * LETAMOB + Inv_NFIN * NETAMOB + Inv_LNFIN * PETAMOB; - UP_i = UP + Inv_L * LUP + Inv_NFIN * NUP + Inv_LNFIN * PUP; - UA_i = UA + Inv_L * LUA + Inv_NFIN * NUA + Inv_LNFIN * PUA; - if (BULKMOD != 0) begin - UC_i = UC + Inv_L * LUC + Inv_NFIN * NUC + Inv_LNFIN * PUC; - end - EU_i = EU + Inv_L * LEU + Inv_NFIN * NEU + Inv_LNFIN * PEU; - UD_i = UD + Inv_L * LUD + Inv_NFIN * NUD + Inv_LNFIN * PUD; - UCS_i = UCS + Inv_L * LUCS + Inv_NFIN * NUCS + Inv_LNFIN * PUCS; - PCLM_i = PCLM + Inv_L * LPCLM + Inv_NFIN * NPCLM + Inv_LNFIN * PPCLM; - PCLMG_i = PCLMG + Inv_L * LPCLMG + Inv_NFIN * NPCLMG + Inv_LNFIN * PPCLMG; - PCLMCV_i = PCLMCV + Inv_L * LPCLMCV + Inv_NFIN * NPCLMCV + Inv_LNFIN * PPCLMCV; - A1_i = A1 + Inv_L * LA1 + Inv_NFIN * NA1 + Inv_LNFIN * PA1; - A11_i = A11 + Inv_L * LA11 + Inv_NFIN * NA11 + Inv_LNFIN * PA11; - A2_i = A2 + Inv_L * LA2 + Inv_NFIN * NA2 + Inv_LNFIN * PA2; - A21_i = A21 + Inv_L * LA21 + Inv_NFIN * NA21 + Inv_LNFIN * PA21; - RDSW_i = RDSW + Inv_L * LRDSW + Inv_NFIN * NRDSW + Inv_LNFIN * PRDSW; - RSW_i = RSW + Inv_L * LRSW + Inv_NFIN * NRSW + Inv_LNFIN * PRSW; - RDW_i = RDW + Inv_L * LRDW + Inv_NFIN * NRDW + Inv_LNFIN * PRDW; - PRWGD_i = PRWGD + Inv_L * LPRWGD + Inv_NFIN * NPRWGD + Inv_LNFIN * PPRWGD; - PRWGS_i = PRWGS + Inv_L * LPRWGS + Inv_NFIN * NPRWGS + Inv_LNFIN * PPRWGS; - WR_i = WR + Inv_L * LWR + Inv_NFIN * NWR + Inv_LNFIN * PWR; - PDIBL1_i = PDIBL1 + Inv_L * LPDIBL1 + Inv_NFIN * NPDIBL1 + Inv_LNFIN * PPDIBL1; - PDIBL2_i = PDIBL2 + Inv_L * LPDIBL2 + Inv_NFIN * NPDIBL2 + Inv_LNFIN * PPDIBL2; - DROUT_i = DROUT + Inv_L * LDROUT + Inv_NFIN * NDROUT + Inv_LNFIN * PDROUT; - PVAG_i = PVAG + Inv_L * LPVAG + Inv_NFIN * NPVAG + Inv_LNFIN * PPVAG; - AIGBINV_i = AIGBINV + Inv_L * LAIGBINV + Inv_NFIN * NAIGBINV + Inv_LNFIN * PAIGBINV; - AIGBINV1_i = AIGBINV1 + Inv_L * LAIGBINV1 + Inv_NFIN * NAIGBINV1 + Inv_LNFIN * PAIGBINV1; - BIGBINV_i = BIGBINV + Inv_L * LBIGBINV + Inv_NFIN * NBIGBINV + Inv_LNFIN * PBIGBINV; - CIGBINV_i = CIGBINV + Inv_L * LCIGBINV + Inv_NFIN * NCIGBINV + Inv_LNFIN * PCIGBINV; - EIGBINV_i = EIGBINV + Inv_L * LEIGBINV + Inv_NFIN * NEIGBINV + Inv_LNFIN * PEIGBINV; - NIGBINV_i = NIGBINV + Inv_L * LNIGBINV + Inv_NFIN * NNIGBINV + Inv_LNFIN * PNIGBINV; - AIGBACC_i = AIGBACC + Inv_L * LAIGBACC + Inv_NFIN * NAIGBACC + Inv_LNFIN * PAIGBACC; - AIGBACC1_i = AIGBACC1 + Inv_L * LAIGBACC1 + Inv_NFIN * NAIGBACC1 + Inv_LNFIN * PAIGBACC1; - BIGBACC_i = BIGBACC + Inv_L * LBIGBACC + Inv_NFIN * NBIGBACC + Inv_LNFIN * PBIGBACC; - CIGBACC_i = CIGBACC + Inv_L * LCIGBACC + Inv_NFIN * NCIGBACC + Inv_LNFIN * PCIGBACC; - NIGBACC_i = NIGBACC + Inv_L * LNIGBACC + Inv_NFIN * NNIGBACC + Inv_LNFIN * PNIGBACC; - AIGC_i = AIGC + Inv_L * LAIGC + Inv_NFIN * NAIGC + Inv_LNFIN * PAIGC; - AIGC1_i = AIGC1 + Inv_L * LAIGC1 + Inv_NFIN * NAIGC1 + Inv_LNFIN * PAIGC1; - BIGC_i = BIGC + Inv_L * LBIGC + Inv_NFIN * NBIGC + Inv_LNFIN * PBIGC; - CIGC_i = CIGC + Inv_L * LCIGC + Inv_NFIN * NCIGC + Inv_LNFIN * PCIGC; - PIGCD_i = PIGCD + Inv_L * LPIGCD + Inv_NFIN * NPIGCD + Inv_LNFIN * PPIGCD; - AIGS_i = AIGS + Inv_L * LAIGS + Inv_NFIN * NAIGS + Inv_LNFIN * PAIGS; - AIGS1_i = AIGS1 + Inv_L * LAIGS1 + Inv_NFIN * NAIGS1 + Inv_LNFIN * PAIGS1; - BIGS_i = BIGS + Inv_L * LBIGS + Inv_NFIN * NBIGS + Inv_LNFIN * PBIGS; - CIGS_i = CIGS + Inv_L * LCIGS + Inv_NFIN * NCIGS + Inv_LNFIN * PCIGS; - AIGD_i = AIGD + Inv_L * LAIGD + Inv_NFIN * NAIGD + Inv_LNFIN * PAIGD; - AIGD1_i = AIGD1 + Inv_L * LAIGD1 + Inv_NFIN * NAIGD1 + Inv_LNFIN * PAIGD1; - BIGD_i = BIGD + Inv_L * LBIGD + Inv_NFIN * NBIGD + Inv_LNFIN * PBIGD; - CIGD_i = CIGD + Inv_L * LCIGD + Inv_NFIN * NCIGD + Inv_LNFIN * PCIGD; - NTOX_i = NTOX + Inv_L * LNTOX + Inv_NFIN * NNTOX + Inv_LNFIN * PNTOX; - POXEDGE_i = POXEDGE + Inv_L * LPOXEDGE + Inv_NFIN * NPOXEDGE + Inv_LNFIN * PPOXEDGE; - AGIDL_i = AGIDL + Inv_L * LAGIDL + Inv_NFIN * NAGIDL + Inv_LNFIN * PAGIDL; - BGIDL_i = BGIDL + Inv_L * LBGIDL + Inv_NFIN * NBGIDL + Inv_LNFIN * PBGIDL; - CGIDL_i = CGIDL + Inv_L * LCGIDL + Inv_NFIN * NCGIDL + Inv_LNFIN * PCGIDL; - EGIDL_i = EGIDL + Inv_L * LEGIDL + Inv_NFIN * NEGIDL + Inv_LNFIN * PEGIDL; - PGIDL_i = PGIDL + Inv_L * LPGIDL + Inv_NFIN * NPGIDL + Inv_LNFIN * PPGIDL; - AGISL_i = AGISL + Inv_L * LAGISL + Inv_NFIN * NAGISL + Inv_LNFIN * PAGISL; - BGISL_i = BGISL + Inv_L * LBGISL + Inv_NFIN * NBGISL + Inv_LNFIN * PBGISL; - CGISL_i = CGISL + Inv_L * LCGISL + Inv_NFIN * NCGISL + Inv_LNFIN * PCGISL; - EGISL_i = EGISL + Inv_L * LEGISL + Inv_NFIN * NEGISL + Inv_LNFIN * PEGISL; - PGISL_i = PGISL + Inv_L * LPGISL + Inv_NFIN * NPGISL + Inv_LNFIN * PPGISL; - ALPHA0_i = ALPHA0 + Inv_L * LALPHA0 + Inv_NFIN * NALPHA0 + Inv_LNFIN * PALPHA0; - ALPHA1_i = ALPHA1 + Inv_L * LALPHA1 + Inv_NFIN * NALPHA1 + Inv_LNFIN * PALPHA1; - ALPHAII0_i = ALPHAII0 + Inv_L * LALPHAII0 + Inv_NFIN * NALPHAII0 + Inv_LNFIN * PALPHAII0; - ALPHAII1_i = ALPHAII1 + Inv_L * LALPHAII1 + Inv_NFIN * NALPHAII1 + Inv_LNFIN * PALPHAII1; - BETA0_i = BETA0 + Inv_L * LBETA0 + Inv_NFIN * NBETA0 + Inv_LNFIN * PBETA0; - BETAII0_i = BETAII0 + Inv_L * LBETAII0 + Inv_NFIN * NBETAII0 + Inv_LNFIN * PBETAII0; - BETAII1_i = BETAII1 + Inv_L * LBETAII1 + Inv_NFIN * NBETAII1 + Inv_LNFIN * PBETAII1; - BETAII2_i = BETAII2 + Inv_L * LBETAII2 + Inv_NFIN * NBETAII2 + Inv_LNFIN * PBETAII2; - ESATII_i = ESATII + Inv_L * LESATII + Inv_NFIN * NESATII + Inv_LNFIN * PESATII; - LII_i = LII + Inv_L * LLII + Inv_NFIN * NLII + Inv_LNFIN * PLII; - SII0_i = SII0 + Inv_L * LSII0 + Inv_NFIN * NSII0 + Inv_LNFIN * PSII0; - SII1_i = SII1 + Inv_L * LSII1 + Inv_NFIN * NSII1 + Inv_LNFIN * PSII1; - SII2_i = SII2 + Inv_L * LSII2 + Inv_NFIN * NSII2 + Inv_LNFIN * PSII2; - SIID_i = SIID + Inv_L * LSIID + Inv_NFIN * NSIID + Inv_LNFIN * PSIID; - TII_i = TII + Inv_L * LTII + Inv_NFIN * NTII + Inv_LNFIN * PTII; - CFS_i = CFS + Inv_L * LCFS + Inv_NFIN * NCFS + Inv_LNFIN * PCFS; - CFD_i = CFD + Inv_L * LCFD + Inv_NFIN * NCFD + Inv_LNFIN * PCFD; - COVS_i = COVS + Inv_L * LCOVS + Inv_NFIN * NCOVS + Inv_LNFIN * PCOVS; - COVD_i = COVD + Inv_L * LCOVD + Inv_NFIN * NCOVD + Inv_LNFIN * PCOVD; - CGSL_i = CGSL + Inv_L * LCGSL + Inv_NFIN * NCGSL + Inv_LNFIN * PCGSL; - CGDL_i = CGDL + Inv_L * LCGDL + Inv_NFIN * NCGDL + Inv_LNFIN * PCGDL; - CGBL_i = CGBL + Inv_L * LCGBL + Inv_NFIN * NCGBL + Inv_LNFIN * PCGBL; - CKAPPAS_i = CKAPPAS + Inv_L * LCKAPPAS + Inv_NFIN * NCKAPPAS + Inv_LNFIN * PCKAPPAS; - CKAPPAD_i = CKAPPAD + Inv_L * LCKAPPAD + Inv_NFIN * NCKAPPAD + Inv_LNFIN * PCKAPPAD; - CKAPPAB_i = CKAPPAB + Inv_L * LCKAPPAB + Inv_NFIN * NCKAPPAB + Inv_LNFIN * PCKAPPAB; - NTGEN_i = NTGEN + Inv_L * LNTGEN + Inv_NFIN * NNTGEN + Inv_LNFIN * PNTGEN; - AIGEN_i = AIGEN + Inv_L * LAIGEN + Inv_NFIN * NAIGEN + Inv_LNFIN * PAIGEN; - BIGEN_i = BIGEN + Inv_L * LBIGEN + Inv_NFIN * NBIGEN + Inv_LNFIN * PBIGEN; - - if (ASYMMOD != 0) begin - CDSCDR_i = CDSCDR + Inv_L * LCDSCDR + Inv_NFIN * NCDSCDR + Inv_LNFIN * PCDSCDR; - CITR_i = CITR + Inv_L * LCITR + Inv_NFIN * NCITR + Inv_LNFIN * PCITR; - ETA0R_i = ETA0R + Inv_L * LETA0R + Inv_NFIN * NETA0R + Inv_LNFIN * PETA0R; - VSAT1R_i = VSAT1R + Inv_L * LVSAT1R + Inv_NFIN * NVSAT1R + Inv_LNFIN * PVSAT1R; - MEXPR_i = MEXPR + Inv_L * LMEXPR + Inv_NFIN * NMEXPR + Inv_LNFIN * PMEXPR; - PTWGR_i = PTWGR + Inv_L * LPTWGR + Inv_NFIN * NPTWGR + Inv_LNFIN * PPTWGR; - PDIBL1R_i = PDIBL1R + Inv_L * LPDIBL1R + Inv_NFIN * NPDIBL1R + Inv_LNFIN * PPDIBL1R; - PDIBL2R_i = PDIBL2R + Inv_L * LPDIBL2R + Inv_NFIN * NPDIBL2R + Inv_LNFIN * PPDIBL2R; - PCLMR_i = PCLMR + Inv_L * LPCLMR + Inv_NFIN * NPCLMR + Inv_LNFIN * PPCLMR; - DVTSHIFTR_i = DVTSHIFTR + Inv_L * LDVTSHIFTR + Inv_NFIN * NDVTSHIFTR + Inv_LNFIN * PDVTSHIFTR; - VSATR_i = VSATR + Inv_L * LVSATR + Inv_NFIN * NVSATR + Inv_LNFIN * PVSATR; - KSATIVR_i = KSATIVR + Inv_L * LKSATIVR + Inv_NFIN * NKSATIVR + Inv_LNFIN * PKSATIVR; - U0R_i = U0R + Inv_L * LU0R + Inv_NFIN * NU0R + Inv_LNFIN * PU0R; - UAR_i = UAR + Inv_L * LUAR + Inv_NFIN * NUAR + Inv_LNFIN * PUAR; - UPR_i = UPR + Inv_L * LUPR + Inv_NFIN * NUPR + Inv_LNFIN * PUPR; - if (BULKMOD != 0) begin - UCR_i = UCR + Inv_L * LUCR + Inv_NFIN * NUCR + Inv_LNFIN * PUCR; - end - EUR_i = EUR + Inv_L * LEUR + Inv_NFIN * NEUR + Inv_LNFIN * PEUR; - UDR_i = UDR + Inv_L * LUDR + Inv_NFIN * NUDR + Inv_LNFIN * PUDR; - end - - `ifdef __NQSMOD1__ - if (NQSMOD == 1 && XRCRG1 != 0.0) begin - XRCRG1_i = XRCRG1 + Inv_L * LXRCRG1 + Inv_NFIN * NXRCRG1 + Inv_LNFIN * PXRCRG1; - XRCRG2_i = XRCRG2 + Inv_L * LXRCRG2 + Inv_NFIN * NXRCRG2 + Inv_LNFIN * PXRCRG2; - end else begin - XRCRG1_i = 0.0; - XRCRG2_i = 0.0; - end - `else - if (NQSMOD == 1) begin - $strobe(" Although the model selector NQSMOD is set to 1, the NQS gate resistance model is not activated in the Verilog-A code. Please uncomment \"`define __NQSMOD1__\" in bsimcmg.va to activate it."); - end - `endif - - `ifdef __NQSMOD2__ - if (NQSMOD == 2 && XRCRG1 != 0.0) begin - XRCRG1_i = XRCRG1 + Inv_L * LXRCRG1 + Inv_NFIN * NXRCRG1 + Inv_LNFIN * PXRCRG1; - XRCRG2_i = XRCRG2 + Inv_L * LXRCRG2 + Inv_NFIN * NXRCRG2 + Inv_LNFIN * PXRCRG2; - end else begin - XRCRG1_i = 0.0; - XRCRG2_i = 0.0; - end - `else - if (NQSMOD == 2) begin - $strobe(" Although the model selector NQSMOD is set to 2, the NQS gate resistance model is not activated in the Verilog-A code. Please uncomment \"`define __NQSMOD2__\" in bsimcmg.va to activate it."); - end - `endif - - UTE_i = UTE + Inv_L * LUTE + Inv_NFIN * NUTE + Inv_LNFIN * PUTE; - UTL_i = UTL + Inv_L * LUTL + Inv_NFIN * NUTL + Inv_LNFIN * PUTL; - EMOBT_i = EMOBT + Inv_L * LEMOBT + Inv_NFIN * NEMOBT + Inv_LNFIN * PEMOBT; - UA1_i = UA1 + Inv_L * LUA1 + Inv_NFIN * NUA1 + Inv_LNFIN * PUA1; - - if (BULKMOD != 0) begin - UC1_i = UC1 + Inv_L * LUC1 + Inv_NFIN * NUC1 + Inv_LNFIN * PUC1; - end - UD1_i = UD1 + Inv_L * LUD1 + Inv_NFIN * NUD1 + Inv_LNFIN * PUD1; - UCSTE_i = UCSTE + Inv_L * LUCSTE + Inv_NFIN * NUCSTE + Inv_LNFIN * PUCSTE; - PTWGT_i = PTWGT + Inv_L * LPTWGT + Inv_NFIN * NPTWGT + Inv_LNFIN * PPTWGT; - AT_i = AT + Inv_L * LAT + Inv_NFIN * NAT + Inv_LNFIN * PAT; - ATCV_i = ATCV + Inv_L * LATCV + Inv_NFIN * NATCV + Inv_LNFIN * PATCV; - PRT_i = PRT + Inv_L * LPRT + Inv_NFIN * NPRT + Inv_LNFIN * PPRT; - KT1_i = KT1 + Inv_L * LKT1 + Inv_NFIN * NKT1 + Inv_LNFIN * PKT1; - TSS_i = TSS + Inv_L * LTSS + Inv_NFIN * NTSS + Inv_LNFIN * PTSS; - IIT_i = IIT + Inv_L * LIIT + Inv_NFIN * NIIT + Inv_LNFIN * PIIT; - TGIDL_i = TGIDL + Inv_L * LTGIDL + Inv_NFIN * NTGIDL + Inv_LNFIN * PTGIDL; - IGT_i = IGT + Inv_L * LIGT + Inv_NFIN * NIGT + Inv_LNFIN * PIGT; - - if (ASYMMOD != 0) begin - UTER_i = UTER + Inv_L * LUTER + Inv_NFIN * NUTER + Inv_LNFIN * PUTER; - UTLR_i = UTLR + Inv_L * LUTLR + Inv_NFIN * NUTLR + Inv_LNFIN * PUTLR; - UA1R_i = UA1R + Inv_L * LUA1R + Inv_NFIN * NUA1R + Inv_LNFIN * PUA1R; - UD1R_i = UD1R + Inv_L * LUD1R + Inv_NFIN * NUD1R + Inv_LNFIN * PUD1R; - ATR_i = ATR + Inv_L * LATR + Inv_NFIN * NATR + Inv_LNFIN * PATR; - if (BULKMOD != 0) begin - UC1R_i = UC1R + Inv_L * LUC1R + Inv_NFIN * NUC1R + Inv_LNFIN * PUC1R; - end - end - - // Geometrical Scaling - // NFIN Scaling - if (PHIGN1 != 0.0) begin - PHIG_i = PHIG_i * (1.0 + PHIGN1 / NFIN * lln(1.0 + NFIN / PHIGN2)); - end - - if (ETA0N1 != 0.0) begin - ETA0_i = ETA0_i * (1.0 + ETA0N1 / NFIN * lln(1.0 + NFIN / ETA0N2)); - end - - if (CDSCN1 != 0.0) begin - CDSC_i = CDSC_i * (1.0 + CDSCN1 / NFIN * lln(1.0 + NFIN / CDSCN2)); - end - - if (CDSCDN1 != 0.0) begin - CDSCD_i = CDSCD_i * (1.0 + CDSCDN1 / NFIN * lln(1.0 + NFIN / CDSCDN2)); - end - - if (CDSCDRN1 != 0.0) begin - CDSCDR_i = CDSCDR_i * (1.0 + CDSCDRN1 / NFIN * lln(1.0 + NFIN / CDSCDRN2)); - end - - if (VSATN1 != 0.0) begin - VSAT_i = VSAT_i * (1.0 + VSATN1 / NFIN * lln(1.0 + NFIN / VSATN2)); - end - - if (VSAT1N1 != 0.0) begin - VSAT1_i = VSAT1_i * (1.0 + VSAT1N1 / NFIN * lln(1.0 + NFIN / VSAT1N2)); - end - - if (VSAT1RN1 != 0.0) begin - VSAT1R_i = VSAT1R_i * (1.0 + VSAT1RN1 / NFIN * lln(1.0 + NFIN / VSAT1RN2)); - end - - if (U0N1 != 0.0) begin - U0_i = U0_i * (1.0 + U0N1 / NFIN * lln(1.0 + NFIN / U0N2)); - end - - if ($param_given(NFINNOM)) begin - PHIG_i = PHIG_i * (1.0 + (NFIN - NFINNOM) * PHIGLT * Leff) ; - ETA0_i = ETA0_i * (1.0 + (NFIN - NFINNOM) * ETA0LT * Leff); - U0_i = U0_i * (1.0 + (NFIN - NFINNOM) * U0LT * Leff); - end - - if (U0N1R != 0.0) begin - U0R_i = U0R_i * (1.0 + U0N1R / NFIN * lln(1.0 + NFIN / U0N2R)); - end - - // Length Scaling - PHIG_i = PHIG_i + PHIGL * Leff; - if (LPA > 0.0) begin - U0_i = U0_i * (1.0 - UP_i * pow(Leff, -LPA)); - end else begin - U0_i = U0_i * (1.0 - UP_i); - end - UA_i = UA_i + AUA * lexp(-Leff / BUA); - UD_i = UD_i + AUD * lexp(-Leff / BUD); - EU_i = EU_i + AEU * lexp(-Leff / BEU); - - if (ASYMMOD != 0) begin - if (LPAR > 0.0) begin - U0R_i = U0R_i * (1.0 - UPR_i * pow(Leff, -LPAR)); - end else begin - U0R_i = U0R_i * (1.0 - UPR_i); - end - UAR_i = UAR_i + AUAR * lexp(-Leff / BUAR); - UDR_i = UDR_i + AUDR * lexp(-Leff / BUDR); - EUR_i = EUR_i + AEUR * lexp(-Leff / BEUR); - end - - if (RDSMOD == 1) begin - RSW_i = RSW_i + ARSW * lexp(-Leff / BRSW); - RDW_i = RDW_i + ARDW * lexp(-Leff / BRDW); - end else begin - RDSW_i = RDSW_i + ARDSW * lexp(-Leff / BRDSW); - end - - PCLM_i = PCLM_i + APCLM * lexp(-Leff / BPCLM); - if (ASYMMOD != 0) begin - PCLMR_i = PCLMR_i + APCLMR * pow(Leff, -BPCLMR); - end - - MEXP_i = MEXP_i + AMEXP * pow(Leff, -BMEXP); - if (ASYMMOD != 0) begin - MEXPR_i = MEXPR_i + AMEXPR * pow(Leff, -BMEXPR); - end - - PTWG_i = PTWG_i + APTWG * lexp(-Leff / BPTWG); - if (ASYMMOD != 0) begin - PTWGR_i = PTWGR_i + APTWG * lexp(-Leff / BPTWG); - end - - VSAT_i = VSAT_i + AVSAT * lexp(-Leff / BVSAT); - VSAT1_i = VSAT1_i + AVSAT1 * lexp(-Leff / BVSAT1); - if (ASYMMOD != 0) begin - VSAT1R_i = VSAT1R_i + AVSAT1 * lexp(-Leff / BVSAT1); - end - - PSAT_i = PSAT_i + APSAT * lexp(-Leff / BPSAT); - PSATCV_i = PSATCV_i + APSATCV * lexp(-Leff / BPSATCV); - VSATCV_i = VSATCV_i + AVSATCV * lexp(-LeffCV / BVSATCV); - - // Scaling for DITS Parameters - DVTP0_i = DVTP0 + ADVTP0 * lexp(-Leff / BDVTP0); - DVTP1_i = DVTP1 + ADVTP1 * lexp(-Leff / BDVTP1); - - // Geometrical Scaling for Toxeff / Charge Centroid Tcen - if (QMTCENCV_i > 0.0 || QMTCENCVA_i > 0.0) begin - MTcen = 1.0 + AQMTCEN * lexp(- (2.0 * Ach / Weff_UFCM) / BQMTCEN); - Tcen0 = (2.0 * Ach / Weff_UFCM ) * MTcen; - end - - // ************************************** - // * Parameter Checking * - // ************************************** - - if (LeffCV <= 1.0e-9) begin - $strobe("Warning: LeffCV = %e <= 1.0e-9.", LeffCV); - end - - if (BULKMOD != 0) begin - if (LeffCV_acc <= 1.0e-9) begin - $strobe("Warning: LeffCV_acc = %e <= 1.0e-9.", LeffCV_acc); - end - end - - if (Weff0 <= 1.0e-9) begin - $strobe("Warning: Weff0 = %e <= 1.0e-9.", Weff0); - end - - if (WeffCV0 <= 1.0e-9) begin - $strobe("Warning: WeffCV0 = %e <= 1.0e-9.", WeffCV0); - end - - if (NBODY_i <= 0.0) begin - $strobe("Fatal: NBODY_i = %e is not positive.", NBODY_i); - $finish(0); - end else if (NBODY_i <= 1.0e18) begin - $strobe("Warning: NBODY_i = %e m^-3 may be too small.", NBODY_i); - end - - if (NGATE_i < 0.0) begin - $strobe("Fatal: NGATE_i = %e is negative.", NGATE_i); - $finish(0); - end else if (NGATE_i != 0.0 && NGATE_i <= 1.0e24) begin - $strobe("Warning: NGATE_i = %e may be too small.", NGATE_i); - end else if (NGATE_i > 1.0e31) begin - $strobe("Fatal: NGATE_i = %e is too high.", NGATE_i); - $finish(0); - end - - if (DVT0_i < 0.0) begin - $strobe("Warning: DVT0_i = %e is negative.", DVT0_i); - end - - if (PHIG_i <= 0.0) begin - $strobe("Fatal: PHIG_i = %e is not positive.", PHIG_i); - $finish(0); - end - - if (VSAT_i <= 0.0) begin - $strobe("Fatal: VSAT_i = %e is not positive.", VSAT_i); - $finish(0); - end - - if (VSAT1_i <= 0.0) begin - $strobe("Fatal: VSAT1_i = %e is not positive.", VSAT1_i); - $finish(0); - end - - if (ASYMMOD != 0 && VSAT1R_i <= 0.0) begin - $strobe("Fatal: VSAT1R_i = %e is not positive.", VSAT1R_i); - $finish(0); - end - - if (DVT1_i <= 0.0) begin - $strobe("Fatal: DVT1_i = %e is not positive.", DVT1_i); - $finish(0); - end - - if (DVT1SS_i <= 0.0) begin - $strobe("Fatal: DVT1SS_i = %e is not positive.", DVT1SS_i); - $finish(0); - end - - if (CDSC_i < 0.0) begin - $strobe("Warning: CDSC_i = %e is negative.", CDSC_i); - end - - if (CDSCD_i < 0.0) begin - $strobe("Warning: CDSCD_i = %e is negative.", CDSCD_i); - end - - if (ASYMMOD != 0 && CDSCDR_i < 0.0) begin - $strobe("Warning: CDSCDR_i = %e is negative.", CDSCDR_i); - end - - if (DSUB_i <= 0.0) begin - $strobe("Fatal: DSUB_i = %e is not positive.", DSUB_i); - $finish(0); - end - - if (ETA0_i < 0.0) begin - $strobe("Warning: ETA0_i = %e is negative, setting it to 0", ETA0_i); - ETA0_i = 0.0; - end - - if (ETA0R_i < 0.0) begin - $strobe("Warning: ETA0R_i = %e is negative, setting it to 0", ETA0R_i); - ETA0R_i = 0.0; - end - - if (LPE0_i < -Leff) begin - $strobe("Warning: LPE0_i = %e is less than -Leff. Clipping LPE0_i to 0", LPE0_i); - LPE0_i = 0.0; - end - - if (K0SI_i <= 0.0) begin - $strobe("Warning: K0SI_i = %e is not positive, setting it to 0.", K0SI_i); - K0SI_i = 0.0; - end - - if (K2SI_i <= 0.0) begin - $strobe("Warning: K2SI_i = %e is not positive, setting it to 0.", K2SI_i); - K2SI_i = 0.0; - end - - if (PHIBE_i < 0.2 && BULKMOD != 0) begin - $strobe("Warning: PHIBE_i = %e is less than 0.2, setting it to 0.2.", PHIBE_i); - PHIBE_i = 0.2; - end - - if (PHIBE_i > 1.2 && BULKMOD != 0) begin - $strobe("Warning: PHIBE_i = %e is larger than 1.2, setting it to 1.2.", PHIBE_i); - PHIBE_i = 1.2; - end - - if (PSAT_i < 2.0) begin - $strobe("Warning: PSAT_i = %e is less than 2.0, setting it to 2.0.", PSAT_i); - PSAT_i = 2.0; - end - - if (PSATCV_i < 2.0) begin - $strobe("Warning: PSATCV_i = %e is less than 2.0, setting it to 2.0.", PSATCV_i); - PSATCV_i = 2.0; - end - - if (U0_i < 0.0) begin - $strobe("Warning: U0_i = %e is negative, setting it to the default value.", U0_i); - U0_i = 0.03; - end - - if (UA_i < 0.0) begin - $strobe("Warning: UA_i = %e is negative, setting it to 0.", UA_i); - UA_i = 0.0; - end - - if (EU_i < 0.0) begin - $strobe("Warning: EU_i = %e is negative, setting it to 0.", EU_i); - EU_i = 0.0; - end - - if (UD_i < 0.0) begin - $strobe("Warning: UD_i = %e is negative, setting it to 0.", UD_i); - UD_i = 0.0; - end - - if (UCS_i < 0.0) begin - $strobe("Warning: UCS_i = %e is negative, setting it to 0.", UCS_i); - UCS_i = 0.0; - end - - if (ETAMOB_i < 0.0) begin - $strobe("Warning: ETAMOB_i = %e is negative, setting it to 0", ETAMOB_i); - ETAMOB_i = 0.0; - end - - RDSWMIN_i = RDSWMIN; - if (RDSWMIN_i < 0.0) begin - $strobe("Warning: RDSWMIN = %e is negative. Set to zero", RDSWMIN_i); - RDSWMIN_i = 0.0; - end - - if (RDSW_i < 0.0) begin - $strobe("Warning: RDSW_i = %e is negative. Set to zero", RDSW_i); - RDSW_i = 0.0; - end - - RSWMIN_i = RSWMIN; - if (RSWMIN_i < 0.0) begin - $strobe("Warning: RSWMIN = %e is negative. Set to zero", RSWMIN_i); - RSWMIN_i = 0.0; - end - - if (RSW_i < 0.0) begin - $strobe("Warning: RSW_i = %e is negative. Set to zero", RSW_i); - RSW_i = 0.0; - end - - RDWMIN_i = RDWMIN; - if (RDWMIN_i < 0.0) begin - $strobe("Warning: RDWMIN = %e is negative. Set to zero", RDWMIN_i); - RDWMIN_i = 0.0; - end - - if (RDW_i < 0) begin - $strobe("Warning: RDW_i = %e is negative. Set to zero", RDW_i); - RDW_i = 0.0; - end - - if (PRWGD_i < 0.0) begin - $strobe("Warning: PRWGD_i = %e is negative. Set to zero", PRWGD_i); - PRWGD_i = 0.0; - end - - if (PRWGS_i < 0.0) begin - $strobe("Warning: PRWGS_i = %e is negative. Set to zero", PRWGS_i); - PRWGS_i = 0.0; - end - - if (PCLM_i < 0) begin - $strobe("Warning: PCLM_i = %e is negative.", PCLM_i); - end - - if (PDIBL1_i < 0.0) begin - $strobe("Warning: PDIBL1_i = %e is negative.", PDIBL1_i); - end - - if (ASYMMOD != 0) begin - if (PDIBL1R_i < 0.0) begin - $strobe("Warning: PDIBL1R_i = %e is negative.", PDIBL1R_i); - end - if (PDIBL2R_i < 0.0) begin - $strobe("Warning: PDIBL2R_i = %e is negative.", PDIBL2R_i); - end - if (U0R_i < 0) begin - $strobe("Warning: U0R_i = %e is negative, setting it to 0.", U0R_i); - U0R_i = 0.0; - end - if (UAR_i < 0.0) begin - $strobe("Warning: UAR_i = %e is negative, setting it to 0.", UAR_i); - UAR_i = 0.0; - end - if (EUR_i < 0.0) begin - $strobe("Warning: EUR_i = %e is negative, setting it to 0.", EUR_i); - EUR_i = 0.0; - end - if (UDR_i < 0.0) begin - $strobe("Warning: UDR_i = %e is negative, setting it to 0.", UDR_i); - UDR_i = 0.0; - end - end - - if (PDIBL2_i < 0.0) begin - $strobe("Warning: PDIBL2_i = %e is negative.", PDIBL2_i); - end - - if (DROUT_i <= 0.0) begin - $strobe("Fatal: DROUT_i = %e is non-positive.", DROUT_i); - $finish(0); - end - - if (MEXP_i < 2.0) begin - $strobe("Warning: MEXP_i = %e < 2. Setting MEXP_i = 2.", MEXP_i); - MEXP_i = 2.0; - end - - if (ASYMMOD != 0) begin - if (MEXPR_i < 2.0) begin - $strobe("Warning: MEXPR_i = %e < 2. Setting MEXPR_i = 2.", MEXPR_i); - MEXPR_i = 2.0; - end - end - - if (PTWG_i < 0) begin - $strobe("Warning: PTWG_i = %e is negative, setting it to 0.", PTWG_i ); - PTWG_i = 0.0; - end - - if (QMTCENCV_i > 0.0) begin - if (QM0 <= 0.0) begin - $strobe("Fatal: QM0 = %e is non-positive.", QM0); + endcase + + // Cox Definition + cox = Cins / Weff_UFCM; + if (BULKMOD != 0) begin + cox_acc = cox * EOT / EOTACC; + end + + // Effective Width Calculation + Weff0 = Weff_UFCM - DELTAW; + WeffCV0 = Weff_UFCM - DELTAWCV; + + // SCE Scaling Length + scl = sqrt((epssub * Ach / Cins) * (1.0 + Ach * Cins / (2.0 * epssub * Weff_UFCM * Weff_UFCM))); + + // Binning Equations (Process Parameters) + PHIG_i = PHIG + Inv_L * LPHIG + Inv_NFIN * NPHIG + Inv_LNFIN * PPHIG; + NGATE_i = NGATE + Inv_L * LNGATE + Inv_NFIN * NNGATE + Inv_LNFIN * PNGATE; + + // Binning Equations (Model Parameters) + CIT_i = CIT + Inv_L * LCIT + Inv_NFIN * NCIT + Inv_LNFIN * PCIT; + CDSC_i = CDSC + Inv_L * LCDSC + Inv_NFIN * NCDSC + Inv_LNFIN * PCDSC; + CDSCD_i = CDSCD + Inv_L * LCDSCD + Inv_NFIN * NCDSCD + Inv_LNFIN * PCDSCD; + DVT0_i = DVT0 + Inv_L * LDVT0 + Inv_NFIN * NDVT0 + Inv_LNFIN * PDVT0; + DVT1_i = DVT1 + Inv_L * LDVT1 + Inv_NFIN * NDVT1 + Inv_LNFIN * PDVT1; + DVT1SS_i = DVT1SS + Inv_L * LDVT1SS + Inv_NFIN * NDVT1SS + Inv_LNFIN * PDVT1SS; + PHIN_i = PHIN + Inv_L * LPHIN + Inv_NFIN * NPHIN + Inv_LNFIN * PPHIN; + ETA0_i = ETA0 + Inv_L * LETA0 + Inv_NFIN * NETA0 + Inv_LNFIN * PETA0; + DSUB_i = DSUB + Inv_L * LDSUB + Inv_NFIN * NDSUB + Inv_LNFIN * PDSUB; + K1RSCE_i = K1RSCE + Inv_L * LK1RSCE + Inv_NFIN * NK1RSCE + Inv_LNFIN * PK1RSCE; + LPE0_i = LPE0 + Inv_L * LLPE0 + Inv_NFIN * NLPE0 + Inv_LNFIN * PLPE0; + DVTSHIFT_i = DVTSHIFT + Inv_L * LDVTSHIFT + Inv_NFIN * NDVTSHIFT + Inv_LNFIN * PDVTSHIFT; + K0_i = K0 + Inv_L * LK0 + Inv_NFIN * NK0 + Inv_LNFIN * PK0; + K01_i = K01 + Inv_L * LK01 + Inv_NFIN * NK01 + Inv_LNFIN * PK01; + K0SI_i = K0SI + Inv_L * LK0SI + Inv_NFIN * NK0SI + Inv_LNFIN * PK0SI; + K0SI1_i = K0SI1 + Inv_L * LK0SI1 + Inv_NFIN * NK0SI1 + Inv_LNFIN * PK0SI1; + K2SI_i = K2SI + Inv_L * LK2SI + Inv_NFIN * NK2SI + Inv_LNFIN * PK2SI; + K2SI1_i = K2SI1 + Inv_L * LK2SI1 + Inv_NFIN * NK2SI1 + Inv_LNFIN * PK2SI1; + K0SISAT_i = K0SISAT + Inv_L * LK0SISAT + Inv_NFIN * NK0SISAT + Inv_LNFIN * PK0SISAT; + K0SISAT1_i = K0SISAT1 + Inv_L * LK0SISAT1 + Inv_NFIN * NK0SISAT1 + Inv_LNFIN * PK0SISAT1; + K2SISAT_i = K2SISAT + Inv_L * LK2SISAT + Inv_NFIN * NK2SISAT + Inv_LNFIN * PK2SISAT; + K2SISAT1_i = K2SISAT1 + Inv_L * LK2SISAT1 + Inv_NFIN * NK2SISAT1 + Inv_LNFIN * PK2SISAT1; + + if (BULKMOD != 0) begin + if (BULKMOD == 2) begin + K2_i = K2 + Inv_L * LK2 + Inv_NFIN * NK2 + Inv_LNFIN * PK2; + K21_i = K21 + Inv_L * LK21 + Inv_NFIN * NK21 + Inv_LNFIN * PK21; + K2SAT_i = K2SAT + Inv_L * LK2SAT + Inv_NFIN * NK2SAT + Inv_LNFIN * PK2SAT; + K2SAT1_i = K2SAT1 + Inv_L * LK2SAT1 + Inv_NFIN * NK2SAT1 + Inv_LNFIN * PK2SAT1; + end + PHIBE_i = PHIBE + Inv_L * LPHIBE + Inv_NFIN * NPHIBE + Inv_LNFIN * PPHIBE; + K1_i = K1 + Inv_L * LK1 + Inv_NFIN * NK1 + Inv_LNFIN * PK1; + K11_i = K11 + Inv_L * LK11 + Inv_NFIN * NK11 + Inv_LNFIN * PK11; + end + QMFACTOR_i = QMFACTOR + Inv_L * LQMFACTOR + Inv_NFIN * NQMFACTOR + Inv_LNFIN * PQMFACTOR; + QMTCENCV_i = QMTCENCV + Inv_L * LQMTCENCV + Inv_NFIN * NQMTCENCV + Inv_LNFIN * PQMTCENCV; + QMTCENCVA_i = QMTCENCVA + Inv_L * LQMTCENCVA + Inv_NFIN * NQMTCENCVA + Inv_LNFIN * PQMTCENCVA; + VSAT_i = VSAT + Inv_L * LVSAT + Inv_NFIN * NVSAT + Inv_LNFIN * PVSAT; + VSAT1_i = VSAT1 + Inv_L * LVSAT1 + Inv_NFIN * NVSAT1 + Inv_LNFIN * PVSAT1; + VSATCV_i = VSATCV + Inv_L * LVSATCV + Inv_NFIN * NVSATCV + Inv_LNFIN * PVSATCV; + DELTAVSAT_i = DELTAVSAT + Inv_L * LDELTAVSAT + Inv_NFIN * NDELTAVSAT + Inv_LNFIN * PDELTAVSAT; + PSAT_i = PSAT + Inv_L * LPSAT + Inv_NFIN * NPSAT + Inv_LNFIN * PPSAT; + DELTAVSATCV_i = DELTAVSATCV + Inv_L * LDELTAVSATCV + Inv_NFIN * NDELTAVSATCV + Inv_LNFIN * PDELTAVSATCV; + PSATCV_i = PSATCV + Inv_L * LPSATCV + Inv_NFIN * NPSATCV + Inv_LNFIN * PPSATCV; + KSATIV_i = KSATIV + Inv_L * LKSATIV + Inv_NFIN * NKSATIV + Inv_LNFIN * PKSATIV; + MEXP_i = MEXP + Inv_L * LMEXP + Inv_NFIN * NMEXP + Inv_LNFIN * PMEXP; + PTWG_i = PTWG + Inv_L * LPTWG + Inv_NFIN * NPTWG + Inv_LNFIN * PPTWG; + U0_i = U0 + Inv_L * LU0 + Inv_NFIN * NU0 + Inv_LNFIN * PU0; + ETAMOB_i = ETAMOB + Inv_L * LETAMOB + Inv_NFIN * NETAMOB + Inv_LNFIN * PETAMOB; + UP_i = UP + Inv_L * LUP + Inv_NFIN * NUP + Inv_LNFIN * PUP; + UA_i = UA + Inv_L * LUA + Inv_NFIN * NUA + Inv_LNFIN * PUA; + if (BULKMOD != 0) begin + UC_i = UC + Inv_L * LUC + Inv_NFIN * NUC + Inv_LNFIN * PUC; + end + EU_i = EU + Inv_L * LEU + Inv_NFIN * NEU + Inv_LNFIN * PEU; + UD_i = UD + Inv_L * LUD + Inv_NFIN * NUD + Inv_LNFIN * PUD; + UCS_i = UCS + Inv_L * LUCS + Inv_NFIN * NUCS + Inv_LNFIN * PUCS; + PCLM_i = PCLM + Inv_L * LPCLM + Inv_NFIN * NPCLM + Inv_LNFIN * PPCLM; + PCLMG_i = PCLMG + Inv_L * LPCLMG + Inv_NFIN * NPCLMG + Inv_LNFIN * PPCLMG; + PCLMCV_i = PCLMCV + Inv_L * LPCLMCV + Inv_NFIN * NPCLMCV + Inv_LNFIN * PPCLMCV; + A1_i = A1 + Inv_L * LA1 + Inv_NFIN * NA1 + Inv_LNFIN * PA1; + A11_i = A11 + Inv_L * LA11 + Inv_NFIN * NA11 + Inv_LNFIN * PA11; + A2_i = A2 + Inv_L * LA2 + Inv_NFIN * NA2 + Inv_LNFIN * PA2; + A21_i = A21 + Inv_L * LA21 + Inv_NFIN * NA21 + Inv_LNFIN * PA21; + RDSW_i = RDSW + Inv_L * LRDSW + Inv_NFIN * NRDSW + Inv_LNFIN * PRDSW; + RSW_i = RSW + Inv_L * LRSW + Inv_NFIN * NRSW + Inv_LNFIN * PRSW; + RDW_i = RDW + Inv_L * LRDW + Inv_NFIN * NRDW + Inv_LNFIN * PRDW; + PRWGD_i = PRWGD + Inv_L * LPRWGD + Inv_NFIN * NPRWGD + Inv_LNFIN * PPRWGD; + PRWGS_i = PRWGS + Inv_L * LPRWGS + Inv_NFIN * NPRWGS + Inv_LNFIN * PPRWGS; + WR_i = WR + Inv_L * LWR + Inv_NFIN * NWR + Inv_LNFIN * PWR; + PDIBL1_i = PDIBL1 + Inv_L * LPDIBL1 + Inv_NFIN * NPDIBL1 + Inv_LNFIN * PPDIBL1; + PDIBL2_i = PDIBL2 + Inv_L * LPDIBL2 + Inv_NFIN * NPDIBL2 + Inv_LNFIN * PPDIBL2; + DROUT_i = DROUT + Inv_L * LDROUT + Inv_NFIN * NDROUT + Inv_LNFIN * PDROUT; + PVAG_i = PVAG + Inv_L * LPVAG + Inv_NFIN * NPVAG + Inv_LNFIN * PPVAG; + AIGBINV_i = AIGBINV + Inv_L * LAIGBINV + Inv_NFIN * NAIGBINV + Inv_LNFIN * PAIGBINV; + AIGBINV1_i = AIGBINV1 + Inv_L * LAIGBINV1 + Inv_NFIN * NAIGBINV1 + Inv_LNFIN * PAIGBINV1; + BIGBINV_i = BIGBINV + Inv_L * LBIGBINV + Inv_NFIN * NBIGBINV + Inv_LNFIN * PBIGBINV; + CIGBINV_i = CIGBINV + Inv_L * LCIGBINV + Inv_NFIN * NCIGBINV + Inv_LNFIN * PCIGBINV; + EIGBINV_i = EIGBINV + Inv_L * LEIGBINV + Inv_NFIN * NEIGBINV + Inv_LNFIN * PEIGBINV; + NIGBINV_i = NIGBINV + Inv_L * LNIGBINV + Inv_NFIN * NNIGBINV + Inv_LNFIN * PNIGBINV; + AIGBACC_i = AIGBACC + Inv_L * LAIGBACC + Inv_NFIN * NAIGBACC + Inv_LNFIN * PAIGBACC; + AIGBACC1_i = AIGBACC1 + Inv_L * LAIGBACC1 + Inv_NFIN * NAIGBACC1 + Inv_LNFIN * PAIGBACC1; + BIGBACC_i = BIGBACC + Inv_L * LBIGBACC + Inv_NFIN * NBIGBACC + Inv_LNFIN * PBIGBACC; + CIGBACC_i = CIGBACC + Inv_L * LCIGBACC + Inv_NFIN * NCIGBACC + Inv_LNFIN * PCIGBACC; + NIGBACC_i = NIGBACC + Inv_L * LNIGBACC + Inv_NFIN * NNIGBACC + Inv_LNFIN * PNIGBACC; + AIGC_i = AIGC + Inv_L * LAIGC + Inv_NFIN * NAIGC + Inv_LNFIN * PAIGC; + AIGC1_i = AIGC1 + Inv_L * LAIGC1 + Inv_NFIN * NAIGC1 + Inv_LNFIN * PAIGC1; + BIGC_i = BIGC + Inv_L * LBIGC + Inv_NFIN * NBIGC + Inv_LNFIN * PBIGC; + CIGC_i = CIGC + Inv_L * LCIGC + Inv_NFIN * NCIGC + Inv_LNFIN * PCIGC; + PIGCD_i = PIGCD + Inv_L * LPIGCD + Inv_NFIN * NPIGCD + Inv_LNFIN * PPIGCD; + AIGS_i = AIGS + Inv_L * LAIGS + Inv_NFIN * NAIGS + Inv_LNFIN * PAIGS; + AIGS1_i = AIGS1 + Inv_L * LAIGS1 + Inv_NFIN * NAIGS1 + Inv_LNFIN * PAIGS1; + BIGS_i = BIGS + Inv_L * LBIGS + Inv_NFIN * NBIGS + Inv_LNFIN * PBIGS; + CIGS_i = CIGS + Inv_L * LCIGS + Inv_NFIN * NCIGS + Inv_LNFIN * PCIGS; + AIGD_i = AIGD + Inv_L * LAIGD + Inv_NFIN * NAIGD + Inv_LNFIN * PAIGD; + AIGD1_i = AIGD1 + Inv_L * LAIGD1 + Inv_NFIN * NAIGD1 + Inv_LNFIN * PAIGD1; + BIGD_i = BIGD + Inv_L * LBIGD + Inv_NFIN * NBIGD + Inv_LNFIN * PBIGD; + CIGD_i = CIGD + Inv_L * LCIGD + Inv_NFIN * NCIGD + Inv_LNFIN * PCIGD; + NTOX_i = NTOX + Inv_L * LNTOX + Inv_NFIN * NNTOX + Inv_LNFIN * PNTOX; + POXEDGE_i = POXEDGE + Inv_L * LPOXEDGE + Inv_NFIN * NPOXEDGE + Inv_LNFIN * PPOXEDGE; + AGIDL_i = AGIDL + Inv_L * LAGIDL + Inv_NFIN * NAGIDL + Inv_LNFIN * PAGIDL; + BGIDL_i = BGIDL + Inv_L * LBGIDL + Inv_NFIN * NBGIDL + Inv_LNFIN * PBGIDL; + CGIDL_i = CGIDL + Inv_L * LCGIDL + Inv_NFIN * NCGIDL + Inv_LNFIN * PCGIDL; + EGIDL_i = EGIDL + Inv_L * LEGIDL + Inv_NFIN * NEGIDL + Inv_LNFIN * PEGIDL; + PGIDL_i = PGIDL + Inv_L * LPGIDL + Inv_NFIN * NPGIDL + Inv_LNFIN * PPGIDL; + AGISL_i = AGISL + Inv_L * LAGISL + Inv_NFIN * NAGISL + Inv_LNFIN * PAGISL; + BGISL_i = BGISL + Inv_L * LBGISL + Inv_NFIN * NBGISL + Inv_LNFIN * PBGISL; + CGISL_i = CGISL + Inv_L * LCGISL + Inv_NFIN * NCGISL + Inv_LNFIN * PCGISL; + EGISL_i = EGISL + Inv_L * LEGISL + Inv_NFIN * NEGISL + Inv_LNFIN * PEGISL; + PGISL_i = PGISL + Inv_L * LPGISL + Inv_NFIN * NPGISL + Inv_LNFIN * PPGISL; + ALPHA0_i = ALPHA0 + Inv_L * LALPHA0 + Inv_NFIN * NALPHA0 + Inv_LNFIN * PALPHA0; + ALPHA1_i = ALPHA1 + Inv_L * LALPHA1 + Inv_NFIN * NALPHA1 + Inv_LNFIN * PALPHA1; + ALPHAII0_i = ALPHAII0 + Inv_L * LALPHAII0 + Inv_NFIN * NALPHAII0 + Inv_LNFIN * PALPHAII0; + ALPHAII1_i = ALPHAII1 + Inv_L * LALPHAII1 + Inv_NFIN * NALPHAII1 + Inv_LNFIN * PALPHAII1; + BETA0_i = BETA0 + Inv_L * LBETA0 + Inv_NFIN * NBETA0 + Inv_LNFIN * PBETA0; + BETAII0_i = BETAII0 + Inv_L * LBETAII0 + Inv_NFIN * NBETAII0 + Inv_LNFIN * PBETAII0; + BETAII1_i = BETAII1 + Inv_L * LBETAII1 + Inv_NFIN * NBETAII1 + Inv_LNFIN * PBETAII1; + BETAII2_i = BETAII2 + Inv_L * LBETAII2 + Inv_NFIN * NBETAII2 + Inv_LNFIN * PBETAII2; + ESATII_i = ESATII + Inv_L * LESATII + Inv_NFIN * NESATII + Inv_LNFIN * PESATII; + LII_i = LII + Inv_L * LLII + Inv_NFIN * NLII + Inv_LNFIN * PLII; + SII0_i = SII0 + Inv_L * LSII0 + Inv_NFIN * NSII0 + Inv_LNFIN * PSII0; + SII1_i = SII1 + Inv_L * LSII1 + Inv_NFIN * NSII1 + Inv_LNFIN * PSII1; + SII2_i = SII2 + Inv_L * LSII2 + Inv_NFIN * NSII2 + Inv_LNFIN * PSII2; + SIID_i = SIID + Inv_L * LSIID + Inv_NFIN * NSIID + Inv_LNFIN * PSIID; + TII_i = TII + Inv_L * LTII + Inv_NFIN * NTII + Inv_LNFIN * PTII; + CFS_i = CFS + Inv_L * LCFS + Inv_NFIN * NCFS + Inv_LNFIN * PCFS; + CFD_i = CFD + Inv_L * LCFD + Inv_NFIN * NCFD + Inv_LNFIN * PCFD; + COVS_i = COVS + Inv_L * LCOVS + Inv_NFIN * NCOVS + Inv_LNFIN * PCOVS; + COVD_i = COVD + Inv_L * LCOVD + Inv_NFIN * NCOVD + Inv_LNFIN * PCOVD; + CGSL_i = CGSL + Inv_L * LCGSL + Inv_NFIN * NCGSL + Inv_LNFIN * PCGSL; + CGDL_i = CGDL + Inv_L * LCGDL + Inv_NFIN * NCGDL + Inv_LNFIN * PCGDL; + CGBL_i = CGBL + Inv_L * LCGBL + Inv_NFIN * NCGBL + Inv_LNFIN * PCGBL; + CKAPPAS_i = CKAPPAS + Inv_L * LCKAPPAS + Inv_NFIN * NCKAPPAS + Inv_LNFIN * PCKAPPAS; + CKAPPAD_i = CKAPPAD + Inv_L * LCKAPPAD + Inv_NFIN * NCKAPPAD + Inv_LNFIN * PCKAPPAD; + CKAPPAB_i = CKAPPAB + Inv_L * LCKAPPAB + Inv_NFIN * NCKAPPAB + Inv_LNFIN * PCKAPPAB; + NTGEN_i = NTGEN + Inv_L * LNTGEN + Inv_NFIN * NNTGEN + Inv_LNFIN * PNTGEN; + AIGEN_i = AIGEN + Inv_L * LAIGEN + Inv_NFIN * NAIGEN + Inv_LNFIN * PAIGEN; + BIGEN_i = BIGEN + Inv_L * LBIGEN + Inv_NFIN * NBIGEN + Inv_LNFIN * PBIGEN; + + if (ASYMMOD != 0) begin + CDSCDR_i = CDSCDR + Inv_L * LCDSCDR + Inv_NFIN * NCDSCDR + Inv_LNFIN * PCDSCDR; + CITR_i = CITR + Inv_L * LCITR + Inv_NFIN * NCITR + Inv_LNFIN * PCITR; + ETA0R_i = ETA0R + Inv_L * LETA0R + Inv_NFIN * NETA0R + Inv_LNFIN * PETA0R; + VSAT1R_i = VSAT1R + Inv_L * LVSAT1R + Inv_NFIN * NVSAT1R + Inv_LNFIN * PVSAT1R; + MEXPR_i = MEXPR + Inv_L * LMEXPR + Inv_NFIN * NMEXPR + Inv_LNFIN * PMEXPR; + PTWGR_i = PTWGR + Inv_L * LPTWGR + Inv_NFIN * NPTWGR + Inv_LNFIN * PPTWGR; + PDIBL1R_i = PDIBL1R + Inv_L * LPDIBL1R + Inv_NFIN * NPDIBL1R + Inv_LNFIN * PPDIBL1R; + PDIBL2R_i = PDIBL2R + Inv_L * LPDIBL2R + Inv_NFIN * NPDIBL2R + Inv_LNFIN * PPDIBL2R; + PCLMR_i = PCLMR + Inv_L * LPCLMR + Inv_NFIN * NPCLMR + Inv_LNFIN * PPCLMR; + DVTSHIFTR_i = DVTSHIFTR + Inv_L * LDVTSHIFTR + Inv_NFIN * NDVTSHIFTR + Inv_LNFIN * PDVTSHIFTR; + VSATR_i = VSATR + Inv_L * LVSATR + Inv_NFIN * NVSATR + Inv_LNFIN * PVSATR; + KSATIVR_i = KSATIVR + Inv_L * LKSATIVR + Inv_NFIN * NKSATIVR + Inv_LNFIN * PKSATIVR; + U0R_i = U0R + Inv_L * LU0R + Inv_NFIN * NU0R + Inv_LNFIN * PU0R; + UAR_i = UAR + Inv_L * LUAR + Inv_NFIN * NUAR + Inv_LNFIN * PUAR; + UPR_i = UPR + Inv_L * LUPR + Inv_NFIN * NUPR + Inv_LNFIN * PUPR; + if (BULKMOD != 0) begin + UCR_i = UCR + Inv_L * LUCR + Inv_NFIN * NUCR + Inv_LNFIN * PUCR; + end + EUR_i = EUR + Inv_L * LEUR + Inv_NFIN * NEUR + Inv_LNFIN * PEUR; + UDR_i = UDR + Inv_L * LUDR + Inv_NFIN * NUDR + Inv_LNFIN * PUDR; + end + + `ifdef __NQSMOD1__ + if (NQSMOD == 1 && XRCRG1 != 0.0) begin + XRCRG1_i = XRCRG1 + Inv_L * LXRCRG1 + Inv_NFIN * NXRCRG1 + Inv_LNFIN * PXRCRG1; + XRCRG2_i = XRCRG2 + Inv_L * LXRCRG2 + Inv_NFIN * NXRCRG2 + Inv_LNFIN * PXRCRG2; + end else begin + XRCRG1_i = 0.0; + XRCRG2_i = 0.0; + end + `else + if (NQSMOD == 1) begin + $strobe(" Although the model selector NQSMOD is set to 1, the NQS gate resistance model is not activated in the Verilog-A code. Please uncomment \"`define __NQSMOD1__\" in bsimcmg.va to activate it."); + end + `endif + + `ifdef __NQSMOD2__ + if (NQSMOD == 2 && XRCRG1 != 0.0) begin + XRCRG1_i = XRCRG1 + Inv_L * LXRCRG1 + Inv_NFIN * NXRCRG1 + Inv_LNFIN * PXRCRG1; + XRCRG2_i = XRCRG2 + Inv_L * LXRCRG2 + Inv_NFIN * NXRCRG2 + Inv_LNFIN * PXRCRG2; + end else begin + XRCRG1_i = 0.0; + XRCRG2_i = 0.0; + end + `else + if (NQSMOD == 2) begin + $strobe(" Although the model selector NQSMOD is set to 2, the NQS gate resistance model is not activated in the Verilog-A code. Please uncomment \"`define __NQSMOD2__\" in bsimcmg.va to activate it."); + end + `endif + + UTE_i = UTE + Inv_L * LUTE + Inv_NFIN * NUTE + Inv_LNFIN * PUTE; + UTL_i = UTL + Inv_L * LUTL + Inv_NFIN * NUTL + Inv_LNFIN * PUTL; + EMOBT_i = EMOBT + Inv_L * LEMOBT + Inv_NFIN * NEMOBT + Inv_LNFIN * PEMOBT; + UA1_i = UA1 + Inv_L * LUA1 + Inv_NFIN * NUA1 + Inv_LNFIN * PUA1; + + if (BULKMOD != 0) begin + UC1_i = UC1 + Inv_L * LUC1 + Inv_NFIN * NUC1 + Inv_LNFIN * PUC1; + end + UD1_i = UD1 + Inv_L * LUD1 + Inv_NFIN * NUD1 + Inv_LNFIN * PUD1; + UCSTE_i = UCSTE + Inv_L * LUCSTE + Inv_NFIN * NUCSTE + Inv_LNFIN * PUCSTE; + PTWGT_i = PTWGT + Inv_L * LPTWGT + Inv_NFIN * NPTWGT + Inv_LNFIN * PPTWGT; + AT_i = AT + Inv_L * LAT + Inv_NFIN * NAT + Inv_LNFIN * PAT; + ATCV_i = ATCV + Inv_L * LATCV + Inv_NFIN * NATCV + Inv_LNFIN * PATCV; + PRT_i = PRT + Inv_L * LPRT + Inv_NFIN * NPRT + Inv_LNFIN * PPRT; + KT1_i = KT1 + Inv_L * LKT1 + Inv_NFIN * NKT1 + Inv_LNFIN * PKT1; + TSS_i = TSS + Inv_L * LTSS + Inv_NFIN * NTSS + Inv_LNFIN * PTSS; + IIT_i = IIT + Inv_L * LIIT + Inv_NFIN * NIIT + Inv_LNFIN * PIIT; + TGIDL_i = TGIDL + Inv_L * LTGIDL + Inv_NFIN * NTGIDL + Inv_LNFIN * PTGIDL; + IGT_i = IGT + Inv_L * LIGT + Inv_NFIN * NIGT + Inv_LNFIN * PIGT; + + if (ASYMMOD != 0) begin + UTER_i = UTER + Inv_L * LUTER + Inv_NFIN * NUTER + Inv_LNFIN * PUTER; + UTLR_i = UTLR + Inv_L * LUTLR + Inv_NFIN * NUTLR + Inv_LNFIN * PUTLR; + UA1R_i = UA1R + Inv_L * LUA1R + Inv_NFIN * NUA1R + Inv_LNFIN * PUA1R; + UD1R_i = UD1R + Inv_L * LUD1R + Inv_NFIN * NUD1R + Inv_LNFIN * PUD1R; + ATR_i = ATR + Inv_L * LATR + Inv_NFIN * NATR + Inv_LNFIN * PATR; + if (BULKMOD != 0) begin + UC1R_i = UC1R + Inv_L * LUC1R + Inv_NFIN * NUC1R + Inv_LNFIN * PUC1R; + end + end + + // Geometrical Scaling + // NFIN Scaling + if (PHIGN1 != 0.0) begin + PHIG_i = PHIG_i * (1.0 + PHIGN1 / NFIN * lln(1.0 + NFIN / PHIGN2)); + end + + if (ETA0N1 != 0.0) begin + ETA0_i = ETA0_i * (1.0 + ETA0N1 / NFIN * lln(1.0 + NFIN / ETA0N2)); + end + + if (CDSCN1 != 0.0) begin + CDSC_i = CDSC_i * (1.0 + CDSCN1 / NFIN * lln(1.0 + NFIN / CDSCN2)); + end + + if (CDSCDN1 != 0.0) begin + CDSCD_i = CDSCD_i * (1.0 + CDSCDN1 / NFIN * lln(1.0 + NFIN / CDSCDN2)); + end + + if (CDSCDRN1 != 0.0) begin + CDSCDR_i = CDSCDR_i * (1.0 + CDSCDRN1 / NFIN * lln(1.0 + NFIN / CDSCDRN2)); + end + + if (VSATN1 != 0.0) begin + VSAT_i = VSAT_i * (1.0 + VSATN1 / NFIN * lln(1.0 + NFIN / VSATN2)); + end + + if (VSAT1N1 != 0.0) begin + VSAT1_i = VSAT1_i * (1.0 + VSAT1N1 / NFIN * lln(1.0 + NFIN / VSAT1N2)); + end + + if (VSAT1RN1 != 0.0) begin + VSAT1R_i = VSAT1R_i * (1.0 + VSAT1RN1 / NFIN * lln(1.0 + NFIN / VSAT1RN2)); + end + + if (U0N1 != 0.0) begin + U0_i = U0_i * (1.0 + U0N1 / NFIN * lln(1.0 + NFIN / U0N2)); + end + + if ($param_given(NFINNOM)) begin + PHIG_i = PHIG_i * (1.0 + (NFIN - NFINNOM) * PHIGLT * Leff) ; + ETA0_i = ETA0_i * (1.0 + (NFIN - NFINNOM) * ETA0LT * Leff); + U0_i = U0_i * (1.0 + (NFIN - NFINNOM) * U0LT * Leff); + end + + if (U0N1R != 0.0) begin + U0R_i = U0R_i * (1.0 + U0N1R / NFIN * lln(1.0 + NFIN / U0N2R)); + end + + // Length Scaling + PHIG_i = PHIG_i + PHIGL * Leff; + if (LPA > 0.0) begin + U0_i = U0_i * (1.0 - UP_i * pow(Leff, -LPA)); + end else begin + U0_i = U0_i * (1.0 - UP_i); + end + UA_i = UA_i + AUA * lexp(-Leff / BUA); + UD_i = UD_i + AUD * lexp(-Leff / BUD); + EU_i = EU_i + AEU * lexp(-Leff / BEU); + + if (ASYMMOD != 0) begin + if (LPAR > 0.0) begin + U0R_i = U0R_i * (1.0 - UPR_i * pow(Leff, -LPAR)); + end else begin + U0R_i = U0R_i * (1.0 - UPR_i); + end + UAR_i = UAR_i + AUAR * lexp(-Leff / BUAR); + UDR_i = UDR_i + AUDR * lexp(-Leff / BUDR); + EUR_i = EUR_i + AEUR * lexp(-Leff / BEUR); + end + + if (RDSMOD == 1) begin + RSW_i = RSW_i + ARSW * lexp(-Leff / BRSW); + RDW_i = RDW_i + ARDW * lexp(-Leff / BRDW); + end else begin + RDSW_i = RDSW_i + ARDSW * lexp(-Leff / BRDSW); + end + + PCLM_i = PCLM_i + APCLM * lexp(-Leff / BPCLM); + if (ASYMMOD != 0) begin + PCLMR_i = PCLMR_i + APCLMR * pow(Leff, -BPCLMR); + end + + MEXP_i = MEXP_i + AMEXP * pow(Leff, -BMEXP); + if (ASYMMOD != 0) begin + MEXPR_i = MEXPR_i + AMEXPR * pow(Leff, -BMEXPR); + end + + PTWG_i = PTWG_i + APTWG * lexp(-Leff / BPTWG); + if (ASYMMOD != 0) begin + PTWGR_i = PTWGR_i + APTWG * lexp(-Leff / BPTWG); + end + + VSAT_i = VSAT_i + AVSAT * lexp(-Leff / BVSAT); + VSAT1_i = VSAT1_i + AVSAT1 * lexp(-Leff / BVSAT1); + if (ASYMMOD != 0) begin + VSAT1R_i = VSAT1R_i + AVSAT1 * lexp(-Leff / BVSAT1); + end + + PSAT_i = PSAT_i + APSAT * lexp(-Leff / BPSAT); + PSATCV_i = PSATCV_i + APSATCV * lexp(-Leff / BPSATCV); + VSATCV_i = VSATCV_i + AVSATCV * lexp(-LeffCV / BVSATCV); + + // Scaling for DITS Parameters + DVTP0_i = DVTP0 + ADVTP0 * lexp(-Leff / BDVTP0); + DVTP1_i = DVTP1 + ADVTP1 * lexp(-Leff / BDVTP1); + + // Geometrical Scaling for Toxeff / Charge Centroid Tcen + if (QMTCENCV_i > 0.0 || QMTCENCVA_i > 0.0) begin + MTcen = 1.0 + AQMTCEN * lexp(- (2.0 * Ach / Weff_UFCM) / BQMTCEN); + Tcen0 = (2.0 * Ach / Weff_UFCM ) * MTcen; + end + + // ************************************** + // * Parameter Checking * + // ************************************** + + if (LeffCV <= 1.0e-9) begin + $strobe("Warning: LeffCV = %e <= 1.0e-9.", LeffCV); + end + + if (BULKMOD != 0) begin + if (LeffCV_acc <= 1.0e-9) begin + $strobe("Warning: LeffCV_acc = %e <= 1.0e-9.", LeffCV_acc); + end + end + + if (Weff0 <= 1.0e-9) begin + $strobe("Warning: Weff0 = %e <= 1.0e-9.", Weff0); + end + + if (WeffCV0 <= 1.0e-9) begin + $strobe("Warning: WeffCV0 = %e <= 1.0e-9.", WeffCV0); + end + + if (NBODY_i <= 0.0) begin + $strobe("Fatal: NBODY_i = %e is not positive.", NBODY_i); $finish(0); - end - end + end else if (NBODY_i <= 1.0e18) begin + $strobe("Warning: NBODY_i = %e m^-3 may be too small.", NBODY_i); + end - if (BULKMOD != 0 && QMTCENCVA_i > 0.0) begin - if (QM0ACC <= 0.0) begin - $strobe("Fatal: QM0ACC = %e is non-positive.", QM0ACC); + if (NGATE_i < 0.0) begin + $strobe("Fatal: NGATE_i = %e is negative.", NGATE_i); $finish(0); - end - end - - if (CGIDL_i < 0.0) begin - $strobe("Warning: CGIDL_i = %e < 0. Setting CGIDL_i = 0.", CGIDL_i); - CGIDL_i = 0.0; - end - - if (CGISL_i < 0.0) begin - $strobe("Warning: CGISL_i = %e < 0. Setting CGISL_i = 0.", CGISL_i); - CGISL_i = 0.0; - end - - if (IGBMOD != 0) begin - if (NIGBINV_i <= 0.0) begin - $strobe("Fatal: NIGBINV_i = %e is non-positive.", NIGBINV_i); + end else if (NGATE_i != 0.0 && NGATE_i <= 1.0e24) begin + $strobe("Warning: NGATE_i = %e may be too small.", NGATE_i); + end else if (NGATE_i > 1.0e31) begin + $strobe("Fatal: NGATE_i = %e is too high.", NGATE_i); $finish(0); - end - if (NIGBACC_i <= 0.0) begin - $strobe("Fatal: NIGBACC_i = %e is non-positive.", NIGBACC_i); + end + + if (DVT0_i < 0.0) begin + $strobe("Warning: DVT0_i = %e is negative.", DVT0_i); + end + + if (PHIG_i <= 0.0) begin + $strobe("Fatal: PHIG_i = %e is not positive.", PHIG_i); $finish(0); - end - end + end - if (IGCMOD != 0) begin - if (POXEDGE_i <= 0.0) begin - $strobe("Fatal: POXEDGE_i = %e is non-positive.", POXEDGE_i); + if (VSAT_i <= 0.0) begin + $strobe("Fatal: VSAT_i = %e is not positive.", VSAT_i); $finish(0); - end - if (PIGCD_i <= 0.0) begin - $strobe("Fatal: PIGCD_i = %e is non-positive.", PIGCD_i); + end + + if (VSAT1_i <= 0.0) begin + $strobe("Fatal: VSAT1_i = %e is not positive.", VSAT1_i); $finish(0); - end - end + end - if (IGCMOD != 0 || IGBMOD != 0) begin - if (TOXREF <= 0) begin - $strobe("Fatal: TOXREF = %e is non-positive.", TOXREF); + if (ASYMMOD != 0 && VSAT1R_i <= 0.0) begin + $strobe("Fatal: VSAT1R_i = %e is not positive.", VSAT1R_i); $finish(0); - end - end - - if (LINTIGEN >= (Leff / 2.0)) begin - $strobe("Warning: LINTIGEN = %e is too large - Leff for r/g current is negative. Re-setting LINTIGEN = 0.", LINTIGEN); - LINTIGEN_i = 0.0; - end else begin - LINTIGEN_i = LINTIGEN; - end - - if (NTGEN_i <= 0.0) begin - $strobe("Fatal: NTGEN_i = %e is non-positive.", NTGEN_i); - $finish(0); - end - - `ifdef __NQSMOD1__ - if (NQSMOD == 1 && XRCRG1_i != 0.0 && XRCRG1_i < 1.0e-3) begin - $strobe("Warning: XRCRG1_i = %e. Gate resistance may be too large. Disabling NQS Gate Resistance.", XRCRG1_i); - XRCRG1_i = 0.0; - end - `endif - - if (IIMOD == 2) begin - if (BETAII0_i < 0.0) begin - $strobe("Warning: BETAII0_i = %e is negative.",BETAII0_i); - end - if (BETAII1_i < 0.0) begin - $strobe("Warning: BETAII1_i = %e is negative.", BETAII1_i); - end - if (BETAII2_i < 0.0) begin - $strobe("Warning: BETAII2_i = %e is negative.", BETAII2_i); - end - if (ESATII_i < 0.0) begin - $strobe("Warning: ESATII_i = %e is negative.", ESATII_i); - end - if (LII_i < 0.0) begin - $strobe("Warning: LII_i = %e is negative.", LII_i); - end - if (SII1_i < 0.0) begin - $strobe("Warning: SII1_i = %e is negative.", SII1); - end - if (SII2_i < 0.0) begin - $strobe("Warning: SII2_i = %e is negative.", SII2_i); - end - if (SIID_i < 0.0) begin - $strobe("Warning: SIID_i = %e is negative.", SIID_i); - end - end - - if (EF <= 0.0) begin - $strobe("Fatal: EF = %e is non-positive.", EF); - $finish(0); - end else if (EF > 2.0) begin - $strobe("Fatal: EF = %e > 2.0.", EF); - $finish(0); - end - - if (LINTNOI >= (Leff / 2.0)) begin - $strobe("Warning: LINTNOI = %e is too large - Leff for noise is negative. Re-setting LINTNOI = 0.", LINTNOI); - LINTNOI_i = 0.0; - end else begin - LINTNOI_i = LINTNOI; - end - - if (NTNOI < 0) begin - $strobe("Warning: NTNOI = %e is negative. Set to zero.", NTNOI); - NTNOI_i = 0.0; - end else begin - NTNOI_i = NTNOI; - end - - // Self-Heating - `ifdef __SHMOD__ - if (SHMOD != 0 && RTH0 > 0.0) begin - T1y = WTH0; - if (BSHEXP != 0.0) begin - T1y = WTH0 * pow(NF, BSHEXP); - end - T2y = FPITCH; - if (ASHEXP != 0.0) begin - T2y = FPITCH * pow(NFINtotal, ASHEXP); - end - gth = (T1y + T2y)/ RTH0; - cth = CTH0 * (T1y + T2y); - end else begin - gth = 1.0; - cth = 0.0; - end - `else - if (SHMOD != 0) begin - $strobe("Although the model selector SHMOD is set to 1, the self heating model is not activated in the Verilog-A code. Please uncomment \"`define __SHMOD__\" in bsimcmg.va to activate it."); - end - `endif - - // Gate Electrode Resistance - `ifdef __RGATEMOD__ - if (RGATEMOD != 0) begin - Rgeltd = (RGEXT / NGCON + (RGFIN * NFIN) / (NGCON == 2 ? 12.0 : 3.0)) / NF; - ggeltd = 1.0 / max(1.0e-3, Rgeltd); - end - `else - if (RGATEMOD != 0) - $strobe("Although the model selector RGATEMOD is set to 1, the gate electrode resistance model is not activated in the Verilog-A code. Please uncomment \"`define __RGATEMOD__\" in bsimcmg.va to activate it."); - `endif - - // Geometry-Dependent Source/Drain Resistance - if (RGEOMOD == 0) begin - RSourceGeo = RSHS * NRS; - RDrainGeo = RSHD * NRD; - end else begin - // Area and perimeter calculation - if (HEPI > 0.0) begin - Arsd = FPITCH * HFIN + (TFIN + (FPITCH - TFIN) * CRATIO) * HEPI; - end else begin - Arsd = FPITCH * max(1.0e-9, HFIN + HEPI); - end - Prsd = FPITCH + DELTAPRSD; - - // Resistivity Calculation - if ($param_given(RHORSD)) begin - rhorsd = RHORSD; - end else begin - mu_max = (TYPE == `ntype) ? 1417.0 : 470.5; - if (TYPE == `ntype) begin - mu_rsd = (52.2 + (mu_max - 52.2) / (1.0 + pow(NSD / 9.68e22, 0.680)) - 43.4 / (1.0 + pow(3.43e26 / NSD, 2.0))) * 1.0e-4; - end else begin - mu_rsd = (44.9 + (mu_max - 44.9) / (1.0 + pow(NSD / 2.23e22, 0.719)) - 29.0 / (1.0 + pow(6.10e26 / NSD, 2.0))) * 1.0e-4; - end - rhorsd = 1.0 / (`q * NSD * mu_rsd); - end - - // Component: Spreading Resistance (extension -> hdd) - thetarsp = 55.0 * `M_PI / 180.0; - afin = min(Arsd, max(1.0e-18, TFIN * (HFIN + min(0.0, HEPI)))); - T1y = `COT(thetarsp); - Rsp = rhorsd * T1y / (sqrt(`M_PI) * NFIN) * (1.0 / sqrt(afin) - 2.0 / sqrt(Arsd) + sqrt(afin / (Arsd*Arsd))); - - // Component: Contact Resistance - arsd_total = Arsd * NFIN + ARSDEND; - prsd_total = Prsd * NFIN + PRSDEND; - lt = sqrt(RHOC * arsd_total / (rhorsd * prsd_total)); - alpha = LRSD / lt; - T0y = lexp(alpha + alpha); - - if (SDTERM == 1.0) begin - eta = rhorsd * lt / RHOC; - T1y = T0y * (1.0 + eta); - T2y = T1y + 1.0 - eta; - T3y = T1y - 1.0 + eta; - end else begin - T2y = T0y + 1.0; - T3y = T0y - 1.0; - end - RrsdTML = rhorsd * lt * T2y / (arsd_total * T3y); - - if (HEPI < -1.0e-10) begin - Rrsdside = RHOC / (-HEPI * TFIN * NFIN); - Rrsd = (RrsdTML + Rsp) * Rrsdside / ((RrsdTML + Rsp) + Rrsdside); - end else begin - Rrsd = RrsdTML + Rsp; - end - - Rdsgeo = Rrsd / NF * max(0.0, RGEOA + RGEOB * TFIN + RGEOC * FPITCH + RGEOD * LRSD + RGEOE * HEPI); - RSourceGeo = Rdsgeo; - RDrainGeo = Rdsgeo; - end - - // Clamping of Source/Drain Resistances - if (RSourceGeo <= 1.0e-3) begin - RSourceGeo = 1.0e-3; - end - - if (RDrainGeo <= 1.0e-3) begin - RDrainGeo = 1.0e-3; - end - - if (RDSMOD == 1) begin - if (RSWMIN_i <= 0.0) begin + end + + if (DVT1_i <= 0.0) begin + $strobe("Fatal: DVT1_i = %e is not positive.", DVT1_i); + $finish(0); + end + + if (DVT1SS_i <= 0.0) begin + $strobe("Fatal: DVT1SS_i = %e is not positive.", DVT1SS_i); + $finish(0); + end + + if (CDSC_i < 0.0) begin + $strobe("Warning: CDSC_i = %e is negative.", CDSC_i); + end + + if (CDSCD_i < 0.0) begin + $strobe("Warning: CDSCD_i = %e is negative.", CDSCD_i); + end + + if (ASYMMOD != 0 && CDSCDR_i < 0.0) begin + $strobe("Warning: CDSCDR_i = %e is negative.", CDSCDR_i); + end + + if (DSUB_i <= 0.0) begin + $strobe("Fatal: DSUB_i = %e is not positive.", DSUB_i); + $finish(0); + end + + if (ETA0_i < 0.0) begin + $strobe("Warning: ETA0_i = %e is negative, setting it to 0", ETA0_i); + ETA0_i = 0.0; + end + + if (ETA0R_i < 0.0) begin + $strobe("Warning: ETA0R_i = %e is negative, setting it to 0", ETA0R_i); + ETA0R_i = 0.0; + end + + if (LPE0_i < -Leff) begin + $strobe("Warning: LPE0_i = %e is less than -Leff. Clipping LPE0_i to 0", LPE0_i); + LPE0_i = 0.0; + end + + if (K0SI_i <= 0.0) begin + $strobe("Warning: K0SI_i = %e is not positive, setting it to 0.", K0SI_i); + K0SI_i = 0.0; + end + + if (K2SI_i <= 0.0) begin + $strobe("Warning: K2SI_i = %e is not positive, setting it to 0.", K2SI_i); + K2SI_i = 0.0; + end + + if (PHIBE_i < 0.2 && BULKMOD != 0) begin + $strobe("Warning: PHIBE_i = %e is less than 0.2, setting it to 0.2.", PHIBE_i); + PHIBE_i = 0.2; + end + + if (PHIBE_i > 1.2 && BULKMOD != 0) begin + $strobe("Warning: PHIBE_i = %e is larger than 1.2, setting it to 1.2.", PHIBE_i); + PHIBE_i = 1.2; + end + + if (PSAT_i < 2.0) begin + $strobe("Warning: PSAT_i = %e is less than 2.0, setting it to 2.0.", PSAT_i); + PSAT_i = 2.0; + end + + if (PSATCV_i < 2.0) begin + $strobe("Warning: PSATCV_i = %e is less than 2.0, setting it to 2.0.", PSATCV_i); + PSATCV_i = 2.0; + end + + if (U0_i < 0.0) begin + $strobe("Warning: U0_i = %e is negative, setting it to the default value.", U0_i); + U0_i = 0.03; + end + + if (UA_i < 0.0) begin + $strobe("Warning: UA_i = %e is negative, setting it to 0.", UA_i); + UA_i = 0.0; + end + + if (EU_i < 0.0) begin + $strobe("Warning: EU_i = %e is negative, setting it to 0.", EU_i); + EU_i = 0.0; + end + + if (UD_i < 0.0) begin + $strobe("Warning: UD_i = %e is negative, setting it to 0.", UD_i); + UD_i = 0.0; + end + + if (UCS_i < 0.0) begin + $strobe("Warning: UCS_i = %e is negative, setting it to 0.", UCS_i); + UCS_i = 0.0; + end + + if (ETAMOB_i < 0.0) begin + $strobe("Warning: ETAMOB_i = %e is negative, setting it to 0", ETAMOB_i); + ETAMOB_i = 0.0; + end + + RDSWMIN_i = RDSWMIN; + if (RDSWMIN_i < 0.0) begin + $strobe("Warning: RDSWMIN = %e is negative. Set to zero", RDSWMIN_i); + RDSWMIN_i = 0.0; + end + + if (RDSW_i < 0.0) begin + $strobe("Warning: RDSW_i = %e is negative. Set to zero", RDSW_i); + RDSW_i = 0.0; + end + + RSWMIN_i = RSWMIN; + if (RSWMIN_i < 0.0) begin + $strobe("Warning: RSWMIN = %e is negative. Set to zero", RSWMIN_i); RSWMIN_i = 0.0; - end - if (RDWMIN_i <= 0.0) begin - RDWMIN_i = 0.0; - end - if (RSW_i <= 0.0) begin + end + + if (RSW_i < 0.0) begin + $strobe("Warning: RSW_i = %e is negative. Set to zero", RSW_i); RSW_i = 0.0; - end - if (RDW_i <= 0.0) begin + end + + RDWMIN_i = RDWMIN; + if (RDWMIN_i < 0.0) begin + $strobe("Warning: RDWMIN = %e is negative. Set to zero", RDWMIN_i); + RDWMIN_i = 0.0; + end + + if (RDW_i < 0) begin + $strobe("Warning: RDW_i = %e is negative. Set to zero", RDW_i); RDW_i = 0.0; - end - end else begin - if (RDSWMIN_i <= 0.0) begin - RDSWMIN_i = 0.0; - end - if (RDSW_i <= 0.0) begin - RDSW_i = 0.0; - end - end // End of Clamping of Source/Drain Resistances - - if (CGEOMOD != 1) begin - if ($param_given(CGSO)) begin - CGSO_i = CGSO; - end else begin - if ($param_given(DLC) && DLC > 0.0) begin - CGSO_i = max(0.0, DLC * cox - CGSL_i); - end else begin - CGSO_i = 0.3 * TFIN * cox; + end + + if (PRWGD_i < 0.0) begin + $strobe("Warning: PRWGD_i = %e is negative. Set to zero", PRWGD_i); + PRWGD_i = 0.0; + end + + if (PRWGS_i < 0.0) begin + $strobe("Warning: PRWGS_i = %e is negative. Set to zero", PRWGS_i); + PRWGS_i = 0.0; + end + + if (PCLM_i < 0) begin + $strobe("Warning: PCLM_i = %e is negative.", PCLM_i); + end + + if (PDIBL1_i < 0.0) begin + $strobe("Warning: PDIBL1_i = %e is negative.", PDIBL1_i); + end + + if (ASYMMOD != 0) begin + if (PDIBL1R_i < 0.0) begin + $strobe("Warning: PDIBL1R_i = %e is negative.", PDIBL1R_i); + end + if (PDIBL2R_i < 0.0) begin + $strobe("Warning: PDIBL2R_i = %e is negative.", PDIBL2R_i); + end + if (U0R_i < 0) begin + $strobe("Warning: U0R_i = %e is negative, setting it to 0.", U0R_i); + U0R_i = 0.0; + end + if (UAR_i < 0.0) begin + $strobe("Warning: UAR_i = %e is negative, setting it to 0.", UAR_i); + UAR_i = 0.0; + end + if (EUR_i < 0.0) begin + $strobe("Warning: EUR_i = %e is negative, setting it to 0.", EUR_i); + EUR_i = 0.0; + end + if (UDR_i < 0.0) begin + $strobe("Warning: UDR_i = %e is negative, setting it to 0.", UDR_i); + UDR_i = 0.0; + end + end + + if (PDIBL2_i < 0.0) begin + $strobe("Warning: PDIBL2_i = %e is negative.", PDIBL2_i); + end + + if (DROUT_i <= 0.0) begin + $strobe("Fatal: DROUT_i = %e is non-positive.", DROUT_i); + $finish(0); + end + + if (MEXP_i < 2.0) begin + $strobe("Warning: MEXP_i = %e < 2. Setting MEXP_i = 2.", MEXP_i); + MEXP_i = 2.0; + end + + if (ASYMMOD != 0) begin + if (MEXPR_i < 2.0) begin + $strobe("Warning: MEXPR_i = %e < 2. Setting MEXPR_i = 2.", MEXPR_i); + MEXPR_i = 2.0; + end + end + + if (PTWG_i < 0) begin + $strobe("Warning: PTWG_i = %e is negative, setting it to 0.", PTWG_i ); + PTWG_i = 0.0; + end + + if (QMTCENCV_i > 0.0) begin + if (QM0 <= 0.0) begin + $strobe("Fatal: QM0 = %e is non-positive.", QM0); + $finish(0); + end + end + + if (BULKMOD != 0 && QMTCENCVA_i > 0.0) begin + if (QM0ACC <= 0.0) begin + $strobe("Fatal: QM0ACC = %e is non-positive.", QM0ACC); + $finish(0); + end + end + + if (CGIDL_i < 0.0) begin + $strobe("Warning: CGIDL_i = %e < 0. Setting CGIDL_i = 0.", CGIDL_i); + CGIDL_i = 0.0; + end + + if (CGISL_i < 0.0) begin + $strobe("Warning: CGISL_i = %e < 0. Setting CGISL_i = 0.", CGISL_i); + CGISL_i = 0.0; + end + + if (IGBMOD != 0) begin + if (NIGBINV_i <= 0.0) begin + $strobe("Fatal: NIGBINV_i = %e is non-positive.", NIGBINV_i); + $finish(0); + end + if (NIGBACC_i <= 0.0) begin + $strobe("Fatal: NIGBACC_i = %e is non-positive.", NIGBACC_i); + $finish(0); + end + end + + if (IGCMOD != 0) begin + if (POXEDGE_i <= 0.0) begin + $strobe("Fatal: POXEDGE_i = %e is non-positive.", POXEDGE_i); + $finish(0); + end + if (PIGCD_i <= 0.0) begin + $strobe("Fatal: PIGCD_i = %e is non-positive.", PIGCD_i); + $finish(0); + end + end + + if (IGCMOD != 0 || IGBMOD != 0) begin + if (TOXREF <= 0) begin + $strobe("Fatal: TOXREF = %e is non-positive.", TOXREF); + $finish(0); + end + end + + if (LINTIGEN >= (Leff / 2.0)) begin + $strobe("Warning: LINTIGEN = %e is too large - Leff for r/g current is negative. Re-setting LINTIGEN = 0.", LINTIGEN); + LINTIGEN_i = 0.0; + end else begin + LINTIGEN_i = LINTIGEN; + end + + if (NTGEN_i <= 0.0) begin + $strobe("Fatal: NTGEN_i = %e is non-positive.", NTGEN_i); + $finish(0); + end + + `ifdef __NQSMOD1__ + if (NQSMOD == 1 && XRCRG1_i != 0.0 && XRCRG1_i < 1.0e-3) begin + $strobe("Warning: XRCRG1_i = %e. Gate resistance may be too large. Disabling NQS Gate Resistance.", XRCRG1_i); + XRCRG1_i = 0.0; + end + `endif + + if (IIMOD == 2) begin + if (BETAII0_i < 0.0) begin + $strobe("Warning: BETAII0_i = %e is negative.",BETAII0_i); + end + if (BETAII1_i < 0.0) begin + $strobe("Warning: BETAII1_i = %e is negative.", BETAII1_i); + end + if (BETAII2_i < 0.0) begin + $strobe("Warning: BETAII2_i = %e is negative.", BETAII2_i); + end + if (ESATII_i < 0.0) begin + $strobe("Warning: ESATII_i = %e is negative.", ESATII_i); end - end - if ($param_given(CGDO)) begin - CGDO_i = CGDO; - end else begin - if ($param_given(DLC) && DLC > 0.0) begin - CGDO_i = max(0.0, DLC * cox - CGDL_i); + if (LII_i < 0.0) begin + $strobe("Warning: LII_i = %e is negative.", LII_i); + end + if (SII1_i < 0.0) begin + $strobe("Warning: SII1_i = %e is negative.", SII1); + end + if (SII2_i < 0.0) begin + $strobe("Warning: SII2_i = %e is negative.", SII2_i); + end + if (SIID_i < 0.0) begin + $strobe("Warning: SIID_i = %e is negative.", SIID_i); + end + end + + if (EF <= 0.0) begin + $strobe("Fatal: EF = %e is non-positive.", EF); + $finish(0); + end else if (EF > 2.0) begin + $strobe("Fatal: EF = %e > 2.0.", EF); + $finish(0); + end + + if (LINTNOI >= (Leff / 2.0)) begin + $strobe("Warning: LINTNOI = %e is too large - Leff for noise is negative. Re-setting LINTNOI = 0.", LINTNOI); + LINTNOI_i = 0.0; + end else begin + LINTNOI_i = LINTNOI; + end + + if (NTNOI < 0) begin + $strobe("Warning: NTNOI = %e is negative. Set to zero.", NTNOI); + NTNOI_i = 0.0; + end else begin + NTNOI_i = NTNOI; + end + + // Self-Heating + `ifdef __SHMOD__ + if (SHMOD != 0 && RTH0 > 0.0) begin + T1y = WTH0; + if (BSHEXP != 0.0) begin + T1y = WTH0 * pow(NF, BSHEXP); + end + T2y = FPITCH; + if (ASHEXP != 0.0) begin + T2y = FPITCH * pow(NFINtotal, ASHEXP); + end + gth = (T1y + T2y)/ RTH0; + cth = CTH0 * (T1y + T2y); end else begin - CGDO_i = 0.3 * TFIN * cox; + gth = 1.0; + cth = 0.0; + end + `else + if (SHMOD != 0) begin + $strobe("Although the model selector SHMOD is set to 1, the self heating model is not activated in the Verilog-A code. Please uncomment \"`define __SHMOD__\" in bsimcmg.va to activate it."); + end + `endif + + // Gate Electrode Resistance + `ifdef __RGATEMOD__ + if (RGATEMOD != 0) begin + Rgeltd = (RGEXT / NGCON + (RGFIN * NFIN) / (NGCON == 2 ? 12.0 : 3.0)) / NF; + ggeltd = 1.0 / max(1.0e-3, Rgeltd); end - end - end - - // Parasitic Source/Drain to Gate Fringe Capacitance Model - if (CGEOMOD == 2) begin - if ($param_given(LSP)) - LSP_i = LSP; - else - LSP_i = 0.2*(L + XL); - Hg = TGATE + TMASK; - Trsd = 0.5 * (FPITCH - TFIN); - Wg = max(0.0, Trsd - TOXP); - Hrsd = max(0.0, HEPI + TSILI); - - // Top Component - if (TMASK > 0.0) begin - // Capacitance Model by Chung-Hsun Lin (IBM) - T0y = 3.467e-11 * lln(1.0e-7 * EPSRSP / (3.9 * LSP_i)); - T1y = 0.942 * Hrsd * epssp / LSP_i; - Cgg_top = (T0y + T1y) * (TFIN + (FPITCH - TFIN) * CRATIO); - end else begin - `Cfringe_2d(cfr_top_trigate, Hg, Hrsd, LSP_i, TFIN, LRSD, Lg, TOXP, 0.85, Cgg_top) - end - - // Side Component - if (TMASK > 0) begin - `Cfringe_2d(cfr_side_dblgate, Wg, Trsd, LSP_i, HFIN, LRSD, Lg, TOXP, 0.70, Cgg_side) - end else begin - `Cfringe_2d(cfr_side_trigate, Wg, Trsd, LSP_i, HFIN, LRSD, Lg, TOXP, 0.85, Cgg_side) - end - - // Corner Component - if (TMASK > 0.0) begin - Acorner = 0.0; - end else begin + `else + if (RGATEMOD != 0) + $strobe("Although the model selector RGATEMOD is set to 1, the gate electrode resistance model is not activated in the Verilog-A code. Please uncomment \"`define __RGATEMOD__\" in bsimcmg.va to activate it."); + `endif + + // Geometry-Dependent Source/Drain Resistance + if (RGEOMOD == 0) begin + RSourceGeo = RSHS * NRS; + RDrainGeo = RSHD * NRD; + end else begin + // Area and perimeter calculation if (HEPI > 0.0) begin - Acorner = (FPITCH - TFIN) * (HEPI * CRATIO + TSILI); + Arsd = FPITCH * HFIN + (TFIN + (FPITCH - TFIN) * CRATIO) * HEPI; + end else begin + Arsd = FPITCH * max(1.0e-9, HFIN + HEPI); + end + Prsd = FPITCH + DELTAPRSD; + + // Resistivity Calculation + if ($param_given(RHORSD)) begin + rhorsd = RHORSD; + end else begin + mu_max = (TYPE == `ntype) ? 1417.0 : 470.5; + if (TYPE == `ntype) begin + mu_rsd = (52.2 + (mu_max - 52.2) / (1.0 + pow(NSD / 9.68e22, 0.680)) - 43.4 / (1.0 + pow(3.43e26 / NSD, 2.0))) * 1.0e-4; + end else begin + mu_rsd = (44.9 + (mu_max - 44.9) / (1.0 + pow(NSD / 2.23e22, 0.719)) - 29.0 / (1.0 + pow(6.10e26 / NSD, 2.0))) * 1.0e-4; + end + rhorsd = 1.0 / (`q * NSD * mu_rsd); + end + + // Component: Spreading Resistance (extension -> hdd) + thetarsp = 55.0 * `M_PI / 180.0; + afin = min(Arsd, max(1.0e-18, TFIN * (HFIN + min(0.0, HEPI)))); + T1y = `COT(thetarsp); + Rsp = rhorsd * T1y / (sqrt(`M_PI) * NFIN) * (1.0 / sqrt(afin) - 2.0 / sqrt(Arsd) + sqrt(afin / (Arsd*Arsd))); + + // Component: Contact Resistance + arsd_total = Arsd * NFIN + ARSDEND; + prsd_total = Prsd * NFIN + PRSDEND; + lt = sqrt(RHOC * arsd_total / (rhorsd * prsd_total)); + alpha = LRSD / lt; + T0y = lexp(alpha + alpha); + + if (SDTERM == 1.0) begin + eta = rhorsd * lt / RHOC; + T1y = T0y * (1.0 + eta); + T2y = T1y + 1.0 - eta; + T3y = T1y - 1.0 + eta; + end else begin + T2y = T0y + 1.0; + T3y = T0y - 1.0; + end + RrsdTML = rhorsd * lt * T2y / (arsd_total * T3y); + + if (HEPI < -1.0e-10) begin + Rrsdside = RHOC / (-HEPI * TFIN * NFIN); + Rrsd = (RrsdTML + Rsp) * Rrsdside / ((RrsdTML + Rsp) + Rrsdside); + end else begin + Rrsd = RrsdTML + Rsp; + end + + Rdsgeo = Rrsd / NF * max(0.0, RGEOA + RGEOB * TFIN + RGEOC * FPITCH + RGEOD * LRSD + RGEOE * HEPI); + RSourceGeo = Rdsgeo; + RDrainGeo = Rdsgeo; + end + + // Clamping of Source/Drain Resistances + if (RSourceGeo <= 1.0e-3) begin + RSourceGeo = 1.0e-3; + end + + if (RDrainGeo <= 1.0e-3) begin + RDrainGeo = 1.0e-3; + end + + if (RDSMOD == 1) begin + if (RSWMIN_i <= 0.0) begin + RSWMIN_i = 0.0; + end + if (RDWMIN_i <= 0.0) begin + RDWMIN_i = 0.0; + end + if (RSW_i <= 0.0) begin + RSW_i = 0.0; + end + if (RDW_i <= 0.0) begin + RDW_i = 0.0; + end + end else begin + if (RDSWMIN_i <= 0.0) begin + RDSWMIN_i = 0.0; + end + if (RDSW_i <= 0.0) begin + RDSW_i = 0.0; + end + end // End of Clamping of Source/Drain Resistances + + if (CGEOMOD != 1) begin + if ($param_given(CGSO)) begin + CGSO_i = CGSO; + end else begin + if ($param_given(DLC) && DLC > 0.0) begin + CGSO_i = max(0.0, DLC * cox - CGSL_i); + end else begin + CGSO_i = 0.3 * TFIN * cox; + end + end + if ($param_given(CGDO)) begin + CGDO_i = CGDO; + end else begin + if ($param_given(DLC) && DLC > 0.0) begin + CGDO_i = max(0.0, DLC * cox - CGDL_i); + end else begin + CGDO_i = 0.3 * TFIN * cox; + end + end + end + + // Parasitic Source/Drain to Gate Fringe Capacitance Model + if (CGEOMOD == 2) begin + if ($param_given(LSP)) + LSP_i = LSP; + else + LSP_i = 0.2*(L + XL); + Hg = TGATE + TMASK; + Trsd = 0.5 * (FPITCH - TFIN); + Wg = max(0.0, Trsd - TOXP); + Hrsd = max(0.0, HEPI + TSILI); + + // Top Component + if (TMASK > 0.0) begin + // Capacitance Model by Chung-Hsun Lin (IBM) + T0y = 3.467e-11 * lln(1.0e-7 * EPSRSP / (3.9 * LSP_i)); + T1y = 0.942 * Hrsd * epssp / LSP_i; + Cgg_top = (T0y + T1y) * (TFIN + (FPITCH - TFIN) * CRATIO); + end else begin + `Cfringe_2d(cfr_top_trigate, Hg, Hrsd, LSP_i, TFIN, LRSD, Lg, TOXP, 0.85, Cgg_top) + end + + // Side Component + if (TMASK > 0) begin + `Cfringe_2d(cfr_side_dblgate, Wg, Trsd, LSP_i, HFIN, LRSD, Lg, TOXP, 0.70, Cgg_side) + end else begin + `Cfringe_2d(cfr_side_trigate, Wg, Trsd, LSP_i, HFIN, LRSD, Lg, TOXP, 0.85, Cgg_side) + end + + // Corner Component + if (TMASK > 0.0) begin + Acorner = 0.0; + end else begin + if (HEPI > 0.0) begin + Acorner = (FPITCH - TFIN) * (HEPI * CRATIO + TSILI); + end else begin + Acorner = (FPITCH - TFIN) * Hrsd; + end + end + Ccorner = (NFIN * Acorner + ARSDEND + ASILIEND) * epssp / LSP_i; + Cfr_geo = (Ccorner + Cgg_top * NFIN + CGEOE * Cgg_side * NFIN * 2.0) * NF; + Cfr_geo = Cfr_geo * max(0.0, CGEOA + CGEOB * TFIN + CGEOC * FPITCH + CGEOD * LRSD); + end + + // Source/Gate/Drain-to-Substrate Parasitic Capacitances + T0y = CSDESW * lln(1.0 + HFIN / EOTBOX); + csbox = cbox * ASEO + T0y * max(0.0, PSEO - FPITCH * NFINtotal); + cdbox = cbox * ADEO + T0y * max(0.0, PDEO - FPITCH * NFINtotal); + cgbox = (CGBO * NF * NGCON + CGBN * NFINtotal) * Lg; + + // Mobility Degradation + EeffFactor = 1.0e-8 / (epsratio * (EOT)); + WeffWRFactor = 1.0 / (pow((Weff0) * 1.0e6, WR_i) * NFINtotal); + litl = sqrt(epsratio * EOT * 0.5 * TFIN); + + if (!$param_given(THETASCE)) begin + tmp = DVT1_i * Leff / scl + 1.0e-6; + if (tmp < 40.0) begin + Theta_SCE = 0.5 / (cosh(tmp) - 1.0); + end else begin + Theta_SCE = exp(-tmp); + end + end else begin + Theta_SCE = THETASCE; + end + + if (!$param_given(THETASW)) begin + tmp = DVT1SS_i * Leff / scl + 1.0e-6; + if (tmp < 40.0) begin + Theta_SW = 0.5 / (cosh(tmp) - 1.0); + end else begin + Theta_SW = exp(-tmp); + end + end else begin + Theta_SW = THETASW; + end + + if (!$param_given(THETADIBL)) begin + tmp = DSUB_i * Leff / scl + 1.0e-6; + if (tmp < 40.0) begin + Theta_DIBL = 0.5 / (cosh(tmp) - 1.0); end else begin - Acorner = (FPITCH - TFIN) * Hrsd; + Theta_DIBL = exp(-tmp); end - end - Ccorner = (NFIN * Acorner + ARSDEND + ASILIEND) * epssp / LSP_i; - Cfr_geo = (Ccorner + Cgg_top * NFIN + CGEOE * Cgg_side * NFIN * 2.0) * NF; - Cfr_geo = Cfr_geo * max(0.0, CGEOA + CGEOB * TFIN + CGEOC * FPITCH + CGEOD * LRSD); - end - - // Source/Gate/Drain-to-Substrate Parasitic Capacitances - T0y = CSDESW * lln(1.0 + HFIN / EOTBOX); - csbox = cbox * ASEO + T0y * max(0.0, PSEO - FPITCH * NFINtotal); - cdbox = cbox * ADEO + T0y * max(0.0, PDEO - FPITCH * NFINtotal); - cgbox = (CGBO * NF * NGCON + CGBN * NFINtotal) * Lg; - - // Mobility Degradation - EeffFactor = 1.0e-8 / (epsratio * (EOT)); - WeffWRFactor = 1.0 / (pow((Weff0) * 1.0e6, WR_i) * NFINtotal); - litl = sqrt(epsratio * EOT * 0.5 * TFIN); - - if (!$param_given(THETASCE)) begin - tmp = DVT1_i * Leff / scl + 1.0e-6; - if (tmp < 40.0) begin - Theta_SCE = 0.5 / (cosh(tmp) - 1.0); - end else begin - Theta_SCE = exp(-tmp); - end - end else begin - Theta_SCE = THETASCE; - end - - if (!$param_given(THETASW)) begin - tmp = DVT1SS_i * Leff / scl + 1.0e-6; - if (tmp < 40.0) begin - Theta_SW = 0.5 / (cosh(tmp) - 1.0); - end else begin - Theta_SW = exp(-tmp); - end - end else begin - Theta_SW = THETASW; - end - - if (!$param_given(THETADIBL)) begin - tmp = DSUB_i * Leff / scl + 1.0e-6; - if (tmp < 40.0) begin - Theta_DIBL = 0.5 / (cosh(tmp) - 1.0); - end else begin - Theta_DIBL = exp(-tmp); - end - end else begin - Theta_DIBL = THETADIBL; - end - - Theta_RSCE = sqrt(1.0 + LPE0_i / Leff) - 1.0; - - tmp = DSUB_i * Leff / scl + 1.0e-6; - if (tmp < 40.0) begin - T0y = 1.0 / max((1.0 + DVTP2 * (cosh(tmp) - 2.0)), 1.0e-6); - end else begin - T0y = exp(-tmp) / max((exp(-tmp) + DVTP2), 1.0e-6); - end - - Theta_DITS = T0y; - nbody = NBODY_i; - qbs = `q * nbody * Ach / Cins; - - // Gate Current - if (TYPE == `ntype) begin - Aechvb = 4.97232e-7; // NMOS - Bechvb = 7.45669e11; // NMOS - end else begin - Aechvb = 3.42537e-7; // PMOS - Bechvb = 1.16645e12; // PMOS - end - - T0y = TOXG * TOXG; - T1y = TOXG * POXEDGE_i; - T2y = T1y * T1y; - Toxratio = lexp(NTOX_i * lln(TOXREF / TOXG)) / T0y; - Toxratioedge = lexp(NTOX_i * lln(TOXREF / T1y)) / T2y; - igsd_mult0 = Weff0 * Aechvb * Toxratioedge; - - if (TNOM < -`P_CELSIUS0) begin - $strobe("Warning: (TNOM=%e) < -`P_CELSIUS0. Set to 27 C.", TNOM); - Tnom = `REFTEMP; - end else begin - Tnom = TNOM + `CONSTCtoK; - end - end // initial_step - - // ************************************************ - // * Temperature Dependence Calculations * - // ************************************************ - `ifdef __SHMOD__ - if (SHMOD != 0 && RTH0 > 0.0) begin - DevTemp = $temperature + Temp(rth_branch) + DTEMP; - end else begin - `endif - DevTemp = $temperature + DTEMP; - `ifdef __SHMOD__ - end - `endif - - begin : CMGTempDepCalc - TRatio = DevTemp / Tnom; - delTemp = DevTemp - Tnom; - Vtm = `KboQ * DevTemp; - Vtm0 = `KboQ * Tnom; - Eg = BG0SUB - TBGASUB * DevTemp * DevTemp / (DevTemp + TBGBSUB); - Eg0 = BG0SUB - TBGASUB * Tnom * Tnom / (Tnom + TBGBSUB); - T1 = (DevTemp / 300.15) * sqrt(DevTemp / 300.15); - ni = NI0SUB * T1 * lexp(BG0SUB / (2.0 * `KboQ * 300.15) - Eg / (2.0 * Vtm)); - Nc = NC0SUB * T1; - ThetaSS = hypsmooth(1.0 + TSS_i * delTemp - 1.0e-6, 1.0e-3); - - // Quantum Mechanical Vth Correction (Ref: Trivedi et al., EDL 2005) - kT = Vtm * `q; - T0y = `HBAR * `M_PI / (2*Ach/Weff_UFCM ); - E0 = T0y * T0y / (2.0 * mx); - E0prime = T0y * T0y / (2.0 * mxprime); - E1 = 4.0 * E0; - E1prime = 4.0 * E0prime; - T1 = gprime * mdprime / (gfactor * md); - gam0 = 1.0 + T1 * lexp((E0 - E0prime) / kT); - gam1 = gam0 + lexp((E0 - E1) / kT) + T1 * lexp((E0 - E1prime) / kT); - T2 = -Vtm * lln(gfactor * md / (`M_PI * `HBAR * `HBAR * Nc) * kT / (2.0 * Ach / Weff_UFCM) * gam1); - dvch_qm = QMFACTOR_i * (E0 / `q + T2); - - // Temperature Dependence - ETA0_t = Tempdep(ETA0_i, TETA0, delTemp, TEMPMOD); - ETA0R_t = Tempdep(ETA0R_i, TETA0R, delTemp, TEMPMOD); - T1 = U0_i * pow(TRatio, UTE_i); - U0_t = T1 + hypmax(UTL_i * delTemp, -0.9 * T1, 1.0e-4); - u0 = U0_t; - if (ASYMMOD == 1) begin - T1 = U0R_i * pow(TRatio, UTER_i); - U0R_t = T1 + hypmax(UTLR_i * delTemp, -0.9 * T1, 1.0e-4); - u0r = U0R_t; - end - - ETAMOB_t = Tempdep(ETAMOB_i, EMOBT_i, delTemp, TEMPMOD); - UA_t = UA_i + hypmax(UA1_i*delTemp, -UA_i, 1.0e-6); - if (ASYMMOD != 0) begin - UAR_t = UAR_i + hypmax(UA1R_i * delTemp, -UAR_i, 1.0e-6); - end - - if (BULKMOD != 0) begin - if (TEMPMOD == 0) begin - UC_t = Tempdep(UC_i, UC1_i, delTemp, 0); - if (ASYMMOD != 0) begin - UCR_t = Tempdep(UCR_i, UC1R_i, delTemp, 0); + end else begin + Theta_DIBL = THETADIBL; + end + + Theta_RSCE = sqrt(1.0 + LPE0_i / Leff) - 1.0; + + tmp = DSUB_i * Leff / scl + 1.0e-6; + if (tmp < 40.0) begin + T0y = 1.0 / max((1.0 + DVTP2 * (cosh(tmp) - 2.0)), 1.0e-6); + end else begin + T0y = exp(-tmp) / max((exp(-tmp) + DVTP2), 1.0e-6); + end + + Theta_DITS = T0y; + nbody = NBODY_i; + qbs = `q * nbody * Ach / Cins; + + // Gate Current + if (TYPE == `ntype) begin + Aechvb = 4.97232e-7; // NMOS + Bechvb = 7.45669e11; // NMOS + end else begin + Aechvb = 3.42537e-7; // PMOS + Bechvb = 1.16645e12; // PMOS + end + + T0y = TOXG * TOXG; + T1y = TOXG * POXEDGE_i; + T2y = T1y * T1y; + Toxratio = lexp(NTOX_i * lln(TOXREF / TOXG)) / T0y; + Toxratioedge = lexp(NTOX_i * lln(TOXREF / T1y)) / T2y; + igsd_mult0 = Weff0 * Aechvb * Toxratioedge; + + if (TNOM < -`P_CELSIUS0) begin + $strobe("Warning: (TNOM=%e) < -`P_CELSIUS0. Set to 27 C.", TNOM); + Tnom = `REFTEMP; + end else begin + Tnom = TNOM + `CONSTCtoK; + end + end // initial_step + + // ************************************************ + // * Temperature Dependence Calculations * + // ************************************************ + `ifdef __SHMOD__ + if (SHMOD != 0 && RTH0 > 0.0) begin + DevTemp = $temperature + Temp(rth_branch) + DTEMP; + end else begin + `endif + DevTemp = $temperature + DTEMP; + `ifdef __SHMOD__ + end + `endif + + begin : CMGTempDepCalc + TRatio = DevTemp / Tnom; + delTemp = DevTemp - Tnom; + Vtm = `KboQ * DevTemp; + Vtm0 = `KboQ * Tnom; + Eg = BG0SUB - TBGASUB * DevTemp * DevTemp / (DevTemp + TBGBSUB); + Eg0 = BG0SUB - TBGASUB * Tnom * Tnom / (Tnom + TBGBSUB); + T1 = (DevTemp / 300.15) * sqrt(DevTemp / 300.15); + ni = NI0SUB * T1 * lexp(BG0SUB / (2.0 * `KboQ * 300.15) - Eg / (2.0 * Vtm)); + Nc = NC0SUB * T1; + ThetaSS = hypsmooth(1.0 + TSS_i * delTemp - 1.0e-6, 1.0e-3); + + // Quantum Mechanical Vth Correction (Ref: Trivedi et al., EDL 2005) + kT = Vtm * `q; + T0y = `HBAR * `M_PI / (2*Ach/Weff_UFCM ); + E0 = T0y * T0y / (2.0 * mx); + E0prime = T0y * T0y / (2.0 * mxprime); + E1 = 4.0 * E0; + E1prime = 4.0 * E0prime; + T1 = gprime * mdprime / (gfactor * md); + gam0 = 1.0 + T1 * lexp((E0 - E0prime) / kT); + gam1 = gam0 + lexp((E0 - E1) / kT) + T1 * lexp((E0 - E1prime) / kT); + T2 = -Vtm * lln(gfactor * md / (`M_PI * `HBAR * `HBAR * Nc) * kT / (2.0 * Ach / Weff_UFCM) * gam1); + dvch_qm = QMFACTOR_i * (E0 / `q + T2); + + // Temperature Dependence + ETA0_t = Tempdep(ETA0_i, TETA0, delTemp, TEMPMOD); + ETA0R_t = Tempdep(ETA0R_i, TETA0R, delTemp, TEMPMOD); + T1 = U0_i * pow(TRatio, UTE_i); + U0_t = T1 + hypmax(UTL_i * delTemp, -0.9 * T1, 1.0e-4); + u0 = U0_t; + if (ASYMMOD == 1) begin + T1 = U0R_i * pow(TRatio, UTER_i); + U0R_t = T1 + hypmax(UTLR_i * delTemp, -0.9 * T1, 1.0e-4); + u0r = U0R_t; + end + + ETAMOB_t = Tempdep(ETAMOB_i, EMOBT_i, delTemp, TEMPMOD); + UA_t = UA_i + hypmax(UA1_i*delTemp, -UA_i, 1.0e-6); + if (ASYMMOD != 0) begin + UAR_t = UAR_i + hypmax(UA1R_i * delTemp, -UAR_i, 1.0e-6); + end + + if (BULKMOD != 0) begin + if (TEMPMOD == 0) begin + UC_t = Tempdep(UC_i, UC1_i, delTemp, 0); + if (ASYMMOD != 0) begin + UCR_t = Tempdep(UCR_i, UC1R_i, delTemp, 0); + end + end else begin + UC_t = UC_i + UC1_i * delTemp; + if (ASYMMOD != 0) begin + UCR_t = UCR_i + UC1R_i * delTemp; + end + end + end + + UD_t = UD_i * pow(TRatio, UD1_i); + if (ASYMMOD != 0) begin + UDR_t = UDR_i * pow(TRatio, UD1R_i); + end + + UCS_t = UCS_i * pow(TRatio, UCSTE_i); + + rdstemp = hypsmooth(1.0 + PRT_i * delTemp - 1.0e-6, 1.0e-3); + RSDR_t = Tempdep(RSDR, TRSDR, delTemp, TEMPMOD); + if (ASYMMOD != 0) begin + RSDRR_t = Tempdep(RSDRR, TRSDR, delTemp, TEMPMOD); + end + + RDDR_t = Tempdep(RDDR, TRDDR, delTemp, TEMPMOD); + if (ASYMMOD != 0) begin + RDDRR_t = Tempdep(RDDRR, TRDDR, delTemp, TEMPMOD); + end + + VSAT_t = Tempdep(VSAT_i, -AT_i, delTemp, TEMPMOD); + if (VSAT_t < 1000) begin + $strobe("Warning: VSAT(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT_t); + VSAT_t = 1000; + end + + if (ASYMMOD != 0) begin + VSATR_t = Tempdep(VSATR_i, -ATR_i, delTemp, TEMPMOD); + if (VSATR_t < 1000) begin + $strobe("Warning: VSATR(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSATR_t); + VSATR_t = 1000; + end + end + + VSAT1_t = Tempdep(VSAT1_i, -AT_i, delTemp, TEMPMOD); + if (VSAT1_t < 1000) begin + $strobe("Warning: VSAT1(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT1_t); + VSAT1_t = 1000; + end + + if (ASYMMOD != 0) begin + VSAT1R_t = Tempdep(VSAT1R_i, -AT_i, delTemp, TEMPMOD); + if (VSAT1R_t < 1000) begin + $strobe("Warning: VSAT1R(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT1R_t); + VSAT1R_t = 1000; + end + end + + VSATCV_t = Tempdep(VSATCV_i, -ATCV_i, delTemp, TEMPMOD); + if (VSATCV_t < 1000) begin + $strobe("Warning: VSATCV(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSATCV_t); + VSATCV_t = 1000; + end + + MEXP_t = hypsmooth(MEXP_i * (1.0 + TMEXP * delTemp) - 2.0, 1.0e-3) + 2.0; + if (ASYMMOD != 0) begin + MEXPR_t = hypsmooth(MEXPR_i * (1.0 + TMEXPR * delTemp) - 2.0, 1.0e-3) + 2.0; + end + + PTWG_t = Tempdep(PTWG_i, -PTWGT_i, delTemp, TEMPMOD); + if (ASYMMOD != 0) begin + PTWGR_t = Tempdep(PTWGR_i, -PTWGT_i, delTemp, TEMPMOD); + end + + dvth_temp = (KT1_i + KT1L / Leff) * (TRatio - 1.0); + BETA0_t = BETA0_i * pow(TRatio, IIT_i); + SII0_t = SII0_i * (hypsmooth(1.0 + TII_i * (TRatio - 1.0) - 0.01, 1.0e-3) + 0.01); + + K0_t = K0_i + K01_i * delTemp; + K0SI_t = K0SI_i + hypmax(K0SI1_i * delTemp, -K0SI_i, 1.0e-6); + K2SI_t = K2SI_i + hypmax(K2SI1_i * delTemp, -K2SI_i, 1.0e-6); + K1_t = K1_i + hypmax(K11_i * delTemp, -K1_i, 1.0e-6); + K2SAT_t = K2SAT_i + K2SAT1_i * delTemp; + A1_t = A1_i + A11_i * delTemp; + A2_t = A2_i + A21_i * delTemp; + K2_t = K2_i + hypmax(K21_i * delTemp, -K2_i, 1.0e-6); + K0SISAT_t = K0SISAT_i + K0SISAT1_i * delTemp; + K2SISAT_t = K2SISAT_i + K2SISAT1_i * delTemp; + AIGBINV_t = AIGBINV_i + hypmax(AIGBINV1_i * delTemp, -AIGBINV_i, 1.0e-6); + AIGBACC_t = AIGBACC_i + hypmax(AIGBACC1_i * delTemp, -AIGBACC_i, 1.0e-6); + AIGC_t = AIGC_i + hypmax(AIGC1_i * delTemp, -AIGC_i, 1.0e-6); + AIGS_t = AIGS_i + hypmax(AIGS1_i * delTemp, -AIGS_i, 1.0e-6); + AIGD_t = AIGD_i + hypmax(AIGD1_i * delTemp, -AIGD_i, 1.0e-6); + BGIDL_t = BGIDL_i * hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3); + BGISL_t = BGISL_i * hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3); + ALPHA0_t = ALPHA0_i + hypmax(ALPHA01 * delTemp, -ALPHA0_i, 1.0e-6); + ALPHA1_t = ALPHA1_i + hypmax(ALPHA11 * delTemp, -ALPHA1_i, 1.0e-6); + ALPHAII0_t = ALPHAII0_i + hypmax(ALPHAII01 * delTemp, -ALPHAII0_i, 1.0e-25); + ALPHAII1_t = ALPHAII1_i + hypmax(ALPHAII11 * delTemp, -ALPHAII1_i, 1.0e-20); + igtemp = lexp(IGT_i * lln(TRatio)); + igsd_mult = igsd_mult0 * igtemp; + + if (BULKMOD != 0) begin + CJS_t = Tempdep(CJS, TCJ, delTemp, TEMPMOD); + CJD_t = Tempdep(CJD, TCJ, delTemp, TEMPMOD); + CJSWS_t = Tempdep(CJSWS, TCJSW, delTemp, TEMPMOD); + CJSWD_t = Tempdep(CJSWD, TCJSW, delTemp, TEMPMOD); + CJSWGS_t = Tempdep(CJSWGS, TCJSWG, delTemp, TEMPMOD); + CJSWGD_t = Tempdep(CJSWGD, TCJSWG, delTemp, TEMPMOD); + + PBS_t = hypsmooth(PBS - TPB * delTemp - 0.01, 1.0e-3) + 0.01; + PBD_t = hypsmooth(PBD - TPB * delTemp - 0.01, 1.0e-3) + 0.01; + PBSWS_t = hypsmooth(PBSWS - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01; + PBSWD_t = hypsmooth(PBSWD - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01; + PBSWGS_t = hypsmooth(PBSWGS - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01; + PBSWGD_t = hypsmooth(PBSWGD - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01; + + T0 = Eg0 / Vtm0 - Eg / Vtm; + T1 = lln(TRatio); + T3 = lexp((T0 + XTIS * T1) / NJS); + JSS_t = JSS * T3; + JSWS_t = JSWS * T3; + JSWGS_t = JSWGS * T3; + + T3 = lexp((T0 + XTID * T1) / NJD); + JSD_t = JSD * T3; + JSWD_t = JSWD * T3; + JSWGD_t = JSWGD * T3; + + JTSS_t = JTSS * lexp(Eg0 * XTSS * (TRatio - 1.0) / Vtm); + JTSD_t = JTSD * lexp(Eg0 * XTSD * (TRatio - 1.0) / Vtm); + JTSSWS_t = JTSSWS * lexp(Eg0 * XTSSWS * (TRatio - 1.0) / Vtm); + JTSSWD_t = JTSSWD * lexp(Eg0 * XTSSWD * (TRatio - 1.0) / Vtm); + JTSSWGS_t = JTSSWGS * (sqrt(JTWEFF / Weff0) + 1.0) * lexp(Eg0 * XTSSWGS * (TRatio - 1.0) / Vtm); + JTSSWGD_t = JTSSWGD * (sqrt(JTWEFF / Weff0) + 1.0) * lexp(Eg0 * XTSSWGD * (TRatio - 1.0) / Vtm); + + // All NJT's Smoothed to 0.01 to Prevent Divide-by-zero / Negative Values + NJTS_t = hypsmooth(NJTS * (1.0 + TNJTS * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; + NJTSD_t = hypsmooth(NJTSD * (1.0 + TNJTSD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; + NJTSSW_t = hypsmooth(NJTSSW * (1.0 + TNJTSSW * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; + NJTSSWD_t = hypsmooth(NJTSSWD * (1.0 + TNJTSSWD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; + NJTSSWG_t = hypsmooth(NJTSSWG * (1.0 + TNJTSSWG * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; + NJTSSWGD_t = hypsmooth(NJTSSWGD * (1.0 + TNJTSSWGD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; + end + + if (!$param_given(VFBSD)) begin + if (NGATE > 0.0) begin + vfbsd = devsign * (hypsmooth(0.5 * Eg - Vtm * lln(NGATE / ni), 1.0e-4) - (0.5 * Eg - devsign * (0.5 * Eg - hypsmooth(0.5 * Eg - Vtm * lln(NSD / ni), 1.0e-4)))); + end else begin + vfbsd = devsign * (PHIG_i - (EASUB + 0.5 * Eg - devsign * (0.5 * Eg - hypsmooth(0.5 * Eg - Vtm * lln(NSD / ni), 1.0e-4)))); + end + end else begin + vfbsd = VFBSD; + end + + if (!$param_given(VFBSDCV)) begin + vfbsdcv = vfbsd; + end else begin + vfbsdcv = VFBSDCV; + end + + `ifdef __SHMOD__ + if (SHMOD != 0 && RTH0 > 0.0) begin + T0 = Vtm * lln(nbody / ni); + phib = sqrt(T0 * T0 + 1.0e-6); + end else begin + phib = Vtm * lln(nbody / ni); end - end else begin - UC_t = UC_i + UC1_i * delTemp; - if (ASYMMOD != 0) begin - UCR_t = UCR_i + UC1R_i * delTemp; + `else + phib = Vtm * lln(nbody/ni); + `endif + + `ifdef __SHMOD__ + if (SHMOD != 0 && RTH0 > 0.0) begin + T0 = Vtm * lln(nbody * NSD / (ni * ni)); + vbi = sqrt(T0 * T0 + 1.0e-6); + end else begin + vbi = Vtm * lln(nbody * NSD / (ni * ni)); end - end - end - - UD_t = UD_i * pow(TRatio, UD1_i); - if (ASYMMOD != 0) begin - UDR_t = UDR_i * pow(TRatio, UD1R_i); - end - - UCS_t = UCS_i * pow(TRatio, UCSTE_i); - - rdstemp = hypsmooth(1.0 + PRT_i * delTemp - 1.0e-6, 1.0e-3); - RSDR_t = Tempdep(RSDR, TRSDR, delTemp, TEMPMOD); - if (ASYMMOD != 0) begin - RSDRR_t = Tempdep(RSDRR, TRSDR, delTemp, TEMPMOD); - end - - RDDR_t = Tempdep(RDDR, TRDDR, delTemp, TEMPMOD); - if (ASYMMOD != 0) begin - RDDRR_t = Tempdep(RDDRR, TRDDR, delTemp, TEMPMOD); - end - - VSAT_t = Tempdep(VSAT_i, -AT_i, delTemp, TEMPMOD); - if (VSAT_t < 1000) begin - $strobe("Warning: VSAT(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT_t); - VSAT_t = 1000; - end - - if (ASYMMOD != 0) begin - VSATR_t = Tempdep(VSATR_i, -ATR_i, delTemp, TEMPMOD); - if (VSATR_t < 1000) begin - $strobe("Warning: VSATR(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSATR_t); - VSATR_t = 1000; - end - end - - VSAT1_t = Tempdep(VSAT1_i, -AT_i, delTemp, TEMPMOD); - if (VSAT1_t < 1000) begin - $strobe("Warning: VSAT1(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT1_t); - VSAT1_t = 1000; - end - - if (ASYMMOD != 0) begin - VSAT1R_t = Tempdep(VSAT1R_i, -AT_i, delTemp, TEMPMOD); - if (VSAT1R_t < 1000) begin - $strobe("Warning: VSAT1R(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT1R_t); - VSAT1R_t = 1000; - end - end - - VSATCV_t = Tempdep(VSATCV_i, -ATCV_i, delTemp, TEMPMOD); - if (VSATCV_t < 1000) begin - $strobe("Warning: VSATCV(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSATCV_t); - VSATCV_t = 1000; - end - - MEXP_t = hypsmooth(MEXP_i * (1.0 + TMEXP * delTemp) - 2.0, 1.0e-3) + 2.0; - if (ASYMMOD != 0) begin - MEXPR_t = hypsmooth(MEXPR_i * (1.0 + TMEXPR * delTemp) - 2.0, 1.0e-3) + 2.0; - end - - PTWG_t = Tempdep(PTWG_i, -PTWGT_i, delTemp, TEMPMOD); - if (ASYMMOD != 0) begin - PTWGR_t = Tempdep(PTWGR_i, -PTWGT_i, delTemp, TEMPMOD); - end - - dvth_temp = (KT1_i + KT1L / Leff) * (TRatio - 1.0); - BETA0_t = BETA0_i * pow(TRatio, IIT_i); - SII0_t = SII0_i * (hypsmooth(1.0 + TII_i * (TRatio - 1.0) - 0.01, 1.0e-3) + 0.01); - - K0_t = K0_i + K01_i * delTemp; - K0SI_t = K0SI_i + hypmax(K0SI1_i * delTemp, -K0SI_i, 1.0e-6); - K2SI_t = K2SI_i + hypmax(K2SI1_i * delTemp, -K2SI_i, 1.0e-6); - K1_t = K1_i + hypmax(K11_i * delTemp, -K1_i, 1.0e-6); - K2SAT_t = K2SAT_i + K2SAT1_i * delTemp; - A1_t = A1_i + A11_i * delTemp; - A2_t = A2_i + A21_i * delTemp; - K2_t = K2_i + hypmax(K21_i * delTemp, -K2_i, 1.0e-6); - K0SISAT_t = K0SISAT_i + K0SISAT1_i * delTemp; - K2SISAT_t = K2SISAT_i + K2SISAT1_i * delTemp; - AIGBINV_t = AIGBINV_i + hypmax(AIGBINV1_i * delTemp, -AIGBINV_i, 1.0e-6); - AIGBACC_t = AIGBACC_i + hypmax(AIGBACC1_i * delTemp, -AIGBACC_i, 1.0e-6); - AIGC_t = AIGC_i + hypmax(AIGC1_i * delTemp, -AIGC_i, 1.0e-6); - AIGS_t = AIGS_i + hypmax(AIGS1_i * delTemp, -AIGS_i, 1.0e-6); - AIGD_t = AIGD_i + hypmax(AIGD1_i * delTemp, -AIGD_i, 1.0e-6); - BGIDL_t = BGIDL_i * hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3); - BGISL_t = BGISL_i * hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3); - ALPHA0_t = ALPHA0_i + hypmax(ALPHA01 * delTemp, -ALPHA0_i, 1.0e-6); - ALPHA1_t = ALPHA1_i + hypmax(ALPHA11 * delTemp, -ALPHA1_i, 1.0e-6); - ALPHAII0_t = ALPHAII0_i + hypmax(ALPHAII01 * delTemp, -ALPHAII0_i, 1.0e-25); - ALPHAII1_t = ALPHAII1_i + hypmax(ALPHAII11 * delTemp, -ALPHAII1_i, 1.0e-20); - igtemp = lexp(IGT_i * lln(TRatio)); - igsd_mult = igsd_mult0 * igtemp; - - if (BULKMOD != 0) begin - CJS_t = Tempdep(CJS, TCJ, delTemp, TEMPMOD); - CJD_t = Tempdep(CJD, TCJ, delTemp, TEMPMOD); - CJSWS_t = Tempdep(CJSWS, TCJSW, delTemp, TEMPMOD); - CJSWD_t = Tempdep(CJSWD, TCJSW, delTemp, TEMPMOD); - CJSWGS_t = Tempdep(CJSWGS, TCJSWG, delTemp, TEMPMOD); - CJSWGD_t = Tempdep(CJSWGD, TCJSWG, delTemp, TEMPMOD); - - PBS_t = hypsmooth(PBS - TPB * delTemp - 0.01, 1.0e-3) + 0.01; - PBD_t = hypsmooth(PBD - TPB * delTemp - 0.01, 1.0e-3) + 0.01; - PBSWS_t = hypsmooth(PBSWS - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01; - PBSWD_t = hypsmooth(PBSWD - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01; - PBSWGS_t = hypsmooth(PBSWGS - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01; - PBSWGD_t = hypsmooth(PBSWGD - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01; - - T0 = Eg0 / Vtm0 - Eg / Vtm; - T1 = lln(TRatio); - T3 = lexp((T0 + XTIS * T1) / NJS); - JSS_t = JSS * T3; - JSWS_t = JSWS * T3; - JSWGS_t = JSWGS * T3; - - T3 = lexp((T0 + XTID * T1) / NJD); - JSD_t = JSD * T3; - JSWD_t = JSWD * T3; - JSWGD_t = JSWGD * T3; - - JTSS_t = JTSS * lexp(Eg0 * XTSS * (TRatio - 1.0) / Vtm); - JTSD_t = JTSD * lexp(Eg0 * XTSD * (TRatio - 1.0) / Vtm); - JTSSWS_t = JTSSWS * lexp(Eg0 * XTSSWS * (TRatio - 1.0) / Vtm); - JTSSWD_t = JTSSWD * lexp(Eg0 * XTSSWD * (TRatio - 1.0) / Vtm); - JTSSWGS_t = JTSSWGS * (sqrt(JTWEFF / Weff0) + 1.0) * lexp(Eg0 * XTSSWGS * (TRatio - 1.0) / Vtm); - JTSSWGD_t = JTSSWGD * (sqrt(JTWEFF / Weff0) + 1.0) * lexp(Eg0 * XTSSWGD * (TRatio - 1.0) / Vtm); - - // All NJT's Smoothed to 0.01 to Prevent Divide-by-zero / Negative Values - NJTS_t = hypsmooth(NJTS * (1.0 + TNJTS * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; - NJTSD_t = hypsmooth(NJTSD * (1.0 + TNJTSD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; - NJTSSW_t = hypsmooth(NJTSSW * (1.0 + TNJTSSW * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; - NJTSSWD_t = hypsmooth(NJTSSWD * (1.0 + TNJTSSWD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; - NJTSSWG_t = hypsmooth(NJTSSWG * (1.0 + TNJTSSWG * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; - NJTSSWGD_t = hypsmooth(NJTSSWGD * (1.0 + TNJTSSWGD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01; - end - - if (!$param_given(VFBSD)) begin - if (NGATE > 0.0) begin - vfbsd = devsign * (hypsmooth(0.5 * Eg - Vtm * lln(NGATE / ni), 1.0e-4) - (0.5 * Eg - devsign * (0.5 * Eg - hypsmooth(0.5 * Eg - Vtm * lln(NSD / ni), 1.0e-4)))); - end else begin - vfbsd = devsign * (PHIG_i - (EASUB + 0.5 * Eg - devsign * (0.5 * Eg - hypsmooth(0.5 * Eg - Vtm * lln(NSD / ni), 1.0e-4)))); - end - end else begin - vfbsd = VFBSD; - end - - if (!$param_given(VFBSDCV)) begin - vfbsdcv = vfbsd; - end else begin - vfbsdcv = VFBSDCV; - end - - `ifdef __SHMOD__ - if (SHMOD != 0 && RTH0 > 0.0) begin - T0 = Vtm * lln(nbody / ni); - phib = sqrt(T0 * T0 + 1.0e-6); - end else begin - phib = Vtm * lln(nbody / ni); - end - `else - phib = Vtm * lln(nbody/ni); - `endif - - `ifdef __SHMOD__ - if (SHMOD != 0 && RTH0 > 0.0) begin - T0 = Vtm * lln(nbody * NSD / (ni * ni)); - vbi = sqrt(T0 * T0 + 1.0e-6); - end else begin + `else vbi = Vtm * lln(nbody * NSD / (ni * ni)); - end - `else - vbi = Vtm * lln(nbody * NSD / (ni * ni)); - `endif - - // deltaPhi definition and Polysilicon Depletion - // deltaPhi: workfunction difference between the gate and the n+ source. - deltaPhi = devsign*(PHIG_i - (EASUB + (TYPE == `ntype ? 0 : Eg))); - - // Mobility Degradation - eta_mu = 0.5 * ETAMOB_t; - eta_mu_cv = 0.5; - if ( TYPE != `ntype ) begin - eta_mu = 1.0 / 3.0 * ETAMOB_t; - eta_mu_cv = 1.0 / 3.0; - end - - // Junction Current and Capacitance - if (BULKMOD != 0) begin - // Source-Side Junction Current - Isbs = ASEJ * JSS_t + PSEJ * JSWS_t + TFIN * NFINtotal * JSWGS_t; - if (Isbs > 0.0) begin - Nvtms = Vtm * NJS; - XExpBVS = lexp(-BVS / Nvtms) * XJBVS; - T2 = max(IJTHSFWD / Isbs, 10.0); - Tb = 1.0 + T2 - XExpBVS; - VjsmFwd = Nvtms * lln(0.5 * (Tb + sqrt(Tb * Tb + 4.0 * XExpBVS))); - T0 = lexp(VjsmFwd / Nvtms); - IVjsmFwd = Isbs * (T0 - XExpBVS / T0 + XExpBVS - 1.0); - SslpFwd = Isbs * (T0 + XExpBVS / T0) / Nvtms; - T2 = hypsmooth(IJTHSREV / Isbs - 10.0, 1.0e-3) + 10.0; - VjsmRev = -BVS - Nvtms * lln((T2 - 1.0) / XJBVS); - T1 = XJBVS * lexp(-(BVS + VjsmRev) / Nvtms); - IVjsmRev = Isbs * (1.0 + T1); - SslpRev = -Isbs * T1 / Nvtms; - end - - // Drain-Side Junction Current - Isbd = ADEJ * JSD_t + PDEJ * JSWD_t + TFIN * NFINtotal * JSWGD_t; - if (Isbd > 0.0) begin - Nvtmd = Vtm * NJD; - XExpBVD = lexp(-BVD / Nvtmd) * XJBVD; - T2 = max(IJTHDFWD / Isbd, 10.0); - Tb = 1.0 + T2 - XExpBVD; - VjdmFwd = Nvtmd * lln(0.5 * (Tb + sqrt(Tb * Tb + 4.0 * XExpBVD))); - T0 = lexp(VjdmFwd / Nvtmd); - IVjdmFwd = Isbd * (T0 - XExpBVD / T0 + XExpBVD - 1.0); - DslpFwd = Isbd * (T0 + XExpBVD / T0) / Nvtmd; - T2 = hypsmooth(IJTHDREV / Isbd - 10.0, 1.0e-3) + 10.0; - VjdmRev = -BVD - Nvtmd * lln((T2 - 1.0) / XJBVD); - T1 = XJBVD * lexp(-(BVD + VjdmRev) / Nvtmd); - IVjdmRev = Isbd * (1.0 + T1); - DslpRev = -Isbd * T1 / Nvtmd; - end - - // Junction Capacitance - Czbs = CJS_t * ASEJ; - Czbssw = CJSWS_t * PSEJ; - Czbsswg = CJSWGS_t * Weff0 * NFINtotal; - Czbd = CJD_t * ADEJ; - Czbdsw = CJSWD_t * PDEJ; - Czbdswg = CJSWGD_t * Weff0 * NFINtotal; - end - - // Generation-Recombination Current - T0 = Eg / Vtm * (TRatio - 1.0); - T1 = T0 / NTGEN_i; - igentemp = lexp(T1); - - end // End of temperature dependent calculations - - // ************************************************ - // * Bias dependent calculations follow * - // ************************************************ - - // Load Terminal Voltages - vgs_noswap = devsign * V(`IntrinsicGate, si); - vds_noswap = devsign * V(di, si); - vgd_noswap = devsign * V(`IntrinsicGate, di); - ves_jct = devsign * V(e, si); - ved_jct = devsign * V(e, di); - vge = devsign * V(`IntrinsicGate, e); - - // Source-Drain Interchange - sigvds = 1.0; - if (vds_noswap < 0.0) begin - sigvds = -1.0; - vgs = vgs_noswap - vds_noswap; - vds = -1.0 * vds_noswap; - ves = ved_jct; - end else begin - vgs = vgs_noswap; - vds = vds_noswap; - ves = ves_jct; - end - vgsfb = vgs - deltaPhi; - - // Initialize Certain Variables to Zero to Prevent Unnecessary Update - etaiv = 0.0; - Qes = 0.0; - Qesj = 0.0; - Qeg = 0.0; - Qed = 0.0; - Qedj = 0.0; - - // Vds Smoothing - vdsx = sqrt (vds * vds + 0.01) - 0.1; - - // Ves Smoothing - if (BULKMOD != 0) begin - vesx = ves - 0.5 * (vds - vdsx); - vesmax = 0.95 * PHIBE_i; - T2 = vesmax - vesx - 1.0e-3; - veseff = vesmax - 0.5 * (T2 + sqrt(T2 * T2 + 0.004 * vesmax)); - end - - // Asymmetry Model - T0 = tanh(0.6 * vds_noswap / Vtm); - wf = 0.5 + 0.5 * T0; - wr = 1.0 - wf; - if (ASYMMOD != 0) begin - CDSCD_a = CDSCDR_i * wr + CDSCD_i * wf; - ETA0_a = ETA0R_t * wr + ETA0_t * wf; - PDIBL1_a = PDIBL1R_i * wr + PDIBL1_i * wf; - PDIBL2_a = PDIBL2R_i * wr + PDIBL2_i * wf; - MEXP_a = MEXPR_t * wr + MEXP_t * wf; - PTWG_a = PTWGR_t * wr + PTWG_t * wf; - VSAT1_a = VSAT1R_t * wr + VSAT1_t * wf; - RSDR_a = RSDRR_t * wr + RSDR_t * wf; - RDDR_a = RDDRR_t * wr + RDDR_t * wf; - PCLM_a = PCLMR_i * wr + PCLM_i * wf; - VSAT_a = VSATR_t * wr + VSAT_t * wf; - KSATIV_a = KSATIVR_i * wr + KSATIV_i * wf; - DVTSHIFT_a = DVTSHIFTR_i * wr + DVTSHIFT_i * wf; - CIT_a = CITR_i * wr + CIT_i * wf; - u0_a = u0r * wr + u0 * wf; - UA_a = UAR_t*wr + UA_t * wf; - UD_a = UDR_t * wr + UD_t * wf; - UC_a = UCR_t * wr + UC_t * wf; - EU_a = EUR_i * wr + EU_i * wf; - end else begin - CDSCD_a = CDSCD_i; - ETA0_a = ETA0_t; - PDIBL1_a = PDIBL1_i; - PDIBL2_a = PDIBL2_i; - MEXP_a = MEXP_t; - PTWG_a = PTWG_t; - VSAT1_a = VSAT1_t; - RSDR_a = RSDR_t; - RDDR_a = RDDR_t; - PCLM_a = PCLM_i; - VSAT_a = VSAT_t; - KSATIV_a = KSATIV_i; - DVTSHIFT_a = DVTSHIFT_i; - CIT_a = CIT_i; - u0_a = u0; - UA_a = UA_t; - UD_a = UD_t; - UC_a = UC_t; - EU_a = EU_i; - end - - // Drain Saturation Voltage - inv_MEXP = 1.0 / MEXP_a; - - // SCE, DIBL, SS Degradation Effects (Ref: BSIM4 Model) - phist = 0.4 + phib + PHIN_i; - T1 = 2.0 * (Cins / Weff_UFCM) / (rc + 2.0); - cdsc = Theta_SW * (CDSC_i + CDSCD_a * vdsx); - - if (!$param_given(NVTM)) - nVtm = Vtm * ThetaSS * (1.0 + (CIT_a + cdsc) / T1); - else nVtm = NVTM; - - // temp deped UFCM - qdep = Qdep_ov_Cins / nVtm; - vth_fixed_factor_SI = ln(Cins * nVtm/(`q * Nc * 2.0 * Ach)); - vth_fixed_factor_Sub = ln((qdep * rc) * (qdep * rc) / ((exp(qdep * rc) - qdep * rc - 1.0))) + vth_fixed_factor_SI; - q0 = 10.0 * nVtm / rc + 2.0 * qbs; - - // New QM parameter calculation: fieldnormalizationfactor, auxQMfact, QMFACTORCVfinal - fieldnormalizationfactor = Vtm * Cins / (Weff_UFCM * epssub); - auxQMfact = pow(((3.0 / 4.0) * 3.0 * `HBAR * 2.0 * `M_PI * `q / (4.0 * sqrt(2.0 * mx))), 2.0 / 3.0); - QMFACTORCVfinal = QMFACTORCV * auxQMfact * pow(fieldnormalizationfactor, 2.0 / 3.0) * (1/(`q * Vtm)); - - dvth_vtroll = -DVT0_i * Theta_SCE * (vbi - phist); - dvth_dibl = -ETA0_a * Theta_DIBL * vdsx + (DVTP0_i * Theta_DITS * pow(vdsx, DVTP1_i)); - dvth_rsce = K1RSCE_i * Theta_RSCE * sqrt(phist); - dvth_all = dvth_vtroll + dvth_dibl + dvth_rsce + dvth_temp + DVTSHIFT_a; - vgsfb = vgsfb - dvth_all; - - // Vgs Clamping for Inversion Region Calculation in Accumulation - beta0 = u0_a * cox * Weff0 / Leff; - T0 = -(dvch_qm + nVtm * lln(2.0 * cox * Imin / (beta0 * nVtm * `q * Nc * TFIN))); - T1 = vgsfb + T0 + DELVTRAND; - vgsfbeff = hypsmooth(T1 , 1.0e-4) - T0; - - // Core Model Calculation at Source Side - vch = 0.0 + dvch_qm; - - if (BULKMOD != 0) begin - T1 = hypsmooth(2.0 * phib + vch - ves, 0.1); - T3 = (-K1_t / (2.0 * nVtm)) * (sqrt(T1) - sqrt(2.0 * phib)); - T0 = -qdep - T3 + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0/3.0); - T1 = -qdep - T3 + vth_fixed_factor_SI; - end else begin - T0 = -qdep + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0/3.0); - T1 = -qdep + vth_fixed_factor_SI; - end - T2 = (vgsfbeff - vch) / nVtm; - F0 = -T2 + T1; - T3 = 0.5 * (T2 - T0); - qm = exp(T3); - if (qm > 1.0e-7) begin - T7 = ln(1.0 + qm); - qm = 2.0 * (1.0 - sqrt(1.0 + T7 * T7)); - T8 = (qm * ALPHA_UFCM + qdep) * rc; - T4 = T8 / (exp(T8) - T8 - 1.0); - T5 = T8 * T4; - e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0 / 3.0); - e1 = -1.0 + 1.0 / qm + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0 / 3.0); - e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0/3.0); - qm = qm - (e0 / e1) * (1.0 + (e0 * e2) / (2.0 * e1 * e1)); - T8 = (qm * ALPHA_UFCM + qdep) * rc; - T4 = T8 / (exp(T8) - T8 - 1.0); - T5 = T8 * T4; - e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0 / 3.0); - e1 = -1.0 + 1.0 / qm + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0/3.0); - e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0/3.0); - qm = qm - (e0 / e1) * (1.0 + (e0 * e2) / (2.0 * e1 * e1)); - end else begin - qm = -qm * qm; - end - qis = -qm * nVtm; - - // Drain Saturation Voltage - Eeffs = EeffFactor * (qbs + eta_mu * qis); - qb0 = 1.0e-2 / cox; - T2 = pow(0.5 * (1.0 + abs((qis) / qb0)), UCS_t); - if (BULKMOD != 0) begin - T3 = (UA_a + UC_a * veseff) * pow(abs(Eeffs), EU_a) + UD_a / T2; - end else begin - T3 = UA_a * pow(abs(Eeffs), EU_a) + UD_a / T2; - end - Dmobs = 1.0 + T3; - Dmobs = Dmobs / U0MULT; - - if (RDSMOD == 1) begin - Rdss = 0.0; - end else if (RDSMOD == 0) begin - T4 = 1.0 + PRWGS_i * qis; - T1 = 1.0 / T4; - T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01)); - Rdss = (RDSWMIN_i + RDSW_i * T0) * WeffWRFactor * NFINtotal * rdstemp; - end else begin - T4 = 1.0 + PRWGS_i * qis; - T1 = 1.0 / T4; - T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01)); - Rdss = (RSourceGeo + RDrainGeo + RDSWMIN_i + RDSW_i * T0) * WeffWRFactor * NFINtotal * rdstemp; - end - - Esat = 2.0 * VSAT_a / u0_a * Dmobs; - EsatL = Esat * Leff; - T6 = KSATIV_a * (qis + 2 * Vtm); - - if (Rdss == 0.0) begin - Vdsat = EsatL * T6 / (EsatL + T6); - end else begin - WVCox = Weff0 * VSAT_a * cox; - T0 = WVCox * Rdss; - Ta = 2.0 * T0; - Tb = T6 + EsatL + 3.0 * T6 * T0; - Tc = T6 * (EsatL + 2.0 * T6 * T0); - Vdsat = (Tb - sqrt(Tb * Tb - 2.0 * Ta * Tc)) / Ta; - end - Vdsat = hypsmooth(Vdsat - 1.0e-3, 1.0e-5) + 1.0e-3; - T7 = pow(vds / Vdsat , MEXP_a); - T8 = pow(1.0 + T7, inv_MEXP); - Vdseff = vds / T8; - - if (Vdseff > vds) begin - Vdseff = vds; - end - - // Core Model Calculation at Drain Side - vch = Vdseff + dvch_qm; - - if (BULKMOD != 0) begin - T1 = hypsmooth(2.0 * phib + vch - ves, 0.1); - T3 = (-K1_t / (2.0 * nVtm)) * (sqrt(T1) - sqrt(2.0 * phib)); - T0 = -qdep - T3 + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0 / 3.0); - T1 = -qdep - T3 + vth_fixed_factor_SI; - end else begin - T0 = -qdep + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0 / 3.0); - T1 = -qdep + vth_fixed_factor_SI; - end - T2 = (vgsfbeff - vch) / nVtm; - F0 = -T2 + T1; - T3 = (T2 - T0) * 0.5; - qm = exp(T3); - if (qm > 1.0e-7) begin - T7 = ln(1.0 + qm); - qm = 2.0 * (1.0 - sqrt(1.0 + T7 * T7)); - T8 = (qm * ALPHA_UFCM + qdep) * rc; - T4 = T8 / (exp(T8) - T8 - 1.0); - T5 = T8 * T4; - e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0 / 3.0); - e1 = -1.0 + (1.0 / qm) + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0 / 3.0); - e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0 / 3.0); - qm = qm - (e0 / e1)*(1.0 + (e0 * e2) / (2.0 * e1 * e1)); - T8 = (qm * ALPHA_UFCM + qdep) * rc; - T4 = T8 / (exp(T8) - T8 - 1.0); - T5 = T8 * T4; - e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0/3.0); - e1 = -1.0 + (1.0 / qm) + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0 / 3.0); - e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0 / 3.0); - qm = qm - (e0 / e1) * (1.0 + (e0 * e2) / (2.0 * e1 * e1)); - end else begin - qm = -qm * qm; - end - qid = -qm * nVtm; - - if (BULKMOD != 0) begin - T9 = (K1_t / (2.0 * nVtm)) * sqrt(Vtm); - T0 = T9 / 2.0; - T2 = (vge - (deltaPhi - Eg - Vtm * ln(NBODY / Nc) + DELVFBACC)) / Vtm; - if ((T2 * Vtm) > phib + T9 * sqrt(phib * Vtm)) begin - T1 = sqrt(T2 - 1.0 + T0 * T0) - T0; - T10 = 1.0 + T1 * T1; - end else begin - T3 = T2 * 0.5 - 3.0 * (1.0 + T9 / sqrt(2.0)); - T10 = T3 + sqrt(T3 * T3 + 6.0 * T2); - if (T2 < 0.0) begin - T4 = (T2 - T10) / T9; - T10 = -ln(1.0 - T10 + T4 * T4 ); - end else begin - T11 = exp(-T10); - T4 = sqrt(T2 - 1.0 + T11 + T0 * T0) - T0; - T10 = 1.0 - T11 + T4 * T4; - end - end - T6 = exp(-T10) - 1.0; - T7 = sqrt(T6 + T10); - if (T10 > 1.0e-15) begin + `endif + + // deltaPhi definition and Polysilicon Depletion + // deltaPhi: workfunction difference between the gate and the n+ source. + deltaPhi = devsign*(PHIG_i - (EASUB + (TYPE == `ntype ? 0 : Eg))); + + // Mobility Degradation + eta_mu = 0.5 * ETAMOB_t; + eta_mu_cv = 0.5; + if ( TYPE != `ntype ) begin + eta_mu = 1.0 / 3.0 * ETAMOB_t; + eta_mu_cv = 1.0 / 3.0; + end + + // Junction Current and Capacitance + if (BULKMOD != 0) begin + // Source-Side Junction Current + Isbs = ASEJ * JSS_t + PSEJ * JSWS_t + TFIN * NFINtotal * JSWGS_t; + if (Isbs > 0.0) begin + Nvtms = Vtm * NJS; + XExpBVS = lexp(-BVS / Nvtms) * XJBVS; + T2 = max(IJTHSFWD / Isbs, 10.0); + Tb = 1.0 + T2 - XExpBVS; + VjsmFwd = Nvtms * lln(0.5 * (Tb + sqrt(Tb * Tb + 4.0 * XExpBVS))); + T0 = lexp(VjsmFwd / Nvtms); + IVjsmFwd = Isbs * (T0 - XExpBVS / T0 + XExpBVS - 1.0); + SslpFwd = Isbs * (T0 + XExpBVS / T0) / Nvtms; + T2 = hypsmooth(IJTHSREV / Isbs - 10.0, 1.0e-3) + 10.0; + VjsmRev = -BVS - Nvtms * lln((T2 - 1.0) / XJBVS); + T1 = XJBVS * lexp(-(BVS + VjsmRev) / Nvtms); + IVjsmRev = Isbs * (1.0 + T1); + SslpRev = -Isbs * T1 / Nvtms; + end + + // Drain-Side Junction Current + Isbd = ADEJ * JSD_t + PDEJ * JSWD_t + TFIN * NFINtotal * JSWGD_t; + if (Isbd > 0.0) begin + Nvtmd = Vtm * NJD; + XExpBVD = lexp(-BVD / Nvtmd) * XJBVD; + T2 = max(IJTHDFWD / Isbd, 10.0); + Tb = 1.0 + T2 - XExpBVD; + VjdmFwd = Nvtmd * lln(0.5 * (Tb + sqrt(Tb * Tb + 4.0 * XExpBVD))); + T0 = lexp(VjdmFwd / Nvtmd); + IVjdmFwd = Isbd * (T0 - XExpBVD / T0 + XExpBVD - 1.0); + DslpFwd = Isbd * (T0 + XExpBVD / T0) / Nvtmd; + T2 = hypsmooth(IJTHDREV / Isbd - 10.0, 1.0e-3) + 10.0; + VjdmRev = -BVD - Nvtmd * lln((T2 - 1.0) / XJBVD); + T1 = XJBVD * lexp(-(BVD + VjdmRev) / Nvtmd); + IVjdmRev = Isbd * (1.0 + T1); + DslpRev = -Isbd * T1 / Nvtmd; + end + + // Junction Capacitance + Czbs = CJS_t * ASEJ; + Czbssw = CJSWS_t * PSEJ; + Czbsswg = CJSWGS_t * Weff0 * NFINtotal; + Czbd = CJD_t * ADEJ; + Czbdsw = CJSWD_t * PDEJ; + Czbdswg = CJSWGD_t * Weff0 * NFINtotal; + end + + // Generation-Recombination Current + T0 = Eg / Vtm * (TRatio - 1.0); + T1 = T0 / NTGEN_i; + igentemp = lexp(T1); + + end // End of temperature dependent calculations + + // ************************************************ + // * Bias dependent calculations follow * + // ************************************************ + + // Load Terminal Voltages + vgs_noswap = devsign * V(`IntrinsicGate, si); + vds_noswap = devsign * V(di, si); + vgd_noswap = devsign * V(`IntrinsicGate, di); + ves_jct = devsign * V(e, si); + ved_jct = devsign * V(e, di); + vge = devsign * V(`IntrinsicGate, e); + + // Source-Drain Interchange + sigvds = 1.0; + if (vds_noswap < 0.0) begin + sigvds = -1.0; + vgs = vgs_noswap - vds_noswap; + vds = -1.0 * vds_noswap; + ves = ved_jct; + end else begin + vgs = vgs_noswap; + vds = vds_noswap; + ves = ves_jct; + end + vgsfb = vgs - deltaPhi; + + // Initialize Certain Variables to Zero to Prevent Unnecessary Update + etaiv = 0.0; + Qes = 0.0; + Qesj = 0.0; + Qeg = 0.0; + Qed = 0.0; + Qedj = 0.0; + + // Vds Smoothing + vdsx = sqrt (vds * vds + 0.01) - 0.1; + + // Ves Smoothing + if (BULKMOD != 0) begin + vesx = ves - 0.5 * (vds - vdsx); + vesmax = 0.95 * PHIBE_i; + T2 = vesmax - vesx - 1.0e-3; + veseff = vesmax - 0.5 * (T2 + sqrt(T2 * T2 + 0.004 * vesmax)); + end + + // Asymmetry Model + T0 = tanh(0.6 * vds_noswap / Vtm); + wf = 0.5 + 0.5 * T0; + wr = 1.0 - wf; + if (ASYMMOD != 0) begin + CDSCD_a = CDSCDR_i * wr + CDSCD_i * wf; + ETA0_a = ETA0R_t * wr + ETA0_t * wf; + PDIBL1_a = PDIBL1R_i * wr + PDIBL1_i * wf; + PDIBL2_a = PDIBL2R_i * wr + PDIBL2_i * wf; + MEXP_a = MEXPR_t * wr + MEXP_t * wf; + PTWG_a = PTWGR_t * wr + PTWG_t * wf; + VSAT1_a = VSAT1R_t * wr + VSAT1_t * wf; + RSDR_a = RSDRR_t * wr + RSDR_t * wf; + RDDR_a = RDDRR_t * wr + RDDR_t * wf; + PCLM_a = PCLMR_i * wr + PCLM_i * wf; + VSAT_a = VSATR_t * wr + VSAT_t * wf; + KSATIV_a = KSATIVR_i * wr + KSATIV_i * wf; + DVTSHIFT_a = DVTSHIFTR_i * wr + DVTSHIFT_i * wf; + CIT_a = CITR_i * wr + CIT_i * wf; + u0_a = u0r * wr + u0 * wf; + UA_a = UAR_t*wr + UA_t * wf; + UD_a = UDR_t * wr + UD_t * wf; + UC_a = UCR_t * wr + UC_t * wf; + EU_a = EUR_i * wr + EU_i * wf; + end else begin + CDSCD_a = CDSCD_i; + ETA0_a = ETA0_t; + PDIBL1_a = PDIBL1_i; + PDIBL2_a = PDIBL2_i; + MEXP_a = MEXP_t; + PTWG_a = PTWG_t; + VSAT1_a = VSAT1_t; + RSDR_a = RSDR_t; + RDDR_a = RDDR_t; + PCLM_a = PCLM_i; + VSAT_a = VSAT_t; + KSATIV_a = KSATIV_i; + DVTSHIFT_a = DVTSHIFT_i; + CIT_a = CIT_i; + u0_a = u0; + UA_a = UA_t; + UD_a = UD_t; + UC_a = UC_t; + EU_a = EU_i; + end + + // Drain Saturation Voltage + inv_MEXP = 1.0 / MEXP_a; + + // SCE, DIBL, SS Degradation Effects (Ref: BSIM4 Model) + phist = 0.4 + phib + PHIN_i; + T1 = 2.0 * (Cins / Weff_UFCM) / (rc + 2.0); + cdsc = Theta_SW * (CDSC_i + CDSCD_a * vdsx); + + if (!$param_given(NVTM)) + nVtm = Vtm * ThetaSS * (1.0 + (CIT_a + cdsc) / T1); + else nVtm = NVTM; + + // temp deped UFCM + qdep = Qdep_ov_Cins / nVtm; + vth_fixed_factor_SI = ln(Cins * nVtm/(`q * Nc * 2.0 * Ach)); + vth_fixed_factor_Sub = ln((qdep * rc) * (qdep * rc) / ((exp(qdep * rc) - qdep * rc - 1.0))) + vth_fixed_factor_SI; + q0 = 10.0 * nVtm / rc + 2.0 * qbs; + + // New QM parameter calculation: fieldnormalizationfactor, auxQMfact, QMFACTORCVfinal + fieldnormalizationfactor = Vtm * Cins / (Weff_UFCM * epssub); + auxQMfact = pow(((3.0 / 4.0) * 3.0 * `HBAR * 2.0 * `M_PI * `q / (4.0 * sqrt(2.0 * mx))), 2.0 / 3.0); + QMFACTORCVfinal = QMFACTORCV * auxQMfact * pow(fieldnormalizationfactor, 2.0 / 3.0) * (1/(`q * Vtm)); + + dvth_vtroll = -DVT0_i * Theta_SCE * (vbi - phist); + dvth_dibl = -ETA0_a * Theta_DIBL * vdsx + (DVTP0_i * Theta_DITS * pow(vdsx, DVTP1_i)); + dvth_rsce = K1RSCE_i * Theta_RSCE * sqrt(phist); + dvth_all = dvth_vtroll + dvth_dibl + dvth_rsce + dvth_temp + DVTSHIFT_a; + vgsfb = vgsfb - dvth_all; + + // Vgs Clamping for Inversion Region Calculation in Accumulation + beta0 = u0_a * cox * Weff0 / Leff; + T0 = -(dvch_qm + nVtm * lln(2.0 * cox * Imin / (beta0 * nVtm * `q * Nc * TFIN))); + T1 = vgsfb + T0 + DELVTRAND; + vgsfbeff = hypsmooth(T1 , 1.0e-4) - T0; + + // Core Model Calculation at Source Side + vch = 0.0 + dvch_qm; + + if (BULKMOD != 0) begin + T1 = hypsmooth(2.0 * phib + vch - ves, 0.1); + T3 = (-K1_t / (2.0 * nVtm)) * (sqrt(T1) - sqrt(2.0 * phib)); + T0 = -qdep - T3 + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0/3.0); + T1 = -qdep - T3 + vth_fixed_factor_SI; + end else begin + T0 = -qdep + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0/3.0); + T1 = -qdep + vth_fixed_factor_SI; + end + T2 = (vgsfbeff - vch) / nVtm; + F0 = -T2 + T1; + T3 = 0.5 * (T2 - T0); + qm = exp(T3); + if (qm > 1.0e-7) begin + T7 = ln(1.0 + qm); + qm = 2.0 * (1.0 - sqrt(1.0 + T7 * T7)); + T8 = (qm * ALPHA_UFCM + qdep) * rc; + T4 = T8 / (exp(T8) - T8 - 1.0); + T5 = T8 * T4; + e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0 / 3.0); + e1 = -1.0 + 1.0 / qm + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0 / 3.0); + e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0/3.0); + qm = qm - (e0 / e1) * (1.0 + (e0 * e2) / (2.0 * e1 * e1)); + T8 = (qm * ALPHA_UFCM + qdep) * rc; + T4 = T8 / (exp(T8) - T8 - 1.0); + T5 = T8 * T4; + e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0 / 3.0); + e1 = -1.0 + 1.0 / qm + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0/3.0); + e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0/3.0); + qm = qm - (e0 / e1) * (1.0 + (e0 * e2) / (2.0 * e1 * e1)); + end else begin + qm = -qm * qm; + end + qis = -qm * nVtm; + + // Drain Saturation Voltage + Eeffs = EeffFactor * (qbs + eta_mu * qis); + qb0 = 1.0e-2 / cox; + T2 = pow(0.5 * (1.0 + abs((qis) / qb0)), UCS_t); + if (BULKMOD != 0) begin + T3 = (UA_a + UC_a * veseff) * pow(abs(Eeffs), EU_a) + UD_a / T2; + end else begin + T3 = UA_a * pow(abs(Eeffs), EU_a) + UD_a / T2; + end + Dmobs = 1.0 + T3; + Dmobs = Dmobs / U0MULT; + + if (RDSMOD == 1) begin + Rdss = 0.0; + end else if (RDSMOD == 0) begin + T4 = 1.0 + PRWGS_i * qis; + T1 = 1.0 / T4; + T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01)); + Rdss = (RDSWMIN_i + RDSW_i * T0) * WeffWRFactor * NFINtotal * rdstemp; + end else begin + T4 = 1.0 + PRWGS_i * qis; + T1 = 1.0 / T4; + T0 = 0.5 * (T1 + sqrt(T1 * T1 + 0.01)); + Rdss = (RSourceGeo + RDrainGeo + RDSWMIN_i + RDSW_i * T0) * WeffWRFactor * NFINtotal * rdstemp; + end + + Esat = 2.0 * VSAT_a / u0_a * Dmobs; + EsatL = Esat * Leff; + T6 = KSATIV_a * (qis + 2 * Vtm); + + if (Rdss == 0.0) begin + Vdsat = EsatL * T6 / (EsatL + T6); + end else begin + WVCox = Weff0 * VSAT_a * cox; + T0 = WVCox * Rdss; + Ta = 2.0 * T0; + Tb = T6 + EsatL + 3.0 * T6 * T0; + Tc = T6 * (EsatL + 2.0 * T6 * T0); + Vdsat = (Tb - sqrt(Tb * Tb - 2.0 * Ta * Tc)) / Ta; + end + Vdsat = hypsmooth(Vdsat - 1.0e-3, 1.0e-5) + 1.0e-3; + T7 = pow(vds / Vdsat , MEXP_a); + T8 = pow(1.0 + T7, inv_MEXP); + Vdseff = vds / T8; + + if (Vdseff > vds) begin + Vdseff = vds; + end + + // Core Model Calculation at Drain Side + vch = Vdseff + dvch_qm; + + if (BULKMOD != 0) begin + T1 = hypsmooth(2.0 * phib + vch - ves, 0.1); + T3 = (-K1_t / (2.0 * nVtm)) * (sqrt(T1) - sqrt(2.0 * phib)); + T0 = -qdep - T3 + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0 / 3.0); + T1 = -qdep - T3 + vth_fixed_factor_SI; + end else begin + T0 = -qdep + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0 / 3.0); + T1 = -qdep + vth_fixed_factor_SI; + end + T2 = (vgsfbeff - vch) / nVtm; + F0 = -T2 + T1; + T3 = (T2 - T0) * 0.5; + qm = exp(T3); + if (qm > 1.0e-7) begin + T7 = ln(1.0 + qm); + qm = 2.0 * (1.0 - sqrt(1.0 + T7 * T7)); + T8 = (qm * ALPHA_UFCM + qdep) * rc; + T4 = T8 / (exp(T8) - T8 - 1.0); + T5 = T8 * T4; + e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0 / 3.0); + e1 = -1.0 + (1.0 / qm) + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0 / 3.0); + e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0 / 3.0); + qm = qm - (e0 / e1)*(1.0 + (e0 * e2) / (2.0 * e1 * e1)); + T8 = (qm * ALPHA_UFCM + qdep) * rc; + T4 = T8 / (exp(T8) - T8 - 1.0); + T5 = T8 * T4; + e0 = F0 - qm + ln(-qm) + ln(T5) + QMFACTORCVfinal * pow(-(qm + qdep), 2.0/3.0); + e1 = -1.0 + (1.0 / qm) + (2.0 / T8 - T4 - 1.0) * rc - (2.0 / 3.0) * QMFACTORCVfinal * pow(-(qm + qdep), -1.0 / 3.0); + e2 = -1.0 / (qm * qm) - (2.0 / 9.0) * QMFACTORCVfinal * pow(-(qm + qdep), -4.0 / 3.0); + qm = qm - (e0 / e1) * (1.0 + (e0 * e2) / (2.0 * e1 * e1)); + end else begin + qm = -qm * qm; + end + qid = -qm * nVtm; + + if (BULKMOD != 0) begin + T9 = (K1_t / (2.0 * nVtm)) * sqrt(Vtm); + T0 = T9 / 2.0; + T2 = (vge - (deltaPhi - Eg - Vtm * ln(NBODY / Nc) + DELVFBACC)) / Vtm; + if ((T2 * Vtm) > phib + T9 * sqrt(phib * Vtm)) begin + T1 = sqrt(T2 - 1.0 + T0 * T0) - T0; + T10 = 1.0 + T1 * T1; + end else begin + T3 = T2 * 0.5 - 3.0 * (1.0 + T9 / sqrt(2.0)); + T10 = T3 + sqrt(T3 * T3 + 6.0 * T2); + if (T2 < 0.0) begin + T4 = (T2 - T10) / T9; + T10 = -ln(1.0 - T10 + T4 * T4 ); + end else begin + T11 = exp(-T10); + T4 = sqrt(T2 - 1.0 + T11 + T0 * T0) - T0; + T10 = 1.0 - T11 + T4 * T4; + end + end + T6 = exp(-T10) - 1.0; + T7 = sqrt(T6 + T10); + if (T10 > 1.0e-15) begin e0 = -(T2 - T10) + T9 * T7; e1 = 1.0 - T9 * 0.5 * T6 / T7; T8 = T10 - (e0 / e1); T11 = exp(-T8) - 1.0; T12 = sqrt(T11 + T8); qba = -T9 * T12 * Vtm; - end else begin + end else begin if (T10 < -1.0e-15) begin e0 = -(T2 - T10) - T9 * T7; e1 = 1.0 + T9 * 0.5 * T6 / T7; @@ -3005,243 +3005,243 @@ analog begin T8 = 0.0; end qba = T12 * Vtm; - end - qi_acc_for_QM = T9 * exp(-T8 / 2.0) * Vtm; - - psipclamp = 0.5 * (T8 + 1.0 + sqrt((T8 - 1.0) * (T8 - 1.0) + 0.25 * 2.0 * 2.0)); - sqrtpsip = sqrt(psipclamp); - nq = 1.0 + T9 / sqrtpsip; - end - - // Drain Side and Average Potential / Charge - qia = 0.5 * (qis + qid); - dqi = qis - qid; - - T0 = pow(Vdseff, 2.0) / 6.25e-4; // pow(Vdseff,2.0) / pow(25e-3, 2.0) - if (CHARGEWF != 0.0) - qia2 = 0.5 * (qis + qid) + CHARGEWF * (1.0 - lexp(-T0)) * 0.5 * dqi; - else - qia2 = 0.5 * (qis + qid); - - `ifdef __DEBUG__ - if (qis < 0.0) $strobe("Warning: negative source-side inversion carrier density. Vgs=%f Vds=%f Vbs=%f qis=%e", V(g, s), V(d, s), V(e, s), qis); - if (qid < 0.0) $strobe("Warning: negative drain-side inversion carrier density. Vgs=%f Vds=%f Vbs=%f qid=%e", V(g, s), V(d, s), V(e, s), qid); - `endif - - // Toxeff model for quantum mechanical effects - // Normal operation (Vgs > Vfb) - if (QMTCENCV_i > 0.0) begin - T4 = qia / QM0; - T5 = 1.0 + pow(T4, PQM); - Tcen = Tcen0 / T5; - coxeff = 1.0 / (1.0 / (cox * EOT / TOXP) + Tcen * QMTCENCV_i / epssub); - end else begin - coxeff = cox; - end - - // Quantum Mechanical Effect Correction for Accumulation Side Cap (Vgs < Vfb) - if (BULKMOD != 0 && QMTCENCVA_i != 0.0) begin - T6 = 1.0 + pow(qi_acc_for_QM / QM0ACC, PQMACC); - Tcen = Tcen0 / T6; - cox_acc = 1.0 / (1.0 / cox_acc + Tcen * QMTCENCVA_i / epssub); - end - - // Multiplication Factor for I-V - beta = u0_a * cox * Weff0 / Leff; - - // Mobility Degradation - Eeffm = EeffFactor * (qba + eta_mu * qia2); - T2 = pow(0.5 * (1.0 + abs((qia2) / qb0)), UCS_t); - if (BULKMOD != 0) begin - T3 = (UA_a + UC_a * veseff) * pow(abs(Eeffm), EU_a) + UD_a / T2; - end else begin - T3 = UA_a * pow(abs(Eeffm), EU_a) + UD_a / T2; - end - Dmob = 1.0 + T3; - Dmob = Dmob / U0MULT; - ueff = u0_a / Dmob; - - // Mobility Degradation for C-V - Eeffm_cv = EeffFactor * (qba + eta_mu_cv * qia2); - T3 = UA_a * pow(abs(Eeffm_cv), EU_a) + UD_a / T2; - Dmob_cv = 1.0 + T3; - Dmob_cv = Dmob_cv / U0MULT; - - // Calculate current and capacitance enhancement factors due to CLM and DIBL - tmp = DROUT_i * Leff / scl + 1.0e-6; - - if (tmp < 40.0) begin - DIBLfactor = 0.5 * PDIBL1_a / (cosh(tmp) - 1.0) + PDIBL2_a; - end else begin - DIBLfactor = PDIBL1_a * exp(-tmp) + PDIBL2_a; - end - - if (PVAG_i > 0.0) begin - PVAGfactor = 1.0 + PVAG_i * qia / EsatL; - end else begin - PVAGfactor = 1.0 / (1.0 - PVAG_i * qia / EsatL); - end - - if (Vdseff > vds) begin - Vdseff = vds; - end - diffVds = vds - Vdseff; - Vgst2Vtm = qia + 2.0 * Vtm; - if (DIBLfactor > 0) begin - T1 = Vgst2Vtm; - T3 = T1 / (Vdsat + T1); - VaDIBL = T1 / DIBLfactor * T3 * PVAGfactor; - Moc = 1.0 + diffVds / VaDIBL; - end else begin - Moc = 1.0; - end - - if (PCLM_a > 0.0) begin - if (PCLMG_i < 0.0) begin + end + qi_acc_for_QM = T9 * exp(-T8 / 2.0) * Vtm; + + psipclamp = 0.5 * (T8 + 1.0 + sqrt((T8 - 1.0) * (T8 - 1.0) + 0.25 * 2.0 * 2.0)); + sqrtpsip = sqrt(psipclamp); + nq = 1.0 + T9 / sqrtpsip; + end + + // Drain Side and Average Potential / Charge + qia = 0.5 * (qis + qid); + dqi = qis - qid; + + T0 = pow(Vdseff, 2.0) / 6.25e-4; // pow(Vdseff,2.0) / pow(25e-3, 2.0) + if (CHARGEWF != 0.0) + qia2 = 0.5 * (qis + qid) + CHARGEWF * (1.0 - lexp(-T0)) * 0.5 * dqi; + else + qia2 = 0.5 * (qis + qid); + + `ifdef __DEBUG__ + if (qis < 0.0) $strobe("Warning: negative source-side inversion carrier density. Vgs=%f Vds=%f Vbs=%f qis=%e", V(g, s), V(d, s), V(e, s), qis); + if (qid < 0.0) $strobe("Warning: negative drain-side inversion carrier density. Vgs=%f Vds=%f Vbs=%f qid=%e", V(g, s), V(d, s), V(e, s), qid); + `endif + + // Toxeff model for quantum mechanical effects + // Normal operation (Vgs > Vfb) + if (QMTCENCV_i > 0.0) begin + T4 = qia / QM0; + T5 = 1.0 + pow(T4, PQM); + Tcen = Tcen0 / T5; + coxeff = 1.0 / (1.0 / (cox * EOT / TOXP) + Tcen * QMTCENCV_i / epssub); + end else begin + coxeff = cox; + end + + // Quantum Mechanical Effect Correction for Accumulation Side Cap (Vgs < Vfb) + if (BULKMOD != 0 && QMTCENCVA_i != 0.0) begin + T6 = 1.0 + pow(qi_acc_for_QM / QM0ACC, PQMACC); + Tcen = Tcen0 / T6; + cox_acc = 1.0 / (1.0 / cox_acc + Tcen * QMTCENCVA_i / epssub); + end + + // Multiplication Factor for I-V + beta = u0_a * cox * Weff0 / Leff; + + // Mobility Degradation + Eeffm = EeffFactor * (qba + eta_mu * qia2); + T2 = pow(0.5 * (1.0 + abs((qia2) / qb0)), UCS_t); + if (BULKMOD != 0) begin + T3 = (UA_a + UC_a * veseff) * pow(abs(Eeffm), EU_a) + UD_a / T2; + end else begin + T3 = UA_a * pow(abs(Eeffm), EU_a) + UD_a / T2; + end + Dmob = 1.0 + T3; + Dmob = Dmob / U0MULT; + ueff = u0_a / Dmob; + + // Mobility Degradation for C-V + Eeffm_cv = EeffFactor * (qba + eta_mu_cv * qia2); + T3 = UA_a * pow(abs(Eeffm_cv), EU_a) + UD_a / T2; + Dmob_cv = 1.0 + T3; + Dmob_cv = Dmob_cv / U0MULT; + + // Calculate current and capacitance enhancement factors due to CLM and DIBL + tmp = DROUT_i * Leff / scl + 1.0e-6; + + if (tmp < 40.0) begin + DIBLfactor = 0.5 * PDIBL1_a / (cosh(tmp) - 1.0) + PDIBL2_a; + end else begin + DIBLfactor = PDIBL1_a * exp(-tmp) + PDIBL2_a; + end + + if (PVAG_i > 0.0) begin + PVAGfactor = 1.0 + PVAG_i * qia / EsatL; + end else begin + PVAGfactor = 1.0 / (1.0 - PVAG_i * qia / EsatL); + end + + if (Vdseff > vds) begin + Vdseff = vds; + end + diffVds = vds - Vdseff; + Vgst2Vtm = qia + 2.0 * Vtm; + if (DIBLfactor > 0) begin + T1 = Vgst2Vtm; + T3 = T1 / (Vdsat + T1); + VaDIBL = T1 / DIBLfactor * T3 * PVAGfactor; + Moc = 1.0 + diffVds / VaDIBL; + end else begin + Moc = 1.0; + end + + if (PCLM_a > 0.0) begin + if (PCLMG_i < 0.0) begin T1 = 1.0 / (1.0 / PCLM_a - PCLMG_i * qia); - end else begin - T1 = PCLM_a + PCLMG_i * qia; - end - Mclm = 1.0 + T1 * lln(1.0 + (vds - Vdseff) / T1 / (Vdsat + EsatL)); - end else begin - Mclm = 1.0; - end - - Moc = Moc * Mclm; - - // Current Degradation Factor Due to Velocity Saturation - Esat1 = 2.0 * VSAT1_a / ueff; - Esat1L = Esat1 * Leff; - T0 = lexp(PSAT_i * lln(dqi / Esat1L)); - Ta = (1.0 + lexp(1.0 / PSAT_i * lln(DELTAVSAT_i))); - Dvsat = (1.0 + lexp(1.0 / PSAT_i * lln(DELTAVSAT_i + T0))) / Ta; - Dvsat = Dvsat + 0.5 * PTWG_a * qia * dqi * dqi; - - // Non-Saturation Effect - T0 = A1_t + A2_t / (qia + 2.0 * nVtm); - T1 = T0 * dqi * dqi; - T2 = T1 + 1.0 - 0.001; - T3 = -1.0 + 0.5 * (T2 + sqrt(T2 * T2 + 0.004)); // max(T1, -1.0) - Nsat = 0.5 * (1.0 + sqrt(1.0 + T3)); - Dvsat = Dvsat * Nsat; - - // Lateral Non-uniform doping effect (IV-CV Vth shift) factor - if (K0_t != 0) begin - T1 = K0_t / (max(0, K0SI_t + K0SISAT_t * dqi * dqi) * qia + 2.0 * nVtm); - Mnud = lexp(-T1); - end else begin - Mnud = 1.0; - end - - // Body-Effect Factor for BULKMOD = 2 - if (BULKMOD == 2) begin - T0 = hypsmooth((K2_t + K2SAT_t * vdsx), 1.0e-6); - T1 = T0 / (max(0, K2SI_t + K2SISAT_t * dqi * dqi) * qia + 2.0 * nVtm); - T3 = sqrt(PHIBE_i - veseff) - sqrt(PHIBE_i); - Mob = lexp(- T1 * T3); - end else - Mob = 1.0; - - // Velocity Saturation Factor for C-V - EsatCV = 2.0 * VSATCV_t * Dmob_cv / u0_a; - EsatCVL = EsatCV * LeffCV; - T0 = lexp(PSATCV_i * lln(dqi / EsatCVL)); - Ta = (1.0 + lexp(1.0 / PSATCV_i * lln(DELTAVSATCV_i))); - DvsatCV = (1.0 + lexp(1.0 / PSATCV_i * lln(DELTAVSATCV_i + T0))) / Ta; - - // Channel Length Modulation factor for C-V - if (PCLMCV_i != 0) begin - MclmCV = 1.0 + PCLMCV_i * lln(1.0 + (vds - Vdseff) / PCLMCV_i / (Vdsat + EsatCVL)); - end else begin - MclmCV = 1.0; - end - - // Calculating fixed body charge qb with sign (Here to avoid multiple calculation in NQSMOD=3 case) - qb = -`q * nbody * Ach * LeffCV; - - // ************************************************ - // * Current and Charges Calculations * - // ************************************************ - // Quasi Static I-V Model - T1 = qia; - etaiv = q0 / (q0 + qia); - T2 = (2.0 - etaiv) * nVtm; - ids0_ov_dqi = T1 + T2; - ids0 = ids0_ov_dqi * dqi; - - // S/D Series Resistance - `include "bsimcmg_rdsmod.include" - - ids = NFINtotal * beta * ids0 * Moc * Mnud * Mob / (Dmob * Dvsat * Dr); - ids = ids * IDS0MULT; - - // Quasi Static C-V Model - `include "bsimcmg_quasi_static_cv.include" - - // Parasitic Capacitances - // Bias-dependent overlap capacitances (CGEOMOD = 0 and 2) - qgs_ov = 0.0; - qgd_ov = 0.0; - if (CGEOMOD != 1) begin - T1 = NFINtotal * WeffCV0 * devsign; - T2 = devsign * V(`GateEdgeNode, si); - T0 = T2 - vfbsdcv + `DELTA_1; - vgs_overlap = 0.5 * (T0 - sqrt(T0 * T0 + 4.0 * `DELTA_1)); - qgs_ov = T1 * (CGSL_i * (T2 - vfbsdcv - vgs_overlap - 0.5 * CKAPPAS_i * (sqrt(1.0 - 4.0 * vgs_overlap / CKAPPAS_i) - 1.0)) + CGSO_i * T2); - T2 = devsign * V(`GateEdgeNode, di); - T0 = T2 - vfbsdcv + `DELTA_1; - vgd_overlap = 0.5 * (T0 - sqrt(T0 * T0 + 4.0 * `DELTA_1)); - qgd_ov = T1 * (CGDL_i * (T2 - vfbsdcv - vgd_overlap - 0.5 * CKAPPAD_i * (sqrt(1.0 - 4.0 * vgd_overlap / CKAPPAD_i) - 1.0)) + CGDO_i * T2); - end - - if (CGEOMOD == 0) begin - T1 = NFINtotal * WeffCV0; // Fringe caps dont see QM effects - qgs_fr = T1 * CFS_i * V(`GateEdgeNode, si); - qgd_fr = T1 * CFD_i * V(`GateEdgeNode, di); - qgs_parasitic = qgs_ov + qgs_fr; - qgd_parasitic = qgd_ov + qgd_fr; - end else if (CGEOMOD == 1) begin // CGEO1SW=1 enables parameters to be in F per fin, per gate-finger, per unit channel width - if (CGEO1SW == 1) begin - T0 = NFINtotal * WeffCV0; + end else begin + T1 = PCLM_a + PCLMG_i * qia; + end + Mclm = 1.0 + T1 * lln(1.0 + (vds - Vdseff) / T1 / (Vdsat + EsatL)); + end else begin + Mclm = 1.0; + end + + Moc = Moc * Mclm; + + // Current Degradation Factor Due to Velocity Saturation + Esat1 = 2.0 * VSAT1_a / ueff; + Esat1L = Esat1 * Leff; + T0 = lexp(PSAT_i * lln(dqi / Esat1L)); + Ta = (1.0 + lexp(1.0 / PSAT_i * lln(DELTAVSAT_i))); + Dvsat = (1.0 + lexp(1.0 / PSAT_i * lln(DELTAVSAT_i + T0))) / Ta; + Dvsat = Dvsat + 0.5 * PTWG_a * qia * dqi * dqi; + + // Non-Saturation Effect + T0 = A1_t + A2_t / (qia + 2.0 * nVtm); + T1 = T0 * dqi * dqi; + T2 = T1 + 1.0 - 0.001; + T3 = -1.0 + 0.5 * (T2 + sqrt(T2 * T2 + 0.004)); // max(T1, -1.0) + Nsat = 0.5 * (1.0 + sqrt(1.0 + T3)); + Dvsat = Dvsat * Nsat; + + // Lateral Non-uniform doping effect (IV-CV Vth shift) factor + if (K0_t != 0) begin + T1 = K0_t / (max(0, K0SI_t + K0SISAT_t * dqi * dqi) * qia + 2.0 * nVtm); + Mnud = lexp(-T1); + end else begin + Mnud = 1.0; + end + + // Body-Effect Factor for BULKMOD = 2 + if (BULKMOD == 2) begin + T0 = hypsmooth((K2_t + K2SAT_t * vdsx), 1.0e-6); + T1 = T0 / (max(0, K2SI_t + K2SISAT_t * dqi * dqi) * qia + 2.0 * nVtm); + T3 = sqrt(PHIBE_i - veseff) - sqrt(PHIBE_i); + Mob = lexp(- T1 * T3); + end else + Mob = 1.0; + + // Velocity Saturation Factor for C-V + EsatCV = 2.0 * VSATCV_t * Dmob_cv / u0_a; + EsatCVL = EsatCV * LeffCV; + T0 = lexp(PSATCV_i * lln(dqi / EsatCVL)); + Ta = (1.0 + lexp(1.0 / PSATCV_i * lln(DELTAVSATCV_i))); + DvsatCV = (1.0 + lexp(1.0 / PSATCV_i * lln(DELTAVSATCV_i + T0))) / Ta; + + // Channel Length Modulation factor for C-V + if (PCLMCV_i != 0) begin + MclmCV = 1.0 + PCLMCV_i * lln(1.0 + (vds - Vdseff) / PCLMCV_i / (Vdsat + EsatCVL)); + end else begin + MclmCV = 1.0; + end + + // Calculating fixed body charge qb with sign (Here to avoid multiple calculation in NQSMOD=3 case) + qb = -`q * nbody * Ach * LeffCV; + + // ************************************************ + // * Current and Charges Calculations * + // ************************************************ + // Quasi Static I-V Model + T1 = qia; + etaiv = q0 / (q0 + qia); + T2 = (2.0 - etaiv) * nVtm; + ids0_ov_dqi = T1 + T2; + ids0 = ids0_ov_dqi * dqi; + + // S/D Series Resistance + `include "bsimcmg_rdsmod.include" + + ids = NFINtotal * beta * ids0 * Moc * Mnud * Mob / (Dmob * Dvsat * Dr); + ids = ids * IDS0MULT; + + // Quasi Static C-V Model + `include "bsimcmg_quasi_static_cv.include" + + // Parasitic Capacitances + // Bias-dependent overlap capacitances (CGEOMOD = 0 and 2) + qgs_ov = 0.0; + qgd_ov = 0.0; + if (CGEOMOD != 1) begin + T1 = NFINtotal * WeffCV0 * devsign; + T2 = devsign * V(`GateEdgeNode, si); + T0 = T2 - vfbsdcv + `DELTA_1; + vgs_overlap = 0.5 * (T0 - sqrt(T0 * T0 + 4.0 * `DELTA_1)); + qgs_ov = T1 * (CGSL_i * (T2 - vfbsdcv - vgs_overlap - 0.5 * CKAPPAS_i * (sqrt(1.0 - 4.0 * vgs_overlap / CKAPPAS_i) - 1.0)) + CGSO_i * T2); + T2 = devsign * V(`GateEdgeNode, di); + T0 = T2 - vfbsdcv + `DELTA_1; + vgd_overlap = 0.5 * (T0 - sqrt(T0 * T0 + 4.0 * `DELTA_1)); + qgd_ov = T1 * (CGDL_i * (T2 - vfbsdcv - vgd_overlap - 0.5 * CKAPPAD_i * (sqrt(1.0 - 4.0 * vgd_overlap / CKAPPAD_i) - 1.0)) + CGDO_i * T2); + end + + if (CGEOMOD == 0) begin + T1 = NFINtotal * WeffCV0; // Fringe caps dont see QM effects + qgs_fr = T1 * CFS_i * V(`GateEdgeNode, si); + qgd_fr = T1 * CFD_i * V(`GateEdgeNode, di); + qgs_parasitic = qgs_ov + qgs_fr; + qgd_parasitic = qgd_ov + qgd_fr; + end else if (CGEOMOD == 1) begin // CGEO1SW=1 enables parameters to be in F per fin, per gate-finger, per unit channel width + if (CGEO1SW == 1) begin + T0 = NFINtotal * WeffCV0; COVS_i = T0 * COVS_i; COVD_i = T0 * COVD_i; cgsp = T0 * CGSP; cgdp = T0 * CGDP; - end else begin + end else begin cgsp = CGSP; cgdp = CGDP; - end - qgs_ov = COVS_i * V(`GateEdgeNode, si); - qgd_ov = COVD_i * V(`GateEdgeNode, di); - qgs_parasitic = qgs_ov; - qgd_parasitic = qgd_ov; - qgs_fr = cgsp * V(`GateEdgeNode, s); - qgd_fr = cgdp * V(`GateEdgeNode, d); - end else begin - qgs_fr = Cfr_geo * V(`GateEdgeNode, si); - qgd_fr = Cfr_geo * V(`GateEdgeNode, di); - qgs_parasitic = qgs_ov + qgs_fr; - qgd_parasitic = qgd_ov + qgd_fr; - end - - // Drain-to-Source Fringe Capacitance Available for all CGEOMOD - qds_fr = CDSP * V(d, s); - - // Impact Ionization Current (Ref: IIMOD = 1 from BSIM4 Model, IIMOD = 2 from BSIMSOI Model) - Iii = 0.0; - if (IIMOD == 1) begin - T0 = (ALPHA0_t + ALPHA1_t * Leff) / Leff; - if ((T0 <= 0.0) || (BETA0_t <= 0.0)) + end + qgs_ov = COVS_i * V(`GateEdgeNode, si); + qgd_ov = COVD_i * V(`GateEdgeNode, di); + qgs_parasitic = qgs_ov; + qgd_parasitic = qgd_ov; + qgs_fr = cgsp * V(`GateEdgeNode, s); + qgd_fr = cgdp * V(`GateEdgeNode, d); + end else begin + qgs_fr = Cfr_geo * V(`GateEdgeNode, si); + qgd_fr = Cfr_geo * V(`GateEdgeNode, di); + qgs_parasitic = qgs_ov + qgs_fr; + qgd_parasitic = qgd_ov + qgd_fr; + end + + // Drain-to-Source Fringe Capacitance Available for all CGEOMOD + qds_fr = CDSP * V(d, s); + + // Impact Ionization Current (Ref: IIMOD = 1 from BSIM4 Model, IIMOD = 2 from BSIMSOI Model) + Iii = 0.0; + if (IIMOD == 1) begin + T0 = (ALPHA0_t + ALPHA1_t * Leff) / Leff; + if ((T0 <= 0.0) || (BETA0_t <= 0.0)) Iii = 0.0; - else begin + else begin T1 = -BETA0_t / (diffVds + 1.0e-30); Iii = T0 * diffVds * ids * lexp(T1); - end - end else if (IIMOD == 2) begin //End of IIMOD=1 - ALPHAII = (ALPHAII0_t + ALPHAII1_t * Leff) / Leff; - if (ALPHAII <= 0.0) begin + end + end else if (IIMOD == 2) begin //End of IIMOD=1 + ALPHAII = (ALPHAII0_t + ALPHAII1_t * Leff) / Leff; + if (ALPHAII <= 0.0) begin Iii = 0.0; - end else begin + end else begin T0 = ESATII_i * Leff; T1 = SII0_t * T0 / (1.0 + T0); T0 = 1.0 / (1.0 + hypsmooth(SII1_i * vgsfbeff, IIMOD2CLAMP1)); // T0 = 1 / (1 + SII1_i * vgsfbeff) @@ -3255,124 +3255,124 @@ analog begin T1 = sqrt(T0 * T0 + 1.0e-10); Ratio = -hypmax( -ALPHAII * lexp(Vdiff / T1), -10.0, IIMOD2CLAMP3); Iii = Ratio * ids; - end - end // End of IIMOD=2 - - // Gate Current (Ref: BSIM4 Model) - igbinv = 0.0; - igbacc = 0.0; - igcs = 0.0; - igcd = 0.0; - igs = 0.0; - igd = 0.0; - - // Igb - if (IGBMOD != 0) begin - // Igbinv - T1 = (qia - EIGBINV_i) / NIGBINV_i / Vtm; - Vaux_Igbinv = NIGBINV_i * Vtm * lln(1.0 + lexp(T1)); - T2 = AIGBINV_t - BIGBINV_i * qia; - T3 = 1.0 + CIGBINV_i * qia; - T4 = -9.82222e11 * TOXG * T2 * T3; - T5 = lexp(T4); - T6 = 3.75956e-7; - igbinv = Weff0 * Leff * T6 * Toxratio * vge * Vaux_Igbinv * T5; - igbinv = igbinv * igtemp; - - // Igbacc - vfbzb = deltaPhi - (Eg / 2.0) - phib; - T0 = vfbzb - vge; - T1 = T0 / NIGBACC_i / Vtm; - Vaux_Igbacc = NIGBACC_i * Vtm * lln(1.0 + lexp(T1)); - if (BULKMOD != 0) begin + end + end // End of IIMOD=2 + + // Gate Current (Ref: BSIM4 Model) + igbinv = 0.0; + igbacc = 0.0; + igcs = 0.0; + igcd = 0.0; + igs = 0.0; + igd = 0.0; + + // Igb + if (IGBMOD != 0) begin + // Igbinv + T1 = (qia - EIGBINV_i) / NIGBINV_i / Vtm; + Vaux_Igbinv = NIGBINV_i * Vtm * lln(1.0 + lexp(T1)); + T2 = AIGBINV_t - BIGBINV_i * qia; + T3 = 1.0 + CIGBINV_i * qia; + T4 = -9.82222e11 * TOXG * T2 * T3; + T5 = lexp(T4); + T6 = 3.75956e-7; + igbinv = Weff0 * Leff * T6 * Toxratio * vge * Vaux_Igbinv * T5; + igbinv = igbinv * igtemp; + + // Igbacc + vfbzb = deltaPhi - (Eg / 2.0) - phib; + T0 = vfbzb - vge; + T1 = T0 / NIGBACC_i / Vtm; + Vaux_Igbacc = NIGBACC_i * Vtm * lln(1.0 + lexp(T1)); + if (BULKMOD != 0) begin Voxacc = qi_acc_for_QM; - end else begin + end else begin if (vfbzb <= 0) Voxacc = 0.5 * (T0 - 0.02 + sqrt((T0 - 0.02) * (T0 - 0.02) - 0.08 * vfbzb)); else Voxacc = 0.5 * (T0 - 0.02 + sqrt((T0 - 0.02) * (T0 - 0.02) + 0.08 * vfbzb)); - end - T2 = AIGBACC_t - BIGBACC_i * Voxacc; - T3 = 1.0 + CIGBACC_i * Voxacc; - T4 = -7.45669e11 * TOXG * T2 * T3; - T5 = lexp(T4); - T6 = 4.97232e-7; - igbacc = Weff0 * Leff * T6 * Toxratio * vge * Vaux_Igbacc * T5; - igbacc = igbacc * igtemp; - - end - - if (IGCMOD != 0) begin - // Igcinv - T1 = AIGC_t - BIGC_i * qia; - T2 = 1.0 + CIGC_i * qia; - T3 = -Bechvb * TOXG * T1 * T2; - T4 = qia * lexp(T3); - T5 = (vge + 0.5 * vdsx + 0.5 * (ves_jct + ved_jct)); - igc0 = Weff0 * Leff * Aechvb * Toxratio * T4 * T5 * igtemp; - - // Gate-Current Partitioning - Vdseffx = sqrt(Vdseff * Vdseff + 0.01) - 0.1; - T1 = PIGCD_i * Vdseffx; - T1_exp = lexp(-T1); - T3 = T1 + T1_exp - 1.0 + 1.0e-4; - T4 = 1.0 - (T1 + 1.0) * T1_exp + 1.0e-4; - T5 = T1 * T1 + 2.0e-4; - igcd = igc0 * T4 / T5; - igcs = igc0 * T3 / T5; - - // Igs - T0 = vgs_noswap - vfbsd; - vgs_eff = sqrt(T0 * T0 + 1.0e-4); - if (IGCLAMP == 1) begin - T1 = hypsmooth((AIGS_t - BIGS_i * vgs_eff), 1.0e-6); - if (CIGS_i < 0.01) begin - CIGS_i = 0.01; - end - end else begin - T1 = AIGS_t - BIGS_i * vgs_eff; - end - T2 = 1.0 + CIGS_i * vgs_eff; - T3 = -Bechvb * TOXG * POXEDGE_i * T1 * T2; - T4 = lexp(T3); - if (sigvds > 0.0) begin + end + T2 = AIGBACC_t - BIGBACC_i * Voxacc; + T3 = 1.0 + CIGBACC_i * Voxacc; + T4 = -7.45669e11 * TOXG * T2 * T3; + T5 = lexp(T4); + T6 = 4.97232e-7; + igbacc = Weff0 * Leff * T6 * Toxratio * vge * Vaux_Igbacc * T5; + igbacc = igbacc * igtemp; + + end + + if (IGCMOD != 0) begin + // Igcinv + T1 = AIGC_t - BIGC_i * qia; + T2 = 1.0 + CIGC_i * qia; + T3 = -Bechvb * TOXG * T1 * T2; + T4 = qia * lexp(T3); + T5 = (vge + 0.5 * vdsx + 0.5 * (ves_jct + ved_jct)); + igc0 = Weff0 * Leff * Aechvb * Toxratio * T4 * T5 * igtemp; + + // Gate-Current Partitioning + Vdseffx = sqrt(Vdseff * Vdseff + 0.01) - 0.1; + T1 = PIGCD_i * Vdseffx; + T1_exp = lexp(-T1); + T3 = T1 + T1_exp - 1.0 + 1.0e-4; + T4 = 1.0 - (T1 + 1.0) * T1_exp + 1.0e-4; + T5 = T1 * T1 + 2.0e-4; + igcd = igc0 * T4 / T5; + igcs = igc0 * T3 / T5; + + // Igs + T0 = vgs_noswap - vfbsd; + vgs_eff = sqrt(T0 * T0 + 1.0e-4); + if (IGCLAMP == 1) begin + T1 = hypsmooth((AIGS_t - BIGS_i * vgs_eff), 1.0e-6); + if (CIGS_i < 0.01) begin + CIGS_i = 0.01; + end + end else begin + T1 = AIGS_t - BIGS_i * vgs_eff; + end + T2 = 1.0 + CIGS_i * vgs_eff; + T3 = -Bechvb * TOXG * POXEDGE_i * T1 * T2; + T4 = lexp(T3); + if (sigvds > 0.0) begin igs = igsd_mult * DLCIGS * vgs_noswap * vgs_eff * T4; - end else begin + end else begin igd = igsd_mult * DLCIGS * vgs_noswap * vgs_eff * T4; - end - - // Igd - T0 = vgd_noswap - vfbsd; - vgd_eff = sqrt(T0 * T0 + 1.0e-4); - if (IGCLAMP == 1) begin - T1 = hypsmooth((AIGD_t - BIGD_i * vgd_eff), 1.0e-6); - if (CIGD_i < 0.01) begin - CIGD_i = 0.01; - end - end else begin - T1 = AIGD_t - BIGD_i * vgd_eff; - end - T2 = 1.0 + CIGD_i * vgd_eff; - T3 = -Bechvb * TOXG * POXEDGE_i * T1 * T2; - T4 = lexp(T3); - - if (sigvds > 0.0) begin + end + + // Igd + T0 = vgd_noswap - vfbsd; + vgd_eff = sqrt(T0 * T0 + 1.0e-4); + if (IGCLAMP == 1) begin + T1 = hypsmooth((AIGD_t - BIGD_i * vgd_eff), 1.0e-6); + if (CIGD_i < 0.01) begin + CIGD_i = 0.01; + end + end else begin + T1 = AIGD_t - BIGD_i * vgd_eff; + end + T2 = 1.0 + CIGD_i * vgd_eff; + T3 = -Bechvb * TOXG * POXEDGE_i * T1 * T2; + T4 = lexp(T3); + + if (sigvds > 0.0) begin igd = igsd_mult * DLCIGD * vgd_noswap * vgd_eff * T4; - end else begin + end else begin igs = igsd_mult * DLCIGD * vgd_noswap * vgd_eff * T4; - end - end + end + end - // GIDL/GISL Current (Ref: BSIM4 Model) - igisl = 0.0; - igidl = 0.0; + // GIDL/GISL Current (Ref: BSIM4 Model) + igisl = 0.0; + igidl = 0.0; - if (GIDLMOD != 0) begin - T0 = epsratio * EOT; - // GIDL - if ((AGIDL_i <= 0.0) || (BGIDL_t <= 0.0)) begin + if (GIDLMOD != 0) begin + T0 = epsratio * EOT; + // GIDL + if ((AGIDL_i <= 0.0) || (BGIDL_t <= 0.0)) begin T6 = 0.0; - end else begin + end else begin T1 = (-vgd_noswap - EGIDL_i + vfbsd) / T0; T1 = hypsmooth(T1, 1.0e-2); T2 = BGIDL_t / (T1 + 1.0e-3); @@ -3385,18 +3385,18 @@ analog begin end else begin T6 = AGIDL_i * Weff0 * T3 * lexp(-T2) * vds_noswap; end - end + end - if (sigvds > 0.0) begin + if (sigvds > 0.0) begin igidl = T6; - end else begin + end else begin igisl = T6; - end + end - // GISL - if ((AGISL_i <= 0.0) || (BGISL_t <= 0.0)) begin + // GISL + if ((AGISL_i <= 0.0) || (BGISL_t <= 0.0)) begin T6 = 0.0; - end else begin + end else begin T1 = (-vgs_noswap - EGISL_i + vfbsd) / T0; T1 = hypsmooth(T1, 1.0e-2); T2 = BGISL_t / (T1 + 1.0e-3); @@ -3408,20 +3408,20 @@ analog begin T6 = AGISL_i * Weff0 * T3 * lexp(-T2) * T5; end else T6 = AGISL_i * Weff0 * T3 * lexp(-T2) * (-vds_noswap); - end + end - if (sigvds > 0.0) begin + if (sigvds > 0.0) begin igisl = T6; - end else begin + end else begin igidl = T6; - end + end - end // End of GIDLMOD + end // End of GIDLMOD - // Junction Current - if (BULKMOD != 0) begin - // Source-Side Junction Current - if (Isbs > 0.0) begin + // Junction Current + if (BULKMOD != 0) begin + // Source-Side Junction Current + if (Isbs > 0.0) begin if (ves_jct < VjsmRev) begin T0 = ves_jct / Nvtms; T1 = lexp(T0) - 1.0; @@ -3435,12 +3435,12 @@ analog begin end else begin Ies = IVjsmFwd + SslpFwd * (ves_jct - VjsmFwd); end - end else begin + end else begin Ies = 0.0; - end + end - // Source-Side Junction Tunneling Current - if (JTSS_t > 0.0) begin + // Source-Side Junction Tunneling Current + if (JTSS_t > 0.0) begin if ((VTSS - ves_jct) < (VTSS * 1.0e-3)) begin T0 = -ves_jct / Vtm0 / NJTS_t; T1 = lexp(T0 * 1.0e3) - 1.0; @@ -3450,9 +3450,9 @@ analog begin T1 = lexp(T0 * VTSS / (VTSS - ves_jct)) - 1.0; Ies = Ies - ASEJ * JTSS_t * T1; end - end + end - if (JTSSWS_t > 0.0) begin + if (JTSSWS_t > 0.0) begin if ((VTSSWS - ves_jct) < (VTSSWS * 1.0e-3)) begin T0 = -ves_jct / Vtm0 / NJTSSW_t; T1 = lexp(T0 * 1.0e3) - 1.0; @@ -3462,9 +3462,9 @@ analog begin T1 = lexp(T0 * VTSSWS / (VTSSWS - ves_jct)) - 1.0; Ies = Ies - PSEJ * JTSSWS_t * T1; end - end + end - if (JTSSWGS_t > 0.0) begin + if (JTSSWGS_t > 0.0) begin if ((VTSSWGS - ves_jct) < (VTSSWGS * 1.0e-3)) begin T0 = -ves_jct / Vtm0 / NJTSSWG_t; T1 = lexp(T0 * 1.0e3) - 1.0; @@ -3474,10 +3474,10 @@ analog begin T1 = lexp(T0 * VTSSWGS / (VTSSWGS - ves_jct)) - 1.0; Ies = Ies - Weff0 * NFINtotal * JTSSWGS_t * T1; end - end + end - // Drain-Side Junction Current - if (Isbd > 0.0) begin + // Drain-Side Junction Current + if (Isbd > 0.0) begin if (ved_jct < VjdmRev) begin T0 = ved_jct / Nvtmd; T1 = lexp(T0) - 1.0; @@ -3490,11 +3490,11 @@ analog begin Ied = Isbd * (lexp(T0) + XExpBVD - 1.0 - XJBVD * T2); end else Ied = IVjdmFwd + DslpFwd * (ved_jct - VjdmFwd); - end else + end else Ied = 0.0; - // Drain-Side Junction Tunneling Current - if (JTSD_t > 0.0) begin + // Drain-Side Junction Tunneling Current + if (JTSD_t > 0.0) begin if ((VTSD - ved_jct) < (VTSD * 1.0e-3)) begin T0 = -ved_jct / Vtm0 / NJTSD_t; T1 = lexp(T0 * 1.0e3) - 1.0; @@ -3504,8 +3504,8 @@ analog begin T1 = lexp(T0 * VTSD/ (VTSD - ved_jct)) - 1.0; Ied = Ied - ADEJ * JTSD_t * T1; end - end - if (JTSSWD_t > 0.0) begin + end + if (JTSSWD_t > 0.0) begin if ((VTSSWD - ved_jct) < (VTSSWD * 1.0e-3)) begin T0 = -ved_jct / Vtm0 / NJTSSWD_t; T1 = lexp(T0 * 1.0e3) - 1.0; @@ -3515,8 +3515,8 @@ analog begin T1 = lexp(T0 * VTSSWD / (VTSSWD - ved_jct)) - 1.0; Ied = Ied - PDEJ * JTSSWD_t * T1; end - end - if (JTSSWGD_t > 0.0) begin + end + if (JTSSWGD_t > 0.0) begin if ((VTSSWGD - ved_jct) < (VTSSWGD * 1.0e-3)) begin T0 = -ved_jct / Vtm0 / NJTSSWGD_t; T1 = lexp(T0 * 1.0e3) - 1.0; @@ -3526,620 +3526,620 @@ analog begin T1 = lexp(T0 * VTSSWGD / (VTSSWGD - ved_jct)) - 1.0; Ied = Ied - Weff0 * NFINtotal * JTSSWGD_t * T1; end - end - - // Junction Capacitance (No Swapping) - // Source-Substrate Junction - `BSIM6JunctnCap(ves_jct, Czbs, PBS_t, SJS, MJS, MJS2, Qesj1) - `BSIM6JunctnCap(ves_jct, Czbssw, PBSWS_t, SJSWS, MJSWS, MJSWS2, Qesj2) - `BSIM6JunctnCap(ves_jct, Czbsswg, PBSWGS_t, SJSWGS, MJSWGS, MJSWGS2, Qesj3) - Qesj = Qesj1 + Qesj2 + Qesj3; - - // Drain-Substrate Junction - `BSIM6JunctnCap(ved_jct, Czbd, PBD_t, SJD, MJD, MJD2, Qedj1) - `BSIM6JunctnCap(ved_jct, Czbdsw, PBSWD_t, SJSWD, MJSWD, MJSWD2, Qedj2) - `BSIM6JunctnCap(ved_jct, Czbdswg, PBSWGD_t, SJSWGD, MJSWGD, MJSWGD2, Qedj3) - Qedj = Qedj1 + Qedj2 + Qedj3; - - end // BULKMOD=0 - - Qes = Qesj + csbox * ves_jct; - Qed = Qedj + cdbox * ved_jct; - - // Gate-to-Substrate Parasitic Capacitance - // Bias Independent Component - Qeg = cgbox * devsign * V(e, `GateEdgeNode); - if (BULKMOD != 0) begin - // Bias Dependent Component - T2 = devsign * V(`GateEdgeNode, e); - T3 = T2 - deltaPhi + Eg / 2.0 + phib - DELVFBACC; - T0 = T3 + `DELTA_1; - vge_overlap = 0.5 * (T0 + sqrt(T0 * T0 + 4.0 * `DELTA_1)); - Qeg = Qeg - NFINtotal * LeffCV * (CGBL_i * (T3 - vge_overlap + 0.5 * CKAPPAB_i * ( sqrt(1.0 + 4.0 * vge_overlap / CKAPPAB_i) - 1.0 ))); - end - - // Generation-Recombination Component - T0 = vds; - T1 = T0 * (AIGEN_i + BIGEN_i * T0 * T0); - idsgen = HFIN * TFIN * (Leff - 2.0 * LINTIGEN_i) * igentemp * T1; - - // NQS Gate Resistance (Ref: BSIM4 Model) - T0 = ueff * coxeff * Weff0 / Leff; - - `ifdef __NQSMOD1__ - if (NQSMOD == 1 && XRCRG1_i != 0) begin + end + + // Junction Capacitance (No Swapping) + // Source-Substrate Junction + `BSIM6JunctnCap(ves_jct, Czbs, PBS_t, SJS, MJS, MJS2, Qesj1) + `BSIM6JunctnCap(ves_jct, Czbssw, PBSWS_t, SJSWS, MJSWS, MJSWS2, Qesj2) + `BSIM6JunctnCap(ves_jct, Czbsswg, PBSWGS_t, SJSWGS, MJSWGS, MJSWGS2, Qesj3) + Qesj = Qesj1 + Qesj2 + Qesj3; + + // Drain-Substrate Junction + `BSIM6JunctnCap(ved_jct, Czbd, PBD_t, SJD, MJD, MJD2, Qedj1) + `BSIM6JunctnCap(ved_jct, Czbdsw, PBSWD_t, SJSWD, MJSWD, MJSWD2, Qedj2) + `BSIM6JunctnCap(ved_jct, Czbdswg, PBSWGD_t, SJSWGD, MJSWGD, MJSWGD2, Qedj3) + Qedj = Qedj1 + Qedj2 + Qedj3; + + end // BULKMOD=0 + + Qes = Qesj + csbox * ves_jct; + Qed = Qedj + cdbox * ved_jct; + + // Gate-to-Substrate Parasitic Capacitance + // Bias Independent Component + Qeg = cgbox * devsign * V(e, `GateEdgeNode); + if (BULKMOD != 0) begin + // Bias Dependent Component + T2 = devsign * V(`GateEdgeNode, e); + T3 = T2 - deltaPhi + Eg / 2.0 + phib - DELVFBACC; + T0 = T3 + `DELTA_1; + vge_overlap = 0.5 * (T0 + sqrt(T0 * T0 + 4.0 * `DELTA_1)); + Qeg = Qeg - NFINtotal * LeffCV * (CGBL_i * (T3 - vge_overlap + 0.5 * CKAPPAB_i * ( sqrt(1.0 + 4.0 * vge_overlap / CKAPPAB_i) - 1.0 ))); + end + + // Generation-Recombination Component + T0 = vds; + T1 = T0 * (AIGEN_i + BIGEN_i * T0 * T0); + idsgen = HFIN * TFIN * (Leff - 2.0 * LINTIGEN_i) * igentemp * T1; + + // NQS Gate Resistance (Ref: BSIM4 Model) + T0 = ueff * coxeff * Weff0 / Leff; + + `ifdef __NQSMOD1__ + if (NQSMOD == 1 && XRCRG1_i != 0) begin IdovVds = beta * ids0_ov_dqi * Moc / (Dmob * Dvsat * Dr); gcrg = NFINtotal * XRCRG1_i * (IdovVds + XRCRG2_i * Vtm * T0); - end - `endif + end + `endif - `ifdef __NQSMOD2__ - if (NQSMOD == 2) begin + `ifdef __NQSMOD2__ + if (NQSMOD == 2) begin IdovVds = beta * ids0_ov_dqi * Moc / (Dmob * Dvsat * Dr); gcrg = NFINtotal * XRCRG1_i * (IdovVds + XRCRG2_i * Vtm * T0); gtau = gcrg / (cox * Weff0 * Leff); - end - `endif - - // *** Multiply all current and charge components by NFINtotal *** - // Note: Do not multiply ids, qg, qs, qd, qb, Ies, Ied, Qbs, Qbd with NFINtotal - // since it is already considered. - - igidl = NFINtotal * igidl; - igisl = NFINtotal * igisl; - igcd = NFINtotal * igcd; - igcs = NFINtotal * igcs; - igs = NFINtotal * igs; - igd = NFINtotal * igd; - igbinv = NFINtotal * igbinv; - igbacc = NFINtotal * igbacc; - idsgen = NFINtotal * idsgen; - - // Gate to Body Tunneling Current Empirical Partition for BULKMOD = 0 - igbs = 0.0; - igbd = 0.0; - if (BULKMOD == 0) begin - igbs = (igbinv + igbacc) * wf; - igbd = (igbinv + igbacc) * wr; - end - - // Noise Models - Esatnoi = 2.0 * VSAT_a / ueff; // Thermal noise and flicker noise - - // Flicker Noise (Ref: BSIM4 Model from K. K. Hung et al. TED 1990) - if (NOIA > 0.0 || NOIB > 0.0 || NOIC > 0.0) begin - Leffnoi = Leff - 2.0 * LINTNOI_i; - Leffnoisq = Leffnoi * Leffnoi; - if (EM <= 0.0) begin + end + `endif + + // *** Multiply all current and charge components by NFINtotal *** + // Note: Do not multiply ids, qg, qs, qd, qb, Ies, Ied, Qbs, Qbd with NFINtotal + // since it is already considered. + + igidl = NFINtotal * igidl; + igisl = NFINtotal * igisl; + igcd = NFINtotal * igcd; + igcs = NFINtotal * igcs; + igs = NFINtotal * igs; + igd = NFINtotal * igd; + igbinv = NFINtotal * igbinv; + igbacc = NFINtotal * igbacc; + idsgen = NFINtotal * idsgen; + + // Gate to Body Tunneling Current Empirical Partition for BULKMOD = 0 + igbs = 0.0; + igbd = 0.0; + if (BULKMOD == 0) begin + igbs = (igbinv + igbacc) * wf; + igbd = (igbinv + igbacc) * wr; + end + + // Noise Models + Esatnoi = 2.0 * VSAT_a / ueff; // Thermal noise and flicker noise + + // Flicker Noise (Ref: BSIM4 Model from K. K. Hung et al. TED 1990) + if (NOIA > 0.0 || NOIB > 0.0 || NOIC > 0.0) begin + Leffnoi = Leff - 2.0 * LINTNOI_i; + Leffnoisq = Leffnoi * Leffnoi; + if (EM <= 0.0) begin DelClm = 0.0; - end else begin + end else begin T0 = (diffVds / litl + EM) / Esatnoi; DelClm = litl * lln(T0); if (DelClm < 0.0) begin - DelClm = 0.0; + DelClm = 0.0; end - end - T1 = `q * `q * `q * Vtm * abs(ids) * ueff; - T2 = 1.0e10 * coxeff * Leffnoisq; - N0 = coxeff * qis / `q; - Nl = coxeff * qid / `q; - Nstar = Vtm / `q * (coxeff + CIT_a); - T3 = NOIA * lln((N0 + Nstar) / (Nl + Nstar)); - T4 = NOIB * (N0 - Nl); - T5 = 0.5 * NOIC * (N0 * N0 - Nl * Nl); - T6 = `q * Vtm * ids * ids; - T7 = 1.0e10 * Leffnoisq * Weff0 * NFINtotal; - T8 = NOIA + NOIB * Nl + NOIC * Nl * Nl; - T9 = (Nl + Nstar) * (Nl + Nstar); - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - T10 = NOIA * `q * Vtm; - T11 = Weff0 * NFINtotal * Leffnoi * 1.0e10 * Nstar * Nstar; - Swi = T10 / T11 * ids * ids; - T1 = Swi + Ssi; - if (T1 > 0.0) begin + end + T1 = `q * `q * `q * Vtm * abs(ids) * ueff; + T2 = 1.0e10 * coxeff * Leffnoisq; + N0 = coxeff * qis / `q; + Nl = coxeff * qid / `q; + Nstar = Vtm / `q * (coxeff + CIT_a); + T3 = NOIA * lln((N0 + Nstar) / (Nl + Nstar)); + T4 = NOIB * (N0 - Nl); + T5 = 0.5 * NOIC * (N0 * N0 - Nl * Nl); + T6 = `q * Vtm * ids * ids; + T7 = 1.0e10 * Leffnoisq * Weff0 * NFINtotal; + T8 = NOIA + NOIB * Nl + NOIC * Nl * Nl; + T9 = (Nl + Nstar) * (Nl + Nstar); + Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; + T10 = NOIA * `q * Vtm; + T11 = Weff0 * NFINtotal * Leffnoi * 1.0e10 * Nstar * Nstar; + Swi = T10 / T11 * ids * ids; + T1 = Swi + Ssi; + if (T1 > 0.0) begin FNPowerAt1Hz = (Ssi * Swi) / T1; - end else begin + end else begin FNPowerAt1Hz = 0.0; - end - end else begin - FNPowerAt1Hz = 0.0; - end - - // Thermal Noise - case (TNOIMOD) - 0 : begin // Charge-based model (BSIM4 - TNOIMOD=0) + end + end else begin + FNPowerAt1Hz = 0.0; + end + + // Thermal Noise + case (TNOIMOD) + 0 : begin // Charge-based model (BSIM4 - TNOIMOD=0) T0 = ueff * qinv; T1 = T0 * Rdsi + Leff * Leff; Gtnoi = (T0 / T1) * NTNOI_i; sid = 4.0 * Vtm * `q * Gtnoi; - end - 1: begin // Correlated Thermal Noise by Navid, November 2013, Reference BSIMSOI4.5.0 - `ifdef __TNOIMOD1__ - Abulk = 1.0; - Vgst2Vtm = KSATIV_a * (qis + 2.0 * Vtm); - etaa = 1.0 - Vdseff * Abulk / Vgst2Vtm ; - T0 = 1.0 - etaa; - T1 = 1.0 + etaa; - T2 = T1 + 2.0 * Abulk * Vtm / (qia + 1.0e-10); - T3 = T2 * T2; - T4 = T0 * T0; - T5 = T3 * T3; - T6 = 1.0 / (1.0 + Vdseff / EsatL) ; - gamma = T6 * (0.5 * T1 + T0 * T0 / (6.0 * T2)); - delta = ((T1 / T3) - (5.0 * T1 + T2) * T4 / (15.0 * T5) + T4 * T4 / (9.0 * T5 * T2)) / (6.0 * T6 * T6 * T6); - T7 = T0 / T2; - epsilon = (T7 + T7 * T7 * T7 / 3.0) / (6.0 * T6); - T8 = qia / EsatL; - T8 = T8 * T8; - npart_c = RNOIC * (1.0 + T8 * TNOIC * Leff); - T9 = gamma * delta ; - if (T9 > 0.0) begin - ctnoi = epsilon / sqrt( gamma * delta) * (2.5316 * npart_c); + end + 1: begin // Correlated Thermal Noise by Navid, November 2013, Reference BSIMSOI4.5.0 + `ifdef __TNOIMOD1__ + Abulk = 1.0; + Vgst2Vtm = KSATIV_a * (qis + 2.0 * Vtm); + etaa = 1.0 - Vdseff * Abulk / Vgst2Vtm ; + T0 = 1.0 - etaa; + T1 = 1.0 + etaa; + T2 = T1 + 2.0 * Abulk * Vtm / (qia + 1.0e-10); + T3 = T2 * T2; + T4 = T0 * T0; + T5 = T3 * T3; + T6 = 1.0 / (1.0 + Vdseff / EsatL) ; + gamma = T6 * (0.5 * T1 + T0 * T0 / (6.0 * T2)); + delta = ((T1 / T3) - (5.0 * T1 + T2) * T4 / (15.0 * T5) + T4 * T4 / (9.0 * T5 * T2)) / (6.0 * T6 * T6 * T6); + T7 = T0 / T2; + epsilon = (T7 + T7 * T7 * T7 / 3.0) / (6.0 * T6); + T8 = qia / EsatL; + T8 = T8 * T8; + npart_c = RNOIC * (1.0 + T8 * TNOIC * Leff); + T9 = gamma * delta ; + if (T9 > 0.0) begin + ctnoi = epsilon / sqrt( gamma * delta) * (2.5316 * npart_c); + end else begin + ctnoi = 1.0; + end + if (ctnoi > 1) begin + ctnoi = 1.0; + end + if (ctnoi < 0) begin + ctnoi = 0.0; + end + npart_beta = RNOIA * (1.0 + T8 * TNOIA * Leff); + npart_theta = RNOIB * (1.0 + T8 * TNOIB * Leff); + gamma = gamma * (3.0 * npart_beta * npart_beta); + delta = delta * (3.75 * npart_theta * npart_theta); + T9 = qia * 0.5 * T1; + gche = beta * T9 * T6; + noiGd0 = NFINtotal * beta * qia / (1.0 + gche * Rdsi); + GammaGd0 = gamma * noiGd0; + sid = 4.0 * Vtm * `q * GammaGd0; + C0 = NFINtotal * coxeff * WeffCV0 * LeffCV; + if (gamma > 0.0 && delta > 0.0) begin + sf = (noiGd0 + 1.0e-15) / sqrt(delta / gamma); + end else begin + sf = 0.0; + end + `else + $strobe("[Warning!] Although the model selector TNOIMOD is set to 1, the new correlated thermal noise model is not activated. Please uncomment \"`define __TNOIMOD1__\" in the bsimcmg.va."); + `endif + end + endcase + + // Source and Drain Conductance for Thermal Noise Contribution + if (RDSMOD != 2) begin + gspr = 1.0 / Rsource; // Note: gspr considers all fins + gdpr = 1.0 / Rdrain; // Note: gdpr considers all fins + end + + // Loading Ids, Gate and Drain charges + `ifdef __NQSMOD2__ + if (sigvds > 0.0) begin + I(di, si) <+ devsign * ids; + end else begin + I(si, di) <+ devsign * ids; + end + + if (NQSMOD == 2) begin + I(`IntrinsicGate, si) <+ devsign * gtau * -V(q); + I(di, si) <+ devsign * xdpart * gtau * V(q); + end else begin // Quasi-static Stamping (Normal case) + I(di, si) <+ devsign * ddt(qd); + I(`IntrinsicGate, si) <+ devsign * ddt(qg); + end + `else + if (sigvds > 0.0) begin + I(di, si) <+ devsign * ids; + end else begin + I(si, di) <+ devsign * ids; + end + I(di, si) <+ devsign * ddt(qd); + I(`IntrinsicGate, si) <+ devsign * ddt(qg); + `endif + + // Loading Other Currents + if (sigvds > 0.0) begin + I(di, si) <+ devsign * idsgen; + I(`IntrinsicGate, si) <+ devsign * (igcs + igs); + I(`IntrinsicGate, di) <+ devsign * (igcd + igd); + if (BULKMOD != 0) begin + I(di, e) <+ devsign * (igidl + Iii); + I(si, e) <+ devsign * igisl; + I(`IntrinsicGate, e) <+ devsign * (igbinv + igbacc); + end else begin + I(di, si) <+ devsign * (igidl + Iii); + I(si, di) <+ devsign * igisl; + end + end else begin + I(si, di) <+ devsign * idsgen; + I(`IntrinsicGate, di) <+ devsign * (igcs + igs); + I(`IntrinsicGate, si) <+ devsign * (igcd + igd); + if (BULKMOD != 0) begin + I(si, e) <+ devsign * (igidl + Iii); + I(di, e) <+ devsign * igisl; + I(`IntrinsicGate, e) <+ devsign * (igbinv + igbacc); + end else begin + I(si, di) <+ devsign * (igidl + Iii); + I(di, si) <+ devsign * igisl; + end + end + if (BULKMOD == 0) begin + I(`IntrinsicGate, si) <+ devsign * igbs; + I(`IntrinsicGate, di) <+ devsign * igbd; + end + + if (BULKMOD != 0) begin + I(e, si) <+ devsign * Ies; + I(e, di) <+ devsign * Ied; + end + I(e, si) <+ devsign * ddt(Qes); + I(e, di) <+ devsign * ddt(Qed); + I(e, `GateEdgeNode) <+ devsign * ddt(Qeg); + + // Loading other charges + I(`GateEdgeNode, si) <+ ddt(qgs_parasitic); + I(`GateEdgeNode, di) <+ ddt(qgd_parasitic); + I(d, s) <+ ddt(qds_fr); + if (CGEOMOD == 1) begin + I(`GateEdgeNode, s) <+ ddt(qgs_fr); + I(`GateEdgeNode, d) <+ ddt(qgd_fr); + end + + // Accumulation Charge for Bulk FET + if (BULKMOD != 0) begin + I(`IntrinsicGate, si) <+ devsign * ddt(qg_acc); + I(e, si) <+ devsign * ddt(qb_acc); + end + + // External S/D Resistance + if (RDSMOD == 2) begin + V(d, di) <+ 0.0; + V(s, si) <+ 0.0; + end else begin + I(d, di) <+ V(d, di) / Rdrain; + I(s, si) <+ V(s, si) / Rsource; + end + + // NQSMOD1 Gate Resistance Model + `ifdef __NQSMOD1__ + if (NQSMOD == 1 && XRCRG1_i != 0) + I(`GateEdgeNode, gi) <+ V(`GateEdgeNode, gi) * gcrg; + else + V(`GateEdgeNode, gi) <+ 0.0; + `endif + + // NQSMOD2 BSIM4 Charge Deficit Model + `ifdef __NQSMOD2__ + if (NQSMOD ==2) begin + I(q) <+ ddt(qg - qb); + I(q) <+ V(q) * gtau; + I(q) <+ ddt(V(q)); + end else + V(q) <+ 0.0; + `endif + + // Gate Electrode Resistance + `ifdef __RGATEMOD__ + if (RGATEMOD != 0) + I(g, ge) <+ V(g, ge) * ggeltd; + else + V(g, ge) <+ 0.0; + `endif + + // Flicker Noise + I(di,si) <+ flicker_noise(FNPowerAt1Hz, EF, "flicker"); + + // Thermal noise for parasitics + if (RDSMOD != 2) begin + I(d, di) <+ white_noise(4.0 * Vtm * `q * gdpr, "thermal"); + I(s, si) <+ white_noise(4.0 * Vtm * `q * gspr, "thermal"); + end + + `ifdef __RGATEMOD__ + if (RGATEMOD != 0) + I(g, ge) <+ white_noise(4.0 * Vtm * `q * ggeltd, "thermal"); + `endif + + // Channel thermal noise and induced gate noise stamping + // Implementation of correlated noise follows C. C. McAndrew, WCM 2005 + if (TNOIMOD == 0) begin + I(di, si) <+ white_noise(sid, "thermal"); + `ifdef __TNOIMOD1__ + V(N) <+ 0.0; + `endif + end else begin + `ifdef __TNOIMOD1__ + I(di,si) <+ white_noise(sid * abs(1.0 - ctnoi * ctnoi), "thermal"); + I(di,si) <+ ctnoi * V(N) * sf * SCALEN ; + if (gamma > 0 && delta > 0) begin + I(N) <+ V(N) * sf * SCALEN; + I(N) <+ white_noise(sid/(sf*sf*SCALEN*SCALEN)); end else begin - ctnoi = 1.0; + I(N) <+ V(N) ; end - if (ctnoi > 1) begin - ctnoi = 1.0; - end - if (ctnoi < 0) begin - ctnoi = 0.0; - end - npart_beta = RNOIA * (1.0 + T8 * TNOIA * Leff); - npart_theta = RNOIB * (1.0 + T8 * TNOIB * Leff); - gamma = gamma * (3.0 * npart_beta * npart_beta); - delta = delta * (3.75 * npart_theta * npart_theta); - T9 = qia * 0.5 * T1; - gche = beta * T9 * T6; - noiGd0 = NFINtotal * beta * qia / (1.0 + gche * Rdsi); - GammaGd0 = gamma * noiGd0; - sid = 4.0 * Vtm * `q * GammaGd0; - C0 = NFINtotal * coxeff * WeffCV0 * LeffCV; - if (gamma > 0.0 && delta > 0.0) begin - sf = (noiGd0 + 1.0e-15) / sqrt(delta / gamma); - end else begin - sf = 0.0; - end - `else + I(`IntrinsicGate,si) <+ ddt(0.5 * C0 * SCALEN * V(N)); + I(`IntrinsicGate,di) <+ ddt(0.5 * C0 * SCALEN * V(N)); + `else $strobe("[Warning!] Although the model selector TNOIMOD is set to 1, the new correlated thermal noise model is not activated. Please uncomment \"`define __TNOIMOD1__\" in the bsimcmg.va."); - `endif - end - endcase - - // Source and Drain Conductance for Thermal Noise Contribution - if (RDSMOD != 2) begin - gspr = 1.0 / Rsource; // Note: gspr considers all fins - gdpr = 1.0 / Rdrain; // Note: gdpr considers all fins - end - - // Loading Ids, Gate and Drain charges - `ifdef __NQSMOD2__ - if (sigvds > 0.0) begin - I(di, si) <+ devsign * ids; - end else begin - I(si, di) <+ devsign * ids; - end - - if (NQSMOD == 2) begin - I(`IntrinsicGate, si) <+ devsign * gtau * -V(q); - I(di, si) <+ devsign * xdpart * gtau * V(q); - end else begin // Quasi-static Stamping (Normal case) - I(di, si) <+ devsign * ddt(qd); - I(`IntrinsicGate, si) <+ devsign * ddt(qg); - end - `else - if (sigvds > 0.0) begin - I(di, si) <+ devsign * ids; - end else begin - I(si, di) <+ devsign * ids; - end - I(di, si) <+ devsign * ddt(qd); - I(`IntrinsicGate, si) <+ devsign * ddt(qg); - `endif - - // Loading Other Currents - if (sigvds > 0.0) begin - I(di, si) <+ devsign * idsgen; - I(`IntrinsicGate, si) <+ devsign * (igcs + igs); - I(`IntrinsicGate, di) <+ devsign * (igcd + igd); - if (BULKMOD != 0) begin - I(di, e) <+ devsign * (igidl + Iii); - I(si, e) <+ devsign * igisl; - I(`IntrinsicGate, e) <+ devsign * (igbinv + igbacc); - end else begin - I(di, si) <+ devsign * (igidl + Iii); - I(si, di) <+ devsign * igisl; - end - end else begin - I(si, di) <+ devsign * idsgen; - I(`IntrinsicGate, di) <+ devsign * (igcs + igs); - I(`IntrinsicGate, si) <+ devsign * (igcd + igd); - if (BULKMOD != 0) begin - I(si, e) <+ devsign * (igidl + Iii); - I(di, e) <+ devsign * igisl; - I(`IntrinsicGate, e) <+ devsign * (igbinv + igbacc); - end else begin - I(si, di) <+ devsign * (igidl + Iii); - I(di, si) <+ devsign * igisl; - end - end - if (BULKMOD == 0) begin - I(`IntrinsicGate, si) <+ devsign * igbs; - I(`IntrinsicGate, di) <+ devsign * igbd; - end - - if (BULKMOD != 0) begin - I(e, si) <+ devsign * Ies; - I(e, di) <+ devsign * Ied; - end - I(e, si) <+ devsign * ddt(Qes); - I(e, di) <+ devsign * ddt(Qed); - I(e, `GateEdgeNode) <+ devsign * ddt(Qeg); - - // Loading other charges - I(`GateEdgeNode, si) <+ ddt(qgs_parasitic); - I(`GateEdgeNode, di) <+ ddt(qgd_parasitic); - I(d, s) <+ ddt(qds_fr); - if (CGEOMOD == 1) begin - I(`GateEdgeNode, s) <+ ddt(qgs_fr); - I(`GateEdgeNode, d) <+ ddt(qgd_fr); - end - - // Accumulation Charge for Bulk FET - if (BULKMOD != 0) begin - I(`IntrinsicGate, si) <+ devsign * ddt(qg_acc); - I(e, si) <+ devsign * ddt(qb_acc); - end - - // External S/D Resistance - if (RDSMOD == 2) begin - V(d, di) <+ 0.0; - V(s, si) <+ 0.0; - end else begin - I(d, di) <+ V(d, di) / Rdrain; - I(s, si) <+ V(s, si) / Rsource; - end - - // NQSMOD1 Gate Resistance Model - `ifdef __NQSMOD1__ - if (NQSMOD == 1 && XRCRG1_i != 0) - I(`GateEdgeNode, gi) <+ V(`GateEdgeNode, gi) * gcrg; - else - V(`GateEdgeNode, gi) <+ 0.0; - `endif - - // NQSMOD2 BSIM4 Charge Deficit Model - `ifdef __NQSMOD2__ - if (NQSMOD ==2) begin - I(q) <+ ddt(qg - qb); - I(q) <+ V(q) * gtau; - I(q) <+ ddt(V(q)); - end else - V(q) <+ 0.0; - `endif - - // Gate Electrode Resistance - `ifdef __RGATEMOD__ - if (RGATEMOD != 0) - I(g, ge) <+ V(g, ge) * ggeltd; - else - V(g, ge) <+ 0.0; - `endif - - // Flicker Noise - I(di,si) <+ flicker_noise(FNPowerAt1Hz, EF, "flicker"); - - // Thermal noise for parasitics - if (RDSMOD != 2) begin - I(d, di) <+ white_noise(4.0 * Vtm * `q * gdpr, "thermal"); - I(s, si) <+ white_noise(4.0 * Vtm * `q * gspr, "thermal"); - end - - `ifdef __RGATEMOD__ - if (RGATEMOD != 0) - I(g, ge) <+ white_noise(4.0 * Vtm * `q * ggeltd, "thermal"); - `endif - - // Channel thermal noise and induced gate noise stamping - // Implementation of correlated noise follows C. C. McAndrew, WCM 2005 - if (TNOIMOD == 0) begin - I(di, si) <+ white_noise(sid, "thermal"); - `ifdef __TNOIMOD1__ - V(N) <+ 0.0; - `endif - end else begin - `ifdef __TNOIMOD1__ - I(di,si) <+ white_noise(sid * abs(1.0 - ctnoi * ctnoi), "thermal"); - I(di,si) <+ ctnoi * V(N) * sf * SCALEN ; - if (gamma > 0 && delta > 0) begin - I(N) <+ V(N) * sf * SCALEN; - I(N) <+ white_noise(sid/(sf*sf*SCALEN*SCALEN)); - end else begin - I(N) <+ V(N) ; - end - I(`IntrinsicGate,si) <+ ddt(0.5 * C0 * SCALEN * V(N)); - I(`IntrinsicGate,di) <+ ddt(0.5 * C0 * SCALEN * V(N)); - `else - $strobe("[Warning!] Although the model selector TNOIMOD is set to 1, the new correlated thermal noise model is not activated. Please uncomment \"`define __TNOIMOD1__\" in the bsimcmg.va."); - `endif - end - - // Gate Current Shot Noise - if (IGCMOD != 0) begin - if (sigvds > 0) begin - I(`IntrinsicGate, si) <+ white_noise(2.0 * `q * abs(igcs + igs), "shot"); - I(`IntrinsicGate, di) <+ white_noise(2.0 * `q * abs(igcd + igd), "shot"); - end else begin - I(`IntrinsicGate, di) <+ white_noise(2.0 * `q * abs(igcs + igs), "shot"); - I(`IntrinsicGate, si) <+ white_noise(2.0 * `q * abs(igcd + igd), "shot"); - end - end - - if (IGBMOD != 0) begin - if (BULKMOD != 0) begin - I(`IntrinsicGate, e) <+ white_noise(2.0 * `q * abs(igbinv + igbacc), "shot"); - end else begin - I(`IntrinsicGate, si) <+ white_noise(2.0 * `q * abs(igbs), "shot"); - I(`IntrinsicGate, di) <+ white_noise(2.0 * `q * abs(igbd), "shot"); - end - end - - // Self Heating - `ifdef __SHMOD__ - if (SHMOD != 0 && RTH0 > 0) begin + `endif + end + + // Gate Current Shot Noise + if (IGCMOD != 0) begin + if (sigvds > 0) begin + I(`IntrinsicGate, si) <+ white_noise(2.0 * `q * abs(igcs + igs), "shot"); + I(`IntrinsicGate, di) <+ white_noise(2.0 * `q * abs(igcd + igd), "shot"); + end else begin + I(`IntrinsicGate, di) <+ white_noise(2.0 * `q * abs(igcs + igs), "shot"); + I(`IntrinsicGate, si) <+ white_noise(2.0 * `q * abs(igcd + igd), "shot"); + end + end + + if (IGBMOD != 0) begin + if (BULKMOD != 0) begin + I(`IntrinsicGate, e) <+ white_noise(2.0 * `q * abs(igbinv + igbacc), "shot"); + end else begin + I(`IntrinsicGate, si) <+ white_noise(2.0 * `q * abs(igbs), "shot"); + I(`IntrinsicGate, di) <+ white_noise(2.0 * `q * abs(igbd), "shot"); + end + end + + // Self Heating + `ifdef __SHMOD__ + if (SHMOD != 0 && RTH0 > 0) begin if (RDSMOD != 2) begin Pwr(ith_branch) <+ -(devsign * sigvds * V(di,si) * ids + V(d,di) * V(d,di) / Rdrain + V(s,si) * V(s,si) / Rsource); end else begin Pwr(ith_branch) <+ -(devsign * sigvds * V(di,si) * ids ); end - end - Pwr(rth_branch) <+ Temp(rth_branch) * gth; - Pwr(rth_branch) <+ ddt(Temp(rth_branch) * cth); - `endif - - // Operating-Point information - `ifdef __OPINFO__ - // W & L - WEFF = Weff0; // Effective width for IV - LEFF = Leff; // Effective length for IV - WEFFCV = WeffCV0; // Effective width for CV - LEFFCV = LeffCV; // Effective length for CV - - // Currents - IDS = devsign * ids; // Intrinsic Drain Current (Electrical) - if (sigvds > 0) begin // Total Source/Drain Currents (Physical) - if (BULKMOD != 0) begin - IDEFF = IDS + devsign * idsgen - devsign * (igd + igcd) + devsign * (Iii + igidl) - devsign * Ied; - ISEFF = -IDS - devsign * idsgen - devsign * (igs + igcs) + devsign * (igisl) - devsign * Ies; - end else begin - IDEFF = IDS + devsign * idsgen - devsign * (igd + igcd + igbd) + devsign * (Iii + igidl - igisl); - ISEFF = -IDS - devsign * idsgen - devsign * (igs + igcs + igbs) + devsign* (igisl - igidl); - end - end else begin - if (BULKMOD != 0) begin - IDEFF = -IDS - devsign * idsgen - devsign * (igs + igcs) + devsign * (igisl) - devsign * Ied; - ISEFF = IDS + devsign * idsgen - devsign * (igd + igcd) + devsign * (Iii + igidl) - devsign * Ies; - end else begin - IDEFF = -IDS - devsign * idsgen - devsign * (igs + igcs + igbd) + devsign * (igisl - igidl); - ISEFF = IDS + devsign * idsgen - devsign * (igd + igcd + igbs) + devsign * (Iii + igidl - igisl); - end - end - - if (BULKMOD == 0) begin // Total Gate Current - IGTOT = devsign * (igs + igd + igcs + igcd + igbs + igbd); - end else begin - IGTOT = devsign * (igs + igd + igcs + igcd + igbacc + igbinv); - end - - IDSGEN = sigvds * devsign * idsgen; // Generation-Recombination Current (Physical) - III = devsign * Iii; // Impact Ionization Current - if (sigvds > 0) begin - IGIDL = devsign * igidl; // GIDL Current (Physical) - IGISL = devsign * igisl; // GISL Current (Physical) - end else begin - IGIDL = devsign * igisl; // GIDL Current (Physical) - IGISL = devsign * igidl; // GISL Current (Physical) - end - - if (BULKMOD != 0) begin - IJSB = -devsign * Ies; // Source-Body Junction Current (Physical) - IJDB = -devsign * Ied; // Drain-Body Junction Current (Physical) - end else begin - IJSB = 0.0; - IJDB = 0.0; - end - - if (BULKMOD != 0) begin - ISUB = -III - IGIDL - IGISL - IJSB - IJDB - devsign * (igbinv + igbacc); // Substrate Current - end else begin - ISUB = 0.0; - end - - // Misc Variables - BETA = beta; // Drain Current prefactor per fin per finger - VDSSAT = Vdsat; // Drain-Source saturation Voltage - if (NGATE_i > 0) // Flatband Voltage - VFB = -devsign * (phib + Vtm * lln(NGATE_i / ni)); - else - VFB = PHIG_i - (EASUB + 0.5 * Eg + devsign * phib); - - // Threshold Voltage Calculation - q0 = 10.0 * Vtm / rc + 2.0 * qbs; - T1 = Vtm * (Vtm + q0); - T2 = cox * cox * T1; - T3 = 2.0 * `q * ni * epssub * Vtm; - VTH = VFB + devsign * (Vtm * lln(T2 / T3) + dvch_qm + phib + qbs + Vtm + dvth_all - DELVTRAND); - - // Conductances - GM = ddx(devsign * ids,V(`IntrinsicGate)); // Transconductance - GDS = ddx(devsign * ids,V(di)); // Output Conductance - if (BULKMOD != 0) - GMBS = ddx(devsign * ids,V(e)); // Body Transconductance - else - GMBS = 0.0; - - // Intrinsic Charges (Physical) (Sriram: Not accurate for NQSMOD= 2 and 3) - QGI = devsign * qg + devsign * qg_acc; - QDI = devsign * qd; - QSI = devsign * qs; - QBI = devsign * (qb + qb_acc); - - // Total Charges (Sriram: Not accurate for NQSMOD= 2 and 3) - QG = devsign * qg + qgs_parasitic + qgd_parasitic + (CGEOMOD == 1 ? qgs_fr + qgd_fr : 0) + devsign * qg_acc - devsign * Qeg; - QD = devsign * qd - qgd_parasitic - (CGEOMOD == 1 ? qgd_fr : 0) - devsign * Qed; - QS = devsign * qs - qgs_parasitic - (CGEOMOD == 1 ? qgs_fr : 0) - devsign * Qes; - QB = devsign * (qb + qb_acc) + devsign * (Qeg + Qes + Qed); - - // Intrinsic Capacitances (Physical) - CGGI = ddx(QGI, V(`IntrinsicGate)); - CGSI = ddx(-QGI, V(si)); - CGDI = ddx(-QGI, V(di)); - CGEI = ddx(-QGI, V(e)); - - CSGI = ddx(-QSI, V(`IntrinsicGate)); - CSDI = ddx(-QSI, V(di)); - CSSI = ddx(QSI, V(si)); - CSEI = ddx(-QSI, V(e)); // Should be zero everywhere - - CDGI = ddx(-QDI, V(`IntrinsicGate)); - CDDI = ddx(QDI, V(di)); - CDSI = ddx(-QDI, V(si)); - CDEI = ddx(-QDI, V(e)); - - CEGI = ddx(-QBI, V(`IntrinsicGate)); - CEDI = ddx(-QBI, V(di)); // Should be zero everywhere - CESI = ddx(-QBI, V(si)); // Should be zero everywhere - CEEI = ddx(QBI, V(e)); - - // Total Capacitances - CGG = ddx(QG, V(`IntrinsicGate)); - CGS = ddx(-QG, V(si)); - CGD = ddx(-QG, V(di)); - CGE = ddx(-QG, V(e)); - - CSG = ddx(-QS, V(`IntrinsicGate)); - CSD = ddx(-QS, V(di)); - CSS = ddx(QS, V(si)); - CSE = ddx(-QS, V(e)); - - CDG = ddx(-QD, V(`IntrinsicGate)); - CDD = ddx(QD, V(di)); - CDS = ddx(-QD, V(si)); - CDE = ddx(-QD, V(e)); - - CEG = ddx(-QB, V(`IntrinsicGate)); - CED = ddx(-QB, V(di)); - CES = ddx(-QB, V(si)); - CEE = ddx(QB, V(e)); - - // Total extrinsic capacitance - CGSEXT = ddx(-(qgs_parasitic + (CGEOMOD == 1 ? qgs_fr : 0)),V(si)); // Gate-Source Overlap + outer fringing - CGDEXT = ddx(-(qgd_parasitic + (CGEOMOD == 1 ? qgd_fr : 0)),V(di)); // Gate-Drain Overlap + outer fringing - CGBOV = ddx(Qeg,V(e)); // Gate-Body Overlap - CGBOV = -devsign * CGBOV; - - // Total of Junction Capacitance and Source/Drain-Body Overlap Capacitance - CJST = ddx(Qes, V(si)); - CJST = -devsign * CJST; - CJDT = ddx(Qed, V(di)); - CJDT = -devsign * CJDT; - - RSGEO = RSourceGeo; // External bias independent Source Resistance - RDGEO = RDrainGeo; // External bias independent Drain Resistance - CFGEO = Cfr_geo; // Geometric Parasitic Cap for CGEOMOD=1 - - // Output for Self-Heating Temperature - T_TOTAL_K = DevTemp; - T_TOTAL_C = DevTemp - `P_CELSIUS0; - T_DELTA_SH = Temp(t); - - `ifdef __DEBUG__ - // Individual Gate Current Components - IGS = devsign * igs; - IGD = devsign * igd; - IGCS = devsign * igcs; - IGCD = devsign * igcd; - if (BULKMOD == 0) begin - IGBS = devsign * igbs; - IGBD = devsign * igbd; - end else begin - IGBINV = devsign * igbinv; - IGBACC = devsign * igbacc; - end - - DIDSDVG = ddx(ids, V(`IntrinsicGate)); - DIDSDVG = devsign * sigvds * DIDSDVG; - DIDSDVS = ddx(ids, V(si)); - DIDSDVS = devsign * sigvds * DIDSDVS; - DIDSDVD = ddx(ids, V(di)); - DIDSDVD = devsign * sigvds * DIDSDVD; - `ifdef __SHMOD__ - DIDSDVTH = ddx(ids, Temp(t)); - DIDSDVTH = devsign * sigvds * DIDSDVTH; - `endif - DIGSDVG = ddx(igs + igcs, V(`IntrinsicGate)); - DIGSDVG = devsign * DIGSDVG; - DIGSDVS = ddx(igs + igcs, V(si)); - DIGSDVS = devsign * DIGSDVS; - DIGSDVD = ddx(igs + igcs, V(di)); - DIGSDVD = devsign * DIGSDVD; - `ifdef __SHMOD__ - DIGSDVTH = ddx(igs + igcs, Temp(t)); - DIGSDVTH = devsign * DIGSDVTH; - `endif - DIGDDVG = ddx(igd + igcd, V(`IntrinsicGate)); - DIGDDVG = devsign * DIGDDVG; - DIGDDVS = ddx(igd + igcd, V(si)); - DIGDDVS = devsign * DIGDDVS; - DIGDDVD = ddx(igd + igcd, V(di)); - DIGDDVD = devsign * DIGDDVD; - `ifdef __SHMOD__ - DIGDDVTH = ddx(igd + igcd, Temp(t)); - DIGDDVTH = devsign * DIGDDVTH; - `endif - DIIIDVG = ddx(Iii, V(`IntrinsicGate)); - DIIIDVG = devsign * DIIIDVG; - DIIIDVS = ddx(Iii, V(si)); - DIIIDVS = devsign * DIIIDVS; - DIIIDVD = ddx(Iii, V(di)); - DIIIDVD = devsign * DIIIDVD; - `ifdef __SHMOD__ - DIIIDVTH = ddx(Iii, Temp(t)); - DIIIDVTH = devsign * DIIIDVTH; - `endif - DIGIDLDVG = ddx(igidl, V(`IntrinsicGate)); - DIGIDLDVG = devsign * DIGIDLDVG; - DIGIDLDVS = ddx(igidl, V(si)); - DIGIDLDVS = devsign * DIGIDLDVS; - DIGIDLDVD = ddx(igidl, V(di)); - DIGIDLDVD = devsign * DIGIDLDVD; - `ifdef __SHMOD__ - DIGIDLDVTH = ddx(igidl, Temp(t)); - DIGIDLDVTH = devsign * DIGIDLDVTH; - `endif - DIGISLDVG = ddx(igisl, V(`IntrinsicGate)); - DIGISLDVG = devsign * DIGISLDVG; - DIGISLDVS = ddx(igisl, V(si)); - DIGISLDVS = devsign * DIGISLDVS; - DIGISLDVD = ddx(igisl, V(di)); - DIGISLDVD = devsign * DIGISLDVD; - `ifdef __SHMOD__ - DIGISLDVTH = ddx(igisl, Temp(t)); - DIGISLDVTH = devsign * DIGISLDVTH; - `endif - - `ifdef __SHMOD__ - CGT = ddx(QG, Temp(t)); - CST = ddx(QS, Temp(t)); - CDT = ddx(QD, Temp(t)); - `endif - ITH = ids * vds; - `ifdef __SHMOD__ - DITHDVTH = ddx(ITH, Temp(t)); - `endif - DITHDVG = ddx(ITH, V(`IntrinsicGate)); - DITHDVS = ddx(ITH, V(si)); - DITHDVD = ddx(ITH, V(di)); - `endif // __DEBUG__ - `endif // __OPINFO__ + end + Pwr(rth_branch) <+ Temp(rth_branch) * gth; + Pwr(rth_branch) <+ ddt(Temp(rth_branch) * cth); + `endif + + // Operating-Point information + `ifdef __OPINFO__ + // W & L + WEFF = Weff0; // Effective width for IV + LEFF = Leff; // Effective length for IV + WEFFCV = WeffCV0; // Effective width for CV + LEFFCV = LeffCV; // Effective length for CV + + // Currents + IDS = devsign * ids; // Intrinsic Drain Current (Electrical) + if (sigvds > 0) begin // Total Source/Drain Currents (Physical) + if (BULKMOD != 0) begin + IDEFF = IDS + devsign * idsgen - devsign * (igd + igcd) + devsign * (Iii + igidl) - devsign * Ied; + ISEFF = -IDS - devsign * idsgen - devsign * (igs + igcs) + devsign * (igisl) - devsign * Ies; + end else begin + IDEFF = IDS + devsign * idsgen - devsign * (igd + igcd + igbd) + devsign * (Iii + igidl - igisl); + ISEFF = -IDS - devsign * idsgen - devsign * (igs + igcs + igbs) + devsign* (igisl - igidl); + end + end else begin + if (BULKMOD != 0) begin + IDEFF = -IDS - devsign * idsgen - devsign * (igs + igcs) + devsign * (igisl) - devsign * Ied; + ISEFF = IDS + devsign * idsgen - devsign * (igd + igcd) + devsign * (Iii + igidl) - devsign * Ies; + end else begin + IDEFF = -IDS - devsign * idsgen - devsign * (igs + igcs + igbd) + devsign * (igisl - igidl); + ISEFF = IDS + devsign * idsgen - devsign * (igd + igcd + igbs) + devsign * (Iii + igidl - igisl); + end + end + + if (BULKMOD == 0) begin // Total Gate Current + IGTOT = devsign * (igs + igd + igcs + igcd + igbs + igbd); + end else begin + IGTOT = devsign * (igs + igd + igcs + igcd + igbacc + igbinv); + end + + IDSGEN = sigvds * devsign * idsgen; // Generation-Recombination Current (Physical) + III = devsign * Iii; // Impact Ionization Current + if (sigvds > 0) begin + IGIDL = devsign * igidl; // GIDL Current (Physical) + IGISL = devsign * igisl; // GISL Current (Physical) + end else begin + IGIDL = devsign * igisl; // GIDL Current (Physical) + IGISL = devsign * igidl; // GISL Current (Physical) + end + + if (BULKMOD != 0) begin + IJSB = -devsign * Ies; // Source-Body Junction Current (Physical) + IJDB = -devsign * Ied; // Drain-Body Junction Current (Physical) + end else begin + IJSB = 0.0; + IJDB = 0.0; + end + + if (BULKMOD != 0) begin + ISUB = -III - IGIDL - IGISL - IJSB - IJDB - devsign * (igbinv + igbacc); // Substrate Current + end else begin + ISUB = 0.0; + end + + // Misc Variables + BETA = beta; // Drain Current prefactor per fin per finger + VDSSAT = Vdsat; // Drain-Source saturation Voltage + if (NGATE_i > 0) // Flatband Voltage + VFB = -devsign * (phib + Vtm * lln(NGATE_i / ni)); + else + VFB = PHIG_i - (EASUB + 0.5 * Eg + devsign * phib); + + // Threshold Voltage Calculation + q0 = 10.0 * Vtm / rc + 2.0 * qbs; + T1 = Vtm * (Vtm + q0); + T2 = cox * cox * T1; + T3 = 2.0 * `q * ni * epssub * Vtm; + VTH = VFB + devsign * (Vtm * lln(T2 / T3) + dvch_qm + phib + qbs + Vtm + dvth_all - DELVTRAND); + + // Conductances + GM = ddx(devsign * ids,V(`IntrinsicGate)); // Transconductance + GDS = ddx(devsign * ids,V(di)); // Output Conductance + if (BULKMOD != 0) + GMBS = ddx(devsign * ids,V(e)); // Body Transconductance + else + GMBS = 0.0; + + // Intrinsic Charges (Physical) (Sriram: Not accurate for NQSMOD= 2 and 3) + QGI = devsign * qg + devsign * qg_acc; + QDI = devsign * qd; + QSI = devsign * qs; + QBI = devsign * (qb + qb_acc); + + // Total Charges (Sriram: Not accurate for NQSMOD= 2 and 3) + QG = devsign * qg + qgs_parasitic + qgd_parasitic + (CGEOMOD == 1 ? qgs_fr + qgd_fr : 0) + devsign * qg_acc - devsign * Qeg; + QD = devsign * qd - qgd_parasitic - (CGEOMOD == 1 ? qgd_fr : 0) - devsign * Qed; + QS = devsign * qs - qgs_parasitic - (CGEOMOD == 1 ? qgs_fr : 0) - devsign * Qes; + QB = devsign * (qb + qb_acc) + devsign * (Qeg + Qes + Qed); + + // Intrinsic Capacitances (Physical) + CGGI = ddx(QGI, V(`IntrinsicGate)); + CGSI = ddx(-QGI, V(si)); + CGDI = ddx(-QGI, V(di)); + CGEI = ddx(-QGI, V(e)); + + CSGI = ddx(-QSI, V(`IntrinsicGate)); + CSDI = ddx(-QSI, V(di)); + CSSI = ddx(QSI, V(si)); + CSEI = ddx(-QSI, V(e)); // Should be zero everywhere + + CDGI = ddx(-QDI, V(`IntrinsicGate)); + CDDI = ddx(QDI, V(di)); + CDSI = ddx(-QDI, V(si)); + CDEI = ddx(-QDI, V(e)); + + CEGI = ddx(-QBI, V(`IntrinsicGate)); + CEDI = ddx(-QBI, V(di)); // Should be zero everywhere + CESI = ddx(-QBI, V(si)); // Should be zero everywhere + CEEI = ddx(QBI, V(e)); + + // Total Capacitances + CGG = ddx(QG, V(`IntrinsicGate)); + CGS = ddx(-QG, V(si)); + CGD = ddx(-QG, V(di)); + CGE = ddx(-QG, V(e)); + + CSG = ddx(-QS, V(`IntrinsicGate)); + CSD = ddx(-QS, V(di)); + CSS = ddx(QS, V(si)); + CSE = ddx(-QS, V(e)); + + CDG = ddx(-QD, V(`IntrinsicGate)); + CDD = ddx(QD, V(di)); + CDS = ddx(-QD, V(si)); + CDE = ddx(-QD, V(e)); + + CEG = ddx(-QB, V(`IntrinsicGate)); + CED = ddx(-QB, V(di)); + CES = ddx(-QB, V(si)); + CEE = ddx(QB, V(e)); + + // Total extrinsic capacitance + CGSEXT = ddx(-(qgs_parasitic + (CGEOMOD == 1 ? qgs_fr : 0)),V(si)); // Gate-Source Overlap + outer fringing + CGDEXT = ddx(-(qgd_parasitic + (CGEOMOD == 1 ? qgd_fr : 0)),V(di)); // Gate-Drain Overlap + outer fringing + CGBOV = ddx(Qeg,V(e)); // Gate-Body Overlap + CGBOV = -devsign * CGBOV; + + // Total of Junction Capacitance and Source/Drain-Body Overlap Capacitance + CJST = ddx(Qes, V(si)); + CJST = -devsign * CJST; + CJDT = ddx(Qed, V(di)); + CJDT = -devsign * CJDT; + + RSGEO = RSourceGeo; // External bias independent Source Resistance + RDGEO = RDrainGeo; // External bias independent Drain Resistance + CFGEO = Cfr_geo; // Geometric Parasitic Cap for CGEOMOD=1 + + // Output for Self-Heating Temperature + T_TOTAL_K = DevTemp; + T_TOTAL_C = DevTemp - `P_CELSIUS0; + T_DELTA_SH = Temp(t); + + `ifdef __DEBUG__ + // Individual Gate Current Components + IGS = devsign * igs; + IGD = devsign * igd; + IGCS = devsign * igcs; + IGCD = devsign * igcd; + if (BULKMOD == 0) begin + IGBS = devsign * igbs; + IGBD = devsign * igbd; + end else begin + IGBINV = devsign * igbinv; + IGBACC = devsign * igbacc; + end + + DIDSDVG = ddx(ids, V(`IntrinsicGate)); + DIDSDVG = devsign * sigvds * DIDSDVG; + DIDSDVS = ddx(ids, V(si)); + DIDSDVS = devsign * sigvds * DIDSDVS; + DIDSDVD = ddx(ids, V(di)); + DIDSDVD = devsign * sigvds * DIDSDVD; + `ifdef __SHMOD__ + DIDSDVTH = ddx(ids, Temp(t)); + DIDSDVTH = devsign * sigvds * DIDSDVTH; + `endif + DIGSDVG = ddx(igs + igcs, V(`IntrinsicGate)); + DIGSDVG = devsign * DIGSDVG; + DIGSDVS = ddx(igs + igcs, V(si)); + DIGSDVS = devsign * DIGSDVS; + DIGSDVD = ddx(igs + igcs, V(di)); + DIGSDVD = devsign * DIGSDVD; + `ifdef __SHMOD__ + DIGSDVTH = ddx(igs + igcs, Temp(t)); + DIGSDVTH = devsign * DIGSDVTH; + `endif + DIGDDVG = ddx(igd + igcd, V(`IntrinsicGate)); + DIGDDVG = devsign * DIGDDVG; + DIGDDVS = ddx(igd + igcd, V(si)); + DIGDDVS = devsign * DIGDDVS; + DIGDDVD = ddx(igd + igcd, V(di)); + DIGDDVD = devsign * DIGDDVD; + `ifdef __SHMOD__ + DIGDDVTH = ddx(igd + igcd, Temp(t)); + DIGDDVTH = devsign * DIGDDVTH; + `endif + DIIIDVG = ddx(Iii, V(`IntrinsicGate)); + DIIIDVG = devsign * DIIIDVG; + DIIIDVS = ddx(Iii, V(si)); + DIIIDVS = devsign * DIIIDVS; + DIIIDVD = ddx(Iii, V(di)); + DIIIDVD = devsign * DIIIDVD; + `ifdef __SHMOD__ + DIIIDVTH = ddx(Iii, Temp(t)); + DIIIDVTH = devsign * DIIIDVTH; + `endif + DIGIDLDVG = ddx(igidl, V(`IntrinsicGate)); + DIGIDLDVG = devsign * DIGIDLDVG; + DIGIDLDVS = ddx(igidl, V(si)); + DIGIDLDVS = devsign * DIGIDLDVS; + DIGIDLDVD = ddx(igidl, V(di)); + DIGIDLDVD = devsign * DIGIDLDVD; + `ifdef __SHMOD__ + DIGIDLDVTH = ddx(igidl, Temp(t)); + DIGIDLDVTH = devsign * DIGIDLDVTH; + `endif + DIGISLDVG = ddx(igisl, V(`IntrinsicGate)); + DIGISLDVG = devsign * DIGISLDVG; + DIGISLDVS = ddx(igisl, V(si)); + DIGISLDVS = devsign * DIGISLDVS; + DIGISLDVD = ddx(igisl, V(di)); + DIGISLDVD = devsign * DIGISLDVD; + `ifdef __SHMOD__ + DIGISLDVTH = ddx(igisl, Temp(t)); + DIGISLDVTH = devsign * DIGISLDVTH; + `endif + + `ifdef __SHMOD__ + CGT = ddx(QG, Temp(t)); + CST = ddx(QS, Temp(t)); + CDT = ddx(QD, Temp(t)); + `endif + ITH = ids * vds; + `ifdef __SHMOD__ + DITHDVTH = ddx(ITH, Temp(t)); + `endif + DITHDVG = ddx(ITH, V(`IntrinsicGate)); + DITHDVS = ddx(ITH, V(si)); + DITHDVD = ddx(ITH, V(di)); + `endif // __DEBUG__ + `endif // __OPINFO__ end // analog block ends //================================================ diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_cfringe.include b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_cfringe.include index f4e211f77..04d206f22 100644 --- a/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_cfringe.include +++ b/src/spicelib/devices/adms/bsimcmg/admsva/bsimcmg_cfringe.include @@ -4,7 +4,7 @@ // ******************************************************** // // ******************************************************** -// * Copyright 2016 Regents of the University of California. +// * Copyright 2016 Regents of the University of California. // * All rights reserved. // * // * Project Director: Prof. Chenming Hu. @@ -18,7 +18,7 @@ // support. The University of California and its employees are not liable // for the condition or performance of the software. // The University of California owns the copyright and grants users a perpetual, -// irrevocable, worldwide, non-exclusive, royalty-free license with +// irrevocable, worldwide, non-exclusive, royalty-free license with // respect to the software as set forth below. // The University of California hereby disclaims all implied warranties. // The University of California grants the users the right to modify, copy, @@ -35,8 +35,8 @@ // the software on any copy or modification of such made available // to others // Agreed to on __Jan 01, 2016__________________ -// By: ___University of California, Berkeley____ -// ___Chenming Hu_____________________ +// By: ___University of California, Berkeley____ +// ___Chenming Hu_____________________ // ___Professor in Graduate School _______ // ******************************************************** @@ -64,53 +64,53 @@ real x42_TT2, x42_Cfgsat, x42_delta, Cfg; `define Cfringe_2d(block_name, Hg, Hc, Lext, Wfin, Lc, Lg, Tox, Cf1, Cgg) \ -begin : block_name \ - x42_Hr = 2.3 + 0.2 * ((Hg) + (Tox)) / (Hc); \ - x42_Lr = 1.05; \ - x42_Hgdelta = abs((Hg) + (Tox) - (Hc)); \ - x42_Lmax = (Lext) * x42_Lr; \ - \ - x42_y = min((Hc), (Hg) + (Tox)); \ - x42_x = (Lext) / (x42_Hr + 1.0); \ - x42_Cnon = 1.7e12; \ - x42_CcgSat = epssp * (x42_y - x42_x) / (Lext); \ - x42_TT1 = x42_Cnon * x42_CcgSat; \ - if(x42_TT1 > `EXPL_THRESHOLD) \ - x42_Ccg1 = x42_CcgSat; \ - else \ - x42_Ccg1 = 1.0 / x42_Cnon * ln(1.0 + lexp(x42_TT1)); \ - \ - x42_r1cf = 0.5 * \ - min((Hc) / ((Hg) + (Tox)), ((Hg) + (Tox)) / (Hc)); \ - x42_Rcf = x42_Hgdelta * x42_r1cf; \ - x42_Ccg2 = epssp * 2 / `M_PI * \ - ln(((Lext) + 0.5 * `M_PI * x42_Rcf) / (Lext)); \ - \ - x42_Ccg = (Wfin) * (x42_Ccg1 + x42_Ccg2); \ - \ - x42_x = x42_Lmax / (Hg); \ - x42_C1 = 4.0 / (sqrt(2.0 * (x42_x + 1)) * `M_PI); \ - x42_C2 = sqrt((Tox) * (Tox) + 2.0 * (Hg) * (Tox) + \ - (Hg) * (Hg) * (x42_x + 1)) * sqrt(x42_x + 1) + (Tox) + \ - (Hg) * x42_x + (Hg); \ - x42_C3 = (Tox) * sqrt((x42_x + 1) * (x42_x + 4)) + Tox * (x42_x + 2); \ - x42_Cfglog = epssp * (x42_C1 * ln(x42_C2 / x42_C3) + 12.27); \ - \ - x42_dcf = x42_Hr * x42_Lr; \ - x42_TT0 = sqrt(x42_dcf * x42_dcf + 1.0); \ - x42_TT1 = sqrt((x42_dcf * x42_dcf + 1) * ((x42_dcf * (Tox)) * (x42_dcf * (Tox)) + \ - 2 * x42_dcf * x42_Lmax * (Tox) + (x42_dcf * x42_dcf + 1) * x42_Lmax * x42_Lmax)) \ - + x42_dcf * (Tox) + x42_dcf * x42_dcf * x42_Lmax + x42_Lmax; \ - x42_TT2 = (x42_TT0 + 1.0) * (x42_dcf * (Tox)); \ - x42_Cfgsat = 2.0 * epssp * sqrt(2) / `M_PI * (Cf1) * x42_dcf \ - / x42_TT0 * ln(x42_TT1 / x42_TT2); \ - \ - x42_delta = 1.2e-12; \ - x42_TT1 = x42_Cfgsat - x42_Cfglog - x42_delta; \ - Cfg = (Wfin) * (x42_Cfgsat - 0.5 * (x42_TT1 + \ - sqrt(x42_TT1 * x42_TT1 + 4 * x42_delta * x42_Cfgsat))); \ - Cgg = x42_Ccg + Cfg; \ -end + begin : block_name \ + x42_Hr = 2.3 + 0.2 * ((Hg) + (Tox)) / (Hc); \ + x42_Lr = 1.05; \ + x42_Hgdelta = abs((Hg) + (Tox) - (Hc)); \ + x42_Lmax = (Lext) * x42_Lr; \ + \ + x42_y = min((Hc), (Hg) + (Tox)); \ + x42_x = (Lext) / (x42_Hr + 1.0); \ + x42_Cnon = 1.7e12; \ + x42_CcgSat = epssp * (x42_y - x42_x) / (Lext); \ + x42_TT1 = x42_Cnon * x42_CcgSat; \ + if (x42_TT1 > `EXPL_THRESHOLD) \ + x42_Ccg1 = x42_CcgSat; \ + else \ + x42_Ccg1 = 1.0 / x42_Cnon * ln(1.0 + lexp(x42_TT1)); \ + \ + x42_r1cf = 0.5 * \ + min((Hc) / ((Hg) + (Tox)), ((Hg) + (Tox)) / (Hc)); \ + x42_Rcf = x42_Hgdelta * x42_r1cf; \ + x42_Ccg2 = epssp * 2 / `M_PI * \ + ln(((Lext) + 0.5 * `M_PI * x42_Rcf) / (Lext)); \ + \ + x42_Ccg = (Wfin) * (x42_Ccg1 + x42_Ccg2); \ + \ + x42_x = x42_Lmax / (Hg); \ + x42_C1 = 4.0 / (sqrt(2.0 * (x42_x + 1)) * `M_PI); \ + x42_C2 = sqrt((Tox) * (Tox) + 2.0 * (Hg) * (Tox) + \ + (Hg) * (Hg) * (x42_x + 1)) * sqrt(x42_x + 1) + (Tox) + \ + (Hg) * x42_x + (Hg); \ + x42_C3 = (Tox) * sqrt((x42_x + 1) * (x42_x + 4)) + Tox * (x42_x + 2); \ + x42_Cfglog = epssp * (x42_C1 * ln(x42_C2 / x42_C3) + 12.27); \ + \ + x42_dcf = x42_Hr * x42_Lr; \ + x42_TT0 = sqrt(x42_dcf * x42_dcf + 1.0); \ + x42_TT1 = sqrt((x42_dcf * x42_dcf + 1) * ((x42_dcf * (Tox)) * (x42_dcf * (Tox)) + \ + 2 * x42_dcf * x42_Lmax * (Tox) + (x42_dcf * x42_dcf + 1) * x42_Lmax * x42_Lmax)) \ + + x42_dcf * (Tox) + x42_dcf * x42_dcf * x42_Lmax + x42_Lmax; \ + x42_TT2 = (x42_TT0 + 1.0) * (x42_dcf * (Tox)); \ + x42_Cfgsat = 2.0 * epssp * sqrt(2) / `M_PI * (Cf1) * x42_dcf \ + / x42_TT0 * ln(x42_TT1 / x42_TT2); \ + \ + x42_delta = 1.2e-12; \ + x42_TT1 = x42_Cfgsat - x42_Cfglog - x42_delta; \ + Cfg = (Wfin) * (x42_Cfgsat - 0.5 * (x42_TT1 + \ + sqrt(x42_TT1 * x42_TT1 + 4 * x42_delta * x42_Cfgsat))); \ + Cgg = x42_Ccg + Cfg; \ + end diff --git a/src/spicelib/devices/adms/bsimcmg/admsva/common_defs.include b/src/spicelib/devices/adms/bsimcmg/admsva/common_defs.include index 0d1ec67e5..d93f94733 100644 --- a/src/spicelib/devices/adms/bsimcmg/admsva/common_defs.include +++ b/src/spicelib/devices/adms/bsimcmg/admsva/common_defs.include @@ -4,7 +4,7 @@ // ******************************************************** // // ******************************************************** -// * Copyright 2016 Regents of the University of California. +// * Copyright 2016 Regents of the University of California. // * All rights reserved. // * // * Project Director: Prof. Chenming Hu. @@ -18,7 +18,7 @@ // support. The University of California and its employees are not liable // for the condition or performance of the software. // The University of California owns the copyright and grants users a perpetual, -// irrevocable, worldwide, non-exclusive, royalty-free license with +// irrevocable, worldwide, non-exclusive, royalty-free license with // respect to the software as set forth below. // The University of California hereby disclaims all implied warranties. // The University of California grants the users the right to modify, copy, @@ -35,8 +35,8 @@ // the software on any copy or modification of such made available // to others // Agreed to on __Jan 01, 2016__________________ -// By: ___University of California, Berkeley____ -// ___Chenming Hu_____________________ +// By: ___University of California, Berkeley____ +// ___Chenming Hu_____________________ // ___Professor in Graduate School _______ // ******************************************************** @@ -119,7 +119,7 @@ // MPIxx model parameter integer // IPRxx instance parameter real // IPIxx instance parameter integer -// || +// || // cc closed lower bound, closed upper bound // oo open lower bound, open upper bound // co closed lower bound, open upper bound @@ -137,49 +137,49 @@ `define ALIAS(alias,paramName) aliasparam alias = paramName ; `define OPP(nam,uni,des) (*units=uni, desc=des*) real nam ; -`define MPRnb(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def ; +`define MPRnb(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def ; `define MPRex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter real nam=def exclude exc ; -`define MPRcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr] ; -`define MPRoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr) ; -`define MPRco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr) ; -`define MPRoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr] ; +`define MPRcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr] ; +`define MPRoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr) ; +`define MPRco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from[lwr:upr) ; +`define MPRoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter real nam=def from(lwr:upr] ; `define MPRcz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from[ 0:inf); `define MPRoz(nam,def,uni, des) (*units=uni, desc=des*) parameter real nam=def from( 0:inf); `define MPInb(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def ; `define MPIex(nam,def,uni,exc, des) (*units=uni, desc=des*) parameter integer nam=def exclude exc ; `define MPIcc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr] ; -`define MPIoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr) ; -`define MPIco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr) ; -`define MPIoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr] ; +`define MPIoo(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr) ; +`define MPIco(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from[lwr:upr) ; +`define MPIoc(nam,def,uni,lwr,upr,des) (*units=uni, desc=des*) parameter integer nam=def from(lwr:upr] ; `define MPIcz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0:inf); `define MPIoz(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from( 0:inf); `define MPIsw(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ 0: 1] ; `define MPIty(nam,def,uni, des) (*units=uni, desc=des*) parameter integer nam=def from[ -1: 1] exclude 0 ; -`define IPRnb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def ; +`define IPRnb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def ; `define IPRex(nam,def,uni,exc, des) (*units=uni, type="instance", desc=des*) parameter real nam=def exclude exc ; -`define IPRcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr] ; -`define IPRoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr) ; -`define IPRco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr) ; -`define IPRoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr] ; +`define IPRcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr] ; +`define IPRoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr) ; +`define IPRco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[lwr:upr) ; +`define IPRoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter real nam=def from(lwr:upr] ; `define IPRcz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def from[ 0:inf); `define IPRoz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter real nam=def from( 0:inf); `define IPInb(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def ; `define IPIex(nam,def,uni,exc, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def exclude exc ; -`define IPIcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr] ; -`define IPIoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr) ; -`define IPIco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr) ; -`define IPIoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr] ; +`define IPIcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr] ; +`define IPIoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr) ; +`define IPIco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[lwr:upr) ; +`define IPIoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from(lwr:upr] ; `define IPIcz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from[ 0:inf); `define IPIoz(nam,def,uni, des) (*units=uni, type="instance", desc=des*) parameter integer nam=def from( 0:inf); `ifdef EXPLICIT_MFACTOR - `define IPM (*units="" , type="instance", desc="multiplicity factor"*) parameter real m=1.0 from(0.0:inf) ; - `define MFACTOR_USE m -`else // - `define IPM - `define MFACTOR_USE 1.0 + `define IPM (*units="" , type="instance", desc="multiplicity factor"*) parameter real m=1.0 from(0.0:inf) ; + `define MFACTOR_USE m +`else // + `define IPM + `define MFACTOR_USE 1.0 `endif diff --git a/src/spicelib/devices/adms/ekv/admsva/ekv.va b/src/spicelib/devices/adms/ekv/admsva/ekv.va index c6a32440b..a75bcfdd8 100644 --- a/src/spicelib/devices/adms/ekv/admsva/ekv.va +++ b/src/spicelib/devices/adms/ekv/admsva/ekv.va @@ -81,98 +81,98 @@ module ekv (d,g,s,b); // Instance parameters // - intrinsic model - parameter real l=10e-6 from [0:inf) `P(type="instance" info="Drawn length [m]" units="m"); - parameter real w=10e-6 from [0:inf) `P(type="instance" info="Drawn width [m]" units="m"); - parameter real m=1.0 from [1:inf) `P(type="instance" info="Parallel multiplier" units="m"); - parameter real ns=1.0 from [1:inf) `P(type="instance" info="Series multiplier" units="m"); - parameter real dtemp = 0.0 from (-inf:inf) `P(type="instance" info="Difference sim. temp and device temp" units="C"); + parameter real l=10e-6 from [0:inf) `P(type="instance" desc="Drawn length [m]" units="m"); + parameter real w=10e-6 from [0:inf) `P(type="instance" desc="Drawn width [m]" units="m"); + parameter real m=1.0 from [1:inf) `P(type="instance" desc="Parallel multiplier" units="m"); + parameter real ns=1.0 from [1:inf) `P(type="instance" desc="Series multiplier" units="m"); + parameter real dtemp = 0.0 from (-inf:inf) `P(type="instance" desc="Difference sim. temp and device temp" units="C"); // - external parasitics - parameter real ad=0.0 from [0:inf) `P(type="instance" info="Drain area" units="m^2"); - parameter real as=0.0 from [0:inf) `P(type="instance" info="Source area" units="m^2"); - parameter real pd=0.0 from [0:inf) `P(type="instance" info="Drain perimeter" units="m"); - parameter real ps=0.0 from [0:inf) `P(type="instance" info="Source perimeter" units="m"); - parameter real nrd=0.0 from [0:inf) `P(type="instance" info="Drain no. squares"); - parameter real nrs=0.0 from [0:inf) `P(type="instance" info="Source no. squares"); + parameter real ad=0.0 from [0:inf) `P(type="instance" desc="Drain area" units="m^2"); + parameter real as=0.0 from [0:inf) `P(type="instance" desc="Source area" units="m^2"); + parameter real pd=0.0 from [0:inf) `P(type="instance" desc="Drain perimeter" units="m"); + parameter real ps=0.0 from [0:inf) `P(type="instance" desc="Source perimeter" units="m"); + parameter real nrd=0.0 from [0:inf) `P(type="instance" desc="Drain no. squares"); + parameter real nrs=0.0 from [0:inf) `P(type="instance" desc="Source no. squares"); // Model parameters - parameter integer nmos=1 from [0:1] `P(info="MOS channel type"); - parameter integer pmos=1 from [0:1] `P(info="MOS channel type"); + parameter integer nmos=1 from [0:1] `P(desc="MOS channel type"); + parameter integer pmos=1 from [0:1] `P(desc="MOS channel type"); parameter integer type=1 from [-1:1] exclude 0; - parameter real tnom=27.0 from [-273.15:inf) `P(info="Nominal temperature" units="C"); - parameter real imax=1.0 from [0:inf) `P(info="Maximum forward junction current before linearization" units="A"); + parameter real tnom=27.0 from [-273.15:inf) `P(desc="Nominal temperature" units="C"); + parameter real imax=1.0 from [0:inf) `P(desc="Maximum forward junction current before linearization" units="A"); // - intrinsic model (optional, section 4.2.1) - parameter real tox=0.0 from [0:inf) `P(info="Oxide thickness" units="m"); - parameter real nsub=0.0 from [0:inf) `P(info="Channel doping" units="cm^-3"); - parameter real vfb=-1.0 from (-inf:inf) `P(info="Flat-band voltage" units="V"); + parameter real tox=0.0 from [0:inf) `P(desc="Oxide thickness" units="m"); + parameter real nsub=0.0 from [0:inf) `P(desc="Channel doping" units="cm^-3"); + parameter real vfb=-1.0 from (-inf:inf) `P(desc="Flat-band voltage" units="V"); - parameter real uo=0.0 from [0:inf) `P(info="Low-field mobility" units="cm^2/Vs"); - parameter real vmax=0.0 from [0:inf) `P(info="Saturation velocity" units="m/s"); - parameter real theta=0.0 from [0:inf) `P(info="Mobility reduction coefficient" units="V^-1"); + parameter real uo=0.0 from [0:inf) `P(desc="Low-field mobility" units="cm^2/Vs"); + parameter real vmax=0.0 from [0:inf) `P(desc="Saturation velocity" units="m/s"); + parameter real theta=0.0 from [0:inf) `P(desc="Mobility reduction coefficient" units="V^-1"); // - intrinsic model (process related, section 4.1) - parameter real cox=0.7e-3 from [1e-6:inf) `P(info="Oxide capacitance" units="F/m^2"); - parameter real xj=0.1e-6 from [1n:inf) `P(info="Junction depth" units="m"); - parameter real dl=0.0 from (-inf:inf) `P(info="Length correction" units="m"); - parameter real dw=0.0 from (-inf:inf) `P(info="Width correction" units="m"); + parameter real cox=0.7e-3 from [1e-6:inf) `P(desc="Oxide capacitance" units="F/m^2"); + parameter real xj=0.1e-6 from [1n:inf) `P(desc="Junction depth" units="m"); + parameter real dl=0.0 from (-inf:inf) `P(desc="Length correction" units="m"); + parameter real dw=0.0 from (-inf:inf) `P(desc="Width correction" units="m"); // - intrinsic model (basic, section 4.2) - parameter real gamma=0.7 from [0:inf) `P(info="Body effect parameter" units="V^0.5"); - parameter real phi=0.5 from [0.1:inf) `P(info="Bulk Fermi potential (*2)" units="V"); - parameter real vto=0.5 from (-inf:inf) `P(info="Long-channel threshold voltage" units="V"); - parameter real kp=20e-6 from [0.0:inf) `P(info="Transconductance parameter" units="A/V^2"); - parameter real ucrit=1.0e+6 from [100e+3:inf) `P(info="Longitudinal critical field" units="V/m"); - parameter real e0=1.0e-9 from [1e-12:inf) `P(info="Mobility reduction coefficient" units="V/m"); + parameter real gamma=0.7 from [0:inf) `P(desc="Body effect parameter" units="V^0.5"); + parameter real phi=0.5 from [0.1:inf) `P(desc="Bulk Fermi potential (*2)" units="V"); + parameter real vto=0.5 from (-inf:inf) `P(desc="Long-channel threshold voltage" units="V"); + parameter real kp=20e-6 from [0.0:inf) `P(desc="Transconductance parameter" units="A/V^2"); + parameter real ucrit=1.0e+6 from [100e+3:inf) `P(desc="Longitudinal critical field" units="V/m"); + parameter real e0=1.0e-9 from [1e-12:inf) `P(desc="Mobility reduction coefficient" units="V/m"); // - intrinsic model (channel length modulation and charge sharing, section 4.3) - parameter real lambda=0.5 from [0:inf) `P(info="Depletion length coefficient (CLM)"); - parameter real weta=0.25 from (-inf:inf) `P(info="Narrow-channel effect coefficient"); - parameter real leta=0.1 from (-inf:inf) `P(info="Short-channel effect coefficient"); + parameter real lambda=0.5 from [0:inf) `P(desc="Depletion length coefficient (CLM)"); + parameter real weta=0.25 from (-inf:inf) `P(desc="Narrow-channel effect coefficient"); + parameter real leta=0.1 from (-inf:inf) `P(desc="Short-channel effect coefficient"); // - intrinsic model (reverse short channel effect, section 4.4) - parameter real q0=0.0 from (-inf:inf) `P(info="RSCE peak charge density" units="C/m^2"); - parameter real lk=0.29e-6 from [10n:inf) `P(info="RSCE characteristic length" units="m"); + parameter real q0=0.0 from (-inf:inf) `P(desc="RSCE peak charge density" units="C/m^2"); + parameter real lk=0.29e-6 from [10n:inf) `P(desc="RSCE characteristic length" units="m"); // - intrinsic model (impact ionization, section 4.5) - parameter real iba=0.0 from (-inf:inf) `P(info="First impact ionization coefficient" units="m^-1"); - parameter real ibb=3e8 from [1e8:inf) `P(info="Second impact ionization coefficient" units="V/m"); - parameter real ibn=1.0 from [0.1:inf) `P(info="Saturation voltage factor for impact ionization"); + parameter real iba=0.0 from (-inf:inf) `P(desc="First impact ionization coefficient" units="m^-1"); + parameter real ibb=3e8 from [1e8:inf) `P(desc="Second impact ionization coefficient" units="V/m"); + parameter real ibn=1.0 from [0.1:inf) `P(desc="Saturation voltage factor for impact ionization"); // - intrinsic model (temperature, section 4.6) - parameter real tcv=1e-3 from (-inf:inf) `P(info="Threshold voltage TC" units="V/deg"); - parameter real bex=-1.5 from (-inf:inf) `P(info="Mobility temperature exponent"); - parameter real ucex=0.8 from (-inf:inf) `P(info="Longitudinal critical field temperature exponent"); - parameter real ibbt=9e-4 from (-inf:inf) `P(info="Temperature coefficient for ibb" units="K^-1"); + parameter real tcv=1e-3 from (-inf:inf) `P(desc="Threshold voltage TC" units="V/deg"); + parameter real bex=-1.5 from (-inf:inf) `P(desc="Mobility temperature exponent"); + parameter real ucex=0.8 from (-inf:inf) `P(desc="Longitudinal critical field temperature exponent"); + parameter real ibbt=9e-4 from (-inf:inf) `P(desc="Temperature coefficient for ibb" units="K^-1"); // - intrinsic model (matching, section 4.7) - parameter real avto=0.0 from (-inf:inf) `P(info="Area related vto mismatch parameter" units="Vm"); - parameter real akp=0.0 from (-inf:inf) `P(info="Area related kp mismatch parameter" units="m"); - parameter real agamma=0.0 from (-inf:inf) `P(info="Area related gamma mismatch parameter" units="V^0.5*m"); + parameter real avto=0.0 from (-inf:inf) `P(desc="Area related vto mismatch parameter" units="Vm"); + parameter real akp=0.0 from (-inf:inf) `P(desc="Area related kp mismatch parameter" units="m"); + parameter real agamma=0.0 from (-inf:inf) `P(desc="Area related gamma mismatch parameter" units="V^0.5*m"); // - intrinsic model (flicker noise, section 4.8) - parameter real kf=0.0 from [0:inf) `P(info="Flicker noise coefficient"); - parameter real af=1.0 from (-inf:inf) `P(info="Flicker noise exponent"); + parameter real kf=0.0 from [0:inf) `P(desc="Flicker noise coefficient"); + parameter real af=1.0 from (-inf:inf) `P(desc="Flicker noise exponent"); // - external parasitic parameters - parameter real hdif=0.0 from [0:inf) `P(info="S/D diffusion length (/2)" units="m"); - parameter real rsh=0.0 from [0:inf) `P(info="S/D sheet resistance" units="Ohm"); - parameter real js=0.0 from [0:inf) `P(info="S/D junction saturation current density" units="A/m^2"); - parameter real jsw=0.0 from [0:inf) `P(info="S/D junction sidewall saturation current density" units="A/m"); - parameter real xti=0.0 from [0:inf) `P(info="S/D diode saturation current temperature exponent"); - parameter real n=1 from [0.5:10] `P(info="S/D diode emission coefficient"); - parameter real cj=0.0 from [0:inf) `P(info="S/D zero-bias junction capacitance per area" units="F/m^2"); - parameter real cjsw=0.0 from [0:inf) `P(info="S/D zero-bias junction capacitance per perimeter" units="F/m"); - parameter real pb=0.8 from (0:inf) `P(info="S/D bottom junction builtin potential" units="V"); - parameter real pbsw=pb from (0:inf) `P(info="S/D sidewall junction builtin potential" units="V"); - parameter real mj=0.5 from (0:inf) `P(info="S/D bottom junction grading coefficient"); - parameter real mjsw=0.333 from (0:inf) `P(info="S/D sidewall junction grading coefficient"); - parameter real fc=0.5 from (0:inf) `P(info="S/D bottom junction forward-bias threshold"); - parameter real fcsw=fc from (0:inf) `P(info="S/D sidewall junction forward-bias threshold"); - parameter real cgso=1.5e-10 from [0:inf) `P(info="Gate-source overlap capacitance per width" units="F/m"); - parameter real cgdo=1.5e-10 from [0:inf) `P(info="Gate-drain overlap capacitance per width" units="F/m"); - parameter real cgbo=4.0e-10 from [0:inf) `P(info="Gate-bulk overlap capacitance per length" units="F/m"); + parameter real hdif=0.0 from [0:inf) `P(desc="S/D diffusion length (/2)" units="m"); + parameter real rsh=0.0 from [0:inf) `P(desc="S/D sheet resistance" units="Ohm"); + parameter real js=0.0 from [0:inf) `P(desc="S/D junction saturation current density" units="A/m^2"); + parameter real jsw=0.0 from [0:inf) `P(desc="S/D junction sidewall saturation current density" units="A/m"); + parameter real xti=0.0 from [0:inf) `P(desc="S/D diode saturation current temperature exponent"); + parameter real n=1 from [0.5:10] `P(desc="S/D diode emission coefficient"); + parameter real cj=0.0 from [0:inf) `P(desc="S/D zero-bias junction capacitance per area" units="F/m^2"); + parameter real cjsw=0.0 from [0:inf) `P(desc="S/D zero-bias junction capacitance per perimeter" units="F/m"); + parameter real pb=0.8 from (0:inf) `P(desc="S/D bottom junction builtin potential" units="V"); + parameter real pbsw=pb from (0:inf) `P(desc="S/D sidewall junction builtin potential" units="V"); + parameter real mj=0.5 from (0:inf) `P(desc="S/D bottom junction grading coefficient"); + parameter real mjsw=0.333 from (0:inf) `P(desc="S/D sidewall junction grading coefficient"); + parameter real fc=0.5 from (0:inf) `P(desc="S/D bottom junction forward-bias threshold"); + parameter real fcsw=fc from (0:inf) `P(desc="S/D sidewall junction forward-bias threshold"); + parameter real cgso=1.5e-10 from [0:inf) `P(desc="Gate-source overlap capacitance per width" units="F/m"); + parameter real cgdo=1.5e-10 from [0:inf) `P(desc="Gate-drain overlap capacitance per width" units="F/m"); + parameter real cgbo=4.0e-10 from [0:inf) `P(desc="Gate-bulk overlap capacitance per length" units="F/m"); // Declaration of variables integer mode, MOStype; @@ -193,6 +193,8 @@ module ekv (d,g,s,b); analog begin + MOStype = 1; + gmin = $simparam("gmin"); `INITIAL_MODEL // Model Initialization @@ -204,8 +206,7 @@ module ekv (d,g,s,b); end else begin MOStype = (`PGIVEN(type)) ? type : `NMOS; end - -//$strobe("MOStype %d", MOStype); + //$strobe("MOStype %d", MOStype); if (`PGIVEN(cox)) begin cox_p = cox; diff --git a/src/spicelib/devices/adms/mextram/admsva/bjt504t.va b/src/spicelib/devices/adms/mextram/admsva/bjt504t.va index 7f428a170..d5d1c36b7 100644 --- a/src/spicelib/devices/adms/mextram/admsva/bjt504t.va +++ b/src/spicelib/devices/adms/mextram/admsva/bjt504t.va @@ -9,25 +9,25 @@ module bjt504tva (c, b, e, s, dt); - // External ports +// External ports inout c, b, e, s, dt; -electrical c `P(info="external collector node"); -electrical b `P(info="external base node"); -electrical e `P(info="external emitter node"); -electrical s `P(info="external substrate node"); -electrical dt `P(info="external thermal node"); +electrical c `P(desc="external collector node"); +electrical b `P(desc="external base node"); +electrical e `P(desc="external emitter node"); +electrical s `P(desc="external substrate node"); +electrical dt `P(desc="external thermal node"); // Internal nodes -electrical c1 `P(info="internal collector node 1"); -electrical e1 `P(info="internal emitter node"); -electrical b1 `P(info="internal base node 1"); -electrical b2 `P(info="internal base node 2"); -electrical c2 `P(info="internal collector node 2"); -electrical c3 `P(info="internal collector node 3"); -electrical c4 `P(info="internal collector node 4"); +electrical c1 `P(desc="internal collector node 1"); +electrical e1 `P(desc="internal emitter node"); +electrical b1 `P(desc="internal base node 1"); +electrical b2 `P(desc="internal base node 2"); +electrical c2 `P(desc="internal collector node 2"); +electrical c3 `P(desc="internal collector node 3"); +electrical c4 `P(desc="internal collector node 4"); // For correlated noise implementation -electrical noi `P(info="internal noise node"); +electrical noi `P(desc="internal noise node"); `include "parameters.inc" `include "variables.inc" diff --git a/src/spicelib/devices/adms/mextram/admsva/evaluate.inc b/src/spicelib/devices/adms/mextram/admsva/evaluate.inc index 98304fa11..95f9ebd05 100644 --- a/src/spicelib/devices/adms/mextram/admsva/evaluate.inc +++ b/src/spicelib/devices/adms/mextram/admsva/evaluate.inc @@ -6,7 +6,7 @@ // Evaluate model equations begin // Currents and charges -// Nodal biases + // Nodal biases Vb2c1 = TYPE * V(b2, c1); Vb2c2 = TYPE * V(b2, c2); @@ -22,7 +22,7 @@ begin // Currents and charges Vbe = TYPE * V(b, e); Vbc = TYPE * V(b, c); -/* RvdT, 03-12-2007, voltage differences + /* RvdT, 03-12-2007, voltage differences associated with distributed parasitic collector. Evaluated taking values of resistances into account: in case of vanishing resistance corresponding node @@ -65,7 +65,7 @@ begin // Currents and charges `endif -// Exponential bias terms + // Exponential bias terms `expLin(eVb2c2,Vb2c2 * VtINV) `expLin(eVb2e1,Vb2e1 * VtINV) @@ -75,7 +75,7 @@ begin // Currents and charges `expLin(eVbc3,Vbc3 * VtINV) `ifdef SUBSTRATE `expLin(eVsc1,Vsc1 * VtINV) -// RvdT MXT504.10, new: eVsc3, eVsc4 + // RvdT MXT504.10, new: eVsc3, eVsc4 `expLin(eVsc3,Vsc3 * VtINV) `expLin(eVsc4,Vsc4 * VtINV) `endif @@ -85,9 +85,9 @@ begin // Currents and charges `expLin(eVb2c2VDC,(Vb2c2 - VDC_T) * VtINV) `expLin(eVb2c1VDC,(Vb2c1 - VDC_T) * VtINV) -// Governing equations + // Governing equations -// Epilayer model + // Epilayer model K0 = sqrt(1.0 + 4.0 * eVb2c2VDC); Kw = sqrt(1.0 + 4.0 * eVb2c1VDC); @@ -124,7 +124,7 @@ begin // Currents and charges p0star = gp02 + sqrt(sqr_arg); else p0star = gp0_help / (sqrt(sqr_arg) - gp02); - // if (p0star < `TEN_M40) p0star = 0.0; + // if (p0star < `TEN_M40) p0star = 0.0; eVb2c2star = p0star * (p0star + 1.0) * exp(VDC_T * VtINV); @@ -169,7 +169,7 @@ begin // Currents and charges Vte = VDE_T / (1.0 - PE) * (1.0 - E0BE) + `AJE * (Vb2e1 - Vje); - // Effective collector junction capacitance bias + // Effective collector junction capacitance bias Vjunc = Vb2c1 + Vxi0; bjc = (`AJC - XP_T) / (1.0 - XP_T); @@ -180,7 +180,7 @@ begin // Currents and charges fI * bjc * (Vjunc - Vjc); Vtc = (1.0 - XP_T) * Vcv + XP_T * Vb2c1; - // Transfer current + // Transfer current If0 = 4.0 * IS_TM / IK_TM; f1 = If0 * eVb2e1; @@ -222,16 +222,16 @@ begin // Currents and charges (tmpExp + exp(0.5 * VLR * VtINV)) + my_gmin * Vb1c4; -// begin RvdT, November 2008, MXT504.8_alpha + // begin RvdT, November 2008, MXT504.8_alpha -// Base-emitter tunneling current -// max E-field E0BE calculated in BE depletion charge model: + // Base-emitter tunneling current + // max E-field E0BE calculated in BE depletion charge model: if (IZEB > 0.0 && NZEB > 0.0 && Vb2e1 < 0) begin `expLin(eZEB, nZEB_T * (1 - (pow2_2mPE/(2.0*E0BE)))) -// Force all derivatives at Vb2e1=0 to zero by using in DZEB a -// modified dE0BE expression for E0BE: + // Force all derivatives at Vb2e1=0 to zero by using in DZEB a + // modified dE0BE expression for E0BE: x = Vb2e1 * inv_VDE_T ; dE0BE = pow(- x, -2.0-PE)*(PE*(1-PE*PE-3*x*(PE-1))-6*x*x*(PE-1+x)) * `one_sixth ; `expLin(edZEB, Vb2e1 * pow2_2mPE * nZEB_T / (VGZEB_T * dE0BE )) @@ -244,25 +244,25 @@ begin // Currents and charges Izteb = 0 ; end -// end RvdT, November 2008, MXT504.8_alpha + // end RvdT, November 2008, MXT504.8_alpha // Iex, Isub (XIex, XIsub) g1 = If0 * eVb1c4; g2 = 4.0 * eVb1c4VDC; -// nBex until and including MXT 504.9: -// nBex = g1 / (1.0 + sqrt(1.0 + g1)); -// nBex since MXT 504.10.1: Ackn. Jos Peters, Geoffrey Coram + // nBex until and including MXT 504.9: + // nBex = g1 / (1.0 + sqrt(1.0 + g1)); + // nBex since MXT 504.10.1: Ackn. Jos Peters, Geoffrey Coram nBex = (g1 - If0) / (1.0 + sqrt(1.0 + g1)); pWex = g2 / (1.0 + sqrt(1.0 + g2)); -/* Iex until and including MXT 504.9: + /* Iex until and including MXT 504.9: Iex = (1.0 / BRI_T) * (0.5 * IK_TM * nBex - IS_TM); */ -// Iex since MXT 504.10: RvdT@TUDelft Q1, 2011: + // Iex since MXT 504.10: RvdT@TUDelft Q1, 2011: Iex = IK_TM * nBex / (2.0 * BRI_T) ; `ifdef SUBSTRATE -// RvdT MXT504.10, new term: eVsc4 + // RvdT MXT504.10, new term: eVsc4 if (EXSUB == 1.0) Isub = 2.0 * ISS_TM * (eVb1c4 - eVsc4) / (1.0 + sqrt(1.0 + 4.0 * (IS_TM / IKS_TM) * eVb1c4)); @@ -270,11 +270,11 @@ begin // Currents and charges Isub = 2.0 * ISS_TM * (eVb1c4 - 1.0) / (1.0 + sqrt(1.0 + 4.0 * (IS_TM / IKS_TM) * eVb1c4)); -// until504.8: Isf = ISS_TM * (eVsc1 - 1.0); -// New 504.9: + // until504.8: Isf = ISS_TM * (eVsc1 - 1.0); + // New 504.9: if (ICSS < 0.0) -// this clause is to implement backwards compatibility + // this clause is to implement backwards compatibility begin Isf = ISS_TM * (eVsc1 - 1.0); end @@ -283,7 +283,7 @@ begin // Currents and charges Isf = ICSS_TM * (eVsc1 - 1.0); end -// End: New 504.9. + // End: New 504.9. `endif @@ -293,7 +293,7 @@ begin // Currents and charges XIsub = 0.0; `endif -/* begin: RvdT, Q4 2012, Mextram 504.11: added EXMOD=2 option: */ + /* begin: RvdT, Q4 2012, Mextram 504.11: added EXMOD=2 option: */ if (EXMOD == 1 || EXMOD == 2) begin @@ -304,18 +304,18 @@ begin // Currents and charges `endif Xg1 = If0 * eVbc3; -// XnBex until and including MXT 504.9: -// XnBex = Xg1 / (1.0 + sqrt(1.0 + Xg1)); -// XnBex in MXT 504.10.1: Ackn. Jos Peters, Geoffrey Coram: + // XnBex until and including MXT 504.9: + // XnBex = Xg1 / (1.0 + sqrt(1.0 + Xg1)); + // XnBex in MXT 504.10.1: Ackn. Jos Peters, Geoffrey Coram: XnBex = (Xg1 - If0) / (1.0 + sqrt(1.0 + Xg1)); -/* XIMex until and including MXT 504.9: + /* XIMex until and including MXT 504.9: XIMex = XEXT * (0.5 * IK_TM * XnBex - IS_TM) / BRI_T; */ -// XIMex in MXT 504.10: RvdT@TUDelft Q1, 2011: + // XIMex in MXT 504.10: RvdT@TUDelft Q1, 2011: XIMex = XEXT * 0.5 * IK_TM * XnBex / BRI_T; `ifdef SUBSTRATE -// RvdT MXT504.10, new term: eVsc3 + // RvdT MXT504.10, new term: eVsc3 if (EXSUB == 1.0) XIMsub = XEXT * 2.0 * ISS_TM * (eVbc3 - eVsc3) / (1.0 + sqrt(1.0 + 4.0 * IS_T / IKS_T * eVbc3)); @@ -346,7 +346,7 @@ begin // Currents and charges Fex = 1.0 ; end -/* end: RvdT, Q4, 2012, Mextram 504.11: added EXMOD=2 option: */ + /* end: RvdT, Q4, 2012, Mextram 504.11: added EXMOD=2 option: */ XIex = Fex * XIMex; @@ -360,7 +360,7 @@ begin // Currents and charges XnBex = 0 ; end - // Variable base resistance + // Variable base resistance q0Q = 1.0 + Vte / VER_T + Vtc / VEF_T; `max_hyp0(q1Q, q0Q, 0.1); @@ -369,7 +369,7 @@ begin // Currents and charges Rb2 = 3.0 * RBV_TM / qBQ; Ib1b2 = (2.0 * Vt * (eVb1b2 - 1.0) + Vb1b2) / Rb2; - // Weak-avalanche current + // Weak-avalanche current Iavl = 0.0; Gem = 0.0; @@ -421,9 +421,9 @@ begin // Currents and charges Vb2c2star = Vb2c2; `ifdef SELFHEATING -// Power dissipation + // Power dissipation -// RvdT 03-12-2007, modified power equation due to distribution collector resistance + // RvdT 03-12-2007, modified power equation due to distribution collector resistance power_dis = In * (Vb2e1 - Vb2c2star) + Ic1c2 * (Vb2c2star - Vb2c1) - @@ -434,8 +434,8 @@ begin // Currents and charges Vc4c1 * Vc4c1 * GCCin_TM + Vbb1 * Vbb1 / RBC_TM + Ib1b2 * Vb1b2 + -// 504.8: Nov. 2008, RvdT, TU_Delft: Zener current contribution added: -// Izteb > 0 for Vb2e1 < 0, hence the minus sign: + // 504.8: Nov. 2008, RvdT, TU_Delft: Zener current contribution added: + // Izteb > 0 for Vb2e1 < 0, hence the minus sign: (Ib1 + Ib2 - Izteb) * Vb2e1 + Ib1_s * Vb1e1 + `ifdef SUBSTRATE @@ -444,193 +444,193 @@ begin // Currents and charges XIsub * (Vbc3 - Vsc3) + Isf * Vsc1; `else - (Iex + Ib3) * Vb1c4 + XIex * Vbc3; + (Iex + Ib3) * Vb1c4 + XIex * Vbc3; `endif `endif - // Charges + // Charges - Qte = (1.0 - XCJE) * CJE_TM * Vte; - `min_logexp(Vje_s, Vb1e1, Vfe, a_VDE); - Qte_s = XCJE * CJE_TM * (VDE_T / (1.0 - PE) * + Qte = (1.0 - XCJE) * CJE_TM * Vte; + `min_logexp(Vje_s, Vb1e1, Vfe, a_VDE); + Qte_s = XCJE * CJE_TM * (VDE_T / (1.0 - PE) * (1.0 - pow(1.0 - Vje_s * inv_VDE_T, 1.0 - PE)) + `AJE * (Vb1e1 - Vje_s)); - Qtc = XCJC * CJC_TM * Vtc; - Qb0 = TAUB_T * IK_TM; - Qbe_qs = 0.5 * Qb0 * n0 * q1Q; - Qbc_qs = 0.5 * Qb0 * nB * q1Q; + Qtc = XCJC * CJC_TM * Vtc; + Qb0 = TAUB_T * IK_TM; + Qbe_qs = 0.5 * Qb0 * n0 * q1Q; + Qbc_qs = 0.5 * Qb0 * nB * q1Q; - a_VDC = 0.1 * VDC_T; - `min_logexp(Vjcex, Vb1c4, Vfc, a_VDC); - Vtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - Vjcex / VDC_T, 1.0 - PC)) + + a_VDC = 0.1 * VDC_T; + `min_logexp(Vjcex, Vb1c4, Vfc, a_VDC); + Vtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - Vjcex / VDC_T, 1.0 - PC)) + bjc * (Vb1c4 - Vjcex); - Qtex = CJC_TM * ((1.0 - XP_T) * Vtexv + XP_T * Vb1c4) * + Qtex = CJC_TM * ((1.0 - XP_T) * Vtexv + XP_T * Vb1c4) * (1.0 - XCJC) * (1.0 - XEXT); - `min_logexp(XVjcex, Vbc3, Vfc, a_VDC); - XVtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - XVjcex / VDC_T, 1.0 - PC)) + + `min_logexp(XVjcex, Vbc3, Vfc, a_VDC); + XVtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - XVjcex / VDC_T, 1.0 - PC)) + bjc * (Vbc3 - XVjcex); - XQtex = CJC_TM * ((1.0 - XP_T) * XVtexv + XP_T * Vbc3) * + XQtex = CJC_TM * ((1.0 - XP_T) * XVtexv + XP_T * Vbc3) * (1.0 - XCJC) * XEXT; `ifdef SUBSTRATE - a_VDS = 0.1 * VDS_T; - Vfs = VDS_T * (1.0 - pow(`AJS , -1.0 / PS)); - `min_logexp(Vjs, Vsc1, Vfs, a_VDS); - Qts = CJS_TM * (VDS_T / (1.0 - PS) * + a_VDS = 0.1 * VDS_T; + Vfs = VDS_T * (1.0 - pow(`AJS , -1.0 / PS)); + `min_logexp(Vjs, Vsc1, Vfs, a_VDS); + Qts = CJS_TM * (VDS_T / (1.0 - PS) * (1.0 - pow(1.0 - Vjs / VDS_T, 1.0 - PS)) + `AJS * (Vsc1 - Vjs)); `endif - Qe0 = TAUE_T * IK_TM * pow(IS_TM / IK_TM, 1.0 / MTAU); - `expLin(tmpExp,Vb2e1 / (MTAU * Vt)) + Qe0 = TAUE_T * IK_TM * pow(IS_TM / IK_TM, 1.0 / MTAU); + `expLin(tmpExp,Vb2e1 / (MTAU * Vt)) - // Niu Q2, 2016, for fixing reverse VBE noise when KE=1, KC=1, - // Previous Qe_qs causes unphysically large noise correlation time constant tau_n - Qe_qs = Qe0 * tmpExp; + // Niu Q2, 2016, for fixing reverse VBE noise when KE=1, KC=1, + // Previous Qe_qs causes unphysically large noise correlation time constant tau_n + Qe_qs = Qe0 * tmpExp; - Qepi0 = 4.0 * TEPI_T * Vt / RCV_TM; - Qepi = 0.5 * Qepi0 * xi_w * (p0star + pW + 2.0); + Qepi0 = 4.0 * TEPI_T * Vt / RCV_TM; + Qepi = 0.5 * Qepi0 * xi_w * (p0star + pW + 2.0); - Qex = TAUR_T * 0.5 * (Qb0 * nBex + Qepi0 * pWex) / (TAUB_T + TEPI_T); - XQex = 0.0; + Qex = TAUR_T * 0.5 * (Qb0 * nBex + Qepi0 * pWex) / (TAUB_T + TEPI_T); + XQex = 0.0; - if (EXMOD == 1) begin + if (EXMOD == 1) begin - Qex = Qex * (1.0 - XEXT); - Xg2 = 4.0 * eVbc3VDC; - XpWex = Xg2 / (1.0 + sqrt(1.0 + Xg2)); - XQex = 0.5 * Fex * XEXT * TAUR_T * + Qex = Qex * (1.0 - XEXT); + Xg2 = 4.0 * eVbc3VDC; + XpWex = Xg2 / (1.0 + sqrt(1.0 + Xg2)); + XQex = 0.5 * Fex * XEXT * TAUR_T * (Qb0 * XnBex + Qepi0 * XpWex) / (TAUB_T + TEPI_T); - end + end - Qb1b2 = 0.0; - if (EXPHI == 1) - begin - dVteVje = pow(1.0 - Vje * inv_VDE_T, -PE) - `AJE; - Vb2e1Vfe = (Vb2e1 - Vfe) / a_VDE; - if (Vb2e1Vfe < 0.0) - dVjeVb2e1 = 1.0 / (1.0 + exp(Vb2e1Vfe)); - else - dVjeVb2e1 = exp(- Vb2e1Vfe) / (1.0 + exp(- Vb2e1Vfe)); + Qb1b2 = 0.0; + if (EXPHI == 1) + begin + dVteVje = pow(1.0 - Vje * inv_VDE_T, -PE) - `AJE; + Vb2e1Vfe = (Vb2e1 - Vfe) / a_VDE; + if (Vb2e1Vfe < 0.0) + dVjeVb2e1 = 1.0 / (1.0 + exp(Vb2e1Vfe)); + else + dVjeVb2e1 = exp(- Vb2e1Vfe) / (1.0 + exp(- Vb2e1Vfe)); - dVteVb2e1 = dVteVje * dVjeVb2e1 + `AJE; - dQteVb2e1 = (1.0 - XCJE) * CJE_TM * dVteVb2e1; + dVteVb2e1 = dVteVje * dVjeVb2e1 + `AJE; + dQteVb2e1 = (1.0 - XCJE) * CJE_TM * dVteVb2e1; - dn0Vb2e1 = If0 * eVb2e1 * VtINV * (0.5 / sqrt(1.0 + f1)); - dQbeVb2e1 = 0.5 * Qb0 * q1Q * dn0Vb2e1; + dn0Vb2e1 = If0 * eVb2e1 * VtINV * (0.5 / sqrt(1.0 + f1)); + dQbeVb2e1 = 0.5 * Qb0 * q1Q * dn0Vb2e1; - // Niu, Q2 2016. Modified to fix reverse VBE noise problem. - dQeVb2e1 = Qe_qs / (MTAU * Vt); + // Niu, Q2 2016. Modified to fix reverse VBE noise problem. + dQeVb2e1 = Qe_qs / (MTAU * Vt); - Qb1b2 = 0.2 * Vb1b2 * (dQteVb2e1 + dQbeVb2e1 + dQeVb2e1); + Qb1b2 = 0.2 * Vb1b2 * (dQteVb2e1 + dQbeVb2e1 + dQeVb2e1); - Qe = (1 - KE) * Qe_qs; - Qbe_qs_eff = Qbe_qs + KE * Qe_qs; - Qbc = XQB * Qbe_qs_eff + Qbc_qs; - Qbe = (1 - XQB) * Qbe_qs_eff; + Qe = (1 - KE) * Qe_qs; + Qbe_qs_eff = Qbe_qs + KE * Qe_qs; + Qbc = XQB * Qbe_qs_eff + Qbc_qs; + Qbe = (1 - XQB) * Qbe_qs_eff; - end - else - begin - Qbe = Qbe_qs; - Qbc = Qbc_qs; - Qe = Qe_qs; - end + end + else + begin + Qbe = Qbe_qs; + Qbc = Qbc_qs; + Qe = Qe_qs; + end -// Add branch current contributions + // Add branch current contributions - // Static currents - I(c1, c2) <+ TYPE * Ic1c2; - I(c2, e1) <+ TYPE * In; - I(b1, e1) <+ TYPE * Ib1_s; -// begin RvdT, 28-10-2008, MXT504.8_alpha -// contribution tunnel current added - I(b2, e1) <+ TYPE * (Ib1 + Ib2 - Izteb); + // Static currents + I(c1, c2) <+ TYPE * Ic1c2; + I(c2, e1) <+ TYPE * In; + I(b1, e1) <+ TYPE * Ib1_s; + // begin RvdT, 28-10-2008, MXT504.8_alpha + // contribution tunnel current added + I(b2, e1) <+ TYPE * (Ib1 + Ib2 - Izteb); `ifdef SUBSTRATE - I(b1, s) <+ TYPE * Isub; - I(b, s) <+ TYPE * XIsub; - I(s, c1) <+ TYPE * Isf; + I(b1, s) <+ TYPE * Isub; + I(b, s) <+ TYPE * XIsub; + I(s, c1) <+ TYPE * Isf; `endif - I(b1, b2) <+ TYPE * Ib1b2; - I(b2, c2) <+ TYPE * (-1.0 * Iavl); - I(e, e1) <+ TYPE * Vee1 / RE_TM; - I(b, b1) <+ TYPE * Vbb1 / RBC_TM; + I(b1, b2) <+ TYPE * Ib1b2; + I(b2, c2) <+ TYPE * (-1.0 * Iavl); + I(e, e1) <+ TYPE * Vee1 / RE_TM; + I(b, b1) <+ TYPE * Vbb1 / RBC_TM; `ifdef SELFHEATING - // Electrical equivalent for the thermal network - I(dt) <+ V(dt) / RTH_Tamb_M; - I(dt) <+ ddt(CTH_M * V(dt)); - I(dt) <+ -1.0 * power_dis; + // Electrical equivalent for the thermal network + I(dt) <+ V(dt) / RTH_Tamb_M; + I(dt) <+ ddt(CTH_M * V(dt)); + I(dt) <+ -1.0 * power_dis; `endif - // Dynamic currents - I(b2, e1) <+ ddt(TYPE * (Qte + Qbe + Qe)); - I(b1, e1) <+ ddt(TYPE * (Qte_s)); - I(b2, c2) <+ ddt(TYPE * (Qtc + Qbc + Qepi)); + // Dynamic currents + I(b2, e1) <+ ddt(TYPE * (Qte + Qbe + Qe)); + I(b1, e1) <+ ddt(TYPE * (Qte_s)); + I(b2, c2) <+ ddt(TYPE * (Qtc + Qbc + Qepi)); `ifdef SUBSTRATE - I(s, c1) <+ ddt(TYPE * Qts); + I(s, c1) <+ ddt(TYPE * Qts); `endif - I(b1, b2) <+ ddt(TYPE * Qb1b2); - I(b, e) <+ ddt(TYPE * CBEO_M * Vbe); - I(b, c) <+ ddt(TYPE * CBCO_M * Vbc); + I(b1, b2) <+ ddt(TYPE * Qb1b2); + I(b, e) <+ ddt(TYPE * CBEO_M * Vbe); + I(b, c) <+ ddt(TYPE * CBCO_M * Vbc); -end // Currents and charges + end // Currents and charges -/* RvdT, Delft Univ. Tech. 03-12-2007. + /* RvdT, Delft Univ. Tech. 03-12-2007. Distribution of parasitic collector resistance. This construct supports the case RCBLI = 0.0 and or RCBLX = 0.0 . It is up to the compiler to adjust the circuit topology and perform a node-collapse in such cases. */ -if (RCBLX > 0.0) -begin - I(b, c3) <+ TYPE * XIex; - I(c, c3) <+ TYPE * Vcc3 * GCCxx_TM ; - I(b, c3) <+ ddt(TYPE * (XQtex + XQex)); - if (RCBLI > 0.0) - begin - I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM; - I(b1, c4) <+ TYPE * (Ib3 + Iex); - I(c3, c4) <+ TYPE * Vc3c4 * GCCex_TM ; - I(b1, c4) <+ ddt(TYPE * (Qtex + Qex)); - end - else - begin - V(c4, c1) <+ 0.0 ; - I(b1, c1) <+ TYPE * (Ib3 + Iex); - I(b1, c1) <+ ddt(TYPE * (Qtex + Qex)); - I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ; - end -end -else -begin - V(c3, c4) <+ 0 ; - if (RCBLI > 0.0) + if (RCBLX > 0.0) begin - I(b, c4) <+ TYPE * XIex; - I(c, c4) <+ TYPE * Vcc3 * GCCxx_TM ; - I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM; - I(b1, c4) <+ TYPE * (Ib3 + Iex); - I(b1, c4) <+ ddt(TYPE * (Qtex + Qex)); - I(b, c4) <+ ddt(TYPE * (XQtex + XQex)); + I(b, c3) <+ TYPE * XIex; + I(c, c3) <+ TYPE * Vcc3 * GCCxx_TM ; + I(b, c3) <+ ddt(TYPE * (XQtex + XQex)); + if (RCBLI > 0.0) + begin + I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM; + I(b1, c4) <+ TYPE * (Ib3 + Iex); + I(c3, c4) <+ TYPE * Vc3c4 * GCCex_TM ; + I(b1, c4) <+ ddt(TYPE * (Qtex + Qex)); + end + else + begin + V(c4, c1) <+ 0.0 ; + I(b1, c1) <+ TYPE * (Ib3 + Iex); + I(b1, c1) <+ ddt(TYPE * (Qtex + Qex)); + I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ; + end end else begin - I(b, c1) <+ TYPE * XIex; - I(c, c1) <+ TYPE * Vcc3 * GCCxx_TM ; - V(c4, c1) <+ 0.0 ; - I(b1, c1) <+ TYPE * (Ib3 + Iex); - I(b1, c1) <+ ddt(TYPE * (Qtex + Qex)); - I(b, c1) <+ ddt(TYPE * (XQtex + XQex)); - I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ; + V(c3, c4) <+ 0 ; + if (RCBLI > 0.0) + begin + I(b, c4) <+ TYPE * XIex; + I(c, c4) <+ TYPE * Vcc3 * GCCxx_TM ; + I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM; + I(b1, c4) <+ TYPE * (Ib3 + Iex); + I(b1, c4) <+ ddt(TYPE * (Qtex + Qex)); + I(b, c4) <+ ddt(TYPE * (XQtex + XQex)); + end + else + begin + I(b, c1) <+ TYPE * XIex; + I(c, c1) <+ TYPE * Vcc3 * GCCxx_TM ; + V(c4, c1) <+ 0.0 ; + I(b1, c1) <+ TYPE * (Ib3 + Iex); + I(b1, c1) <+ ddt(TYPE * (Qtex + Qex)); + I(b, c1) <+ ddt(TYPE * (XQtex + XQex)); + I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ; + end end -end diff --git a/src/spicelib/devices/adms/mextram/admsva/initialize.inc b/src/spicelib/devices/adms/mextram/admsva/initialize.inc index 4ec600711..ea7c5afa6 100644 --- a/src/spicelib/devices/adms/mextram/admsva/initialize.inc +++ b/src/spicelib/devices/adms/mextram/admsva/initialize.inc @@ -10,7 +10,7 @@ else // Initialize model constants - // Impact ionization constants (NPN - PNP) +// Impact ionization constants (NPN - PNP) if (TYPE == 1) begin @@ -26,7 +26,7 @@ end Xext1 = 1.0 - XEXT; - // Temperature independent MULT scaling +// Temperature independent MULT scaling `ifdef SELFHEATING CTH_M = CTH * MULT; diff --git a/src/spicelib/devices/adms/mextram/admsva/noise.inc b/src/spicelib/devices/adms/mextram/admsva/noise.inc index d6b960904..f07ce223a 100644 --- a/src/spicelib/devices/adms/mextram/admsva/noise.inc +++ b/src/spicelib/devices/adms/mextram/admsva/noise.inc @@ -7,139 +7,139 @@ `NOISE begin - // Thermal noise - common = 4.0 * `KB * Tk; - powerREC = common / RE_TM; // Emitter resistance - powerRBC = common / RBC_TM; // Base resistance - powerRCCxx = common * GCCxx_TM; // Collector resistance - powerRCCex = common * GCCex_TM; // Collector resistance - powerRCCin = common * GCCin_TM; // Collector resistance - powerRBV = common / Rb2 * (4.0 * eVb1b2 + 5.0) * `one_third ; // Variable base resistance - - // Main current shot noise - In_N = (If + Ir) / qBI; - powerCCS = 2.0 * `QQ * abs(In_N); - - // Weak-avalanche current shot noise - if (KAVL > 0) begin - Gem_N = abs(Iavl / In_N); - end else begin - Gem_N = 0.0; - end - - powerIIS = 2.0 * `QQ * Iavl * (Gem_N + 1); - - // Transit time for noise - if (In_N > 0.0) begin - Taub_N = (Qbe + Qbc) / In_N; - end else begin - Taub_N = TAUB_T * q1Q * qBI; - end - - // RF correlation noise model switch - if (KC == 1) begin - // use charge partition for noise transit time - taun = XQB * Taub_N; - end else if (KC == 2) begin - // use fraction of transit time for noise transit time - taun = FTAUN * Taub_N; - end else begin // KC == 0 - // no correlation noise - taun = 0; - end - - // Forward base current shot noise and 1/f noise - powerFBCS = 2.0 * `QQ * (abs(Ib1) + abs(Ib2) + abs(Izteb)); - powerFBC1fB1 = (1.0 - XIBI) * pow((abs(Ib1) / (1 - XIBI)), AF) * KF_M; - exponentFBC1fB2 = (2.0 * (MLF - 1.0)) + (AF * (2.0 - MLF)); - powerFBC1fB2 = KFN_M * pow(abs(Ib2), exponentFBC1fB2); - - // Emitter-base sidewall current shot and 1/f noise - powerEBSCS = 2.0 * `QQ * abs(Ib1_s); - if (XIBI == 0) - powerEBSC1f = 0.0; - else - powerEBSC1f = KF_M * XIBI * pow((abs(Ib1_s / XIBI)), AF); - - // Reverse base current shot noise and 1/f noise - powerRBCS = 2.0 * `QQ * abs(Ib3); - powerRBC1f = KF_M * pow(abs(Ib3), AF); - - // Extrinsic current shot noise and 1/f noise - powerExCS = 2.0 * `QQ * abs(Iex); - powerExC1f = KF_M * (1 - (EXMOD * XEXT)) * +// Thermal noise +common = 4.0 * `KB * Tk; +powerREC = common / RE_TM; // Emitter resistance +powerRBC = common / RBC_TM; // Base resistance +powerRCCxx = common * GCCxx_TM; // Collector resistance +powerRCCex = common * GCCex_TM; // Collector resistance +powerRCCin = common * GCCin_TM; // Collector resistance +powerRBV = common / Rb2 * (4.0 * eVb1b2 + 5.0) * `one_third ; // Variable base resistance + +// Main current shot noise +In_N = (If + Ir) / qBI; +powerCCS = 2.0 * `QQ * abs(In_N); + +// Weak-avalanche current shot noise +if (KAVL > 0) begin + Gem_N = abs(Iavl / In_N); +end else begin + Gem_N = 0.0; +end + +powerIIS = 2.0 * `QQ * Iavl * (Gem_N + 1); + +// Transit time for noise +if (In_N > 0.0) begin + Taub_N = (Qbe + Qbc) / In_N; +end else begin + Taub_N = TAUB_T * q1Q * qBI; +end + +// RF correlation noise model switch +if (KC == 1) begin + // use charge partition for noise transit time + taun = XQB * Taub_N; +end else if (KC == 2) begin + // use fraction of transit time for noise transit time + taun = FTAUN * Taub_N; +end else begin // KC == 0 + // no correlation noise + taun = 0; +end + +// Forward base current shot noise and 1/f noise +powerFBCS = 2.0 * `QQ * (abs(Ib1) + abs(Ib2) + abs(Izteb)); +powerFBC1fB1 = (1.0 - XIBI) * pow((abs(Ib1) / (1 - XIBI)), AF) * KF_M; +exponentFBC1fB2 = (2.0 * (MLF - 1.0)) + (AF * (2.0 - MLF)); +powerFBC1fB2 = KFN_M * pow(abs(Ib2), exponentFBC1fB2); + +// Emitter-base sidewall current shot and 1/f noise +powerEBSCS = 2.0 * `QQ * abs(Ib1_s); +if (XIBI == 0) + powerEBSC1f = 0.0; +else + powerEBSC1f = KF_M * XIBI * pow((abs(Ib1_s / XIBI)), AF); + +// Reverse base current shot noise and 1/f noise +powerRBCS = 2.0 * `QQ * abs(Ib3); +powerRBC1f = KF_M * pow(abs(Ib3), AF); + +// Extrinsic current shot noise and 1/f noise +powerExCS = 2.0 * `QQ * abs(Iex); +powerExC1f = KF_M * (1 - (EXMOD * XEXT)) * pow((abs(Iex) / (1 - (EXMOD * XEXT))), AF); - powerExCSMOD = 2.0 * `QQ * abs(XIex) * EXMOD; - if (XEXT == 0.0) - powerExC1fMOD = 0.0; - else - powerExC1fMOD = KF_M * EXMOD * XEXT * pow((abs(XIex) / XEXT), AF); +powerExCSMOD = 2.0 * `QQ * abs(XIex) * EXMOD; +if (XEXT == 0.0) + powerExC1fMOD = 0.0; +else + powerExC1fMOD = KF_M * EXMOD * XEXT * pow((abs(XIex) / XEXT), AF); `ifdef SUBSTRATE - // Substrate current shot noise (between nodes B1 and S, resp. B and S) - powerSubsCS_B1S = 2.0 * `QQ * abs(Isub); - powerSubsCS_BS = 2.0 * `QQ * abs(XIsub); +// Substrate current shot noise (between nodes B1 and S, resp. B and S) + powerSubsCS_B1S = 2.0 * `QQ * abs(Isub); + powerSubsCS_BS = 2.0 * `QQ * abs(XIsub); `endif - // Reference un-correlated current shot noise sources - I(noi) <+ white_noise(powerCCS, "un-correlated current shot noise"); - I(noi) <+ V(noi); - - // Implementing correlated noise sources - I(b2, e1) <+ taun * ddt(V(noi)); - I(c2, b2) <+ Gem_N * V(noi); - I(c2, e1) <+ V(noi); - - // Implementing un-correlated noise sources - I(c2, b2) <+ white_noise(powerIIS, "un-correlated noise"); - I(b2, e1) <+ white_noise(powerFBCS, "un-correlated noise"); - - // Add noise sources - I(e, e1) <+ white_noise(powerREC, "emitter resistance"); - I(b, b1) <+ white_noise(powerRBC, "base resistance"); - I(b1, b2) <+ white_noise(powerRBV, "variable base resistance"); - I(b2, e1) <+ flicker_noise(powerFBC1fB1, 1, "bas_emi_forw"); - I(b2, e1) <+ flicker_noise(powerFBC1fB2, 1, "bas_emi_forw"); - I(e1, b1) <+ white_noise(powerEBSCS, "emi_bas_side"); - I(e1, b1) <+ flicker_noise(powerEBSC1f, 1, "emi_bas_side"); - I(b1, c4) <+ white_noise(powerRBCS, "bas_col_reve"); - I(b1, c4) <+ flicker_noise(powerRBC1f, 1, "bas_col_reve"); - I(b1, c4) <+ white_noise(powerExCS, "Ext_bas_col"); - I(b1, c4) <+ flicker_noise(powerExC1f, 1, "Ext_bas_col"); - I(b, c3) <+ white_noise(powerExCSMOD, "Ext_bas_col"); - I(b, c3) <+ flicker_noise(powerExC1fMOD, 1, "Ext_bas_col"); +// Reference un-correlated current shot noise sources +I(noi) <+ white_noise(powerCCS, "un-correlated current shot noise"); +I(noi) <+ V(noi); + +// Implementing correlated noise sources +I(b2, e1) <+ taun * ddt(V(noi)); +I(c2, b2) <+ Gem_N * V(noi); +I(c2, e1) <+ V(noi); + +// Implementing un-correlated noise sources +I(c2, b2) <+ white_noise(powerIIS, "un-correlated noise"); +I(b2, e1) <+ white_noise(powerFBCS, "un-correlated noise"); + +// Add noise sources +I(e, e1) <+ white_noise(powerREC, "emitter resistance"); +I(b, b1) <+ white_noise(powerRBC, "base resistance"); +I(b1, b2) <+ white_noise(powerRBV, "variable base resistance"); +I(b2, e1) <+ flicker_noise(powerFBC1fB1, 1, "bas_emi_forw"); +I(b2, e1) <+ flicker_noise(powerFBC1fB2, 1, "bas_emi_forw"); +I(e1, b1) <+ white_noise(powerEBSCS, "emi_bas_side"); +I(e1, b1) <+ flicker_noise(powerEBSC1f, 1, "emi_bas_side"); +I(b1, c4) <+ white_noise(powerRBCS, "bas_col_reve"); +I(b1, c4) <+ flicker_noise(powerRBC1f, 1, "bas_col_reve"); +I(b1, c4) <+ white_noise(powerExCS, "Ext_bas_col"); +I(b1, c4) <+ flicker_noise(powerExC1f, 1, "Ext_bas_col"); +I(b, c3) <+ white_noise(powerExCSMOD, "Ext_bas_col"); +I(b, c3) <+ flicker_noise(powerExC1fMOD, 1, "Ext_bas_col"); `ifdef SUBSTRATE - I(b1, s) <+ white_noise(powerSubsCS_B1S, "bas_sub_current"); - I(b, s) <+ white_noise(powerSubsCS_BS, "bas_sub_current"); + I(b1, s) <+ white_noise(powerSubsCS_B1S, "bas_sub_current"); + I(b, s) <+ white_noise(powerSubsCS_BS, "bas_sub_current"); `endif - if (RCBLX > 0.0) - begin - if (RCBLI > 0.0) - begin /* all branches exist */ - I(c, c3) <+ white_noise(powerRCCxx, "collector plug resistance"); - I(c3, c4) <+ white_noise(powerRCCex, "extrinsic collector BL resistance"); - I(c4, c1) <+ white_noise(powerRCCin, "intrinsic collector BL resistance"); - end - else - begin /* only Rcblx exists */ - I(c, c3) <+ white_noise(powerRCCxx, "collector plug resistance"); - I(c3, c1) <+ white_noise(powerRCCex, "extrinsic collector BL resistance"); - end +if (RCBLX > 0.0) +begin + if (RCBLI > 0.0) + begin /* all branches exist */ + I(c, c3) <+ white_noise(powerRCCxx, "collector plug resistance"); + I(c3, c4) <+ white_noise(powerRCCex, "extrinsic collector BL resistance"); + I(c4, c1) <+ white_noise(powerRCCin, "intrinsic collector BL resistance"); + end + else + begin /* only Rcblx exists */ + I(c, c3) <+ white_noise(powerRCCxx, "collector plug resistance"); + I(c3, c1) <+ white_noise(powerRCCex, "extrinsic collector BL resistance"); + end +end +else +begin + if (RCBLI > 0.0) + begin /* only Rcbli exists */ + I(c, c4) <+ white_noise(powerRCCxx, "collector plug resistance"); + I(c4, c1) <+ white_noise(powerRCCin, "intrinsic collector BL resistance"); end - else - begin - if (RCBLI > 0.0) - begin /* only Rcbli exists */ - I(c, c4) <+ white_noise(powerRCCxx, "collector plug resistance"); - I(c4, c1) <+ white_noise(powerRCCin, "intrinsic collector BL resistance"); - end - else - begin /* neither Rcblx nor Rcbli exists */ - I(c, c1) <+ white_noise(powerRCCxx, "collector plug resistance"); - end + else + begin /* neither Rcblx nor Rcbli exists */ + I(c, c1) <+ white_noise(powerRCCxx, "collector plug resistance"); end +end end // Noise diff --git a/src/spicelib/devices/adms/mextram/admsva/opinfo.inc b/src/spicelib/devices/adms/mextram/admsva/opinfo.inc index 21df4b289..e46e59013 100644 --- a/src/spicelib/devices/adms/mextram/admsva/opinfo.inc +++ b/src/spicelib/devices/adms/mextram/admsva/opinfo.inc @@ -9,24 +9,24 @@ begin `ifdef __VAMS_COMPACT_MODELING__ -// The external currents and the current gain -OP_ic = I(); // External DC collector current -OP_ib = I(); // External DC base Current + // The external currents and the current gain + OP_ic = I(); // External DC collector current + OP_ib = I(); // External DC base Current -if (OP_ib == 0) + if (OP_ib == 0) begin OP_betadc = 0.0 ; end -else + else begin OP_betadc = OP_ic / OP_ib; // External DC Current gain end -// begin added in MXT 504.9: -OP_ie = I(); // External DC emitter current -OP_vbe = V(b, e); // External base-emitter bias -OP_vce = V(c, e); // External collector-emitter bias -OP_vbc = V(b, c); // External base-collector bias + // begin added in MXT 504.9: + OP_ie = I(); // External DC emitter current + OP_vbe = V(b, e); // External base-emitter bias + OP_vce = V(c, e); // External collector-emitter bias + OP_vbc = V(b, c); // External base-collector bias `ifdef SUBSTRATE OP_is = I(); // External DC emitter current @@ -35,107 +35,107 @@ OP_vbc = V(b, c); // External base-collector bias OP_vsc = V(s, c); // External substrate-collector bias `endif -// end added in MXT 504.9: - -// The internal voltage differences -OP_vb2e1 = Vb2e1; // Internal base-emiter bias -OP_vb2c2 = Vb2c2; // Internal base-emiter bias -OP_vb2c1 = Vb2c1; // Internal base-collector bias including epilayer - -OP_vb1c1 = Vb1b2 + Vb2c1; // External base-collector bias without contact resistances - -OP_vc4c1 = Vc4c1; // Bias over intrinsic buried layer -OP_vc3c4 = Vc3c4; // Bias over extrinsic buried layer - -OP_ve1e = - Vee1; // Bias over emiter resistance - -// The branch currents -OP_in = In; // Main current -OP_ic1c2 = Ic1c2; // Epilayer current -OP_ib1b2 = Ib1b2; // Pinched-base current -OP_ib1 = Ib1; // Ideal forward base current -OP_sib1 = Ib1_s; // Ideal side-wall base current -// -// 504.8, RvdT, TU-Delft April. 2009: -// -OP_izteb = Izteb ; // Zener tunneling current -// -OP_ib2 = Ib2; // Non-ideal forward base current -OP_ib3 = Ib3; // Non-ideal reverse base current -OP_iavl = Iavl; // Avalanche current -OP_iex = Iex; // Extrinsic reverse base current -OP_xiex = XIex; // Extrinsic reverse base current + // end added in MXT 504.9: + + // The internal voltage differences + OP_vb2e1 = Vb2e1; // Internal base-emiter bias + OP_vb2c2 = Vb2c2; // Internal base-emiter bias + OP_vb2c1 = Vb2c1; // Internal base-collector bias including epilayer + + OP_vb1c1 = Vb1b2 + Vb2c1; // External base-collector bias without contact resistances + + OP_vc4c1 = Vc4c1; // Bias over intrinsic buried layer + OP_vc3c4 = Vc3c4; // Bias over extrinsic buried layer + + OP_ve1e = - Vee1; // Bias over emiter resistance + + // The branch currents + OP_in = In; // Main current + OP_ic1c2 = Ic1c2; // Epilayer current + OP_ib1b2 = Ib1b2; // Pinched-base current + OP_ib1 = Ib1; // Ideal forward base current + OP_sib1 = Ib1_s; // Ideal side-wall base current + // + // 504.8, RvdT, TU-Delft April. 2009: + // + OP_izteb = Izteb ; // Zener tunneling current + // + OP_ib2 = Ib2; // Non-ideal forward base current + OP_ib3 = Ib3; // Non-ideal reverse base current + OP_iavl = Iavl; // Avalanche current + OP_iex = Iex; // Extrinsic reverse base current + OP_xiex = XIex; // Extrinsic reverse base current `ifdef SUBSTRATE OP_isub = Isub; // Substrate current OP_xisub = XIsub; // Substrate current OP_isf = Isf; // Substrate-collector current `endif -OP_ire = - Vee1 / RE_TM; // Current through emiter resistance -OP_irbc = Vbb1 / RBC_TM; // Current through constant base resistance - -OP_ircc = Vcc3 * GCCxx_TM; // Current through collector contact resistance -OP_ircblx = Vc3c4 * GCCex_TM; // Current through extrinsic buried layer resistance -OP_ircbli = Vc4c1 * GCCin_TM; // Current through extrinsic buried layer resistance - -// The branch charges -OP_qe = Qe; // Emitter charge or emitter neutral charge -OP_qte = Qte; // Base-emiter depletion charge -OP_sqte = Qte_s; // Sidewall base-emiter depletion charge -OP_qbe = Qbe; // Base-emiter diffusion charge -OP_qbc = Qbc; // Base-collector diffusion charge -OP_qtc = Qtc; // Base-colector depletion charge -OP_qepi = Qepi; // Epilayer diffusion charge -OP_qb1b2 = Qb1b2; // AC current crowding charge -OP_qtex = Qtex; // Extrinsic base-collector depletion charge -OP_xqtex = XQtex; // Extrinsic base-collector depletion charge -OP_qex = Qex; // Extrinsic base-collector diffusion charge -OP_xqex = XQex; // Extrinsic base-collector diffusion charge + OP_ire = - Vee1 / RE_TM; // Current through emiter resistance + OP_irbc = Vbb1 / RBC_TM; // Current through constant base resistance + + OP_ircc = Vcc3 * GCCxx_TM; // Current through collector contact resistance + OP_ircblx = Vc3c4 * GCCex_TM; // Current through extrinsic buried layer resistance + OP_ircbli = Vc4c1 * GCCin_TM; // Current through extrinsic buried layer resistance + + // The branch charges + OP_qe = Qe; // Emitter charge or emitter neutral charge + OP_qte = Qte; // Base-emiter depletion charge + OP_sqte = Qte_s; // Sidewall base-emiter depletion charge + OP_qbe = Qbe; // Base-emiter diffusion charge + OP_qbc = Qbc; // Base-collector diffusion charge + OP_qtc = Qtc; // Base-colector depletion charge + OP_qepi = Qepi; // Epilayer diffusion charge + OP_qb1b2 = Qb1b2; // AC current crowding charge + OP_qtex = Qtex; // Extrinsic base-collector depletion charge + OP_xqtex = XQtex; // Extrinsic base-collector depletion charge + OP_qex = Qex; // Extrinsic base-collector diffusion charge + OP_xqex = XQex; // Extrinsic base-collector diffusion charge `ifdef SUBSTRATE OP_qts = Qts; // Collector substrate depletion charge `endif -// Small signal equivalent circuit conductances and resistances + // Small signal equivalent circuit conductances and resistances -OP_gx = - ddx(In, V(e1)); // Forward transconductance -OP_gy = - ddx(In, V(c2)); // Reverse transconductance + OP_gx = - ddx(In, V(e1)); // Forward transconductance + OP_gy = - ddx(In, V(c2)); // Reverse transconductance -OP_gz = - ddx(In, V(c1)); // Reverse transconductance + OP_gz = - ddx(In, V(c1)); // Reverse transconductance -OP_sgpi = - ddx(Ib1_s, V(e)) + OP_sgpi = - ddx(Ib1_s, V(e)) - ddx(Ib1_s, V(e1)); // Conductance sidewal b-e junction -OP_gpix = - ddx(Ib1+Ib2, V(e1)); // Conductance floor b-e junction + OP_gpix = - ddx(Ib1+Ib2, V(e1)); // Conductance floor b-e junction -OP_gpiy = - ddx(Ib1, V(c2)); // Early effect on recombination base current -OP_gpiz = - ddx(Ib1, V(c1)); // Early effect on recombination base current + OP_gpiy = - ddx(Ib1, V(c2)); // Early effect on recombination base current + OP_gpiz = - ddx(Ib1, V(c1)); // Early effect on recombination base current -OP_gmux = ddx( Iavl, V(e1)); // Early effect on avalanche current limitting -OP_gmuy = ddx( Iavl, V(c2)); // Conductance of avalanche current -OP_gmuz = - ddx(- Iavl, V(c1)); // Conductance of avalanche current + OP_gmux = ddx( Iavl, V(e1)); // Early effect on avalanche current limitting + OP_gmuy = ddx( Iavl, V(c2)); // Conductance of avalanche current + OP_gmuz = - ddx(- Iavl, V(c1)); // Conductance of avalanche current -// Conductance extrinsic b-c current : -OP_gmuex = ddx(Iex+Ib3, V(e)) + // Conductance extrinsic b-c current : + OP_gmuex = ddx(Iex+Ib3, V(e)) + ddx(Iex+Ib3, V(b1)) + ddx(Iex+Ib3, V(b2)) + ddx(Iex+Ib3, V(e1)) + ddx(Iex+Ib3, V(c2)); -OP_xgmuex = ddx(XIex, V(b)) ; // Conductance extrinsic b-c current + OP_xgmuex = ddx(XIex, V(b)) ; // Conductance extrinsic b-c current -OP_grcvy = - ddx(Ic1c2, V(c2)); // Conductance of epilayer current -OP_grcvz = - ddx(Ic1c2, V(c1)); // Conductance of epilayer current + OP_grcvy = - ddx(Ic1c2, V(c2)); // Conductance of epilayer current + OP_grcvz = - ddx(Ic1c2, V(c1)); // Conductance of epilayer current -OP_rbv = 1.0 / (- ddx(Ib1b2, V(b2)) - ddx(Ib1b2, V(c2))); // Base resistance + OP_rbv = 1.0 / (- ddx(Ib1b2, V(b2)) - ddx(Ib1b2, V(c2))); // Base resistance -OP_grbvx = - ddx(Ib1b2, V(e)) - ddx(Ib1b2, V(e1)); // Early effect on base resistance -OP_grbvy = - ddx(Ib1b2, V(c2)); // Early effect on base resistance + OP_grbvx = - ddx(Ib1b2, V(e)) - ddx(Ib1b2, V(e1)); // Early effect on base resistance + OP_grbvy = - ddx(Ib1b2, V(c2)); // Early effect on base resistance -OP_grbvz = - ddx(Ib1b2, V(c1)); // Early effect on base resistance + OP_grbvz = - ddx(Ib1b2, V(c1)); // Early effect on base resistance -OP_re = RE_TM; // Emiter resistance -OP_rbc = RBC_TM; // Constant base resistance -OP_rcc = RCCxx_TM; // Collector Contact resistance -OP_rcblx = RCCex_TM; // Extrinsic buried layer resistance -OP_rcbli = RCCin_TM; // Extrinsic buried layer resistance + OP_re = RE_TM; // Emiter resistance + OP_rbc = RBC_TM; // Constant base resistance + OP_rcc = RCCxx_TM; // Collector Contact resistance + OP_rcblx = RCCex_TM; // Extrinsic buried layer resistance + OP_rcbli = RCCin_TM; // Extrinsic buried layer resistance `ifdef SUBSTRATE @@ -145,100 +145,100 @@ OP_rcbli = RCCin_TM; // Extrinsic buried layer resistance `endif -// Small signal equivalent circuit capacitances -OP_scbe = - ddx(Qte_s, V(e)) - ddx(Qte_s, V(e1)); // Capacitance sidewall b-e junction + // Small signal equivalent circuit capacitances + OP_scbe = - ddx(Qte_s, V(e)) - ddx(Qte_s, V(e1)); // Capacitance sidewall b-e junction -OP_cbex = - ddx(Qte + Qbe + Qe, V(e1)) ; // Capacitance floor b-e junction + OP_cbex = - ddx(Qte + Qbe + Qe, V(e1)) ; // Capacitance floor b-e junction -OP_cbey = - ddx(Qbe, V(c2)); // Early effect on b-e diffusion junction + OP_cbey = - ddx(Qbe, V(c2)); // Early effect on b-e diffusion junction -OP_cbez = - ddx(Qbe, V(c1)); // Early effect on b-e diffusion junction + OP_cbez = - ddx(Qbe, V(c1)); // Early effect on b-e diffusion junction -OP_cbcx = - ddx(Qbc, V(e)) - ddx(Qbc, V(e1)); // Early effect on b-c diffusion junction + OP_cbcx = - ddx(Qbc, V(e)) - ddx(Qbc, V(e1)); // Early effect on b-c diffusion junction -OP_cbcy = - ddx(Qtc + Qbc + Qepi, V(c2)); // Capacitance floor b-c junction -OP_cbcz = - ddx(Qtc + Qbc + Qepi, V(c1)); // Capacitance floor b-c junction + OP_cbcy = - ddx(Qtc + Qbc + Qepi, V(c2)); // Capacitance floor b-c junction + OP_cbcz = - ddx(Qtc + Qbc + Qepi, V(c1)); // Capacitance floor b-c junction -// Capacitance extrinsic b-c junction : -OP_cbcex = ddx(Qtex + Qex,V(e)) + // Capacitance extrinsic b-c junction : + OP_cbcex = ddx(Qtex + Qex,V(e)) + ddx(Qtex + Qex,V(b1 )) + ddx(Qtex + Qex,V(b2)) + ddx(Qtex + Qex,V(e1)) + ddx(Qtex + Qex,V(c2)) ; -// Capacitance extrinsic b-c junction : -OP_xcbcex = ddx(XQtex + XQex, V(b)) ; + // Capacitance extrinsic b-c junction : + OP_xcbcex = ddx(XQtex + XQex, V(b)) ; -OP_cb1b2 = - ddx(Qb1b2, V(b2)) - ddx(Qb1b2, V(c2)); // Capacitance AC current crowding + OP_cb1b2 = - ddx(Qb1b2, V(b2)) - ddx(Qb1b2, V(c2)); // Capacitance AC current crowding -OP_cb1b2x = - ddx(Qb1b2, V(e)) - ddx(Qb1b2, V(e1)); // Cross-capacitance AC current crowding -OP_cb1b2y = - ddx(Qb1b2, V(c2)); // Cross-capacitance AC current crowding -OP_cb1b2z = - ddx(Qb1b2, V(c1)) ; // Cross-capacitance AC current crowding + OP_cb1b2x = - ddx(Qb1b2, V(e)) - ddx(Qb1b2, V(e1)); // Cross-capacitance AC current crowding + OP_cb1b2y = - ddx(Qb1b2, V(c2)); // Cross-capacitance AC current crowding + OP_cb1b2z = - ddx(Qb1b2, V(c1)) ; // Cross-capacitance AC current crowding `ifdef SUBSTRATE OP_cts = ddx(Qts, V(s)) ; // Capacitance s-c junction `endif -// Approximate small signal equivalent circuit -dydx = (OP_gx - OP_gmux) / (OP_grcvy + OP_gmuy - OP_gy); -dydz = (OP_gz - OP_grcvz - OP_gmuz) / (OP_grcvy + OP_gmuy - OP_gy); -gpi = OP_sgpi + OP_gpix + OP_gmux + OP_gpiz + OP_gmuz + + // Approximate small signal equivalent circuit + dydx = (OP_gx - OP_gmux) / (OP_grcvy + OP_gmuy - OP_gy); + dydz = (OP_gz - OP_grcvz - OP_gmuz) / (OP_grcvy + OP_gmuy - OP_gy); + gpi = OP_sgpi + OP_gpix + OP_gmux + OP_gpiz + OP_gmuz + (OP_gpiy + OP_gmuy) * (dydx + dydz); -OP_gm = (OP_grcvy * (OP_gx - OP_gmux + // Transconductance + OP_gm = (OP_grcvy * (OP_gx - OP_gmux + // Transconductance OP_gz - OP_gmuz) - OP_grcvz * (OP_gy - OP_gmuy)) / (OP_grcvy + OP_gmuy - OP_gy); -OP_beta = OP_gm / gpi; // Current amplification -OP_gout = ((OP_gy - OP_gmuy) * OP_grcvz - // Output conductance + OP_beta = OP_gm / gpi; // Current amplification + OP_gout = ((OP_gy - OP_gmuy) * OP_grcvz - // Output conductance (OP_gz - OP_gmuz) * OP_grcvy) / (OP_grcvy + OP_gmuy - OP_gy); -OP_gmu = OP_gpiz + OP_gmuz + (OP_gpiy + OP_gmuy) * dydz + // Feedback transconductance + OP_gmu = OP_gpiz + OP_gmuz + (OP_gpiy + OP_gmuy) * dydz + // Feedback transconductance OP_gmuex + OP_xgmuex; -OP_rb = RBC_TM + OP_rbv; // Base resistance -OP_rc = OP_rcc + OP_rcblx + OP_rcbli; // Collector resistance -OP_cbe = OP_cbex + OP_scbe + OP_cbcx + // Base-emitter capacitance + OP_rb = RBC_TM + OP_rbv; // Base resistance + OP_rc = OP_rcc + OP_rcblx + OP_rcbli; // Collector resistance + OP_cbe = OP_cbex + OP_scbe + OP_cbcx + // Base-emitter capacitance (OP_cbey + OP_cbcy) * dydx + CBEO_M; -OP_cbc = (OP_cbey + OP_cbcy) * dydz + OP_cbcz + // Base-collector capacitance + OP_cbc = (OP_cbey + OP_cbcy) * dydz + OP_cbcz + // Base-collector capacitance OP_cbcex + OP_xcbcex + CBCO_M; -// Quantities to describe internal state of the model -gammax = (OP_gpix + OP_gmux - OP_grbvx) * OP_rbv; -gammay = (OP_gpiy + OP_gmuy - OP_grbvy) * OP_rbv; -gammaz = (OP_gpiz + OP_gmuz - OP_grbvz) * OP_rbv; -gbfx = OP_gpix + OP_sgpi * (1.0 + gammax); -gbfy = OP_gpiy + OP_sgpi * gammay; -gbfz = OP_gpiz + OP_sgpi * gammaz; + // Quantities to describe internal state of the model + gammax = (OP_gpix + OP_gmux - OP_grbvx) * OP_rbv; + gammay = (OP_gpiy + OP_gmuy - OP_grbvy) * OP_rbv; + gammaz = (OP_gpiz + OP_gmuz - OP_grbvz) * OP_rbv; + gbfx = OP_gpix + OP_sgpi * (1.0 + gammax); + gbfy = OP_gpiy + OP_sgpi * gammay; + gbfz = OP_gpiz + OP_sgpi * gammaz; -// RvdT March 2008: -alpha_ft = (1.0 + (OP_grcvy * dydx * OP_rc) + + // RvdT March 2008: + alpha_ft = (1.0 + (OP_grcvy * dydx * OP_rc) + (OP_gx + gbfx + (OP_gy + gbfy) * dydx) * RE_TM)/ (1.0 - (OP_grcvz + OP_grcvy * dydz) * OP_rc - (OP_gz + gbfz + (OP_gy + gbfy) * dydz) * RE_TM); -rx = pow((OP_grcvy * dydx + alpha_ft * (OP_grcvz + OP_grcvy * dydz)), -1); -rz = alpha_ft * rx; -ry = (1.0 - OP_grcvz * rz) / OP_grcvy; -rb1b2 = gammax * rx + gammay * ry + gammaz * rz; -rex = rz + rb1b2 - OP_rcbli; -xrex = rz + rb1b2 + RBC_TM * ((gbfx + OP_gmux) * rx + (gbfy + OP_gmuy) * ry + + rx = pow((OP_grcvy * dydx + alpha_ft * (OP_grcvz + OP_grcvy * dydz)), -1); + rz = alpha_ft * rx; + ry = (1.0 - OP_grcvz * rz) / OP_grcvy; + rb1b2 = gammax * rx + gammay * ry + gammaz * rz; + rex = rz + rb1b2 - OP_rcbli; + xrex = rz + rb1b2 + RBC_TM * ((gbfx + OP_gmux) * rx + (gbfy + OP_gmuy) * ry + (gbfz + OP_gmuz) * rz) - OP_rcbli - OP_rcblx; -taut = OP_scbe * (rx + rb1b2) + (OP_cbex + OP_cbcx) * rx + (OP_cbey + OP_cbcy) * + taut = OP_scbe * (rx + rb1b2) + (OP_cbex + OP_cbcx) * rx + (OP_cbey + OP_cbcy) * ry + (OP_cbez + OP_cbcz) * rz + OP_cbcex * rex + OP_xcbcex * xrex + (CBEO_M + CBCO_M) * (xrex - RCCxx_TM); -OP_ft = 1.0 / (2.0 * `PI * taut); // Good approximation for cut-off frequency -OP_iqs = Iqs; // Current at onset of quasi-saturation -OP_xiwepi = xi_w; // Thickness of injection layer -OP_vb2c2star = Vb2c2star; // Physical value of internal base-collector bias + OP_ft = 1.0 / (2.0 * `PI * taut); // Good approximation for cut-off frequency + OP_iqs = Iqs; // Current at onset of quasi-saturation + OP_xiwepi = xi_w; // Thickness of injection layer + OP_vb2c2star = Vb2c2star; // Physical value of internal base-collector bias -//self-heating + //self-heating `ifdef SELFHEATING OP_pdiss = power_dis; // Dissipation `endif -OP_tk = Tk; // Actual temperature + OP_tk = Tk; // Actual temperature `endif end diff --git a/src/spicelib/devices/adms/mextram/admsva/tscaling.inc b/src/spicelib/devices/adms/mextram/admsva/tscaling.inc index 8e5519867..53c1d0b94 100644 --- a/src/spicelib/devices/adms/mextram/admsva/tscaling.inc +++ b/src/spicelib/devices/adms/mextram/admsva/tscaling.inc @@ -5,7 +5,7 @@ // Temperature scaling of parameters - // The excess transistor temperature due to the self-heating +// The excess transistor temperature due to the self-heating `ifdef SELFHEATING Tki = V(dt); // *** Convergence related smoothing *** @@ -13,12 +13,12 @@ Tki = - ln(1.0 - Tki); end `linLog(Vdt, Tki, 200.0); -// `min_logexp(Vdt, Tki, 200.0, 10.0); + // `min_logexp(Vdt, Tki, 200.0, 10.0); `else Vdt = 0.0; `endif - // Temperature variables +// Temperature variables Tk = Tamb + Vdt; tN = Tk / Trk; @@ -30,13 +30,13 @@ VdtINV = VtINV - VtrINV; lntN = ln(tN) ; - // begin: RvdT, November 2008, "Zener tunneling model" +// begin: RvdT, November 2008, "Zener tunneling model" // VGZEB_T = VGZEBOK - AVGEB*Tk*Tk / (Tk + TVGEB) ; `max_logexp(VGZEB_T, VGZEBOK - AVGEB*Tk*Tk / (Tk + TVGEB), 0.05, 0.1) ; - // end: RvdT, November 2008, "Zener tunneling model" +// end: RvdT, November 2008, "Zener tunneling model" - // Depletion capacitances +// Depletion capacitances UdeT = -3.0 * Vt * ln(tN) + VDE * tN + (1.0 - tN) * VGB; `max_logexp(VDE_T, `VDLOW, UdeT, Vt); @@ -62,7 +62,7 @@ CJCscaleINV = 1.0 / CJCscale; CJC_T = CJC * CJCscale; XP_T = XP * CJCscaleINV; - // Resistances +// Resistances // RvdT, November 2008: // Instead of the following definition @@ -122,9 +122,9 @@ VER_T = VER * x * y; `ifdef SUBSTRATE ISS_T = ISS * exp(lntN * (4.0 - AS)) * exp(-VGS * VdtINV); -// New 504.9: + // New 504.9: ICSS_T = ICSS * exp(lntN * (3.5 - 0.5 * ASUB)) * exp(-VGS * VdtINV); -// End New 504.9. + // End New 504.9. if ((ISS_T > 0.0)) IKS_T = IKS * exp(lntN * (1.0 - AS)) * (IS_T / IS) * (ISS / ISS_T); @@ -132,14 +132,14 @@ VER_T = VER * x * y; IKS_T = IKS * exp(lntN * (1.0 - AS)); `endif - // Transit times +// Transit times TAUE_T = TAUE * exp(lntN * (AB - 2.0)) * exp(-DVGTE * VdtINV); TAUB_T = TAUB * exp(lntN * (AQBO + AB - 1.0)); TEPI_T = TEPI * exp(lntN * (AEPI - 1.0)); TAUR_T = TAUR * (TAUB_T + TEPI_T) / (TAUB + TEPI); - // Avalanche constant +// Avalanche constant Tk300 = Tk - 300.0; // RvdT, 15-02-2008: prevent division by zero and overflow at high temperatures: @@ -152,12 +152,12 @@ begin BnT = Bn * 1.081 ; end - // Heterojunction features +// Heterojunction features DEG_T = DEG * exp(lntN * AQBO); `ifdef SELFHEATING - // Temperature scaling of the thermal resistance + // Temperature scaling of the thermal resistance RTH_Tamb = RTH * pow(Tamb / Trk, ATH); `endif @@ -177,7 +177,7 @@ IZEB_TM = IZEB_T * MULT ; IHC_M = IHC * MULT; `ifdef SUBSTRATE ISS_TM = ISS_T * MULT; -// New: 504.9 + // New: 504.9 ICSS_TM = ICSS_T * MULT; IKS_TM = IKS_T * MULT; `endif diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include index e7d34971d..4a3c219b4 100644 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include +++ b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_InitModel.include @@ -15,170 +15,170 @@ // Further information can be found in the file readme.txt // - ////////////////////////////////////////////////////////////// - // - // Calculation of internal paramters which are independent - // on instance parameters - // - ////////////////////////////////////////////////////////////// - - TRJ_i = `CLIP_LOW( TRJ , `TRJ_cliplow); - IMAX_i = `CLIP_LOW( IMAX , `IMAX_cliplow); - CJORBOT_i = `CLIP_LOW( CJORBOT , `CJORBOT_cliplow); - CJORSTI_i = `CLIP_LOW( CJORSTI , `CJORSTI_cliplow); - CJORGAT_i = `CLIP_LOW( CJORGAT , `CJORGAT_cliplow); - VBIRBOT_i = `CLIP_LOW( VBIRBOT , `VBIR_cliplow); - VBIRSTI_i = `CLIP_LOW( VBIRSTI , `VBIR_cliplow); - VBIRGAT_i = `CLIP_LOW( VBIRGAT , `VBIR_cliplow); - PBOT_i = `CLIP_BOTH(PBOT , `P_cliplow,`P_cliphigh); - PSTI_i = `CLIP_BOTH(PSTI , `P_cliplow,`P_cliphigh); - PGAT_i = `CLIP_BOTH(PGAT , `P_cliplow,`P_cliphigh); - IDSATRBOT_i = `CLIP_LOW( IDSATRBOT , `IDSATR_cliplow); - IDSATRSTI_i = `CLIP_LOW( IDSATRSTI , `IDSATR_cliplow); - IDSATRGAT_i = `CLIP_LOW( IDSATRGAT , `IDSATR_cliplow); - CSRHBOT_i = `CLIP_LOW( CSRHBOT , `CSRH_cliplow); - CSRHSTI_i = `CLIP_LOW( CSRHSTI , `CSRH_cliplow); - CSRHGAT_i = `CLIP_LOW( CSRHGAT , `CSRH_cliplow); - XJUNSTI_i = `CLIP_LOW( XJUNSTI , `XJUN_cliplow); - XJUNGAT_i = `CLIP_LOW( XJUNGAT , `XJUN_cliplow); - CTATBOT_i = `CLIP_LOW( CTATBOT , `CTAT_cliplow); - CTATSTI_i = `CLIP_LOW( CTATSTI , `CTAT_cliplow); - CTATGAT_i = `CLIP_LOW( CTATGAT , `CTAT_cliplow); - MEFFTATBOT_i = `CLIP_LOW( MEFFTATBOT, `MEFFTAT_cliplow); - MEFFTATSTI_i = `CLIP_LOW( MEFFTATSTI, `MEFFTAT_cliplow); - MEFFTATGAT_i = `CLIP_LOW( MEFFTATGAT, `MEFFTAT_cliplow); - CBBTBOT_i = `CLIP_LOW( CBBTBOT , `CBBT_cliplow); - CBBTSTI_i = `CLIP_LOW( CBBTSTI , `CBBT_cliplow); - CBBTGAT_i = `CLIP_LOW( CBBTGAT , `CBBT_cliplow); - VBRBOT_i = `CLIP_LOW( VBRBOT , `VBR_cliplow); - VBRSTI_i = `CLIP_LOW( VBRSTI , `VBR_cliplow); - VBRGAT_i = `CLIP_LOW( VBRGAT , `VBR_cliplow); - PBRBOT_i = `CLIP_LOW( PBRBOT , `PBR_cliplow); - PBRSTI_i = `CLIP_LOW( PBRSTI , `PBR_cliplow); - PBRGAT_i = `CLIP_LOW( PBRGAT , `PBR_cliplow); - - tkr = `KELVINCONVERSION + TRJ_i; - tkd = max($temperature + DTA, `KELVINCONVERSION + `MINTEMP); - auxt = tkd / tkr; - KBOL_over_QELE = `KBOL / `QELE; - phitr = KBOL_over_QELE * tkr; - phitrinv = 1.0 / phitr; - phitd = KBOL_over_QELE * tkd; - phitdinv = 1.0 / phitd; - - // bandgap voltages at reference temperature - deltaphigr = -(7.02e-4 * tkr * tkr) / (1108.0 + tkr); - phigrbot = PHIGBOT + deltaphigr; - phigrsti = PHIGSTI + deltaphigr; - phigrgat = PHIGGAT + deltaphigr; - - // bandgap voltages at device temperature - deltaphigd = -(7.02e-4 * tkd * tkd) / (1108.0 + tkd); - phigdbot = PHIGBOT + deltaphigd; - phigdsti = PHIGSTI + deltaphigd; - phigdgat = PHIGGAT + deltaphigd; - - // factors ftd for ideal-current model - ftdbot = (pow(auxt, 1.5)) * exp(0.5 * ((phigrbot * phitrinv) - (phigdbot * phitdinv))); - ftdsti = (pow(auxt, 1.5)) * exp(0.5 * ((phigrsti * phitrinv) - (phigdsti * phitdinv))); - ftdgat = (pow(auxt, 1.5)) * exp(0.5 * ((phigrgat * phitrinv) - (phigdgat * phitdinv))); - - // temperature-scaled saturation current for ideal-current model - idsatbot = IDSATRBOT_i * ftdbot * ftdbot; - idsatsti = IDSATRSTI_i * ftdsti * ftdsti; - idsatgat = IDSATRGAT_i * ftdgat * ftdgat; - - // built-in voltages before limiting - ubibot = VBIRBOT_i * auxt - 2 * phitd * ln(ftdbot); - ubisti = VBIRSTI_i * auxt - 2 * phitd * ln(ftdsti); - ubigat = VBIRGAT_i * auxt - 2 * phitd * ln(ftdgat); - - // built-in voltages limited to phitd - vbibot = ubibot + phitd * ln(1 + exp((`vbilow - ubibot) * phitdinv)); - vbisti = ubisti + phitd * ln(1 + exp((`vbilow - ubisti) * phitdinv)); - vbigat = ubigat + phitd * ln(1 + exp((`vbilow - ubigat) * phitdinv)); - - // inverse values of built-in voltages - vbiinvbot = 1.0 / vbibot; - vbiinvsti = 1.0 / vbisti; - vbiinvgat = 1.0 / vbigat; - - // one minus the grading coefficient - one_minus_PBOT = 1 - PBOT_i; - one_minus_PSTI = 1 - PSTI_i; - one_minus_PGAT = 1 - PGAT_i; - - // one over "one minus the grading coefficient" - one_over_one_minus_PBOT = 1 / one_minus_PBOT; - one_over_one_minus_PSTI = 1 / one_minus_PSTI; - one_over_one_minus_PGAT = 1 / one_minus_PGAT; - - // temperature-scaled zero-bias capacitance - cjobot = CJORBOT_i * pow((VBIRBOT_i * vbiinvbot), PBOT_i); - cjosti = CJORSTI_i * pow((VBIRSTI_i * vbiinvsti), PSTI_i); - cjogat = CJORGAT_i * pow((VBIRGAT_i * vbiinvgat), PGAT_i); - - // prefactor in physical part of charge model - qprefbot = cjobot * vbibot * one_over_one_minus_PBOT; - qprefsti = cjosti * vbisti * one_over_one_minus_PSTI; - qprefgat = cjogat * vbigat * one_over_one_minus_PGAT; - - // prefactor in mathematical extension of charge model - qpref2bot = `a * cjobot; - qpref2sti = `a * cjosti; - qpref2gat = `a * cjogat; - - // zero-bias depletion widths at reference temperature, needed in SRH and TAT model - wdepnulrbot = `EPSSI / CJORBOT_i; - wdepnulrsti = XJUNSTI_i * `EPSSI / CJORSTI_i; - wdepnulrgat = XJUNGAT_i * `EPSSI / CJORGAT_i; - - // inverse values of "wdepnulr", used in BBT model - wdepnulrinvbot = 1 / wdepnulrbot; - wdepnulrinvsti = 1 / wdepnulrsti; - wdepnulrinvgat = 1 / wdepnulrgat; - - // inverse values of built-in voltages at reference temperature, needed in SRH and BBT model - VBIRBOTinv = 1 / VBIRBOT_i; - VBIRSTIinv = 1 / VBIRSTI_i; - VBIRGATinv = 1 / VBIRGAT_i; - - // some constants needed in erfc-approximation, needed in TAT model - perfc = (`SQRTPI * `aerfc); - berfc = ((-5 * (`aerfc) + 6 - pow((perfc), -2)) / 3); - cerfc = (1.0 - (`aerfc) - (berfc)); - - // half the bandgap energy, limited to values > phitd, needed in TAT model - deltaEbot = max(0.5 * phigdbot, phitd); - deltaEsti = max(0.5 * phigdsti, phitd); - deltaEgat = max(0.5 * phigdgat, phitd); - - // values of atat, needed in TAT model - atatbot = deltaEbot * phitdinv; - atatsti = deltaEsti * phitdinv; - atatgat = deltaEgat * phitdinv; - - // values of btatpart, needed in TAT model - btatpartbot = sqrt(32 * MEFFTATBOT_i * `MELE * `QELE * (deltaEbot * deltaEbot * deltaEbot)) / (3 * `HBAR); - btatpartsti = sqrt(32 * MEFFTATSTI_i * `MELE * `QELE * (deltaEsti * deltaEsti * deltaEsti)) / (3 * `HBAR); - btatpartgat = sqrt(32 * MEFFTATGAT_i * `MELE * `QELE * (deltaEgat * deltaEgat * deltaEgat)) / (3 * `HBAR); - - // temperature-scaled values of FBBT, needed in BBT model - fbbtbot = FBBTRBOT * (1 + STFBBTBOT * (tkd - tkr)); - fbbtsti = FBBTRSTI * (1 + STFBBTSTI * (tkd - tkr)); - fbbtgat = FBBTRGAT * (1 + STFBBTGAT * (tkd - tkr)); - - // values of fstop, needed in avalanche/breakdown model - fstopbot = 1 / (1 - pow(`alphaav, PBRBOT_i)); - fstopsti = 1 / (1 - pow(`alphaav, PBRSTI_i)); - fstopgat = 1 / (1 - pow(`alphaav, PBRGAT_i)); - - // inverse values of breakdown voltages, needed in avalanche/breakdown model - VBRinvbot = 1 / VBRBOT_i; - VBRinvsti = 1 / VBRSTI_i; - VBRinvgat = 1 / VBRGAT_i; - - // slopes for linear extraploation close to and beyond breakdown, needed in avalanche/breakdown model - slopebot = -(fstopbot * fstopbot * pow(`alphaav, (PBRBOT_i - 1))) * PBRBOT_i * VBRinvbot; - slopesti = -(fstopsti * fstopsti * pow(`alphaav, (PBRSTI_i - 1))) * PBRSTI_i * VBRinvsti; - slopegat = -(fstopgat * fstopgat * pow(`alphaav, (PBRGAT_i - 1))) * PBRGAT_i * VBRinvgat; +////////////////////////////////////////////////////////////// +// +// Calculation of internal paramters which are independent +// on instance parameters +// +////////////////////////////////////////////////////////////// + +TRJ_i = `CLIP_LOW( TRJ , `TRJ_cliplow); +IMAX_i = `CLIP_LOW( IMAX , `IMAX_cliplow); +CJORBOT_i = `CLIP_LOW( CJORBOT , `CJORBOT_cliplow); +CJORSTI_i = `CLIP_LOW( CJORSTI , `CJORSTI_cliplow); +CJORGAT_i = `CLIP_LOW( CJORGAT , `CJORGAT_cliplow); +VBIRBOT_i = `CLIP_LOW( VBIRBOT , `VBIR_cliplow); +VBIRSTI_i = `CLIP_LOW( VBIRSTI , `VBIR_cliplow); +VBIRGAT_i = `CLIP_LOW( VBIRGAT , `VBIR_cliplow); +PBOT_i = `CLIP_BOTH(PBOT , `P_cliplow,`P_cliphigh); +PSTI_i = `CLIP_BOTH(PSTI , `P_cliplow,`P_cliphigh); +PGAT_i = `CLIP_BOTH(PGAT , `P_cliplow,`P_cliphigh); +IDSATRBOT_i = `CLIP_LOW( IDSATRBOT , `IDSATR_cliplow); +IDSATRSTI_i = `CLIP_LOW( IDSATRSTI , `IDSATR_cliplow); +IDSATRGAT_i = `CLIP_LOW( IDSATRGAT , `IDSATR_cliplow); +CSRHBOT_i = `CLIP_LOW( CSRHBOT , `CSRH_cliplow); +CSRHSTI_i = `CLIP_LOW( CSRHSTI , `CSRH_cliplow); +CSRHGAT_i = `CLIP_LOW( CSRHGAT , `CSRH_cliplow); +XJUNSTI_i = `CLIP_LOW( XJUNSTI , `XJUN_cliplow); +XJUNGAT_i = `CLIP_LOW( XJUNGAT , `XJUN_cliplow); +CTATBOT_i = `CLIP_LOW( CTATBOT , `CTAT_cliplow); +CTATSTI_i = `CLIP_LOW( CTATSTI , `CTAT_cliplow); +CTATGAT_i = `CLIP_LOW( CTATGAT , `CTAT_cliplow); +MEFFTATBOT_i = `CLIP_LOW( MEFFTATBOT, `MEFFTAT_cliplow); +MEFFTATSTI_i = `CLIP_LOW( MEFFTATSTI, `MEFFTAT_cliplow); +MEFFTATGAT_i = `CLIP_LOW( MEFFTATGAT, `MEFFTAT_cliplow); +CBBTBOT_i = `CLIP_LOW( CBBTBOT , `CBBT_cliplow); +CBBTSTI_i = `CLIP_LOW( CBBTSTI , `CBBT_cliplow); +CBBTGAT_i = `CLIP_LOW( CBBTGAT , `CBBT_cliplow); +VBRBOT_i = `CLIP_LOW( VBRBOT , `VBR_cliplow); +VBRSTI_i = `CLIP_LOW( VBRSTI , `VBR_cliplow); +VBRGAT_i = `CLIP_LOW( VBRGAT , `VBR_cliplow); +PBRBOT_i = `CLIP_LOW( PBRBOT , `PBR_cliplow); +PBRSTI_i = `CLIP_LOW( PBRSTI , `PBR_cliplow); +PBRGAT_i = `CLIP_LOW( PBRGAT , `PBR_cliplow); + +tkr = `KELVINCONVERSION + TRJ_i; +tkd = max($temperature + DTA, `KELVINCONVERSION + `MINTEMP); +auxt = tkd / tkr; +KBOL_over_QELE = `KBOL / `QELE; +phitr = KBOL_over_QELE * tkr; +phitrinv = 1.0 / phitr; +phitd = KBOL_over_QELE * tkd; +phitdinv = 1.0 / phitd; + +// bandgap voltages at reference temperature +deltaphigr = -(7.02e-4 * tkr * tkr) / (1108.0 + tkr); +phigrbot = PHIGBOT + deltaphigr; +phigrsti = PHIGSTI + deltaphigr; +phigrgat = PHIGGAT + deltaphigr; + +// bandgap voltages at device temperature +deltaphigd = -(7.02e-4 * tkd * tkd) / (1108.0 + tkd); +phigdbot = PHIGBOT + deltaphigd; +phigdsti = PHIGSTI + deltaphigd; +phigdgat = PHIGGAT + deltaphigd; + +// factors ftd for ideal-current model +ftdbot = (pow(auxt, 1.5)) * exp(0.5 * ((phigrbot * phitrinv) - (phigdbot * phitdinv))); +ftdsti = (pow(auxt, 1.5)) * exp(0.5 * ((phigrsti * phitrinv) - (phigdsti * phitdinv))); +ftdgat = (pow(auxt, 1.5)) * exp(0.5 * ((phigrgat * phitrinv) - (phigdgat * phitdinv))); + +// temperature-scaled saturation current for ideal-current model +idsatbot = IDSATRBOT_i * ftdbot * ftdbot; +idsatsti = IDSATRSTI_i * ftdsti * ftdsti; +idsatgat = IDSATRGAT_i * ftdgat * ftdgat; + +// built-in voltages before limiting +ubibot = VBIRBOT_i * auxt - 2 * phitd * ln(ftdbot); +ubisti = VBIRSTI_i * auxt - 2 * phitd * ln(ftdsti); +ubigat = VBIRGAT_i * auxt - 2 * phitd * ln(ftdgat); + +// built-in voltages limited to phitd +vbibot = ubibot + phitd * ln(1 + exp((`vbilow - ubibot) * phitdinv)); +vbisti = ubisti + phitd * ln(1 + exp((`vbilow - ubisti) * phitdinv)); +vbigat = ubigat + phitd * ln(1 + exp((`vbilow - ubigat) * phitdinv)); + +// inverse values of built-in voltages +vbiinvbot = 1.0 / vbibot; +vbiinvsti = 1.0 / vbisti; +vbiinvgat = 1.0 / vbigat; + +// one minus the grading coefficient +one_minus_PBOT = 1 - PBOT_i; +one_minus_PSTI = 1 - PSTI_i; +one_minus_PGAT = 1 - PGAT_i; + +// one over "one minus the grading coefficient" +one_over_one_minus_PBOT = 1 / one_minus_PBOT; +one_over_one_minus_PSTI = 1 / one_minus_PSTI; +one_over_one_minus_PGAT = 1 / one_minus_PGAT; + +// temperature-scaled zero-bias capacitance +cjobot = CJORBOT_i * pow((VBIRBOT_i * vbiinvbot), PBOT_i); +cjosti = CJORSTI_i * pow((VBIRSTI_i * vbiinvsti), PSTI_i); +cjogat = CJORGAT_i * pow((VBIRGAT_i * vbiinvgat), PGAT_i); + +// prefactor in physical part of charge model +qprefbot = cjobot * vbibot * one_over_one_minus_PBOT; +qprefsti = cjosti * vbisti * one_over_one_minus_PSTI; +qprefgat = cjogat * vbigat * one_over_one_minus_PGAT; + +// prefactor in mathematical extension of charge model +qpref2bot = `a * cjobot; +qpref2sti = `a * cjosti; +qpref2gat = `a * cjogat; + +// zero-bias depletion widths at reference temperature, needed in SRH and TAT model +wdepnulrbot = `EPSSI / CJORBOT_i; +wdepnulrsti = XJUNSTI_i * `EPSSI / CJORSTI_i; +wdepnulrgat = XJUNGAT_i * `EPSSI / CJORGAT_i; + +// inverse values of "wdepnulr", used in BBT model +wdepnulrinvbot = 1 / wdepnulrbot; +wdepnulrinvsti = 1 / wdepnulrsti; +wdepnulrinvgat = 1 / wdepnulrgat; + +// inverse values of built-in voltages at reference temperature, needed in SRH and BBT model +VBIRBOTinv = 1 / VBIRBOT_i; +VBIRSTIinv = 1 / VBIRSTI_i; +VBIRGATinv = 1 / VBIRGAT_i; + +// some constants needed in erfc-approximation, needed in TAT model +perfc = (`SQRTPI * `aerfc); +berfc = ((-5 * (`aerfc) + 6 - pow((perfc), -2)) / 3); +cerfc = (1.0 - (`aerfc) - (berfc)); + +// half the bandgap energy, limited to values > phitd, needed in TAT model +deltaEbot = max(0.5 * phigdbot, phitd); +deltaEsti = max(0.5 * phigdsti, phitd); +deltaEgat = max(0.5 * phigdgat, phitd); + +// values of atat, needed in TAT model +atatbot = deltaEbot * phitdinv; +atatsti = deltaEsti * phitdinv; +atatgat = deltaEgat * phitdinv; + +// values of btatpart, needed in TAT model +btatpartbot = sqrt(32 * MEFFTATBOT_i * `MELE * `QELE * (deltaEbot * deltaEbot * deltaEbot)) / (3 * `HBAR); +btatpartsti = sqrt(32 * MEFFTATSTI_i * `MELE * `QELE * (deltaEsti * deltaEsti * deltaEsti)) / (3 * `HBAR); +btatpartgat = sqrt(32 * MEFFTATGAT_i * `MELE * `QELE * (deltaEgat * deltaEgat * deltaEgat)) / (3 * `HBAR); + +// temperature-scaled values of FBBT, needed in BBT model +fbbtbot = FBBTRBOT * (1 + STFBBTBOT * (tkd - tkr)); +fbbtsti = FBBTRSTI * (1 + STFBBTSTI * (tkd - tkr)); +fbbtgat = FBBTRGAT * (1 + STFBBTGAT * (tkd - tkr)); + +// values of fstop, needed in avalanche/breakdown model +fstopbot = 1 / (1 - pow(`alphaav, PBRBOT_i)); +fstopsti = 1 / (1 - pow(`alphaav, PBRSTI_i)); +fstopgat = 1 / (1 - pow(`alphaav, PBRGAT_i)); + +// inverse values of breakdown voltages, needed in avalanche/breakdown model +VBRinvbot = 1 / VBRBOT_i; +VBRinvsti = 1 / VBRSTI_i; +VBRinvgat = 1 / VBRGAT_i; + +// slopes for linear extraploation close to and beyond breakdown, needed in avalanche/breakdown model +slopebot = -(fstopbot * fstopbot * pow(`alphaav, (PBRBOT_i - 1))) * PBRBOT_i * VBRinvbot; +slopesti = -(fstopsti * fstopsti * pow(`alphaav, (PBRSTI_i - 1))) * PBRSTI_i * VBRinvsti; +slopegat = -(fstopgat * fstopgat * pow(`alphaav, (PBRGAT_i - 1))) * PBRGAT_i * VBRinvgat; diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include index 1464988b5..c5afcd4a1 100644 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include +++ b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_macrodefs.include @@ -73,166 +73,166 @@ // Instance parameter dependent initialization `define JuncapInitInstance(AB_i, LS_i, LG_i, VMAX, vbimin, vch, vfmin, vbbtlim) \ -if (idsatbot * AB_i > 0) begin \ - vmaxbot = phitd * ln(IMAX_i / (idsatbot * AB_i) + 1); \ -end else begin \ - vmaxbot = `vmaxlarge; \ -end \ -if (idsatsti * LS_i > 0) begin \ - vmaxsti = phitd * ln(IMAX_i / (idsatsti * LS_i) + 1); \ -end else begin \ - vmaxsti = `vmaxlarge; \ -end \ -if (idsatgat * LG_i > 0) begin \ - vmaxgat = phitd * ln(IMAX_i / (idsatgat * LG_i) + 1); \ -end else begin \ - vmaxgat = `vmaxlarge; \ -end \ -VMAX = min(min(vmaxbot, vmaxsti), vmaxgat); \ - \ -/* determination of minimum value of the relevant built-in voltages */ \ -vbibot2 = vbibot; \ -vbisti2 = vbisti; \ -vbigat2 = vbigat; \ -if (AB_i == 0) begin vbibot2 = vbisti + vbigat; end \ -if (LS_i == 0) begin vbisti2 = vbibot + vbigat; end \ -if (LG_i == 0) begin vbigat2 = vbibot + vbisti; end \ -vbimin = min(min(vbibot2, vbisti2), vbigat2); \ -vch = vbimin * `epsch; \ -if (vbimin == vbibot) begin vfmin = vbibot * (1 - (pow(`a, (-1.0 / PBOT_i)))); end \ -if (vbimin == vbisti) begin vfmin = vbisti * (1 - (pow(`a, (-1.0 / PSTI_i)))); end \ -if (vbimin == vbigat) begin vfmin = vbigat * (1 - (pow(`a, (-1.0 / PGAT_i)))); end \ - \ -/* determination of limiting value of conditioned voltage for BBT calculation */ \ -vbibot2r = VBIRBOT_i; \ -vbisti2r = VBIRSTI_i; \ -vbigat2r = VBIRGAT_i; \ -if (AB_i == 0) begin vbibot2r = VBIRSTI_i + VBIRGAT_i; end \ -if (LS_i == 0) begin vbisti2r = VBIRBOT_i + VBIRGAT_i; end \ -if (LG_i == 0) begin vbigat2r = VBIRBOT_i + VBIRSTI_i; end \ -vbbtlim = min(min(vbibot2r, vbisti2r), vbigat2r) - `dvbi; \ + if (idsatbot * AB_i > 0) begin \ + vmaxbot = phitd * ln(IMAX_i / (idsatbot * AB_i) + 1); \ + end else begin \ + vmaxbot = `vmaxlarge; \ + end \ + if (idsatsti * LS_i > 0) begin \ + vmaxsti = phitd * ln(IMAX_i / (idsatsti * LS_i) + 1); \ + end else begin \ + vmaxsti = `vmaxlarge; \ + end \ + if (idsatgat * LG_i > 0) begin \ + vmaxgat = phitd * ln(IMAX_i / (idsatgat * LG_i) + 1); \ + end else begin \ + vmaxgat = `vmaxlarge; \ + end \ + VMAX = min(min(vmaxbot, vmaxsti), vmaxgat); \ + \ + /* determination of minimum value of the relevant built-in voltages */ \ + vbibot2 = vbibot; \ + vbisti2 = vbisti; \ + vbigat2 = vbigat; \ + if (AB_i == 0) begin vbibot2 = vbisti + vbigat; end \ + if (LS_i == 0) begin vbisti2 = vbibot + vbigat; end \ + if (LG_i == 0) begin vbigat2 = vbibot + vbisti; end \ + vbimin = min(min(vbibot2, vbisti2), vbigat2); \ + vch = vbimin * `epsch; \ + if (vbimin == vbibot) begin vfmin = vbibot * (1 - (pow(`a, (-1.0 / PBOT_i)))); end \ + if (vbimin == vbisti) begin vfmin = vbisti * (1 - (pow(`a, (-1.0 / PSTI_i)))); end \ + if (vbimin == vbigat) begin vfmin = vbigat * (1 - (pow(`a, (-1.0 / PGAT_i)))); end \ + \ + /* determination of limiting value of conditioned voltage for BBT calculation */ \ + vbibot2r = VBIRBOT_i; \ + vbisti2r = VBIRSTI_i; \ + vbigat2r = VBIRGAT_i; \ + if (AB_i == 0) begin vbibot2r = VBIRSTI_i + VBIRGAT_i; end \ + if (LS_i == 0) begin vbisti2r = VBIRBOT_i + VBIRGAT_i; end \ + if (LG_i == 0) begin vbigat2r = VBIRBOT_i + VBIRSTI_i; end \ + vbbtlim = min(min(vbibot2r, vbisti2r), vbigat2r) - `dvbi; \ // Special power-functions `define mypower(x,power,result) \ -if (power == 0.5) begin \ - result = sqrt(x); \ -end else begin \ - result = pow(x, power); \ -end + if (power == 0.5) begin \ + result = sqrt(x); \ + end else begin \ + result = pow(x, power); \ + end `define mypower2(x,power,result) \ -if (power == -1) begin \ - result = 1 / (x); \ -end else begin \ - result = pow(x, power); \ -end + if (power == -1) begin \ + result = 1 / (x); \ + end else begin \ + result = pow(x, power); \ + end `define mypower3(x,power,result) \ -if (power == 4) begin \ - result = (x) * (x) * (x) * (x); \ -end else begin \ - result = pow(x, power); \ -end + if (power == 4) begin \ + result = (x) * (x) * (x) * (x); \ + end else begin \ + result = pow(x, power); \ + end // Smoothing functions `define hypfunction2(x,x0,eps,hyp2) \ -hyp2 = 0.5 * ((x) + (x0) - sqrt(((x) - (x0)) * ((x) - (x0)) + 4 * (eps) * (eps))); + hyp2 = 0.5 * ((x) + (x0) - sqrt(((x) - (x0)) * ((x) - (x0)) + 4 * (eps) * (eps))); `define hypfunction5(x,x0,eps,hyp5) \ -h1 = 4.0 * (eps) * (eps); \ -h2 = (eps) / (x0); \ -h2d = (x) + (eps) * h2; \ -h3 = (x0) + h2d; \ -h4 = (x0) - h2d; \ -h5 = sqrt(h4 * h4 + h1); \ -hyp5 = 2.0 * ((x) * (x0) / (h3 + h5)); + h1 = 4.0 * (eps) * (eps); \ + h2 = (eps) / (x0); \ + h2d = (x) + (eps) * h2; \ + h3 = (x0) + h2d; \ + h4 = (x0) - h2d; \ + h5 = sqrt(h4 * h4 + h1); \ + hyp5 = 2.0 * ((x) * (x0) / (h3 + h5)); // A special function used to calculate TAT-currents, // including an approximation of the erfc-function `define calcerfcexpmtat(y,m,result) \ -ysq = y * y; \ -if (y > 0) begin \ - terfc = 1 / (1 + perfc * y); \ -end else begin \ - terfc = 1 / (1 - perfc * y); \ -end \ -`expl_low(-ysq + m, tmp) \ -erfcpos = (`aerfc * terfc + berfc * (terfc * terfc) + cerfc * (terfc * terfc * terfc)) * tmp; \ -if (y > 0) begin \ - result = erfcpos; \ -end else begin\ - `expl_low(m, tmp) \ - result = 2 * tmp - erfcpos; \ -end + ysq = y * y; \ + if (y > 0) begin \ + terfc = 1 / (1 + perfc * y); \ + end else begin \ + terfc = 1 / (1 - perfc * y); \ + end \ + `expl_low(-ysq + m, tmp) \ + erfcpos = (`aerfc * terfc + berfc * (terfc * terfc) + cerfc * (terfc * terfc * terfc)) * tmp; \ + if (y > 0) begin \ + result = erfcpos; \ + end else begin\ + `expl_low(m, tmp) \ + result = 2 * tmp - erfcpos; \ + end // This is the main function of the JUNCAP2-model. It returns the current and charge // for a single diode `define juncapfunction(qpref,qpref2,vbiinv,one_minus_P,idsat,CSRH,CTAT,vbi,wdepnulr,VBIRinv,P,ftd,btatpart,atat,one_over_one_minus_P,CBBT,VBIR,wdepnulrinv,fbbt,VBR,VBRinv,PBR,fstop,slope,Ijprime,Qjprime) \ -`mypower((1 - vj * vbiinv), one_minus_P, tmp) \ -Qjprime = qpref * (1 - tmp) + qpref2 * (VAK - vj); \ -id = idsat * idmult; \ -if ((CSRH == 0) && (CTAT == 0)) begin \ - isrh = 0; \ -end else begin \ - vbi_minus_vjsrh = vbi-vjsrh; \ - wsrhstep = 1 - sqrt(1 - two_psistar / vbi_minus_vjsrh); \ - if (P == 0.5) begin \ - dwsrh = 0; \ + `mypower((1 - vj * vbiinv), one_minus_P, tmp) \ + Qjprime = qpref * (1 - tmp) + qpref2 * (VAK - vj); \ + id = idsat * idmult; \ + if ((CSRH == 0) && (CTAT == 0)) begin \ + isrh = 0; \ + end else begin \ + vbi_minus_vjsrh = vbi-vjsrh; \ + wsrhstep = 1 - sqrt(1 - two_psistar / vbi_minus_vjsrh); \ + if (P == 0.5) begin \ + dwsrh = 0; \ + end else begin \ + dwsrh = ((wsrhstep * wsrhstep * ln(wsrhstep) / (1 - wsrhstep)) + wsrhstep) * (1 - 2 * P); \ + end \ + wsrh = wsrhstep + dwsrh; \ + `mypower(vbi_minus_vjsrh * VBIRinv, P, tmp) \ + wdep = wdepnulr * tmp; \ + asrh = ftd * ((zinv - 1) * wdep); \ + isrh = CSRH * (asrh * wsrh); \ + end \ + if (CTAT == 0) begin \ + itat = 0; \ + end else begin \ + btat = btatpart * ((wdep * one_minus_P) / vbi_minus_vjsrh); \ + twoatatoverthreebtat = (`twothirds * atat) / btat; \ + umaxbeforelimiting = twoatatoverthreebtat * twoatatoverthreebtat; \ + umax = sqrt(umaxbeforelimiting * umaxbeforelimiting / (umaxbeforelimiting * umaxbeforelimiting + 1)); \ + sqrtumax = sqrt(abs(umax)); \ + umaxpoweronepointfive = umax * sqrtumax; \ + `mypower2((1 + btat * umaxpoweronepointfive), (-P * one_over_one_minus_P), wgamma) \ + wtat = wsrh * wgamma / (wsrh + wgamma); \ + ktat = sqrt(0.375 * (btat / sqrtumax)); \ + ltat = 2 * (twoatatoverthreebtat * sqrtumax) - umax; \ + mtat = atat * twoatatoverthreebtat * sqrtumax - atat * umax + 0.5 * (btat * umaxpoweronepointfive); \ + xerfc = (ltat - 1) * ktat; \ + `calcerfcexpmtat(xerfc, mtat, erfctimesexpmtat) \ + gammamax = `SQRTPI * 0.5 * (atat * erfctimesexpmtat / ktat); \ + itat = CTAT * (asrh * gammamax * wtat); \ + end \ + if (CBBT == 0) begin \ + ibbt = 0; \ end else begin \ - dwsrh = ((wsrhstep * wsrhstep * ln(wsrhstep) / (1 - wsrhstep)) + wsrhstep) * (1 - 2 * P); \ + `mypower(((VBIR - vbbt) * VBIRinv), P, tmp) \ + Fmaxr = one_over_one_minus_P * ((VBIR - vbbt) * wdepnulrinv / tmp); \ + `expl(-fbbt / Fmaxr, tmp) \ + ibbt = CBBT * (VAK * Fmaxr * Fmaxr * tmp); \ end \ - wsrh = wsrhstep + dwsrh; \ - `mypower(vbi_minus_vjsrh * VBIRinv, P, tmp) \ - wdep = wdepnulr * tmp; \ - asrh = ftd * ((zinv - 1) * wdep); \ - isrh = CSRH * (asrh * wsrh); \ -end \ -if (CTAT == 0) begin \ - itat = 0; \ -end else begin \ - btat = btatpart * ((wdep * one_minus_P) / vbi_minus_vjsrh); \ - twoatatoverthreebtat = (`twothirds * atat) / btat; \ - umaxbeforelimiting = twoatatoverthreebtat * twoatatoverthreebtat; \ - umax = sqrt(umaxbeforelimiting * umaxbeforelimiting / (umaxbeforelimiting * umaxbeforelimiting + 1)); \ - sqrtumax = sqrt(abs(umax)); \ - umaxpoweronepointfive = umax * sqrtumax; \ - `mypower2((1 + btat * umaxpoweronepointfive), (-P * one_over_one_minus_P), wgamma) \ - wtat = wsrh * wgamma / (wsrh + wgamma); \ - ktat = sqrt(0.375 * (btat / sqrtumax)); \ - ltat = 2 * (twoatatoverthreebtat * sqrtumax) - umax; \ - mtat = atat * twoatatoverthreebtat * sqrtumax - atat * umax + 0.5 * (btat * umaxpoweronepointfive); \ - xerfc = (ltat - 1) * ktat; \ - `calcerfcexpmtat(xerfc, mtat, erfctimesexpmtat) \ - gammamax = `SQRTPI * 0.5 * (atat * erfctimesexpmtat / ktat); \ - itat = CTAT * (asrh * gammamax * wtat); \ -end \ -if (CBBT == 0) begin \ - ibbt = 0; \ -end else begin \ - `mypower(((VBIR - vbbt) * VBIRinv), P, tmp) \ - Fmaxr = one_over_one_minus_P * ((VBIR - vbbt) * wdepnulrinv / tmp); \ - `expl(-fbbt / Fmaxr, tmp) \ - ibbt = CBBT * (VAK * Fmaxr * Fmaxr * tmp); \ -end \ -if (VBR > `vbrmax) begin \ - fbreakdown = 1; \ -end else begin \ - if (vav > -`alphaav * VBR) begin \ - `mypower3(abs(vav * VBRinv), PBR, tmp) \ - fbreakdown = 1 / (1 - tmp); \ - end else begin \ - fbreakdown = fstop + (vav + `alphaav * VBR) * slope; \ - end \ -end \ -Ijprime = (id + isrh + itat + ibbt) * fbreakdown; + if (VBR > `vbrmax) begin \ + fbreakdown = 1; \ + end else begin \ + if (vav > -`alphaav * VBR) begin \ + `mypower3(abs(vav * VBRinv), PBR, tmp) \ + fbreakdown = 1 / (1 - tmp); \ + end else begin \ + fbreakdown = fstop + (vav + `alphaav * VBR) * slope; \ + end \ + end \ + Ijprime = (id + isrh + itat + ibbt) * fbreakdown; // The following code is written as a macro because the naming of the instance parameters is @@ -241,45 +241,45 @@ Ijprime = (id + isrh + itat + ibbt) * fbreakdown; // drain junction in PSP `define juncapcommon(AB_i,LS_i,LG_i,ijunbot,qjunbot,ijunsti,qjunsti,ijungat,qjungat) \ -vbbt = 0.0; \ -two_psistar = 0.0; \ -if ( !( ((AB_i) == 0) && ((LS_i) == 0) && ((LG_i) == 0) ) ) begin \ - `hypfunction5(VAK, vfmin, vch, vj) \ - if (VAK < VMAX) begin \ - `expl(0.5 * (VAK * phitdinv), zinv) \ - idmult = zinv * zinv; \ + vbbt = 0.0; \ + two_psistar = 0.0; \ + if ( !( ((AB_i) == 0) && ((LS_i) == 0) && ((LG_i) == 0) ) ) begin \ + `hypfunction5(VAK, vfmin, vch, vj) \ + if (VAK < VMAX) begin \ + `expl(0.5 * (VAK * phitdinv), zinv) \ + idmult = zinv * zinv; \ + end else begin \ + `expl(VMAX * phitdinv, exp_VMAX_over_phitd) \ + idmult = (1 + (VAK - VMAX) * phitdinv) * exp_VMAX_over_phitd; \ + zinv = sqrt(idmult); \ + end \ + idmult = idmult - 1.0; \ + z = 1 / zinv; \ + if (VAK > 0) begin \ + two_psistar = 2.0 * (phitd * ln(2.0 + z + sqrt((z + 1.0) * (z + 3.0)))); \ + end else begin \ + two_psistar = -VAK + 2.0 * (phitd * ln(2 * zinv + 1 + sqrt((1 + zinv) * (1 + 3 * zinv)))); \ + end \ + vjlim = vbimin - two_psistar; \ + `hypfunction2(VAK, vjlim, phitd, vjsrh) \ + `hypfunction2(VAK, vbbtlim, phitr, vbbt) \ + `hypfunction2(VAK, 0, `epsav, vav) \ + end \ + if ((AB_i) == 0) begin \ + ijunbot = 0; \ + qjunbot = 0; \ end else begin \ - `expl(VMAX * phitdinv, exp_VMAX_over_phitd) \ - idmult = (1 + (VAK - VMAX) * phitdinv) * exp_VMAX_over_phitd; \ - zinv = sqrt(idmult); \ + `juncapfunction(qprefbot,qpref2bot,vbiinvbot,one_minus_PBOT,idsatbot,CSRHBOT_i,CTATBOT_i,vbibot,wdepnulrbot,VBIRBOTinv,PBOT_i,ftdbot,btatpartbot,atatbot,one_over_one_minus_PBOT,CBBTBOT_i,VBIRBOT_i,wdepnulrinvbot,fbbtbot,VBRBOT_i,VBRinvbot,PBRBOT_i,fstopbot,slopebot,ijunbot, qjunbot) \ end \ - idmult = idmult - 1.0; \ - z = 1 / zinv; \ - if (VAK > 0) begin \ - two_psistar = 2.0 * (phitd * ln(2.0 + z + sqrt((z + 1.0) * (z + 3.0)))); \ + if ((LS_i) == 0) begin \ + ijunsti = 0; \ + qjunsti = 0; \ end else begin \ - two_psistar = -VAK + 2.0 * (phitd * ln(2 * zinv + 1 + sqrt((1 + zinv) * (1 + 3 * zinv)))); \ + `juncapfunction(qprefsti,qpref2sti,vbiinvsti,one_minus_PSTI,idsatsti,CSRHSTI_i,CTATSTI_i,vbisti,wdepnulrsti,VBIRSTIinv,PSTI_i,ftdsti,btatpartsti,atatsti,one_over_one_minus_PSTI,CBBTSTI_i,VBIRSTI_i,wdepnulrinvsti,fbbtsti,VBRSTI_i,VBRinvsti,PBRSTI_i,fstopsti,slopesti,ijunsti, qjunsti) \ end \ - vjlim = vbimin - two_psistar; \ - `hypfunction2(VAK, vjlim, phitd, vjsrh) \ - `hypfunction2(VAK, vbbtlim, phitr, vbbt) \ - `hypfunction2(VAK, 0, `epsav, vav) \ -end \ -if ((AB_i) == 0) begin \ - ijunbot = 0; \ - qjunbot = 0; \ -end else begin \ - `juncapfunction(qprefbot,qpref2bot,vbiinvbot,one_minus_PBOT,idsatbot,CSRHBOT_i,CTATBOT_i,vbibot,wdepnulrbot,VBIRBOTinv,PBOT_i,ftdbot,btatpartbot,atatbot,one_over_one_minus_PBOT,CBBTBOT_i,VBIRBOT_i,wdepnulrinvbot,fbbtbot,VBRBOT_i,VBRinvbot,PBRBOT_i,fstopbot,slopebot,ijunbot, qjunbot) \ -end \ -if ((LS_i) == 0) begin \ - ijunsti = 0; \ - qjunsti = 0; \ -end else begin \ - `juncapfunction(qprefsti,qpref2sti,vbiinvsti,one_minus_PSTI,idsatsti,CSRHSTI_i,CTATSTI_i,vbisti,wdepnulrsti,VBIRSTIinv,PSTI_i,ftdsti,btatpartsti,atatsti,one_over_one_minus_PSTI,CBBTSTI_i,VBIRSTI_i,wdepnulrinvsti,fbbtsti,VBRSTI_i,VBRinvsti,PBRSTI_i,fstopsti,slopesti,ijunsti, qjunsti) \ -end \ -if ((LG_i) == 0) begin \ - ijungat = 0; \ - qjungat = 0; \ -end else begin \ - `juncapfunction(qprefgat,qpref2gat,vbiinvgat,one_minus_PGAT,idsatgat,CSRHGAT_i,CTATGAT_i,vbigat,wdepnulrgat,VBIRGATinv,PGAT_i,ftdgat,btatpartgat,atatgat,one_over_one_minus_PGAT,CBBTGAT_i,VBIRGAT_i,wdepnulrinvgat,fbbtgat,VBRGAT_i,VBRinvgat,PBRGAT_i,fstopgat,slopegat,ijungat, qjungat) \ -end + if ((LG_i) == 0) begin \ + ijungat = 0; \ + qjungat = 0; \ + end else begin \ + `juncapfunction(qprefgat,qpref2gat,vbiinvgat,one_minus_PGAT,idsatgat,CSRHGAT_i,CTATGAT_i,vbigat,wdepnulrgat,VBIRGATinv,PGAT_i,ftdgat,btatpartgat,atatgat,one_over_one_minus_PGAT,CBBTGAT_i,VBIRGAT_i,wdepnulrinvgat,fbbtgat,VBRGAT_i,VBRinvgat,PBRGAT_i,fstopgat,slopegat,ijungat, qjungat) \ + end diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include index 7d71ba231..a207a1217 100644 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include +++ b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_parlist.include @@ -15,51 +15,51 @@ // Further information can be found in the file readme.txt // - ////////////////////////////////////////// - // - // JUNCAP2 - Reduced parameterlist - // - ////////////////////////////////////////// +////////////////////////////////////////// +// +// JUNCAP2 - Reduced parameterlist +// +////////////////////////////////////////// - parameter real IMAX = 1000 `from(`IMAX_cliplow ,inf ) `P(info="Maximum current up to which forward current behaves exponentially" unit="A" ); - parameter real CJORBOT = 1E-3 `from(`CJORBOT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-area of bottom component" unit="Fm^-2" ); - parameter real CJORSTI = 1E-9 `from(`CJORSTI_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of STI-edge component" unit="Fm^-1" ); - parameter real CJORGAT = 1E-9 `from(`CJORGAT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of gate-edge component" unit="Fm^-1" ); - parameter real VBIRBOT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of bottom component" unit="V" ); - parameter real VBIRSTI = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of STI-edge component" unit="V" ); - parameter real VBIRGAT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of gate-edge component" unit="V" ); - parameter real PBOT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of bottom component" unit="" ); - parameter real PSTI = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of STI-edge component" unit="" ); - parameter real PGAT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of gate-edge component" unit="" ); - parameter real PHIGBOT = 1.16 `P(info="Zero-temperature bandgap voltage of bottom component" unit="V" ); - parameter real PHIGSTI = 1.16 `P(info="Zero-temperature bandgap voltage of STI-edge component" unit="V" ); - parameter real PHIGGAT = 1.16 `P(info="Zero-temperature bandgap voltage of gate-edge component" unit="V" ); - parameter real IDSATRBOT = 1E-12 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of bottom component" unit="Am^-2" ); - parameter real IDSATRSTI = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of STI-edge component" unit="Am^-1" ); - parameter real IDSATRGAT = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of gate-edge component" unit="Am^-1" ); - parameter real CSRHBOT = 1E2 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of bottom component" unit="Am^-3" ); - parameter real CSRHSTI = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of STI-edge component" unit="Am^-2" ); - parameter real CSRHGAT = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of gate-edge component" unit="Am^-2" ); - parameter real XJUNSTI = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of STI-edge component" unit="m" ); - parameter real XJUNGAT = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of gate-edge component" unit="m" ); - parameter real CTATBOT = 1E2 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of bottom component" unit="Am^-3" ); - parameter real CTATSTI = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of STI-edge component" unit="Am^-2" ); - parameter real CTATGAT = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of gate-edge component" unit="Am^-2" ); - parameter real MEFFTATBOT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of bottom component" unit="" ); - parameter real MEFFTATSTI = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component" unit="" ); - parameter real MEFFTATGAT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component" unit="" ); - parameter real CBBTBOT = 1E-12 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of bottom component" unit="AV^-3" ); - parameter real CBBTSTI = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of STI-edge component" unit="AV^-3m" ); - parameter real CBBTGAT = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of gate-edge component" unit="AV^-3m" ); - parameter real FBBTRBOT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of bottom component" unit="Vm^-1" ); - parameter real FBBTRSTI = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of STI-edge component" unit="Vm^-1" ); - parameter real FBBTRGAT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of gate-edge component" unit="Vm^-1" ); - parameter real STFBBTBOT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of bottom component" unit="K^-1" ); - parameter real STFBBTSTI = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of STI-edge component" unit="K^-1" ); - parameter real STFBBTGAT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of gate-edge component" unit="K^-1" ); - parameter real VBRBOT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of bottom component" unit="V" ); - parameter real VBRSTI = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of STI-edge component" unit="V" ); - parameter real VBRGAT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of gate-edge component" unit="V" ); - parameter real PBRBOT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of bottom component" unit="V" ); - parameter real PBRSTI = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of STI-edge component" unit="V" ); - parameter real PBRGAT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of gate-edge component" unit="V" ); +parameter real IMAX = 1000 `from(`IMAX_cliplow ,inf ) `P(info="Maximum current up to which forward current behaves exponentially" unit="A" ); +parameter real CJORBOT = 1E-3 `from(`CJORBOT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-area of bottom component" unit="Fm^-2" ); +parameter real CJORSTI = 1E-9 `from(`CJORSTI_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of STI-edge component" unit="Fm^-1" ); +parameter real CJORGAT = 1E-9 `from(`CJORGAT_cliplow ,inf ) `P(info="Zero-bias capacitance per unit-of-length of gate-edge component" unit="Fm^-1" ); +parameter real VBIRBOT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of bottom component" unit="V" ); +parameter real VBIRSTI = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of STI-edge component" unit="V" ); +parameter real VBIRGAT = 1 `from(`VBIR_cliplow ,inf ) `P(info="Built-in voltage at the reference temperature of gate-edge component" unit="V" ); +parameter real PBOT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of bottom component" unit="" ); +parameter real PSTI = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of STI-edge component" unit="" ); +parameter real PGAT = 0.5 `from(`P_cliplow ,`P_cliphigh ) `P(info="Grading coefficient of gate-edge component" unit="" ); +parameter real PHIGBOT = 1.16 `P(info="Zero-temperature bandgap voltage of bottom component" unit="V" ); +parameter real PHIGSTI = 1.16 `P(info="Zero-temperature bandgap voltage of STI-edge component" unit="V" ); +parameter real PHIGGAT = 1.16 `P(info="Zero-temperature bandgap voltage of gate-edge component" unit="V" ); +parameter real IDSATRBOT = 1E-12 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of bottom component" unit="Am^-2" ); +parameter real IDSATRSTI = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of STI-edge component" unit="Am^-1" ); +parameter real IDSATRGAT = 1E-18 `from(`IDSATR_cliplow ,inf ) `P(info="Saturation current density at the reference temperature of gate-edge component" unit="Am^-1" ); +parameter real CSRHBOT = 1E2 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of bottom component" unit="Am^-3" ); +parameter real CSRHSTI = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of STI-edge component" unit="Am^-2" ); +parameter real CSRHGAT = 1E-4 `from(`CSRH_cliplow ,inf ) `P(info="Shockley-Read-Hall prefactor of gate-edge component" unit="Am^-2" ); +parameter real XJUNSTI = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of STI-edge component" unit="m" ); +parameter real XJUNGAT = 100E-9 `from(`XJUN_cliplow ,inf ) `P(info="Junction depth of gate-edge component" unit="m" ); +parameter real CTATBOT = 1E2 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of bottom component" unit="Am^-3" ); +parameter real CTATSTI = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of STI-edge component" unit="Am^-2" ); +parameter real CTATGAT = 1E-4 `from(`CTAT_cliplow ,inf ) `P(info="Trap-assisted tunneling prefactor of gate-edge component" unit="Am^-2" ); +parameter real MEFFTATBOT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of bottom component" unit="" ); +parameter real MEFFTATSTI = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component" unit="" ); +parameter real MEFFTATGAT = 0.25 `from(`MEFFTAT_cliplow ,inf ) `P(info="Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component" unit="" ); +parameter real CBBTBOT = 1E-12 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of bottom component" unit="AV^-3" ); +parameter real CBBTSTI = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of STI-edge component" unit="AV^-3m" ); +parameter real CBBTGAT = 1E-18 `from(`CBBT_cliplow ,inf ) `P(info="Band-to-band tunneling prefactor of gate-edge component" unit="AV^-3m" ); +parameter real FBBTRBOT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of bottom component" unit="Vm^-1" ); +parameter real FBBTRSTI = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of STI-edge component" unit="Vm^-1" ); +parameter real FBBTRGAT = 1E9 `P(info="Normalization field at the reference temperature for band-to-band tunneling of gate-edge component" unit="Vm^-1" ); +parameter real STFBBTBOT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of bottom component" unit="K^-1" ); +parameter real STFBBTSTI = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of STI-edge component" unit="K^-1" ); +parameter real STFBBTGAT = -1E-3 `P(info="Temperature scaling parameter for band-to-band tunneling of gate-edge component" unit="K^-1" ); +parameter real VBRBOT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of bottom component" unit="V" ); +parameter real VBRSTI = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of STI-edge component" unit="V" ); +parameter real VBRGAT = 10 `from(`VBR_cliplow ,inf ) `P(info="Breakdown voltage of gate-edge component" unit="V" ); +parameter real PBRBOT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of bottom component" unit="V" ); +parameter real PBRSTI = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of STI-edge component" unit="V" ); +parameter real PBRGAT = 4 `from(`PBR_cliplow ,inf ) `P(info="Breakdown onset tuning parameter of gate-edge component" unit="V" ); diff --git a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include index ee3524fce..f05b01926 100644 --- a/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include +++ b/src/spicelib/devices/adms/psp102/admsva/JUNCAP200_varlist.include @@ -16,52 +16,52 @@ // - // declaration of variables needed in macro "calcerfcexpmtat" - real ysq, terfc, erfcpos; +// declaration of variables needed in macro "calcerfcexpmtat" +real ysq, terfc, erfcpos; - // declaration of variables needed in hypfunction 5 - real h1, h2, h2d, h3, h4, h5; +// declaration of variables needed in hypfunction 5 +real h1, h2, h2d, h3, h4, h5; - // declaration of variables used within macro "juncapfunction" - real tmp, id; - real isrh, vbi_minus_vjsrh, wsrhstep, dwsrh, wsrh, wdep, asrh; - real itat, btat, twoatatoverthreebtat, umaxbeforelimiting, umax, sqrtumax, umaxpoweronepointfive; - real wgamma, wtat, ktat, ltat, mtat, xerfc, erfctimesexpmtat, gammamax; - real ibbt, Fmaxr; - real fbreakdown; +// declaration of variables used within macro "juncapfunction" +real tmp, id; +real isrh, vbi_minus_vjsrh, wsrhstep, dwsrh, wsrh, wdep, asrh; +real itat, btat, twoatatoverthreebtat, umaxbeforelimiting, umax, sqrtumax, umaxpoweronepointfive; +real wgamma, wtat, ktat, ltat, mtat, xerfc, erfctimesexpmtat, gammamax; +real ibbt, Fmaxr; +real fbreakdown; - // declaration of clipped parameters - real TRJ_i, IMAX_i; - real CJORBOT_i, CJORSTI_i, CJORGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i; - real PBOT_i, PSTI_i, PGAT_i; - real IDSATRBOT_i, IDSATRSTI_i, IDSATRGAT_i, XJUNSTI_i, XJUNGAT_i; - real CSRHBOT_i, CSRHSTI_i, CSRHGAT_i, CTATBOT_i, CTATSTI_i, CTATGAT_i; - real MEFFTATBOT_i, MEFFTATSTI_i, MEFFTATGAT_i; - real CBBTBOT_i, CBBTSTI_i, CBBTGAT_i; - real VBRBOT_i, VBRSTI_i, VBRGAT_i, PBRBOT_i, PBRSTI_i, PBRGAT_i; +// declaration of clipped parameters +real TRJ_i, IMAX_i; +real CJORBOT_i, CJORSTI_i, CJORGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i; +real PBOT_i, PSTI_i, PGAT_i; +real IDSATRBOT_i, IDSATRSTI_i, IDSATRGAT_i, XJUNSTI_i, XJUNGAT_i; +real CSRHBOT_i, CSRHSTI_i, CSRHGAT_i, CTATBOT_i, CTATSTI_i, CTATGAT_i; +real MEFFTATBOT_i, MEFFTATSTI_i, MEFFTATGAT_i; +real CBBTBOT_i, CBBTSTI_i, CBBTGAT_i; +real VBRBOT_i, VBRSTI_i, VBRGAT_i, PBRBOT_i, PBRSTI_i, PBRGAT_i; - // declaration of variables calculated outside macro "juncapfunction", voltage-independent part - real tkr, tkd, auxt, KBOL_over_QELE, phitr, phitrinv, phitd, phitdinv; - real deltaphigr, phigrbot, phigrsti, phigrgat, deltaphigd, phigdbot, phigdsti, phigdgat; - real ftdbot, ftdsti, ftdgat, idsatbot, idsatsti, idsatgat, exp_VMAX_over_phitd; - real ubibot, ubisti, ubigat, vbibot, vbisti, vbigat; - real vbibot2, vbisti2, vbigat2, vbibot2r, vbisti2r, vbigat2r; - real vbiinvbot, vbiinvsti, vbiinvgat; - real one_minus_PBOT, one_minus_PSTI, one_minus_PGAT; - real one_over_one_minus_PBOT, one_over_one_minus_PSTI, one_over_one_minus_PGAT; - real cjobot, cjosti, cjogat, qprefbot, qprefsti, qprefgat; - real vbimin, vch, vfmin, vbbtlim; - real qpref2bot, qpref2sti, qpref2gat; - real wdepnulrbot, wdepnulrsti, wdepnulrgat, wdepnulrinvbot, wdepnulrinvsti, wdepnulrinvgat; - real VBIRBOTinv, VBIRSTIinv, VBIRGATinv; - real perfc, berfc, cerfc; - real deltaEbot, deltaEsti, deltaEgat, atatbot, atatsti, atatgat; - real btatpartbot, btatpartsti, btatpartgat; - real fbbtbot, fbbtsti, fbbtgat; - real fstopbot, fstopsti, fstopgat, VBRinvbot, VBRinvsti, VBRinvgat; - real slopebot, slopesti, slopegat; - real vmaxbot, vmaxsti, vmaxgat, VMAX; +// declaration of variables calculated outside macro "juncapfunction", voltage-independent part +real tkr, tkd, auxt, KBOL_over_QELE, phitr, phitrinv, phitd, phitdinv; +real deltaphigr, phigrbot, phigrsti, phigrgat, deltaphigd, phigdbot, phigdsti, phigdgat; +real ftdbot, ftdsti, ftdgat, idsatbot, idsatsti, idsatgat, exp_VMAX_over_phitd; +real ubibot, ubisti, ubigat, vbibot, vbisti, vbigat; +real vbibot2, vbisti2, vbigat2, vbibot2r, vbisti2r, vbigat2r; +real vbiinvbot, vbiinvsti, vbiinvgat; +real one_minus_PBOT, one_minus_PSTI, one_minus_PGAT; +real one_over_one_minus_PBOT, one_over_one_minus_PSTI, one_over_one_minus_PGAT; +real cjobot, cjosti, cjogat, qprefbot, qprefsti, qprefgat; +real vbimin, vch, vfmin, vbbtlim; +real qpref2bot, qpref2sti, qpref2gat; +real wdepnulrbot, wdepnulrsti, wdepnulrgat, wdepnulrinvbot, wdepnulrinvsti, wdepnulrinvgat; +real VBIRBOTinv, VBIRSTIinv, VBIRGATinv; +real perfc, berfc, cerfc; +real deltaEbot, deltaEsti, deltaEgat, atatbot, atatsti, atatgat; +real btatpartbot, btatpartsti, btatpartgat; +real fbbtbot, fbbtsti, fbbtgat; +real fstopbot, fstopsti, fstopgat, VBRinvbot, VBRinvsti, VBRinvgat; +real slopebot, slopesti, slopegat; +real vmaxbot, vmaxsti, vmaxgat, VMAX; - // declaration of variables calculated outside macro "juncapfunction", voltage-dependent part - real VAK, idmult, vj, z, zinv, two_psistar, vjlim, vjsrh, vbbt, vav; +// declaration of variables calculated outside macro "juncapfunction", voltage-dependent part +real VAK, idmult, vj, z, zinv, two_psistar, vjlim, vjsrh, vbbt, vav; diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include index 990e5f88a..c4b1496bc 100644 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_macrodefs.include @@ -72,59 +72,106 @@ // (one call uses expressions for arguments so parentheses // around the arguments in the expressions are necessary) `define sigma(a,c,tau,eta,y) \ -nu = (a) + (c); \ -mu = nu * nu / (tau) + 0.5 * ((c) * (c)) - (a); \ -y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a))); + nu = (a) + (c); \ + mu = nu * nu / (tau) + 0.5 * ((c) * (c)) - (a); \ + y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a))); // modified version of sigma, which takes 4 arguments `define sigma2(a,b,c,tau,eta,y) \ -nu = (a) + (c); \ -if (abs(tau) < 1e-120) begin /*sometimes tau is extremely small...*/\ - y = (eta); \ -end else begin \ - mu = (nu) * (nu) / (tau) + 0.5 * ((c) * (c)) - (a) * (b); \ - y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a) * (b))); \ -end + nu = (a) + (c); \ + if (abs(tau) < 1e-120) begin /*sometimes tau is extremely small...*/\ + y = (eta); \ + end else begin \ + mu = (nu) * (nu) / (tau) + 0.5 * ((c) * (c)) - (a) * (b); \ + y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a) * (b))); \ + end // // sp_s surface potential calculation // `define sp_s(sp,xg,xn,delta) \ -if (abs(xg) <= margin) begin \ - SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \ - sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \ -end else begin \ - if (xg < -margin) begin \ - SP_S_yg = -xg; \ - SP_S_ysub = 1.25 * (SP_S_yg * inv_xi); \ - SP_S_eta = 0.5 * (SP_S_ysub + 10 - sqrt((SP_S_ysub - 6.0) * (SP_S_ysub - 6.0) + 64.0)); \ - SP_S_temp = SP_S_yg - SP_S_eta; \ - SP_S_a = SP_S_temp * SP_S_temp + Gf2*(SP_S_eta + 1.0);\ - SP_S_c = 2.0 * SP_S_temp - Gf2; \ - SP_S_tau = -SP_S_eta + ln(SP_S_a * inv_Gf2); \ - `sigma(SP_S_a, SP_S_c, SP_S_tau, SP_S_eta, SP_S_y0) \ - `expl_high(SP_S_y0, SP_S_delta0) \ - SP_S_delta1 = 1.0 / SP_S_delta0; \ - SP_S_temp = 1.0 / (2.0 + SP_S_y0 * SP_S_y0); \ - SP_S_xi0 = SP_S_y0 * SP_S_y0 * SP_S_temp; \ - SP_S_xi1 = 4.0 * (SP_S_y0 * SP_S_temp * SP_S_temp); \ - SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \ - SP_S_temp = SP_S_yg - SP_S_y0; \ - SP_S_temp1 = (delta) * SP_S_delta1; \ - SP_S_pC = 2.0 * SP_S_temp + Gf2 * (SP_S_delta0 - 1.0 - SP_S_temp1 + (delta) * (1.0 - SP_S_xi1)); \ - SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta0 - SP_S_y0 - 1.0 + SP_S_temp1 + (delta) * (SP_S_y0 - 1.0 - SP_S_xi0)); \ - SP_S_temp = 2.0 - Gf2 * (SP_S_delta0 + SP_S_temp1 - (delta) * SP_S_xi2); \ - SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \ - sp = -SP_S_y0 - 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \ + if (abs(xg) <= margin) begin \ + SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \ + sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \ end else begin \ - SP_xg1 = 1.0 / (x1 + Gf * 7.324648775608221e-001); \ - SP_S_A_fac= (xi * x1 * SP_xg1 - 1.0) * SP_xg1; \ - SP_S_xbar = xg * inv_xi * (1.0 + SP_S_A_fac * xg); \ - `expl_low(-SP_S_xbar, SP_S_temp) \ - SP_S_w = 1.0 - SP_S_temp; \ - SP_S_x1 = xg + Gf2 * 0.5 - Gf * sqrt(xg + Gf2 * 0.25 - SP_S_w); \ - SP_S_bx = (xn) + 3.0; \ + if (xg < -margin) begin \ + SP_S_yg = -xg; \ + SP_S_ysub = 1.25 * (SP_S_yg * inv_xi); \ + SP_S_eta = 0.5 * (SP_S_ysub + 10 - sqrt((SP_S_ysub - 6.0) * (SP_S_ysub - 6.0) + 64.0)); \ + SP_S_temp = SP_S_yg - SP_S_eta; \ + SP_S_a = SP_S_temp * SP_S_temp + Gf2*(SP_S_eta + 1.0);\ + SP_S_c = 2.0 * SP_S_temp - Gf2; \ + SP_S_tau = -SP_S_eta + ln(SP_S_a * inv_Gf2); \ + `sigma(SP_S_a, SP_S_c, SP_S_tau, SP_S_eta, SP_S_y0) \ + `expl_high(SP_S_y0, SP_S_delta0) \ + SP_S_delta1 = 1.0 / SP_S_delta0; \ + SP_S_temp = 1.0 / (2.0 + SP_S_y0 * SP_S_y0); \ + SP_S_xi0 = SP_S_y0 * SP_S_y0 * SP_S_temp; \ + SP_S_xi1 = 4.0 * (SP_S_y0 * SP_S_temp * SP_S_temp); \ + SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \ + SP_S_temp = SP_S_yg - SP_S_y0; \ + SP_S_temp1 = (delta) * SP_S_delta1; \ + SP_S_pC = 2.0 * SP_S_temp + Gf2 * (SP_S_delta0 - 1.0 - SP_S_temp1 + (delta) * (1.0 - SP_S_xi1)); \ + SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta0 - SP_S_y0 - 1.0 + SP_S_temp1 + (delta) * (SP_S_y0 - 1.0 - SP_S_xi0)); \ + SP_S_temp = 2.0 - Gf2 * (SP_S_delta0 + SP_S_temp1 - (delta) * SP_S_xi2); \ + SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \ + sp = -SP_S_y0 - 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \ + end else begin \ + SP_xg1 = 1.0 / (x1 + Gf * 7.324648775608221e-001); \ + SP_S_A_fac= (xi * x1 * SP_xg1 - 1.0) * SP_xg1; \ + SP_S_xbar = xg * inv_xi * (1.0 + SP_S_A_fac * xg); \ + `expl_low(-SP_S_xbar, SP_S_temp) \ + SP_S_w = 1.0 - SP_S_temp; \ + SP_S_x1 = xg + Gf2 * 0.5 - Gf * sqrt(xg + Gf2 * 0.25 - SP_S_w); \ + SP_S_bx = (xn) + 3.0; \ + SP_S_eta = `MINA(SP_S_x1, SP_S_bx, 5.0) - 0.5 * (SP_S_bx - sqrt(SP_S_bx * SP_S_bx + 5.0)); \ + SP_S_temp = xg - SP_S_eta; \ + SP_S_temp1= exp(-SP_S_eta); \ + SP_S_temp2= 1.0 / (2.0 + SP_S_eta * SP_S_eta); \ + SP_S_xi0 = SP_S_eta * SP_S_eta * SP_S_temp2; \ + SP_S_xi1 = 4.0 * (SP_S_eta * SP_S_temp2 * SP_S_temp2); \ + SP_S_xi2 = (8.0 * SP_S_temp2 - 12.0 * SP_S_xi0) * SP_S_temp2 * SP_S_temp2; \ + SP_S_a = max(1.0e-40, SP_S_temp * SP_S_temp - Gf2 * (SP_S_temp1 + SP_S_eta - 1.0 - (delta) * (SP_S_eta + 1.0 + SP_S_xi0))); \ + SP_S_b = 1.0 - 0.5 * (Gf2 * (SP_S_temp1 - (delta) * SP_S_xi2)); \ + SP_S_c = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_temp1 - (delta) * (1.0 + SP_S_xi1)); \ + SP_S_tau = (xn) - SP_S_eta + ln(SP_S_a / Gf2); \ + `sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \ + if (SP_S_x0 < `se05) begin \ + SP_S_delta0 = exp(SP_S_x0); \ + SP_S_delta1 = 1.0 / SP_S_delta0; \ + SP_S_delta0 = (delta) * SP_S_delta0; \ + end else begin \ + if (SP_S_x0 > (xn) - `se05) begin \ + SP_S_delta0 = exp(SP_S_x0 - (xn)); \ + SP_S_delta1 = (delta) / SP_S_delta0; \ + end else begin \ + SP_S_delta0 = `ke05 / `P3((xn) - SP_S_x0 - `se05); \ + SP_S_delta1 = `ke05 / `P3(SP_S_x0 - `se05); \ + end \ + end \ + SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \ + SP_S_xi0 = SP_S_x0 * SP_S_x0 * SP_S_temp; \ + SP_S_xi1 = 4.0 * (SP_S_x0 * SP_S_temp * SP_S_temp); \ + SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \ + SP_S_temp = xg - SP_S_x0; \ + SP_S_pC = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_delta1 + SP_S_delta0 - (delta) * (1.0 + SP_S_xi1)); \ + SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta1 + SP_S_x0 - 1.0 + SP_S_delta0 - (delta) * (SP_S_x0 + 1.0 + SP_S_xi0)); \ + SP_S_temp = 2.0 - Gf2 * (SP_S_delta1 + SP_S_delta0 - (delta) * SP_S_xi2); \ + SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \ + sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \ + end \ + end + +// +// sp_s_d surface potential calculation at drain (subset of function sp_s) +// +`define sp_s_d(sp,xg,xn,delta) \ + if (abs(xg) <= margin) begin \ + SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \ + sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \ + end else begin \ + SP_S_bx = (xn) + 3; \ SP_S_eta = `MINA(SP_S_x1, SP_S_bx, 5.0) - 0.5 * (SP_S_bx - sqrt(SP_S_bx * SP_S_bx + 5.0)); \ SP_S_temp = xg - SP_S_eta; \ SP_S_temp1= exp(-SP_S_eta); \ @@ -153,98 +200,51 @@ end else begin \ SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \ SP_S_xi0 = SP_S_x0 * SP_S_x0 * SP_S_temp; \ SP_S_xi1 = 4.0 * (SP_S_x0 * SP_S_temp * SP_S_temp); \ - SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \ + SP_S_xi2 = (8.0 * SP_S_temp-12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \ SP_S_temp = xg - SP_S_x0; \ SP_S_pC = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_delta1 + SP_S_delta0 - (delta) * (1.0 + SP_S_xi1)); \ SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta1 + SP_S_x0 - 1.0 + SP_S_delta0 - (delta) * (SP_S_x0 + 1.0 + SP_S_xi0)); \ - SP_S_temp = 2.0 - Gf2 * (SP_S_delta1 + SP_S_delta0 - (delta) * SP_S_xi2); \ + SP_S_temp = 2.0 - Gf2*(SP_S_delta1+SP_S_delta0-(delta)*SP_S_xi2); \ SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \ - sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \ - end \ -end - -// -// sp_s_d surface potential calculation at drain (subset of function sp_s) -// -`define sp_s_d(sp,xg,xn,delta) \ -if (abs(xg) <= margin) begin \ - SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \ - sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \ -end else begin \ - SP_S_bx = (xn) + 3; \ - SP_S_eta = `MINA(SP_S_x1, SP_S_bx, 5.0) - 0.5 * (SP_S_bx - sqrt(SP_S_bx * SP_S_bx + 5.0)); \ - SP_S_temp = xg - SP_S_eta; \ - SP_S_temp1= exp(-SP_S_eta); \ - SP_S_temp2= 1.0 / (2.0 + SP_S_eta * SP_S_eta); \ - SP_S_xi0 = SP_S_eta * SP_S_eta * SP_S_temp2; \ - SP_S_xi1 = 4.0 * (SP_S_eta * SP_S_temp2 * SP_S_temp2); \ - SP_S_xi2 = (8.0 * SP_S_temp2 - 12.0 * SP_S_xi0) * SP_S_temp2 * SP_S_temp2; \ - SP_S_a = max(1.0e-40, SP_S_temp * SP_S_temp - Gf2 * (SP_S_temp1 + SP_S_eta - 1.0 - (delta) * (SP_S_eta + 1.0 + SP_S_xi0))); \ - SP_S_b = 1.0 - 0.5 * (Gf2 * (SP_S_temp1 - (delta) * SP_S_xi2)); \ - SP_S_c = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_temp1 - (delta) * (1.0 + SP_S_xi1)); \ - SP_S_tau = (xn) - SP_S_eta + ln(SP_S_a / Gf2); \ - `sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \ - if (SP_S_x0 < `se05) begin \ - SP_S_delta0 = exp(SP_S_x0); \ - SP_S_delta1 = 1.0 / SP_S_delta0; \ - SP_S_delta0 = (delta) * SP_S_delta0; \ - end else begin \ - if (SP_S_x0 > (xn) - `se05) begin \ - SP_S_delta0 = exp(SP_S_x0 - (xn)); \ - SP_S_delta1 = (delta) / SP_S_delta0; \ - end else begin \ - SP_S_delta0 = `ke05 / `P3((xn) - SP_S_x0 - `se05); \ - SP_S_delta1 = `ke05 / `P3(SP_S_x0 - `se05); \ - end \ - end \ - SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \ - SP_S_xi0 = SP_S_x0 * SP_S_x0 * SP_S_temp; \ - SP_S_xi1 = 4.0 * (SP_S_x0 * SP_S_temp * SP_S_temp); \ - SP_S_xi2 = (8.0 * SP_S_temp-12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \ - SP_S_temp = xg - SP_S_x0; \ - SP_S_pC = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_delta1 + SP_S_delta0 - (delta) * (1.0 + SP_S_xi1)); \ - SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta1 + SP_S_x0 - 1.0 + SP_S_delta0 - (delta) * (SP_S_x0 + 1.0 + SP_S_xi0)); \ - SP_S_temp = 2.0 - Gf2*(SP_S_delta1+SP_S_delta0-(delta)*SP_S_xi2); \ - SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \ - sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp)));\ -end + sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp)));\ + end // // sp_ov surface potential calculation for the overlap regions // `define sp_ov(sp,xg) \ -if (abs(xg) <= x_mrg_ov) begin \ - sp = (-(xg) * inv_xi_ov); \ -end else begin \ - if (xg < -x_mrg_ov) begin \ - SP_OV_yg = -xg; \ - SP_OV_z = x1 * SP_OV_yg * inv_xi_ov; \ - SP_OV_eta = 0.5 * (SP_OV_z + 10.0 - sqrt((SP_OV_z - 6.0) * (SP_OV_z - 6.0) + 64.0)); \ - SP_OV_a = (SP_OV_yg - SP_OV_eta) * (SP_OV_yg - SP_OV_eta) + GOV2 * (SP_OV_eta + 1.0); \ - SP_OV_c = 2.0 * (SP_OV_yg - SP_OV_eta) - GOV2; \ - SP_OV_tau = ln(SP_OV_a / GOV2) - SP_OV_eta; \ - `sigma(SP_OV_a, SP_OV_c, SP_OV_tau, SP_OV_eta, SP_OV_y0) \ - SP_OV_D0 = exp(SP_OV_y0); \ - SP_OV_temp = SP_OV_yg - SP_OV_y0; \ - SP_OV_p = 2.0 * SP_OV_temp + GOV2 * (SP_OV_D0 - 1.0); \ - SP_OV_q = SP_OV_temp * SP_OV_temp + GOV2 * (SP_OV_y0 + 1.0 - SP_OV_D0); \ - SP_OV_xi = 1.0 - GOV2 * 0.5 * SP_OV_D0; \ - SP_OV_temp = SP_OV_p * SP_OV_p - 4.0 * (SP_OV_xi * SP_OV_q); \ - SP_OV_w = 2.0 * (SP_OV_q / (SP_OV_p + sqrt(SP_OV_temp))); \ - sp = -(SP_OV_y0 + SP_OV_w); \ + if (abs(xg) <= x_mrg_ov) begin \ + sp = (-(xg) * inv_xi_ov); \ end else begin \ - SP_OV_Afac = (xi_ov * x1 * inv_xg1 - 1.0) * inv_xg1; \ - SP_OV_xbar = xg * inv_xi_ov * (1.0 + SP_OV_Afac * xg); \ - `expl_low(-SP_OV_xbar, SP_OV_temp) \ - SP_OV_w = 1.0 - SP_OV_temp; \ - SP_OV_x0 = xg + GOV2 * 0.5 - GOV * sqrt(xg + GOV2 * 0.25 - SP_OV_w); \ - `expl_low(-SP_OV_x0, SP_OV_D0) \ - SP_OV_p = 2.0 * (xg - SP_OV_x0) + GOV2 * (1 - SP_OV_D0); \ - SP_OV_q = (xg - SP_OV_x0) * (xg - SP_OV_x0) - GOV2 * (SP_OV_x0 - 1.0 + SP_OV_D0); \ - SP_OV_xi = 1.0 - GOV2 * 0.5 * SP_OV_D0; \ - SP_OV_temp = SP_OV_p * SP_OV_p - 4.0 * (SP_OV_xi * SP_OV_q); \ - SP_OV_u = 2.0 * (SP_OV_q / (SP_OV_p + sqrt(SP_OV_temp))); \ - sp = SP_OV_x0 + SP_OV_u; \ - end \ - sp = -sp; \ -end + if (xg < -x_mrg_ov) begin \ + SP_OV_yg = -xg; \ + SP_OV_z = x1 * SP_OV_yg * inv_xi_ov; \ + SP_OV_eta = 0.5 * (SP_OV_z + 10.0 - sqrt((SP_OV_z - 6.0) * (SP_OV_z - 6.0) + 64.0)); \ + SP_OV_a = (SP_OV_yg - SP_OV_eta) * (SP_OV_yg - SP_OV_eta) + GOV2 * (SP_OV_eta + 1.0); \ + SP_OV_c = 2.0 * (SP_OV_yg - SP_OV_eta) - GOV2; \ + SP_OV_tau = ln(SP_OV_a / GOV2) - SP_OV_eta; \ + `sigma(SP_OV_a, SP_OV_c, SP_OV_tau, SP_OV_eta, SP_OV_y0) \ + SP_OV_D0 = exp(SP_OV_y0); \ + SP_OV_temp = SP_OV_yg - SP_OV_y0; \ + SP_OV_p = 2.0 * SP_OV_temp + GOV2 * (SP_OV_D0 - 1.0); \ + SP_OV_q = SP_OV_temp * SP_OV_temp + GOV2 * (SP_OV_y0 + 1.0 - SP_OV_D0); \ + SP_OV_xi = 1.0 - GOV2 * 0.5 * SP_OV_D0; \ + SP_OV_temp = SP_OV_p * SP_OV_p - 4.0 * (SP_OV_xi * SP_OV_q); \ + SP_OV_w = 2.0 * (SP_OV_q / (SP_OV_p + sqrt(SP_OV_temp))); \ + sp = -(SP_OV_y0 + SP_OV_w); \ + end else begin \ + SP_OV_Afac = (xi_ov * x1 * inv_xg1 - 1.0) * inv_xg1; \ + SP_OV_xbar = xg * inv_xi_ov * (1.0 + SP_OV_Afac * xg); \ + `expl_low(-SP_OV_xbar, SP_OV_temp) \ + SP_OV_w = 1.0 - SP_OV_temp; \ + SP_OV_x0 = xg + GOV2 * 0.5 - GOV * sqrt(xg + GOV2 * 0.25 - SP_OV_w); \ + `expl_low(-SP_OV_x0, SP_OV_D0) \ + SP_OV_p = 2.0 * (xg - SP_OV_x0) + GOV2 * (1 - SP_OV_D0); \ + SP_OV_q = (xg - SP_OV_x0) * (xg - SP_OV_x0) - GOV2 * (SP_OV_x0 - 1.0 + SP_OV_D0); \ + SP_OV_xi = 1.0 - GOV2 * 0.5 * SP_OV_D0; \ + SP_OV_temp = SP_OV_p * SP_OV_p - 4.0 * (SP_OV_xi * SP_OV_q); \ + SP_OV_u = 2.0 * (SP_OV_q / (SP_OV_p + sqrt(SP_OV_temp))); \ + sp = SP_OV_x0 + SP_OV_u; \ + end \ + sp = -sp; \ + end diff --git a/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include b/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include index 4c3ea6b0f..4a1b74d89 100644 --- a/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include +++ b/src/spicelib/devices/adms/psp102/admsva/PSP102_module.include @@ -17,21 +17,21 @@ // Further information can be found in the file readme.txt // - // Node definitions - inout D, G, S, B; - electrical D; - electrical G; - electrical S; - electrical B; - - // Extra internal nodes for correlated drain and gate noise - electrical NOI; - electrical NOI2; - - // Extra branches for correlated drain and gate noise - branch (NOI) NOII; - branch (NOI) NOIR; - branch (NOI) NOIC; +// Node definitions +inout D, G, S, B; +electrical D; +electrical G; +electrical S; +electrical B; + +// Extra internal nodes for correlated drain and gate noise +electrical NOI; +electrical NOI2; + +// Extra branches for correlated drain and gate noise +branch (NOI) NOII; +branch (NOI) NOIR; +branch (NOI) NOIC; `ifdef NQSmodel // Internal nodes for gate and bulk resistors @@ -74,11 +74,11 @@ `endif // NQSmodel - ////////////////////////// - // - // Model parameters - // - ////////////////////////// +////////////////////////// +// +// Model parameters +// +////////////////////////// `ifdef LocalModel /////////////////////////////////////////////////// @@ -184,14 +184,14 @@ parameter real NFC = 0.0 `from( 0.0,inf ) `P(info="Third coefficient of flicker noise" unit="V^-1" ); `ifdef NQSmodel - // NQS parameters - parameter real SWNQS = 0.0 `from( 0.0,9.0 ) `P(info="Flag for NQS, 0=off, 1, 2, 3, 5, or 9=number of collocation points" unit="" ); - parameter real MUNQS = 1.0 `from( 0.0,inf ) `P(info="Relative mobility for NQS modelling" ); - parameter real RG = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Gate resistance" unit="Ohm" ); - parameter real RBULK = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Bulk resistance between node BP and BI" unit="Ohm" ); - parameter real RWELL = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Well resistance between node BI and B" unit="Ohm" ); - parameter real RJUNS = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Source-side bulk resistance between node BI and BS" unit="Ohm" ); - parameter real RJUND = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Drain-side bulk resistance between node BI and BD" unit="Ohm" ); + // NQS parameters + parameter real SWNQS = 0.0 `from( 0.0,9.0 ) `P(info="Flag for NQS, 0=off, 1, 2, 3, 5, or 9=number of collocation points" unit="" ); + parameter real MUNQS = 1.0 `from( 0.0,inf ) `P(info="Relative mobility for NQS modelling" ); + parameter real RG = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Gate resistance" unit="Ohm" ); + parameter real RBULK = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Bulk resistance between node BP and BI" unit="Ohm" ); + parameter real RWELL = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Well resistance between node BI and B" unit="Ohm" ); + parameter real RJUNS = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Source-side bulk resistance between node BI and BS" unit="Ohm" ); + parameter real RJUND = 1.0e-3 `from( 1.0e-6,inf ) `P(info="Drain-side bulk resistance between node BI and BD" unit="Ohm" ); `endif // NQSmodel // JUNCAP Parameters @@ -220,201 +220,201 @@ `include "PSP102_binpars.include" `else // Binning - /////////////////////////////////////////////////// - // PSP global model parameters - /////////////////////////////////////////////////// - - // Special model parameters - parameter real LEVEL = 1020 `P(info="Model level" unit="" ); - parameter real TYPE = 1.0 `from( -1,1 ) `P(info="Channel type parameter, +1=NMOS -1=PMOS" unit="" ); - - // Reference Temperature - parameter real TR = 21.0 `from( -273.0,inf ) `P(info="nominal (reference) temperature" unit="C" ); - - // Switch parameters that turn models or effects on or off - parameter real SWIGATE = 0.0 `from( 0.0,1.0 ) `P(info="Flag for gate current, 0=turn off IG" unit="" ); - parameter real SWIMPACT = 0.0 `from( 0.0,1.0 ) `P(info="Flag for impact ionization current, 0=turn off II" unit="" ); - parameter real SWGIDL = 0.0 `from( 0.0,1.0 ) `P(info="Flag for GIDL current, 0=turn off IGIDL" unit="" ); - parameter real SWJUNCAP = 0.0 `from( 0.0,3.0 ) `P(info="Flag for juncap, 0=turn off juncap" unit="" ); - parameter real QMC = 1.0 `from( 0.0,inf ) `P(info="Quantum-mechanical correction factor" unit="" ); - - // Process Parameters - parameter real LVARO = 0.0 `P(info="Geom. independent difference between actual and programmed gate length" unit="m" ); - parameter real LVARL = 0.0 `P(info="Length dependence of LVAR" unit="" ); - parameter real LVARW = 0.0 `P(info="Width dependence of LVAR" unit="" ); - parameter real LAP = 0.0 `P(info="Effective channel length reduction per side" unit="m" ); - parameter real WVARO = 0.0 `P(info="Geom. independent difference between actual and programmed field-oxide opening" unit="m" ); - parameter real WVARL = 0.0 `P(info="Length dependence of WVAR" unit="" ); - parameter real WVARW = 0.0 `P(info="Width dependence of WVAR" unit="" ); - parameter real WOT = 0.0 `P(info="Effective channel width reduction per side" unit="m" ); - parameter real DLQ = 0.0 `P(info="Effective channel length reduction for CV" unit="m" ); - parameter real DWQ = 0.0 `P(info="Effective channel width reduction for CV" unit="m" ); - parameter real VFBO = -1.0 `P(info="Geometry-independent flat-band voltage at TR" unit="V" ); - parameter real VFBL = 0.0 `P(info="Length dependence of flat-band voltage" unit="" ); - parameter real VFBW = 0.0 `P(info="Width dependence of flat-band voltage" unit="" ); - parameter real VFBLW = 0.0 `P(info="Area dependence of flat-band voltage" unit="" ); - parameter real STVFBO = 5e-4 `P(info="Geometry-independent temperature dependence of VFB" unit="V/K" ); - parameter real STVFBL = 0.0 `P(info="Length dependence of temperature dependence of VFB" unit="" ); - parameter real STVFBW = 0.0 `P(info="Width dependence of temperature dependence of VFB" unit="" ); - parameter real STVFBLW = 0.0 `P(info="Area dependence of temperature dependence of VFB" unit="" ); - parameter real TOXO = 2e-9 `from( 1e-10,inf ) `P(info="Gate oxide thickness" unit="m" ); - parameter real NSUBO = 3e23 `from( 1e20,inf ) `P(info="Geometry independent substrate doping" unit="m^-3" ); - parameter real NSUBW = 0.0 `P(info="Width dependence of background doping NSUBO due to segregation" unit="" ); - parameter real WSEG = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of segregation of background doping NSUBO" unit="m" ); - parameter real NPCK = 1e24 `from( 0.0,inf ) `P(info="Pocket doping level" unit="m^-3" ); - parameter real NPCKW = 0.0 `P(info="Width dependence of pocket doping NPCK due to segregation" unit="" ); - parameter real WSEGP = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of segregation of pocket doping NPCK" unit="m" ); - parameter real LPCK = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of lateral doping profile" unit="m" ); - parameter real LPCKW = 0.0 `P(info="Width dependence of char. length of lateral doping profile" unit="" ); - parameter real FOL1 = 0.0 `P(info="First length dependence coefficient for short channel body effect" unit="" ); - parameter real FOL2 = 0.0 `P(info="Second length dependence coefficient for short channel body effect" unit="" ); - parameter real VNSUBO = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V" ); - parameter real NSLPO = 0.05 `P(info="Effective doping bias-dependence parameter" unit="V" ); - parameter real DNSUBO = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V^-1" ); - parameter real DPHIBO = 0.0 `P(info="Geometry independent offset of PHIB" unit="V" ); - parameter real DPHIBL = 0.0 `P(info="Length dependence offset of PHIB" unit="V" ); - parameter real DPHIBLEXP= 1.0 `P(info="Exponent for length dependence of offset of PHIB" unit="" ); - parameter real DPHIBW = 0.0 `P(info="Width dependence of offset of PHIB" unit="" ); - parameter real DPHIBLW = 0.0 `P(info="Area dependence of offset of PHIB" unit="" ); - parameter real NPO = 1e26 `P(info="Geometry-independent gate poly-silicon doping" unit="m^-3" ); - parameter real NPL = 0.0 `P(info="Length dependence of gate poly-silicon doping" unit="" ); - parameter real CTO = 0.0 `P(info="Geometry-independent interface states factor" unit="" ); - parameter real CTL = 0.0 `P(info="Length dependence of interface states factor" unit="" ); - parameter real CTLEXP = 1.0 `P(info="Exponent for length dependence of interface states factor" unit="" ); - parameter real CTW = 0.0 `P(info="Width dependence of interface states factor" unit="" ); - parameter real CTLW = 0.0 `P(info="Area dependence of interface states factor" unit="" ); - parameter real TOXOVO = 2e-9 `from( 1e-10,inf ) `P(info="Overlap oxide thickness" unit="m" ); - parameter real LOV = 0 `from( 0.0,inf ) `P(info="Overlap length for gate/drain and gate/source overlap capacitance" unit="m" ); - parameter real NOVO = 5e25 `P(info="Effective doping of overlap region" unit="m^-3" ); - - // DIBL Parameters - parameter real CFL = 0.0 `P(info="Length dependence of DIBL-parameter" unit="V^-1" ); - parameter real CFLEXP = 2.0 `P(info="Exponent for length dependence of CF" unit="" ); - parameter real CFW = 0.0 `P(info="Width dependence of CF" unit="" ); - parameter real CFBO = 0.0 `P(info="Back-bias dependence of CF" unit="V^-1" ); - - // Mobility Parameters - parameter real UO = 5e-2 `P(info="Zero-field mobility at TR" unit="m^2/V/s" ); - parameter real FBET1 = 0.0 `P(info="Relative mobility decrease due to first lateral profile" unit="" ); - parameter real FBET1W = 0.0 `P(info="Width dependence of relative mobility decrease due to first lateral profile" unit="" ); - parameter real LP1 = 1e-8 `from( 1e-10,inf ) `P(info="Mobility-related characteristic length of first lateral profile" unit="m" ); - parameter real LP1W = 0.0 `P(info="Width dependence of mobility-related characteristic length of first lateral profile" unit="" ); - parameter real FBET2 = 0.0 `P(info="Relative mobility decrease due to second lateral profile" unit="" ); - parameter real LP2 = 1e-8 `from( 1e-10,inf ) `P(info="Mobility-related characteristic length of second lateral profile" unit="m" ); - parameter real BETW1 = 0.0 `P(info="First higher-order width scaling coefficient of BETN" unit="" ); - parameter real BETW2 = 0.0 `P(info="Second higher-order width scaling coefficient of BETN" unit="" ); - parameter real WBET = 1e-9 `from( 1e-10,inf ) `P(info="Characteristic width for width scaling of BETN" unit="m" ); - parameter real STBETO = 1.0 `P(info="Geometry independent temperature dependence of BETN" unit="" ); - parameter real STBETL = 0.0 `P(info="Length dependence of temperature dependence of BETN" unit="" ); - parameter real STBETW = 0.0 `P(info="Width dependence of temperature dependence of BETN" unit="" ); - parameter real STBETLW = 0.0 `P(info="Area dependence of temperature dependence of BETN" unit="" ); - parameter real MUEO = 0.5 `P(info="Geometry independent mobility reduction coefficient at TR" unit="m/V" ); - parameter real MUEW = 0.0 `P(info="Width dependence of mobility reduction coefficient at TR" unit="" ); - parameter real STMUEO = 0.0 `P(info="Temperature dependence of MUE" unit="" ); - parameter real THEMUO = 1.5 `P(info="Mobility reduction exponent at TR" unit="" ); - parameter real STTHEMUO = 1.5 `P(info="Temperature dependence of THEMU" unit="" ); - parameter real CSO = 0.0 `P(info="Geometry independent coulomb scattering parameter at TR" unit="" ); - parameter real CSL = 0.0 `P(info="Length dependence of CS" unit="" ); - parameter real CSLEXP = 0.0 `P(info="Exponent for length dependence of CS" unit="" ); - parameter real CSW = 0.0 `P(info="Width dependence of CS" unit="" ); - parameter real CSLW = 0.0 `P(info="Area dependence of CS" unit="" ); - parameter real STCSO = 0.0 `P(info="Temperature dependence of CS" unit="" ); - parameter real XCORO = 0.0 `P(info="Geometry independent non-universality parameter" unit="V^-1" ); - parameter real XCORL = 0.0 `P(info="Length dependence of non-universality parameter" unit="" ); - parameter real XCORW = 0.0 `P(info="Width dependence of non-universality parameter" unit="" ); - parameter real XCORLW = 0.0 `P(info="Area dependence of non-universality parameter" unit="" ); - parameter real STXCORO = 0.0 `P(info="Temperature dependence of XCOR" unit="" ); - parameter real FETAO = 1.0 `P(info="Effective field parameter" unit="" ); - - // Series Resistance - parameter real RSW1 = 2.5e3 `P(info="Source/drain series resistance for 1 um wide channel at TR" unit="Ohm" ); - parameter real RSW2 = 0.0 `P(info="Higher-order width scaling of RS" unit="" ); - parameter real STRSO = 1.0 `P(info="Temperature dependence of RS" unit="" ); - parameter real RSBO = 0.0 `P(info="Back-bias dependence of series resistance" unit="V^-1" ); - parameter real RSGO = 0.0 `P(info="Gate-bias dependence of series resistance" unit="V^-1" ); - - // Velocity Saturation - parameter real THESATO = 0.0 `P(info="Geometry independent velocity saturation parameter at TR" unit="V^-1" ); - parameter real THESATL = 0.05 `P(info="Length dependence of THESAT" unit="V^-1" ); - parameter real THESATLEXP= 1.0 `P(info="Exponent for length dependence of THESAT" unit="" ); - parameter real THESATW = 0.0 `P(info="Width dependence of velocity saturation parameter" unit="" ); - parameter real THESATLW = 0.0 `P(info="Area dependence of velocity saturation parameter" unit="" ); - parameter real STTHESATO= 1.0 `P(info="Geometry independent temperature dependence of THESAT" unit="" ); - parameter real STTHESATL= 0.0 `P(info="Length dependence of temperature dependence of THESAT" unit="" ); - parameter real STTHESATW= 0.0 `P(info="Width dependence of temperature dependence of THESAT" unit="" ); - parameter real STTHESATLW= 0.0 `P(info="Area dependence of temperature dependence of THESAT" unit="" ); - parameter real THESATBO = 0.0 `P(info="Back-bias dependence of velocity saturation" unit="V^-1" ); - parameter real THESATGO = 0.0 `P(info="Gate-bias dependence of velocity saturation" unit="V^-1" ); - - // Saturation Voltage - parameter real AXO = 18 `P(info="Geometry independent linear/saturation transition factor" unit="" ); - parameter real AXL = 0.4 `from( 0.0,inf ) `P(info="Length dependence of AX" unit="" ); - - // Channel Length Modulation - parameter real ALPL = 5e-4 `P(info="Length dependence of ALP" unit="" ); - parameter real ALPLEXP = 1.0 `P(info="Exponent for length dependence of ALP" unit="" ); - parameter real ALPW = 0.0 `P(info="Width dependence of ALP" unit="" ); - parameter real ALP1L1 = 0.0 `P(info="Length dependence of CLM enhancement factor above threshold" unit="V" ); - parameter real ALP1LEXP = 0.5 `P(info="Exponent for length dependence of ALP1" unit="" ); - parameter real ALP1L2 = 0.0 `from( 0.0,inf ) `P(info="Second_order length dependence of ALP1" unit="" ); - parameter real ALP1W = 0.0 `P(info="Width dependence of ALP1" unit="" ); - parameter real ALP2L1 = 0.0 `P(info="Length dependence of CLM enhancement factor below threshold" unit="V^-1" ); - parameter real ALP2LEXP = 0.5 `P(info="Exponent for length dependence of ALP2" unit="" ); - parameter real ALP2L2 = 0.0 `from( 0.0,inf ) `P(info="Second_order length dependence of ALP2" unit="" ); - parameter real ALP2W = 0.0 `P(info="Width dependence of ALP2" unit="" ); - parameter real VPO = 0.05 `P(info="CLM logarithmic dependence parameter" unit="V" ); - - // Weak-avalanche parameters - parameter real A1O = 1.0 `P(info="Geometry independent impact-ionization pre-factor" unit="" ); - parameter real A1L = 0.0 `P(info="Length dependence of A1" unit="" ); - parameter real A1W = 0.0 `P(info="Width dependence of A1" unit="" ); - parameter real A2O = 10 `P(info="Impact-ionization exponent at TR" unit="V" ); - parameter real STA2O = 0.0 `P(info="Temperature dependence of A2" unit="V" ); - parameter real A3O = 1.0 `P(info="Geometry independent saturation-voltage dependence of II" unit="" ); - parameter real A3L = 0.0 `P(info="Length dependence of A3" unit="" ); - parameter real A3W = 0.0 `P(info="Width dependence of A3" unit="" ); - parameter real A4O = 0.0 `P(info="Geometry independent back-bias dependence of II" unit="V^-0.5" ); - parameter real A4L = 0.0 `P(info="Length dependence of A4" unit="" ); - parameter real A4W = 0.0 `P(info="Width dependence of A4" unit="" ); - - // Gate current parameters - parameter real GCOO = 0.0 `P(info="Gate tunnelling energy adjustment" unit="" ); - parameter real IGINVLW = 0.0 `P(info="Gate channel current pre-factor for 1 um^2 channel area" unit="A" ); - parameter real IGOVW = 0.0 `P(info="Gate overlap current pre-factor for 1 um wide channel" unit="A" ); - parameter real STIGO = 2.0 `P(info="Temperature dependence of IGINV and IGOV" unit="" ); - parameter real GC2O = 0.375 `P(info="Gate current slope factor" unit="" ); - parameter real GC3O = 0.063 `P(info="Gate current curvature factor" unit="" ); - parameter real CHIBO = 3.1 `P(info="Tunnelling barrier height" unit="V" ); - - // Gate-induced drain leakage parameters - parameter real AGIDLW = 0.0 `P(info="Width dependence of GIDL pre-factor" unit="A/V^3" ); - parameter real BGIDLO = 41 `P(info="GIDL probability factor at TR" unit="V" ); - parameter real STBGIDLO = 0.0 `P(info="Temperature dependence of BGIDL" unit="V/K" ); - parameter real CGIDLO = 0.0 `P(info="Back-bias dependence of GIDL" unit="" ); - - // Charge Model Parameters - parameter real CGBOVL = 0.0 `P(info="Oxide capacitance for gate-bulk overlap for 1 um^2 area" unit="F" ); - parameter real CFRW = 0.0 `P(info="Outer fringe capacitance for 1 um wide channel" unit="F" ); - - // Noise Model Parameters - parameter real FNTO = 1.0 `P(info="Thermal noise coefficient" unit="" ); - parameter real NFALW = 8e22 `P(info="First coefficient of flicker noise for 1 um^2 channel area" unit="V^-1/m^4" ); - parameter real NFBLW = 3e7 `P(info="Second coefficient of flicker noise for 1 um^2 channel area" unit="V^-1/m^2" ); - parameter real NFCLW = 0.0 `P(info="Third coefficient of flicker noise for 1 um^2 channel area" unit="V^-1" ); - - // Other Parameters - parameter real DTA = 0 `P(info="Temperature offset w.r.t. ambient circuit temperature" unit="K" ); + /////////////////////////////////////////////////// + // PSP global model parameters + /////////////////////////////////////////////////// + + // Special model parameters + parameter real LEVEL = 1020 `P(info="Model level" unit="" ); + parameter real TYPE = 1.0 `from( -1,1 ) `P(info="Channel type parameter, +1=NMOS -1=PMOS" unit="" ); + + // Reference Temperature + parameter real TR = 21.0 `from( -273.0,inf ) `P(info="nominal (reference) temperature" unit="C" ); + + // Switch parameters that turn models or effects on or off + parameter real SWIGATE = 0.0 `from( 0.0,1.0 ) `P(info="Flag for gate current, 0=turn off IG" unit="" ); + parameter real SWIMPACT = 0.0 `from( 0.0,1.0 ) `P(info="Flag for impact ionization current, 0=turn off II" unit="" ); + parameter real SWGIDL = 0.0 `from( 0.0,1.0 ) `P(info="Flag for GIDL current, 0=turn off IGIDL" unit="" ); + parameter real SWJUNCAP = 0.0 `from( 0.0,3.0 ) `P(info="Flag for juncap, 0=turn off juncap" unit="" ); + parameter real QMC = 1.0 `from( 0.0,inf ) `P(info="Quantum-mechanical correction factor" unit="" ); + + // Process Parameters + parameter real LVARO = 0.0 `P(info="Geom. independent difference between actual and programmed gate length" unit="m" ); + parameter real LVARL = 0.0 `P(info="Length dependence of LVAR" unit="" ); + parameter real LVARW = 0.0 `P(info="Width dependence of LVAR" unit="" ); + parameter real LAP = 0.0 `P(info="Effective channel length reduction per side" unit="m" ); + parameter real WVARO = 0.0 `P(info="Geom. independent difference between actual and programmed field-oxide opening" unit="m" ); + parameter real WVARL = 0.0 `P(info="Length dependence of WVAR" unit="" ); + parameter real WVARW = 0.0 `P(info="Width dependence of WVAR" unit="" ); + parameter real WOT = 0.0 `P(info="Effective channel width reduction per side" unit="m" ); + parameter real DLQ = 0.0 `P(info="Effective channel length reduction for CV" unit="m" ); + parameter real DWQ = 0.0 `P(info="Effective channel width reduction for CV" unit="m" ); + parameter real VFBO = -1.0 `P(info="Geometry-independent flat-band voltage at TR" unit="V" ); + parameter real VFBL = 0.0 `P(info="Length dependence of flat-band voltage" unit="" ); + parameter real VFBW = 0.0 `P(info="Width dependence of flat-band voltage" unit="" ); + parameter real VFBLW = 0.0 `P(info="Area dependence of flat-band voltage" unit="" ); + parameter real STVFBO = 5e-4 `P(info="Geometry-independent temperature dependence of VFB" unit="V/K" ); + parameter real STVFBL = 0.0 `P(info="Length dependence of temperature dependence of VFB" unit="" ); + parameter real STVFBW = 0.0 `P(info="Width dependence of temperature dependence of VFB" unit="" ); + parameter real STVFBLW = 0.0 `P(info="Area dependence of temperature dependence of VFB" unit="" ); + parameter real TOXO = 2e-9 `from( 1e-10,inf ) `P(info="Gate oxide thickness" unit="m" ); + parameter real NSUBO = 3e23 `from( 1e20,inf ) `P(info="Geometry independent substrate doping" unit="m^-3" ); + parameter real NSUBW = 0.0 `P(info="Width dependence of background doping NSUBO due to segregation" unit="" ); + parameter real WSEG = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of segregation of background doping NSUBO" unit="m" ); + parameter real NPCK = 1e24 `from( 0.0,inf ) `P(info="Pocket doping level" unit="m^-3" ); + parameter real NPCKW = 0.0 `P(info="Width dependence of pocket doping NPCK due to segregation" unit="" ); + parameter real WSEGP = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of segregation of pocket doping NPCK" unit="m" ); + parameter real LPCK = 1e-8 `from( 1e-10,inf ) `P(info="Char. length of lateral doping profile" unit="m" ); + parameter real LPCKW = 0.0 `P(info="Width dependence of char. length of lateral doping profile" unit="" ); + parameter real FOL1 = 0.0 `P(info="First length dependence coefficient for short channel body effect" unit="" ); + parameter real FOL2 = 0.0 `P(info="Second length dependence coefficient for short channel body effect" unit="" ); + parameter real VNSUBO = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V" ); + parameter real NSLPO = 0.05 `P(info="Effective doping bias-dependence parameter" unit="V" ); + parameter real DNSUBO = 0.0 `P(info="Effective doping bias-dependence parameter" unit="V^-1" ); + parameter real DPHIBO = 0.0 `P(info="Geometry independent offset of PHIB" unit="V" ); + parameter real DPHIBL = 0.0 `P(info="Length dependence offset of PHIB" unit="V" ); + parameter real DPHIBLEXP= 1.0 `P(info="Exponent for length dependence of offset of PHIB" unit="" ); + parameter real DPHIBW = 0.0 `P(info="Width dependence of offset of PHIB" unit="" ); + parameter real DPHIBLW = 0.0 `P(info="Area dependence of offset of PHIB" unit="" ); + parameter real NPO = 1e26 `P(info="Geometry-independent gate poly-silicon doping" unit="m^-3" ); + parameter real NPL = 0.0 `P(info="Length dependence of gate poly-silicon doping" unit="" ); + parameter real CTO = 0.0 `P(info="Geometry-independent interface states factor" unit="" ); + parameter real CTL = 0.0 `P(info="Length dependence of interface states factor" unit="" ); + parameter real CTLEXP = 1.0 `P(info="Exponent for length dependence of interface states factor" unit="" ); + parameter real CTW = 0.0 `P(info="Width dependence of interface states factor" unit="" ); + parameter real CTLW = 0.0 `P(info="Area dependence of interface states factor" unit="" ); + parameter real TOXOVO = 2e-9 `from( 1e-10,inf ) `P(info="Overlap oxide thickness" unit="m" ); + parameter real LOV = 0 `from( 0.0,inf ) `P(info="Overlap length for gate/drain and gate/source overlap capacitance" unit="m" ); + parameter real NOVO = 5e25 `P(info="Effective doping of overlap region" unit="m^-3" ); + + // DIBL Parameters + parameter real CFL = 0.0 `P(info="Length dependence of DIBL-parameter" unit="V^-1" ); + parameter real CFLEXP = 2.0 `P(info="Exponent for length dependence of CF" unit="" ); + parameter real CFW = 0.0 `P(info="Width dependence of CF" unit="" ); + parameter real CFBO = 0.0 `P(info="Back-bias dependence of CF" unit="V^-1" ); + + // Mobility Parameters + parameter real UO = 5e-2 `P(info="Zero-field mobility at TR" unit="m^2/V/s" ); + parameter real FBET1 = 0.0 `P(info="Relative mobility decrease due to first lateral profile" unit="" ); + parameter real FBET1W = 0.0 `P(info="Width dependence of relative mobility decrease due to first lateral profile" unit="" ); + parameter real LP1 = 1e-8 `from( 1e-10,inf ) `P(info="Mobility-related characteristic length of first lateral profile" unit="m" ); + parameter real LP1W = 0.0 `P(info="Width dependence of mobility-related characteristic length of first lateral profile" unit="" ); + parameter real FBET2 = 0.0 `P(info="Relative mobility decrease due to second lateral profile" unit="" ); + parameter real LP2 = 1e-8 `from( 1e-10,inf ) `P(info="Mobility-related characteristic length of second lateral profile" unit="m" ); + parameter real BETW1 = 0.0 `P(info="First higher-order width scaling coefficient of BETN" unit="" ); + parameter real BETW2 = 0.0 `P(info="Second higher-order width scaling coefficient of BETN" unit="" ); + parameter real WBET = 1e-9 `from( 1e-10,inf ) `P(info="Characteristic width for width scaling of BETN" unit="m" ); + parameter real STBETO = 1.0 `P(info="Geometry independent temperature dependence of BETN" unit="" ); + parameter real STBETL = 0.0 `P(info="Length dependence of temperature dependence of BETN" unit="" ); + parameter real STBETW = 0.0 `P(info="Width dependence of temperature dependence of BETN" unit="" ); + parameter real STBETLW = 0.0 `P(info="Area dependence of temperature dependence of BETN" unit="" ); + parameter real MUEO = 0.5 `P(info="Geometry independent mobility reduction coefficient at TR" unit="m/V" ); + parameter real MUEW = 0.0 `P(info="Width dependence of mobility reduction coefficient at TR" unit="" ); + parameter real STMUEO = 0.0 `P(info="Temperature dependence of MUE" unit="" ); + parameter real THEMUO = 1.5 `P(info="Mobility reduction exponent at TR" unit="" ); + parameter real STTHEMUO = 1.5 `P(info="Temperature dependence of THEMU" unit="" ); + parameter real CSO = 0.0 `P(info="Geometry independent coulomb scattering parameter at TR" unit="" ); + parameter real CSL = 0.0 `P(info="Length dependence of CS" unit="" ); + parameter real CSLEXP = 0.0 `P(info="Exponent for length dependence of CS" unit="" ); + parameter real CSW = 0.0 `P(info="Width dependence of CS" unit="" ); + parameter real CSLW = 0.0 `P(info="Area dependence of CS" unit="" ); + parameter real STCSO = 0.0 `P(info="Temperature dependence of CS" unit="" ); + parameter real XCORO = 0.0 `P(info="Geometry independent non-universality parameter" unit="V^-1" ); + parameter real XCORL = 0.0 `P(info="Length dependence of non-universality parameter" unit="" ); + parameter real XCORW = 0.0 `P(info="Width dependence of non-universality parameter" unit="" ); + parameter real XCORLW = 0.0 `P(info="Area dependence of non-universality parameter" unit="" ); + parameter real STXCORO = 0.0 `P(info="Temperature dependence of XCOR" unit="" ); + parameter real FETAO = 1.0 `P(info="Effective field parameter" unit="" ); + + // Series Resistance + parameter real RSW1 = 2.5e3 `P(info="Source/drain series resistance for 1 um wide channel at TR" unit="Ohm" ); + parameter real RSW2 = 0.0 `P(info="Higher-order width scaling of RS" unit="" ); + parameter real STRSO = 1.0 `P(info="Temperature dependence of RS" unit="" ); + parameter real RSBO = 0.0 `P(info="Back-bias dependence of series resistance" unit="V^-1" ); + parameter real RSGO = 0.0 `P(info="Gate-bias dependence of series resistance" unit="V^-1" ); + + // Velocity Saturation + parameter real THESATO = 0.0 `P(info="Geometry independent velocity saturation parameter at TR" unit="V^-1" ); + parameter real THESATL = 0.05 `P(info="Length dependence of THESAT" unit="V^-1" ); + parameter real THESATLEXP= 1.0 `P(info="Exponent for length dependence of THESAT" unit="" ); + parameter real THESATW = 0.0 `P(info="Width dependence of velocity saturation parameter" unit="" ); + parameter real THESATLW = 0.0 `P(info="Area dependence of velocity saturation parameter" unit="" ); + parameter real STTHESATO= 1.0 `P(info="Geometry independent temperature dependence of THESAT" unit="" ); + parameter real STTHESATL= 0.0 `P(info="Length dependence of temperature dependence of THESAT" unit="" ); + parameter real STTHESATW= 0.0 `P(info="Width dependence of temperature dependence of THESAT" unit="" ); + parameter real STTHESATLW= 0.0 `P(info="Area dependence of temperature dependence of THESAT" unit="" ); + parameter real THESATBO = 0.0 `P(info="Back-bias dependence of velocity saturation" unit="V^-1" ); + parameter real THESATGO = 0.0 `P(info="Gate-bias dependence of velocity saturation" unit="V^-1" ); + + // Saturation Voltage + parameter real AXO = 18 `P(info="Geometry independent linear/saturation transition factor" unit="" ); + parameter real AXL = 0.4 `from( 0.0,inf ) `P(info="Length dependence of AX" unit="" ); + + // Channel Length Modulation + parameter real ALPL = 5e-4 `P(info="Length dependence of ALP" unit="" ); + parameter real ALPLEXP = 1.0 `P(info="Exponent for length dependence of ALP" unit="" ); + parameter real ALPW = 0.0 `P(info="Width dependence of ALP" unit="" ); + parameter real ALP1L1 = 0.0 `P(info="Length dependence of CLM enhancement factor above threshold" unit="V" ); + parameter real ALP1LEXP = 0.5 `P(info="Exponent for length dependence of ALP1" unit="" ); + parameter real ALP1L2 = 0.0 `from( 0.0,inf ) `P(info="Second_order length dependence of ALP1" unit="" ); + parameter real ALP1W = 0.0 `P(info="Width dependence of ALP1" unit="" ); + parameter real ALP2L1 = 0.0 `P(info="Length dependence of CLM enhancement factor below threshold" unit="V^-1" ); + parameter real ALP2LEXP = 0.5 `P(info="Exponent for length dependence of ALP2" unit="" ); + parameter real ALP2L2 = 0.0 `from( 0.0,inf ) `P(info="Second_order length dependence of ALP2" unit="" ); + parameter real ALP2W = 0.0 `P(info="Width dependence of ALP2" unit="" ); + parameter real VPO = 0.05 `P(info="CLM logarithmic dependence parameter" unit="V" ); + + // Weak-avalanche parameters + parameter real A1O = 1.0 `P(info="Geometry independent impact-ionization pre-factor" unit="" ); + parameter real A1L = 0.0 `P(info="Length dependence of A1" unit="" ); + parameter real A1W = 0.0 `P(info="Width dependence of A1" unit="" ); + parameter real A2O = 10 `P(info="Impact-ionization exponent at TR" unit="V" ); + parameter real STA2O = 0.0 `P(info="Temperature dependence of A2" unit="V" ); + parameter real A3O = 1.0 `P(info="Geometry independent saturation-voltage dependence of II" unit="" ); + parameter real A3L = 0.0 `P(info="Length dependence of A3" unit="" ); + parameter real A3W = 0.0 `P(info="Width dependence of A3" unit="" ); + parameter real A4O = 0.0 `P(info="Geometry independent back-bias dependence of II" unit="V^-0.5" ); + parameter real A4L = 0.0 `P(info="Length dependence of A4" unit="" ); + parameter real A4W = 0.0 `P(info="Width dependence of A4" unit="" ); + + // Gate current parameters + parameter real GCOO = 0.0 `P(info="Gate tunnelling energy adjustment" unit="" ); + parameter real IGINVLW = 0.0 `P(info="Gate channel current pre-factor for 1 um^2 channel area" unit="A" ); + parameter real IGOVW = 0.0 `P(info="Gate overlap current pre-factor for 1 um wide channel" unit="A" ); + parameter real STIGO = 2.0 `P(info="Temperature dependence of IGINV and IGOV" unit="" ); + parameter real GC2O = 0.375 `P(info="Gate current slope factor" unit="" ); + parameter real GC3O = 0.063 `P(info="Gate current curvature factor" unit="" ); + parameter real CHIBO = 3.1 `P(info="Tunnelling barrier height" unit="V" ); + + // Gate-induced drain leakage parameters + parameter real AGIDLW = 0.0 `P(info="Width dependence of GIDL pre-factor" unit="A/V^3" ); + parameter real BGIDLO = 41 `P(info="GIDL probability factor at TR" unit="V" ); + parameter real STBGIDLO = 0.0 `P(info="Temperature dependence of BGIDL" unit="V/K" ); + parameter real CGIDLO = 0.0 `P(info="Back-bias dependence of GIDL" unit="" ); + + // Charge Model Parameters + parameter real CGBOVL = 0.0 `P(info="Oxide capacitance for gate-bulk overlap for 1 um^2 area" unit="F" ); + parameter real CFRW = 0.0 `P(info="Outer fringe capacitance for 1 um wide channel" unit="F" ); + + // Noise Model Parameters + parameter real FNTO = 1.0 `P(info="Thermal noise coefficient" unit="" ); + parameter real NFALW = 8e22 `P(info="First coefficient of flicker noise for 1 um^2 channel area" unit="V^-1/m^4" ); + parameter real NFBLW = 3e7 `P(info="Second coefficient of flicker noise for 1 um^2 channel area" unit="V^-1/m^2" ); + parameter real NFCLW = 0.0 `P(info="Third coefficient of flicker noise for 1 um^2 channel area" unit="V^-1" ); + + // Other Parameters + parameter real DTA = 0 `P(info="Temperature offset w.r.t. ambient circuit temperature" unit="K" ); `endif // Binning `ifdef NQSmodel - // NQS parameters - parameter real SWNQS = 0.0 `from( 0.0,9.0 ) `P(info="Flag for NQS, 0=off, 1, 2, 3, 5, or 9=number of collocation points" unit="" ); - parameter real MUNQSO = 1.0 `P(info="Relative mobility for NQS modelling" ); - parameter real RGO = 1.0e-3 `P(info="Gate resistance" ); - parameter real RBULKO = 1.0e-3 `P(info="Bulk resistance between node BP and BI" unit="Ohm" ); - parameter real RWELLO = 1.0e-3 `P(info="Well resistance between node BI and B" unit="Ohm" ); - parameter real RJUNSO = 1.0e-3 `P(info="Source-side bulk resistance between node BI and BS" unit="Ohm" ); - parameter real RJUNDO = 1.0e-3 `P(info="Drain-side bulk resistance between node BI and BD" unit="Ohm" ); + // NQS parameters + parameter real SWNQS = 0.0 `from( 0.0,9.0 ) `P(info="Flag for NQS, 0=off, 1, 2, 3, 5, or 9=number of collocation points" unit="" ); + parameter real MUNQSO = 1.0 `P(info="Relative mobility for NQS modelling" ); + parameter real RGO = 1.0e-3 `P(info="Gate resistance" ); + parameter real RBULKO = 1.0e-3 `P(info="Bulk resistance between node BP and BI" unit="Ohm" ); + parameter real RWELLO = 1.0e-3 `P(info="Well resistance between node BI and B" unit="Ohm" ); + parameter real RJUNSO = 1.0e-3 `P(info="Source-side bulk resistance between node BI and BS" unit="Ohm" ); + parameter real RJUNDO = 1.0e-3 `P(info="Drain-side bulk resistance between node BI and BD" unit="Ohm" ); `endif // NQSmodel // Stress Model Parameters @@ -470,16 +470,16 @@ real LEN, WEN, iL, iW, delLPS, delWOD, LE, WE, iLE, iWE, Lcv, Wcv, LEcv, WEcv; `ifdef Binning - // Auxiliary variables for binning-rules - real iLEWE, iiLE, iiWE, iiLEWE, iiiLEWE; - real iLEcv, iiLEcv, iiWEcv, iiLEWEcv, iiiLEWEcv; - real iLcv, iiLcv, iiWcv, iiLWcv, iiiLWcv; + // Auxiliary variables for binning-rules + real iLEWE, iiLE, iiWE, iiLEWE, iiiLEWE; + real iLEcv, iiLEcv, iiWEcv, iiLEWEcv, iiiLEWEcv; + real iLcv, iiLcv, iiWcv, iiLWcv, iiiLWcv; `else // Binning - // Intermediate variables used for geometry-scaling - real NSUBO_i, WSEG_i, NPCK_i, WSEGP_i, LPCK_i, LOV_i; - real LP1_i, LP2_i, WBET_i, AXL_i, ALP1L2_i, ALP2L2_i; - real NSUB, AA, BB, NSUB0e, NPCKe, LPCKe; - real FBET1e, LP1e, GPE, GWE, tmpx; + // Intermediate variables used for geometry-scaling + real NSUBO_i, WSEG_i, NPCK_i, WSEGP_i, LPCK_i, LOV_i; + real LP1_i, LP2_i, WBET_i, AXL_i, ALP1L2_i, ALP2L2_i; + real NSUB, AA, BB, NSUB0e, NPCKe, LPCKe; + real FBET1e, LP1e, GPE, GWE, tmpx; `endif // Binning // List of local parameters @@ -496,7 +496,7 @@ real COX, CGOV, CGBOV, CFR; real FNT, NFA, NFB, NFC; `ifdef NQSmodel - real MUNQS, RG, RBULK, RWELL, RJUNS, RJUND; + real MUNQS, RG, RBULK, RWELL, RJUNS, RJUND; `endif // NQSmodel // Variables for stress-model @@ -505,82 +505,82 @@ real temp0, templ, tempw, Lx, Wx; `endif // LocalModel - // Variables used in electrical equations - real VFB_i, STVFB_i, TOX_i, NEFF_i, VNSUB_i, NSLP_i, DNSUB_i, NP_i, QMC_i, CT_i, TOXOV_i, NOV_i; - real CF_i, CFB_i, DPHIB_i; - real BET_i, STBET_i, MUE_i, STMUE_i, THEMU_i, STTHEMU_i, CS_i, STCS_i, XCOR_i, STXCOR_i, FETA_i; - real RS_i, THER_i, STRS_i, RSB_i, RSG_i; - real THESAT_i, STTHESAT_i, THESATB_i, THESATG_i; - real AX_i, ALP_i, ALP1_i, ALP2_i, VP_i; - real A1_i, A2_i, STA2_i, A3_i, A4_i; - real GCO_i, IGINV_i, IGOV_i, STIG_i, GC2_i, GC3_i, CHIB_i; - real AGIDL_i, BGIDL_i, STBGIDL_i, CGIDL_i; - real COX_i, CGOV_i, CGBOV_i, CFR_i; - real FNT_i, NFA_i, NFB_i, NFC_i; - real TR_i, MULT_i; - - real temp, temp1, temp2, tempM; - real help; - - real TKR, TKD, TKD_sq, dT, rT, rTn; - real phit, inv_phit, Eg, phibFac, CoxPrime, tox_sq; - real delVg, CoxovPrime, GOV, GOV2; - real np, kp, qq, qb0, dphibq, qlim2; - real E_eff0, eta_mu, BCH, BOV, inv_CHIB, GCQ, Dch, Dov; - real tf_bet, tf_mue, tf_cs, tf_xcor, tf_ther, tf_thesat, tf_ig; - real xi_ov, inv_xi_ov, x_mrg_ov, x1, inv_xg1, Vdsat_lim; - real nt, Cox_over_q; - - real phib, sqrt_phib, phix, aphi, bphi, phix1, phix2, G_0, phit1, inv_phit1, alpha_b; - real inv_VP, inv_AX, Sfl_prefac; - - real Vgs, Vgd, Vds, Vsb, Vsbstar; - real Vgb, Vgb1, Vgbstar, Vdb, Vdbstar, Vdsx, Vsbx; - - real Dnsub; - real Igidl, Igisl, Vtovd, Vtovs; - real x_s, sqm, alpha, alpha1, eta_p, phi_inf, za, xitsb, rhob; - real thesat1, wsat, ysat, zsat, r1, r2, dL, GdL, dL1, FdL, GR, Gmob, Gmob_dL, Gvsat, Gvsatinv, QCLM; - real xgm, Voxm, dps, qim, qim1, qim1_1, xgs_ov, xgd_ov, sigVds; - real Ux, xg; - real mu, nu, xn_s, delta_ns; - real Gf, Gf2, inv_Gf2, xi, inv_xi, margin; - real qeff, COX_qm; - - real SP_xg1, SP_S_temp,SP_S_temp1,SP_S_temp2; - real SP_S_yg, SP_S_ysub, SP_S_y0, SP_S_a, SP_S_b, SP_S_c; - real SP_S_bx, SP_S_tau, SP_S_eta, SP_S_delta0, SP_S_delta1; - real SP_S_pC, SP_S_qC, SP_S_A_fac; - real SP_S_x1, SP_S_w, SP_S_xbar, SP_S_x0; - real SP_S_xi0, SP_S_xi1, SP_S_xi2; - real SP_OV_yg, SP_OV_z, SP_OV_eta, SP_OV_a, SP_OV_c; - real SP_OV_tau, SP_OV_D0, SP_OV_y0, SP_OV_xi, SP_OV_temp; - real SP_OV_p, SP_OV_q, SP_OV_w, SP_OV_Afac, SP_OV_xbar; - real SP_OV_x0, SP_OV_u; - - real x_d, x_m, x_ds, Rxcor, delta_1s, xi0s, xi1s, xi2s, xi0d; - real Es, Em, Ed, Ds, Dm, Dd, Ps, xgs, qis, qbs, qbm, Eeffm, Vm; - real Phi_0, Phi_2, asat, Phi_0_2, Phi0_Phi2; - real Vdse, Vdsat, xn_d, k_ds, Udse; - real Mutmp, Phi_sat, delta_nd; - real pC, qC, Pm; - real d0, D_bar, km, x_pm, xi_pd, p_pd, u_pd, q_pd; - real xs_ov, xd_ov, Vovs, Vovd, psi_t; - real zg, delVsat, TP, Dsi, Dgate, u0, u0_div_H, x, xsq, inv_x, ex, inv_ex, Ag, Bg, Sg; - real H, Fj, Fj2; - real N1, Nm1, Delta_N1, Sfl; - real H0, t1, t2, sqt2, r, lc, lcinv2, g_ideal, CGeff, mid, mig, migid, c_igid, sqid, sqig; - real shot_igs, shot_igsx, shot_igd, shot_igdx, shot_iavl; - - real Ids, Iimpact, mavl, Igdov, Igsov, Igc0, igc, igcd_h; - real Igc, Igcd, Igcs, Igb, Igs, Igd; - real Idse, Igbe, Igse, Igde, Igidle, Igisle, Iimpacte; - real QI, QD, QB, QG, Qg, Qd, Qb, Qs, Qgs_ov, Qgd_ov; - real Qfgs, Qfgd, Qgb_ov; - - real arg1, arg2max, arg2mina; - - integer CHNL_TYPE; +// Variables used in electrical equations +real VFB_i, STVFB_i, TOX_i, NEFF_i, VNSUB_i, NSLP_i, DNSUB_i, NP_i, QMC_i, CT_i, TOXOV_i, NOV_i; +real CF_i, CFB_i, DPHIB_i; +real BET_i, STBET_i, MUE_i, STMUE_i, THEMU_i, STTHEMU_i, CS_i, STCS_i, XCOR_i, STXCOR_i, FETA_i; +real RS_i, THER_i, STRS_i, RSB_i, RSG_i; +real THESAT_i, STTHESAT_i, THESATB_i, THESATG_i; +real AX_i, ALP_i, ALP1_i, ALP2_i, VP_i; +real A1_i, A2_i, STA2_i, A3_i, A4_i; +real GCO_i, IGINV_i, IGOV_i, STIG_i, GC2_i, GC3_i, CHIB_i; +real AGIDL_i, BGIDL_i, STBGIDL_i, CGIDL_i; +real COX_i, CGOV_i, CGBOV_i, CFR_i; +real FNT_i, NFA_i, NFB_i, NFC_i; +real TR_i, MULT_i; + +real temp, temp1, temp2, tempM; +real help; + +real TKR, TKD, TKD_sq, dT, rT, rTn; +real phit, inv_phit, Eg, phibFac, CoxPrime, tox_sq; +real delVg, CoxovPrime, GOV, GOV2; +real np, kp, qq, qb0, dphibq, qlim2; +real E_eff0, eta_mu, BCH, BOV, inv_CHIB, GCQ, Dch, Dov; +real tf_bet, tf_mue, tf_cs, tf_xcor, tf_ther, tf_thesat, tf_ig; +real xi_ov, inv_xi_ov, x_mrg_ov, x1, inv_xg1, Vdsat_lim; +real nt, Cox_over_q; + +real phib, sqrt_phib, phix, aphi, bphi, phix1, phix2, G_0, phit1, inv_phit1, alpha_b; +real inv_VP, inv_AX, Sfl_prefac; + +real Vgs, Vgd, Vds, Vsb, Vsbstar; +real Vgb, Vgb1, Vgbstar, Vdb, Vdbstar, Vdsx, Vsbx; + +real Dnsub; +real Igidl, Igisl, Vtovd, Vtovs; +real x_s, sqm, alpha, alpha1, eta_p, phi_inf, za, xitsb, rhob; +real thesat1, wsat, ysat, zsat, r1, r2, dL, GdL, dL1, FdL, GR, Gmob, Gmob_dL, Gvsat, Gvsatinv, QCLM; +real xgm, Voxm, dps, qim, qim1, qim1_1, xgs_ov, xgd_ov, sigVds; +real Ux, xg; +real mu, nu, xn_s, delta_ns; +real Gf, Gf2, inv_Gf2, xi, inv_xi, margin; +real qeff, COX_qm; + +real SP_xg1, SP_S_temp,SP_S_temp1,SP_S_temp2; +real SP_S_yg, SP_S_ysub, SP_S_y0, SP_S_a, SP_S_b, SP_S_c; +real SP_S_bx, SP_S_tau, SP_S_eta, SP_S_delta0, SP_S_delta1; +real SP_S_pC, SP_S_qC, SP_S_A_fac; +real SP_S_x1, SP_S_w, SP_S_xbar, SP_S_x0; +real SP_S_xi0, SP_S_xi1, SP_S_xi2; +real SP_OV_yg, SP_OV_z, SP_OV_eta, SP_OV_a, SP_OV_c; +real SP_OV_tau, SP_OV_D0, SP_OV_y0, SP_OV_xi, SP_OV_temp; +real SP_OV_p, SP_OV_q, SP_OV_w, SP_OV_Afac, SP_OV_xbar; +real SP_OV_x0, SP_OV_u; + +real x_d, x_m, x_ds, Rxcor, delta_1s, xi0s, xi1s, xi2s, xi0d; +real Es, Em, Ed, Ds, Dm, Dd, Ps, xgs, qis, qbs, qbm, Eeffm, Vm; +real Phi_0, Phi_2, asat, Phi_0_2, Phi0_Phi2; +real Vdse, Vdsat, xn_d, k_ds, Udse; +real Mutmp, Phi_sat, delta_nd; +real pC, qC, Pm; +real d0, D_bar, km, x_pm, xi_pd, p_pd, u_pd, q_pd; +real xs_ov, xd_ov, Vovs, Vovd, psi_t; +real zg, delVsat, TP, Dsi, Dgate, u0, u0_div_H, x, xsq, inv_x, ex, inv_ex, Ag, Bg, Sg; +real H, Fj, Fj2; +real N1, Nm1, Delta_N1, Sfl; +real H0, t1, t2, sqt2, r, lc, lcinv2, g_ideal, CGeff, mid, mig, migid, c_igid, sqid, sqig; +real shot_igs, shot_igsx, shot_igd, shot_igdx, shot_iavl; + +real Ids, Iimpact, mavl, Igdov, Igsov, Igc0, igc, igcd_h; +real Igc, Igcd, Igcs, Igb, Igs, Igd; +real Idse, Igbe, Igse, Igde, Igidle, Igisle, Iimpacte; +real QI, QD, QB, QG, Qg, Qd, Qb, Qs, Qgs_ov, Qgd_ov; +real Qfgs, Qfgd, Qgb_ov; + +real arg1, arg2max, arg2mina; + +integer CHNL_TYPE; `ifdef NQSmodel // Variables used in NQS-calculations @@ -612,14 +612,14 @@ real temp3, temp4, temp5, temp6, temp7, temp8, temp9; `endif // NQSmodel - // JUNCAP2 variables - `include "JUNCAP200_varlist.include" - real isjunbot, qsjunbot, isjunsti, qsjunsti, isjungat, qsjungat, isjun, qsjun, sjnoise, sjnoisex; - real idjunbot, qdjunbot, idjunsti, qdjunsti, idjungat, qdjungat, idjun, qdjun, djnoise, djnoisex; - real Vjuns, Vjund, VMAXS, VMAXD; - real vbimins, vchs, vfmins, vbbtlims, vbimind, vchd, vfmind, vbbtlimd; - real ABSOURCE_i, LSSOURCE_i, LGSOURCE_i; - real ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, juncapwidth; +// JUNCAP2 variables +`include "JUNCAP200_varlist.include" +real isjunbot, qsjunbot, isjunsti, qsjunsti, isjungat, qsjungat, isjun, qsjun, sjnoise, sjnoisex; +real idjunbot, qdjunbot, idjunsti, qdjunsti, idjungat, qdjungat, idjun, qdjun, djnoise, djnoisex; +real Vjuns, Vjund, VMAXS, VMAXD; +real vbimins, vchs, vfmins, vbbtlims, vbimind, vchd, vfmind, vbbtlimd; +real ABSOURCE_i, LSSOURCE_i, LGSOURCE_i; +real ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, juncapwidth; @@ -726,18 +726,18 @@ real sdi `P(ask="yes" info="Total drain junction current noise specral density" unit="A^2/Hz"); `endif // OPinfo - ///////////////////////////////////////////////////////////////////////////// - // - // Analog block with all calculations and contribs - // - ///////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////// +// +// Analog block with all calculations and contribs +// +///////////////////////////////////////////////////////////////////////////// - analog begin +analog begin `ifdef insideADMS `INITIAL_MODEL `endif - begin : initial_model + begin : initial_model // Code independent of bias or instance parameters // This block needs to be evaluated only once @@ -745,23 +745,23 @@ // Do nothing `else // LocalModel `ifdef Binning - // There are no binning parameters that need clipping + // There are no binning parameters that need clipping `else // Binning - // Clipping of global model parameters - TOX_i = `CLIP_LOW(TOXO, 1e-10); - NSUBO_i = `CLIP_LOW(NSUBO, 1e20); - WSEG_i = `CLIP_LOW(WSEG, 1e-10); - NPCK_i = `CLIP_LOW(NPCK, 0.0); - WSEGP_i = `CLIP_LOW(WSEGP, 1e-10); - LPCK_i = `CLIP_LOW(LPCK, 1e-10); - TOXOV_i = `CLIP_LOW(TOXOVO, 1e-10); - LOV_i = `CLIP_LOW(LOV, 0.0); - LP1_i = `CLIP_LOW(LP1, 1e-10); - LP2_i = `CLIP_LOW(LP2, 1e-10); - WBET_i = `CLIP_LOW(WBET, 1e-10); - AXL_i = `CLIP_LOW(AXL, 0.0); - ALP1L2_i = `CLIP_LOW(ALP1L2, 0.0); - ALP2L2_i = `CLIP_LOW(ALP2L2, 0.0); + // Clipping of global model parameters + TOX_i = `CLIP_LOW(TOXO, 1e-10); + NSUBO_i = `CLIP_LOW(NSUBO, 1e20); + WSEG_i = `CLIP_LOW(WSEG, 1e-10); + NPCK_i = `CLIP_LOW(NPCK, 0.0); + WSEGP_i = `CLIP_LOW(WSEGP, 1e-10); + LPCK_i = `CLIP_LOW(LPCK, 1e-10); + TOXOV_i = `CLIP_LOW(TOXOVO, 1e-10); + LOV_i = `CLIP_LOW(LOV, 0.0); + LP1_i = `CLIP_LOW(LP1, 1e-10); + LP2_i = `CLIP_LOW(LP2, 1e-10); + WBET_i = `CLIP_LOW(WBET, 1e-10); + AXL_i = `CLIP_LOW(AXL, 0.0); + ALP1L2_i = `CLIP_LOW(ALP1L2, 0.0); + ALP2L2_i = `CLIP_LOW(ALP2L2, 0.0); `endif // Binning KVSAT_i = `CLIP_BOTH(KVSAT, -1.0, 1.0); @@ -772,30 +772,30 @@ LODETAO_i = `CLIP_LOW(LODETAO, 0.0); `endif // LocalModel - // 4.1 Internal parameters (including temperature scaling) - // (only internal parameters independent on instance parameters - // are calculated in this section) - if (TYPE >= 0) begin - CHNL_TYPE = `NMOS; - end else begin - CHNL_TYPE = `PMOS; - end - - // Transistor temperature - TR_i = `CLIP_LOW(TR, -273); - TKR = `KELVINCONVERSION + TR_i; - TKD = $temperature + DTA; - TKD_sq = TKD * TKD; - dT = TKD - TKR; - rT = TKD / TKR; - rTn = TKR / TKD; - phit = TKD * `KBOL / `QELE; - inv_phit = 1.0 / phit; - - // Local process parameters - Eg = 1.179 - 9.025e-5 * TKD - 3.05e-7 * TKD_sq; - phibFac = (1.045 + 4.5e-4 * TKD) * (0.523 + 1.4e-3 * TKD - 1.48e-6 * TKD_sq) * TKD_sq / 9.0E4; - phibFac = `MAX(phibFac, 1.0E-3); + // 4.1 Internal parameters (including temperature scaling) + // (only internal parameters independent on instance parameters + // are calculated in this section) + if (TYPE >= 0) begin + CHNL_TYPE = `NMOS; + end else begin + CHNL_TYPE = `PMOS; + end + + // Transistor temperature + TR_i = `CLIP_LOW(TR, -273); + TKR = `KELVINCONVERSION + TR_i; + TKD = $temperature + DTA; + TKD_sq = TKD * TKD; + dT = TKD - TKR; + rT = TKD / TKR; + rTn = TKR / TKD; + phit = TKD * `KBOL / `QELE; + inv_phit = 1.0 / phit; + + // Local process parameters + Eg = 1.179 - 9.025e-5 * TKD - 3.05e-7 * TKD_sq; + phibFac = (1.045 + 4.5e-4 * TKD) * (0.523 + 1.4e-3 * TKD - 1.48e-6 * TKD_sq) * TKD_sq / 9.0E4; + phibFac = `MAX(phibFac, 1.0E-3); `ifdef NQSmodel // Round SWNQS to nearest allowed value @@ -828,15 +828,15 @@ nt0 = 4 * `KBOL * TKD; // parameter for white noise of parasitic resistances `endif // NQSmodel - // JUNCAP2 - `include "JUNCAP200_InitModel.include" + // JUNCAP2 + `include "JUNCAP200_InitModel.include" - end // initial_model + end // initial_model `ifdef insideADMS `INITIAL_INSTANCE `endif - begin : initial_instance + begin : initial_instance // Code independent of bias, but dependent on instance parameters, // (including code dependent on parameters which could IN PRINCIPLE be scaled) // This block needs to be evaluated only once for each instance @@ -863,11 +863,11 @@ iL = LEN / L_i; iW = WEN / W_i; `ifdef Binning - delLPS = LVARO * (1.0 + LVARL * iL); - delWOD = WVARO * (1.0 + WVARW * iW); + delLPS = LVARO * (1.0 + LVARL * iL); + delWOD = WVARO * (1.0 + WVARW * iW); `else // Binning - delLPS = LVARO * (1.0 + LVARL * iL) * (1.0 + LVARW * iW); - delWOD = WVARO * (1.0 + WVARL * iL) * (1.0 + WVARW * iW); + delLPS = LVARO * (1.0 + LVARL * iL) * (1.0 + LVARW * iW); + delWOD = WVARO * (1.0 + WVARL * iL) * (1.0 + WVARW * iW); `endif // Binning LE = `CLIP_LOW(L_i + delLPS - 2.0 * LAP, 1e-9); WE = `CLIP_LOW(W_i + delWOD - 2.0 * WOT, 1e-9); @@ -880,128 +880,128 @@ juncapwidth= WE; `ifdef Binning - // 3.4 Geometry scaling with binning scaling rules + // 3.4 Geometry scaling with binning scaling rules `include "PSP102_binning.include" `else // Binning - // 3.3 Geometry scaling with physical scaling rules - - // Process parameters - VFB = VFBO * (1.0 + VFBL * iLE) * (1.0 + VFBW * iWE) * (1.0 + VFBLW * iLE * iWE); - STVFB = STVFBO * (1.0 + STVFBL * iLE) * (1.0 + STVFBW * iWE) * (1.0 + STVFBLW * iLE * iWE); - TOX = TOXO; - NSUB0e = NSUBO_i * `MAX(( 1.0 + NSUBW * iWE * ln( 1.0 + WE / WSEG_i )), 1.0E-03); - NPCKe = NPCK_i * `MAX(( 1.0 + NPCKW * iWE * ln( 1.0 + WE / WSEGP_i )), 1.0E-03); - LPCKe = LPCK_i * `MAX(( 1.0 + LPCKW * iWE * ln( 1.0 + WE / WSEGP_i )), 1.0E-03); - if (LE > (2 * LPCKe)) begin - AA = 7.5e10; - BB = sqrt(NSUB0e + 0.5 * NPCKe) - sqrt(NSUB0e); - NSUB = sqrt(NSUB0e) + AA * ln(1 + 2 * LPCKe / LE * (exp(BB / AA) - 1)); - NSUB = NSUB * NSUB; - end else begin - if (LE >= LPCKe) begin - NSUB = NSUB0e + NPCKe * LPCKe / LE; - end else begin // LE < LPCK - NSUB = NSUB0e + NPCKe * (2 - LE / LPCKe); + // 3.3 Geometry scaling with physical scaling rules + + // Process parameters + VFB = VFBO * (1.0 + VFBL * iLE) * (1.0 + VFBW * iWE) * (1.0 + VFBLW * iLE * iWE); + STVFB = STVFBO * (1.0 + STVFBL * iLE) * (1.0 + STVFBW * iWE) * (1.0 + STVFBLW * iLE * iWE); + TOX = TOXO; + NSUB0e = NSUBO_i * `MAX(( 1.0 + NSUBW * iWE * ln( 1.0 + WE / WSEG_i )), 1.0E-03); + NPCKe = NPCK_i * `MAX(( 1.0 + NPCKW * iWE * ln( 1.0 + WE / WSEGP_i )), 1.0E-03); + LPCKe = LPCK_i * `MAX(( 1.0 + LPCKW * iWE * ln( 1.0 + WE / WSEGP_i )), 1.0E-03); + if (LE > (2 * LPCKe)) begin + AA = 7.5e10; + BB = sqrt(NSUB0e + 0.5 * NPCKe) - sqrt(NSUB0e); + NSUB = sqrt(NSUB0e) + AA * ln(1 + 2 * LPCKe / LE * (exp(BB / AA) - 1)); + NSUB = NSUB * NSUB; + end else begin + if (LE >= LPCKe) begin + NSUB = NSUB0e + NPCKe * LPCKe / LE; + end else begin // LE < LPCK + NSUB = NSUB0e + NPCKe * (2 - LE / LPCKe); + end end - end - NEFF = NSUB * (1 - FOL1 * iLE - FOL2 * iLE * iLE); - VNSUB = VNSUBO; - NSLP = NSLPO; - DNSUB = DNSUBO; - DPHIB = (DPHIBO + DPHIBL * pow(iLE, DPHIBLEXP)) * (1.0 + DPHIBW * iWE) * (1.0 + DPHIBLW * iLE * iWE); - NP = NPO * `MAX(1e-6, (1.0 + NPL * iLE)); - CT = (CTO + CTL * pow(iLE, CTLEXP)) * (1.0 + CTW * iWE) * (1.0 + CTLW * iLE * iWE); - TOXOV = TOXOVO; - NOV = NOVO; - - // DIBL parameters - CF = CFL * pow(iLE, CFLEXP) * (1.0 + CFW * iWE); - CFB = CFBO; - - // Mobility parameters - FBET1e = FBET1 * (1.0 + FBET1W * iWE); - LP1e = LP1_i * `MAX(1.0 + LP1W * iWE, 1.0E-03); - GPE = 1.0 + FBET1e * LP1e / LE * (1.0 - exp(-LE / LP1e)) + FBET2 * LP2_i / LE * (1.0 - exp(-LE / LP2_i)); - GPE = `MAX(GPE, 1e-15); - GWE = 1.0 + BETW1 * iWE + BETW2 * iWE * ln(1.0 + WE / WBET_i); - BETN = UO * WE / (GPE * LE) * GWE; - STBET = STBETO * (1.0 + STBETL * iLE) * (1.0 + STBETW * iWE) * (1.0 + STBETLW * iLE * iWE); - MUE = MUEO * (1.0 + MUEW * iWE); - STMUE = STMUEO; - THEMU = THEMUO; - STTHEMU = STTHEMUO; - CS = (CSO + CSL * pow(iLE, CSLEXP)) * (1.0 + CSW * iWE) * (1.0 + CSLW * iLE * iWE); - STCS = STCSO; - XCOR = XCORO * (1.0 + XCORL * iLE) * (1.0 + XCORW * iWE) * (1.0 + XCORLW * iLE * iWE); - STXCOR = STXCORO; - FETA = FETAO; + NEFF = NSUB * (1 - FOL1 * iLE - FOL2 * iLE * iLE); + VNSUB = VNSUBO; + NSLP = NSLPO; + DNSUB = DNSUBO; + DPHIB = (DPHIBO + DPHIBL * pow(iLE, DPHIBLEXP)) * (1.0 + DPHIBW * iWE) * (1.0 + DPHIBLW * iLE * iWE); + NP = NPO * `MAX(1e-6, (1.0 + NPL * iLE)); + CT = (CTO + CTL * pow(iLE, CTLEXP)) * (1.0 + CTW * iWE) * (1.0 + CTLW * iLE * iWE); + TOXOV = TOXOVO; + NOV = NOVO; + + // DIBL parameters + CF = CFL * pow(iLE, CFLEXP) * (1.0 + CFW * iWE); + CFB = CFBO; + + // Mobility parameters + FBET1e = FBET1 * (1.0 + FBET1W * iWE); + LP1e = LP1_i * `MAX(1.0 + LP1W * iWE, 1.0E-03); + GPE = 1.0 + FBET1e * LP1e / LE * (1.0 - exp(-LE / LP1e)) + FBET2 * LP2_i / LE * (1.0 - exp(-LE / LP2_i)); + GPE = `MAX(GPE, 1e-15); + GWE = 1.0 + BETW1 * iWE + BETW2 * iWE * ln(1.0 + WE / WBET_i); + BETN = UO * WE / (GPE * LE) * GWE; + STBET = STBETO * (1.0 + STBETL * iLE) * (1.0 + STBETW * iWE) * (1.0 + STBETLW * iLE * iWE); + MUE = MUEO * (1.0 + MUEW * iWE); + STMUE = STMUEO; + THEMU = THEMUO; + STTHEMU = STTHEMUO; + CS = (CSO + CSL * pow(iLE, CSLEXP)) * (1.0 + CSW * iWE) * (1.0 + CSLW * iLE * iWE); + STCS = STCSO; + XCOR = XCORO * (1.0 + XCORL * iLE) * (1.0 + XCORW * iWE) * (1.0 + XCORLW * iLE * iWE); + STXCOR = STXCORO; + FETA = FETAO; - // Series resistance - RS = RSW1 * iWE * (1.0 + RSW2 * iWE); - STRS = STRSO; - RSB = RSBO; - RSG = RSGO; + // Series resistance + RS = RSW1 * iWE * (1.0 + RSW2 * iWE); + STRS = STRSO; + RSB = RSBO; + RSG = RSGO; - // Velocity saturation - THESAT = (THESATO + THESATL* GWE / GPE * pow(iLE, THESATLEXP)) * (1.0 + THESATW * iWE) * (1.0 + THESATLW * iLE * iWE); - STTHESAT = STTHESATO * (1.0 + STTHESATL * iLE) * (1.0 + STTHESATW * iWE) * (1.0 + STTHESATLW * iLE * iWE); - THESATB = THESATBO; - THESATG = THESATGO; + // Velocity saturation + THESAT = (THESATO + THESATL* GWE / GPE * pow(iLE, THESATLEXP)) * (1.0 + THESATW * iWE) * (1.0 + THESATLW * iLE * iWE); + STTHESAT = STTHESATO * (1.0 + STTHESATL * iLE) * (1.0 + STTHESATW * iWE) * (1.0 + STTHESATLW * iLE * iWE); + THESATB = THESATBO; + THESATG = THESATGO; - // Saturation voltage - AX = AXO / (1.0 + AXL_i * iLE); + // Saturation voltage + AX = AXO / (1.0 + AXL_i * iLE); - // Channel length modulation - ALP = ALPL * pow(iLE, ALPLEXP) * (1.0 + ALPW * iWE); - tmpx = pow(iLE, ALP1LEXP); - ALP1 = ALP1L1 * tmpx * (1.0 + ALP1W * iWE) / (1.0 + ALP1L2_i * iLE * tmpx); - tmpx = pow(iLE, ALP2LEXP); - ALP2 = ALP2L1 * tmpx * (1.0 + ALP2W * iWE) / (1.0 + ALP2L2_i * iLE * tmpx); - VP = VPO; - - // Impact ionization - A1 = A1O * (1.0 + A1L * iLE) * (1.0 + A1W * iWE); - A2 = A2O; - STA2 = STA2O; - A3 = A3O * (1.0 + A3L * iLE) * (1.0 + A3W * iWE); - A4 = A4O * (1.0 + A4L * iLE) * (1.0 + A4W * iWE); - - // Gate current - GCO = GCOO; - IGINV = IGINVLW / (iWE * iLE); - IGOV = IGOVW * LOV_i / (LEN * iWE); - STIG = STIGO; - GC2 = GC2O; - GC3 = GC3O; - CHIB = CHIBO; - - // GIDL - AGIDL = AGIDLW * LOV_i / (LEN * iWE); - BGIDL = BGIDLO; - STBGIDL = STBGIDLO; - CGIDL = CGIDLO; - - // Charge model parameters - COX = `EPSOX * WEcv * LEcv / TOX_i; - CGOV = `EPSOX * WEcv * LOV_i / TOXOV_i; - CGBOV = CGBOVL * Lcv / LEN; - CFR = CFRW * Wcv / WEN; - FNT = FNTO; - - // Noise model parameters - NFA = iWE * iLE * NFALW; - NFB = iWE * iLE * NFBLW; - NFC = iWE * iLE * NFCLW; + // Channel length modulation + ALP = ALPL * pow(iLE, ALPLEXP) * (1.0 + ALPW * iWE); + tmpx = pow(iLE, ALP1LEXP); + ALP1 = ALP1L1 * tmpx * (1.0 + ALP1W * iWE) / (1.0 + ALP1L2_i * iLE * tmpx); + tmpx = pow(iLE, ALP2LEXP); + ALP2 = ALP2L1 * tmpx * (1.0 + ALP2W * iWE) / (1.0 + ALP2L2_i * iLE * tmpx); + VP = VPO; + + // Impact ionization + A1 = A1O * (1.0 + A1L * iLE) * (1.0 + A1W * iWE); + A2 = A2O; + STA2 = STA2O; + A3 = A3O * (1.0 + A3L * iLE) * (1.0 + A3W * iWE); + A4 = A4O * (1.0 + A4L * iLE) * (1.0 + A4W * iWE); + + // Gate current + GCO = GCOO; + IGINV = IGINVLW / (iWE * iLE); + IGOV = IGOVW * LOV_i / (LEN * iWE); + STIG = STIGO; + GC2 = GC2O; + GC3 = GC3O; + CHIB = CHIBO; + + // GIDL + AGIDL = AGIDLW * LOV_i / (LEN * iWE); + BGIDL = BGIDLO; + STBGIDL = STBGIDLO; + CGIDL = CGIDLO; + + // Charge model parameters + COX = `EPSOX * WEcv * LEcv / TOX_i; + CGOV = `EPSOX * WEcv * LOV_i / TOXOV_i; + CGBOV = CGBOVL * Lcv / LEN; + CFR = CFRW * Wcv / WEN; + FNT = FNTO; + + // Noise model parameters + NFA = iWE * iLE * NFALW; + NFB = iWE * iLE * NFBLW; + NFC = iWE * iLE * NFCLW; `endif // Binning `ifdef NQSmodel - MUNQS = MUNQSO; - RG = RGO; - RWELL = RWELLO; - RBULK = RBULKO; - RJUNS = RJUNSO; - RJUND = RJUNDO; + MUNQS = MUNQSO; + RG = RGO; + RWELL = RWELLO; + RBULK = RBULKO; + RJUNS = RJUNSO; + RJUND = RJUNDO; `endif // NQSModel /////////////////////////////////////////// @@ -1039,184 +1039,184 @@ /////////////////////////////////////////// `endif // LocalModel - // 4.1 Internal parameters (including temperature scaling) - - // Clipping of the local model parameters - VFB_i = VFB; - STVFB_i = STVFB; - TOX_i = `CLIP_LOW(TOX, 1e-10); - NEFF_i = `CLIP_BOTH(NEFF, 1e20, 1e26); - VNSUB_i = VNSUB; - NSLP_i = `CLIP_LOW(NSLP, 1e-3); - DNSUB_i = `CLIP_BOTH(DNSUB, 0.0, 1.0); - DPHIB_i = DPHIB; - NP_i = `CLIP_LOW(NP, 0.0); - QMC_i = `CLIP_LOW(QMC, 0.0); - CT_i = `CLIP_LOW(CT, 0.0); - TOXOV_i = `CLIP_LOW(TOXOV, 1e-10); - NOV_i = `CLIP_BOTH(NOV, 1e20, 1e27); - CF_i = `CLIP_LOW(CF, 0.0); - CFB_i = `CLIP_BOTH(CFB, 0.0, 1.0); - BET_i = `CLIP_LOW(BETN, 0.0); - STBET_i = STBET; - MUE_i = `CLIP_LOW(MUE, 0.0); - STMUE_i = STMUE; - THEMU_i = `CLIP_LOW(THEMU, 0.0); - STTHEMU_i = STTHEMU; - CS_i = `CLIP_LOW(CS, 0.0); - STCS_i = STCS; - XCOR_i = `CLIP_LOW(XCOR, 0.0); - STXCOR_i = STXCOR; - FETA_i = `CLIP_LOW(FETA, 0.0); - RS_i = `CLIP_LOW(RS, 0.0); - STRS_i = STRS; - RSB_i = `CLIP_BOTH(RSB, -0.5, 1.0); - RSG_i = `CLIP_LOW(RSG, -0.5); - THESAT_i = `CLIP_LOW(THESAT, 0.0); - STTHESAT_i = STTHESAT; - THESATB_i = `CLIP_BOTH(THESATB, -0.5, 1.0); - THESATG_i = `CLIP_LOW(THESATG, -0.5); - AX_i = `CLIP_LOW(AX, 2.0); - ALP_i = `CLIP_LOW(ALP, 0.0); - ALP1_i = `CLIP_LOW(ALP1, 0.0); - ALP2_i = `CLIP_LOW(ALP2, 0.0); - VP_i = `CLIP_LOW(VP, 1.0e-10); - A1_i = `CLIP_LOW(A1, 0.0); - A2_i = `CLIP_LOW(A2, 0.0); - STA2_i = STA2; - A3_i = `CLIP_LOW(A3, 0.0); - A4_i = `CLIP_LOW(A4, 0.0); - GCO_i = `CLIP_BOTH(GCO, -10.0, 10.0); - IGINV_i = `CLIP_LOW(IGINV, 0.0); - IGOV_i = `CLIP_LOW(IGOV, 0.0); - STIG_i = STIG; - GC2_i = `CLIP_BOTH(GC2, 0.0, 10.0); - GC3_i = `CLIP_BOTH(GC3, -10.0, 10.0); - CHIB_i = `CLIP_LOW(CHIB, 1.0); - AGIDL_i = `CLIP_LOW(AGIDL, 0.0); - BGIDL_i = `CLIP_LOW(BGIDL, 0.0); - STBGIDL_i = STBGIDL; - CGIDL_i = CGIDL; - COX_i = `CLIP_LOW(COX, 0.0); - CGOV_i = `CLIP_LOW(CGOV, 0.0); - CGBOV_i = `CLIP_LOW(CGBOV, 0.0); - CFR_i = `CLIP_LOW(CFR, 0.0); - FNT_i = `CLIP_LOW(FNT, 0.0); - NFA_i = `CLIP_LOW(NFA, 0.0); - NFB_i = `CLIP_LOW(NFB, 0.0); - NFC_i = `CLIP_LOW(NFC, 0.0); - MULT_i = `CLIP_LOW(MULT, 0.0); - - - // Local process parameters - phit1 = phit * (1.0 + CT_i * rTn); - inv_phit1 = 1.0 / phit1; - - VFB_i = VFB_i + STVFB_i * dT; - phib = Eg + DPHIB_i + 2.0 * phit * ln(NEFF_i * pow(phibFac, -0.75) * 4.0e-26); - phib = `MAX(phib, 5.0E-2); - CoxPrime = `EPSOX / TOX_i; - tox_sq = TOX_i * TOX_i; - G_0 = sqrt(2.0 * `QELE * NEFF_i * `EPSSI * inv_phit) / CoxPrime; - - // Poly-silicon depletion - kp = 0.0; - if (NP_i > 0.0) begin - arg2max = 8.0e7 / tox_sq; - np = `MAX(NP_i, arg2max); - np = `MAX(3.0e25, np); - kp = 2.0 * CoxPrime * CoxPrime * phit / (`QELE * np * `EPSSI); - end - - // QM corrections - qlim2 = 100.0 * phit * phit; - qq = 0.0; - if (QMC_i > 0.0) begin - qq = 0.4 * `QMN * QMC_i * pow(CoxPrime, `twoThirds); - if (CHNL_TYPE==`PMOS) begin - qq = `QMP / `QMN * qq; - end - qb0 = sqrt(phit * G_0 * G_0 * phib); - dphibq = 0.75 * qq * pow(qb0, `twoThirds); - phib = phib + dphibq; - G_0 = G_0 * (1.0 + 2.0 * `twoThirds * dphibq / qb0); + // 4.1 Internal parameters (including temperature scaling) + + // Clipping of the local model parameters + VFB_i = VFB; + STVFB_i = STVFB; + TOX_i = `CLIP_LOW(TOX, 1e-10); + NEFF_i = `CLIP_BOTH(NEFF, 1e20, 1e26); + VNSUB_i = VNSUB; + NSLP_i = `CLIP_LOW(NSLP, 1e-3); + DNSUB_i = `CLIP_BOTH(DNSUB, 0.0, 1.0); + DPHIB_i = DPHIB; + NP_i = `CLIP_LOW(NP, 0.0); + QMC_i = `CLIP_LOW(QMC, 0.0); + CT_i = `CLIP_LOW(CT, 0.0); + TOXOV_i = `CLIP_LOW(TOXOV, 1e-10); + NOV_i = `CLIP_BOTH(NOV, 1e20, 1e27); + CF_i = `CLIP_LOW(CF, 0.0); + CFB_i = `CLIP_BOTH(CFB, 0.0, 1.0); + BET_i = `CLIP_LOW(BETN, 0.0); + STBET_i = STBET; + MUE_i = `CLIP_LOW(MUE, 0.0); + STMUE_i = STMUE; + THEMU_i = `CLIP_LOW(THEMU, 0.0); + STTHEMU_i = STTHEMU; + CS_i = `CLIP_LOW(CS, 0.0); + STCS_i = STCS; + XCOR_i = `CLIP_LOW(XCOR, 0.0); + STXCOR_i = STXCOR; + FETA_i = `CLIP_LOW(FETA, 0.0); + RS_i = `CLIP_LOW(RS, 0.0); + STRS_i = STRS; + RSB_i = `CLIP_BOTH(RSB, -0.5, 1.0); + RSG_i = `CLIP_LOW(RSG, -0.5); + THESAT_i = `CLIP_LOW(THESAT, 0.0); + STTHESAT_i = STTHESAT; + THESATB_i = `CLIP_BOTH(THESATB, -0.5, 1.0); + THESATG_i = `CLIP_LOW(THESATG, -0.5); + AX_i = `CLIP_LOW(AX, 2.0); + ALP_i = `CLIP_LOW(ALP, 0.0); + ALP1_i = `CLIP_LOW(ALP1, 0.0); + ALP2_i = `CLIP_LOW(ALP2, 0.0); + VP_i = `CLIP_LOW(VP, 1.0e-10); + A1_i = `CLIP_LOW(A1, 0.0); + A2_i = `CLIP_LOW(A2, 0.0); + STA2_i = STA2; + A3_i = `CLIP_LOW(A3, 0.0); + A4_i = `CLIP_LOW(A4, 0.0); + GCO_i = `CLIP_BOTH(GCO, -10.0, 10.0); + IGINV_i = `CLIP_LOW(IGINV, 0.0); + IGOV_i = `CLIP_LOW(IGOV, 0.0); + STIG_i = STIG; + GC2_i = `CLIP_BOTH(GC2, 0.0, 10.0); + GC3_i = `CLIP_BOTH(GC3, -10.0, 10.0); + CHIB_i = `CLIP_LOW(CHIB, 1.0); + AGIDL_i = `CLIP_LOW(AGIDL, 0.0); + BGIDL_i = `CLIP_LOW(BGIDL, 0.0); + STBGIDL_i = STBGIDL; + CGIDL_i = CGIDL; + COX_i = `CLIP_LOW(COX, 0.0); + CGOV_i = `CLIP_LOW(CGOV, 0.0); + CGBOV_i = `CLIP_LOW(CGBOV, 0.0); + CFR_i = `CLIP_LOW(CFR, 0.0); + FNT_i = `CLIP_LOW(FNT, 0.0); + NFA_i = `CLIP_LOW(NFA, 0.0); + NFB_i = `CLIP_LOW(NFB, 0.0); + NFC_i = `CLIP_LOW(NFC, 0.0); + MULT_i = `CLIP_LOW(MULT, 0.0); + + + // Local process parameters + phit1 = phit * (1.0 + CT_i * rTn); + inv_phit1 = 1.0 / phit1; + + VFB_i = VFB_i + STVFB_i * dT; + phib = Eg + DPHIB_i + 2.0 * phit * ln(NEFF_i * pow(phibFac, -0.75) * 4.0e-26); + phib = `MAX(phib, 5.0E-2); + CoxPrime = `EPSOX / TOX_i; + tox_sq = TOX_i * TOX_i; + G_0 = sqrt(2.0 * `QELE * NEFF_i * `EPSSI * inv_phit) / CoxPrime; + + // Poly-silicon depletion + kp = 0.0; + if (NP_i > 0.0) begin + arg2max = 8.0e7 / tox_sq; + np = `MAX(NP_i, arg2max); + np = `MAX(3.0e25, np); + kp = 2.0 * CoxPrime * CoxPrime * phit / (`QELE * np * `EPSSI); + end + + // QM corrections + qlim2 = 100.0 * phit * phit; + qq = 0.0; + if (QMC_i > 0.0) begin + qq = 0.4 * `QMN * QMC_i * pow(CoxPrime, `twoThirds); + if (CHNL_TYPE==`PMOS) begin + qq = `QMP / `QMN * qq; end - sqrt_phib = sqrt(phib); - phix = 0.95 * phib; - aphi = 0.0025 * phib * phib; - bphi = aphi; - phix2 = 0.5 * sqrt(bphi); - phix1 = `MINA(phix - phix2, 0, aphi); - - // Gate overlap - CoxovPrime = `EPSOX / TOXOV_i; - GOV = sqrt(2.0 * `QELE * NOV_i * `EPSSI * inv_phit) / CoxovPrime; - GOV2 = GOV * GOV; - xi_ov = 1.0 + GOV * `invSqrt2; - inv_xi_ov = 1.0 / xi_ov; - x_mrg_ov = 1.0e-5 * xi_ov; - - // Mobility parameters - tf_bet = pow(rTn, STBET_i); - BET_i = BET_i * CoxPrime * tf_bet; - THEMU_i = THEMU_i * pow(rTn, STTHEMU_i); - tf_mue = pow(rTn, STMUE_i); - MUE_i = MUE_i * tf_mue; - tf_cs = pow(rTn, STCS_i); - CS_i = CS_i * tf_cs; - tf_xcor = pow(rTn, STXCOR_i); - XCOR_i = XCOR_i * tf_xcor; - E_eff0 = 1.0e-8 * CoxPrime / `EPSSI; - eta_mu = 0.5 * FETA_i; - if (CHNL_TYPE == `PMOS) begin - eta_mu = `oneThird * FETA_i; - end - - // Series resistance - tf_ther = pow(rTn, STRS_i); - RS_i = RS_i * tf_ther; - THER_i = 2 * BET_i * RS_i; - - // Velocity saturation - tf_thesat = pow(rTn, STTHESAT_i); - THESAT_i = THESAT_i * tf_thesat; - Vdsat_lim = 3.912023005 * phit1; - - inv_AX = 1.0 / AX_i; - inv_VP = 1.0 / VP_i; - - // Impact ionization - A2_i = A2_i * pow(rT, STA2_i); - - // Gate current - tf_ig = pow(rT, STIG_i); - IGINV_i = IGINV_i * tf_ig; - IGOV_i = IGOV_i * tf_ig; - inv_CHIB = 1.0 / CHIB_i; - tempM = 4.0 * `oneThird * sqrt(2 * `QELE * `MELE * CHIB_i) / `HBAR; - BCH = tempM * TOX_i; - BOV = tempM * TOXOV_i; - GCQ = 0; - if (GC3_i < 0) begin - GCQ = -0.495 * GC2_i / GC3_i; - end - alpha_b = 0.5 * (phib + Eg); - Dch = GCO_i * phit1; - Dov = GCO_i * phit; - - // GIDL - AGIDL_i = AGIDL_i * 4e-18 / (TOXOV_i * TOXOV_i); - tempM = `MAX(1.0 + STBGIDL_i * dT, 0); - BGIDL_i = BGIDL_i * tempM * TOXOV_i * 5e8; - - // Noise - nt = FNT_i * 4 * `KBOL * TKD; - Cox_over_q = CoxPrime / `QELE; - Sfl_prefac = phit * phit * BET_i / Cox_over_q; - - // Additional internal parameters - x1 = 1.25; - inv_xg1 = 1.0 / (x1 + GOV * 7.324648775608221e-1); // = 1.0/(x1+GOV*sqrt(exp(-x1)+x1-1)); + qb0 = sqrt(phit * G_0 * G_0 * phib); + dphibq = 0.75 * qq * pow(qb0, `twoThirds); + phib = phib + dphibq; + G_0 = G_0 * (1.0 + 2.0 * `twoThirds * dphibq / qb0); + end + sqrt_phib = sqrt(phib); + phix = 0.95 * phib; + aphi = 0.0025 * phib * phib; + bphi = aphi; + phix2 = 0.5 * sqrt(bphi); + phix1 = `MINA(phix - phix2, 0, aphi); + + // Gate overlap + CoxovPrime = `EPSOX / TOXOV_i; + GOV = sqrt(2.0 * `QELE * NOV_i * `EPSSI * inv_phit) / CoxovPrime; + GOV2 = GOV * GOV; + xi_ov = 1.0 + GOV * `invSqrt2; + inv_xi_ov = 1.0 / xi_ov; + x_mrg_ov = 1.0e-5 * xi_ov; + + // Mobility parameters + tf_bet = pow(rTn, STBET_i); + BET_i = BET_i * CoxPrime * tf_bet; + THEMU_i = THEMU_i * pow(rTn, STTHEMU_i); + tf_mue = pow(rTn, STMUE_i); + MUE_i = MUE_i * tf_mue; + tf_cs = pow(rTn, STCS_i); + CS_i = CS_i * tf_cs; + tf_xcor = pow(rTn, STXCOR_i); + XCOR_i = XCOR_i * tf_xcor; + E_eff0 = 1.0e-8 * CoxPrime / `EPSSI; + eta_mu = 0.5 * FETA_i; + if (CHNL_TYPE == `PMOS) begin + eta_mu = `oneThird * FETA_i; + end + + // Series resistance + tf_ther = pow(rTn, STRS_i); + RS_i = RS_i * tf_ther; + THER_i = 2 * BET_i * RS_i; + + // Velocity saturation + tf_thesat = pow(rTn, STTHESAT_i); + THESAT_i = THESAT_i * tf_thesat; + Vdsat_lim = 3.912023005 * phit1; + + inv_AX = 1.0 / AX_i; + inv_VP = 1.0 / VP_i; + + // Impact ionization + A2_i = A2_i * pow(rT, STA2_i); + + // Gate current + tf_ig = pow(rT, STIG_i); + IGINV_i = IGINV_i * tf_ig; + IGOV_i = IGOV_i * tf_ig; + inv_CHIB = 1.0 / CHIB_i; + tempM = 4.0 * `oneThird * sqrt(2 * `QELE * `MELE * CHIB_i) / `HBAR; + BCH = tempM * TOX_i; + BOV = tempM * TOXOV_i; + GCQ = 0; + if (GC3_i < 0) begin + GCQ = -0.495 * GC2_i / GC3_i; + end + alpha_b = 0.5 * (phib + Eg); + Dch = GCO_i * phit1; + Dov = GCO_i * phit; + + // GIDL + AGIDL_i = AGIDL_i * 4e-18 / (TOXOV_i * TOXOV_i); + tempM = `MAX(1.0 + STBGIDL_i * dT, 0); + BGIDL_i = BGIDL_i * tempM * TOXOV_i * 5e8; + + // Noise + nt = FNT_i * 4 * `KBOL * TKD; + Cox_over_q = CoxPrime / `QELE; + Sfl_prefac = phit * phit * BET_i / Cox_over_q; + + // Additional internal parameters + x1 = 1.25; + inv_xg1 = 1.0 / (x1 + GOV * 7.324648775608221e-1); // = 1.0/(x1+GOV*sqrt(exp(-x1)+x1-1)); `ifdef NQSmodel // NQS parameters and variables @@ -1235,101 +1235,101 @@ gwell = MULT_i / RWELL_i; `endif // NQSmodel - // JUNCAP2 - vbimins = 0.0; - vfmins = 0.0; - vchs = 0.0; - vbbtlims = 0.0; - vbimind = 0.0; - vfmind = 0.0; - vchd = 0.0; - vbbtlimd = 0.0; - vj = 0.0; - idmult = 0.0; - vjsrh = 0.0; - zinv = 0.0; - wdep = 0.0; - wsrh = 0.0; - asrh = 0.0; - vav = 0.0; - vbi_minus_vjsrh = 0.0; - - if (SWJUNCAP == 0.0) begin - ABSOURCE_i = 0.0; - LSSOURCE_i = 0.0; - LGSOURCE_i = 0.0; - ABDRAIN_i = 0.0; - LSDRAIN_i = 0.0; - LGDRAIN_i = 0.0; - VMAXS = 0.0; - VMAXD = 0.0; + // JUNCAP2 + vbimins = 0.0; + vfmins = 0.0; + vchs = 0.0; + vbbtlims = 0.0; + vbimind = 0.0; + vfmind = 0.0; + vchd = 0.0; + vbbtlimd = 0.0; + vj = 0.0; + idmult = 0.0; + vjsrh = 0.0; + zinv = 0.0; + wdep = 0.0; + wsrh = 0.0; + asrh = 0.0; + vav = 0.0; + vbi_minus_vjsrh = 0.0; + + if (SWJUNCAP == 0.0) begin + ABSOURCE_i = 0.0; + LSSOURCE_i = 0.0; + LGSOURCE_i = 0.0; + ABDRAIN_i = 0.0; + LSDRAIN_i = 0.0; + LGDRAIN_i = 0.0; + VMAXS = 0.0; + VMAXD = 0.0; + end else begin + if (SWJUNCAP == 2.0) begin + ABSOURCE_i = `CLIP_LOW(AS, `AB_cliplow); + LSSOURCE_i = `CLIP_LOW(PS, `LS_cliplow); + LGSOURCE_i = juncapwidth; + ABDRAIN_i = `CLIP_LOW(AD, `AB_cliplow); + LSDRAIN_i = `CLIP_LOW(PD, `LS_cliplow); + LGDRAIN_i = juncapwidth; end else begin - if (SWJUNCAP == 2.0) begin + if (SWJUNCAP == 3.0) begin ABSOURCE_i = `CLIP_LOW(AS, `AB_cliplow); - LSSOURCE_i = `CLIP_LOW(PS, `LS_cliplow); - LGSOURCE_i = juncapwidth; ABDRAIN_i = `CLIP_LOW(AD, `AB_cliplow); - LSDRAIN_i = `CLIP_LOW(PD, `LS_cliplow); + LSSOURCE_i = `CLIP_LOW(PS - juncapwidth, `LS_cliplow); + LGSOURCE_i = juncapwidth; + LSDRAIN_i = `CLIP_LOW(PD - juncapwidth, `LS_cliplow); LGDRAIN_i = juncapwidth; end else begin - if (SWJUNCAP == 3.0) begin - ABSOURCE_i = `CLIP_LOW(AS, `AB_cliplow); - ABDRAIN_i = `CLIP_LOW(AD, `AB_cliplow); - LSSOURCE_i = `CLIP_LOW(PS - juncapwidth, `LS_cliplow); - LGSOURCE_i = juncapwidth; - LSDRAIN_i = `CLIP_LOW(PD - juncapwidth, `LS_cliplow); - LGDRAIN_i = juncapwidth; - end else begin - ABSOURCE_i = `CLIP_LOW(ABSOURCE, `AB_cliplow); - LSSOURCE_i = `CLIP_LOW(LSSOURCE, `LS_cliplow); - LGSOURCE_i = `CLIP_LOW(LGSOURCE, `LG_cliplow); - ABDRAIN_i = `CLIP_LOW(ABDRAIN, `AB_cliplow); - LSDRAIN_i = `CLIP_LOW(LSDRAIN, `LS_cliplow); - LGDRAIN_i = `CLIP_LOW(LGDRAIN, `LG_cliplow); - end + ABSOURCE_i = `CLIP_LOW(ABSOURCE, `AB_cliplow); + LSSOURCE_i = `CLIP_LOW(LSSOURCE, `LS_cliplow); + LGSOURCE_i = `CLIP_LOW(LGSOURCE, `LG_cliplow); + ABDRAIN_i = `CLIP_LOW(ABDRAIN, `AB_cliplow); + LSDRAIN_i = `CLIP_LOW(LSDRAIN, `LS_cliplow); + LGDRAIN_i = `CLIP_LOW(LGDRAIN, `LG_cliplow); end - `JuncapInitInstance(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, VMAXS, vbimins, vchs, vfmins, vbbtlims) - `JuncapInitInstance(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, VMAXD, vbimind, vchd, vfmind, vbbtlimd) end + `JuncapInitInstance(ABSOURCE_i, LSSOURCE_i, LGSOURCE_i, VMAXS, vbimins, vchs, vfmins, vbbtlims) + `JuncapInitInstance(ABDRAIN_i, LSDRAIN_i, LGDRAIN_i, VMAXD, vbimind, vchd, vfmind, vbbtlimd) + end - end // initial_instance + end // initial_instance - ///////////////////////////////////////////////////////////////////////////// - // - // DC bias dependent quantities (calculations for current contribs) - // - ///////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////// + // + // DC bias dependent quantities (calculations for current contribs) + // + ///////////////////////////////////////////////////////////////////////////// - begin : evaluateStatic - // Initialisation of some variables - SP_S_x1 = 0.0; - x_s = 0.0; - sqm = 0.0; - alpha = 0.0; - eta_p = 1.0; - xitsb = 0.0; - rhob = 0.0; - GdL = 1.0; - FdL = 1.0; - Gmob = 1.0; - Gmob_dL = 1.0; - Udse = 0.0; - QCLM = 0.0; - thesat1 = 0.0; - Gvsat = 1.0; - Gvsatinv = 1.0; - xgm = 0.0; - dps = 0.0; - qim = 0.0; - qim1 = 0.0; - H = 1.0; - xs_ov = 0.0; - xd_ov = 0.0; - Vovs = 0.0; - Vovd = 0.0; - Iimpact = 0.0; - mavl = 0.0; + begin : evaluateStatic + // Initialisation of some variables + SP_S_x1 = 0.0; + x_s = 0.0; + sqm = 0.0; + alpha = 0.0; + eta_p = 1.0; + xitsb = 0.0; + rhob = 0.0; + GdL = 1.0; + FdL = 1.0; + Gmob = 1.0; + Gmob_dL = 1.0; + Udse = 0.0; + QCLM = 0.0; + thesat1 = 0.0; + Gvsat = 1.0; + Gvsatinv = 1.0; + xgm = 0.0; + dps = 0.0; + qim = 0.0; + qim1 = 0.0; + H = 1.0; + xs_ov = 0.0; + xd_ov = 0.0; + Vovs = 0.0; + Vovd = 0.0; + Iimpact = 0.0; + mavl = 0.0; `ifdef NQSmodel // Initialization of variables for NQS model @@ -1342,524 +1342,524 @@ Vrbulk = V(BP,BI); Vrwell = V(B ,BI); `endif // NQSmodel - if (CHNL_TYPE == `NMOS) begin - Vgs = V(`Gint, S); - Vds = V(D, S); - Vsb = V(S, `Bint); - Vjuns = -V(S, `Bjs); - Vjund = -V(D, `Bjd); - end else begin - Vgs = -V(`Gint, S); - Vds = -V(D, S); - Vsb = -V(S, `Bint); - Vjuns = V(S, `Bjs); - Vjund = V(D, `Bjd); - end + if (CHNL_TYPE == `NMOS) begin + Vgs = V(`Gint, S); + Vds = V(D, S); + Vsb = V(S, `Bint); + Vjuns = -V(S, `Bjs); + Vjund = -V(D, `Bjd); + end else begin + Vgs = -V(`Gint, S); + Vds = -V(D, S); + Vsb = -V(S, `Bint); + Vjuns = V(S, `Bjs); + Vjund = V(D, `Bjd); + end + + // Source-drain interchange + sigVds = 1.0; + if (Vds < 0.0) begin + sigVds = -1.0; + Vgs = Vgs - Vds; + Vsb = Vsb + Vds; + Vds = -Vds; + end + + Vgd = Vgs - Vds; + Vdb = Vds + Vsb; + Vgb = Vgs + Vsb; + + xgs_ov = -Vgs * inv_phit; + xgd_ov = -Vgd * inv_phit; + + // 4.2.1 Conditioning of terminal voltages + temp = `MINA(Vdb, Vsb, bphi) + phix; + Vsbstar = Vsb - `MINA(temp, 0, aphi) + phix1; + Vdbstar = Vds + Vsbstar; + Vgbstar = Vgs + Vsbstar; + Vgb1 = Vgbstar - VFB_i; + Vdsx = sqrt(Vds * Vds + 0.01) - 0.1; + Vsbx = Vsbstar + 0.5 * (Vds - Vdsx); + delVg = CF_i * (Vdsx * (1 + CFB_i * Vsbx)); // DIBL + Vgb1 = Vgb1 + delVg; + xg = Vgb1 * inv_phit1; + + // 4.2.2 Bias dependent body factor + if (DNSUB_i > 0.0) begin + Dnsub = DNSUB_i * `MAXA(0, Vgs + Vsb - VNSUB_i, NSLP_i); + Gf = G_0 * sqrt(1.0 + Dnsub); + end else begin + Gf = G_0; + end + + // 4.2.3 Surface potential at source side + Gf2 = Gf * Gf; + inv_Gf2 = 1.0 / Gf2; + xi = 1.0 + Gf * `invSqrt2; + inv_xi = 1.0 / xi; + Ux = Vsbstar * inv_phit1; + xn_s = phib * inv_phit1 + Ux; + if (xn_s < `se) + delta_ns = exp(-xn_s); + else + delta_ns = `ke / `P3(xn_s - `se); + margin = 1e-5 * xi; + + `sp_s(x_s, xg, xn_s, delta_ns) + x_d = x_s; + x_m = x_s; + x_ds = 0.0; - // Source-drain interchange - sigVds = 1.0; - if (Vds < 0.0) begin - sigVds = -1.0; - Vgs = Vgs - Vds; - Vsb = Vsb + Vds; - Vds = -Vds; + // + // Core PSP current calculation + // + if (xg <= 0.0) begin + qis = 0.0; + Ids = 0.0; + xgm = xg - x_s; + Voxm = xgm * phit1; + qeff = Voxm; + Vdsat = Vdsat_lim; + end else begin // (xg > 0) + delta_1s = 0.0; + temp = 1.0 / (2.0 + x_s * x_s); + xi0s = x_s * x_s * temp; + xi1s = 4.0 * (x_s * temp * temp); + xi2s = (8.0 * temp - 12.0 * xi0s) * temp * temp; + if (x_s < `se05) begin + delta_1s = exp(x_s); + Es = 1.0 / delta_1s; + delta_1s = delta_ns * delta_1s; + end else if (x_s > (xn_s - `se05)) begin + delta_1s = exp(x_s - xn_s); + Es = delta_ns / delta_1s; + end else begin + delta_1s = `ke05 / `P3(xn_s - x_s - `se05); + Es = `ke05 / `P3(x_s - `se05); end - - Vgd = Vgs - Vds; - Vdb = Vds + Vsb; - Vgb = Vgs + Vsb; - - xgs_ov = -Vgs * inv_phit; - xgd_ov = -Vgd * inv_phit; - - // 4.2.1 Conditioning of terminal voltages - temp = `MINA(Vdb, Vsb, bphi) + phix; - Vsbstar = Vsb - `MINA(temp, 0, aphi) + phix1; - Vdbstar = Vds + Vsbstar; - Vgbstar = Vgs + Vsbstar; - Vgb1 = Vgbstar - VFB_i; - Vdsx = sqrt(Vds * Vds + 0.01) - 0.1; - Vsbx = Vsbstar + 0.5 * (Vds - Vdsx); - delVg = CF_i * (Vdsx * (1 + CFB_i * Vsbx)); // DIBL - Vgb1 = Vgb1 + delVg; - xg = Vgb1 * inv_phit1; - - // 4.2.2 Bias dependent body factor - if (DNSUB_i > 0.0) begin - Dnsub = DNSUB_i * `MAXA(0, Vgs + Vsb - VNSUB_i, NSLP_i); - Gf = G_0 * sqrt(1.0 + Dnsub); + Ds = delta_1s - delta_ns * (x_s + 1.0 + xi0s); + if (x_s < 1.0e-5) begin + Ps = 0.5 * (x_s * x_s * (1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s)))); + Ds = `oneSixth * (delta_ns * x_s * x_s * x_s * (1.0 + 1.75 * x_s)); + temp = sqrt(1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s))); + sqm = `invSqrt2 * (x_s * temp); + alpha = 1.0 + Gf * `invSqrt2 * (1.0 - 0.5 * x_s + `oneSixth * (x_s * x_s)) / temp; end else begin - Gf = G_0; + Ps = x_s - 1.0 + Es; + sqm = sqrt(Ps); + alpha = 1.0 + 0.5 * (Gf * (1.0 - Es) / sqm); end - - // 4.2.3 Surface potential at source side - Gf2 = Gf * Gf; - inv_Gf2 = 1.0 / Gf2; - xi = 1.0 + Gf * `invSqrt2; - inv_xi = 1.0 / xi; - Ux = Vsbstar * inv_phit1; - xn_s = phib * inv_phit1 + Ux; - if (xn_s < `se) - delta_ns = exp(-xn_s); - else - delta_ns = `ke / `P3(xn_s - `se); - margin = 1e-5 * xi; - - `sp_s(x_s, xg, xn_s, delta_ns) - x_d = x_s; - x_m = x_s; - x_ds = 0.0; - - // - // Core PSP current calculation - // - if (xg <= 0.0) begin - qis = 0.0; - Ids = 0.0; - xgm = xg - x_s; - Voxm = xgm * phit1; - qeff = Voxm; - Vdsat = Vdsat_lim; - end else begin // (xg > 0) - delta_1s = 0.0; - temp = 1.0 / (2.0 + x_s * x_s); - xi0s = x_s * x_s * temp; - xi1s = 4.0 * (x_s * temp * temp); - xi2s = (8.0 * temp - 12.0 * xi0s) * temp * temp; - if (x_s < `se05) begin - delta_1s = exp(x_s); - Es = 1.0 / delta_1s; - delta_1s = delta_ns * delta_1s; - end else if (x_s > (xn_s - `se05)) begin - delta_1s = exp(x_s - xn_s); - Es = delta_ns / delta_1s; + Em = Es; + Ed = Em; + Dm = Ds; + Dd = Dm; + + // 4.2.4 Drain saturation voltage + Rxcor = (1.0 + 0.2 * XCOR_i * Vsbx) / (1.0 + XCOR_i * Vsbx); + if ( Ds > `ke05) begin + xgs = Gf * sqrt(Ps + Ds); + qis = Gf2 * Ds * phit1 / (xgs + Gf * sqm); + qbs = sqm * Gf * phit1; + if (RSB_i < 0) begin + rhob = 1.0 / (1.0 - RSB_i * Vsbx); end else begin - delta_1s = `ke05 / `P3(xn_s - x_s - `se05); - Es = `ke05 / `P3(x_s - `se05); + rhob = 1.0 + RSB_i * Vsbx; end - Ds = delta_1s - delta_ns * (x_s + 1.0 + xi0s); - if (x_s < 1.0e-5) begin - Ps = 0.5 * (x_s * x_s * (1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s)))); - Ds = `oneSixth * (delta_ns * x_s * x_s * x_s * (1.0 + 1.75 * x_s)); - temp = sqrt(1.0 - `oneThird * (x_s * (1.0 - 0.25 * x_s))); - sqm = `invSqrt2 * (x_s * temp); - alpha = 1.0 + Gf * `invSqrt2 * (1.0 - 0.5 * x_s + `oneSixth * (x_s * x_s)) / temp; + if (RSG_i < 0) begin + temp = 1.0 - RSG_i * qis; end else begin - Ps = x_s - 1.0 + Es; - sqm = sqrt(Ps); - alpha = 1.0 + 0.5 * (Gf * (1.0 - Es) / sqm); + temp = 1.0 / (1.0 + RSG_i * qis); end - Em = Es; - Ed = Em; - Dm = Ds; - Dd = Dm; - - // 4.2.4 Drain saturation voltage - Rxcor = (1.0 + 0.2 * XCOR_i * Vsbx) / (1.0 + XCOR_i * Vsbx); - if ( Ds > `ke05) begin - xgs = Gf * sqrt(Ps + Ds); - qis = Gf2 * Ds * phit1 / (xgs + Gf * sqm); - qbs = sqm * Gf * phit1; - if (RSB_i < 0) begin - rhob = 1.0 / (1.0 - RSB_i * Vsbx); - end else begin - rhob = 1.0 + RSB_i * Vsbx; - end - if (RSG_i < 0) begin - temp = 1.0 - RSG_i * qis; - end else begin - temp = 1.0 / (1.0 + RSG_i * qis); - end - GR = THER_i * (rhob * temp * qis); - Eeffm = E_eff0 * (qbs + eta_mu * qis); - Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * (Ps / (Ps + Ds + 1.0e-14)); - Gmob = (1.0 + Mutmp + GR) * Rxcor; - if (THESATB_i < 0) begin - xitsb = 1.0 / (1.0 - THESATB_i * Vsbx); - end else begin - xitsb = 1.0 + THESATB_i * Vsbx; - end - temp2 = qis * xitsb; - wsat = 100.0 * (temp2 / (100.0 + temp2)); - if (THESATG_i < 0) begin - temp = 1 / (1 - THESATG_i * wsat); - end else begin - temp = 1 + THESATG_i * wsat; - end - thesat1 = THESAT_i * (temp / Gmob); - phi_inf = qis / alpha + phit1; - ysat = thesat1 * phi_inf * `invSqrt2; - if (CHNL_TYPE==`PMOS) begin - ysat = ysat / sqrt(1.0 + ysat); - end - za = 2.0 / (1.0 + sqrt(1.0 + 4.0 * ysat)); - temp1 = za * ysat; - Phi_0 = phi_inf * za * (1.0 + 0.86 * (temp1 * (1.0 - temp1 * za) / (1.0 + 4.0 * (temp1 * temp1 * za)))); - asat = xgs + 0.5 * Gf2; - Phi_2 = 0.98 * (Gf2 * Ds * phit1 / (asat + sqrt(asat * asat - Gf2 * Ds * 0.98))); - Phi_0_2 = Phi_0 + Phi_2; - Phi0_Phi2 = 2.0 * (Phi_0 * Phi_2); - Phi_sat = Phi0_Phi2 / (Phi_0_2 + sqrt(Phi_0_2 * Phi_0_2 - 1.98 * Phi0_Phi2)); - Vdsat = Phi_sat - phit1 * ln(1.0 + Phi_sat * (Phi_sat - 2.0 * asat * phit1) * inv_Gf2 / (phit1 * phit1 * Ds)); + GR = THER_i * (rhob * temp * qis); + Eeffm = E_eff0 * (qbs + eta_mu * qis); + Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * (Ps / (Ps + Ds + 1.0e-14)); + Gmob = (1.0 + Mutmp + GR) * Rxcor; + if (THESATB_i < 0) begin + xitsb = 1.0 / (1.0 - THESATB_i * Vsbx); end else begin - Vdsat = Vdsat_lim; + xitsb = 1.0 + THESATB_i * Vsbx; end - temp = pow(Vds / Vdsat, AX_i); - Vdse = Vds * pow(1.0 + temp, -inv_AX); - - // 4.2.5 Surface potential at drain side - Udse = Vdse * inv_phit1; - xn_d = xn_s + Udse; - if (Udse < `se) begin - k_ds = exp(-Udse); + temp2 = qis * xitsb; + wsat = 100.0 * (temp2 / (100.0 + temp2)); + if (THESATG_i < 0) begin + temp = 1 / (1 - THESATG_i * wsat); end else begin - k_ds = `ke / `P3(Udse - `se); + temp = 1 + THESATG_i * wsat; end - delta_nd = delta_ns * k_ds; - - `sp_s_d(x_d, xg, xn_d, delta_nd) - x_ds = x_d - x_s; - - // - // Approximations for extremely small x_ds: capacitance calulation - // - if (x_ds < 1.0E-10) begin - pC = 2.0 * (xg - x_s) + Gf2 * (1.0 - Es + delta_1s * k_ds - delta_nd * (1.0 + xi1s)); - qC = Gf2 * (1.0 - k_ds) * Ds; - temp = 2.0 - Gf2 * (Es + delta_1s * k_ds - delta_nd * xi2s); - temp = pC * pC - 2.0 * (temp * qC); - x_ds = 2.0 * (qC / (pC + sqrt(temp))); - x_d = x_s + x_ds; + thesat1 = THESAT_i * (temp / Gmob); + phi_inf = qis / alpha + phit1; + ysat = thesat1 * phi_inf * `invSqrt2; + if (CHNL_TYPE==`PMOS) begin + ysat = ysat / sqrt(1.0 + ysat); end - dps = x_ds * phit1; // deltaPsi + za = 2.0 / (1.0 + sqrt(1.0 + 4.0 * ysat)); + temp1 = za * ysat; + Phi_0 = phi_inf * za * (1.0 + 0.86 * (temp1 * (1.0 - temp1 * za) / (1.0 + 4.0 * (temp1 * temp1 * za)))); + asat = xgs + 0.5 * Gf2; + Phi_2 = 0.98 * (Gf2 * Ds * phit1 / (asat + sqrt(asat * asat - Gf2 * Ds * 0.98))); + Phi_0_2 = Phi_0 + Phi_2; + Phi0_Phi2 = 2.0 * (Phi_0 * Phi_2); + Phi_sat = Phi0_Phi2 / (Phi_0_2 + sqrt(Phi_0_2 * Phi_0_2 - 1.98 * Phi0_Phi2)); + Vdsat = Phi_sat - phit1 * ln(1.0 + Phi_sat * (Phi_sat - 2.0 * asat * phit1) * inv_Gf2 / (phit1 * phit1 * Ds)); + end else begin + Vdsat = Vdsat_lim; + end + temp = pow(Vds / Vdsat, AX_i); + Vdse = Vds * pow(1.0 + temp, -inv_AX); + + // 4.2.5 Surface potential at drain side + Udse = Vdse * inv_phit1; + xn_d = xn_s + Udse; + if (Udse < `se) begin + k_ds = exp(-Udse); + end else begin + k_ds = `ke / `P3(Udse - `se); + end + delta_nd = delta_ns * k_ds; - xi0d = x_d * x_d / (2.0 + x_d * x_d); - if (x_d < `se05) begin - Ed = exp(-x_d); - if (x_d < 1.0e-5) begin - Dd = `oneSixth * delta_nd * x_d * x_d * x_d * (1.0 + 1.75 * x_d); - end else begin - Dd = delta_nd * (1.0 / Ed - x_d - 1.0 - xi0d); - end + `sp_s_d(x_d, xg, xn_d, delta_nd) + x_ds = x_d - x_s; + + // + // Approximations for extremely small x_ds: capacitance calulation + // + if (x_ds < 1.0E-10) begin + pC = 2.0 * (xg - x_s) + Gf2 * (1.0 - Es + delta_1s * k_ds - delta_nd * (1.0 + xi1s)); + qC = Gf2 * (1.0 - k_ds) * Ds; + temp = 2.0 - Gf2 * (Es + delta_1s * k_ds - delta_nd * xi2s); + temp = pC * pC - 2.0 * (temp * qC); + x_ds = 2.0 * (qC / (pC + sqrt(temp))); + x_d = x_s + x_ds; + end + dps = x_ds * phit1; // deltaPsi + + xi0d = x_d * x_d / (2.0 + x_d * x_d); + if (x_d < `se05) begin + Ed = exp(-x_d); + if (x_d < 1.0e-5) begin + Dd = `oneSixth * delta_nd * x_d * x_d * x_d * (1.0 + 1.75 * x_d); end else begin - if (x_d > (xn_d - `se05)) begin - temp = exp(x_d - xn_d); - Ed = delta_nd / temp; - Dd = temp - delta_nd * (x_d + 1.0 + xi0d); - end else begin - Ed = `ke05 / `P3(x_d - `se05); - temp = `ke05 / `P3(xn_d - x_d - `se05); - Dd = temp - delta_nd * (x_d + 1.0 + xi0d); - end + Dd = delta_nd * (1.0 / Ed - x_d - 1.0 - xi0d); end - - // 4.2.6 Mid-point surface potential - x_m = 0.5 * (x_s + x_d); - Em = 0.0; - temp = Ed * Es; - if (temp > 0.0) begin - Em = sqrt(temp); + end else begin + if (x_d > (xn_d - `se05)) begin + temp = exp(x_d - xn_d); + Ed = delta_nd / temp; + Dd = temp - delta_nd * (x_d + 1.0 + xi0d); + end else begin + Ed = `ke05 / `P3(x_d - `se05); + temp = `ke05 / `P3(xn_d - x_d - `se05); + Dd = temp - delta_nd * (x_d + 1.0 + xi0d); end - D_bar = 0.5 * (Ds + Dd); - Dm = D_bar + 0.125 * (x_ds * x_ds * (Em - 2.0 * inv_Gf2)); - - if (x_m < 1.0e-5) begin - Pm = 0.5 * (x_m * x_m * (1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m)))); - xgm = Gf * sqrt(Dm + Pm); + end - // 4.2.7 Polysilicon depletion - if (kp > 0.0) begin - eta_p = 1.0 / sqrt(1.0 + kp * xgm); - end // (kp > 0.0) - temp = sqrt(1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m))); - sqm = `invSqrt2 * (x_m * temp); - alpha = eta_p + `invSqrt2 * (Gf * (1.0 - 0.5 * x_m + `oneSixth * (x_m * x_m)) / temp); - end else begin + // 4.2.6 Mid-point surface potential + x_m = 0.5 * (x_s + x_d); + Em = 0.0; + temp = Ed * Es; + if (temp > 0.0) begin + Em = sqrt(temp); + end + D_bar = 0.5 * (Ds + Dd); + Dm = D_bar + 0.125 * (x_ds * x_ds * (Em - 2.0 * inv_Gf2)); + + if (x_m < 1.0e-5) begin + Pm = 0.5 * (x_m * x_m * (1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m)))); + xgm = Gf * sqrt(Dm + Pm); + + // 4.2.7 Polysilicon depletion + if (kp > 0.0) begin + eta_p = 1.0 / sqrt(1.0 + kp * xgm); + end // (kp > 0.0) + temp = sqrt(1.0 - `oneThird * (x_m * (1.0 - 0.25 * x_m))); + sqm = `invSqrt2 * (x_m * temp); + alpha = eta_p + `invSqrt2 * (Gf * (1.0 - 0.5 * x_m + `oneSixth * (x_m * x_m)) / temp); + end else begin + Pm = x_m - 1.0 + Em; + xgm = Gf * sqrt(Dm + Pm); + + // 4.2.7 Polysilicon depletion + if (kp > 0.0) begin + d0 = 1.0 - Em + 2.0 * (xgm * inv_Gf2); + eta_p = 1.0 / sqrt(1.0 + kp * xgm); + temp = eta_p / (eta_p + 1.0); + x_pm = kp * (temp * temp * Gf2 * Dm); + p_pd = 2.0 * (xgm - x_pm) + Gf2 * (1.0 - Em + Dm); + q_pd = x_pm * (x_pm - 2.0 * xgm); + xi_pd = 1.0 - 0.5 * (Gf2 * (Em + Dm)); + u_pd = q_pd * p_pd / (p_pd * p_pd - xi_pd * q_pd); + x_m = x_m + u_pd; + km = exp(u_pd); + Em = Em / km; + Dm = Dm * km; Pm = x_m - 1.0 + Em; xgm = Gf * sqrt(Dm + Pm); + help = 1.0 - Em + 2.0 * (xgm * eta_p * inv_Gf2); + x_ds = x_ds * km * (d0 + D_bar) / (help + km * D_bar); + dps = x_ds * phit1; + end // (kp > 0.0) + sqm = sqrt(Pm); + alpha = eta_p + 0.5 * (Gf * (1.0 - Em) / sqm); + end - // 4.2.7 Polysilicon depletion - if (kp > 0.0) begin - d0 = 1.0 - Em + 2.0 * (xgm * inv_Gf2); - eta_p = 1.0 / sqrt(1.0 + kp * xgm); - temp = eta_p / (eta_p + 1.0); - x_pm = kp * (temp * temp * Gf2 * Dm); - p_pd = 2.0 * (xgm - x_pm) + Gf2 * (1.0 - Em + Dm); - q_pd = x_pm * (x_pm - 2.0 * xgm); - xi_pd = 1.0 - 0.5 * (Gf2 * (Em + Dm)); - u_pd = q_pd * p_pd / (p_pd * p_pd - xi_pd * q_pd); - x_m = x_m + u_pd; - km = exp(u_pd); - Em = Em / km; - Dm = Dm * km; - Pm = x_m - 1.0 + Em; - xgm = Gf * sqrt(Dm + Pm); - help = 1.0 - Em + 2.0 * (xgm * eta_p * inv_Gf2); - x_ds = x_ds * km * (d0 + D_bar) / (help + km * D_bar); - dps = x_ds * phit1; - end // (kp > 0.0) - sqm = sqrt(Pm); - alpha = eta_p + 0.5 * (Gf * (1.0 - Em) / sqm); - end - - // 4.2.8 Potential midpoint inversion charge - qim = phit1 * (Gf2 * Dm / (xgm + Gf * sqm)); + // 4.2.8 Potential midpoint inversion charge + qim = phit1 * (Gf2 * Dm / (xgm + Gf * sqm)); - // 4.2.8 Potential midpoint inversion charge (continued) - qim1 = qim + phit1 * alpha; - qim1_1 = 1.0 / qim1; - qbm = sqm * Gf * phit1; - // Series resistance - if (RSG_i < 0) begin - temp = 1.0 - RSG_i * qim; - end else begin - temp = 1.0 / (1.0 + RSG_i * qim); + // 4.2.8 Potential midpoint inversion charge (continued) + qim1 = qim + phit1 * alpha; + qim1_1 = 1.0 / qim1; + qbm = sqm * Gf * phit1; + // Series resistance + if (RSG_i < 0) begin + temp = 1.0 - RSG_i * qim; + end else begin + temp = 1.0 / (1.0 + RSG_i * qim); + end + GR = THER_i * (rhob * temp * qim); + // Mobility reduction + qeff = qbm + eta_mu * qim; + Eeffm = E_eff0 * qeff; + Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * (Pm / (Pm + Dm + 1.0e-14)); + Gmob = (1.0 + Mutmp + GR) * Rxcor; + + // 4.2.9 Drain-source channel current + // Channel length modulation + r1 = qim * qim1_1; + r2 = phit1 * (alpha * qim1_1); + temp = ln((1.0 + (Vds - dps) * inv_VP) / (1.0 + (Vdse - dps) * inv_VP)); + temp1 = ln(1.0 + Vdsx * inv_VP); + dL = ALP_i * temp; + GdL = 1.0 / (1.0 + dL + dL * dL); + dL1 = dL + ALP1_i * (qim1_1 * r1 * temp) + ALP2_i * (qbm * r2 * r2 * temp1); + FdL = (1.0 + dL1 + dL1 * dL1) * GdL; + // Velocity saturation + temp2 = qim * xitsb; + wsat = 100.0 * (temp2 / (100.0 + temp2)); + Gmob_dL = Gmob * GdL; + if (THESATG_i < 0) begin + temp = 1 / (1 - THESATG_i * wsat); + end else begin + temp = 1 + THESATG_i * wsat; + end + thesat1 = THESAT_i * (temp / Gmob_dL); + zsat = thesat1 * thesat1 * dps * dps; + if (CHNL_TYPE == `PMOS) begin + zsat = zsat / (1.0 + thesat1 * dps); + end + Gvsat = 0.5 * (Gmob_dL * (1.0 + sqrt(1.0 + 2.0 * zsat))); + Gvsatinv = 1.0 / Gvsat; + // Drain-source current + Ids = BET_i * (FdL * qim1 * dps * Gvsatinv); + + // 4.2.10 Variables for calculation of intrinsic charges and gate current + Voxm = xgm * phit1; + temp = Gmob_dL * Gvsatinv; + alpha1 = alpha * (1.0 + 0.5 * (zsat * temp * temp)); + H = temp * qim1 / alpha1; + + // 4.2.11 Impact-Ionization + if (SWIMPACT != 0) begin + delVsat = Vds - A3_i * dps; + if (delVsat > 0) begin + temp2 = A2_i * ((1.0 + A4_i * (sqrt(phib + Vsbstar) - sqrt_phib)) / delVsat); + `expl_low(-temp2, temp) + mavl = A1_i * (delVsat * temp); + Iimpact = Ids * mavl; end - GR = THER_i * (rhob * temp * qim); - // Mobility reduction - qeff = qbm + eta_mu * qim; - Eeffm = E_eff0 * qeff; - Mutmp = pow(Eeffm * MUE_i, THEMU_i) + CS_i * (Pm / (Pm + Dm + 1.0e-14)); - Gmob = (1.0 + Mutmp + GR) * Rxcor; - - // 4.2.9 Drain-source channel current - // Channel length modulation - r1 = qim * qim1_1; - r2 = phit1 * (alpha * qim1_1); - temp = ln((1.0 + (Vds - dps) * inv_VP) / (1.0 + (Vdse - dps) * inv_VP)); - temp1 = ln(1.0 + Vdsx * inv_VP); - dL = ALP_i * temp; - GdL = 1.0 / (1.0 + dL + dL * dL); - dL1 = dL + ALP1_i * (qim1_1 * r1 * temp) + ALP2_i * (qbm * r2 * r2 * temp1); - FdL = (1.0 + dL1 + dL1 * dL1) * GdL; - // Velocity saturation - temp2 = qim * xitsb; - wsat = 100.0 * (temp2 / (100.0 + temp2)); - Gmob_dL = Gmob * GdL; - if (THESATG_i < 0) begin - temp = 1 / (1 - THESATG_i * wsat); + end + end // (xg > 0) + + // 4.2.12 Surface potential in gate overlap regions + if (((SWIGATE != 0) && (IGOV_i > 0)) || ((SWGIDL != 0) && (AGIDL_i > 0)) || (CGOV_i > 0)) begin + `sp_ov(xs_ov, xgs_ov) + `sp_ov(xd_ov, xgd_ov) + Vovs = -phit * (xgs_ov + xs_ov); + Vovd = -phit * (xgd_ov + xd_ov); + end + + // 4.2.13 Gate current + Igsov = 0.0; + Igdov = 0.0; + Igc = 0.0; + Igs = 0.0; + Igd = 0.0; + Igb = 0.0; + Igcs = 0.0; + Igcd = 0.0; + if (SWIGATE != 0) begin + if (IGOV_i > 0) begin + + // Gate-source overlap component of gate current + arg2mina = Vovs + Dov; + psi_t = `MINA(0.0, arg2mina, 0.01); + zg = sqrt(Vovs * Vovs + 1.0e-6) * inv_CHIB; + if (GC3_i < 0) begin + zg = `MINA(zg, GCQ, 1.0e-6); + end + arg1 = (3.0 + xs_ov + psi_t * inv_phit); + `expl(arg1, Dsi) + arg1 = -Vgs * inv_phit; + `expl(arg1, temp) + Dgate = Dsi * temp; + temp = BOV * (-1.5 + zg * (GC2_i + GC3_i * zg)); + if (temp > 0) begin + TP = `P3(temp); end else begin - temp = 1 + THESATG_i * wsat; + `expl_low(temp, TP) end - thesat1 = THESAT_i * (temp / Gmob_dL); - zsat = thesat1 * thesat1 * dps * dps; - if (CHNL_TYPE == `PMOS) begin - zsat = zsat / (1.0 + thesat1 * dps); + Igsov = IGOV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); + + // Gate-drain overlap component of gate current + arg2mina = Vovd + Dov; + psi_t = `MINA(0.0, arg2mina, 0.01); + zg = sqrt(Vovd * Vovd + 1.0e-6) * inv_CHIB; + if (GC3_i < 0) begin + zg = `MINA(zg, GCQ, 1.0e-6); end - Gvsat = 0.5 * (Gmob_dL * (1.0 + sqrt(1.0 + 2.0 * zsat))); - Gvsatinv = 1.0 / Gvsat; - // Drain-source current - Ids = BET_i * (FdL * qim1 * dps * Gvsatinv); - - // 4.2.10 Variables for calculation of intrinsic charges and gate current - Voxm = xgm * phit1; - temp = Gmob_dL * Gvsatinv; - alpha1 = alpha * (1.0 + 0.5 * (zsat * temp * temp)); - H = temp * qim1 / alpha1; - - // 4.2.11 Impact-Ionization - if (SWIMPACT != 0) begin - delVsat = Vds - A3_i * dps; - if (delVsat > 0) begin - temp2 = A2_i * ((1.0 + A4_i * (sqrt(phib + Vsbstar) - sqrt_phib)) / delVsat); - `expl_low(-temp2, temp) - mavl = A1_i * (delVsat * temp); - Iimpact = Ids * mavl; - end + arg1 = (3.0 + xd_ov + psi_t * inv_phit); + `expl(arg1, Dsi) + arg1 = -Vgd * inv_phit; + `expl(arg1, temp) + Dgate = Dsi * temp; + temp = BOV * (-1.5 + zg * (GC2_i + GC3_i * zg)); + if (temp > 0) begin + TP = `P3(temp); + end else begin + `expl_low(temp, TP) end - end // (xg > 0) - - // 4.2.12 Surface potential in gate overlap regions - if (((SWIGATE != 0) && (IGOV_i > 0)) || ((SWGIDL != 0) && (AGIDL_i > 0)) || (CGOV_i > 0)) begin - `sp_ov(xs_ov, xgs_ov) - `sp_ov(xd_ov, xgd_ov) - Vovs = -phit * (xgs_ov + xs_ov); - Vovd = -phit * (xgd_ov + xd_ov); + Igdov = IGOV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); end - // 4.2.13 Gate current - Igsov = 0.0; - Igdov = 0.0; - Igc = 0.0; - Igs = 0.0; - Igd = 0.0; - Igb = 0.0; - Igcs = 0.0; - Igcd = 0.0; - if (SWIGATE != 0) begin - if (IGOV_i > 0) begin - - // Gate-source overlap component of gate current - arg2mina = Vovs + Dov; - psi_t = `MINA(0.0, arg2mina, 0.01); - zg = sqrt(Vovs * Vovs + 1.0e-6) * inv_CHIB; - if (GC3_i < 0) begin - zg = `MINA(zg, GCQ, 1.0e-6); - end - arg1 = (3.0 + xs_ov + psi_t * inv_phit); - `expl(arg1, Dsi) - arg1 = -Vgs * inv_phit; - `expl(arg1, temp) - Dgate = Dsi * temp; - temp = BOV * (-1.5 + zg * (GC2_i + GC3_i * zg)); - if (temp > 0) begin - TP = `P3(temp); - end else begin - `expl_low(temp, TP) - end - Igsov = IGOV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); - - // Gate-drain overlap component of gate current - arg2mina = Vovd + Dov; - psi_t = `MINA(0.0, arg2mina, 0.01); - zg = sqrt(Vovd * Vovd + 1.0e-6) * inv_CHIB; - if (GC3_i < 0) begin - zg = `MINA(zg, GCQ, 1.0e-6); - end - arg1 = (3.0 + xd_ov + psi_t * inv_phit); - `expl(arg1, Dsi) - arg1 = -Vgd * inv_phit; - `expl(arg1, temp) - Dgate = Dsi * temp; - temp = BOV * (-1.5 + zg * (GC2_i + GC3_i * zg)); - if (temp > 0) begin - TP = `P3(temp); - end else begin - `expl_low(temp, TP) - end - Igdov = IGOV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); + // Gate-channel component of gate current + if (IGINV_i > 0) begin + if (xg <= 0.0) begin + temp = pow(Vds / Vdsat_lim, AX_i); + Udse = Vds * pow(1.0 + temp, -inv_AX) * inv_phit1; end + `expl_low(x_ds-Udse, temp) + Vm = Vsbstar + phit1 * (0.5 * x_ds - ln(0.5 * (1.0 + temp))); + + arg2mina = Voxm + Dch; + psi_t = `MINA(0.0, arg2mina, 0.01); + zg = sqrt(Voxm * Voxm + 1.0e-6) * inv_CHIB; + if (GC3_i < 0) begin + zg = `MINA(zg, GCQ, 1.0e-06); + end + arg1 = (x_m + (psi_t - alpha_b - Vm) * inv_phit1); + `expl(arg1,Dsi) + arg1 = -(Vgs + Vsbstar - Vm) * inv_phit1; + `expl(arg1,temp) + Dgate = Dsi * temp; + temp = BCH * (-1.5 + zg * (GC2_i + GC3_i * zg)); + if (temp > 0) begin + TP = `P3(temp); + end else begin + `expl_low(temp, TP) + end + Igc0 = IGINV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); - // Gate-channel component of gate current - if (IGINV_i > 0) begin - if (xg <= 0.0) begin - temp = pow(Vds / Vdsat_lim, AX_i); - Udse = Vds * pow(1.0 + temp, -inv_AX) * inv_phit1; - end - `expl_low(x_ds-Udse, temp) - Vm = Vsbstar + phit1 * (0.5 * x_ds - ln(0.5 * (1.0 + temp))); - - arg2mina = Voxm + Dch; - psi_t = `MINA(0.0, arg2mina, 0.01); - zg = sqrt(Voxm * Voxm + 1.0e-6) * inv_CHIB; - if (GC3_i < 0) begin - zg = `MINA(zg, GCQ, 1.0e-06); - end - arg1 = (x_m + (psi_t - alpha_b - Vm) * inv_phit1); - `expl(arg1,Dsi) - arg1 = -(Vgs + Vsbstar - Vm) * inv_phit1; - `expl(arg1,temp) - Dgate = Dsi * temp; - temp = BCH * (-1.5 + zg * (GC2_i + GC3_i * zg)); - if (temp > 0) begin - TP = `P3(temp); - end else begin - `expl_low(temp, TP) - end - Igc0 = IGINV_i * (TP * ln((1.0 + Dsi) / (1.0 + Dgate))); - - // Source/drain partitioning of gate-channel current - if ((xg <= 0) || ((GC2_i == 0) && (GC3_i == 0))) begin - igc = 1.0; - igcd_h = 0.5; + // Source/drain partitioning of gate-channel current + if ((xg <= 0) || ((GC2_i == 0) && (GC3_i == 0))) begin + igc = 1.0; + igcd_h = 0.5; + end else begin + temp = GC2_i + 2.0 * GC3_i * zg; + u0 = CHIB_i / (temp * BCH); + x = 0.5 * (dps / u0); + u0_div_H = u0 / H; + Bg = u0_div_H * (1.0 - u0_div_H) * 0.5; + Ag = 0.5 - 3.0 * Bg; + if (x < 1.0e-3) begin + xsq = x * x; + igc = 1.0 + xsq * (`oneSixth + u0_div_H * `oneThird + `oneSixth * (xsq * (0.05 + 0.2 * u0_div_H))); + igcd_h = 0.5 * igc - `oneSixth * (x * (1.0 + xsq * (0.4 * (Bg + 0.25) + 0.0285714285714 * (xsq * (0.125 + Bg))))); end else begin - temp = GC2_i + 2.0 * GC3_i * zg; - u0 = CHIB_i / (temp * BCH); - x = 0.5 * (dps / u0); - u0_div_H = u0 / H; - Bg = u0_div_H * (1.0 - u0_div_H) * 0.5; - Ag = 0.5 - 3.0 * Bg; - if (x < 1.0e-3) begin - xsq = x * x; - igc = 1.0 + xsq * (`oneSixth + u0_div_H * `oneThird + `oneSixth * (xsq * (0.05 + 0.2 * u0_div_H))); - igcd_h = 0.5 * igc - `oneSixth * (x * (1.0 + xsq * (0.4 * (Bg + 0.25) + 0.0285714285714 * (xsq * (0.125 + Bg))))); - end else begin - inv_x = 1.0 / x; - `expl(x, ex) - inv_ex = 1.0 / ex; - temp = ex - inv_ex; - temp2 = ex + inv_ex; - igc = 0.5 * ((1.0 - u0_div_H) * temp * inv_x + u0_div_H * temp2); - igcd_h = 0.5 * (igc - temp * (Bg - Ag * inv_x * inv_x) - Ag * temp2 * inv_x); - end + inv_x = 1.0 / x; + `expl(x, ex) + inv_ex = 1.0 / ex; + temp = ex - inv_ex; + temp2 = ex + inv_ex; + igc = 0.5 * ((1.0 - u0_div_H) * temp * inv_x + u0_div_H * temp2); + igcd_h = 0.5 * (igc - temp * (Bg - Ag * inv_x * inv_x) - Ag * temp2 * inv_x); end - Sg = 0.5 * (1.0 + xg / sqrt(xg * xg + 1.0e-6)); - Igc = Igc0 * igc * Sg; - Igcd = Igc0 * igcd_h * Sg; - Igcs = Igc - Igcd; - Igb = Igc0 * igc * (1.0 - Sg); - end // (IGINV >0) - Igs = Igsov + Igcs; - Igd = Igdov + Igcd; - end // (SWIGATE != 0) - - // 4.2.14 GIDL/GISL current - Igidl = 0.0; - Igisl = 0.0; - if ((SWGIDL != 0) && (AGIDL_i > 0)) begin - - // GIDL current computation - if (Vovd < 0) begin - Vtovd = sqrt(Vovd * Vovd + CGIDL_i * CGIDL_i * (Vdb * Vdb) + 1.0e-6); - temp = -BGIDL_i / Vtovd; - `expl_low(temp, temp2) - Igidl = -AGIDL_i * (Vdb * Vovd * Vtovd * temp2); - end - - // GISL current computation - if (Vovs < 0) begin - Vtovs = sqrt(Vovs * Vovs + CGIDL_i * CGIDL_i * (Vsb * Vsb) + 1.0e-6); - temp = -BGIDL_i / Vtovs; - `expl_low(temp, temp2) - Igisl = -AGIDL_i * (Vsb * Vovs * Vtovs * temp2); end - end // (SWGIDL != 0) + Sg = 0.5 * (1.0 + xg / sqrt(xg * xg + 1.0e-6)); + Igc = Igc0 * igc * Sg; + Igcd = Igc0 * igcd_h * Sg; + Igcs = Igc - Igcd; + Igb = Igc0 * igc * (1.0 - Sg); + end // (IGINV >0) + Igs = Igsov + Igcs; + Igd = Igdov + Igcd; + end // (SWIGATE != 0) + + // 4.2.14 GIDL/GISL current + Igidl = 0.0; + Igisl = 0.0; + if ((SWGIDL != 0) && (AGIDL_i > 0)) begin + + // GIDL current computation + if (Vovd < 0) begin + Vtovd = sqrt(Vovd * Vovd + CGIDL_i * CGIDL_i * (Vdb * Vdb) + 1.0e-6); + temp = -BGIDL_i / Vtovd; + `expl_low(temp, temp2) + Igidl = -AGIDL_i * (Vdb * Vovd * Vtovd * temp2); + end - end // evaluateStatic + // GISL current computation + if (Vovs < 0) begin + Vtovs = sqrt(Vovs * Vovs + CGIDL_i * CGIDL_i * (Vsb * Vsb) + 1.0e-6); + temp = -BGIDL_i / Vtovs; + `expl_low(temp, temp2) + Igisl = -AGIDL_i * (Vsb * Vovs * Vtovs * temp2); + end + end // (SWGIDL != 0) + end // evaluateStatic - ///////////////////////////////////////////////////////////////////////////// - // - // AC bias dependent quantities (calculations for charge contribs) - // - ///////////////////////////////////////////////////////////////////////////// - begin : evaluateDynamic - - // 4.2.16 Quantum mechanical corrections - COX_qm = COX_i; - if (qq > 0.0) begin - COX_qm = COX_i / (1.0 + qq * pow(qeff * qeff + qlim2, -1.0 * `oneSixth)); - end + ///////////////////////////////////////////////////////////////////////////// + // + // AC bias dependent quantities (calculations for charge contribs) + // + ///////////////////////////////////////////////////////////////////////////// - // 4.2.17 Intrinsic charge model - if (xg <= 0.0) begin - QG = Voxm; - QI = 0.0; - QD = 0.0; - QB = QG; - end else begin - Fj = 0.5 * (dps / H); - Fj2 = Fj * Fj; - QCLM = (1.0 - GdL) * (qim - 0.5 * (alpha * dps)); - QG = Voxm + 0.5 * (eta_p * dps * (Fj * GdL * `oneThird - 1.0 + GdL)); - temp = alpha * dps * `oneSixth; - QI = GdL * (qim + temp * Fj) + QCLM; - QD = 0.5 * (GdL * GdL * (qim - temp * (1.0 - Fj - 0.2 * Fj2)) + QCLM * (1.0 + GdL)); - QB = QG - QI; - end - Qg = QG * COX_qm; - Qd = -QD * COX_qm; - Qb = -QB * COX_qm; - - // 4.2.18 Extrinsic charge model - Qgs_ov = CGOV_i * Vovs; - Qgd_ov = CGOV_i * Vovd; - Qgb_ov = CGBOV_i * Vgb; - - // Outer fringe charge - Qfgs = CFR_i * Vgs; - Qfgd = CFR_i * Vgd; + begin : evaluateDynamic + + // 4.2.16 Quantum mechanical corrections + COX_qm = COX_i; + if (qq > 0.0) begin + COX_qm = COX_i / (1.0 + qq * pow(qeff * qeff + qlim2, -1.0 * `oneSixth)); + end + + // 4.2.17 Intrinsic charge model + if (xg <= 0.0) begin + QG = Voxm; + QI = 0.0; + QD = 0.0; + QB = QG; + end else begin + Fj = 0.5 * (dps / H); + Fj2 = Fj * Fj; + QCLM = (1.0 - GdL) * (qim - 0.5 * (alpha * dps)); + QG = Voxm + 0.5 * (eta_p * dps * (Fj * GdL * `oneThird - 1.0 + GdL)); + temp = alpha * dps * `oneSixth; + QI = GdL * (qim + temp * Fj) + QCLM; + QD = 0.5 * (GdL * GdL * (qim - temp * (1.0 - Fj - 0.2 * Fj2)) + QCLM * (1.0 + GdL)); + QB = QG - QI; + end + Qg = QG * COX_qm; + Qd = -QD * COX_qm; + Qb = -QB * COX_qm; + + // 4.2.18 Extrinsic charge model + Qgs_ov = CGOV_i * Vovs; + Qgd_ov = CGOV_i * Vovd; + Qgb_ov = CGBOV_i * Vgb; + + // Outer fringe charge + Qfgs = CFR_i * Vgs; + Qfgd = CFR_i * Vgd; `ifdef NQSmodel // Variables for NQS model @@ -1883,89 +1883,89 @@ end `endif // NQSmodel - end // evaluateDynamic + end // evaluateDynamic - ///////////////////////////////////////////////////////////////////////////// - // - // JUNCAP2 contribs - // - ///////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////// + // + // JUNCAP2 contribs + // + ///////////////////////////////////////////////////////////////////////////// - begin : evaluateStaticDynamic - - // Source side - VAK = Vjuns; - VMAX = VMAXS; - vbimin = vbimins; - vfmin = vfmins; - vch = vchs; - vbbtlim = vbbtlims; - `juncapcommon(ABSOURCE_i,LSSOURCE_i,LGSOURCE_i,isjunbot,qsjunbot,isjunsti,qsjunsti,isjungat,qsjungat) - - // Drain side - VAK = Vjund; - VMAX = VMAXD; - vbimin = vbimind; - vfmin = vfmind; - vch = vchd; - vbbtlim = vbbtlimd; - `juncapcommon(ABDRAIN_i,LSDRAIN_i,LGDRAIN_i,idjunbot,qdjunbot,idjunsti,qdjunsti,idjungat,qdjungat) + begin : evaluateStaticDynamic + + // Source side + VAK = Vjuns; + VMAX = VMAXS; + vbimin = vbimins; + vfmin = vfmins; + vch = vchs; + vbbtlim = vbbtlims; + `juncapcommon(ABSOURCE_i,LSSOURCE_i,LGSOURCE_i,isjunbot,qsjunbot,isjunsti,qsjunsti,isjungat,qsjungat) + + // Drain side + VAK = Vjund; + VMAX = VMAXD; + vbimin = vbimind; + vfmin = vfmind; + vch = vchd; + vbbtlim = vbbtlimd; + `juncapcommon(ABDRAIN_i,LSDRAIN_i,LGDRAIN_i,idjunbot,qdjunbot,idjunsti,qdjunsti,idjungat,qdjungat) `ifdef NQSmodel // Set initial conditions for NQS model `include "PSP102_InitNQS.include" `endif // NQSmodel - end // evaluateStaticDynamic - - - ///////////////////////////////////////////////////////////////////////////// - // - // Current contribs - // - ///////////////////////////////////////////////////////////////////////////// - - begin : loadStatic - - // 4.2.15 Total terminal currents - - // Intrinsic MOSFET current - Idse = MULT_i * Ids; - - // Gate (tunneling) current components - Igbe = MULT_i * Igb; - Igse = MULT_i * Igs; - Igde = MULT_i * Igd; - - // GIDL/GISL current - Igidle = MULT_i * Igidl; - Igisle = MULT_i * Igisl; + end // evaluateStaticDynamic - // Impact ionization current - Iimpacte = MULT_i * Iimpact; - // JUNCAP2 - isjun = MULT_i * (ABSOURCE_i * isjunbot + LSSOURCE_i * isjunsti + LGSOURCE_i * isjungat); - idjun = MULT_i * (ABDRAIN_i * idjunbot + LSDRAIN_i * idjunsti + LGDRAIN_i * idjungat); + ///////////////////////////////////////////////////////////////////////////// + // + // Current contribs + // + ///////////////////////////////////////////////////////////////////////////// - // Convert back for NMOS-PMOS and Source-Drain interchange - if (sigVds > 0) begin - I(D, `Bint) <+ CHNL_TYPE * (Iimpacte + Igidle); - I(D, S) <+ CHNL_TYPE * Idse; - I(`Gint, S) <+ CHNL_TYPE * Igse; - I(`Gint, D) <+ CHNL_TYPE * Igde; - I(S, `Bint) <+ CHNL_TYPE * Igisle; - end else begin - I(S, `Bint) <+ CHNL_TYPE * (Iimpacte + Igidle); - I(S, D) <+ CHNL_TYPE * Idse; - I(`Gint, D) <+ CHNL_TYPE * Igse; - I(`Gint, S) <+ CHNL_TYPE * Igde; - I(D, `Bint) <+ CHNL_TYPE * Igisle; - end - I(`Gint, `Bint) <+ CHNL_TYPE * Igbe; - I(`Bjs, S) <+ CHNL_TYPE * isjun; - I(`Bjd, D) <+ CHNL_TYPE * idjun; + begin : loadStatic + + // 4.2.15 Total terminal currents + + // Intrinsic MOSFET current + Idse = MULT_i * Ids; + + // Gate (tunneling) current components + Igbe = MULT_i * Igb; + Igse = MULT_i * Igs; + Igde = MULT_i * Igd; + + // GIDL/GISL current + Igidle = MULT_i * Igidl; + Igisle = MULT_i * Igisl; + + // Impact ionization current + Iimpacte = MULT_i * Iimpact; + + // JUNCAP2 + isjun = MULT_i * (ABSOURCE_i * isjunbot + LSSOURCE_i * isjunsti + LGSOURCE_i * isjungat); + idjun = MULT_i * (ABDRAIN_i * idjunbot + LSDRAIN_i * idjunsti + LGDRAIN_i * idjungat); + + // Convert back for NMOS-PMOS and Source-Drain interchange + if (sigVds > 0) begin + I(D, `Bint) <+ CHNL_TYPE * (Iimpacte + Igidle); + I(D, S) <+ CHNL_TYPE * Idse; + I(`Gint, S) <+ CHNL_TYPE * Igse; + I(`Gint, D) <+ CHNL_TYPE * Igde; + I(S, `Bint) <+ CHNL_TYPE * Igisle; + end else begin + I(S, `Bint) <+ CHNL_TYPE * (Iimpacte + Igidle); + I(S, D) <+ CHNL_TYPE * Idse; + I(`Gint, D) <+ CHNL_TYPE * Igse; + I(`Gint, S) <+ CHNL_TYPE * Igde; + I(D, `Bint) <+ CHNL_TYPE * Igisle; + end + I(`Gint, `Bint) <+ CHNL_TYPE * Igbe; + I(`Bjs, S) <+ CHNL_TYPE * isjun; + I(`Bjd, D) <+ CHNL_TYPE * idjun; `ifdef NQSmodel I(G, GP) <+ Vrg * ggate; I(BP, BI) <+ Vrbulk * gbulk; @@ -1974,128 +1974,128 @@ I(B, BI) <+ Vrwell * gwell; `endif // NQSmodel - I(D, S) <+ Vds * `GMIN; + I(D, S) <+ Vds * `GMIN; - end // loadStatic + end // loadStatic - ///////////////////////////////////////////////////////////////////////////// - // - // ddt() contribs from charges (Note: MULT is handled explicitly) - // - ///////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////// + // + // ddt() contribs from charges (Note: MULT is handled explicitly) + // + ///////////////////////////////////////////////////////////////////////////// - begin : loadDynamic + begin : loadDynamic `ifdef NQSmodel // Calculate NQS charge contributions `include "PSP102_ChargesNQS.include" `endif // NQSmodel - // 4.2.19 Total terminal charges + // 4.2.19 Total terminal charges - // Intrinsic MOSFET charges - Qg = MULT_i * Qg; - Qb = MULT_i * Qb; - Qd = MULT_i * Qd; - Qs = -(Qg + Qb + Qd); + // Intrinsic MOSFET charges + Qg = MULT_i * Qg; + Qb = MULT_i * Qb; + Qd = MULT_i * Qd; + Qs = -(Qg + Qb + Qd); - // Total outerFringe + overlap for - // gate-source and gate-drain. - Qfgs = MULT_i * (Qfgs + Qgs_ov); - Qfgd = MULT_i * (Qfgd + Qgd_ov); + // Total outerFringe + overlap for + // gate-source and gate-drain. + Qfgs = MULT_i * (Qfgs + Qgs_ov); + Qfgd = MULT_i * (Qfgd + Qgd_ov); - // Gate-bulk overlap charge - Qgb_ov = MULT_i * Qgb_ov; + // Gate-bulk overlap charge + Qgb_ov = MULT_i * Qgb_ov; - // JUNCAP2 - qsjun = MULT_i * (ABSOURCE_i * qsjunbot + LSSOURCE_i * qsjunsti + LGSOURCE_i * qsjungat); - qdjun = MULT_i * (ABDRAIN_i * qdjunbot + LSDRAIN_i * qdjunsti + LGDRAIN_i * qdjungat); + // JUNCAP2 + qsjun = MULT_i * (ABSOURCE_i * qsjunbot + LSSOURCE_i * qsjunsti + LGSOURCE_i * qsjungat); + qdjun = MULT_i * (ABDRAIN_i * qdjunbot + LSDRAIN_i * qdjunsti + LGDRAIN_i * qdjungat); - // Convert back (undo S-D interchange) - if (sigVds < 0) begin - temp = Qd; // Qd <--> Qs - Qd = Qs; - Qs = temp; - temp = Qfgd; // Qfgd <--> Qfgs - Qfgd = Qfgs; - Qfgs = temp; - end + // Convert back (undo S-D interchange) + if (sigVds < 0) begin + temp = Qd; // Qd <--> Qs + Qd = Qs; + Qs = temp; + temp = Qfgd; // Qfgd <--> Qfgs + Qfgd = Qfgs; + Qfgs = temp; + end - I(`Gint, S) <+ ddt(CHNL_TYPE * Qg); - I(`Bint, S) <+ ddt(CHNL_TYPE * Qb); - I(D, S) <+ ddt(CHNL_TYPE * Qd); - I(`Gint, S) <+ ddt(CHNL_TYPE * Qfgs); - I(`Gint, D) <+ ddt(CHNL_TYPE * Qfgd); - I(`Gint, `Bint) <+ ddt(CHNL_TYPE * Qgb_ov); - I(`Bjs, S) <+ ddt(CHNL_TYPE * qsjun); - I(`Bjd, D) <+ ddt(CHNL_TYPE * qdjun); + I(`Gint, S) <+ ddt(CHNL_TYPE * Qg); + I(`Bint, S) <+ ddt(CHNL_TYPE * Qb); + I(D, S) <+ ddt(CHNL_TYPE * Qd); + I(`Gint, S) <+ ddt(CHNL_TYPE * Qfgs); + I(`Gint, D) <+ ddt(CHNL_TYPE * Qfgd); + I(`Gint, `Bint) <+ ddt(CHNL_TYPE * Qgb_ov); + I(`Bjs, S) <+ ddt(CHNL_TYPE * qsjun); + I(`Bjd, D) <+ ddt(CHNL_TYPE * qdjun); - end // loadDynamic + end // loadDynamic - ///////////////////////////////////////////////////////////////////////////// - // - // Noise - // - ///////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////// + // + // Noise + // + ///////////////////////////////////////////////////////////////////////////// - begin : noise - - // 4.2.20 Noise variable calculation - Sfl = 0.0; - mid = 0.0; - mig = 0.0; - migid = 0.0; - c_igid = 0.0; - CGeff = COX_qm * eta_p; - sqid = 0.0; - sqig = 0.0; - if ((xg > 0.0) && (MULT_i > 0) && (BET_i > 0)) begin - N1 = Cox_over_q * alpha * phit; - Nm1 = Cox_over_q * qim1; - Delta_N1 = Cox_over_q * (alpha * dps); - Sfl = (NFA_i - NFB_i * N1 + NFC_i * (N1 * N1)) * ln((Nm1 + 0.5 * Delta_N1) / (Nm1 - 0.5 * Delta_N1)); - Sfl = Sfl + (NFB_i + NFC_i * (Nm1 - 2.0 * N1)) * Delta_N1; - Sfl = Sfl_prefac * Ids * Gvsatinv * Sfl / N1; - - H0 = qim1 / alpha; - t1 = qim / qim1; - sqt2 = 0.5 * `oneSixth * (dps / H0); - t2 = sqt2 * sqt2; - r = H0 / H - 1.0; - lc = `CLIP_LOW(1.0 - 12 * (r * t2), 1e-20); - lcinv2 = 1 / (lc * lc); - g_ideal = BET_i * (FdL * qim1 * Gvsatinv); - CGeff = Gvsat * Gvsat * COX_qm * eta_p / (Gmob_dL * Gmob_dL); - mid = t1 + 12 * t2 - 24 * ((1.0 + t1) * t2 * r); - mid = `CLIP_LOW(mid, 1e-40); - mid = g_ideal * lcinv2 * mid; - mig = t1 / 12 - t2 * (t1 + 0.2 - 12 * t2) - 1.6 * (t2 * (t1 + 1.0 - 12 * t2) * r); - mig = `CLIP_LOW(mig, 1e-40); - mig = lcinv2 / g_ideal * mig; - migid = lcinv2 * sqt2 * (1.0 - 12 * t2 - (t1 + 19.2 * t2 - 12 * (t1 * t2)) * r); - sqid = sqrt(MULT_i * nt * mid); - sqig = sqrt(MULT_i * nt / mig); - c_igid = (sqid == 0) ? 0.0 : (migid * sqig / sqid); // = migid / sqrt(mig * mid); - c_igid = `CLIP_BOTH(c_igid, 0.0, 1.0); - end - shot_igsx = 2.0 * `QELE * abs(Igse); - shot_igdx = 2.0 * `QELE * abs(Igde); - shot_iavl = 2.0 * `QELE * ((mavl + 1) * abs(Iimpacte)); - // JUNCAP2 - sjnoisex = 2.0 * `QELE * abs(isjun); - djnoisex = 2.0 * `QELE * abs(idjun); - if (sigVds > 0) begin - shot_igs = shot_igsx; - shot_igd = shot_igdx; - sjnoise = sjnoisex; - djnoise = djnoisex + shot_iavl; - end else begin - shot_igs = shot_igdx; - shot_igd = shot_igsx; - sjnoise = sjnoisex + shot_iavl; - djnoise = djnoisex; - end + begin : noise + + // 4.2.20 Noise variable calculation + Sfl = 0.0; + mid = 0.0; + mig = 0.0; + migid = 0.0; + c_igid = 0.0; + CGeff = COX_qm * eta_p; + sqid = 0.0; + sqig = 0.0; + if ((xg > 0.0) && (MULT_i > 0) && (BET_i > 0)) begin + N1 = Cox_over_q * alpha * phit; + Nm1 = Cox_over_q * qim1; + Delta_N1 = Cox_over_q * (alpha * dps); + Sfl = (NFA_i - NFB_i * N1 + NFC_i * (N1 * N1)) * ln((Nm1 + 0.5 * Delta_N1) / (Nm1 - 0.5 * Delta_N1)); + Sfl = Sfl + (NFB_i + NFC_i * (Nm1 - 2.0 * N1)) * Delta_N1; + Sfl = Sfl_prefac * Ids * Gvsatinv * Sfl / N1; + + H0 = qim1 / alpha; + t1 = qim / qim1; + sqt2 = 0.5 * `oneSixth * (dps / H0); + t2 = sqt2 * sqt2; + r = H0 / H - 1.0; + lc = `CLIP_LOW(1.0 - 12 * (r * t2), 1e-20); + lcinv2 = 1 / (lc * lc); + g_ideal = BET_i * (FdL * qim1 * Gvsatinv); + CGeff = Gvsat * Gvsat * COX_qm * eta_p / (Gmob_dL * Gmob_dL); + mid = t1 + 12 * t2 - 24 * ((1.0 + t1) * t2 * r); + mid = `CLIP_LOW(mid, 1e-40); + mid = g_ideal * lcinv2 * mid; + mig = t1 / 12 - t2 * (t1 + 0.2 - 12 * t2) - 1.6 * (t2 * (t1 + 1.0 - 12 * t2) * r); + mig = `CLIP_LOW(mig, 1e-40); + mig = lcinv2 / g_ideal * mig; + migid = lcinv2 * sqt2 * (1.0 - 12 * t2 - (t1 + 19.2 * t2 - 12 * (t1 * t2)) * r); + sqid = sqrt(MULT_i * nt * mid); + sqig = sqrt(MULT_i * nt / mig); + c_igid = (sqid == 0) ? 0.0 : (migid * sqig / sqid); // = migid / sqrt(mig * mid); + c_igid = `CLIP_BOTH(c_igid, 0.0, 1.0); + end + shot_igsx = 2.0 * `QELE * abs(Igse); + shot_igdx = 2.0 * `QELE * abs(Igde); + shot_iavl = 2.0 * `QELE * ((mavl + 1) * abs(Iimpacte)); + // JUNCAP2 + sjnoisex = 2.0 * `QELE * abs(isjun); + djnoisex = 2.0 * `QELE * abs(idjun); + if (sigVds > 0) begin + shot_igs = shot_igsx; + shot_igd = shot_igdx; + sjnoise = sjnoisex; + djnoise = djnoisex + shot_iavl; + end else begin + shot_igs = shot_igdx; + shot_igd = shot_igsx; + sjnoise = sjnoisex + shot_iavl; + djnoise = djnoisex; + end `ifdef NQSmodel rgatenoise = nt0 * ggate; rbulknoise = nt0 * gbulk; @@ -2104,29 +2104,29 @@ rwellnoise = nt0 * gwell; `endif // NQSmodel - // Important note: - // In Verilog-A, correlated noise sources can only be implemented by using two additional - // internal nodes (NOI and NOI2). When implementing PSP in a circuit simlutor, it is - // generally not necessary to retain these internal nodes and therefore (for execution - // speed reasons) should be avoided. - - // Noise contribs - I(NOI2) <+ V(NOI2); - I(NOI2) <+ white_noise(c_igid, "white"); - I(NOII) <+ white_noise(sqig * sqig * (1.0 - c_igid), "white"); - I(NOII) <+ -sqig * V(NOI2); - I(NOIR) <+ V(NOIR); - I(NOIC) <+ ddt(mig * CGeff * V(NOIC)); - I(D,S) <+ flicker_noise(MULT_i * Sfl, 1.0, "flicker"); - I(D,S) <+ white_noise(sqid * sqid * (1.0 - c_igid), "white"); - I(D,S) <+ sqid * V(NOI2); - I(`Gint,S)<+ ddt(0.5 * ((1.0 + sigVds) * mig * CGeff * V(NOIC))); - I(`Gint,D)<+ ddt(0.5 * ((1.0 - sigVds) * mig * CGeff * V(NOIC))); - I(`Gint,S)<+ white_noise(shot_igs, "white"); - I(`Gint,D)<+ white_noise(shot_igd, "white"); - // JUNCAP2 - I(`Bjs,S) <+ white_noise(sjnoise, "shot"); - I(`Bjd,D) <+ white_noise(djnoise, "shot"); + // Important note: + // In Verilog-A, correlated noise sources can only be implemented by using two additional + // internal nodes (NOI and NOI2). When implementing PSP in a circuit simlutor, it is + // generally not necessary to retain these internal nodes and therefore (for execution + // speed reasons) should be avoided. + + // Noise contribs + I(NOI2) <+ V(NOI2); + I(NOI2) <+ white_noise(c_igid, "white"); + I(NOII) <+ white_noise(sqig * sqig * (1.0 - c_igid), "white"); + I(NOII) <+ -sqig * V(NOI2); + I(NOIR) <+ V(NOIR); + I(NOIC) <+ ddt(mig * CGeff * V(NOIC)); + I(D,S) <+ flicker_noise(MULT_i * Sfl, 1.0, "flicker"); + I(D,S) <+ white_noise(sqid * sqid * (1.0 - c_igid), "white"); + I(D,S) <+ sqid * V(NOI2); + I(`Gint,S)<+ ddt(0.5 * ((1.0 + sigVds) * mig * CGeff * V(NOIC))); + I(`Gint,D)<+ ddt(0.5 * ((1.0 - sigVds) * mig * CGeff * V(NOIC))); + I(`Gint,S)<+ white_noise(shot_igs, "white"); + I(`Gint,D)<+ white_noise(shot_igd, "white"); + // JUNCAP2 + I(`Bjs,S) <+ white_noise(sjnoise, "shot"); + I(`Bjd,D) <+ white_noise(djnoise, "shot"); `ifdef NQSmodel // Parasitic resistances I(GP,G) <+ white_noise(rgatenoise, "white"); @@ -2135,7 +2135,7 @@ I(BD,BI) <+ white_noise(rjundnoise, "white"); I(B ,BI) <+ white_noise(rwellnoise, "white"); `endif // NQSmodel - end // noise + end // noise `ifdef insideADMS // OPinfo @@ -2329,11 +2329,11 @@ cjd = cjdbot + cjdgat + cjdsti; end `ifdef LocalModel - weff = 0; - leff = 0; + weff = 0; + leff = 0; `else - weff = WE; - leff = LE; + weff = WE; + leff = LE; `endif u = (abs(gds) < 1e-18) ? 0 : (gm / gds); rout = (abs(gds) < 1e-18) ? 0 : (1.0 / gds); @@ -2361,4 +2361,4 @@ end // OPinfo `endif // OPinfo - end // analogBlock +end // analogBlock diff --git a/src/spicelib/devices/adms/psp102/admsva/SIMKIT_macrodefs.include b/src/spicelib/devices/adms/psp102/admsva/SIMKIT_macrodefs.include index 7209cfd8d..d4475afe3 100644 --- a/src/spicelib/devices/adms/psp102/admsva/SIMKIT_macrodefs.include +++ b/src/spicelib/devices/adms/psp102/admsva/SIMKIT_macrodefs.include @@ -95,31 +95,31 @@ // values (exp_high), or both (expl), to avoid overflows // and underflows and retain C-3 continuity `define expl(x, res) \ -if (abs(x) < `se05) begin\ - res = exp(x); \ -end else begin \ - if ((x) < -`se05) begin\ - res = `ke05 / `P3(-`se05 - (x)); \ - end else begin\ - res = `ke05inv * `P3((x) - `se05); \ - end \ -end + if (abs(x) < `se05) begin\ + res = exp(x); \ + end else begin \ + if ((x) < -`se05) begin\ + res = `ke05 / `P3(-`se05 - (x)); \ + end else begin\ + res = `ke05inv * `P3((x) - `se05); \ + end \ + end `define expl_low(x, res) \ -if ((x) > -`se05) begin\ - res = exp(x); \ -end else begin\ - res = `ke05 / `P3(-`se05 - (x)); \ -end + if ((x) > -`se05) begin\ + res = exp(x); \ + end else begin\ + res = `ke05 / `P3(-`se05 - (x)); \ + end `define expl_high(x, res) \ -if ((x) < `se05) begin\ - res = exp(x); \ -end else begin \ - res = `ke05inv * `P3((x) - `se05); \ -end + if ((x) < `se05) begin\ + res = exp(x); \ + end else begin \ + res = `ke05inv * `P3((x) - `se05); \ + end `define swap(a, b) \ -temp = a; \ -a = b; \ -b = temp; + temp = a; \ + a = b; \ + b = temp;