From a2f1ec09882c701611922864667e359e109bdbe7 Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 17 Apr 2024 17:24:17 +0200 Subject: [PATCH 01/14] white spaces --- code/ekv3.va | 1260 +++++++++--------- code/ekv3_all.va | 2 +- code/ekv3_include/ekv3_def_check.va | 94 +- code/ekv3_include/ekv3_definitions.va | 62 +- code/ekv3_include/ekv3_edge.va | 330 ++--- code/ekv3_include/ekv3_extract_debug.va | 1302 +++++++++---------- code/ekv3_include/ekv3_extrinsic_diodes.va | 332 ++--- code/ekv3_include/ekv3_extrinsic_rc.va | 288 ++-- code/ekv3_include/ekv3_fringing.va | 28 +- code/ekv3_include/ekv3_functions_def.va | 144 +- code/ekv3_include/ekv3_gate_current.va | 280 ++-- code/ekv3_include/ekv3_gidl.va | 46 +- code/ekv3_include/ekv3_idb.va | 42 +- code/ekv3_include/ekv3_natures.va | 52 +- code/ekv3_include/ekv3_noise.va | 244 ++-- code/ekv3_include/ekv3_oppoints.va | 36 +- code/ekv3_include/ekv3_overlap.va | 296 ++--- code/ekv3_include/ekv3_parameters.va | 590 ++++----- code/ekv3_include/ekv3_variables.va | 1060 +++++++-------- code/ekv3_include/ekv3_variables_oppoint.va | 20 +- 20 files changed, 3254 insertions(+), 3254 deletions(-) diff --git a/code/ekv3.va b/code/ekv3.va index b30ca67..fc5453a 100644 --- a/code/ekv3.va +++ b/code/ekv3.va @@ -5,21 +5,21 @@ // Current Authors: Matthias Bucher, Nikolaos Makris // Initial Authors: Antonios Bazigos, Matthias Bucher, Francois Krummenacher // -// Version Date +// Version Date // --------------------------------------------------------------- // -// Current: 302.00 April 2, 2015 +// Current: 302.00 April 2, 2015 // -// Older: +// Older: // 301.04(revised) July 31, 2014 -// 301.04 September 4, 2009 -// 301.02 June 28, 2008 -// 301.01 November 22, 2007 -// 301.00 September 14, 2007 -// 300.03 August 1, 2007 -// 300.02 April 23, 2007 -// 300.01 October 28, 2006 -// 300.00 March 23, 2005 +// 301.04 September 4, 2009 +// 301.02 June 28, 2008 +// 301.01 November 22, 2007 +// 301.00 September 14, 2007 +// 300.03 August 1, 2007 +// 300.02 April 23, 2007 +// 300.01 October 28, 2006 +// 300.00 March 23, 2005 // // ******************************************************************************* // @@ -27,12 +27,12 @@ // // Your feedback is most welcome. Please direct inquiries, comments etc. to, // -// Prof. Matthias Bucher -// Technical University of Crete (TUC) -// 73100 Chania, Crete, Greece -// phone: + 30 28210 37210 -// fax: + 30 28210 37542 -// mbucher@tuc.gr +// Prof. Matthias Bucher +// Technical University of Crete (TUC) +// 73100 Chania, Crete, Greece +// phone: + 30 28210 37210 +// fax: + 30 28210 37542 +// mbucher@tuc.gr // // Current contributors: Matthias Bucher, Nikolaos Makris // Past contributors: Antonios Bazigos, Marianna Chalkiadaki, Nikolaos Mavredakis, Francois Krummenacher, Jean-Michel Sallese, Christian Enz, Ananda Roy @@ -67,15 +67,15 @@ // // The user of the EKV3 model may choose between the five modes of the model. // Each mode differentiates itself by the number of internal nodes it uses. -// As the number of the internal nodes increases so does the accuracy for higher frequencies, -// as well as its complexity. The selection between the various modes is achieved by +// As the number of the internal nodes increases so does the accuracy for higher frequencies, +// as well as its complexity. The selection between the various modes is achieved by // defining a certain variable from the list below. In all cases the module is named "ekv3", // and all the instances in a circuit will correspond to the same mode. // -// If the user wants to use different mode for specific transistors within a circuit, +// If the user wants to use different mode for specific transistors within a circuit, // the file "ekv3_all.va" has to be called, instead of the "ekv3.va" file (this file). -// The "ekv3_all.va" file defines also the ALL variable, while it calls the "ekv3.va" file (this file) five times, -// each time having defined a different variable for mode selection. +// The "ekv3_all.va" file defines also the ALL variable, while it calls the "ekv3.va" file (this file) five times, +// each time having defined a different variable for mode selection. // This way the resulted five modules are given different names. `define ALL 1 @@ -88,80 +88,80 @@ `ifdef ALL //(* compact_module *) //(* instance_parameter_list = {L, W, PS, PD, AS, AD, M, NF, SA, SB} *) - `ifdef DC_S - module ekv3_s (d,g,s,b); - `endif - `ifdef DC - module ekv3 (d,g,s,b); - `endif - `ifdef RF_S - module ekv3_r4 (d,g,s,b); - `endif - `ifdef RF - module ekv3_rf (d,g,s,b); - `endif - `ifdef NQS - module ekv3_nqs (d,g,s,b); - `endif + `ifdef DC_S + module ekv3_s (d,g,s,b); + `endif + `ifdef DC + module ekv3 (d,g,s,b); + `endif + `ifdef RF_S + module ekv3_r4 (d,g,s,b); + `endif + `ifdef RF + module ekv3_rf (d,g,s,b); + `endif + `ifdef NQS + module ekv3_nqs (d,g,s,b); + `endif `else - module ekv3 (d,g,s,b); + module ekv3 (d,g,s,b); `endif -inout d,g,s,b ; +inout d,g,s,b ; `ifdef DC_S - electrical d, g, s, b; - electrical noi; + electrical d, g, s, b; + electrical noi; //Operating Point definitions of nodes - `define GEFF g - `define DEFF d - `define SEFF s - `define BEFF b + `define GEFF g + `define DEFF d + `define SEFF s + `define BEFF b `endif `ifdef DC - electrical d, g, s, b; - electrical di, si; - electrical noi; + electrical d, g, s, b; + electrical di, si; + electrical noi; //Operating Point definitions of nodes - `define GEFF g - `define DEFF di - `define SEFF si - `define BEFF b + `define GEFF g + `define DEFF di + `define SEFF si + `define BEFF b `endif `ifdef RF_S - electrical d, g, s, b; - electrical di, si; - electrical gi, bi; - electrical noi; + electrical d, g, s, b; + electrical di, si; + electrical gi, bi; + electrical noi; //Operating Point definitions of nodes - `define GEFF gi - `define DEFF di - `define SEFF si - `define BEFF bi + `define GEFF gi + `define DEFF di + `define SEFF si + `define BEFF bi `endif `ifdef RF - electrical d, g, s, b; - electrical di, si; - electrical gi, bi; - electrical bdi, bsi; - electrical noi; + electrical d, g, s, b; + electrical di, si; + electrical gi, bi; + electrical bdi, bsi; + electrical noi; //Operating Point definitions of nodes - `define GEFF gi - `define DEFF di - `define SEFF si - `define BEFF bi + `define GEFF gi + `define DEFF di + `define SEFF si + `define BEFF bi `endif `ifdef NQS - electrical d, g, s, b; - electrical di, si; - electrical gi, bi; - electrical bdi, bsi; - electrical m1, m2, m3, m4; - electrical noi; + electrical d, g, s, b; + electrical di, si; + electrical gi, bi; + electrical bdi, bsi; + electrical m1, m2, m3, m4; + electrical noi; //Operating Point definitions of nodes - `define GEFF gi - `define DEFF di - `define SEFF si - `define BEFF bi + `define GEFF gi + `define DEFF di + `define SEFF si + `define BEFF bi `endif @@ -169,7 +169,7 @@ inout d,g,s,b ; `include "ekv3_include/ekv3_functions_def.va" `include "ekv3_include/ekv3_parameters.va" `include "ekv3_include/ekv3_variables_oppoint.va" -analog begin +analog begin //////////////////////////////////////////////////////////////////////////////// // LEVEL 0 // @@ -177,26 +177,26 @@ analog begin //////////////////////////////////////////////////////////////////////////////// begin:EKV3 `include "ekv3_include/ekv3_variables.va" -`MODEL +`MODEL begin begin : GENERAL_VALUES // SIMULATION FLAGS - QON = (1.0 - QOFF); + QON = (1.0 - QOFF); // IMPORTANT LENGTHS - TSI = `C_EPSSIL / COX; - TOX = `C_EPSOX / COX; - LC = sqrt(TSI * XJ); // NOTE: used in the Velocity Saturation model + TSI = `C_EPSSIL / COX; + TOX = `C_EPSOX / COX; + LC = sqrt(TSI * XJ); // NOTE: used in the Velocity Saturation model // NOMINAL TEMPERATURE PARAMETERS - TNOMK = TNOM + 273.15; // Nominal temperature of model parameters in Kelvin - UTNOM = `UT(TNOMK); + TNOMK = TNOM + 273.15; // Nominal temperature of model parameters in Kelvin + UTNOM = `UT(TNOMK); end // GENERAL_VALUES // SCALING OF NON-INSTANCE RELATED DIMENSIONS - hdif = HDIF * SCALE; - ldif = LDIF * SCALE; + hdif = HDIF * SCALE; + ldif = LDIF * SCALE; // FREQUENTLY PERFOMED CALCULATIONS - TOX2 = TOX * TOX; + TOX2 = TOX * TOX; end @@ -205,119 +205,119 @@ end // INSTANCE LEVEL CALCULATIONS // //////////////////////////////////////////////////////////////////////////////// -`INSTANCE +`INSTANCE begin // This variable is set in order to overcome the modulo (%) operand problem in ADMS - even_nf =(NF/2); - even_nf =even_nf*2; + even_nf =(NF/2); + even_nf =even_nf*2; // FREQUENTLY PERFOMED CALCULATIONS - NF_M = NF * M; - SIGN_NF = SIGN * NF; - SIGN_M = SIGN * M; - SIGN_NF_M = SIGN * NF_M; + NF_M = NF * M; + SIGN_NF = SIGN * NF; + SIGN_M = SIGN * M; + SIGN_NF_M = SIGN * NF_M; begin : EFFECTIVE_GATE_LENGTH_AND_WIDTH___SCALING // SCALING OF INSTANCE RELATED DIMENSIONS - l = L * SCALE + XL; - WF = W / NF; // NOTE: W is the drawn width of the device, while WF is the drawn width of each finger. - w = WF * SCALE + XW; // NOTE: w is the scaled width of each finger. + l = L * SCALE + XL; + WF = W / NF; // NOTE: W is the drawn width of the device, while WF is the drawn width of each finger. + w = WF * SCALE + XW; // NOTE: w is the scaled width of each finger. // EFFECTIVE CHANNEL DIMENSIONS - Leff = (LL == 0.0) ? - l + DL + WDL / w: - l + DL + WDL / w - LL * limexp(LLN * ln(1.0 / l)); - Weff = w + DW + LDW / l; // NOTE: Weff is the effective width of each finger. - Leffc = Leff + DLC; - Weffc = Weff + DWC; // NOTE: Weffc is the effective width, for capacitive aspects, of each finger. -// LIMITING CHANNEL DIMENSIONS TO HIGHER THAN 1nm - Leff = `MAX(Leff ,1.0e-9); - Weff = `MAX(Weff ,1.0e-9); - Leffc = `MAX(Leffc,1.0e-9); - Weffc = `MAX(Weffc,1.0e-9); + Leff = (LL == 0.0) ? + l + DL + WDL / w: + l + DL + WDL / w - LL * limexp(LLN * ln(1.0 / l)); + Weff = w + DW + LDW / l; // NOTE: Weff is the effective width of each finger. + Leffc = Leff + DLC; + Weffc = Weff + DWC; // NOTE: Weffc is the effective width, for capacitive aspects, of each finger. +// LIMITING CHANNEL DIMENSIONS TO HIGHER THAN 1nm + Leff = `MAX(Leff ,1.0e-9); + Weff = `MAX(Weff ,1.0e-9); + Leffc = `MAX(Leffc,1.0e-9); + Weffc = `MAX(Weffc,1.0e-9); // FREQUENTLY PERFOMED CALCULATIONS - WeffNF = Weff * NF; - WeffcNF = Weffc * NF; - WLeff = Weff * Leff; // NOTE: WLeff is the channel area of each finger. - WLeffNF = WeffNF * Leff; // NOTE: WLeffNF is the channel area of the whole device. - Leff2 = Leff * Leff; - rWedge = WEDGE/Weff; // NOTE: Edge device width over full width ratio - rWNedge = 1.0 - rWedge; // NOTE: Non-edge device width over full width ratio - rWNWedge = rWedge / rWNedge; // NOTE: Non-edge over edge width ratio + WeffNF = Weff * NF; + WeffcNF = Weffc * NF; + WLeff = Weff * Leff; // NOTE: WLeff is the channel area of each finger. + WLeffNF = WeffNF * Leff; // NOTE: WLeffNF is the channel area of the whole device. + Leff2 = Leff * Leff; + rWedge = WEDGE/Weff; // NOTE: Edge device width over full width ratio + rWNedge = 1.0 - rWedge; // NOTE: Non-edge device width over full width ratio + rWNWedge = rWedge / rWNedge; // NOTE: Non-edge over edge width ratio end // EFFECTIVE_GATE_LENGTH_AND_WIDTH___SCALING begin : MATCHING_PROPERTIES // FREQUENTLY PERFOMED CALCULATIONS - awl = 1.0E6 / sqrt(WLeffNF); + awl = 1.0E6 / sqrt(WLeffNF); // VTO, GAMMA, KP MISMATCH CALCULATIONS - VTO_a = VTO + AVTO * awl; - GAMMA_a = GAMMA + AGAMMA * awl; - KP_a = KP * (1.0 + AKP * awl); + VTO_a = VTO + AVTO * awl; + GAMMA_a = GAMMA + AGAMMA * awl; + KP_a = KP * (1.0 + AKP * awl); end // MATCHING_PROPERTIES begin : LONG_AND_WIDE_CHANNEL_VTO_CORRECTION // THRESHOLD VOLTAGE CORRECTION FOR LONG AND WIDE CHANNEL - DVT_long = - AVT * `MAXA(ln(Leff / LVT),0.0,1.0e-2); - DVT_wide = - AVT * `MAXA(ln(Weff / WVT),0.0,1.0e-2); + DVT_long = - AVT * `MAXA(ln(Leff / LVT),0.0,1.0e-2); + DVT_wide = - AVT * `MAXA(ln(Weff / WVT),0.0,1.0e-2); end // LONG_AND_WIDE_CHANNEL_VTO_CORRECTION begin : LONG_AND_WIDE_CHANNEL_GAMMA_CORRECTION // BODY EFFECT COEFFICIENT CORRECTION FOR LONG AND WIDE CHANNEL - DGAMMA_long = - AGAM * `MAXA(ln(Leff / LGAM),0.0,1.0e-2); - DGAMMA_wide = - AGAM * `MAXA(ln(Weff / WGAM),0.0,1.0e-2); + DGAMMA_long = - AGAM * `MAXA(ln(Leff / LGAM),0.0,1.0e-2); + DGAMMA_wide = - AGAM * `MAXA(ln(Weff / WGAM),0.0,1.0e-2); end // LONG_AND_WIDE_CHANNEL_GAMMA_CORRECTION -begin : NF_DEPENDENCE_ON_THRESHOLD_VOLTAGE +begin : NF_DEPENDENCE_ON_THRESHOLD_VOLTAGE // THRESHOLD VOLTAGE DEPENDENCE ON NUMBER OF FINGERS // EMPIRICAL MODEL, OBSOLETE BY SHALLOW TRENCH ISOLATION STRESS EFFECT - DVT_nf = NFVTA * log(((NF)-1)*NFVTB+1); -end // NF_DEPENDENCE_ON_THRESHOLD_VOLTAGE + DVT_nf = NFVTA * log(((NF)-1)*NFVTB+1); +end // NF_DEPENDENCE_ON_THRESHOLD_VOLTAGE -begin : WIDTH_SCALING +begin : WIDTH_SCALING // WIDTH SCALING OF MODEL PARAMETERS FOR NARROW CHANNEL DEVICES - LR_w = LR + WLR / Weff; - QLR_w = QLR * (1.0 + WQLR / Weff); - NLR_w = NLR * (1.0 + WNLR / Weff); - E0_w = E0 * (1.0 + WE0 / Weff); - E1_w = E1 * (1.0 + WE1 / Weff); - UCRIT_w = UCRIT * (1.0 + WUCRIT / Weff); - LAMBDA_w = LAMBDA * (1.0 + WLAMBDA / Weff); - ETAD_w = ETAD * (1.0 + WETAD / Weff); - TCV_w = TCV + TCVW / Weff; - UCEX_w = UCEX * (1.0 + WUCEX / Weff); + LR_w = LR + WLR / Weff; + QLR_w = QLR * (1.0 + WQLR / Weff); + NLR_w = NLR * (1.0 + WNLR / Weff); + E0_w = E0 * (1.0 + WE0 / Weff); + E1_w = E1 * (1.0 + WE1 / Weff); + UCRIT_w = UCRIT * (1.0 + WUCRIT / Weff); + LAMBDA_w = LAMBDA * (1.0 + WLAMBDA / Weff); + ETAD_w = ETAD * (1.0 + WETAD / Weff); + TCV_w = TCV + TCVW / Weff; + UCEX_w = UCEX * (1.0 + WUCEX / Weff); end // WIDTH_SCALING begin : LENGTH_SCALING // LENGTH SCALING OF MODEL PARAMETERS FOR SHORT CHANNEL DEVICES - WR_l = WR + LWR / Leff; - QWR_l = QWR * (1.0 + LQWR / Leff); - NWR_l = NWR * (1.0 + LNWR / Leff); - TCV_wl = TCV_w + TCVL / Leff; + WR_l = WR + LWR / Leff; + QWR_l = QWR * (1.0 + LQWR / Leff); + NWR_l = NWR * (1.0 + LNWR / Leff); + TCV_wl = TCV_w + TCVL / Leff; end // LENGTH_SCALING begin : COMBINED_SHORT_AND_NARROW_DEVICES // SCALING OF MODEL PARAMETERS FOR COMBINED SHORT AND NARROW CHANNEL DEVICES - TCV_wlc = TCV_wl + TCVWL / WLeff; + TCV_wlc = TCV_wl + TCVWL / WLeff; end // COMBINED_SHORT_AND_NARROW_DEVICES begin : RSCE // REVERSE SHORT CHANNEL EFFECT - Leff_o_LR = Leff / LR_w; - tmp_rsce = 1.0 - limexp( - Leff_o_LR * Leff_o_LR); - f_rsce = 2.0 * tmp_rsce / (COX * Leff_o_LR); - DVT_rsce = QLR_w * f_rsce; - fn_rsce = 1.0 + NLR_w * f_rsce; - MGAMMA_rcse = sqrt(fn_rsce); - DPHIF_rsce = UTNOM * FLR * ln(fn_rsce); + Leff_o_LR = Leff / LR_w; + tmp_rsce = 1.0 - limexp( - Leff_o_LR * Leff_o_LR); + f_rsce = 2.0 * tmp_rsce / (COX * Leff_o_LR); + DVT_rsce = QLR_w * f_rsce; + fn_rsce = 1.0 + NLR_w * f_rsce; + MGAMMA_rcse = sqrt(fn_rsce); + DPHIF_rsce = UTNOM * FLR * ln(fn_rsce); end // RSCE begin : INWE // INVERSE NARROW WIDTH EFFECT -// Weff_o_WR = Weff / WR; = > Weff_o_WR = Weff / WR_l; - Weff_o_WR = Weff / WR_l; - tmp_inwe = 1.0 - limexp( - Weff_o_WR * Weff_o_WR); +// Weff_o_WR = Weff / WR; = > Weff_o_WR = Weff / WR_l; + Weff_o_WR = Weff / WR_l; + tmp_inwe = 1.0 - limexp( - Weff_o_WR * Weff_o_WR); // bACK TO ORIGINAL f_inwe = - 2.0 * tmp_inwe / (COX * Weff_o_WR) => 2.0 * tmp_inwe / (COX * Weff_o_WR) - f_inwe = 2.0 * tmp_inwe / (COX * Weff_o_WR); - DVT_inwe = - QWR_l * f_inwe; - MGAMMA_inwe = 1.0 / sqrt(1.0 + NWR_l * f_inwe); + f_inwe = 2.0 * tmp_inwe / (COX * Weff_o_WR); + DVT_inwe = - QWR_l * f_inwe; + MGAMMA_inwe = 1.0 / sqrt(1.0 + NWR_l * f_inwe); end // INWE @@ -325,104 +325,104 @@ end // INWE begin : MOBILITY_LENGTH_SCALING // LENGTH SCALING OF THE MOBILITY FOR SHORT AND INTERMEDIATE LENGTH CHANNEL DEVICES - Leff_o_LA = Leff / LA; - Leff_o_LB = Leff / LB; - MKP_l = 1.0 / (1.0 + (KA / Leff_o_LA) * (1.0 - limexp( - Leff_o_LA)) + (KB / Leff_o_LB) * (1.0 - limexp( - Leff_o_LB))); + Leff_o_LA = Leff / LA; + Leff_o_LB = Leff / LB; + MKP_l = 1.0 / (1.0 + (KA / Leff_o_LA) * (1.0 - limexp( - Leff_o_LA)) + (KB / Leff_o_LB) * (1.0 - limexp( - Leff_o_LB))); end // MOBILITY_LENGTH_SCALING begin : MOBILITY_WIDTH_SCALING // WIDTH SCALING OF THE MOBILITY AROUND THE VALUE OF WKP1 PARAMETER - tmp_kpw = (ln(Weff / WKP1)) / WKP3; - MKP_w = 1.0 + WKP2 * limexp( - tmp_kpw * tmp_kpw); + tmp_kpw = (ln(Weff / WKP1)) / WKP3; + MKP_w = 1.0 + WKP2 * limexp( - tmp_kpw * tmp_kpw); end // MOBILITY_WIDTH_SCALING begin : STI_STRESS // SHALLOW TRENCH ISOLATION STRESS EFFECT - if ((SA > 0) && (SB > 0)) // NOTE: Basic STI parameters - begin + if ((SA > 0) && (SB > 0)) // NOTE: Basic STI parameters + begin // FREQUENTLY PERFOMED CALCULATIONS - lhalf_sti = 0.5 * l; - SA_lhalf_sti = SA + lhalf_sti; - SB_lhalf_sti = SB + lhalf_sti; - SD_l_sti = SD + l; - - i_sti = 0.0; // NOTE: Index used in multi-finger devices in for-loop. - if (NF == 1) // For single-finger devices - begin - inv_sa05l = 1.0 / (SA_lhalf_sti); - inv_sb05l = 1.0 / (SB_lhalf_sti); - end - else if (NF > 1) // For multi-finger devices (for-loop calculation) - begin - inv_sa05l = 1.0 / (SA_lhalf_sti); - inv_sb05l = 1.0 / (SB_lhalf_sti); + lhalf_sti = 0.5 * l; + SA_lhalf_sti = SA + lhalf_sti; + SB_lhalf_sti = SB + lhalf_sti; + SD_l_sti = SD + l; + + i_sti = 0.0; // NOTE: Index used in multi-finger devices in for-loop. + if (NF == 1) // For single-finger devices + begin + inv_sa05l = 1.0 / (SA_lhalf_sti); + inv_sb05l = 1.0 / (SB_lhalf_sti); + end + else if (NF > 1) // For multi-finger devices (for-loop calculation) + begin + inv_sa05l = 1.0 / (SA_lhalf_sti); + inv_sb05l = 1.0 / (SB_lhalf_sti); // for loop replaced with while -// for (i_sti = 1.0; i_sti < NF; i_sti = i_sti + 1.0) +// for (i_sti = 1.0; i_sti < NF; i_sti = i_sti + 1.0) i_sti = 1.0; while(i_sti < NF) - begin - inv_sa05l = inv_sa05l + 1.0 / (SA_lhalf_sti + i_sti * SD_l_sti); - inv_sb05l = inv_sb05l + 1.0 / (SB_lhalf_sti + i_sti * SD_l_sti); + begin + inv_sa05l = inv_sa05l + 1.0 / (SA_lhalf_sti + i_sti * SD_l_sti); + inv_sb05l = inv_sb05l + 1.0 / (SB_lhalf_sti + i_sti * SD_l_sti); i_sti = i_sti + 1.0; - end - inv_sa05l = inv_sa05l / NF; - inv_sb05l = inv_sb05l / NF; - - end - else // For completeness - begin - inv_sa05l = 1.0; - inv_sb05l = 1.0; - end - - inv_saref05l = 1.0 / (SAREF + lhalf_sti); - inv_sbref05l = 1.0 / (SBREF + lhalf_sti); - - tmpl = limexp(-LLODKKP*ln(l)); - tmpw = limexp(-WLODKKP*ln(w+WLOD)); - KKP_sti = (1.0 + LKKP * tmpl + WKKP * tmpw + PKKP * tmpl * tmpw); - a_sti = KKP / KKP_sti * (inv_sa05l + inv_sb05l); - aref_sti = KKP / KKP_sti * (inv_saref05l + inv_sbref05l); - MKP_sti = (1.0 + a_sti) / (1.0 + aref_sti); - MUCRIT_sti = (1.0 + KUCRIT * a_sti) / (1.0 + KUCRIT * aref_sti); - tmpl = limexp(-LLODKVTO*ln(l)); - tmpw = limexp(-WLODKVTO*ln(w+WLOD)); - KVTO_sti = 1.0 + LKVTO * tmpl + WKVTO * tmpw + PKVTO * tmpl * tmpw; - b_sti = inv_sa05l + inv_sb05l - inv_saref05l - inv_sbref05l; - DVT_sti = KVTO / KVTO_sti * b_sti; - DGAMMA_sti = KGAMMA / limexp(LODKGAMMA*ln(KVTO_sti)) * b_sti; - DETAD_sti = KETAD / limexp(LODKETAD*ln(KVTO_sti)) * b_sti; - end - else // NOTE: If no basic STI parameters have been defined (are zero) - begin - inv_sa05l = 1.0; - inv_sb05l = 1.0; - inv_saref05l = 1.0; - inv_sbref05l = 1.0; - KKP_sti = 1.0; - MKP_sti = 1.0; - MUCRIT_sti = 1.0; - DVT_sti = 0.0; - DGAMMA_sti = 0.0; - DETAD_sti = 0.0; - end + end + inv_sa05l = inv_sa05l / NF; + inv_sb05l = inv_sb05l / NF; + + end + else // For completeness + begin + inv_sa05l = 1.0; + inv_sb05l = 1.0; + end + + inv_saref05l = 1.0 / (SAREF + lhalf_sti); + inv_sbref05l = 1.0 / (SBREF + lhalf_sti); + + tmpl = limexp(-LLODKKP*ln(l)); + tmpw = limexp(-WLODKKP*ln(w+WLOD)); + KKP_sti = (1.0 + LKKP * tmpl + WKKP * tmpw + PKKP * tmpl * tmpw); + a_sti = KKP / KKP_sti * (inv_sa05l + inv_sb05l); + aref_sti = KKP / KKP_sti * (inv_saref05l + inv_sbref05l); + MKP_sti = (1.0 + a_sti) / (1.0 + aref_sti); + MUCRIT_sti = (1.0 + KUCRIT * a_sti) / (1.0 + KUCRIT * aref_sti); + tmpl = limexp(-LLODKVTO*ln(l)); + tmpw = limexp(-WLODKVTO*ln(w+WLOD)); + KVTO_sti = 1.0 + LKVTO * tmpl + WKVTO * tmpw + PKVTO * tmpl * tmpw; + b_sti = inv_sa05l + inv_sb05l - inv_saref05l - inv_sbref05l; + DVT_sti = KVTO / KVTO_sti * b_sti; + DGAMMA_sti = KGAMMA / limexp(LODKGAMMA*ln(KVTO_sti)) * b_sti; + DETAD_sti = KETAD / limexp(LODKETAD*ln(KVTO_sti)) * b_sti; + end + else // NOTE: If no basic STI parameters have been defined (are zero) + begin + inv_sa05l = 1.0; + inv_sb05l = 1.0; + inv_saref05l = 1.0; + inv_sbref05l = 1.0; + KKP_sti = 1.0; + MKP_sti = 1.0; + MUCRIT_sti = 1.0; + DVT_sti = 0.0; + DGAMMA_sti = 0.0; + DETAD_sti = 0.0; + end end // STI_STRESS // CALCULATIONS OF THE DEVICE LEVEL PARAMETERS - VTO_DEV = VTO_a + SIGN * (DVT_long + DVT_wide + DVT_rsce + DVT_inwe + DVT_nf + DVT_sti); // NOTE: SIGN switches the sign of the threshold voltage shift of each effect. VTO_DEV is negative for PMOS devices. - GAMMA_DEV = GAMMA_a * MGAMMA_rcse * MGAMMA_inwe + DGAMMA_sti + DGAMMA_long + DGAMMA_wide; - PHIF_DEV = PHIF + DPHIF_rsce; - KP_DEV = KP_a * MKP_l * MKP_w * MKP_sti; - ETAD_DEV = ETAD_w + DETAD_sti; - UCRIT_DEV = UCRIT_w * MUCRIT_sti; + VTO_DEV = VTO_a + SIGN * (DVT_long + DVT_wide + DVT_rsce + DVT_inwe + DVT_nf + DVT_sti); // NOTE: SIGN switches the sign of the threshold voltage shift of each effect. VTO_DEV is negative for PMOS devices. + GAMMA_DEV = GAMMA_a * MGAMMA_rcse * MGAMMA_inwe + DGAMMA_sti + DGAMMA_long + DGAMMA_wide; + PHIF_DEV = PHIF + DPHIF_rsce; + KP_DEV = KP_a * MKP_l * MKP_w * MKP_sti; + ETAD_DEV = ETAD_w + DETAD_sti; + UCRIT_DEV = UCRIT_w * MUCRIT_sti; begin : CHARGE_SHARING // DEVICE LEVEL PARAMETERS FOR CHARGE SHARING EFFECT - CHSHL = LETA0 + LETA / Leff + LETA2 / Leff2; - CHSHW = WETA / Weff; - NUV = N0 + NCS * 3.0 * TOX * CHSHL; - CHSHLTSI = CHSHL * TSI; - CHSHWTSI = CHSHW * TSI; + CHSHL = LETA0 + LETA / Leff + LETA2 / Leff2; + CHSHW = WETA / Weff; + NUV = N0 + NCS * 3.0 * TOX * CHSHL; + CHSHLTSI = CHSHL * TSI; + CHSHWTSI = CHSHW * TSI; end // CHARGE_SHARING //////////////////////////////////////////////////////////////////////////////// @@ -432,48 +432,48 @@ end // CHARGE_SHARING begin : STANDARD_VALUES // TEMPERATURE PARAMETERS - T = $temperature; // Simulation temperature of the device in Kelvin - UT = `UT(T); + T = $temperature; // Simulation temperature of the device in Kelvin + UT = `UT(T); // FREQUENTLY PERFORMED CALCULATIONS - dT = T - TNOMK; - dT2 = dT * dT; - rT = T / TNOMK; - lnrT = ln(rT); - UT2 = UT * UT; - UT3 = UT * UT2; - sqrtUT = sqrt(UT); - KT4 = 4.0 * `C_K * T; + dT = T - TNOMK; + dT2 = dT * dT; + rT = T / TNOMK; + lnrT = ln(rT); + UT2 = UT * UT; + UT3 = UT * UT2; + sqrtUT = sqrt(UT); + KT4 = 4.0 * `C_K * T; end // STANDARD_VALUES begin : TEMPERATURE_ON_STI // TEMPERATURE EFFECT ON STI STRESS EFFECT - if ((SA > 0) && (SB > 0)) - begin - KKP_sti_t = KKP_sti * (1.0 + TKKP * (rT - 1.0)); - a_sti_t = KKP / KKP_sti_t * (inv_sa05l + inv_sb05l); - aref_sti_t = KKP / KKP_sti_t * (inv_saref05l + inv_sbref05l); - MKP_sti_t = (1.0 + a_sti_t) / (1.0 + aref_sti_t) / MKP_sti; - end - else - begin - MKP_sti_t = 1.0; - end + if ((SA > 0) && (SB > 0)) + begin + KKP_sti_t = KKP_sti * (1.0 + TKKP * (rT - 1.0)); + a_sti_t = KKP / KKP_sti_t * (inv_sa05l + inv_sb05l); + aref_sti_t = KKP / KKP_sti_t * (inv_saref05l + inv_sbref05l); + MKP_sti_t = (1.0 + a_sti_t) / (1.0 + aref_sti_t) / MKP_sti; + end + else + begin + MKP_sti_t = 1.0; + end end // TEMPERATURE_ON_STI begin : TEMPERATURE // MODEL PARAMETERS AFFECTED BY TEMPERATURE - VTO_DEV_t = VTO_DEV - TCV_wlc * dT; // NOTE: VTO_DEV_t is negative for PMOS devices. - KP_DEV_t = KP_DEV * limexp(BEX * lnrT) * MKP_sti_t; - ETA_t = ETA + (TETA * dT); - E0_wt = E0_w * limexp(TE0EX * lnrT); - E1_wt = E1_w * limexp(TE1EX * lnrT); - UCRIT_DEV_t = UCRIT_DEV * limexp(UCEX_w * lnrT); - LAMBDA_wt = LAMBDA_w + TLAMBDA * (rT - 1.0); - IBB_t = IBB * (1.0 + IBBT * dT); + VTO_DEV_t = VTO_DEV - TCV_wlc * dT; // NOTE: VTO_DEV_t is negative for PMOS devices. + KP_DEV_t = KP_DEV * limexp(BEX * lnrT) * MKP_sti_t; + ETA_t = ETA + (TETA * dT); + E0_wt = E0_w * limexp(TE0EX * lnrT); + E1_wt = E1_w * limexp(TE1EX * lnrT); + UCRIT_DEV_t = UCRIT_DEV * limexp(UCEX_w * lnrT); + LAMBDA_wt = LAMBDA_w + TLAMBDA * (rT - 1.0); + IBB_t = IBB * (1.0 + IBBT * dT); // PHIF - eg_tnom = 1.16 - (7.02E-4 * TNOMK * TNOMK) / (TNOMK + 1108.0); // NOTE: Also used for junction diode temperature dependence - eg_t = 1.16 - (7.02E-4 * T * T) / (T + 1108); // NOTE: Also used for junction diode temperature dependence - PHIF_DEV_t = PHIF_DEV * rT + (- UT * 3.0 * lnrT + eg_t - eg_tnom * rT) / 2.0; + eg_tnom = 1.16 - (7.02E-4 * TNOMK * TNOMK) / (TNOMK + 1108.0); // NOTE: Also used for junction diode temperature dependence + eg_t = 1.16 - (7.02E-4 * T * T) / (T + 1108); // NOTE: Also used for junction diode temperature dependence + PHIF_DEV_t = PHIF_DEV * rT + (- UT * 3.0 * lnrT + eg_t - eg_tnom * rT) / 2.0; end // TEMPERATURE //////////////////////////////////////////////////////////////////////////////// @@ -484,37 +484,37 @@ end // TEMPERATURE begin : NORMALIZING // CALCULATING NORMALIZED VALUES OF INTRINSIC PART PARAMETERS -// FERMI POTENTIAL -// phif = PHIF_DEV_t / UT; +// FERMI POTENTIAL +// phif = PHIF_DEV_t / UT; // PHIF is limited with a lower bound in order to avoid negative values. - phif = `MAXA(PHIF_DEV_t / UT,0.0,0.01); + phif = `MAXA(PHIF_DEV_t / UT,0.0,0.01); // THRESHOLD VOLTAGE (UNDER ZERO BIAS) - vto = SIGN * VTO_DEV_t / UT; // NOTE: The normalized vto is positive for both NMOS and PMOS devices. + vto = SIGN * VTO_DEV_t / UT; // NOTE: The normalized vto is positive for both NMOS and PMOS devices. // BODY EFFECT COEFFICIENT - gamma_b_dev = GAMMA_DEV / sqrtUT; + gamma_b_dev = GAMMA_DEV / sqrtUT; // POLYSILICON DEPLETION, GATE NODE COEFFICIENT - gamma_g = GAMMAG / sqrtUT; + gamma_g = GAMMAG / sqrtUT; // OVERLAP REGION, BODY EFFECT COEFFICIENT, GATE NODE COEFFICIENT, FLAT-BAND VOLTAGE - gamma_ov = GAMMAOV / sqrtUT; - gamma_g_ov = GAMMAGOV / sqrtUT; - vfb_ov = VFBOV / UT; + gamma_ov = GAMMAOV / sqrtUT; + gamma_g_ov = GAMMAGOV / sqrtUT; + vfb_ov = VFBOV / UT; // VELOCITY SATURATION EFFECT, CRITICAL VELOCITY - ucrit = UCRIT_DEV_t / (UT / Leff); + ucrit = UCRIT_DEV_t / (UT / Leff); // GATE CURRENT PARAMETERS - xb = XB / UT; - ub = EB * TOX / XB; + xb = XB / UT; + ub = EB * TOX / XB; // MOBILITY REDUCED DUE TO VERTICAL FIELD EFFECT PARAMETERS - ev = UT / (E0_wt * TSI); - tmp = E1_wt * TSI; - ev1 = UT2 / (tmp * tmp); + ev = UT / (E0_wt * TSI); + tmp = E1_wt * TSI; + ev1 = UT2 / (tmp * tmp); // FREQUENTLY PERFORMED CALCULATIONS - sqrtphif = sqrt(phif); - gamma_b_dev2 = gamma_b_dev * gamma_b_dev; - gamma_g2 = gamma_g * gamma_g; - dpd = (TG != 0) ? - gamma_b_dev2 / gamma_g2 : - 0.0; - gamma_ov2 = gamma_ov * gamma_ov; + sqrtphif = sqrt(phif); + gamma_b_dev2 = gamma_b_dev * gamma_b_dev; + gamma_g2 = gamma_g * gamma_g; + dpd = (TG != 0) ? + gamma_b_dev2 / gamma_g2 : + 0.0; + gamma_ov2 = gamma_ov * gamma_ov; end // NORMALIZING //////////////////////////////////////////////////////////////////////////////// @@ -524,46 +524,46 @@ end // NORMALIZING //////////////////////////////////////////////////////////////////////////////// // NQ0: SLOPE FACTOR (CHARGE) CALCULATED UNDER ZERO BIAS - nq0 = (TG < 0) ? - (1.0 / (1.0 + (dpd * 2.0 * `SQRT2 * sqrtphif / gamma_b_dev)) + gamma_b_dev / (2.0 * `SQRT2 * sqrtphif)) : - 1.0 + (gamma_b_dev / (2.0 * `SQRT2 * sqrtphif)); + nq0 = (TG < 0) ? + (1.0 / (1.0 + (dpd * 2.0 * `SQRT2 * sqrtphif / gamma_b_dev)) + gamma_b_dev / (2.0 * `SQRT2 * sqrtphif)) : + 1.0 + (gamma_b_dev / (2.0 * `SQRT2 * sqrtphif)); begin : QUANTUM_MECHANICAL_EFFECT // BIAS INDEPENDENT CALCULATIONS FOR THE ACCUMULATION REGION - aqma = AQMA * limexp(`ONE3RD * ln(COX * COX / UT)); - axetaqm2_3 = aqma * limexp(`TWO3RDS * ln(ETAQM)); + aqma = AQMA * limexp(`ONE3RD * ln(COX * COX / UT)); + axetaqm2_3 = aqma * limexp(`TWO3RDS * ln(ETAQM)); // QUANTUM MECHANICAL EFFECT ON SURFACE POTENTIAL SHIFT - dqmi = `ONE3RD * AQMI * limexp(`TWO3RDS * ln(gamma_b_dev * COX * 0.5 / (sqrtUT * phif))) * (2.0 * `SQRT2 * ETAQM * nq0 * sqrtphif / gamma_b_dev - 1.0); - inv_dqmip1 = 1.0 / ( 1.0 + dqmi); - dpsi0 = AQMI * limexp(`TWO3RDS * ln(gamma_b_dev * COX * `SQRT2 * sqrtphif)); - DPSI0 = dpsi0 * UT; // NOTE: Denormalized value of the surface potential shift. + dqmi = `ONE3RD * AQMI * limexp(`TWO3RDS * ln(gamma_b_dev * COX * 0.5 / (sqrtUT * phif))) * (2.0 * `SQRT2 * ETAQM * nq0 * sqrtphif / gamma_b_dev - 1.0); + inv_dqmip1 = 1.0 / ( 1.0 + dqmi); + dpsi0 = AQMI * limexp(`TWO3RDS * ln(gamma_b_dev * COX * `SQRT2 * sqrtphif)); + DPSI0 = dpsi0 * UT; // NOTE: Denormalized value of the surface potential shift. end // QUANTUM_MECHANICAL_EFFECT // CALCULATION OF PHI, (or PSI0), USED IN CALCULATION OF PINCH-OFF VOLTAGE AFTER PINCH-OFF SURFACE POTENTIAL // AND FOR THE CALCULATION OF FLAT-BAND VOLTAGE AFTER THRESHOLD VOLTAGE - phi = phif * 2.0 + ln (4.0 * nq0 * sqrtphif * `SQRT2 / gamma_b_dev) + dpsi0; + phi = phif * 2.0 + ln (4.0 * nq0 * sqrtphif * `SQRT2 / gamma_b_dev) + dpsi0; // FREQUENTLY PERFORMED CALCULATION - sqrtphi = sqrt(phi); + sqrtphi = sqrt(phi); // CALCULATION OF VBI (BUILT-IN VOLTAGE), USED IN CHARGE SHARING MODEL AND FLAT-BAND VOLTAGE -// VBI IS NOMINALLY 3*UT HIGHER THAN PHI BUT MAY, AS WELL, BE DEFINED MANUALLY BY THE USER - if (VBI == 0.0) // NOTE: VBI has the physically non-logical default value of 0.0, so this 'if' statement checks if VBI has been redefined by the user, or not. - begin - nul = 3.0; - vbi = phi + nul; - end - else // NOTE: The following code is used when VBI is set to a value other than the default. - begin - vbi = VBI / UT; - nul = vbi - phi; - end +// VBI IS NOMINALLY 3*UT HIGHER THAN PHI BUT MAY, AS WELL, BE DEFINED MANUALLY BY THE USER + if (VBI == 0.0) // NOTE: VBI has the physically non-logical default value of 0.0, so this 'if' statement checks if VBI has been redefined by the user, or not. + begin + nul = 3.0; + vbi = phi + nul; + end + else // NOTE: The following code is used when VBI is set to a value other than the default. + begin + vbi = VBI / UT; + nul = vbi - phi; + end // FREQUENTLY PERFORMED CALCULATION - sqrtvbi = sqrt(vbi); + sqrtvbi = sqrt(vbi); begin : NORMALIZATION_FACTORS_FOR_CHARGES // CALCULATION OF NORMALIZATION FACTORS FOR CHARGES OF THE CHANNEL AND THE OVERLAP REGION. - tmp = WeffcNF * COX * UT * inv_dqmip1; - Q0 = - Leffc * tmp * rWNedge; - Q0OV = LOV * tmp; + tmp = WeffcNF * COX * UT * inv_dqmip1; + Q0 = - Leffc * tmp * rWNedge; + Q0OV = LOV * tmp; end // NORMALIZATION_FACTORS_FOR_CHARGES end @@ -579,74 +579,74 @@ end // THE EXACT NODES DEPEND ON THE MODE USED AND THE INTERNAL NODES CREATED. `ifdef DC_S - VS = V(s ,b ); - VD = V(d ,b ); - VG = V(g ,b ); + VS = V(s ,b ); + VD = V(d ,b ); + VG = V(g ,b ); `endif `ifdef DC - VS = V(si,b ); - VD = V(di,b ); - VG = V(g ,b ); + VS = V(si,b ); + VD = V(di,b ); + VG = V(g ,b ); `endif `ifdef RF_S - VS = V(si,bi); - VD = V(di,bi); - VG = V(gi,bi); + VS = V(si,bi); + VD = V(di,bi); + VG = V(gi,bi); `endif `ifdef RF - VS = V(si,bi); - VD = V(di,bi); - VG = V(gi,bi); + VS = V(si,bi); + VD = V(di,bi); + VG = V(gi,bi); `endif `ifdef NQS - VS = V(si,bi); - VD = V(di,bi); - VG = V(gi,bi); + VS = V(si,bi); + VD = V(di,bi); + VG = V(gi,bi); `endif begin : NORMALIZING_INPUT_VOLTAGES -// NORMALIZATION OF THE INPUT VOLTAGES, +// NORMALIZATION OF THE INPUT VOLTAGES, // SWAPPING ELECTRICAL AND PHYSICAL SOURCE AND DRAIN NODES IF NECESSARY, // SWITCHING SIGNS OF DIFFERENCE POTENTIALS FOR THE PMOS CASE. - if (SIGN * VD >= SIGN * VS) - begin - d_gt_s_flag = 1; - d_gt_s = 1; - s_gt_d = 0; - end - else - begin - d_gt_s_flag = -1; - d_gt_s = 0; - s_gt_d = 1; - end - vd = SIGN * (d_gt_s * VD + s_gt_d * VS) / UT; - vs = SIGN * (d_gt_s * VS + s_gt_d * VD) / UT; - vg = SIGN * VG / UT; + if (SIGN * VD >= SIGN * VS) + begin + d_gt_s_flag = 1; + d_gt_s = 1; + s_gt_d = 0; + end + else + begin + d_gt_s_flag = -1; + d_gt_s = 0; + s_gt_d = 1; + end + vd = SIGN * (d_gt_s * VD + s_gt_d * VS) / UT; + vs = SIGN * (d_gt_s * VS + s_gt_d * VD) / UT; + vg = SIGN * VG / UT; end // NORMALIZING_INPUT_VOLTAGES begin : EFFECTIVE_GAMMA_DUE_TO_CHARGE_SHARING_AND_POLYDEPLETION // CALCULATION OF EFFECTIVE BODY EFFECT COEFFICIENT DUE TO CHARGE SHARING AND POLYSILICON DEPLETION. // THE FOLLOWING VARIABLES ARE ALSO USED IN THE CALCULATION OF FLAT-BAND VOLTAGE (vfb), VG' (vg_p) AND VOLTAGE SLOPE FACTOR (nv). - chsh_1w = 1.0 + CHSHWTSI; // NOTE: Also used in "vfb" and "vg_p_chsh" - tmp_chsh1 = CHSHLTSI / gamma_b_dev; - tmp_chsh2 = tmp_chsh1 * (sqrt(`MAXA(vbi + vs,0.0,`POS_MIN)) + sqrt(`MAXA(vbi + vd,0.0,`POS_MIN))); - chsh_1l = 1.0 - tmp_chsh2; // NOTE: Also used in "nv" - tmp_chsh3 = CHSHWTSI * sqrtphi / gamma_b_dev; // NOTE: Also used in "tmp_vfb" - tmp_chsh3b = tmp_chsh3 + tmp_chsh3; - chsh_1wl = 1.0 - tmp_chsh2 - tmp_chsh2 + tmp_chsh3b; - chsh_1wlpd = chsh_1w + dpd * chsh_1wl; // NOTE: Also used in "vg_p_chsh_pd" and "nv" - gamma_b_chsh = gamma_b_dev * chsh_1l / chsh_1w; // NOTE: gamma_b_chsh takes into account charge sharing but not polydepletion. - gamma_b_eff = gamma_b_dev * chsh_1l / chsh_1wlpd; // NOTE: gamma_b_eff takes into account charge sharing and polydepletion. - tmp_chsh4 = tmp_chsh1 * 2.0 * sqrtvbi; // NOTE: Also used in "tmp_vfb" and "vfb" - chsh_1l0 = 1.0 - tmp_chsh4; - chsh_1wl0 = 1.0 - tmp_chsh4 - tmp_chsh4 + tmp_chsh3b; - chsh_1wlpd0 = chsh_1w + dpd * chsh_1wl0; // NOTE: Used ONLY in "vg_p_chsh_pd0" - gamma_b_chsh0 = gamma_b_dev * chsh_1l0 / chsh_1w; // NOTE: gamma_b_chsh0 takes into account charge sharing under zero longitudinal bias (VD=VS=0V) but not polydepletion. + chsh_1w = 1.0 + CHSHWTSI; // NOTE: Also used in "vfb" and "vg_p_chsh" + tmp_chsh1 = CHSHLTSI / gamma_b_dev; + tmp_chsh2 = tmp_chsh1 * (sqrt(`MAXA(vbi + vs,0.0,`POS_MIN)) + sqrt(`MAXA(vbi + vd,0.0,`POS_MIN))); + chsh_1l = 1.0 - tmp_chsh2; // NOTE: Also used in "nv" + tmp_chsh3 = CHSHWTSI * sqrtphi / gamma_b_dev; // NOTE: Also used in "tmp_vfb" + tmp_chsh3b = tmp_chsh3 + tmp_chsh3; + chsh_1wl = 1.0 - tmp_chsh2 - tmp_chsh2 + tmp_chsh3b; + chsh_1wlpd = chsh_1w + dpd * chsh_1wl; // NOTE: Also used in "vg_p_chsh_pd" and "nv" + gamma_b_chsh = gamma_b_dev * chsh_1l / chsh_1w; // NOTE: gamma_b_chsh takes into account charge sharing but not polydepletion. + gamma_b_eff = gamma_b_dev * chsh_1l / chsh_1wlpd; // NOTE: gamma_b_eff takes into account charge sharing and polydepletion. + tmp_chsh4 = tmp_chsh1 * 2.0 * sqrtvbi; // NOTE: Also used in "tmp_vfb" and "vfb" + chsh_1l0 = 1.0 - tmp_chsh4; + chsh_1wl0 = 1.0 - tmp_chsh4 - tmp_chsh4 + tmp_chsh3b; + chsh_1wlpd0 = chsh_1w + dpd * chsh_1wl0; // NOTE: Used ONLY in "vg_p_chsh_pd0" + gamma_b_chsh0 = gamma_b_dev * chsh_1l0 / chsh_1w; // NOTE: gamma_b_chsh0 takes into account charge sharing under zero longitudinal bias (VD=VS=0V) but not polydepletion. // FREQUENTLY PERFORMED CALCULATIONS - gamma_b_chsh2 = gamma_b_chsh * gamma_b_chsh; - gamma_b_eff2 = gamma_b_eff * gamma_b_eff; - gamma_b_chsh02 = gamma_b_chsh0 * gamma_b_chsh0; + gamma_b_chsh2 = gamma_b_chsh * gamma_b_chsh; + gamma_b_eff2 = gamma_b_eff * gamma_b_eff; + gamma_b_chsh02 = gamma_b_chsh0 * gamma_b_chsh0; end // EFFECTIVE_GAMMA_DUE_TO_CHARGE_SHARING_AND_POLYDEPLETION begin : FLAT_BAND_VOLTAGE @@ -654,27 +654,27 @@ begin : FLAT_BAND_VOLTAGE // vfb IS CALCULATED AFTER gamma_b_dev. "tmp_chsh3" and "tmp_chsh4" ARE CALCULATED AFTER gamma_b_dev AS WELL. // "tmp_chsh4", "tmp_chsh3", "chsh_1w" DEPEND ALSO ON CHARGE SHARING PARAMETERS // "dpd" DEPENDS ON POLYSILICON DEPLETION PARAMETERS - tmp_vfb = 1.0 - tmp_chsh4 + tmp_chsh3; - vfb = vto - phi * (chsh_1w + dpd * tmp_vfb * tmp_vfb) - gamma_b_dev * (1.0 - tmp_chsh4) * sqrtphi; + tmp_vfb = 1.0 - tmp_chsh4 + tmp_chsh3; + vfb = vto - phi * (chsh_1w + dpd * tmp_vfb * tmp_vfb) - gamma_b_dev * (1.0 - tmp_chsh4) * sqrtphi; end // FLAT_BAND_VOLTAGE begin : EFFECTIVE_GATE_VOLTAGE // CALCULATION OF THE EFFECTIVE GATE VOLTAGE (VG' or VG_PRIME) // TAKING INTO ACCOUNT VARIOUS EFFECTS EACH TIME - vg_p = vg - vfb; - vg_p_chsh = vg_p / chsh_1w; // NOTE: Including CHARGE SHARING, used in calculation of psi_po (appoximation of psi_p when psi_p is close to zero) and psi_po0 and of psi_p and psi_p0 in accumulation and of dpsiv of QUANTUM MECHANICAL EFFECTS. - vg_p_chsh_pd = vg_p / chsh_1wlpd; // NOTE: Including CHARGE SHARING and POLYDEPLETION and VD, VS BIAS DEPENDENCES, used in calculation of psi_p in depletion and inversion. - vg_p_chsh_pd0 = vg_p / chsh_1wlpd0; // NOTE: Including CHARGE SHARING and POLYDEPLETION at VD=VS=0V BIAS, used in calculation of psi_p0 in depletion and inversion. + vg_p = vg - vfb; + vg_p_chsh = vg_p / chsh_1w; // NOTE: Including CHARGE SHARING, used in calculation of psi_po (appoximation of psi_p when psi_p is close to zero) and psi_po0 and of psi_p and psi_p0 in accumulation and of dpsiv of QUANTUM MECHANICAL EFFECTS. + vg_p_chsh_pd = vg_p / chsh_1wlpd; // NOTE: Including CHARGE SHARING and POLYDEPLETION and VD, VS BIAS DEPENDENCES, used in calculation of psi_p in depletion and inversion. + vg_p_chsh_pd0 = vg_p / chsh_1wlpd0; // NOTE: Including CHARGE SHARING and POLYDEPLETION at VD=VS=0V BIAS, used in calculation of psi_p0 in depletion and inversion. end // EFFECTIVE_GATE_VOLTAGE begin : PSI_PO___APPROXIMATION_AROUND_PSI_P_EQUALS_ZERO // CALCULATION OF PSI_PO, APPROXIMATION OF PINCH-OFF SURFACE POTENTIAL (PSI_P) WHEN PSI_P IS CLOSE TO ZERO. // CHARGE SHARING EFFECT IS TAKEN INTO ACCOUNT, POLYDEPLETION DOES NOT EFFECT PSI_PO // PSI_PO IS USED FOR THE CALCULATION OF THE EXACT PINCH-OFF SURFACE POTENTIAL, AND ALSO FOR THE QUANTUM MECHANICAL EFFECT. - tmp = vg_p_chsh * 0.5 - 3.0 * (1.0 + gamma_b_chsh * `ONESQRT2); - psi_po = tmp + sqrt(tmp * tmp + 6.0 * vg_p_chsh); - tmp = vg_p_chsh * 0.5 - 3.0 * (1.0 + gamma_b_chsh0 * `ONESQRT2); - psi_po0 = tmp + sqrt(tmp * tmp + 6.0 * vg_p_chsh); // NOTE: Considering VD=VS=0V. + tmp = vg_p_chsh * 0.5 - 3.0 * (1.0 + gamma_b_chsh * `ONESQRT2); + psi_po = tmp + sqrt(tmp * tmp + 6.0 * vg_p_chsh); + tmp = vg_p_chsh * 0.5 - 3.0 * (1.0 + gamma_b_chsh0 * `ONESQRT2); + psi_po0 = tmp + sqrt(tmp * tmp + 6.0 * vg_p_chsh); // NOTE: Considering VD=VS=0V. end // PSI_PO___APPROXIMATION_AROUND_PSI_P_EQUALS_ZERO ///////////////////////////////// @@ -683,191 +683,191 @@ end // PSI_PO___APPROXIMATION_AROUND_PSI_P_EQUALS_ZERO begin : PINCH_OFF_SURFACE_POTENTIAL_VOLTAGE_SLOPE_FACTOR // CALCULATION OF THE PINCH-OFF SURFACE POTENTIAL (PSI_P), AFTER PSI_PO - if (vg_p < 0.0) // NOTE: Accumulation Region, only CHARGE SHARING affects PSI_P, not POLYDEPLETION. - begin - tmp = (psi_po - vg_p_chsh) / gamma_b_chsh; - psi_p = - ln(1.0 - psi_po + tmp * tmp); - tmp = (psi_po0 - vg_p_chsh) / gamma_b_chsh0; - psi_p0 = - ln(1.0 - psi_po0 + tmp * tmp); - end - else // NOTE: Depletion and Inversion Regions, CHARGE SHARING and POLYDEPLETION affect PSI_P - begin - one_m_epsilon = 1.0 - exp( - psi_po); - tmp = sqrt(vg_p_chsh_pd - one_m_epsilon + gamma_b_eff2 * 0.25) - gamma_b_eff * 0.5; - psi_p = tmp * tmp + one_m_epsilon; - one_m_epsilon = 1.0 - exp( - psi_po0); - tmp = sqrt(vg_p_chsh_pd0 - one_m_epsilon + gamma_b_chsh02 * 0.25) - gamma_b_chsh0 * 0.5; - psi_p0 = tmp * tmp + one_m_epsilon; - end + if (vg_p < 0.0) // NOTE: Accumulation Region, only CHARGE SHARING affects PSI_P, not POLYDEPLETION. + begin + tmp = (psi_po - vg_p_chsh) / gamma_b_chsh; + psi_p = - ln(1.0 - psi_po + tmp * tmp); + tmp = (psi_po0 - vg_p_chsh) / gamma_b_chsh0; + psi_p0 = - ln(1.0 - psi_po0 + tmp * tmp); + end + else // NOTE: Depletion and Inversion Regions, CHARGE SHARING and POLYDEPLETION affect PSI_P + begin + one_m_epsilon = 1.0 - exp( - psi_po); + tmp = sqrt(vg_p_chsh_pd - one_m_epsilon + gamma_b_eff2 * 0.25) - gamma_b_eff * 0.5; + psi_p = tmp * tmp + one_m_epsilon; + one_m_epsilon = 1.0 - exp( - psi_po0); + tmp = sqrt(vg_p_chsh_pd0 - one_m_epsilon + gamma_b_chsh02 * 0.25) - gamma_b_chsh0 * 0.5; + psi_p0 = tmp * tmp + one_m_epsilon; + end // FREQUENTLY PERFORMED CALCULATIONSekv3_edge.va - sqrt_psi_p = sqrt(`MAXA(psi_p ,1.0E-4,1.0E-2)); // NOTE: Ensuring positive argument for the square root function. - sqrt_psi_p0 = sqrt(`MAXA(psi_p0,1.0E-4,1.0E-2)); // NOTE: Ensuring positive argument for the square root function. + sqrt_psi_p = sqrt(`MAXA(psi_p ,1.0E-4,1.0E-2)); // NOTE: Ensuring positive argument for the square root function. + sqrt_psi_p0 = sqrt(`MAXA(psi_p0,1.0E-4,1.0E-2)); // NOTE: Ensuring positive argument for the square root function. // CALCULATION OF THE PINCH-OFF VOLTAGE, AFTER PINCH-OFF SURFACE POTENTIAL AND PHI - vp = psi_p - phi; -// CALCULATION OF SLOPE FACTOR NV - nv = chsh_1wlpd + gamma_b_dev * chsh_1l / (2.0 * sqrt_psi_p); // NOTE: Used for the calculation of COULOMB SCATTERING and MOBILITY REDUCTION DUE TO VERTICAL FIELD. + vp = psi_p - phi; +// CALCULATION OF SLOPE FACTOR NV + nv = chsh_1wlpd + gamma_b_dev * chsh_1l / (2.0 * sqrt_psi_p); // NOTE: Used for the calculation of COULOMB SCATTERING and MOBILITY REDUCTION DUE TO VERTICAL FIELD. end begin : DIBL // CALCULATION OF THE DRAIN INDUCED BARRIER LOWERING. - l0 = ETAD_DEV * TSI * sqrt(2.0 * sqrtphi / gamma_b_dev); - v_o_dibl = 4.0 + 40.0 * l0 / Leff; - v_o_dibl2 = v_o_dibl * v_o_dibl; - dv_dibl = `MINA(vp,`MINA(vs,vd ,v_o_dibl2),v_o_dibl2); - if (l0 == 0.0) - begin - deltapsis = 0.0; - end - else - begin - tmp = Leff / (l0 + l0); - deltapsis = exp( - tmp) * (2.0 + SIGMAD * tmp * dv_dibl / (2.0 * phi)) * sqrt((nul + vs - dv_dibl) * (nul + vd - dv_dibl)); // NOTE: deltapsis is used at the calculation of the normalized inversion charges at the source and drain ends. Effective PINCH-OFF VOLTAGE (vp_dibl) is increased by a factor of "deltapsis", due to DIBL. - end + l0 = ETAD_DEV * TSI * sqrt(2.0 * sqrtphi / gamma_b_dev); + v_o_dibl = 4.0 + 40.0 * l0 / Leff; + v_o_dibl2 = v_o_dibl * v_o_dibl; + dv_dibl = `MINA(vp,`MINA(vs,vd ,v_o_dibl2),v_o_dibl2); + if (l0 == 0.0) + begin + deltapsis = 0.0; + end + else + begin + tmp = Leff / (l0 + l0); + deltapsis = exp( - tmp) * (2.0 + SIGMAD * tmp * dv_dibl / (2.0 * phi)) * sqrt((nul + vs - dv_dibl) * (nul + vd - dv_dibl)); // NOTE: deltapsis is used at the calculation of the normalized inversion charges at the source and drain ends. Effective PINCH-OFF VOLTAGE (vp_dibl) is increased by a factor of "deltapsis", due to DIBL. + end end // DIBL // CALCULATION OF THE EFFECTIVE PINCH-OFF VOLTAGE DUE TO DIBL - vp_dibl = vp + deltapsis; + vp_dibl = vp + deltapsis; begin : NORMALIZED_FORWARD_CURRENT // CALCULATION OF NORMALIZED INVERSION CHARGE OF THE (ELECTRICAL) SOURCE SIDE - `QV(qs,(vp_dibl - vs)) + `QV(qs,(vp_dibl - vs)) // FREQUENTLY PERFORMED CALCULATION - qs2 = qs * qs; + qs2 = qs * qs; // CALCULATION OF THE NORMALIZED FORWARD CURRENT - if_ = qs2 + qs; + if_ = qs2 + qs; // FREQUENTLY PERFORMED CALCULATIONS - xf2 = if_ + 0.25; - xf = qs + 0.5; + xf2 = if_ + 0.25; + xf = qs + 0.5; end // NORMALIZED_FORWARD_CURRENT begin : VELOCITY_SATURATION // CALCULATIONS FOR THE VELOCITY SATURATION EFFECT AND THE CHANNEL LENGTH MODULATION // -- VELOCITY SATURATION (NOT DEPENDENT ON VD) - g_clm = 0.1; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION - e_clm = 2.0 / ucrit; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION - e_clm2 = e_clm * e_clm; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION - e_clmx2 = 2.0 * e_clm; - e_clmp2 = 2.0 + e_clm; - e_clmx2xqs = e_clmx2 * qs; - qsat = e_clmx2 * if_ / (e_clmp2 + e_clmx2xqs + sqrt(e_clmp2 * e_clmp2 + 4.0 * e_clmx2xqs)); // NOTE: The inversion charge at a point of maximum velocity saturation. - qs_qsat = qs - qsat; - qs_qsat2 = qs_qsat * qs_qsat; - mdm2 = 2.0 - DELTA; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION - e_clmxmdm2_2 = e_clm2 * mdm2 * mdm2; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION - tmp_vdsat1 = (2.0 * qsat + ln(qsat)) * (1.0 + e_clm * qs_qsat); - tmp_vdsat11 = g_clm + e_clm * mdm2 * qs_qsat; - tmp_vdsat2 = sqrt(1.0 + (2.0 * e_clm2 * mdm2 * mdm2 * qs_qsat2) / tmp_vdsat11 + e_clm2 * qs_qsat2); - vdsat = vp - tmp_vdsat1 / tmp_vdsat2; // NOTE: The potential at a point of the channel of maximum velocity saturation. - vdssat = `MAXA(vdsat - vs,3.0,4.0); // NOTE: The diffence potential along a fully velocity saturated part of the channel, limited to a minimum of 3*UT. Used also for the calculation of impact ionization current (ekv3_idb.va) + g_clm = 0.1; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION + e_clm = 2.0 / ucrit; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION + e_clm2 = e_clm * e_clm; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION + e_clmx2 = 2.0 * e_clm; + e_clmp2 = 2.0 + e_clm; + e_clmx2xqs = e_clmx2 * qs; + qsat = e_clmx2 * if_ / (e_clmp2 + e_clmx2xqs + sqrt(e_clmp2 * e_clmp2 + 4.0 * e_clmx2xqs)); // NOTE: The inversion charge at a point of maximum velocity saturation. + qs_qsat = qs - qsat; + qs_qsat2 = qs_qsat * qs_qsat; + mdm2 = 2.0 - DELTA; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION + e_clmxmdm2_2 = e_clm2 * mdm2 * mdm2; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION + tmp_vdsat1 = (2.0 * qsat + ln(qsat)) * (1.0 + e_clm * qs_qsat); + tmp_vdsat11 = g_clm + e_clm * mdm2 * qs_qsat; + tmp_vdsat2 = sqrt(1.0 + (2.0 * e_clm2 * mdm2 * mdm2 * qs_qsat2) / tmp_vdsat11 + e_clm2 * qs_qsat2); + vdsat = vp - tmp_vdsat1 / tmp_vdsat2; // NOTE: The potential at a point of the channel of maximum velocity saturation. + vdssat = `MAXA(vdsat - vs,3.0,4.0); // NOTE: The diffence potential along a fully velocity saturated part of the channel, limited to a minimum of 3*UT. Used also for the calculation of impact ionization current (ekv3_idb.va) // -- VELOCITY SATURATION (DEPENDENT ON VD) - dv_clm = (ACLM / DELTA) * (4.0 * qsat + DELTA) / (qs + 1.0); - tmp_vdp1 = (vd - vs) * sqrt(1.0 + 4.0 * dv_clm / vdssat); - tmp_vdp2 = sqrt((tmp_vdp1 + vdssat) * (tmp_vdp1 + vdssat) + 4.0 * dv_clm * vdssat); - tmp_vdp3 = sqrt((tmp_vdp1 - vdssat) * (tmp_vdp1 - vdssat) + 4.0 * dv_clm * vdssat); - vdp = 0.5 * (tmp_vdp2 - tmp_vdp3) + vs; // NOTE: The potential at the velocity saturated point of the channel, limited by the maximum value (vdsat) -// -- CHANNEL LENGTH MODULATION - u_clm = 0.5 * e_clm * Leff / LC * (vd - vdp); - alpha_clm = LC / (Leff - 2.0 * LC); - deltal = LAMBDA_wt * LC * ln((alpha_clm + u_clm + sqrt(u_clm * u_clm + 2.0 * alpha_clm * u_clm + 1.0)) / (alpha_clm + 1.0)); // NOTE: The distance between the velocity saturated point of the channel and the (electrical) drain end. Used at the SPECIFIC CURRENT calculation. + dv_clm = (ACLM / DELTA) * (4.0 * qsat + DELTA) / (qs + 1.0); + tmp_vdp1 = (vd - vs) * sqrt(1.0 + 4.0 * dv_clm / vdssat); + tmp_vdp2 = sqrt((tmp_vdp1 + vdssat) * (tmp_vdp1 + vdssat) + 4.0 * dv_clm * vdssat); + tmp_vdp3 = sqrt((tmp_vdp1 - vdssat) * (tmp_vdp1 - vdssat) + 4.0 * dv_clm * vdssat); + vdp = 0.5 * (tmp_vdp2 - tmp_vdp3) + vs; // NOTE: The potential at the velocity saturated point of the channel, limited by the maximum value (vdsat) +// -- CHANNEL LENGTH MODULATION + u_clm = 0.5 * e_clm * Leff / LC * (vd - vdp); + alpha_clm = LC / (Leff - 2.0 * LC); + deltal = LAMBDA_wt * LC * ln((alpha_clm + u_clm + sqrt(u_clm * u_clm + 2.0 * alpha_clm * u_clm + 1.0)) / (alpha_clm + 1.0)); // NOTE: The distance between the velocity saturated point of the channel and the (electrical) drain end. Used at the SPECIFIC CURRENT calculation. end // VELOCITY_SATURATION begin : NORMALIZED_REVERSE_CURRENT // CALCULATION OF NORMALIZED INVERSION CHARGE OF THE VELOCITY SATURATED POINT (ELECTRICAL DRAIN END) - `QV(qdp,(vp_dibl - vdp)) + `QV(qdp,(vp_dibl - vdp)) // FREQUENTLY PERFORMED CALCULATION - qdp2 = qdp * qdp; + qdp2 = qdp * qdp; // CALCULATION OF THE NORMALIZED REVERSE CURRENT - irp = qdp2 + qdp; + irp = qdp2 + qdp; // FREQUENTLY PERFORMED CALCULATIONS - xrp2 = irp + 0.25; - xrp = qdp + 0.5; + xrp2 = irp + 0.25; + xrp = qdp + 0.5; end // NORMALIZED_REVERSE_CURRENT // FREQUENTLY PERFORMED CALCULATIONS COMBINING BOTH NORMALIZED INVERSION CHARGES - qsqdp = qs + qdp; - qs_qdp = qs - qdp; - powqs_qdp2 = qs_qdp * qs_qdp; - qsqdpp1 = qsqdp + 1.0; - powqsqdpp1_2 = 1.0 / (qsqdpp1 * qsqdpp1); - + qsqdp = qs + qdp; + qs_qdp = qs - qdp; + powqs_qdp2 = qs_qdp * qs_qdp; + qsqdpp1 = qsqdp + 1.0; + powqsqdpp1_2 = 1.0 / (qsqdpp1 * qsqdpp1); + // CALCULATION OF NORMALIZED CHANNEL CURRENT - i = if_ - irp; + i = if_ - irp; // CALCULATION OF CHARGE SLOPE FACTOR NQ - `NQ(nq,psi_p,sqrt_psi_p,qs,qdp,dpd,gamma_b_chsh,gamma_g2) + `NQ(nq,psi_p,sqrt_psi_p,qs,qdp,dpd,gamma_b_chsh,gamma_g2) begin : CHARGE_MODEL -// THE DYNAMIC PART OF THE MODEL. -// CALCULATIONS OF THE CHARGES OF EACH NODE - v_o = vg_p_chsh - psi_p0; // NOTE: psi_p0 used instead of psi_p. +// THE DYNAMIC PART OF THE MODEL. +// CALCULATIONS OF THE CHARGES OF EACH NODE + v_o = vg_p_chsh - psi_p0; // NOTE: psi_p0 used instead of psi_p. // CALCULATIONS OF THE QUANTUM MECHANICAL EFFECT - qr1 = 3.0 * `ONESQRT2 * gamma_b_chsh; - if (vg_p < 0.0) qbo = vg_p_chsh - psi_p; - else qbo = vg_p_chsh / (1.0 + dpd) - psi_po; - dpsiv = axetaqm2_3 * (limexp(`TWO3RDS * ln(sqrt(`MAXA(0.25 * qbo * qbo + 4.0 * axetaqm2_3 * gamma_b_chsh2,0.0,`POS_MIN)) - 0.5 * qbo)) - limexp(`TWO3RDS * ln(sqrt(`MAXA(qr1 * qr1 + 4.0 * axetaqm2_3 * gamma_b_chsh2,0.0,`POS_MIN)) - qr1))); - v_o_qme = v_o + dpsiv; + qr1 = 3.0 * `ONESQRT2 * gamma_b_chsh; + if (vg_p < 0.0) qbo = vg_p_chsh - psi_p; + else qbo = vg_p_chsh / (1.0 + dpd) - psi_po; + dpsiv = axetaqm2_3 * (limexp(`TWO3RDS * ln(sqrt(`MAXA(0.25 * qbo * qbo + 4.0 * axetaqm2_3 * gamma_b_chsh2,0.0,`POS_MIN)) - 0.5 * qbo)) - limexp(`TWO3RDS * ln(sqrt(`MAXA(qr1 * qr1 + 4.0 * axetaqm2_3 * gamma_b_chsh2,0.0,`POS_MIN)) - qr1))); + v_o_qme = v_o + dpsiv; // CALCULATIONS OF THE NORMALIZED CHARGES qS, qD, qG - begin - `QX(qS,psi_p,nq,qs,qdp,powqs_qdp2,powqsqdpp1_2) - `QX(qD,psi_p,nq,qdp,qs,powqs_qdp2,powqsqdpp1_2) - `QG(qG,psi_p,qs,qdp,powqs_qdp2,powqsqdpp1_2,qsqdpp1,v_o_qme,gamma_g2) // NOTE: qG is considered with the same sign as qS and qD, although in absolute values they are of opposite signs. This is taken care at the denormalization part of the code. - end - qI = qS + qD; + begin + `QX(qS,psi_p,nq,qs,qdp,powqs_qdp2,powqsqdpp1_2) + `QX(qD,psi_p,nq,qdp,qs,powqs_qdp2,powqsqdpp1_2) + `QG(qG,psi_p,qs,qdp,powqs_qdp2,powqsqdpp1_2,qsqdpp1,v_o_qme,gamma_g2) // NOTE: qG is considered with the same sign as qS and qD, although in absolute values they are of opposite signs. This is taken care at the denormalization part of the code. + end + qI = qS + qD; // CALCULATION OF THE NORMALIZED CHARGE qB AS COMPLEMENTARY TO qS, qD AND qG. -// NOTE: THE ABSOLUTE VALUES OF THE CHARGES ARE NOT OF INTEREST, SINCE ONLY THE THEIR DERIVATIVES WITH RESPECT TO THE VOLTAGES DESCRIBE THE DYNAMIC BEHAVIOUR OF THE DEVICE. - qB = qG - qI; +// NOTE: THE ABSOLUTE VALUES OF THE CHARGES ARE NOT OF INTEREST, SINCE ONLY THE THEIR DERIVATIVES WITH RESPECT TO THE VOLTAGES DESCRIBE THE DYNAMIC BEHAVIOUR OF THE DEVICE. + qB = qG - qI; end // CHARGE_MODEL begin : MOBILITY_EFFECTS // CALCULATION OF THE EFFECTIVE MOBILITY (beta). // TAKING INTO ACCOUNT THE COULOMB SCATTERING EFFECT. - beta_coul = THC / ((1.0 + (nv * ZC * qs)) * (1.0 + (nv * ZC * qdp))); // NOTE: used in "beta_denom" + beta_coul = THC / ((1.0 + (nv * ZC * qs)) * (1.0 + (nv * ZC * qdp))); // NOTE: used in "beta_denom" // TAKING INTO ACCOUNT THE MOBILITY REDUCTION DUE TO VERTICAL FIELD. - nu = nv * (1.0 - ETA_t) - 1.0; - gpnu = gamma_b_eff * sqrt_psi_p + nu; - eq = qB + ETA_t * nv * qI; - eq1 = gpnu * gpnu + nu * nu * (1.0 + if_ + if_ + irp + irp) - 8.0 * `ONE3RD * nu * gpnu * (xf2 + xf * xrp + xrp2) / (xf + xrp); - beta_nom = 1.0 + ev * gamma_b_eff * sqrtphi + ev1 * gamma_b_eff2 * phi; - beta_denom = 1.0 + ev * eq + ev1 * eq1 + beta_coul; + nu = nv * (1.0 - ETA_t) - 1.0; + gpnu = gamma_b_eff * sqrt_psi_p + nu; + eq = qB + ETA_t * nv * qI; + eq1 = gpnu * gpnu + nu * nu * (1.0 + if_ + if_ + irp + irp) - 8.0 * `ONE3RD * nu * gpnu * (xf2 + xf * xrp + xrp2) / (xf + xrp); + beta_nom = 1.0 + ev * gamma_b_eff * sqrtphi + ev1 * gamma_b_eff2 * phi; + beta_denom = 1.0 + ev * eq + ev1 * eq1 + beta_coul; // TAKING INTO ACCOUNT THE CHANNEL LENGTH MODULATION EFFECT ON MOBILITY. - beta_clm_denom = sqrt(1.0 + 2.0 * e_clmxmdm2_2 * powqs_qdp2 / (g_clm + e_clm * mdm2 * (qs_qdp)) + e_clm2 * powqs_qdp2); + beta_clm_denom = sqrt(1.0 + 2.0 * e_clmxmdm2_2 * powqs_qdp2 / (g_clm + e_clm * mdm2 * (qs_qdp)) + e_clm2 * powqs_qdp2); // COMBINING ALL THE ABOVE PHENOMENA INTO THE CALCULATION OF beta. - beta = KP_DEV_t * (beta_nom / beta_denom) / beta_clm_denom; + beta = KP_DEV_t * (beta_nom / beta_denom) / beta_clm_denom; end // MOBILITY_EFFECTS begin : SPECIFIC_CURRENT // CALCULATION OF THE SPECIFIC CURRENT OF THE TRANSISTOR (THE NORMALIZATION FACTOR FOR THE CHANNEL CURRENT) - i0 = 2.0 * nq * UT2 * beta * inv_dqmip1; - Ispec = i0 * WeffNF / (Leff - deltal) * rWNedge; + i0 = 2.0 * nq * UT2 * beta * inv_dqmip1; + Ispec = i0 * WeffNF / (Leff - deltal) * rWNedge; // CALCULATION OF NORMALIZATION FACTOR FOR CONDUCTANCES (AND ALSO FREQUENTLY PERFORMED CALCULATION) - Gspec = Ispec / UT; + Gspec = Ispec / UT; end // SPECIFIC_CURRENT begin : DITS // CALCULATION OF THE DRAIN INDUCED THRESHOLD VOTLAGE SHIFT (AFTER BSIM4 FORMULATION, ADAPTED FOR EKV) - if (PDITS == 0.0) // NOTE: This value for PDITS switches off the effect. - begin - dits_factor = 1.0; - end - else // NOTE: Otherwise, the following coding calculates a DITS factor (dits_factor) which is multiplied with the channel current (IDS). - begin - f_dits = 1.0 / (1.0 + FPROUT * sqrt(Leff) / (qI + 2.0)); - va_dits = (f_dits / PDITS) * (1.0 + (1.0 + PDITSL * Leff) * limexp(PDITSD * (vd - vs) * UT)); - vdseff = vdssat - `MAXA(vdssat - (vd - vs) - DDITS, 0.0, 4.0 * DDITS * vdssat); - dits_factor = (1.0 + (vd - vs - vdseff) / va_dits ); - end - Ispec_dits = Ispec * dits_factor; - Gspec_dits = Gspec * dits_factor; + if (PDITS == 0.0) // NOTE: This value for PDITS switches off the effect. + begin + dits_factor = 1.0; + end + else // NOTE: Otherwise, the following coding calculates a DITS factor (dits_factor) which is multiplied with the channel current (IDS). + begin + f_dits = 1.0 / (1.0 + FPROUT * sqrt(Leff) / (qI + 2.0)); + va_dits = (f_dits / PDITS) * (1.0 + (1.0 + PDITSL * Leff) * limexp(PDITSD * (vd - vs) * UT)); + vdseff = vdssat - `MAXA(vdssat - (vd - vs) - DDITS, 0.0, 4.0 * DDITS * vdssat); + dits_factor = (1.0 + (vd - vs - vdseff) / va_dits ); + end + Ispec_dits = Ispec * dits_factor; + Gspec_dits = Gspec * dits_factor; end // DITS begin : DENORMALISING // CALCULATIONS OF THE DENORMALIZED CHARGES OF THE NODES OF THE TRANSISTOR AND THE CHANNEL CURRENT - QS = qS * Q0; - QD = qD * Q0; - QG = - qG * Q0; // NOTE: Here, QG has different sign with QS and QD, as it is physically correct. - QB = - QS - QD - QG; // NOTE: Instead of multiplying, subtraction is used, since charges are complementary. - IDS = i * Ispec_dits; + QS = qS * Q0; + QD = qD * Q0; + QG = - qG * Q0; // NOTE: Here, QG has different sign with QS and QD, as it is physically correct. + QB = - QS - QD - QG; // NOTE: Instead of multiplying, subtraction is used, since charges are complementary. + IDS = i * Ispec_dits; end // DENORMALISING `include "ekv3_include/ekv3_extrinsic_diodes.va" // Modelling the extrinsic junction diodes formed bewteen source and bulk, on the source side, and between the drain and bulk, on the drain side. @@ -885,166 +885,166 @@ end // DENORMALISING `ifdef DC_S // SERIES RESISTANCE - IDS = IDS / RES_IDS; // NOTE: Internal, first-order calculation of the series resistance effect for the simplest mode of the model, where no internal nodes are introduced. + IDS = IDS / RES_IDS; // NOTE: Internal, first-order calculation of the series resistance effect for the simplest mode of the model, where no internal nodes are introduced. // CHANNEL CURRENT - I(d ,s ) <+ SIGN_M * d_gt_s_flag * IDS; + I(d ,s ) <+ SIGN_M * d_gt_s_flag * IDS; // CAPACITANCES - I(b ,g ) <+ SIGN_M * ddt(QB) * QON; - I(d ,g ) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; - I(s ,g ) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; + I(b ,g ) <+ SIGN_M * ddt(QB) * QON; + I(d ,g ) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; + I(s ,g ) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; `endif `ifdef DC // CHANNEL CURRENT - I(di,si) <+ SIGN_M * d_gt_s_flag * IDS; + I(di,si) <+ SIGN_M * d_gt_s_flag * IDS; // CAPACITANCES - I(b ,g ) <+ SIGN_M * ddt(QB) * QON; - I(di,g ) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; - I(si,g ) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; + I(b ,g ) <+ SIGN_M * ddt(QB) * QON; + I(di,g ) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; + I(si,g ) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; `endif `ifdef RF_S // CHANNEL CURRENT - I(di,si) <+ SIGN_M * d_gt_s_flag * IDS; + I(di,si) <+ SIGN_M * d_gt_s_flag * IDS; // CAPACITANCES - I(bi,gi) <+ SIGN_M * ddt(QB) * QON; - I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; - I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; + I(bi,gi) <+ SIGN_M * ddt(QB) * QON; + I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; + I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; `endif `ifdef RF // CHANNEL CURRENT - I(di,si) <+ SIGN_M * d_gt_s_flag * IDS; + I(di,si) <+ SIGN_M * d_gt_s_flag * IDS; // CAPACITANCES - I(bi,gi) <+ SIGN_M * ddt(QB) * QON; - I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; - I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; + I(bi,gi) <+ SIGN_M * ddt(QB) * QON; + I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; + I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; `endif `ifdef NQS // HARD-WRITTEN INTRINSIC CHANNEL SEGMENTATION TO FIVE SEGMENTS (NoCS: Number of Channel Segments). THE FOLLOWING CODING WAS WRITTEN ALLOWING VARIABLE NUMBERS OF SEGMENTS, USING THE A FOR-LOOP, BUT WAS SIMPLIFIED TO FIVE SEGMENTS FOR PORTABILITY REASONS, SINCE THE FOR-LOOP COMMAND OF THE VERILOG-A LANGUAGE WAS NOT SUPPORTED BY ALL SIMULATORS. - Ispec_dits_seg = Ispec_dits * `NoCS; - Q0_seg = Q0 / `NoCS; - begin : MOS_S0 + Ispec_dits_seg = Ispec_dits * `NoCS; + Q0_seg = Q0 / `NoCS; + begin : MOS_S0 // STATIC PART OF THE SEGMENT, CHANNEL CURRENT - v1 = d_gt_s * vs + s_gt_d * vdp; - v2 = SIGN * V(m1,bi) / UT; - `QV(q1,(vp_dibl - v1)) - i1 = q1 * (q1 + 1.0); - `QV(q2,(vp_dibl - v2)) - i2 = q2 * (q2 + 1.0); - I(m1,si) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); + v1 = d_gt_s * vs + s_gt_d * vdp; + v2 = SIGN * V(m1,bi) / UT; + `QV(q1,(vp_dibl - v1)) + i1 = q1 * (q1 + 1.0); + `QV(q2,(vp_dibl - v2)) + i2 = q2 * (q2 + 1.0); + I(m1,si) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES - `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) - q1q2 = q1 + q2; - q1_q2 = q1 - q2; - powq1_q22 = q1_q2 * q1_q2; - q1q2p1 = q1q2 + 1.0; - powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); - `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) - `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) - `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) - qB = - qq1 - qq2 + qG; - I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; - I(m1,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; - I(si,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; - end // MOS_S0 - begin : MOS_S1 + `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) + q1q2 = q1 + q2; + q1_q2 = q1 - q2; + powq1_q22 = q1_q2 * q1_q2; + q1q2p1 = q1q2 + 1.0; + powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); + `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) + `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) + `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) + qB = - qq1 - qq2 + qG; + I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; + I(m1,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; + I(si,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; + end // MOS_S0 + begin : MOS_S1 // STATIC PART OF THE SEGMENT, CHANNEL CURRENT - v1 = SIGN * V(m1,bi) / UT; - v2 = SIGN * V(m2,bi) / UT; - `QV(q1,(vp_dibl - v1)) - i1 = q1 * (q1 + 1.0); - `QV(q2,(vp_dibl - v2)) - i2 = q2 * (q2 + 1.0); - I(m2,m1) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); + v1 = SIGN * V(m1,bi) / UT; + v2 = SIGN * V(m2,bi) / UT; + `QV(q1,(vp_dibl - v1)) + i1 = q1 * (q1 + 1.0); + `QV(q2,(vp_dibl - v2)) + i2 = q2 * (q2 + 1.0); + I(m2,m1) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES - `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) - q1q2 = q1 + q2; - q1_q2 = q1 - q2; - powq1_q22 = q1_q2 * q1_q2; - q1q2p1 = q1q2 + 1.0; - powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); - `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) - `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) - `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) - qB = - qq1 - qq2 + qG; - I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; - I(m2,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; - I(m1,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; - end // MOS_S1 - begin : MOS_M + `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) + q1q2 = q1 + q2; + q1_q2 = q1 - q2; + powq1_q22 = q1_q2 * q1_q2; + q1q2p1 = q1q2 + 1.0; + powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); + `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) + `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) + `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) + qB = - qq1 - qq2 + qG; + I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; + I(m2,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; + I(m1,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; + end // MOS_S1 + begin : MOS_M // STATIC PART OF THE SEGMENT, CHANNEL CURRENT - v1 = SIGN * V(m2,bi) / UT; - v2 = SIGN * V(m3,bi) / UT; - `QV(q1,(vp_dibl - v1)) - i1 = q1 * (q1 + 1.0); - `QV(q2,(vp_dibl - v2)) - i2 = q2 * (q2 + 1.0); - I(m3,m2) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); + v1 = SIGN * V(m2,bi) / UT; + v2 = SIGN * V(m3,bi) / UT; + `QV(q1,(vp_dibl - v1)) + i1 = q1 * (q1 + 1.0); + `QV(q2,(vp_dibl - v2)) + i2 = q2 * (q2 + 1.0); + I(m3,m2) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES - `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) - q1q2 = q1 + q2; - q1_q2 = q1 - q2; - powq1_q22 = q1_q2 * q1_q2; - q1q2p1 = q1q2 + 1.0; - powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); - `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) - `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) - `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) - qB = - qq1 - qq2 + qG; - I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; - I(m3,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; - I(m2,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; - end // MOS_M - begin : MOS_D1 + `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) + q1q2 = q1 + q2; + q1_q2 = q1 - q2; + powq1_q22 = q1_q2 * q1_q2; + q1q2p1 = q1q2 + 1.0; + powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); + `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) + `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) + `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) + qB = - qq1 - qq2 + qG; + I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; + I(m3,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; + I(m2,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; + end // MOS_M + begin : MOS_D1 // STATIC PART OF THE SEGMENT, CHANNEL CURRENT - v1 = SIGN * V(m3,bi) / UT; - v2 = SIGN * V(m4,bi) / UT; - `QV(q1,(vp_dibl - v1)) - i1 = q1 * (q1 + 1.0); - `QV(q2,(vp_dibl - v2)) - i2 = q2 * (q2 + 1.0); - I(m4,m3) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); + v1 = SIGN * V(m3,bi) / UT; + v2 = SIGN * V(m4,bi) / UT; + `QV(q1,(vp_dibl - v1)) + i1 = q1 * (q1 + 1.0); + `QV(q2,(vp_dibl - v2)) + i2 = q2 * (q2 + 1.0); + I(m4,m3) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES - `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) - q1q2 = q1 + q2; - q1_q2 = q1 - q2; - powq1_q22 = q1_q2 * q1_q2; - q1q2p1 = q1q2 + 1.0; - powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); - `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) - `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) - `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) - qB = - qq1 - qq2 + qG; - I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; - I(m4,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; - I(m3,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; - end // MOS_D1 - begin : MOS_D0 + `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) + q1q2 = q1 + q2; + q1_q2 = q1 - q2; + powq1_q22 = q1_q2 * q1_q2; + q1q2p1 = q1q2 + 1.0; + powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); + `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) + `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) + `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) + qB = - qq1 - qq2 + qG; + I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; + I(m4,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; + I(m3,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; + end // MOS_D1 + begin : MOS_D0 // STATIC PART OF THE SEGMENT, CHANNEL CURRENT - v1 = SIGN * V(m4,bi) / UT; - v2 = d_gt_s * vdp + s_gt_d * vs; - `QV(q1,(vp_dibl - v1)) - i1 = q1 * (q1 + 1.0); - `QV(q2,(vp_dibl - v2)) - i2 = q2 * (q2 + 1.0); - I(di,m4) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); + v1 = SIGN * V(m4,bi) / UT; + v2 = d_gt_s * vdp + s_gt_d * vs; + `QV(q1,(vp_dibl - v1)) + i1 = q1 * (q1 + 1.0); + `QV(q2,(vp_dibl - v2)) + i2 = q2 * (q2 + 1.0); + I(di,m4) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES - `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) - q1q2 = q1 + q2; - q1_q2 = q1 - q2; - powq1_q22 = q1_q2 * q1_q2; - q1q2p1 = q1q2 + 1.0; - powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); - `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) - `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) - `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) - qB = - qq1 - qq2 + qG; - I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; - I(di,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; - I(m4,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; - end // MOS_D0 + `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) + q1q2 = q1 + q2; + q1_q2 = q1 - q2; + powq1_q22 = q1_q2 * q1_q2; + q1q2p1 = q1q2 + 1.0; + powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); + `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) + `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) + `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) + qB = - qq1 - qq2 + qG; + I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; + I(di,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; + I(m4,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; + end // MOS_D0 `endif `include "ekv3_include/ekv3_oppoints.va" `include "ekv3_include/ekv3_extract_debug.va" diff --git a/code/ekv3_all.va b/code/ekv3_all.va index 8494645..fbaf369 100644 --- a/code/ekv3_all.va +++ b/code/ekv3_all.va @@ -11,7 +11,7 @@ `define RF_S `include "ekv3.va" `undef RF_S - + `define RF `include "ekv3.va" `undef RF diff --git a/code/ekv3_include/ekv3_def_check.va b/code/ekv3_include/ekv3_def_check.va index 07e265e..f79a8c0 100644 --- a/code/ekv3_include/ekv3_def_check.va +++ b/code/ekv3_include/ekv3_def_check.va @@ -3,53 +3,53 @@ // For the NQS mode the NCS is set to be five. `ifdef NQS - `ifdef RF - `undef RF - `endif - `ifdef RF_S - `undef RF_S - `endif - `ifdef DC - `undef DC - `endif - `ifdef DC_S - `undef DC_S - `endif - `ifdef NCS - `else - `define NoCS 5 - `endif + `ifdef RF + `undef RF + `endif + `ifdef RF_S + `undef RF_S + `endif + `ifdef DC + `undef DC + `endif + `ifdef DC_S + `undef DC_S + `endif + `ifdef NCS + `else + `define NoCS 5 + `endif `else - `ifdef RF - `ifdef RF_S - `undef RF_S - `endif - `ifdef DC - `undef DC - `endif - `ifdef DC_S - `undef DC_S - `endif - `else - `ifdef RF_S - `ifdef DC - `undef DC - `endif - `ifdef DC_S - `undef DC_S - `endif - `else - `ifdef DC - `ifdef DC_S - `undef DC_S - `endif - `else - `ifdef DC_S - `else - `define DC_S - `endif - `endif - `endif - `endif + `ifdef RF + `ifdef RF_S + `undef RF_S + `endif + `ifdef DC + `undef DC + `endif + `ifdef DC_S + `undef DC_S + `endif + `else + `ifdef RF_S + `ifdef DC + `undef DC + `endif + `ifdef DC_S + `undef DC_S + `endif + `else + `ifdef DC + `ifdef DC_S + `undef DC_S + `endif + `else + `ifdef DC_S + `else + `define DC_S + `endif + `endif + `endif + `endif `endif diff --git a/code/ekv3_include/ekv3_definitions.va b/code/ekv3_include/ekv3_definitions.va index 42cdb66..335c102 100644 --- a/code/ekv3_include/ekv3_definitions.va +++ b/code/ekv3_include/ekv3_definitions.va @@ -1,69 +1,69 @@ `ifdef DEFINITIONS_INCLUDE `else -`define TAD (0.1E-9) +`define TAD (0.1E-9) // Physical Constants // // Silicon Electrical Permittivity [F/m] -`define C_EPSSIL (1.03594314E-10) +`define C_EPSSIL (1.03594314E-10) // Oxide Electrical Permittivity [F/m] -`define C_EPSOX (34.53144E-12) +`define C_EPSOX (34.53144E-12) // Electron Charge [C] -`define C_QE (1.602E-19) +`define C_QE (1.602E-19) // Boltzmann constant [J/K] -`define C_K (1.3807E-23) +`define C_K (1.3807E-23) // Thermal Potential, as a function of temperature (T) in K. -`define UT(T) ((`C_K * (T)) / `C_QE) +`define UT(T) ((`C_K * (T)) / `C_QE) -// Frequently Used Numbers +// Frequently Used Numbers // // Square root of two -`define SQRT2 (1.4142135623730950488016887242097) +`define SQRT2 (1.4142135623730950488016887242097) // One third -`define ONE3RD (0.33333333333333333333333333333333) +`define ONE3RD (0.33333333333333333333333333333333) // Two thirds -`define TWO3RDS (0.66666666666666666666666666666667) +`define TWO3RDS (0.66666666666666666666666666666667) // One over square root of two -`define ONESQRT2 (0.70710678118654752440084436210485) +`define ONESQRT2 (0.70710678118654752440084436210485) // The pi number, the ratio of circumference to diameter at a circle -`define PI (3.1415926535897932384626433832795) +`define PI (3.1415926535897932384626433832795) // Small Positive Number -`define POS_MIN (1.0E-6) -// The minimum value of a resistance. -`define MINIMUM_RESISTANCE (1.0E-3) +`define POS_MIN (1.0E-6) +// The minimum value of a resistance. +`define MINIMUM_RESISTANCE (1.0E-3) // Useful mathematical functions // // Maximum function (not smooth) -`define MAX(x,y) ((x)>(y)?(x):(y)) +`define MAX(x,y) ((x)>(y)?(x):(y)) // Minimum function (not smooth) -`define MIN(x,y) ((x)<(y)?(x):(y)) +`define MIN(x,y) ((x)<(y)?(x):(y)) // Nested maximum in minimum function (not smooth) -`define MIN_MAX(val,min,max) (`MIN(`MAX(val,min),max)) +`define MIN_MAX(val,min,max) (`MIN(`MAX(val,min),max)) // Maximum function (smoothened) -`define MAXA(x,y,a) (0.5*((x)+(y)+sqrt(((x)-(y))*((x)-(y))+(a)))) +`define MAXA(x,y,a) (0.5*((x)+(y)+sqrt(((x)-(y))*((x)-(y))+(a)))) // Minimum function (smoothened) -`define MINA(x,y,a) (0.5*((x)+(y)-sqrt(((x)-(y))*((x)-(y))+(a)))) +`define MINA(x,y,a) (0.5*((x)+(y)-sqrt(((x)-(y))*((x)-(y))+(a)))) // Nested maximum in minimum function (smoothened) `define MINA_MAXA(val,min,max,a) (`MINA(`MAXA(val,min,a),max,a)) // Definition used in ADMS `ifdef insideADMS - `define MODEL @(initial_model) - `define INSTANCE @(initial_instance) - `define ATTR(txt) (*txt*) + `define MODEL @(initial_model) + `define INSTANCE @(initial_instance) + `define ATTR(txt) (*txt*) `else - `define MODEL - `define INSTANCE - `define ATTR(txt) + `define MODEL + `define INSTANCE + `define ATTR(txt) `endif - `ifdef insideADMS - `define OPPATTR(n,d,u) (* spice:name=n, info=d , unit=u , ask="yes" *) - `else - `define OPPATTR(n,d,u) (* desc=d , units=u *) - `endif + `ifdef insideADMS + `define OPPATTR(n,d,u) (* spice:name=n, info=d , unit=u , ask="yes" *) + `else + `define OPPATTR(n,d,u) (* desc=d , units=u *) + `endif `define abs_ddx(a,b) abs(ddx(a,b)) `define DEFINITIONS_INCLUDE diff --git a/code/ekv3_include/ekv3_edge.va b/code/ekv3_include/ekv3_edge.va index 09bc0ac..bafb6e6 100644 --- a/code/ekv3_include/ekv3_edge.va +++ b/code/ekv3_include/ekv3_edge.va @@ -2,218 +2,218 @@ // CHANNEL CURRENT AND CHARGES FOR THE NODES OF THE EDGE TRANSISTOR ARE CALCULATED. // CALCULATION OF EDGE_DEVICE'S_NORMALIZATION_FACTORS - Ispec_dits_edge = Ispec_dits * rWNWedge; - Q0_edge = Q0 * rWNWedge; - Gspec_dits_edge = Gspec_dits * rWNWedge; + Ispec_dits_edge = Ispec_dits * rWNWedge; + Q0_edge = Q0 * rWNWedge; + Gspec_dits_edge = Gspec_dits * rWNWedge; // CALCULATION OF NORMALIZED AND SCALED THE DEVICE'S GEOMETRY PARAMETERS - dgamma_edge = DGAMMAEDGE * (1.0 + WLDGAMMAEDGE / WLeff) / sqrtUT; - dphi_edge = DPHIEDGE * (1.0 + LDPHIEDGE / Leff) * (1.0 + WDPHIEDGE / Weff) * (1.0 + WLDPHIEDGE / WLeff) / UT; + dgamma_edge = DGAMMAEDGE * (1.0 + WLDGAMMAEDGE / WLeff) / sqrtUT; + dphi_edge = DPHIEDGE * (1.0 + LDPHIEDGE / Leff) * (1.0 + WDPHIEDGE / Weff) * (1.0 + WLDPHIEDGE / WLeff) / UT; // CALCULATION OF DIFFERENTIAL PINCH-OFF VOLTAGE OF THE EDGE DEVICE WITH RESPECT TO THE MAIN DEVICE - dvp_edge = - dgamma_edge * psi_p / (sqrt_psi_p + 0.5 * gamma_b_eff) - dphi_edge; + dvp_edge = - dgamma_edge * psi_p / (sqrt_psi_p + 0.5 * gamma_b_eff) - dphi_edge; -begin : INVERSION_CHARGES - vp_dibl_edge = vp_dibl + dvp_edge; - `QV(qs_edge ,(vp_dibl_edge - vs )) - `QV(qdp_edge,(vp_dibl_edge - vdp)) +begin : INVERSION_CHARGES + vp_dibl_edge = vp_dibl + dvp_edge; + `QV(qs_edge ,(vp_dibl_edge - vs )) + `QV(qdp_edge,(vp_dibl_edge - vdp)) end // CALCULATION OF EDGE DEVICE'S CHANNEL CURRENT, NORMALIZED AND DENORMALIZED - ids_edge = qs_edge * (qs_edge + 1.0) - qdp_edge * (qdp_edge + 1.0); - IDS_edge = Ispec_dits_edge * ids_edge; - -// CALCULATION OF PINCH-OFF SURFACE POTENTIAL OF THE EDGE DEVICE, NORMALIZED - psi_p_edge = psi_p - dgamma_edge * psi_p / (sqrt_psi_p + 0.5 * gamma_b_eff); - sqrt_psi_p_edge = sqrt(`MAXA(psi_p_edge,1.0E-4,1.0E-2)); -// CALCULATION OF BODY EFFECT COEFFICIENT OF THE EDGE DEVICE, NORMALIZED - gamma_b_chsh_edge = gamma_b_chsh + dgamma_edge; - + ids_edge = qs_edge * (qs_edge + 1.0) - qdp_edge * (qdp_edge + 1.0); + IDS_edge = Ispec_dits_edge * ids_edge; + +// CALCULATION OF PINCH-OFF SURFACE POTENTIAL OF THE EDGE DEVICE, NORMALIZED + psi_p_edge = psi_p - dgamma_edge * psi_p / (sqrt_psi_p + 0.5 * gamma_b_eff); + sqrt_psi_p_edge = sqrt(`MAXA(psi_p_edge,1.0E-4,1.0E-2)); +// CALCULATION OF BODY EFFECT COEFFICIENT OF THE EDGE DEVICE, NORMALIZED + gamma_b_chsh_edge = gamma_b_chsh + dgamma_edge; + // CALCULATION OF THE CHARGE SLOPE FACTOR OF THE EDGE DEVICE - `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,qs_edge,qdp_edge,dpd,gamma_b_chsh_edge,gamma_g2) - + `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,qs_edge,qdp_edge,dpd,gamma_b_chsh_edge,gamma_g2) + // FREQUENTLY PERFORMED CALCULATIONS - qsqdp_edge = qs_edge + qdp_edge; - qs_qdp_edge = qs_edge - qdp_edge; - powqs_qdp2_edge = qs_qdp_edge * qs_qdp_edge; - qsqdpp1_edge = qsqdp_edge + 1.0; - powqsqdpp1_2_edge = 1.0 / (qsqdpp1_edge * qsqdpp1_edge); - + qsqdp_edge = qs_edge + qdp_edge; + qs_qdp_edge = qs_edge - qdp_edge; + powqs_qdp2_edge = qs_qdp_edge * qs_qdp_edge; + qsqdpp1_edge = qsqdp_edge + 1.0; + powqsqdpp1_2_edge = 1.0 / (qsqdpp1_edge * qsqdpp1_edge); + // CALCULATION OF THE CHARGES AT THE NODES OF THE EDGE DEVICE, NORMALIZED - `QX(qS_edge,psi_p_edge,nq_edge,qs_edge,qdp_edge,powqs_qdp2_edge,powqsqdpp1_2_edge) - `QX(qD_edge,psi_p_edge,nq_edge,qdp_edge,qs_edge,powqs_qdp2_edge,powqsqdpp1_2_edge) - `QG(qG_edge,psi_p_edge,qs_edge,qdp_edge,powqs_qdp2_edge,powqsqdpp1_2_edge,qsqdpp1_edge,v_o_qme,gamma_g2) - qB_edge = qG_edge - qS_edge - qD_edge; + `QX(qS_edge,psi_p_edge,nq_edge,qs_edge,qdp_edge,powqs_qdp2_edge,powqsqdpp1_2_edge) + `QX(qD_edge,psi_p_edge,nq_edge,qdp_edge,qs_edge,powqs_qdp2_edge,powqsqdpp1_2_edge) + `QG(qG_edge,psi_p_edge,qs_edge,qdp_edge,powqs_qdp2_edge,powqsqdpp1_2_edge,qsqdpp1_edge,v_o_qme,gamma_g2) + qB_edge = qG_edge - qS_edge - qD_edge; // DEMORMALIZATION OF THE CHARGES AT THE NODES OF THE EDGE DEVICE - QS_edge = qS_edge * Q0_edge; - QD_edge = qD_edge * Q0_edge; - QG_edge = - qG_edge * Q0_edge; - QB_edge = - QS_edge - QD_edge - QG_edge; + QS_edge = qS_edge * Q0_edge; + QD_edge = qD_edge * Q0_edge; + QG_edge = - qG_edge * Q0_edge; + QB_edge = - QS_edge - QD_edge - QG_edge; // ASSIGNMENT OF CHANNEL CURRENT AND DYNAMIC BEHAVIOUR OF THE EDGE DEVICE `ifdef DC_S // SERIES RESISTANCE - RES_IDS_edge = 1.0 + rs_wt * Gspec_dits_edge * qs_edge + rd_wt * Gspec_dits_edge * qdp_edge; // NOTE: Internal, first-order calculation of the series resistance effect for the simplest mode of the model (DC_S), where no internal nodes are introduced. - IDS_edge = IDS_edge / RES_IDS_edge; + RES_IDS_edge = 1.0 + rs_wt * Gspec_dits_edge * qs_edge + rd_wt * Gspec_dits_edge * qdp_edge; // NOTE: Internal, first-order calculation of the series resistance effect for the simplest mode of the model (DC_S), where no internal nodes are introduced. + IDS_edge = IDS_edge / RES_IDS_edge; // CHANNEL CURRENT OF THE EDGE DEVICE - I(d ,s ) <+ SIGN_M * d_gt_s_flag * IDS_edge; + I(d ,s ) <+ SIGN_M * d_gt_s_flag * IDS_edge; // CAPACITANCES OF THE EDGE DEVICE - I(b ,g ) <+ SIGN_M * ddt(QB_edge) * QON; - I(d ,g ) <+ SIGN_M * (d_gt_s * ddt(QD_edge) + s_gt_d * ddt(QS_edge)) * QON; - I(s ,g ) <+ SIGN_M * (d_gt_s * ddt(QS_edge) + s_gt_d * ddt(QD_edge)) * QON; + I(b ,g ) <+ SIGN_M * ddt(QB_edge) * QON; + I(d ,g ) <+ SIGN_M * (d_gt_s * ddt(QD_edge) + s_gt_d * ddt(QS_edge)) * QON; + I(s ,g ) <+ SIGN_M * (d_gt_s * ddt(QS_edge) + s_gt_d * ddt(QD_edge)) * QON; `endif `ifdef DC // CHANNEL CURRENT OF THE EDGE DEVICE - I(di,si) <+ SIGN_M * d_gt_s_flag * IDS_edge; + I(di,si) <+ SIGN_M * d_gt_s_flag * IDS_edge; // CAPACITANCES OF THE EDGE DEVICE - I(b ,g ) <+ SIGN_M * ddt(QB_edge) * QON; - I(di,g ) <+ SIGN_M * (d_gt_s * ddt(QD_edge) + s_gt_d * ddt(QS_edge)) * QON; - I(si,g ) <+ SIGN_M * (d_gt_s * ddt(QS_edge) + s_gt_d * ddt(QD_edge)) * QON; + I(b ,g ) <+ SIGN_M * ddt(QB_edge) * QON; + I(di,g ) <+ SIGN_M * (d_gt_s * ddt(QD_edge) + s_gt_d * ddt(QS_edge)) * QON; + I(si,g ) <+ SIGN_M * (d_gt_s * ddt(QS_edge) + s_gt_d * ddt(QD_edge)) * QON; `endif `ifdef RF_S // CHANNEL CURRENT OF THE EDGE DEVICE - I(di,si) <+ SIGN_M * d_gt_s_flag * IDS_edge; + I(di,si) <+ SIGN_M * d_gt_s_flag * IDS_edge; // CAPACITANCES OF THE EDGE DEVICE - I(bi,gi) <+ SIGN_M * ddt(QB_edge) * QON; - I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QD_edge) + s_gt_d * ddt(QS_edge)) * QON; - I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QS_edge) + s_gt_d * ddt(QD_edge)) * QON; + I(bi,gi) <+ SIGN_M * ddt(QB_edge) * QON; + I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QD_edge) + s_gt_d * ddt(QS_edge)) * QON; + I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QS_edge) + s_gt_d * ddt(QD_edge)) * QON; `endif `ifdef RF // CHANNEL CURRENT OF THE EDGE DEVICE - I(di,si) <+ SIGN_M * d_gt_s_flag * IDS_edge; + I(di,si) <+ SIGN_M * d_gt_s_flag * IDS_edge; // CAPACITANCES OF THE EDGE DEVICE - I(bi,gi) <+ SIGN_M * ddt(QB_edge) * QON; - I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QD_edge) + s_gt_d * ddt(QS_edge)) * QON; - I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QS_edge) + s_gt_d * ddt(QD_edge)) * QON; + I(bi,gi) <+ SIGN_M * ddt(QB_edge) * QON; + I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QD_edge) + s_gt_d * ddt(QS_edge)) * QON; + I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QS_edge) + s_gt_d * ddt(QD_edge)) * QON; `endif `ifdef NQS // HARD-WRITTEN INTRINSIC CHANNEL SEGMENTATION TO FIVE SEGMENTS (NCS: Number of Channel Segments) FOR EDGE DEVICE. - Ispec_dits_edge_seg = Ispec_dits_edge * `NoCS; - Q0_edge_seg = Q0_edge / `NoCS; - begin : EDGE_MOS_S0 + Ispec_dits_edge_seg = Ispec_dits_edge * `NoCS; + Q0_edge_seg = Q0_edge / `NoCS; + begin : EDGE_MOS_S0 // STATIC PART OF THE SEGMENT, CHANNEL CURRENT, EDGE CONDUCTANCE - v1 = d_gt_s * vs + s_gt_d * vdp; - v2 = SIGN * V(m1,bi) / UT; - `QV(q1,(vp_dibl_edge - v1)) - i1 = q1 * (q1 + 1.0); - `QV(q2,(vp_dibl_edge - v2)) - i2 = q2 * (q2 + 1.0); - I(m1,si) <+ SIGN_M * Ispec_dits_edge_seg * (i1 - i2); + v1 = d_gt_s * vs + s_gt_d * vdp; + v2 = SIGN * V(m1,bi) / UT; + `QV(q1,(vp_dibl_edge - v1)) + i1 = q1 * (q1 + 1.0); + `QV(q2,(vp_dibl_edge - v2)) + i2 = q2 * (q2 + 1.0); + I(m1,si) <+ SIGN_M * Ispec_dits_edge_seg * (i1 - i2); // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES, EDGE CONDUCTANCE - `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,q1,q2,dpd,gamma_b_chsh_edge,gamma_g2) - q1q2 = q1 + q2; - q1_q2 = q1 - q2; - powq1_q22 = q1_q2 * q1_q2; - q1q2p1 = q1q2 + 1.0; - powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); - `QX(qq1,psi_p_edge,nq_edge,q1,q2,powq1_q22,powq1q2p1_2) - `QX(qq2,psi_p_edge,nq_edge,q2,q1,powq1_q22,powq1q2p1_2) - `QG(qG_edge,psi_p_edge,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) - qB_edge = - qq1 - qq2 + qG_edge; - I(bi,gi) <+ SIGN_M * ddt(qB_edge * Q0_edge_seg) * QON; - I(m1,gi) <+ SIGN_M * ddt(qq2 * Q0_edge_seg) * QON; - I(si,gi) <+ SIGN_M * ddt(qq1 * Q0_edge_seg) * QON; - end // EDGE_MOS_S0 - begin : EDGE_MOS_S1 + `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,q1,q2,dpd,gamma_b_chsh_edge,gamma_g2) + q1q2 = q1 + q2; + q1_q2 = q1 - q2; + powq1_q22 = q1_q2 * q1_q2; + q1q2p1 = q1q2 + 1.0; + powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); + `QX(qq1,psi_p_edge,nq_edge,q1,q2,powq1_q22,powq1q2p1_2) + `QX(qq2,psi_p_edge,nq_edge,q2,q1,powq1_q22,powq1q2p1_2) + `QG(qG_edge,psi_p_edge,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) + qB_edge = - qq1 - qq2 + qG_edge; + I(bi,gi) <+ SIGN_M * ddt(qB_edge * Q0_edge_seg) * QON; + I(m1,gi) <+ SIGN_M * ddt(qq2 * Q0_edge_seg) * QON; + I(si,gi) <+ SIGN_M * ddt(qq1 * Q0_edge_seg) * QON; + end // EDGE_MOS_S0 + begin : EDGE_MOS_S1 // STATIC PART OF THE SEGMENT, CHANNEL CURRENT, EDGE CONDUCTANCE - v1 = SIGN * V(m1,bi) / UT; - v2 = SIGN * V(m2,bi) / UT; - `QV(q1,(vp_dibl_edge - v1)) - i1 = q1 * (q1 + 1.0); - `QV(q2,(vp_dibl_edge - v2)) - i2 = q2 * (q2 + 1.0); - I(m2,m1) <+ SIGN_M * Ispec_dits_edge_seg * (i1 - i2); + v1 = SIGN * V(m1,bi) / UT; + v2 = SIGN * V(m2,bi) / UT; + `QV(q1,(vp_dibl_edge - v1)) + i1 = q1 * (q1 + 1.0); + `QV(q2,(vp_dibl_edge - v2)) + i2 = q2 * (q2 + 1.0); + I(m2,m1) <+ SIGN_M * Ispec_dits_edge_seg * (i1 - i2); // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES, EDGE CONDUCTANCE - `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,q1,q2,dpd,gamma_b_chsh_edge,gamma_g2) - q1q2 = q1 + q2; - q1_q2 = q1 - q2; - powq1_q22 = q1_q2 * q1_q2; - q1q2p1 = q1q2 + 1.0; - powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); - `QX(qq1,psi_p_edge,nq_edge,q1,q2,powq1_q22,powq1q2p1_2) - `QX(qq2,psi_p_edge,nq_edge,q2,q1,powq1_q22,powq1q2p1_2) - `QG(qG_edge,psi_p_edge,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) - qB_edge = - qq1 - qq2 + qG_edge; - I(bi,gi) <+ SIGN_M * ddt(qB_edge * Q0_edge_seg) * QON; - I(m2,gi) <+ SIGN_M * ddt(qq2 * Q0_edge_seg) * QON; - I(m1,gi) <+ SIGN_M * ddt(qq1 * Q0_edge_seg) * QON; - end // EDGE_MOS_S1 - begin : EDGE_MOS_M + `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,q1,q2,dpd,gamma_b_chsh_edge,gamma_g2) + q1q2 = q1 + q2; + q1_q2 = q1 - q2; + powq1_q22 = q1_q2 * q1_q2; + q1q2p1 = q1q2 + 1.0; + powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); + `QX(qq1,psi_p_edge,nq_edge,q1,q2,powq1_q22,powq1q2p1_2) + `QX(qq2,psi_p_edge,nq_edge,q2,q1,powq1_q22,powq1q2p1_2) + `QG(qG_edge,psi_p_edge,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) + qB_edge = - qq1 - qq2 + qG_edge; + I(bi,gi) <+ SIGN_M * ddt(qB_edge * Q0_edge_seg) * QON; + I(m2,gi) <+ SIGN_M * ddt(qq2 * Q0_edge_seg) * QON; + I(m1,gi) <+ SIGN_M * ddt(qq1 * Q0_edge_seg) * QON; + end // EDGE_MOS_S1 + begin : EDGE_MOS_M // STATIC PART OF THE SEGMENT, CHANNEL CURRENT, EDGE CONDUCTANCE - v1 = SIGN * V(m2,bi) / UT; - v2 = SIGN * V(m3,bi) / UT; - `QV(q1,(vp_dibl_edge - v1)) - i1 = q1 * (q1 + 1.0); - `QV(q2,(vp_dibl_edge - v2)) - i2 = q2 * (q2 + 1.0); - I(m3,m2) <+ SIGN_M * Ispec_dits_edge_seg * (i1 - i2); + v1 = SIGN * V(m2,bi) / UT; + v2 = SIGN * V(m3,bi) / UT; + `QV(q1,(vp_dibl_edge - v1)) + i1 = q1 * (q1 + 1.0); + `QV(q2,(vp_dibl_edge - v2)) + i2 = q2 * (q2 + 1.0); + I(m3,m2) <+ SIGN_M * Ispec_dits_edge_seg * (i1 - i2); // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES, EDGE CONDUCTANCE - `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,q1,q2,dpd,gamma_b_chsh_edge,gamma_g2) - q1q2 = q1 + q2; - q1_q2 = q1 - q2; - powq1_q22 = q1_q2 * q1_q2; - q1q2p1 = q1q2 + 1.0; - powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); - `QX(qq1,psi_p_edge,nq_edge,q1,q2,powq1_q22,powq1q2p1_2) - `QX(qq2,psi_p_edge,nq_edge,q2,q1,powq1_q22,powq1q2p1_2) - `QG(qG_edge,psi_p_edge,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) - qB_edge = - qq1 - qq2 + qG_edge; - I(bi,gi) <+ SIGN_M * ddt(qB_edge * Q0_edge_seg) * QON; - I(m3,gi) <+ SIGN_M * ddt(qq2 * Q0_edge_seg) * QON; - I(m2,gi) <+ SIGN_M * ddt(qq1 * Q0_edge_seg) * QON; - end // EDGE_MOS_M - begin : EDGE_MOS_D1 + `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,q1,q2,dpd,gamma_b_chsh_edge,gamma_g2) + q1q2 = q1 + q2; + q1_q2 = q1 - q2; + powq1_q22 = q1_q2 * q1_q2; + q1q2p1 = q1q2 + 1.0; + powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); + `QX(qq1,psi_p_edge,nq_edge,q1,q2,powq1_q22,powq1q2p1_2) + `QX(qq2,psi_p_edge,nq_edge,q2,q1,powq1_q22,powq1q2p1_2) + `QG(qG_edge,psi_p_edge,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) + qB_edge = - qq1 - qq2 + qG_edge; + I(bi,gi) <+ SIGN_M * ddt(qB_edge * Q0_edge_seg) * QON; + I(m3,gi) <+ SIGN_M * ddt(qq2 * Q0_edge_seg) * QON; + I(m2,gi) <+ SIGN_M * ddt(qq1 * Q0_edge_seg) * QON; + end // EDGE_MOS_M + begin : EDGE_MOS_D1 // STATIC PART OF THE SEGMENT, CHANNEL CURRENT, EDGE CONDUCTANCE - v1 = SIGN * V(m3,bi) / UT; - v2 = SIGN * V(m4,bi) / UT; - `QV(q1,(vp_dibl_edge - v1)) - i1 = q1 * (q1 + 1.0); - `QV(q2,(vp_dibl_edge - v2)) - i2 = q2 * (q2 + 1.0); - I(m4,m3) <+ SIGN_M * Ispec_dits_edge_seg * (i1 - i2); + v1 = SIGN * V(m3,bi) / UT; + v2 = SIGN * V(m4,bi) / UT; + `QV(q1,(vp_dibl_edge - v1)) + i1 = q1 * (q1 + 1.0); + `QV(q2,(vp_dibl_edge - v2)) + i2 = q2 * (q2 + 1.0); + I(m4,m3) <+ SIGN_M * Ispec_dits_edge_seg * (i1 - i2); // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES, EDGE CONDUCTANCE - `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,q1,q2,dpd,gamma_b_chsh_edge,gamma_g2) - q1q2 = q1 + q2; - q1_q2 = q1 - q2; - powq1_q22 = q1_q2 * q1_q2; - q1q2p1 = q1q2 + 1.0; - powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); - `QX(qq1,psi_p_edge,nq_edge,q1,q2,powq1_q22,powq1q2p1_2) - `QX(qq2,psi_p_edge,nq_edge,q2,q1,powq1_q22,powq1q2p1_2) - `QG(qG_edge,psi_p_edge,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) - qB_edge = - qq1 - qq2 + qG_edge; - I(bi,gi) <+ SIGN_M * ddt(qB_edge * Q0_edge_seg) * QON; - I(m4,gi) <+ SIGN_M * ddt(qq2 * Q0_edge_seg) * QON; - I(m3,gi) <+ SIGN_M * ddt(qq1 * Q0_edge_seg) * QON; - end // EDGE_MOS_D1 - begin : EDGE_MOS_D0 + `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,q1,q2,dpd,gamma_b_chsh_edge,gamma_g2) + q1q2 = q1 + q2; + q1_q2 = q1 - q2; + powq1_q22 = q1_q2 * q1_q2; + q1q2p1 = q1q2 + 1.0; + powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); + `QX(qq1,psi_p_edge,nq_edge,q1,q2,powq1_q22,powq1q2p1_2) + `QX(qq2,psi_p_edge,nq_edge,q2,q1,powq1_q22,powq1q2p1_2) + `QG(qG_edge,psi_p_edge,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) + qB_edge = - qq1 - qq2 + qG_edge; + I(bi,gi) <+ SIGN_M * ddt(qB_edge * Q0_edge_seg) * QON; + I(m4,gi) <+ SIGN_M * ddt(qq2 * Q0_edge_seg) * QON; + I(m3,gi) <+ SIGN_M * ddt(qq1 * Q0_edge_seg) * QON; + end // EDGE_MOS_D1 + begin : EDGE_MOS_D0 // STATIC PART OF THE SEGMENT, CHANNEL CURRENT, EDGE CONDUCTANCE - v1 = SIGN * V(m4,bi) / UT; - v2 = d_gt_s * vdp + s_gt_d * vs; - `QV(q1,(vp_dibl_edge - v1)) - i1 = q1 * (q1 + 1.0); - `QV(q2,(vp_dibl_edge - v2)) - i2 = q2 * (q2 + 1.0); - I(di,m4) <+ SIGN_M * Ispec_dits_edge_seg * (i1 - i2); + v1 = SIGN * V(m4,bi) / UT; + v2 = d_gt_s * vdp + s_gt_d * vs; + `QV(q1,(vp_dibl_edge - v1)) + i1 = q1 * (q1 + 1.0); + `QV(q2,(vp_dibl_edge - v2)) + i2 = q2 * (q2 + 1.0); + I(di,m4) <+ SIGN_M * Ispec_dits_edge_seg * (i1 - i2); // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES, EDGE CONDUCTANCE - `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,q1,q2,dpd,gamma_b_chsh_edge,gamma_g2) - q1q2 = q1 + q2; - q1_q2 = q1 - q2; - powq1_q22 = q1_q2 * q1_q2; - q1q2p1 = q1q2 + 1.0; - powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); - `QX(qq1,psi_p_edge,nq_edge,q1,q2,powq1_q22,powq1q2p1_2) - `QX(qq2,psi_p_edge,nq_edge,q2,q1,powq1_q22,powq1q2p1_2) - `QG(qG_edge,psi_p_edge,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) - qB_edge = - qq1 - qq2 + qG_edge; - I(bi,gi) <+ SIGN_M * ddt(qB_edge * Q0_edge_seg) * QON; - I(di,gi) <+ SIGN_M * ddt(qq2 * Q0_edge_seg) * QON; - I(m4,gi) <+ SIGN_M * ddt(qq1 * Q0_edge_seg) * QON; - end // EDGE_MOS_D0 + `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,q1,q2,dpd,gamma_b_chsh_edge,gamma_g2) + q1q2 = q1 + q2; + q1_q2 = q1 - q2; + powq1_q22 = q1_q2 * q1_q2; + q1q2p1 = q1q2 + 1.0; + powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); + `QX(qq1,psi_p_edge,nq_edge,q1,q2,powq1_q22,powq1q2p1_2) + `QX(qq2,psi_p_edge,nq_edge,q2,q1,powq1_q22,powq1q2p1_2) + `QG(qG_edge,psi_p_edge,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) + qB_edge = - qq1 - qq2 + qG_edge; + I(bi,gi) <+ SIGN_M * ddt(qB_edge * Q0_edge_seg) * QON; + I(di,gi) <+ SIGN_M * ddt(qq2 * Q0_edge_seg) * QON; + I(m4,gi) <+ SIGN_M * ddt(qq1 * Q0_edge_seg) * QON; + end // EDGE_MOS_D0 `endif diff --git a/code/ekv3_include/ekv3_extract_debug.va b/code/ekv3_include/ekv3_extract_debug.va index 374c935..6fdaea6 100644 --- a/code/ekv3_include/ekv3_extract_debug.va +++ b/code/ekv3_include/ekv3_extract_debug.va @@ -1,674 +1,674 @@ begin : EXTRACTING_RESULTS - if (INFO_LEVEL > 0.0) - begin - if (INFO_LEVEL == 1.0) - begin + if (INFO_LEVEL > 0.0) + begin + if (INFO_LEVEL == 1.0) + begin // INTRODUCTION - $strobe(""); - $strobe("########################################"); - $strobe("# #"); - $strobe("# EKV3 model, Verilog-A code #"); - $strobe("# (Model version: 301.04) #"); - $strobe("# Information level = %g #", INFO_LEVEL); - $strobe("# (INFO_LEVEL) #"); - $strobe("# #"); - $strobe("########################################"); - $strobe(""); + $strobe(""); + $strobe("########################################"); + $strobe("# #"); + $strobe("# EKV3 model, Verilog-A code #"); + $strobe("# (Model version: 301.04) #"); + $strobe("# Information level = %g #", INFO_LEVEL); + $strobe("# (INFO_LEVEL) #"); + $strobe("# #"); + $strobe("########################################"); + $strobe(""); // GENERAL INFORMATION - $strobe(" On device: %m"); - `ifdef DC_S - $strobe(" Model mode: simple low frequency (DC_S: no intrinsic nodes) "); - `endif - `ifdef DC - $strobe(" Model mode: low frequency (DC: two intrinsic nodes) "); - `endif - `ifdef RF_S - $strobe(" Model mode: simple high frequency (RF_S: four intrinsic nodes) "); - `endif - `ifdef RF - $strobe(" Model mode: high frequency (RF: six intrinsic nodes) "); - `endif - `ifdef NQS - $strobe(" Model mode: non-quasi-static high frequency (NQS: ten intrinsic nodes) "); - `endif - $strobe(" Temperature: %g C \t UT = %g V \t TNOM = %g C", (T-273.15), UT, TNOM); - $strobe(""); - $strobe("+ GENERAL CHARACTERISTICS "); - $strobe("|"); - $strobe(">- TOX = %g m ", TOX); - $strobe(">- COX = %g F*m^(-2)", COX); - $strobe(">- VSB = %g V ", V(s,b)); - $strobe(""); + $strobe(" On device: %m"); + `ifdef DC_S + $strobe(" Model mode: simple low frequency (DC_S: no intrinsic nodes) "); + `endif + `ifdef DC + $strobe(" Model mode: low frequency (DC: two intrinsic nodes) "); + `endif + `ifdef RF_S + $strobe(" Model mode: simple high frequency (RF_S: four intrinsic nodes) "); + `endif + `ifdef RF + $strobe(" Model mode: high frequency (RF: six intrinsic nodes) "); + `endif + `ifdef NQS + $strobe(" Model mode: non-quasi-static high frequency (NQS: ten intrinsic nodes) "); + `endif + $strobe(" Temperature: %g C \t UT = %g V \t TNOM = %g C", (T-273.15), UT, TNOM); + $strobe(""); + $strobe("+ GENERAL CHARACTERISTICS "); + $strobe("|"); + $strobe(">- TOX = %g m ", TOX); + $strobe(">- COX = %g F*m^(-2)", COX); + $strobe(">- VSB = %g V ", V(s,b)); + $strobe(""); // EXTERNAL BIAS - $strobe("+ EXTERNAL BIAS "); - $strobe("|"); - $strobe(">- VGB = %g V \t VGS = %g V", V(g,b), (V(g,b)-V(s,b))); - $strobe(">- VDB = %g V \t VDS = %g V", V(d,b), (V(d,b)-V(s,b))); - $strobe(">- VSB = %g V ", V(s,b)); - $strobe(""); + $strobe("+ EXTERNAL BIAS "); + $strobe("|"); + $strobe(">- VGB = %g V \t VGS = %g V", V(g,b), (V(g,b)-V(s,b))); + $strobe(">- VDB = %g V \t VDS = %g V", V(d,b), (V(d,b)-V(s,b))); + $strobe(">- VSB = %g V ", V(s,b)); + $strobe(""); // DEVICE GEOMETRY - $strobe("+ DEVICE GEOMETRY "); - $strobe("|"); - $strobe(">- Leff = %g m \t Leffc = %g m ", Leff, Leffc); - $strobe(">- Weff = %g m \t Weffc = %g m \t (finger)", Weff, Weffc); - $strobe(">- Wtot = %g m \t NF = %d m ", WeffNF, NF); - $strobe(">"); - $strobe(">- Leff - deltaL = %g m \t (CHANNEL LENGTH MODULATION)", (Leff - deltal)); - $strobe(">- Weff - WEDGE = %g m \t (EDGE CONDUCTANCE)", (Weff - WEDGE)); - $strobe(">- WEDGE = %g m ", WEDGE); - $strobe(">"); - $strobe(">- W/L = %g ", ((Weff-WEDGE)*NF/(Leff-deltal))); - $strobe(""); + $strobe("+ DEVICE GEOMETRY "); + $strobe("|"); + $strobe(">- Leff = %g m \t Leffc = %g m ", Leff, Leffc); + $strobe(">- Weff = %g m \t Weffc = %g m \t (finger)", Weff, Weffc); + $strobe(">- Wtot = %g m \t NF = %d m ", WeffNF, NF); + $strobe(">"); + $strobe(">- Leff - deltaL = %g m \t (CHANNEL LENGTH MODULATION)", (Leff - deltal)); + $strobe(">- Weff - WEDGE = %g m \t (EDGE CONDUCTANCE)", (Weff - WEDGE)); + $strobe(">- WEDGE = %g m ", WEDGE); + $strobe(">"); + $strobe(">- W/L = %g ", ((Weff-WEDGE)*NF/(Leff-deltal))); + $strobe(""); // THRESHOLD VOLTAGE - $strobe("+ THRESHOLD VOLTAGE "); - $strobe("|"); - $strobe(">- VTO(dev,T) = %g V \t VTO(dev,TNOM) = %g V", VTO_DEV_t, VTO_DEV); - $strobe(">"); - $strobe(">- VTO = %g V ", VTO); - $strobe(">- DVTO(RSCE) = %g V \t\t (REVERSE SHORT CHANNEL EFFECT)", DVT_rsce); - $strobe(">- DVTO(INCE) = %g V \t\t (INVERSE NARROW CHANNEL EFFECT)", DVT_inwe); - $strobe(">- DVTO(STI) = %g V \t\t (STI STRESS EFFECT)", DVT_sti); - $strobe(">- DVTO(LONG) = %g V \t\t (LONG CHANNEL CORRECTION)", DVT_long); - $strobe(">- DVTO(WIDE) = %g V \t\t (WIDE CHANNEL CORRECTION)", DVT_wide); - $strobe(">- DVTO(NF) = %g V \t\t (NF CORRECTION)", DVT_nf); - $strobe(">- DVTO(T) = %g V \t\t (TEMPERATURE)", (VTO_DEV_t-VTO_DEV)); - $strobe(">"); - $strobe(">- VFB = %g V ", (vfb*UT)); - $strobe(""); + $strobe("+ THRESHOLD VOLTAGE "); + $strobe("|"); + $strobe(">- VTO(dev,T) = %g V \t VTO(dev,TNOM) = %g V", VTO_DEV_t, VTO_DEV); + $strobe(">"); + $strobe(">- VTO = %g V ", VTO); + $strobe(">- DVTO(RSCE) = %g V \t\t (REVERSE SHORT CHANNEL EFFECT)", DVT_rsce); + $strobe(">- DVTO(INCE) = %g V \t\t (INVERSE NARROW CHANNEL EFFECT)", DVT_inwe); + $strobe(">- DVTO(STI) = %g V \t\t (STI STRESS EFFECT)", DVT_sti); + $strobe(">- DVTO(LONG) = %g V \t\t (LONG CHANNEL CORRECTION)", DVT_long); + $strobe(">- DVTO(WIDE) = %g V \t\t (WIDE CHANNEL CORRECTION)", DVT_wide); + $strobe(">- DVTO(NF) = %g V \t\t (NF CORRECTION)", DVT_nf); + $strobe(">- DVTO(T) = %g V \t\t (TEMPERATURE)", (VTO_DEV_t-VTO_DEV)); + $strobe(">"); + $strobe(">- VFB = %g V ", (vfb*UT)); + $strobe(""); // BODY EFFECT FACTOR - $strobe("+ BODY EFFECT FACTOR "); - $strobe("|"); - $strobe(">- GAMMA(dev) = %g V^(1/2)", GAMMA_DEV); - $strobe(">"); - $strobe(">- GAMMA = %g V^(1/2)", GAMMA); - $strobe(">- AGAMMA(RSCE)= %g \t\t (REVERSE SHORT CHANNEL EFFECT)", MGAMMA_rcse); - $strobe(">- AGAMMA(INCE)= %g \t\t (INVERSE NARROW CHANNEL EFFECT)", MGAMMA_inwe); - $strobe(">- DGAMMA(STI) = %g V^(1/2) \t\t (STI STRESS EFFECT)", DGAMMA_sti); - $strobe(">- DGAMMA(LONG)= %g V^(1/2) \t\t (LONG CHANNEL CORRECTION)", DGAMMA_long); - $strobe(">- DGAMMA(WIDE)= %g V^(1/2) \t\t (WIDE CHANNEL CORRECTION)", DGAMMA_wide); - $strobe(">"); - $strobe(">- GAMMAeff(CHSH) = %g V^(1/2) \t\t (CHARGE SHARING))", (gamma_b_chsh*UT)); - $strobe(">- GAMMAeff0(CHSH)= %g V^(1/2) \t\t (CHARGE SHARING, NO BIAS)", (gamma_b_chsh0*UT)); - $strobe(">- GAMMAeff = %g V^(1/2) \t\t (ALL PHENOMENA, POLYSILICON DEPLETION)", (gamma_b_eff*UT)); - $strobe(""); + $strobe("+ BODY EFFECT FACTOR "); + $strobe("|"); + $strobe(">- GAMMA(dev) = %g V^(1/2)", GAMMA_DEV); + $strobe(">"); + $strobe(">- GAMMA = %g V^(1/2)", GAMMA); + $strobe(">- AGAMMA(RSCE)= %g \t\t (REVERSE SHORT CHANNEL EFFECT)", MGAMMA_rcse); + $strobe(">- AGAMMA(INCE)= %g \t\t (INVERSE NARROW CHANNEL EFFECT)", MGAMMA_inwe); + $strobe(">- DGAMMA(STI) = %g V^(1/2) \t\t (STI STRESS EFFECT)", DGAMMA_sti); + $strobe(">- DGAMMA(LONG)= %g V^(1/2) \t\t (LONG CHANNEL CORRECTION)", DGAMMA_long); + $strobe(">- DGAMMA(WIDE)= %g V^(1/2) \t\t (WIDE CHANNEL CORRECTION)", DGAMMA_wide); + $strobe(">"); + $strobe(">- GAMMAeff(CHSH) = %g V^(1/2) \t\t (CHARGE SHARING))", (gamma_b_chsh*UT)); + $strobe(">- GAMMAeff0(CHSH)= %g V^(1/2) \t\t (CHARGE SHARING, NO BIAS)", (gamma_b_chsh0*UT)); + $strobe(">- GAMMAeff = %g V^(1/2) \t\t (ALL PHENOMENA, POLYSILICON DEPLETION)", (gamma_b_eff*UT)); + $strobe(""); // FERMI POTENTIAL - $strobe("+ FERMI POTENTIAL "); - $strobe("|"); - $strobe(">- PHIF(dev,T) = %g V \t PHIF(dev,TNOM) = %g V", PHIF_DEV_t, PHIF_DEV); - $strobe(">"); - $strobe(">- PHIF = %g V", PHIF); - $strobe(">- DPHIF(RSCE) = %g V \t\t (REVERSE SHORT CHANNEL EFFECT)", DPHIF_rsce); - $strobe(">- DPHIF(T) = %g V \t\t (TEMPERATURE)", (PHIF_DEV_t-PHIF_DEV)); - $strobe(">"); - $strobe(">- PHIF(dev,T)^(1/2) = %g V^(1/2)", (sqrt(PHIF_DEV_t))); - $strobe(">- PHI(dev,T) = %g V", (phi*UT)); - $strobe(">- DPSI(QM) = %g V \t\t (QUANTUM MECHANICAL EFFECTS)", DPSI0); - $strobe(">- VBI(dev,T) = %g V", (vbi*UT)); - $strobe(""); + $strobe("+ FERMI POTENTIAL "); + $strobe("|"); + $strobe(">- PHIF(dev,T) = %g V \t PHIF(dev,TNOM) = %g V", PHIF_DEV_t, PHIF_DEV); + $strobe(">"); + $strobe(">- PHIF = %g V", PHIF); + $strobe(">- DPHIF(RSCE) = %g V \t\t (REVERSE SHORT CHANNEL EFFECT)", DPHIF_rsce); + $strobe(">- DPHIF(T) = %g V \t\t (TEMPERATURE)", (PHIF_DEV_t-PHIF_DEV)); + $strobe(">"); + $strobe(">- PHIF(dev,T)^(1/2) = %g V^(1/2)", (sqrt(PHIF_DEV_t))); + $strobe(">- PHI(dev,T) = %g V", (phi*UT)); + $strobe(">- DPSI(QM) = %g V \t\t (QUANTUM MECHANICAL EFFECTS)", DPSI0); + $strobe(">- VBI(dev,T) = %g V", (vbi*UT)); + $strobe(""); // MOBILITY - $strobe("+ MOBILITY RELATED EFFECTS "); - $strobe("|"); - $strobe(">- MOB(dev,T) = %g m^2/(V*s)", (beta/COX)); - $strobe(">"); - $strobe(">- MOB(TNOM) = %g m^2/(V*s)", (KP/COX)); - $strobe(">- AMOB(STI,TNOM)= %g ", MKP_sti); - $strobe(">- AMOB(STI,T) = %g ", MKP_sti_t); - $strobe(">- AMOB(LENGTH_SCALING) = %g ", MKP_l); - $strobe(">- AMOB(WIDTH_SCALING) = %g ", MKP_w); - $strobe(">- AMOB(T) = %g ", (exp(BEX*lnrT))); - $strobe(">- AMOB(MRVF) = %g \t\t (MOBILITY REDUCTION DUE TO VERTICAL FIELD)", (beta_nom/beta_denom)); - $strobe(">- AMOB(MRLF) = %g \t\t (MOBILITY REDUCTION DUE TO LONGITUDINAL FIELD)", (1.0 / beta_clm_denom)); - $strobe(""); + $strobe("+ MOBILITY RELATED EFFECTS "); + $strobe("|"); + $strobe(">- MOB(dev,T) = %g m^2/(V*s)", (beta/COX)); + $strobe(">"); + $strobe(">- MOB(TNOM) = %g m^2/(V*s)", (KP/COX)); + $strobe(">- AMOB(STI,TNOM)= %g ", MKP_sti); + $strobe(">- AMOB(STI,T) = %g ", MKP_sti_t); + $strobe(">- AMOB(LENGTH_SCALING) = %g ", MKP_l); + $strobe(">- AMOB(WIDTH_SCALING) = %g ", MKP_w); + $strobe(">- AMOB(T) = %g ", (exp(BEX*lnrT))); + $strobe(">- AMOB(MRVF) = %g \t\t (MOBILITY REDUCTION DUE TO VERTICAL FIELD)", (beta_nom/beta_denom)); + $strobe(">- AMOB(MRLF) = %g \t\t (MOBILITY REDUCTION DUE TO LONGITUDINAL FIELD)", (1.0 / beta_clm_denom)); + $strobe(""); // QUANTUM MECHANICAL - $strobe("+ QUANTUM MECHANICAL EFFECTS "); - $strobe("|"); - $strobe(">- AQMA = %g \t AQMI = %g \t ETAQM = %g", AQMA, AQMI, ETAQM); - $strobe(">"); - $strobe(">- 1/(1+delta_QMI) = %g ", inv_dqmip1); - $strobe(">- DPSI = %g V \t\t (FERMI POTENTIAL)", DPSI0); - $strobe(">- DPSIV = %g V \t\t (DVO ON CHARGE MODEL OF QB)", (dpsiv*UT)); - $strobe(""); + $strobe("+ QUANTUM MECHANICAL EFFECTS "); + $strobe("|"); + $strobe(">- AQMA = %g \t AQMI = %g \t ETAQM = %g", AQMA, AQMI, ETAQM); + $strobe(">"); + $strobe(">- 1/(1+delta_QMI) = %g ", inv_dqmip1); + $strobe(">- DPSI = %g V \t\t (FERMI POTENTIAL)", DPSI0); + $strobe(">- DPSIV = %g V \t\t (DVO ON CHARGE MODEL OF QB)", (dpsiv*UT)); + $strobe(""); // SLOPE FACTOR - $strobe("+ SLOPE FACTOR "); - $strobe("|"); - $strobe(">- nv = %g ", nv); - $strobe(">- nq = %g ", nq); - $strobe(">- nq0 = %g ", nq0); - $strobe(""); + $strobe("+ SLOPE FACTOR "); + $strobe("|"); + $strobe(">- nv = %g ", nv); + $strobe(">- nq = %g ", nq); + $strobe(">- nq0 = %g ", nq0); + $strobe(""); // PINCH-OFF - $strobe("+ PINCH-OFF SURFACE POTENTIAL AND VOLTAGE "); - $strobe("|"); - $strobe(">- PSI_P = %g V ", (psi_p*UT)); - $strobe(">- PSI_P0 = %g V ", (psi_p0*UT)); - $strobe(">"); - $strobe(">- PSI_PO = %g V \t\t (APPROXIMATION AROUND PSI_P=0)", (psi_po*UT)); - $strobe(">- PSI_PO0 = %g V \t\t (APPROXIMATION AROUND PSI_P=0)", (psi_po0*UT)); - $strobe(">"); - $strobe(">- V_P = %g V ", (vp*UT)); - $strobe(">- DPSI_S(DIBL)= %g V \t\t (DRAIN INDUCED BARRIER LOWERING)", (deltapsis*UT)); - $strobe(">- V_P(DIBL) = %g V ", ((vp+deltapsis)*UT)); - $strobe(""); -// VELOCITY SATURATION - $strobe("+ VELOCITY SATURATION "); - $strobe("|"); - $strobe(">- UCRIT = %g V/m \t\t LAMBDA = %g \t\t DELTA = %g \t\t ACLM = %g ", UCRIT, LAMBDA, DELTA, ACLM); - $strobe(">- UCEX = %g \t\t WUCRIT = %g m \t\t KUCRIT = %g ", UCEX, WUCRIT, KUCRIT); - $strobe(">- TLAMBDA= %g \t\t WLAMBDA= %g m ", TLAMBDA, WLAMBDA); - $strobe(">"); - $strobe(">- UCRIT(dev,T) = %g V/m ", UCRIT_DEV_t); - $strobe(">- LAMBDA(dev,T) = %g ", LAMBDA_wt); - $strobe(">"); - $strobe(">- VDS_SAT = %g V \t\t VDS = %g V ", (vdssat*UT), ((vd-vs)*UT)); - $strobe(">- VD_PRIME = %g V \t\t VD = %g V ", (vdp*UT), (vd*UT)); - $strobe(">- DELTA_L = %g m ", deltal); - $strobe(""); - $strobe("+ NORMALIZED (LOCAL) INVERTED CHARGES"); - $strobe("|"); - $strobe(">- qs = %g \t\t V_PS = %g V ", qs, ((vp + deltapsis - vs)*UT)); - $strobe(">- qd = %g \t\t V_PD = %g V ", qdp, ((vp + deltapsis - vdp)*UT)); - $strobe(""); - $strobe("+ CHANNEL CURRENT"); - $strobe("|"); - $strobe(">- if = %g ", if_); - $strobe(">- irp = %g ", irp); - $strobe(">- i = %g ", i); - $strobe(">"); - $strobe(">- Ispec = %g A [2*nq*(UT^2)*beta*(W/L)*(1/(1+delta_QMI))]", Ispec); - $strobe(">"); - $strobe(">- nq = %g ", nq); - $strobe(">- beta = %g A*V^(-2) ", beta); - $strobe(">- W/L = %g ", ((Weff-WEDGE)*NF/(Leff-deltal))); - $strobe(">- 1/(1+delta_QMI) = %g ", inv_dqmip1); - $strobe(">- 2*UT^2 = %g V^2 ", UT2+UT2); - $strobe(">"); - $strobe(">- DITS = %g ", dits_factor); - $strobe(">"); - $strobe(">- #### IDS #### = %g A", IDS); - `ifdef DC_S - $strobe(">"); - $strobe(">- SERIES RESISTANCE = %g ", (1.0/(1.0+(rs_wt*Ispec/UT)*qs+(rd_wt*Ispec/UT)*qdp))); - `endif - $strobe(""); - $strobe("+ CHARGES "); - $strobe("|"); - $strobe(">- qS = %g \t\t qD = %g \t\t qI = %g ", qS, qD, qI); - $strobe(">- qG = %g \t\t qB = %g ", qG, qB); - $strobe(">"); - $strobe(">- Qspec = %g Cb [-UT*Wc*Lc*COX*(1/(1+delta_QMI))]", Q0); - $strobe(">"); - $strobe(">- COX = %g F*m^(-2)", COX); - $strobe(">- Wc*Lc = %g m^2", (Weffc*NF*Leffc*(Weff-WEDGE)/Weff)); - $strobe(">- 1/(1+delta_QMI) = %g ", inv_dqmip1); - $strobe(">- UT = %g V ", UT); - $strobe(">"); - $strobe(">- ## QS ## = %g Cb ", QS); - $strobe(">- ## QD ## = %g Cb ", QD); - $strobe(">- ## QG ## = %g Cb ", QG); - $strobe(">- ## QB ## = %g Cb ", QB); - $strobe(""); - $strobe("+ EDGE CONDUCTION "); - $strobe("|"); - $strobe(">- Ispec_dits_edge = %g A ", Ispec_dits_edge); - $strobe(">- Q0_edge = %g Cb ", Q0_edge); - $strobe(">"); - $strobe(">- DELTA_GAMMA_EDGE_eff = %g V^(1/2) ", (dgamma_edge*sqrtUT)); - $strobe(">- DELTA_PHI_EDGE_eff = %g V ", (dphi_edge*UT)); - $strobe(">"); - $strobe(">- DELTA_V_P_EDGE_eff = %g V ", (dvp_edge*UT)); - $strobe(">"); - $strobe(">- qs_edge= %g \t\t V_PS_edge = %g V ", qs_edge, ((vp + dvp_edge + deltapsis - vs)*UT)); - $strobe(">- qd_edge= %g \t\t V_PD_edge = %g V ", qdp_edge, ((vp + dvp_edge + deltapsis - vdp)*UT)); - $strobe(">"); - $strobe(">- ids_edge= %g ", ids_edge); - $strobe(">"); - $strobe(">- DITS = %g ", dits_factor); - $strobe(">"); - $strobe(">- ### IDS_edge ### = A %g ", IDS_edge); - $strobe(">"); - $strobe(">- PSI_P_edge = %g V", (psi_p_edge*UT)); - $strobe(">- GAMMA_eff_edge(CHSH) = %g V^(1/2)", (gamma_b_chsh_edge*sqrtUT)); - $strobe(">- nq_edge = %g ", nq_edge); - $strobe(">"); - $strobe(">- qS_edge= %g \t\t QS_edge = %g Cb ", qS_edge, QS_edge); - $strobe(">- qD_edge= %g \t\t QD_edge = %g Cb ", qD_edge, QD_edge); - $strobe(">- qG_edge= %g \t\t QG_edge = %g Cb ", qG_edge, QG_edge); - $strobe(">- qB_edge= %g \t\t QB_edge = %g Cb ", qB_edge, QB_edge); - $strobe(""); - $strobe("+ OVERLAP "); - $strobe("|"); - $strobe(">- qSOV = %g ", dpsiox_sov); - $strobe(">- qDOV = %g ", dpsiox_dov); - $strobe(">"); - $strobe(">- Q0OV = %g Cb ", -Q0OV); - $strobe(">"); - $strobe(">- Wc*L(OV)= %g m^2 ", (Weffc*NF*LOV)); - $strobe(">"); - $strobe(">- QSOV = %g Cb ", QSOV); - $strobe(">- QDOV = %g Cb ", QDOV); - $strobe(""); - $strobe("+ INNER FRINGING "); - $strobe("|"); - $strobe(">- QSFR = %g Cb", QSFR); - $strobe(">- QDFR = %g Cb", QDFR); - $strobe(""); - $strobe("+ OUTER FRUNGING CAPACITANCE "); - $strobe("|"); - $strobe(">- CGS = %g F ", (CGSO*WeffNF)); - $strobe(">- CGD = %g F ", (CGDO*WeffNF)); - $strobe(">- CGB = %g F ", (CGBO*2.0*Leff*NF)); - $strobe(""); - $strobe("+ GIDL / GISL "); - $strobe("|"); - $strobe(">- IGISL = %g A", IGISL); - $strobe(">- IGIDL = %g A", IGIDL); - $strobe(""); - $strobe("+ GATE CURRENT "); - $strobe("|"); - $strobe(">- IG = %g A \t\t [IG=IGS+IGD]", IG); - $strobe(">- IGS = %g A", IGS); - $strobe(">- IGD = %g A", IGD); - $strobe(">- IGB = %g A", IGB); - $strobe(">"); - $strobe(">- IGSOV = %g A ", IGSOV); - $strobe(">- IGDOV = %g A ", IGDOV); - $strobe(""); - $strobe("+ IMPACT IONIZATION CURRENT "); - $strobe("|"); - $strobe(">- IDB = %g A ", IDB); - $strobe(""); - $strobe("+ NOISE "); - $strobe("|"); - $strobe(">- THERMAL NOISE \t\t (TH_NOI = %g)", TH_NOI); - $strobe(">- gn = %g \t\t (NORMALIZED EQUIVALENT CHANNEL NOISE RESISTANCE)", gn); - $strobe(">- thermal = %g (PSD) \t\t (THERMAL NOISE) ", thermal); - $strobe(">"); - $strobe(">- FLICKER NOISE"); - $strobe(">- gmg = %g \t\t ", gmg_); - $strobe(">- flicker = %g (PSD) \t\t (FLICKER NOISE AT 1Hz) ", flicker); - $strobe(">"); - $strobe(">- NON-QUASI-STATIC NOISE \t\t (NQS_NOI = %g)", NQS_NOI); - $strobe(">- Sn(id,id) = %g (PSD) ", (Snspec*snidid)); - $strobe(">- Sn(ig,ig) = %g * OMEGA^2 (PSD) ", (Snspec*snigig)); - $strobe(">- Sn(ig,id) = %g * j * OMEGA (PSD) ", (Snspec*snigid)); - $strobe(">- C(ig,id) = %g * j (PSD) ", c_igid); - $strobe(">- Sn(ib,ib) = %g * OMEGA^2 (PSD) ", (Snspec*snibib)); - $strobe(">"); - $strobe(">- GATE SHOT AND FLICKER NOISE "); - $strobe(">- Sig(shot) = %g (PSD) ", sig_shot); - $strobe(">- Sig(flicker,1Hz) = %g (PSD) ", sig_flicker); - $strobe(""); - $strobe("+ EXTRINSIC DIODES "); - $strobe("|"); - $strobe(">- AREA (SOURCE-SIDE) = %g m^2", as); - $strobe(">- PERIMETER (SOURCE-SIDE) = %g m", ps); - $strobe(">- GATE-SIDE (SOURCE-SIDE) = %g m", WeffNF); - $strobe(">- AREA (DRAIN-SIDE) = %g m^2", ad); - $strobe(">- PERIMETER (DRAIN-SIDE) = %g m", pd); - $strobe(">- GATE-SIDE (DRAIN-SIDE) = %g m", WeffNF); - $strobe(">"); - $strobe(">- IS_S = %g A ", is_s); - $strobe(">- IS_D = %g A ", is_d); - $strobe(">"); - $strobe(">- ISB_TUN = %g A", isb_tun); - $strobe(">- IDB_TUN = %g A", idb_tun); - $strobe(">"); - $strobe(">- ISBJ = %g A", ISBJ); - $strobe(">- IDBJ = %g A", IDBJ); - $strobe(">"); - $strobe(">- CSBJ = %g F \t\t QSBJ = %g Cb", CSBJ, QSBJ); - $strobe(">- CDBJ = %g F \t\t QDBJ = %g Cb", CDBJ, QDBJ); - $strobe(""); - $strobe("+ EXTRINSIC RESISTORS "); - $strobe("|"); - `ifdef DC_S - $strobe(">- RS = %g Ohm \t\t NOISE = %g (PSD)", rs_wt, (KT4/rs_wt)); - $strobe(">- RD = %g Ohm \t\t NOISE = %g (PSD)", rd_wt, (KT4/rd_wt)); - `endif - `ifdef DC - $strobe(">- RS = %g Ohm \t\t NOISE = %g (PSD)", rs_wt, (KT4/rs_wt)); - $strobe(">- RD = %g Ohm \t\t NOISE = %g (PSD)", rd_wt, (KT4/rd_wt)); - `endif - `ifdef RF_S - $strobe(">- RS = %g Ohm \t\t NOISE = %g (PSD)", rs_wt, (KT4/rs_wt)); - $strobe(">- RD = %g Ohm \t\t NOISE = %g (PSD)", rd_wt, (KT4/rd_wt)); - $strobe(">- RG = %g Ohm \t\t NOISE = %g (PSD)", rg_t, (KT4/rg_t)); - $strobe(">- RB = %g Ohm \t\t NOISE = %g (PSD)", rb_t, (KT4/rb_t)); - `endif - `ifdef RF - $strobe(">- RS = %g Ohm \t\t NOISE = %g (PSD)", rs_wt, (KT4/rs_wt)); - $strobe(">- RD = %g Ohm \t\t NOISE = %g (PSD)", rd_wt, (KT4/rd_wt)); - $strobe(">- RG = %g Ohm \t\t NOISE = %g (PSD)", rg_t, (KT4/rg_t)); - $strobe(">- RB = %g Ohm \t\t NOISE = %g (PSD)", rb_t, (KT4/rb_t)); - $strobe(">- RSB = %g Ohm \t\t NOISE = %g (PSD)", rsb_t, (KT4/rsb_t)); - $strobe(">- RDB = %g Ohm \t\t NOISE = %g (PSD)", rdb_t, (KT4/rdb_t)); - $strobe(">- RDSB = %g Ohm \t\t NOISE = %g (PSD)", rdsb_t, (KT4/rdsb_t)); - $strobe(">- RDSB/2 = %g Ohm \t\t NOISE = %g (PSD)", rdsb_t*0.5, (0.5*KT4/rdsb_t)); - `endif - `ifdef NQS - $strobe(">- RS = %g Ohm \t\t NOISE = %g (PSD)", rs_wt, (KT4/rs_wt)); - $strobe(">- RD = %g Ohm \t\t NOISE = %g (PSD)", rd_wt, (KT4/rd_wt)); - $strobe(">- RG = %g Ohm \t\t NOISE = %g (PSD)", rg_t, (KT4/rg_t)); - $strobe(">- RB = %g Ohm \t\t NOISE = %g (PSD)", rb_t, (KT4/rb_t)); - $strobe(">- RSB = %g Ohm \t\t NOISE = %g (PSD)", rsb_t, (KT4/rsb_t)); - $strobe(">- RDB = %g Ohm \t\t NOISE = %g (PSD)", rdb_t, (KT4/rdb_t)); - $strobe(">- RDSB = %g Ohm \t\t NOISE = %g (PSD)", rdsb_t, (KT4/rdsb_t)); - $strobe(">- RDSB/2 = %g Ohm \t\t NOISE = %g (PSD)", rdsb_t*0.5, (0.5*KT4/rdsb_t)); - `endif - $strobe(""); - $strobe(""); - `ifdef DC_S - $strobe("#######################################################"); - $strobe(" "); - $strobe(" MACROMODEL: "); - $strobe(" "); - $strobe(" | "); - $strobe(" | G "); - $strobe(" --------------------------O----------- "); - $strobe(" | | | | "); - $strobe(" | ----- | ----- "); - $strobe(" | CGSex ----- ----------- ----- CGDex "); - $strobe(" | | | | | "); - $strobe(" | | | | | "); - $strobe(" | --O-----V | |-----O-- "); - $strobe(" | | S | D | "); - $strobe(" | | | | "); - $strobe(" ----- /^\\ | /^\\ "); - $strobe(" ----- CGBex --- CJS | --- CJD = %g F ", CDBJ); - $strobe(" | | | | CJS = %g F ", CSBJ); - $strobe(" ---------------+----------| | "); - $strobe(" | | B | "); - $strobe(" -----------O----------- "); - $strobe(" | "); - $strobe(" | "); - $strobe(" "); - $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - $strobe(" "); - $strobe(" V_G = %g V \t V_GB = %g V \t V_GS = %g V ", V(g ), (V(g )-V(b )), (V(g )-V(s ))); - $strobe(" V_D = %g V \t V_DB = %g V \t V_DS = %g V ", V(d ), (V(d )-V(b )), (V(d )-V(s ))); - $strobe(" V_S = %g V \t V_SB = %g V ", V(s ), (V(s )-V(b ))); - $strobe(" V_B = %g V ", V(b )); - $strobe(" "); - $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - `endif - `ifdef DC - $strobe("#######################################################"); - $strobe(" "); - $strobe(" MACROMODEL: "); - $strobe(" "); - $strobe(" | "); - $strobe(" | G "); - $strobe(" --------------------------O----------- "); - $strobe(" | | | | "); - $strobe(" | ----- | ----- "); - $strobe(" | CGSex ----- ----------- ----- CGDex "); - $strobe(" | | | | | "); - $strobe(" | | | | | "); - $strobe(" | --O---/\\/\\/\\-o-----V | |-----o-/\\/\\/\\---O-- "); - $strobe(" | RS | | | RD = %g Ohm ", rd_wt); - $strobe(" | | Si | Di | RS = %g Ohm ", rs_wt); - $strobe(" ----- /^\\ | /^\\ "); - $strobe(" ----- CGBex --- CJS | --- CJD = %g F ", CDBJ); - $strobe(" | | | | CJS = %g F ", CSBJ); - $strobe(" ---------------+----------| | "); - $strobe(" | | B | "); - $strobe(" -----------O----------- "); - $strobe(" | "); - $strobe(" | "); - $strobe(" "); - $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - $strobe(" "); - $strobe(" V_G = %g V \t V_GB = %g V \t V_GSi = %g V ", V(g ), (V(g )-V(b )), (V(g )-V(si ))); - $strobe(" V_Di = %g V \t V_DiB = %g V \t V_DiSi = %g V ", V(di ), (V(di )-V(b )), (V(di )-V(si ))); - $strobe(" V_Si = %g V \t V_SiB = %g V ", V(si ), (V(si )-V(b ))); - $strobe(" V_B = %g V ", V(b )); - $strobe(" "); - $strobe(" V_DDi = %g V ", (V(d )-V(di ))); - $strobe(" V_SSi = %g V ", (V(s )-V(si ))); - $strobe(" "); - $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - `endif - `ifdef RF_S - $strobe("#######################################################"); - $strobe(" "); - $strobe(" MACROMODEL: "); - $strobe(" "); - $strobe(" | "); - $strobe(" | "); - $strobe(" O G "); - $strobe(" | "); - $strobe(" | "); - $strobe(" / "); - $strobe(" \\ "); - $strobe(" / RG = %g Ohm ", rg_t); - $strobe(" \\ "); - $strobe(" | "); - $strobe(" --------------------------o----------- "); - $strobe(" | | | Gi | "); - $strobe(" | ----- | ----- "); - $strobe(" | CGSex ----- ----------- ----- CGDex "); - $strobe(" | | | | | "); - $strobe(" | | | | | "); - $strobe(" | --O---/\\/\\/\\-o-----V | |-----o-/\\/\\/\\---O-- "); - $strobe(" | RS | | | RD = %g Ohm ", rd_wt); - $strobe(" | | Si | Di | RS = %g Ohm ", rs_wt); - $strobe(" ----- /^\\ | /^\\ "); - $strobe(" ----- CGBex --- CJS | --- CJD = %g F ", CDBJ); - $strobe(" | | | Bi | CJS = %g F ", CSBJ); - $strobe(" ---------------+----------| | "); - $strobe(" | | | "); - $strobe(" -----------o----------- "); - $strobe(" | "); - $strobe(" / "); - $strobe(" \\ "); - $strobe(" / RB = %g Ohm ", rb_t); - $strobe(" \\ "); - $strobe(" | "); - $strobe(" O "); - $strobe(" | B "); - $strobe(" | "); - $strobe(" "); - $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - $strobe(" "); - $strobe(" V_Gi = %g V \t V_GiBi = %g V \t V_GiSi = %g V ", V(gi ), (V(gi )-V(bi )), (V(gi )-V(si ))); - $strobe(" V_Di = %g V \t V_DiBi = %g V \t V_DiSi = %g V ", V(di ), (V(di )-V(bi )), (V(di )-V(si ))); - $strobe(" V_Si = %g V \t V_SiBi = %g V ", V(si ), (V(si )-V(bi ))); - $strobe(" V_Bi = %g V ", V(bi )); - $strobe(" "); - $strobe(" V_DDi = %g V ", (V(d )-V(di ))); - $strobe(" V_SSi = %g V ", (V(s )-V(si ))); - $strobe(" V_GGi = %g V ", (V(g )-V(gi ))); - $strobe(" V_BBi = %g V ", (V(b )-V(bi ))); - $strobe(" "); - $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - `endif - `ifdef RF - $strobe("#######################################################"); - $strobe(" "); - $strobe(" MACROMODEL: "); - $strobe(" "); - $strobe(" | "); - $strobe(" | "); - $strobe(" O G "); - $strobe(" | "); - $strobe(" | "); - $strobe(" / "); - $strobe(" \\ "); - $strobe(" / RG = %g Ohm ", rg_t); - $strobe(" \\ "); - $strobe(" | "); - $strobe(" --------------------------o----------- "); - $strobe(" | | | Gi | "); - $strobe(" | ----- | ----- "); - $strobe(" | CGSex ----- ----------- ----- CGDex "); - $strobe(" | | | | | "); - $strobe(" | | | | | "); - $strobe(" | --O---/\\/\\/\\-o-----V | |-----o-/\\/\\/\\---O-- "); - $strobe(" | RS | | | RD = %g Ohm ", rd_wt); - $strobe(" | | Si | Di | RS = %g Ohm ", rs_wt); - $strobe(" ----- /^\\ | /^\\ "); - $strobe(" ----- CGBex --- CJS | --- CJD = %g F ", CDBJ); - $strobe(" | | | Bi | CJS = %g F ", CSBJ); - $strobe(" ---------------+----------| | "); - $strobe(" | | | "); - $strobe(" BSi o--/\\/\\/\\--o--/\\/\\/\\--o BDi "); - $strobe(" | RDSB/2 | RDSB/2 | "); - $strobe(" / / / RDSB = %g Ohm ", rdsb_t); - $strobe(" \\ \\ \\ RDSB/2 = %g Ohm ", rdsb_t/2.0); - $strobe(" / RSB / RB / RDB RSB = %g Ohm ", rsb_t); - $strobe(" \\ \\ \\ RDB = %g Ohm ", rdb_t); - $strobe(" | | | RB = %g Ohm ", rb_t); - $strobe(" -----------O----------- "); - $strobe(" | "); - $strobe(" | B "); - $strobe(" "); - $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - $strobe(" "); - $strobe(" V_Gi = %g V \t V_GiBi = %g V \t V_GiSi = %g V ", V(gi ), (V(gi )-V(bi )), (V(gi )-V(si ))); - $strobe(" V_Di = %g V \t V_DiBi = %g V \t V_DiSi = %g V ", V(di ), (V(di )-V(bi )), (V(di )-V(si ))); - $strobe(" V_Si = %g V \t V_SiBi = %g V ", V(si ), (V(si )-V(bi ))); - $strobe(" V_Bi = %g V ", V(bi )); - $strobe(" "); - $strobe(" V_DDi = %g V ", (V(d )-V(di ))); - $strobe(" V_SSi = %g V ", (V(s )-V(si ))); - $strobe(" V_GGi = %g V ", (V(g )-V(gi ))); - $strobe(" V_BBi = %g V ", (V(b )-V(bi ))); - $strobe(" V_BiBSi = %g V ", (V(bi )-V(bsi))); - $strobe(" V_BiBDi = %g V ", (V(bi )-V(bdi))); - $strobe(" V_BBSi = %g V ", (V(b )-V(bsi))); - $strobe(" V_BBDi = %g V ", (V(b )-V(bdi))); - $strobe(" "); - $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - `endif - `ifdef NQS - $strobe("#######################################################"); - $strobe(" "); - $strobe(" MACROMODEL: "); - $strobe(" "); - $strobe(" | "); - $strobe(" | "); - $strobe(" O G "); - $strobe(" | "); - $strobe(" | "); - $strobe(" / "); - $strobe(" \\ "); - $strobe(" / RG = %g Ohm ", rg_t); - $strobe(" \\ "); - $strobe(" | "); - $strobe(" --------------------------o----------- "); - $strobe(" | | | Gi | "); - $strobe(" | | ----|---- | "); - $strobe(" | ----- | | | ----- "); - $strobe(" | CGSex ----- --- --- --- ----- CGDex "); - $strobe(" | | | | | | | | | "); - $strobe(" | | | | | | | | | "); - $strobe(" | --O---/\\/\\/\\-o-----V --V --V |-----o-/\\/\\/\\---O-- "); - $strobe(" | RS | Si | | | Di | RD = %g Ohm ", rd_wt); - $strobe(" | | ----|---- | RS = %g Ohm ", rs_wt); - $strobe(" ----- /^\\ | /^\\ "); - $strobe(" ----- CGBex --- CJS | --- CJD = %g F ", CDBJ); - $strobe(" | | | Bi | CJS = %g F ", CSBJ); - $strobe(" ---------------+----------| | "); - $strobe(" | | | "); - $strobe(" BSi o--/\\/\\/\\--o--/\\/\\/\\--o BDi "); - $strobe(" | RDSB/2 | RDSB/2 | "); - $strobe(" / / / RDSB = %g Ohm ", rdsb_t); - $strobe(" \\ \\ \\ RDSB/2 = %g Ohm ", rdsb_t/2.0); - $strobe(" / RSB / RB / RDB RSB = %g Ohm ", rsb_t); - $strobe(" \\ \\ \\ RDB = %g Ohm ", rdb_t); - $strobe(" | | | RB = %g Ohm ", rb_t); - $strobe(" -----------O----------- "); - $strobe(" | "); - $strobe(" | B "); - $strobe(" "); - $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - $strobe(" "); - $strobe(" V_Gi = %g V \t V_GiBi = %g V \t V_GiSi = %g V ", V(gi ), (V(gi )-V(bi )), (V(gi )-V(si ))); - $strobe(" V_Di = %g V \t V_DiBi = %g V \t V_DiSi = %g V ", V(di ), (V(di )-V(bi )), (V(di )-V(si ))); - $strobe(" V_Si = %g V \t V_SiBi = %g V ", V(si ), (V(si )-V(bi ))); - $strobe(" V_Bi = %g V ", V(bi )); - $strobe(" "); - $strobe(" V_DDi = %g V ", (V(d )-V(di ))); - $strobe(" V_SSi = %g V ", (V(s )-V(si ))); - $strobe(" V_GGi = %g V ", (V(g )-V(gi ))); - $strobe(" V_BBi = %g V ", (V(b )-V(bi ))); - $strobe(" V_BiBSi = %g V ", (V(bi )-V(bsi))); - $strobe(" V_BiBDi = %g V ", (V(bi )-V(bdi))); - $strobe(" V_BBSi = %g V ", (V(b )-V(bsi))); - $strobe(" V_BBDi = %g V ", (V(b )-V(bdi))); - $strobe(" "); - $strobe(" V_SiBi = %g V ", (V(si )-V(bi ))); - $strobe(" V_M1Bi = %g V \t V_M1Si = %g V ", (V(m1 )-V(bi )), (V(m1 )-V(si ))); - $strobe(" V_M2Bi = %g V \t V_M2M1 = %g V ", (V(m2 )-V(bi )), (V(m2 )-V(m1 ))); - $strobe(" V_M3Bi = %g V \t V_M3M2 = %g V ", (V(m3 )-V(bi )), (V(m3 )-V(m2 ))); - $strobe(" V_M4Bi = %g V \t V_M4M3 = %g V ", (V(m4 )-V(bi )), (V(m4 )-V(m3 ))); - $strobe(" V_DiBi = %g V \t V_DiM4 = %g V ", (V(di )-V(bi )), (V(di )-V(m4 ))); - $strobe(" "); - $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - `endif - $strobe(" "); - $strobe(" CGSex = CGS_OV + CGS_FR_I + CGS_FR_O "); - $strobe(" CGDex = CGD_OV + CGD_FR_I + CGD_FR_O "); - $strobe(" CGBex = CGB_FR_O "); - $strobe(" "); - $strobe(" ID = IDS + IDB - IGD - IGD_OV + IJD + IGIDL = %g A ", ( IDS + IDB - IGD - IGDOV - IDBJ + IGIDL ) ); - $strobe(" IS = - IDS - IGS - IGS_OV + IJS + IGISL = %g A ", ( - IDS - IGS - IGSOV - ISBJ + IGISL ) ); - $strobe(" IG = IGD + IGS + IGB + IGD_OV + IGS_OV = %g A ", ( IGD + IGS + IGB + IGDOV + IGSOV ) ); - $strobe(" IB = - IJD - IJS - IGB - IDB - IGIDL - IGISL = %g A ", ( - IDBJ - ISBJ - IGB - IDB - IGIDL - IGISL ) ); - $strobe(" "); - $strobe(" IDS = %g A ", IDS); - $strobe(" IDB = %g A ", IDB); - $strobe(" IGS = %g A ", IGS); - $strobe(" IGD = %g A ", IGD); - $strobe(" IGB = %g A ", IGB); - $strobe(" IGSOV = %g A ", IGSOV); - $strobe(" IGDOV = %g A ", IGDOV); - $strobe(" ISBJ = %g A ", ISBJ); - $strobe(" IDBJ = %g A ", IDBJ); - $strobe(" IGISL = %g A ", IGISL); - $strobe(" IGIDL = %g A ", IGIDL); - $strobe(""); - $strobe(""); - $strobe("#######################################################"); - $strobe(""); - $strobe(""); - $strobe("########################################"); - $strobe("# #"); - $strobe("# END OF INFORMATION #"); - $strobe("# #"); - $strobe("########################################"); - end - end - else - begin // NO INFO REQUESTED - - end -// file = 0; -// file_info = 0; -// -// $strobe("START_DEBUG_1 %m"); + $strobe("+ PINCH-OFF SURFACE POTENTIAL AND VOLTAGE "); + $strobe("|"); + $strobe(">- PSI_P = %g V ", (psi_p*UT)); + $strobe(">- PSI_P0 = %g V ", (psi_p0*UT)); + $strobe(">"); + $strobe(">- PSI_PO = %g V \t\t (APPROXIMATION AROUND PSI_P=0)", (psi_po*UT)); + $strobe(">- PSI_PO0 = %g V \t\t (APPROXIMATION AROUND PSI_P=0)", (psi_po0*UT)); + $strobe(">"); + $strobe(">- V_P = %g V ", (vp*UT)); + $strobe(">- DPSI_S(DIBL)= %g V \t\t (DRAIN INDUCED BARRIER LOWERING)", (deltapsis*UT)); + $strobe(">- V_P(DIBL) = %g V ", ((vp+deltapsis)*UT)); + $strobe(""); +// VELOCITY SATURATION + $strobe("+ VELOCITY SATURATION "); + $strobe("|"); + $strobe(">- UCRIT = %g V/m \t\t LAMBDA = %g \t\t DELTA = %g \t\t ACLM = %g ", UCRIT, LAMBDA, DELTA, ACLM); + $strobe(">- UCEX = %g \t\t WUCRIT = %g m \t\t KUCRIT = %g ", UCEX, WUCRIT, KUCRIT); + $strobe(">- TLAMBDA= %g \t\t WLAMBDA= %g m ", TLAMBDA, WLAMBDA); + $strobe(">"); + $strobe(">- UCRIT(dev,T) = %g V/m ", UCRIT_DEV_t); + $strobe(">- LAMBDA(dev,T) = %g ", LAMBDA_wt); + $strobe(">"); + $strobe(">- VDS_SAT = %g V \t\t VDS = %g V ", (vdssat*UT), ((vd-vs)*UT)); + $strobe(">- VD_PRIME = %g V \t\t VD = %g V ", (vdp*UT), (vd*UT)); + $strobe(">- DELTA_L = %g m ", deltal); + $strobe(""); + $strobe("+ NORMALIZED (LOCAL) INVERTED CHARGES"); + $strobe("|"); + $strobe(">- qs = %g \t\t V_PS = %g V ", qs, ((vp + deltapsis - vs)*UT)); + $strobe(">- qd = %g \t\t V_PD = %g V ", qdp, ((vp + deltapsis - vdp)*UT)); + $strobe(""); + $strobe("+ CHANNEL CURRENT"); + $strobe("|"); + $strobe(">- if = %g ", if_); + $strobe(">- irp = %g ", irp); + $strobe(">- i = %g ", i); + $strobe(">"); + $strobe(">- Ispec = %g A [2*nq*(UT^2)*beta*(W/L)*(1/(1+delta_QMI))]", Ispec); + $strobe(">"); + $strobe(">- nq = %g ", nq); + $strobe(">- beta = %g A*V^(-2) ", beta); + $strobe(">- W/L = %g ", ((Weff-WEDGE)*NF/(Leff-deltal))); + $strobe(">- 1/(1+delta_QMI) = %g ", inv_dqmip1); + $strobe(">- 2*UT^2 = %g V^2 ", UT2+UT2); + $strobe(">"); + $strobe(">- DITS = %g ", dits_factor); + $strobe(">"); + $strobe(">- #### IDS #### = %g A", IDS); + `ifdef DC_S + $strobe(">"); + $strobe(">- SERIES RESISTANCE = %g ", (1.0/(1.0+(rs_wt*Ispec/UT)*qs+(rd_wt*Ispec/UT)*qdp))); + `endif + $strobe(""); + $strobe("+ CHARGES "); + $strobe("|"); + $strobe(">- qS = %g \t\t qD = %g \t\t qI = %g ", qS, qD, qI); + $strobe(">- qG = %g \t\t qB = %g ", qG, qB); + $strobe(">"); + $strobe(">- Qspec = %g Cb [-UT*Wc*Lc*COX*(1/(1+delta_QMI))]", Q0); + $strobe(">"); + $strobe(">- COX = %g F*m^(-2)", COX); + $strobe(">- Wc*Lc = %g m^2", (Weffc*NF*Leffc*(Weff-WEDGE)/Weff)); + $strobe(">- 1/(1+delta_QMI) = %g ", inv_dqmip1); + $strobe(">- UT = %g V ", UT); + $strobe(">"); + $strobe(">- ## QS ## = %g Cb ", QS); + $strobe(">- ## QD ## = %g Cb ", QD); + $strobe(">- ## QG ## = %g Cb ", QG); + $strobe(">- ## QB ## = %g Cb ", QB); + $strobe(""); + $strobe("+ EDGE CONDUCTION "); + $strobe("|"); + $strobe(">- Ispec_dits_edge = %g A ", Ispec_dits_edge); + $strobe(">- Q0_edge = %g Cb ", Q0_edge); + $strobe(">"); + $strobe(">- DELTA_GAMMA_EDGE_eff = %g V^(1/2) ", (dgamma_edge*sqrtUT)); + $strobe(">- DELTA_PHI_EDGE_eff = %g V ", (dphi_edge*UT)); + $strobe(">"); + $strobe(">- DELTA_V_P_EDGE_eff = %g V ", (dvp_edge*UT)); + $strobe(">"); + $strobe(">- qs_edge= %g \t\t V_PS_edge = %g V ", qs_edge, ((vp + dvp_edge + deltapsis - vs)*UT)); + $strobe(">- qd_edge= %g \t\t V_PD_edge = %g V ", qdp_edge, ((vp + dvp_edge + deltapsis - vdp)*UT)); + $strobe(">"); + $strobe(">- ids_edge= %g ", ids_edge); + $strobe(">"); + $strobe(">- DITS = %g ", dits_factor); + $strobe(">"); + $strobe(">- ### IDS_edge ### = A %g ", IDS_edge); + $strobe(">"); + $strobe(">- PSI_P_edge = %g V", (psi_p_edge*UT)); + $strobe(">- GAMMA_eff_edge(CHSH) = %g V^(1/2)", (gamma_b_chsh_edge*sqrtUT)); + $strobe(">- nq_edge = %g ", nq_edge); + $strobe(">"); + $strobe(">- qS_edge= %g \t\t QS_edge = %g Cb ", qS_edge, QS_edge); + $strobe(">- qD_edge= %g \t\t QD_edge = %g Cb ", qD_edge, QD_edge); + $strobe(">- qG_edge= %g \t\t QG_edge = %g Cb ", qG_edge, QG_edge); + $strobe(">- qB_edge= %g \t\t QB_edge = %g Cb ", qB_edge, QB_edge); + $strobe(""); + $strobe("+ OVERLAP "); + $strobe("|"); + $strobe(">- qSOV = %g ", dpsiox_sov); + $strobe(">- qDOV = %g ", dpsiox_dov); + $strobe(">"); + $strobe(">- Q0OV = %g Cb ", -Q0OV); + $strobe(">"); + $strobe(">- Wc*L(OV)= %g m^2 ", (Weffc*NF*LOV)); + $strobe(">"); + $strobe(">- QSOV = %g Cb ", QSOV); + $strobe(">- QDOV = %g Cb ", QDOV); + $strobe(""); + $strobe("+ INNER FRINGING "); + $strobe("|"); + $strobe(">- QSFR = %g Cb", QSFR); + $strobe(">- QDFR = %g Cb", QDFR); + $strobe(""); + $strobe("+ OUTER FRUNGING CAPACITANCE "); + $strobe("|"); + $strobe(">- CGS = %g F ", (CGSO*WeffNF)); + $strobe(">- CGD = %g F ", (CGDO*WeffNF)); + $strobe(">- CGB = %g F ", (CGBO*2.0*Leff*NF)); + $strobe(""); + $strobe("+ GIDL / GISL "); + $strobe("|"); + $strobe(">- IGISL = %g A", IGISL); + $strobe(">- IGIDL = %g A", IGIDL); + $strobe(""); + $strobe("+ GATE CURRENT "); + $strobe("|"); + $strobe(">- IG = %g A \t\t [IG=IGS+IGD]", IG); + $strobe(">- IGS = %g A", IGS); + $strobe(">- IGD = %g A", IGD); + $strobe(">- IGB = %g A", IGB); + $strobe(">"); + $strobe(">- IGSOV = %g A ", IGSOV); + $strobe(">- IGDOV = %g A ", IGDOV); + $strobe(""); + $strobe("+ IMPACT IONIZATION CURRENT "); + $strobe("|"); + $strobe(">- IDB = %g A ", IDB); + $strobe(""); + $strobe("+ NOISE "); + $strobe("|"); + $strobe(">- THERMAL NOISE \t\t (TH_NOI = %g)", TH_NOI); + $strobe(">- gn = %g \t\t (NORMALIZED EQUIVALENT CHANNEL NOISE RESISTANCE)", gn); + $strobe(">- thermal = %g (PSD) \t\t (THERMAL NOISE) ", thermal); + $strobe(">"); + $strobe(">- FLICKER NOISE"); + $strobe(">- gmg = %g \t\t ", gmg_); + $strobe(">- flicker = %g (PSD) \t\t (FLICKER NOISE AT 1Hz) ", flicker); + $strobe(">"); + $strobe(">- NON-QUASI-STATIC NOISE \t\t (NQS_NOI = %g)", NQS_NOI); + $strobe(">- Sn(id,id) = %g (PSD) ", (Snspec*snidid)); + $strobe(">- Sn(ig,ig) = %g * OMEGA^2 (PSD) ", (Snspec*snigig)); + $strobe(">- Sn(ig,id) = %g * j * OMEGA (PSD) ", (Snspec*snigid)); + $strobe(">- C(ig,id) = %g * j (PSD) ", c_igid); + $strobe(">- Sn(ib,ib) = %g * OMEGA^2 (PSD) ", (Snspec*snibib)); + $strobe(">"); + $strobe(">- GATE SHOT AND FLICKER NOISE "); + $strobe(">- Sig(shot) = %g (PSD) ", sig_shot); + $strobe(">- Sig(flicker,1Hz) = %g (PSD) ", sig_flicker); + $strobe(""); + $strobe("+ EXTRINSIC DIODES "); + $strobe("|"); + $strobe(">- AREA (SOURCE-SIDE) = %g m^2", as); + $strobe(">- PERIMETER (SOURCE-SIDE) = %g m", ps); + $strobe(">- GATE-SIDE (SOURCE-SIDE) = %g m", WeffNF); + $strobe(">- AREA (DRAIN-SIDE) = %g m^2", ad); + $strobe(">- PERIMETER (DRAIN-SIDE) = %g m", pd); + $strobe(">- GATE-SIDE (DRAIN-SIDE) = %g m", WeffNF); + $strobe(">"); + $strobe(">- IS_S = %g A ", is_s); + $strobe(">- IS_D = %g A ", is_d); + $strobe(">"); + $strobe(">- ISB_TUN = %g A", isb_tun); + $strobe(">- IDB_TUN = %g A", idb_tun); + $strobe(">"); + $strobe(">- ISBJ = %g A", ISBJ); + $strobe(">- IDBJ = %g A", IDBJ); + $strobe(">"); + $strobe(">- CSBJ = %g F \t\t QSBJ = %g Cb", CSBJ, QSBJ); + $strobe(">- CDBJ = %g F \t\t QDBJ = %g Cb", CDBJ, QDBJ); + $strobe(""); + $strobe("+ EXTRINSIC RESISTORS "); + $strobe("|"); + `ifdef DC_S + $strobe(">- RS = %g Ohm \t\t NOISE = %g (PSD)", rs_wt, (KT4/rs_wt)); + $strobe(">- RD = %g Ohm \t\t NOISE = %g (PSD)", rd_wt, (KT4/rd_wt)); + `endif + `ifdef DC + $strobe(">- RS = %g Ohm \t\t NOISE = %g (PSD)", rs_wt, (KT4/rs_wt)); + $strobe(">- RD = %g Ohm \t\t NOISE = %g (PSD)", rd_wt, (KT4/rd_wt)); + `endif + `ifdef RF_S + $strobe(">- RS = %g Ohm \t\t NOISE = %g (PSD)", rs_wt, (KT4/rs_wt)); + $strobe(">- RD = %g Ohm \t\t NOISE = %g (PSD)", rd_wt, (KT4/rd_wt)); + $strobe(">- RG = %g Ohm \t\t NOISE = %g (PSD)", rg_t, (KT4/rg_t)); + $strobe(">- RB = %g Ohm \t\t NOISE = %g (PSD)", rb_t, (KT4/rb_t)); + `endif + `ifdef RF + $strobe(">- RS = %g Ohm \t\t NOISE = %g (PSD)", rs_wt, (KT4/rs_wt)); + $strobe(">- RD = %g Ohm \t\t NOISE = %g (PSD)", rd_wt, (KT4/rd_wt)); + $strobe(">- RG = %g Ohm \t\t NOISE = %g (PSD)", rg_t, (KT4/rg_t)); + $strobe(">- RB = %g Ohm \t\t NOISE = %g (PSD)", rb_t, (KT4/rb_t)); + $strobe(">- RSB = %g Ohm \t\t NOISE = %g (PSD)", rsb_t, (KT4/rsb_t)); + $strobe(">- RDB = %g Ohm \t\t NOISE = %g (PSD)", rdb_t, (KT4/rdb_t)); + $strobe(">- RDSB = %g Ohm \t\t NOISE = %g (PSD)", rdsb_t, (KT4/rdsb_t)); + $strobe(">- RDSB/2 = %g Ohm \t\t NOISE = %g (PSD)", rdsb_t*0.5, (0.5*KT4/rdsb_t)); + `endif + `ifdef NQS + $strobe(">- RS = %g Ohm \t\t NOISE = %g (PSD)", rs_wt, (KT4/rs_wt)); + $strobe(">- RD = %g Ohm \t\t NOISE = %g (PSD)", rd_wt, (KT4/rd_wt)); + $strobe(">- RG = %g Ohm \t\t NOISE = %g (PSD)", rg_t, (KT4/rg_t)); + $strobe(">- RB = %g Ohm \t\t NOISE = %g (PSD)", rb_t, (KT4/rb_t)); + $strobe(">- RSB = %g Ohm \t\t NOISE = %g (PSD)", rsb_t, (KT4/rsb_t)); + $strobe(">- RDB = %g Ohm \t\t NOISE = %g (PSD)", rdb_t, (KT4/rdb_t)); + $strobe(">- RDSB = %g Ohm \t\t NOISE = %g (PSD)", rdsb_t, (KT4/rdsb_t)); + $strobe(">- RDSB/2 = %g Ohm \t\t NOISE = %g (PSD)", rdsb_t*0.5, (0.5*KT4/rdsb_t)); + `endif + $strobe(""); + $strobe(""); + `ifdef DC_S + $strobe("#######################################################"); + $strobe(" "); + $strobe(" MACROMODEL: "); + $strobe(" "); + $strobe(" | "); + $strobe(" | G "); + $strobe(" --------------------------O----------- "); + $strobe(" | | | | "); + $strobe(" | ----- | ----- "); + $strobe(" | CGSex ----- ----------- ----- CGDex "); + $strobe(" | | | | | "); + $strobe(" | | | | | "); + $strobe(" | --O-----V | |-----O-- "); + $strobe(" | | S | D | "); + $strobe(" | | | | "); + $strobe(" ----- /^\\ | /^\\ "); + $strobe(" ----- CGBex --- CJS | --- CJD = %g F ", CDBJ); + $strobe(" | | | | CJS = %g F ", CSBJ); + $strobe(" ---------------+----------| | "); + $strobe(" | | B | "); + $strobe(" -----------O----------- "); + $strobe(" | "); + $strobe(" | "); + $strobe(" "); + $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); + $strobe(" "); + $strobe(" V_G = %g V \t V_GB = %g V \t V_GS = %g V ", V(g ), (V(g )-V(b )), (V(g )-V(s ))); + $strobe(" V_D = %g V \t V_DB = %g V \t V_DS = %g V ", V(d ), (V(d )-V(b )), (V(d )-V(s ))); + $strobe(" V_S = %g V \t V_SB = %g V ", V(s ), (V(s )-V(b ))); + $strobe(" V_B = %g V ", V(b )); + $strobe(" "); + $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); + `endif + `ifdef DC + $strobe("#######################################################"); + $strobe(" "); + $strobe(" MACROMODEL: "); + $strobe(" "); + $strobe(" | "); + $strobe(" | G "); + $strobe(" --------------------------O----------- "); + $strobe(" | | | | "); + $strobe(" | ----- | ----- "); + $strobe(" | CGSex ----- ----------- ----- CGDex "); + $strobe(" | | | | | "); + $strobe(" | | | | | "); + $strobe(" | --O---/\\/\\/\\-o-----V | |-----o-/\\/\\/\\---O-- "); + $strobe(" | RS | | | RD = %g Ohm ", rd_wt); + $strobe(" | | Si | Di | RS = %g Ohm ", rs_wt); + $strobe(" ----- /^\\ | /^\\ "); + $strobe(" ----- CGBex --- CJS | --- CJD = %g F ", CDBJ); + $strobe(" | | | | CJS = %g F ", CSBJ); + $strobe(" ---------------+----------| | "); + $strobe(" | | B | "); + $strobe(" -----------O----------- "); + $strobe(" | "); + $strobe(" | "); + $strobe(" "); + $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); + $strobe(" "); + $strobe(" V_G = %g V \t V_GB = %g V \t V_GSi = %g V ", V(g ), (V(g )-V(b )), (V(g )-V(si ))); + $strobe(" V_Di = %g V \t V_DiB = %g V \t V_DiSi = %g V ", V(di ), (V(di )-V(b )), (V(di )-V(si ))); + $strobe(" V_Si = %g V \t V_SiB = %g V ", V(si ), (V(si )-V(b ))); + $strobe(" V_B = %g V ", V(b )); + $strobe(" "); + $strobe(" V_DDi = %g V ", (V(d )-V(di ))); + $strobe(" V_SSi = %g V ", (V(s )-V(si ))); + $strobe(" "); + $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); + `endif + `ifdef RF_S + $strobe("#######################################################"); + $strobe(" "); + $strobe(" MACROMODEL: "); + $strobe(" "); + $strobe(" | "); + $strobe(" | "); + $strobe(" O G "); + $strobe(" | "); + $strobe(" | "); + $strobe(" / "); + $strobe(" \\ "); + $strobe(" / RG = %g Ohm ", rg_t); + $strobe(" \\ "); + $strobe(" | "); + $strobe(" --------------------------o----------- "); + $strobe(" | | | Gi | "); + $strobe(" | ----- | ----- "); + $strobe(" | CGSex ----- ----------- ----- CGDex "); + $strobe(" | | | | | "); + $strobe(" | | | | | "); + $strobe(" | --O---/\\/\\/\\-o-----V | |-----o-/\\/\\/\\---O-- "); + $strobe(" | RS | | | RD = %g Ohm ", rd_wt); + $strobe(" | | Si | Di | RS = %g Ohm ", rs_wt); + $strobe(" ----- /^\\ | /^\\ "); + $strobe(" ----- CGBex --- CJS | --- CJD = %g F ", CDBJ); + $strobe(" | | | Bi | CJS = %g F ", CSBJ); + $strobe(" ---------------+----------| | "); + $strobe(" | | | "); + $strobe(" -----------o----------- "); + $strobe(" | "); + $strobe(" / "); + $strobe(" \\ "); + $strobe(" / RB = %g Ohm ", rb_t); + $strobe(" \\ "); + $strobe(" | "); + $strobe(" O "); + $strobe(" | B "); + $strobe(" | "); + $strobe(" "); + $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); + $strobe(" "); + $strobe(" V_Gi = %g V \t V_GiBi = %g V \t V_GiSi = %g V ", V(gi ), (V(gi )-V(bi )), (V(gi )-V(si ))); + $strobe(" V_Di = %g V \t V_DiBi = %g V \t V_DiSi = %g V ", V(di ), (V(di )-V(bi )), (V(di )-V(si ))); + $strobe(" V_Si = %g V \t V_SiBi = %g V ", V(si ), (V(si )-V(bi ))); + $strobe(" V_Bi = %g V ", V(bi )); + $strobe(" "); + $strobe(" V_DDi = %g V ", (V(d )-V(di ))); + $strobe(" V_SSi = %g V ", (V(s )-V(si ))); + $strobe(" V_GGi = %g V ", (V(g )-V(gi ))); + $strobe(" V_BBi = %g V ", (V(b )-V(bi ))); + $strobe(" "); + $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); + `endif + `ifdef RF + $strobe("#######################################################"); + $strobe(" "); + $strobe(" MACROMODEL: "); + $strobe(" "); + $strobe(" | "); + $strobe(" | "); + $strobe(" O G "); + $strobe(" | "); + $strobe(" | "); + $strobe(" / "); + $strobe(" \\ "); + $strobe(" / RG = %g Ohm ", rg_t); + $strobe(" \\ "); + $strobe(" | "); + $strobe(" --------------------------o----------- "); + $strobe(" | | | Gi | "); + $strobe(" | ----- | ----- "); + $strobe(" | CGSex ----- ----------- ----- CGDex "); + $strobe(" | | | | | "); + $strobe(" | | | | | "); + $strobe(" | --O---/\\/\\/\\-o-----V | |-----o-/\\/\\/\\---O-- "); + $strobe(" | RS | | | RD = %g Ohm ", rd_wt); + $strobe(" | | Si | Di | RS = %g Ohm ", rs_wt); + $strobe(" ----- /^\\ | /^\\ "); + $strobe(" ----- CGBex --- CJS | --- CJD = %g F ", CDBJ); + $strobe(" | | | Bi | CJS = %g F ", CSBJ); + $strobe(" ---------------+----------| | "); + $strobe(" | | | "); + $strobe(" BSi o--/\\/\\/\\--o--/\\/\\/\\--o BDi "); + $strobe(" | RDSB/2 | RDSB/2 | "); + $strobe(" / / / RDSB = %g Ohm ", rdsb_t); + $strobe(" \\ \\ \\ RDSB/2 = %g Ohm ", rdsb_t/2.0); + $strobe(" / RSB / RB / RDB RSB = %g Ohm ", rsb_t); + $strobe(" \\ \\ \\ RDB = %g Ohm ", rdb_t); + $strobe(" | | | RB = %g Ohm ", rb_t); + $strobe(" -----------O----------- "); + $strobe(" | "); + $strobe(" | B "); + $strobe(" "); + $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); + $strobe(" "); + $strobe(" V_Gi = %g V \t V_GiBi = %g V \t V_GiSi = %g V ", V(gi ), (V(gi )-V(bi )), (V(gi )-V(si ))); + $strobe(" V_Di = %g V \t V_DiBi = %g V \t V_DiSi = %g V ", V(di ), (V(di )-V(bi )), (V(di )-V(si ))); + $strobe(" V_Si = %g V \t V_SiBi = %g V ", V(si ), (V(si )-V(bi ))); + $strobe(" V_Bi = %g V ", V(bi )); + $strobe(" "); + $strobe(" V_DDi = %g V ", (V(d )-V(di ))); + $strobe(" V_SSi = %g V ", (V(s )-V(si ))); + $strobe(" V_GGi = %g V ", (V(g )-V(gi ))); + $strobe(" V_BBi = %g V ", (V(b )-V(bi ))); + $strobe(" V_BiBSi = %g V ", (V(bi )-V(bsi))); + $strobe(" V_BiBDi = %g V ", (V(bi )-V(bdi))); + $strobe(" V_BBSi = %g V ", (V(b )-V(bsi))); + $strobe(" V_BBDi = %g V ", (V(b )-V(bdi))); + $strobe(" "); + $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); + `endif + `ifdef NQS + $strobe("#######################################################"); + $strobe(" "); + $strobe(" MACROMODEL: "); + $strobe(" "); + $strobe(" | "); + $strobe(" | "); + $strobe(" O G "); + $strobe(" | "); + $strobe(" | "); + $strobe(" / "); + $strobe(" \\ "); + $strobe(" / RG = %g Ohm ", rg_t); + $strobe(" \\ "); + $strobe(" | "); + $strobe(" --------------------------o----------- "); + $strobe(" | | | Gi | "); + $strobe(" | | ----|---- | "); + $strobe(" | ----- | | | ----- "); + $strobe(" | CGSex ----- --- --- --- ----- CGDex "); + $strobe(" | | | | | | | | | "); + $strobe(" | | | | | | | | | "); + $strobe(" | --O---/\\/\\/\\-o-----V --V --V |-----o-/\\/\\/\\---O-- "); + $strobe(" | RS | Si | | | Di | RD = %g Ohm ", rd_wt); + $strobe(" | | ----|---- | RS = %g Ohm ", rs_wt); + $strobe(" ----- /^\\ | /^\\ "); + $strobe(" ----- CGBex --- CJS | --- CJD = %g F ", CDBJ); + $strobe(" | | | Bi | CJS = %g F ", CSBJ); + $strobe(" ---------------+----------| | "); + $strobe(" | | | "); + $strobe(" BSi o--/\\/\\/\\--o--/\\/\\/\\--o BDi "); + $strobe(" | RDSB/2 | RDSB/2 | "); + $strobe(" / / / RDSB = %g Ohm ", rdsb_t); + $strobe(" \\ \\ \\ RDSB/2 = %g Ohm ", rdsb_t/2.0); + $strobe(" / RSB / RB / RDB RSB = %g Ohm ", rsb_t); + $strobe(" \\ \\ \\ RDB = %g Ohm ", rdb_t); + $strobe(" | | | RB = %g Ohm ", rb_t); + $strobe(" -----------O----------- "); + $strobe(" | "); + $strobe(" | B "); + $strobe(" "); + $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); + $strobe(" "); + $strobe(" V_Gi = %g V \t V_GiBi = %g V \t V_GiSi = %g V ", V(gi ), (V(gi )-V(bi )), (V(gi )-V(si ))); + $strobe(" V_Di = %g V \t V_DiBi = %g V \t V_DiSi = %g V ", V(di ), (V(di )-V(bi )), (V(di )-V(si ))); + $strobe(" V_Si = %g V \t V_SiBi = %g V ", V(si ), (V(si )-V(bi ))); + $strobe(" V_Bi = %g V ", V(bi )); + $strobe(" "); + $strobe(" V_DDi = %g V ", (V(d )-V(di ))); + $strobe(" V_SSi = %g V ", (V(s )-V(si ))); + $strobe(" V_GGi = %g V ", (V(g )-V(gi ))); + $strobe(" V_BBi = %g V ", (V(b )-V(bi ))); + $strobe(" V_BiBSi = %g V ", (V(bi )-V(bsi))); + $strobe(" V_BiBDi = %g V ", (V(bi )-V(bdi))); + $strobe(" V_BBSi = %g V ", (V(b )-V(bsi))); + $strobe(" V_BBDi = %g V ", (V(b )-V(bdi))); + $strobe(" "); + $strobe(" V_SiBi = %g V ", (V(si )-V(bi ))); + $strobe(" V_M1Bi = %g V \t V_M1Si = %g V ", (V(m1 )-V(bi )), (V(m1 )-V(si ))); + $strobe(" V_M2Bi = %g V \t V_M2M1 = %g V ", (V(m2 )-V(bi )), (V(m2 )-V(m1 ))); + $strobe(" V_M3Bi = %g V \t V_M3M2 = %g V ", (V(m3 )-V(bi )), (V(m3 )-V(m2 ))); + $strobe(" V_M4Bi = %g V \t V_M4M3 = %g V ", (V(m4 )-V(bi )), (V(m4 )-V(m3 ))); + $strobe(" V_DiBi = %g V \t V_DiM4 = %g V ", (V(di )-V(bi )), (V(di )-V(m4 ))); + $strobe(" "); + $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); + `endif + $strobe(" "); + $strobe(" CGSex = CGS_OV + CGS_FR_I + CGS_FR_O "); + $strobe(" CGDex = CGD_OV + CGD_FR_I + CGD_FR_O "); + $strobe(" CGBex = CGB_FR_O "); + $strobe(" "); + $strobe(" ID = IDS + IDB - IGD - IGD_OV + IJD + IGIDL = %g A ", ( IDS + IDB - IGD - IGDOV - IDBJ + IGIDL ) ); + $strobe(" IS = - IDS - IGS - IGS_OV + IJS + IGISL = %g A ", ( - IDS - IGS - IGSOV - ISBJ + IGISL ) ); + $strobe(" IG = IGD + IGS + IGB + IGD_OV + IGS_OV = %g A ", ( IGD + IGS + IGB + IGDOV + IGSOV ) ); + $strobe(" IB = - IJD - IJS - IGB - IDB - IGIDL - IGISL = %g A ", ( - IDBJ - ISBJ - IGB - IDB - IGIDL - IGISL ) ); + $strobe(" "); + $strobe(" IDS = %g A ", IDS); + $strobe(" IDB = %g A ", IDB); + $strobe(" IGS = %g A ", IGS); + $strobe(" IGD = %g A ", IGD); + $strobe(" IGB = %g A ", IGB); + $strobe(" IGSOV = %g A ", IGSOV); + $strobe(" IGDOV = %g A ", IGDOV); + $strobe(" ISBJ = %g A ", ISBJ); + $strobe(" IDBJ = %g A ", IDBJ); + $strobe(" IGISL = %g A ", IGISL); + $strobe(" IGIDL = %g A ", IGIDL); + $strobe(""); + $strobe(""); + $strobe("#######################################################"); + $strobe(""); + $strobe(""); + $strobe("########################################"); + $strobe("# #"); + $strobe("# END OF INFORMATION #"); + $strobe("# #"); + $strobe("########################################"); + end + end + else + begin // NO INFO REQUESTED + + end +// file = 0; +// file_info = 0; +// +// $strobe("START_DEBUG_1 %m"); // -// @(initial_step) $strobe("START_DEBUG %m"); -// @(final_step) $strobe("VGB:%g \t VSB:%g \t VDB:%g",V(g)-V(b),V(s)-V(b),V(d)-V(b)); -// @(final_step) $strobe("qs:%g \t qdp:%g",qs,qdp); -// @(final_step) $strobe("END_DEBUG %m"); +// @(initial_step) $strobe("START_DEBUG %m"); +// @(final_step) $strobe("VGB:%g \t VSB:%g \t VDB:%g",V(g)-V(b),V(s)-V(b),V(d)-V(b)); +// @(final_step) $strobe("qs:%g \t qdp:%g",qs,qdp); +// @(final_step) $strobe("END_DEBUG %m"); // -// extract info to file (ekv3_debug.txt) +// extract info to file (ekv3_debug.txt) // uncomment the "integer file" command at the ekv3_variables.va file // -// @(initial_step) file = $fopen("ekv3_debug.txt"); -// @(final_step) $fstrobe(file,"VGB:%g \t VSB:%g \t VDB:%g",V(g)-V(b),V(s)-V(b),V(d)-V(b)); -// @(final_step) $fstrobe(file,"qs:%g \t qdp:%g",qs,qdp); -// @(final_step) $fclose(file); +// @(initial_step) file = $fopen("ekv3_debug.txt"); +// @(final_step) $fstrobe(file,"VGB:%g \t VSB:%g \t VDB:%g",V(g)-V(b),V(s)-V(b),V(d)-V(b)); +// @(final_step) $fstrobe(file,"qs:%g \t qdp:%g",qs,qdp); +// @(final_step) $fclose(file); // -// extract info to file (ekv3_info.txt) -// uncomment the "integer file_info" command at the ekv3_variables.va file +// extract info to file (ekv3_info.txt) +// uncomment the "integer file_info" command at the ekv3_variables.va file // -// @(initial_step) file_info = $fopen("ekv3_info.txt"); +// @(initial_step) file_info = $fopen("ekv3_info.txt"); // -// @(final_step) $fstrobe(file_info,"VGB:%g \t VSB:%g \t VDB:%g",V(g)-V(b),V(s)-V(b),V(d)-V(b)); -// @(final_step) $fstrobe(file_info,"qs:%g \t qdp:%g",qs,qdp); +// @(final_step) $fstrobe(file_info,"VGB:%g \t VSB:%g \t VDB:%g",V(g)-V(b),V(s)-V(b),V(d)-V(b)); +// @(final_step) $fstrobe(file_info,"qs:%g \t qdp:%g",qs,qdp); // -// @(final_step) $fclose(file_info); +// @(final_step) $fclose(file_info); end diff --git a/code/ekv3_include/ekv3_extrinsic_diodes.va b/code/ekv3_include/ekv3_extrinsic_diodes.va index b4a26c1..57ff773 100644 --- a/code/ekv3_include/ekv3_extrinsic_diodes.va +++ b/code/ekv3_include/ekv3_extrinsic_diodes.va @@ -1,196 +1,196 @@ // EXTERNAL: DIODES begin : DIODES -begin : TEMPERATURE_DIODES +begin : TEMPERATURE_DIODES // CALCULATION OF JUNCTION DIODES PARAMETERS, FOR BOTH (SOURCE AND DRAIN) SIDES AS THEY ARE AFFECTED BY TEMPERATURE // CURRENT PARAMETERS - tmp = eg_tnom / UTNOM - eg_t / UT; // NOTE: Used in temp_arg_S and temp_arg_D variables - temp_arg_S = exp((tmp + XTIS * lnrT) / NJS); // NOTE: Used in jss_t, jssws_t and jsswgs_t variables - temp_arg_D = exp((tmp + XTID * lnrT) / NJD); // NOTE: Used in jsd_t, jsswd_t and jsswgd_t variables - jss_t = JSS * temp_arg_S; - jssws_t = JSSWS * temp_arg_S; - jsswgs_t = JSSWGS * temp_arg_S; - jsd_t = JSD * temp_arg_D; - jsswd_t = JSSWD * temp_arg_D; - jsswgd_t = JSSWGD * temp_arg_D; + tmp = eg_tnom / UTNOM - eg_t / UT; // NOTE: Used in temp_arg_S and temp_arg_D variables + temp_arg_S = exp((tmp + XTIS * lnrT) / NJS); // NOTE: Used in jss_t, jssws_t and jsswgs_t variables + temp_arg_D = exp((tmp + XTID * lnrT) / NJD); // NOTE: Used in jsd_t, jsswd_t and jsswgd_t variables + jss_t = JSS * temp_arg_S; + jssws_t = JSSWS * temp_arg_S; + jsswgs_t = JSSWGS * temp_arg_S; + jsd_t = JSD * temp_arg_D; + jsswd_t = JSSWD * temp_arg_D; + jsswgd_t = JSSWGD * temp_arg_D; // CAPACITANCE PARAMETERS - cjs_t = CJS * (1.0 + TCJ * dT); - cjsws_t = CJSWS * (1.0 + TCJSW * dT); - cjswgs_t = CJSWGS * (1.0 + TCJSWG * dT); - cjd_t = CJD * (1.0 + TCJ * dT); - cjswd_t = CJSWD * (1.0 + TCJSW * dT); - cjswgd_t = CJSWGD * (1.0 + TCJSWG * dT); + cjs_t = CJS * (1.0 + TCJ * dT); + cjsws_t = CJSWS * (1.0 + TCJSW * dT); + cjswgs_t = CJSWGS * (1.0 + TCJSWG * dT); + cjd_t = CJD * (1.0 + TCJ * dT); + cjswd_t = CJSWD * (1.0 + TCJSW * dT); + cjswgd_t = CJSWGD * (1.0 + TCJSWG * dT); // CAPACITANCE VOLTAGE PARAMETERS - pbs_t = PBS - (TPB * dT); - pbsws_t = PBSWS - (TPBSW * dT); - pbswgs_t = PBSWGS - (TPBSWG * dT); - pbd_t = PBD - (TPB * dT); - pbswd_t = PBSWD - (TPBSW * dT); - pbswgd_t = PBSWGD - (TPBSWG * dT); + pbs_t = PBS - (TPB * dT); + pbsws_t = PBSWS - (TPBSW * dT); + pbswgs_t = PBSWGS - (TPBSWG * dT); + pbd_t = PBD - (TPB * dT); + pbswd_t = PBSWD - (TPBSW * dT); + pbswgd_t = PBSWGD - (TPBSWG * dT); // TRAP-ASSISTED CURERNT PARAMETERS - tmp = - eg_tnom / UT * (1.0 - rT); // NOTE: Used in jtss_t, jtssws_t, jtsswgs_t, jtsd_t, jtsswd_t and jtsswgd_t variables - jtss_t = JTSS * exp(tmp * XTSS); - jtssws_t = JTSSWS * exp(tmp * XTSSWS); - jtsswgs_t = JTSSWGS * exp(tmp * XTSSWGS); - jtsd_t = JTSD * exp(tmp * XTSD); - jtsswd_t = JTSSWD * exp(tmp * XTSSWD); - jtsswgd_t = JTSSWGD * exp(tmp * XTSSWGD); + tmp = - eg_tnom / UT * (1.0 - rT); // NOTE: Used in jtss_t, jtssws_t, jtsswgs_t, jtsd_t, jtsswd_t and jtsswgd_t variables + jtss_t = JTSS * exp(tmp * XTSS); + jtssws_t = JTSSWS * exp(tmp * XTSSWS); + jtsswgs_t = JTSSWGS * exp(tmp * XTSSWGS); + jtsd_t = JTSD * exp(tmp * XTSD); + jtsswd_t = JTSSWD * exp(tmp * XTSSWD); + jtsswgd_t = JTSSWGD * exp(tmp * XTSSWGD); // SLOPE PARAMETER FOR TRAP-ASSISTED CURRENT - tmp = rT - 1.0; // NOTE: Used in njtss_t, njtssws_t, njtsswgs_t, njtsd_t, njtsswd_t and njtsswgd_t variables - njtss_t = NJTSS * (1.0 + tmp * TNJTSS); - njtssws_t = NJTSSWS * (1.0 + tmp * TNJTSSWS); - njtsswgs_t = NJTSSWGS * (1.0 + tmp * TNJTSSWGS); - njtsd_t = NJTSD * (1.0 + tmp * TNJTSD); - njtsswd_t = NJTSSWD * (1.0 + tmp * TNJTSSWD); - njtsswgd_t = NJTSSWGD * (1.0 + tmp * TNJTSSWGD); -end // TEMPERATURE_DIODES + tmp = rT - 1.0; // NOTE: Used in njtss_t, njtssws_t, njtsswgs_t, njtsd_t, njtsswd_t and njtsswgd_t variables + njtss_t = NJTSS * (1.0 + tmp * TNJTSS); + njtssws_t = NJTSSWS * (1.0 + tmp * TNJTSSWS); + njtsswgs_t = NJTSSWGS * (1.0 + tmp * TNJTSSWGS); + njtsd_t = NJTSD * (1.0 + tmp * TNJTSD); + njtsswd_t = NJTSSWD * (1.0 + tmp * TNJTSSWD); + njtsswgd_t = NJTSSWGD * (1.0 + tmp * TNJTSSWGD); +end // TEMPERATURE_DIODES begin : SCALING_GEOMETRY_JUNCTION_DIODES // CALCULATIONS OF GEOMETRIC CHARACTERISTICS OF THE JUNCTION DIODES -// AREA AND SIDEWAYS PERIMETER OF BOTH (SOURCE AND DRAIN) SIDES JUNCTIONS ARE CALCULATED +// AREA AND SIDEWAYS PERIMETER OF BOTH (SOURCE AND DRAIN) SIDES JUNCTIONS ARE CALCULATED // GATESIDE PERIMETER IS ALREADY CALCULATED AND IS EQUAL TO "WeffNF" // AS, PS, AD AND PD PARAMETERS OVERRIDE HDIF PARAMETER - if ((AS == 0.0) && (HDIF > 0.0)) - begin -// if (NF % 2 == 0) // EVEN NUMBER OF FINGERS - if (even_nf == NF) - as = hdif * Weff * (NF + 2); // NOTE: hdif and Weff are already scaled with SCALE parameter - else // ODD NUMBER OF FINGERS - as = hdif * Weff * (NF + 1); // NOTE: hdif and Weff are already scaled with SCALE parameter - end - else - as = AS * SCALE * SCALE; - - if ((PS == 0.0) && (HDIF > 0.0)) - begin -// if (NF % 2 == 0) // EVEN NUMBER OF FINGERS + if ((AS == 0.0) && (HDIF > 0.0)) + begin +// if (NF % 2 == 0) // EVEN NUMBER OF FINGERS + if (even_nf == NF) + as = hdif * Weff * (NF + 2); // NOTE: hdif and Weff are already scaled with SCALE parameter + else // ODD NUMBER OF FINGERS + as = hdif * Weff * (NF + 1); // NOTE: hdif and Weff are already scaled with SCALE parameter + end + else + as = AS * SCALE * SCALE; + + if ((PS == 0.0) && (HDIF > 0.0)) + begin +// if (NF % 2 == 0) // EVEN NUMBER OF FINGERS if (even_nf == NF) - ps = 2.0 * (hdif * (NF + 2) + Weff); // NOTE: hdif and Weff are already scaled with SCALE parameter - else // ODD NUMBER OF FINGERS - ps = 2.0 * hdif * (NF + 1) + Weff; // NOTE: hdif and Weff are already scaled with SCALE parameter - end - else - ps = PS * SCALE; - - if ((AD == 0.0) && (HDIF > 0.0)) - begin -// if (NF % 2 == 0) // EVEN NUMBER OF FINGERS + ps = 2.0 * (hdif * (NF + 2) + Weff); // NOTE: hdif and Weff are already scaled with SCALE parameter + else // ODD NUMBER OF FINGERS + ps = 2.0 * hdif * (NF + 1) + Weff; // NOTE: hdif and Weff are already scaled with SCALE parameter + end + else + ps = PS * SCALE; + + if ((AD == 0.0) && (HDIF > 0.0)) + begin +// if (NF % 2 == 0) // EVEN NUMBER OF FINGERS if (even_nf == NF) - ad = hdif * Weff * (NF ); // NOTE: hdif and Weff are already scaled with SCALE parameter - else // ODD NUMBER OF FINGERS - ad = hdif * Weff * (NF + 1); // NOTE: hdif and Weff are already scaled with SCALE parameter - end - else - ad = AD * SCALE * SCALE; - - if ((PD == 0.0) && (HDIF > 0.0)) - begin -// if (NF % 2 == 0) // EVEN NUMBER OF FINGERS + ad = hdif * Weff * (NF ); // NOTE: hdif and Weff are already scaled with SCALE parameter + else // ODD NUMBER OF FINGERS + ad = hdif * Weff * (NF + 1); // NOTE: hdif and Weff are already scaled with SCALE parameter + end + else + ad = AD * SCALE * SCALE; + + if ((PD == 0.0) && (HDIF > 0.0)) + begin +// if (NF % 2 == 0) // EVEN NUMBER OF FINGERS if (even_nf == NF) - pd = 2.0 * hdif * NF; // NOTE: hdif and Weff are already scaled with SCALE parameter - else // ODD NUMBER OF FINGERS - pd = 2.0 * hdif * (NF + 1) + Weff; // NOTE: hdif and Weff are already scaled with SCALE parameter - end - else - pd = PD * SCALE; + pd = 2.0 * hdif * NF; // NOTE: hdif and Weff are already scaled with SCALE parameter + else // ODD NUMBER OF FINGERS + pd = 2.0 * hdif * (NF + 1) + Weff; // NOTE: hdif and Weff are already scaled with SCALE parameter + end + else + pd = PD * SCALE; end // SCALING_GEOMETRY_JUNCTION_DIODES // READING THE INPUT VOLTAGES FOR THE JUNCTION DIODES // THE EXACT NODES DEPEND ON THE MODE USED AND THE INTERNAL NODES CREATED. `ifdef DC_S - v_sbj = SIGN * V(s ,b ); - v_dbj = SIGN * V(d ,b ); + v_sbj = SIGN * V(s ,b ); + v_dbj = SIGN * V(d ,b ); `endif `ifdef DC - v_sbj = SIGN * V(si,b ); - v_dbj = SIGN * V(di,b ); + v_sbj = SIGN * V(si,b ); + v_dbj = SIGN * V(di,b ); `endif `ifdef RF_S - v_sbj = SIGN * V(si,bi ); - v_dbj = SIGN * V(di,bi ); + v_sbj = SIGN * V(si,bi ); + v_dbj = SIGN * V(di,bi ); `endif `ifdef RF - v_sbj = SIGN * V(si,bsi); - v_dbj = SIGN * V(di,bdi); + v_sbj = SIGN * V(si,bsi); + v_dbj = SIGN * V(di,bdi); `endif `ifdef NQS - v_sbj = SIGN * V(si,bsi); - v_dbj = SIGN * V(di,bdi); + v_sbj = SIGN * V(si,bsi); + v_dbj = SIGN * V(di,bdi); `endif // CALCULATION OF THE DIODE-CURRENTS // SOURCE-SIDE - is_s = jss_t * as + jssws_t * ps + jsswgs_t * WeffNF; - tmp = rT / (UT * NJS); - arg_s = - v_sbj * tmp; - f_breakdown_s = 1.0 + XJBVS * exp(-(-v_sbj + BVS) * tmp); // NOTE: Breakdown effect - isb = is_s * (1.0 - exp(arg_s)) * f_breakdown_s; + is_s = jss_t * as + jssws_t * ps + jsswgs_t * WeffNF; + tmp = rT / (UT * NJS); + arg_s = - v_sbj * tmp; + f_breakdown_s = 1.0 + XJBVS * exp(-(-v_sbj + BVS) * tmp); // NOTE: Breakdown effect + isb = is_s * (1.0 - exp(arg_s)) * f_breakdown_s; // SOURCE-SIDE TRAP-ASSISTED CURRENT - tmp = v_sbj * rT / UT; - isb_tun = as * jtss_t * (exp(tmp / njtss_t * VTSS / max(VTSS + v_sbj,1.0E-3)) - 1.0) + ps * jtssws_t * (exp(tmp / njtssws_t * VTSSWS / max(VTSSWS + v_sbj,1.0E-3)) - 1.0) + WeffNF * jtsswgs_t * (exp(tmp / njtsswgs_t * VTSSWGS / max(VTSSWGS + v_sbj,1.0E-3)) - 1.0); + tmp = v_sbj * rT / UT; + isb_tun = as * jtss_t * (exp(tmp / njtss_t * VTSS / max(VTSS + v_sbj,1.0E-3)) - 1.0) + ps * jtssws_t * (exp(tmp / njtssws_t * VTSSWS / max(VTSSWS + v_sbj,1.0E-3)) - 1.0) + WeffNF * jtsswgs_t * (exp(tmp / njtsswgs_t * VTSSWGS / max(VTSSWGS + v_sbj,1.0E-3)) - 1.0); // TOTAL SOURCE-SIDE JUNCTION DIODE CURRENT - ISBJ = isb + v_sbj * GMIN + isb_tun; + ISBJ = isb + v_sbj * GMIN + isb_tun; // DRAIN-SIDE - is_d = jsd_t * ad + jsswd_t * pd + jsswgd_t * WeffNF; - tmp = rT / (UT * NJD); - arg_d = - v_dbj * tmp; - f_breakdown_d = 1.0 + XJBVD * exp(-(-v_dbj + BVD) * tmp); // NOTE: Breakdown effect - idb = is_d * (1.0 - exp(arg_d)) * f_breakdown_d; + is_d = jsd_t * ad + jsswd_t * pd + jsswgd_t * WeffNF; + tmp = rT / (UT * NJD); + arg_d = - v_dbj * tmp; + f_breakdown_d = 1.0 + XJBVD * exp(-(-v_dbj + BVD) * tmp); // NOTE: Breakdown effect + idb = is_d * (1.0 - exp(arg_d)) * f_breakdown_d; // DRAIN-SIDE TRAP-ASSISTED CURRENT - tmp = v_dbj * rT / UT; - idb_tun = ad * jtsd_t * (exp(tmp / njtsd_t * VTSD / max(VTSD + v_dbj,1.0E-3)) - 1.0) + pd * jtsswd_t * (exp(tmp / njtsswd_t * VTSSWD / max(VTSSWD + v_dbj,1.0E-3)) - 1.0) + WeffNF * jtsswgd_t * (exp(tmp / njtsswgd_t * VTSSWGD / max(VTSSWGD + v_dbj,1.0E-3)) - 1.0); + tmp = v_dbj * rT / UT; + idb_tun = ad * jtsd_t * (exp(tmp / njtsd_t * VTSD / max(VTSD + v_dbj,1.0E-3)) - 1.0) + pd * jtsswd_t * (exp(tmp / njtsswd_t * VTSSWD / max(VTSSWD + v_dbj,1.0E-3)) - 1.0) + WeffNF * jtsswgd_t * (exp(tmp / njtsswgd_t * VTSSWGD / max(VTSSWGD + v_dbj,1.0E-3)) - 1.0); // TOTAL DRAIN-SIDE JUNCTION DIODE CURRENT - IDBJ = idb + v_dbj * GMIN + idb_tun; + IDBJ = idb + v_dbj * GMIN + idb_tun; // CALCULATION OF THE DIODE-CHARGES (THE CAPACITANCE BEHAVIOUR IS DESCRIBED AS THE DERIVATIVE OF THE CHARGES) // SOURCE-SIDE CAPACITANCE CHARGES - if (v_sbj > 0.0) - begin - cj_s = cjs_t * as * exp( - MJS * ln(1.0 + v_sbj / pbs_t )); - cjsw_s = cjsws_t * ps * exp( - MJSWS * ln(1.0 + v_sbj / pbsws_t )); - cjswg_s = cjswgs_t * WeffNF * exp( - MJSWGS * ln(1.0 + v_sbj / pbswgs_t)); - qj_s = cjs_t * as * pbs_t * (1.0 - exp((1.0 - MJS) * ln(1.0 + v_sbj / pbs_t ))) / (1.0 - MJS); - qjsw_s = cjsws_t * ps * pbsws_t * (1.0 - exp((1.0 - MJSWS) * ln(1.0 + v_sbj / pbsws_t ))) / (1.0 - MJSWS); - qjswg_s = cjswgs_t * WeffNF * pbswgs_t * (1.0 - exp((1.0 - MJSWGS) * ln(1.0 + v_sbj / pbswgs_t))) / (1.0 - MJSWGS); - end - else - begin - cj_s = cjs_t * as * (1.0 - MJS * v_sbj / pbs_t ); - cjsw_s = cjsws_t * ps * (1.0 - MJSWS * v_sbj / pbsws_t ); - cjswg_s = cjswgs_t * WeffNF * (1.0 - MJSWGS * v_sbj / pbswgs_t); - tmp = v_sbj * v_sbj; - qj_s = cjs_t * as * (- v_sbj + MJS * 0.5 / pbs_t * tmp); - qjsw_s = cjsws_t * ps * (- v_sbj + MJSWS * 0.5 / pbsws_t * tmp); - qjswg_s = cjswgs_t * WeffNF * (- v_sbj + MJSWGS * 0.5 / pbswgs_t * tmp); - end - CSBJ = cj_s + cjsw_s + cjswg_s; // NOTE: CALCULATION OF CSBJ (AS WELL AS OF cj_s, cjsw_s AND cjswg_s) IS NOT NECESSARY SINCE THE DYNAMICAL BEHAVIOUR IS DESCRIBED BY THE TIME DERIVATIVE OF THE CHARGE "QSBJ" - QSBJ = - (qj_s + qjsw_s + qjswg_s); + if (v_sbj > 0.0) + begin + cj_s = cjs_t * as * exp( - MJS * ln(1.0 + v_sbj / pbs_t )); + cjsw_s = cjsws_t * ps * exp( - MJSWS * ln(1.0 + v_sbj / pbsws_t )); + cjswg_s = cjswgs_t * WeffNF * exp( - MJSWGS * ln(1.0 + v_sbj / pbswgs_t)); + qj_s = cjs_t * as * pbs_t * (1.0 - exp((1.0 - MJS) * ln(1.0 + v_sbj / pbs_t ))) / (1.0 - MJS); + qjsw_s = cjsws_t * ps * pbsws_t * (1.0 - exp((1.0 - MJSWS) * ln(1.0 + v_sbj / pbsws_t ))) / (1.0 - MJSWS); + qjswg_s = cjswgs_t * WeffNF * pbswgs_t * (1.0 - exp((1.0 - MJSWGS) * ln(1.0 + v_sbj / pbswgs_t))) / (1.0 - MJSWGS); + end + else + begin + cj_s = cjs_t * as * (1.0 - MJS * v_sbj / pbs_t ); + cjsw_s = cjsws_t * ps * (1.0 - MJSWS * v_sbj / pbsws_t ); + cjswg_s = cjswgs_t * WeffNF * (1.0 - MJSWGS * v_sbj / pbswgs_t); + tmp = v_sbj * v_sbj; + qj_s = cjs_t * as * (- v_sbj + MJS * 0.5 / pbs_t * tmp); + qjsw_s = cjsws_t * ps * (- v_sbj + MJSWS * 0.5 / pbsws_t * tmp); + qjswg_s = cjswgs_t * WeffNF * (- v_sbj + MJSWGS * 0.5 / pbswgs_t * tmp); + end + CSBJ = cj_s + cjsw_s + cjswg_s; // NOTE: CALCULATION OF CSBJ (AS WELL AS OF cj_s, cjsw_s AND cjswg_s) IS NOT NECESSARY SINCE THE DYNAMICAL BEHAVIOUR IS DESCRIBED BY THE TIME DERIVATIVE OF THE CHARGE "QSBJ" + QSBJ = - (qj_s + qjsw_s + qjswg_s); // DRAIN-SIDE CAPACITANCE CHARGES - if (v_dbj > 0.0) - begin - cj_d = cjd_t * ad * exp( - MJD * ln(1.0 + v_dbj / pbd_t )); - cjsw_d = cjswd_t * pd * exp( - MJSWD * ln(1.0 + v_dbj / pbswd_t )); - cjswg_d = cjswgd_t * WeffNF * exp( - MJSWGD * ln(1.0 + v_dbj / pbswgd_t)); - qj_d = cjd_t * ad * pbd_t * (1.0 - exp((1.0 - MJD) * ln(1.0 + v_dbj / pbd_t ))) / (1.0 - MJD); - qjsw_d = cjswd_t * pd * pbswd_t * (1.0 - exp((1.0 - MJSWD) * ln(1.0 + v_dbj / pbswd_t ))) / (1.0 - MJSWD); - qjswg_d = cjswgd_t * WeffNF * pbswgd_t * (1.0 - exp((1.0 - MJSWGD) * ln(1.0 + v_dbj / pbswgd_t))) / (1.0 - MJSWGD); - end - else - begin - cj_d = cjd_t * ad * (1.0 - MJD * v_dbj / pbd_t ); - cjsw_d = cjswd_t * pd * (1.0 - MJSWD * v_dbj / pbswd_t ); - cjswg_d = cjswgd_t * WeffNF * (1.0 - MJSWGD * v_dbj / pbswgd_t); - tmp = v_dbj * v_dbj; - qj_d = cjd_t * ad * (- v_dbj + MJD * 0.5 / pbd_t * tmp); - qjsw_d = cjswd_t * pd * (- v_dbj + MJSWD * 0.5 / pbswd_t * tmp); - qjswg_d = cjswgd_t * WeffNF * (- v_dbj + MJSWGD * 0.5 / pbswgd_t * tmp); - end - CDBJ = cj_d + cjsw_d + cjswg_d; // NOTE: CALCULATION OF CDBJ (AS WELL AS OF cj_d, cjsw_d AND cjswg_d) IS NOT NECESSARY SINCE THE DYNAMICAL BEHAVIOUR IS DESCRIBED BY THE TIME DERIVATIVE OF THE CHARGE "QSBJ" - QDBJ = - (qj_d + qjsw_d + qjswg_d); + if (v_dbj > 0.0) + begin + cj_d = cjd_t * ad * exp( - MJD * ln(1.0 + v_dbj / pbd_t )); + cjsw_d = cjswd_t * pd * exp( - MJSWD * ln(1.0 + v_dbj / pbswd_t )); + cjswg_d = cjswgd_t * WeffNF * exp( - MJSWGD * ln(1.0 + v_dbj / pbswgd_t)); + qj_d = cjd_t * ad * pbd_t * (1.0 - exp((1.0 - MJD) * ln(1.0 + v_dbj / pbd_t ))) / (1.0 - MJD); + qjsw_d = cjswd_t * pd * pbswd_t * (1.0 - exp((1.0 - MJSWD) * ln(1.0 + v_dbj / pbswd_t ))) / (1.0 - MJSWD); + qjswg_d = cjswgd_t * WeffNF * pbswgd_t * (1.0 - exp((1.0 - MJSWGD) * ln(1.0 + v_dbj / pbswgd_t))) / (1.0 - MJSWGD); + end + else + begin + cj_d = cjd_t * ad * (1.0 - MJD * v_dbj / pbd_t ); + cjsw_d = cjswd_t * pd * (1.0 - MJSWD * v_dbj / pbswd_t ); + cjswg_d = cjswgd_t * WeffNF * (1.0 - MJSWGD * v_dbj / pbswgd_t); + tmp = v_dbj * v_dbj; + qj_d = cjd_t * ad * (- v_dbj + MJD * 0.5 / pbd_t * tmp); + qjsw_d = cjswd_t * pd * (- v_dbj + MJSWD * 0.5 / pbswd_t * tmp); + qjswg_d = cjswgd_t * WeffNF * (- v_dbj + MJSWGD * 0.5 / pbswgd_t * tmp); + end + CDBJ = cj_d + cjsw_d + cjswg_d; // NOTE: CALCULATION OF CDBJ (AS WELL AS OF cj_d, cjsw_d AND cjswg_d) IS NOT NECESSARY SINCE THE DYNAMICAL BEHAVIOUR IS DESCRIBED BY THE TIME DERIVATIVE OF THE CHARGE "QSBJ" + QDBJ = - (qj_d + qjsw_d + qjswg_d); end // DIODES // ASSIGNMENT OF THE DIODE-CHARGES AND DIODE-CURRENTS TO THE RESPECTIVE BRANCES. @@ -198,45 +198,45 @@ end // DIODES `ifdef DC_S // DIODES IV - I(d ,b ) <+ SIGN_M * IDBJ; - I(s ,b ) <+ SIGN_M * ISBJ; + I(d ,b ) <+ SIGN_M * IDBJ; + I(s ,b ) <+ SIGN_M * ISBJ; // DIODES CV - I(d ,b ) <+ SIGN_M * ddt(QDBJ); - I(s ,b ) <+ SIGN_M * ddt(QSBJ); + I(d ,b ) <+ SIGN_M * ddt(QDBJ); + I(s ,b ) <+ SIGN_M * ddt(QSBJ); `endif `ifdef DC // DIODES IV - I(di,b ) <+ SIGN_M * IDBJ; - I(si,b ) <+ SIGN_M * ISBJ; + I(di,b ) <+ SIGN_M * IDBJ; + I(si,b ) <+ SIGN_M * ISBJ; // DIODES CV - I(di,b ) <+ SIGN_M * ddt(QDBJ); - I(si,b ) <+ SIGN_M * ddt(QSBJ); + I(di,b ) <+ SIGN_M * ddt(QDBJ); + I(si,b ) <+ SIGN_M * ddt(QSBJ); `endif `ifdef RF_S // DIODES IV - I(di,bi) <+ SIGN_M * IDBJ; - I(si,bi) <+ SIGN_M * ISBJ; + I(di,bi) <+ SIGN_M * IDBJ; + I(si,bi) <+ SIGN_M * ISBJ; // DIODES CV - I(di,bi) <+ SIGN_M * ddt(QDBJ); - I(si,bi) <+ SIGN_M * ddt(QSBJ); + I(di,bi) <+ SIGN_M * ddt(QDBJ); + I(si,bi) <+ SIGN_M * ddt(QSBJ); `endif `ifdef RF // DIODES IV - I(di,bdi) <+ SIGN_M * IDBJ; - I(si,bsi) <+ SIGN_M * ISBJ; + I(di,bdi) <+ SIGN_M * IDBJ; + I(si,bsi) <+ SIGN_M * ISBJ; // DIODES CV - I(di,bdi) <+ SIGN_M * ddt(QDBJ); - I(si,bsi) <+ SIGN_M * ddt(QSBJ); + I(di,bdi) <+ SIGN_M * ddt(QDBJ); + I(si,bsi) <+ SIGN_M * ddt(QSBJ); `endif `ifdef NQS // DIODES IV - I(di,bdi) <+ SIGN_M * IDBJ; - I(si,bsi) <+ SIGN_M * ISBJ; + I(di,bdi) <+ SIGN_M * IDBJ; + I(si,bsi) <+ SIGN_M * ISBJ; // DIODES CV - I(di,bdi) <+ SIGN_M * ddt(QDBJ); - I(si,bsi) <+ SIGN_M * ddt(QSBJ); + I(di,bdi) <+ SIGN_M * ddt(QDBJ); + I(si,bsi) <+ SIGN_M * ddt(QSBJ); `endif diff --git a/code/ekv3_include/ekv3_extrinsic_rc.va b/code/ekv3_include/ekv3_extrinsic_rc.va index a243b4f..ad4b9cf 100644 --- a/code/ekv3_include/ekv3_extrinsic_rc.va +++ b/code/ekv3_include/ekv3_extrinsic_rc.va @@ -4,191 +4,191 @@ begin : EXTERNAL_RESISTORS // CALCULATION OF THE SERIES RESISTANCES // IN MODES DC, RF_S, RF AND NQS THESE RESISTANCES ARE PLACED BETWEEN THE INTERNAL AND THE EXTERNAL NODES OF SOURCE AND DRAIN // IN MODE DC_S THE CALCULATION OF THE SERIES RESISTANCE EFFECT IS PERFORMED ANALYTICALLY AS A FIRST ORDER APPROXIMATION AND NO INTERNAL NODES ARE CREATED - if (RLX < 0.0) // NOTE: RLX parameter overrides the assymetric model parameters RSX and RDX. A non-physical negative value for RLX sets the parameter off. - begin - if (RSX < 0.0) // NOTE: RSX parameter overrides the RSH (resistance factor for the active area of source and drain) and RS (resistance factor of the LDD area) model. A non-physical negative value for RSX sets the parameter off. - rs = (hdif * RSH + (ldif - DL / 2.0) * RS) / WeffNF; - else - rs = RSX / WeffNF; // NOTE: RSX used. Asymmetric model. - if (RDX < 0.0) // NOTE: RDX parameter overrides the RSH (resistance factor for the active area of source and drain) and RS (resistance factor of the LDD area) model. A non-physical negative value for RDX sets the parameter off. - rd = (hdif * RSH + (ldif - DL / 2.0) * RD) / WeffNF; - else - rd = RDX / WeffNF; // NOTE: RDX used. Asymmetric model. - end - else - begin - rs = RLX / WeffNF; // NOTE: RLX used. - rd = rs; // NOTE: Symmetric model. - end + if (RLX < 0.0) // NOTE: RLX parameter overrides the assymetric model parameters RSX and RDX. A non-physical negative value for RLX sets the parameter off. + begin + if (RSX < 0.0) // NOTE: RSX parameter overrides the RSH (resistance factor for the active area of source and drain) and RS (resistance factor of the LDD area) model. A non-physical negative value for RSX sets the parameter off. + rs = (hdif * RSH + (ldif - DL / 2.0) * RS) / WeffNF; + else + rs = RSX / WeffNF; // NOTE: RSX used. Asymmetric model. + if (RDX < 0.0) // NOTE: RDX parameter overrides the RSH (resistance factor for the active area of source and drain) and RS (resistance factor of the LDD area) model. A non-physical negative value for RDX sets the parameter off. + rd = (hdif * RSH + (ldif - DL / 2.0) * RD) / WeffNF; + else + rd = RDX / WeffNF; // NOTE: RDX used. Asymmetric model. + end + else + begin + rs = RLX / WeffNF; // NOTE: RLX used. + rd = rs; // NOTE: Symmetric model. + end // WIDTH SCALING OF SERIES RESISTANCES - tmp = (1.0 + WRLX / Weff); - rs_w = rs * tmp; - rd_w = rd * tmp; + tmp = (1.0 + WRLX / Weff); + rs_w = rs * tmp; + rd_w = rd * tmp; -// CALCULATION OF GATE RESISTANCE +// CALCULATION OF GATE RESISTANCE // GATE RESISTANCE IS USED IN RF_S, RF AND NQS MODES - rg = RGSH * Weff / (3.0 * GC * GC * NF * Leff) * (1.0 + KRGL1 * Leff2); + rg = RGSH * Weff / (3.0 * GC * GC * NF * Leff) * (1.0 + KRGL1 * Leff2); // CALCULATION OF SUBSTRATE NETWORK RESISTANCES (RB, RSB, RDB, RDSB) // RB IS USED IN RF_S, RF AND NQS MODES // RSB, RDB AND RDSB ARE USED IN RF AND NQS MODES - if (RINGTYPE == 1.0) // NOTE: Check if the shape of the bulk contact is of HORSE-SHOE type (three sides) - begin - rb = (RBN == 0.0) ? // NOTE: Check if bulk resistance per finger is defined. - RBWSH * 0.5 / Weff : - 1.0 / ((Weff * 2.0 / RBWSH) + (NF / RBN)); -// if (NF % 2 == 0) // NOTE: EVEN NUMBER OF FINGERS (Asymmetric device, substrate source-bulk resistance is NOT equal with substrate drain-bulk resistance.) + if (RINGTYPE == 1.0) // NOTE: Check if the shape of the bulk contact is of HORSE-SHOE type (three sides) + begin + rb = (RBN == 0.0) ? // NOTE: Check if bulk resistance per finger is defined. + RBWSH * 0.5 / Weff : + 1.0 / ((Weff * 2.0 / RBWSH) + (NF / RBN)); +// if (NF % 2 == 0) // NOTE: EVEN NUMBER OF FINGERS (Asymmetric device, substrate source-bulk resistance is NOT equal with substrate drain-bulk resistance.) if (even_nf == NF) - begin - rsb = (RSBN == 0.0) ? // NOTE: Check if substrate source-bulk resistance per finger is defined. - RSBWSH * 0.5 / Weff : - 1.0 / ((Weff * 2.0 / RSBWSH) + (NF / RSBN)); - rdb = (RDBN == 0.0) ? // NOTE: Check if substrate drain-bulk resistance per finger is defined. - RDBWSH * 0.5 / Weff : - 1.0 / ((Weff * 2.0 / RDBWSH) + (NF / RDBN)); - end - else // NOTE: ODD NUMBER OF FINGERS (Symmetric device, substrate source-bulk resistance is equal with substrate drain-bulk resistance.) - begin - rsb = (RSBN == 0.0) ? // NOTE: Check if substrate source-bulk resistance per finger is defined. - RSBWSH / Weff : - 1.0 / ((Weff / RSBWSH) + (NF / RSBN)); - rdb = rsb; // NOTE: Symmetric device, substrate source-bulk resistance is equal with substrate drain-bulk resistance. - end - end - else // NOTE: The shape of the bulk contact is SYMMETRIC type (two sides). No resistance pef finger parameter is used. - begin - rb = RBWSH * 0.5 / Weff; -// if (NF % 2 == 0) // NOTE: EVEN NUMBER OF FINGERS (Asymmetric device, substrate source-bulk resistance is NOT equal with substrate drain-bulk resistance.) + begin + rsb = (RSBN == 0.0) ? // NOTE: Check if substrate source-bulk resistance per finger is defined. + RSBWSH * 0.5 / Weff : + 1.0 / ((Weff * 2.0 / RSBWSH) + (NF / RSBN)); + rdb = (RDBN == 0.0) ? // NOTE: Check if substrate drain-bulk resistance per finger is defined. + RDBWSH * 0.5 / Weff : + 1.0 / ((Weff * 2.0 / RDBWSH) + (NF / RDBN)); + end + else // NOTE: ODD NUMBER OF FINGERS (Symmetric device, substrate source-bulk resistance is equal with substrate drain-bulk resistance.) + begin + rsb = (RSBN == 0.0) ? // NOTE: Check if substrate source-bulk resistance per finger is defined. + RSBWSH / Weff : + 1.0 / ((Weff / RSBWSH) + (NF / RSBN)); + rdb = rsb; // NOTE: Symmetric device, substrate source-bulk resistance is equal with substrate drain-bulk resistance. + end + end + else // NOTE: The shape of the bulk contact is SYMMETRIC type (two sides). No resistance pef finger parameter is used. + begin + rb = RBWSH * 0.5 / Weff; +// if (NF % 2 == 0) // NOTE: EVEN NUMBER OF FINGERS (Asymmetric device, substrate source-bulk resistance is NOT equal with substrate drain-bulk resistance.) if (even_nf == NF) - begin - rsb = RSBWSH * 0.5 / Weff ; - rdb = RDBWSH * 0.5 / Weff ; - end - else // NOTE: ODD NUMBER OF FINGERS (Symmetric device, substrate source-bulk resistance is equal with substrate drain-bulk resistance.) - begin - rsb = RSBWSH / Weff ; - rdb = rsb; // NOTE: Symmetric device, substrate source-bulk resistance is equal with substrate drain-bulk - end - end + begin + rsb = RSBWSH * 0.5 / Weff ; + rdb = RDBWSH * 0.5 / Weff ; + end + else // NOTE: ODD NUMBER OF FINGERS (Symmetric device, substrate source-bulk resistance is equal with substrate drain-bulk resistance.) + begin + rsb = RSBWSH / Weff ; + rdb = rsb; // NOTE: Symmetric device, substrate source-bulk resistance is equal with substrate drain-bulk + end + end // CALCULATION OF SUBSTRATE SOURCE-DRAIN RESISTANCE - rdsb = RDSBSH * Leff / WeffNF; + rdsb = RDSBSH * Leff / WeffNF; // CALCULATION OF TEMPERATURE EFFECT ON RESISTORS - Mr_t = (1.0 + TR * dT + TR2 * dT2); - rs_wt = rs_w * Mr_t; - rd_wt = rd_w * Mr_t; - rg_t = rg * Mr_t; - rb_t = rb * Mr_t; - rsb_t = rsb * Mr_t; - rdb_t = rdb * Mr_t; - rdsb_t = rdsb * Mr_t; - + Mr_t = (1.0 + TR * dT + TR2 * dT2); + rs_wt = rs_w * Mr_t; + rd_wt = rd_w * Mr_t; + rg_t = rg * Mr_t; + rb_t = rb * Mr_t; + rsb_t = rsb * Mr_t; + rdb_t = rdb * Mr_t; + rdsb_t = rdsb * Mr_t; + // TRIMMING ALL RESISTANCES TO A POSITIVE MINIMUM VALUE - rs_wt = `MAX(rs_wt ,`MINIMUM_RESISTANCE); - rd_wt = `MAX(rd_wt ,`MINIMUM_RESISTANCE); - rg_t = `MAX(rg_t ,`MINIMUM_RESISTANCE); - rb_t = `MAX(rb_t ,`MINIMUM_RESISTANCE); - rsb_t = `MAX(rsb_t ,`MINIMUM_RESISTANCE); - rdb_t = `MAX(rdb_t ,`MINIMUM_RESISTANCE); - rdsb_t = `MAX(rdsb_t,`MINIMUM_RESISTANCE); -end // EXTERNAL_RESISTORS + rs_wt = `MAX(rs_wt ,`MINIMUM_RESISTANCE); + rd_wt = `MAX(rd_wt ,`MINIMUM_RESISTANCE); + rg_t = `MAX(rg_t ,`MINIMUM_RESISTANCE); + rb_t = `MAX(rb_t ,`MINIMUM_RESISTANCE); + rsb_t = `MAX(rsb_t ,`MINIMUM_RESISTANCE); + rdb_t = `MAX(rdb_t ,`MINIMUM_RESISTANCE); + rdsb_t = `MAX(rdsb_t,`MINIMUM_RESISTANCE); +end // EXTERNAL_RESISTORS // ASSIGNMENT OF BIAS-INDEPENDENT OVERLAP CAPACITANCES, ASSIGNMENT AND PLACEMENT OF EXTERNAL RESISTORS AND THERE NOISE SOURCES `ifdef DC_S // BIAS-INDEPENDENT OVERLAP CAPACITANCES - tmp = M * WeffNF; - I(g,s) <+ ddt(CGSO * tmp * V(g,s)); - I(g,d) <+ ddt(CGDO * tmp * V(g,d)); - I(g,b) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(g,b)); + tmp = M * WeffNF; + I(g,s) <+ ddt(CGSO * tmp * V(g,s)); + I(g,d) <+ ddt(CGDO * tmp * V(g,d)); + I(g,b) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(g,b)); // CALCULATION OF SERIES RESISTANCE EFFECT ON CHANNEL CURRENT - RES_IDS = 1.0 + rs_wt * Gspec_dits * qs + rd_wt * Gspec_dits * qdp; // NOTE: RES_IDS is used at the ekv3.va file + RES_IDS = 1.0 + rs_wt * Gspec_dits * qs + rd_wt * Gspec_dits * qdp; // NOTE: RES_IDS is used at the ekv3.va file `endif `ifdef DC // BIAS-INDEPENDENT OVERLAP CAPACITANCES - tmp = M * WeffNF; - I(g,si) <+ ddt(CGSO * tmp * V(g,si)); - I(g,di) <+ ddt(CGDO * tmp * V(g,di)); - I(g,b) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(g,b)); + tmp = M * WeffNF; + I(g,si) <+ ddt(CGSO * tmp * V(g,si)); + I(g,di) <+ ddt(CGDO * tmp * V(g,di)); + I(g,b) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(g,b)); // SERIES RESISTORS - I(s ,si) <+ M * V(s,si) / rs_wt; - I(s ,si) <+ white_noise(KT4 / rs_wt); - I(d ,di) <+ M * V(d,di) / rd_wt; - I(d ,di) <+ white_noise(KT4 / rd_wt); + I(s ,si) <+ M * V(s,si) / rs_wt; + I(s ,si) <+ white_noise(KT4 / rs_wt); + I(d ,di) <+ M * V(d,di) / rd_wt; + I(d ,di) <+ white_noise(KT4 / rd_wt); `endif `ifdef RF_S // BIAS-INDEPENDENT OVERLAP CAPACITANCES - tmp = M * WeffNF; - I(gi,si) <+ ddt(CGSO * tmp * V(gi,si)); - I(gi,di) <+ ddt(CGDO * tmp * V(gi,di)); - I(gi,bi) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(gi,bi)); + tmp = M * WeffNF; + I(gi,si) <+ ddt(CGSO * tmp * V(gi,si)); + I(gi,di) <+ ddt(CGDO * tmp * V(gi,di)); + I(gi,bi) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(gi,bi)); // SERIES RESISTORS - I(s ,si) <+ M * V(s,si) / rs_wt; - I(s ,si) <+ white_noise(KT4 / rs_wt); - I(d ,di) <+ M * V(d,di) / rd_wt; - I(d ,di) <+ white_noise(KT4 / rd_wt); + I(s ,si) <+ M * V(s,si) / rs_wt; + I(s ,si) <+ white_noise(KT4 / rs_wt); + I(d ,di) <+ M * V(d,di) / rd_wt; + I(d ,di) <+ white_noise(KT4 / rd_wt); // GATE RESISTANCE - I(g ,gi) <+ M * V(g,gi) / rg_t; - I(g ,gi) <+ white_noise(KT4 / rg_t); + I(g ,gi) <+ M * V(g,gi) / rg_t; + I(g ,gi) <+ white_noise(KT4 / rg_t); // SUBSTRATE RESISTANCE NETWORK - I(b ,bi) <+ M * V(b,bi) / rb_t; - I(b ,bi) <+ white_noise(KT4 / rb_t); + I(b ,bi) <+ M * V(b,bi) / rb_t; + I(b ,bi) <+ white_noise(KT4 / rb_t); `endif `ifdef RF // BIAS-INDEPENDENT OVERLAP CAPACITANCES - tmp = M * WeffNF; - I(gi,si) <+ ddt(CGSO * tmp * V(gi,si)); - I(gi,di) <+ ddt(CGDO * tmp * V(gi,di)); - I(gi,bi) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(gi,bi)); + tmp = M * WeffNF; + I(gi,si) <+ ddt(CGSO * tmp * V(gi,si)); + I(gi,di) <+ ddt(CGDO * tmp * V(gi,di)); + I(gi,bi) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(gi,bi)); // SERIES RESISTORS - I(s ,si) <+ M * V(s,si) / rs_wt; - I(s ,si) <+ white_noise(KT4 / rs_wt); - I(d ,di) <+ M * V(d,di) / rd_wt; - I(d ,di) <+ white_noise(KT4 / rd_wt); + I(s ,si) <+ M * V(s,si) / rs_wt; + I(s ,si) <+ white_noise(KT4 / rs_wt); + I(d ,di) <+ M * V(d,di) / rd_wt; + I(d ,di) <+ white_noise(KT4 / rd_wt); // GATE RESISTANCE - I(g ,gi ) <+ M * V(g ,gi ) / rg_t; - I(g ,gi ) <+ white_noise(KT4 / rg_t); + I(g ,gi ) <+ M * V(g ,gi ) / rg_t; + I(g ,gi ) <+ white_noise(KT4 / rg_t); // SUBSTRATE RESISTANCE NETWORK - I(b ,bi ) <+ M * V(b ,bi ) / rb_t; - I(b ,bi ) <+ white_noise(KT4 / rb_t); - I(b ,bsi) <+ M * V(b ,bsi) / rsb_t; - I(b ,bsi) <+ white_noise(KT4 / rsb_t); - I(b ,bdi) <+ M * V(b ,bdi) / rdb_t; - I(b ,bdi) <+ white_noise(KT4 / rdb_t); - tmp = M * 2.0 / rdsb_t; - I(bi,bsi) <+ V(bi,bsi) * tmp; - I(bi,bsi) <+ white_noise(KT4 * tmp); - I(bi,bdi) <+ V(bi,bdi) * tmp; - I(bi,bdi) <+ white_noise(KT4 * tmp); -`endif + I(b ,bi ) <+ M * V(b ,bi ) / rb_t; + I(b ,bi ) <+ white_noise(KT4 / rb_t); + I(b ,bsi) <+ M * V(b ,bsi) / rsb_t; + I(b ,bsi) <+ white_noise(KT4 / rsb_t); + I(b ,bdi) <+ M * V(b ,bdi) / rdb_t; + I(b ,bdi) <+ white_noise(KT4 / rdb_t); + tmp = M * 2.0 / rdsb_t; + I(bi,bsi) <+ V(bi,bsi) * tmp; + I(bi,bsi) <+ white_noise(KT4 * tmp); + I(bi,bdi) <+ V(bi,bdi) * tmp; + I(bi,bdi) <+ white_noise(KT4 * tmp); +`endif `ifdef NQS // BIAS-INDEPENDENT OVERLAP CAPACITANCES - tmp = M * WeffNF; - I(gi,si) <+ ddt(CGSO * tmp * V(gi,si)); - I(gi,di) <+ ddt(CGDO * tmp * V(gi,di)); - I(gi,bi) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(gi,bi)); + tmp = M * WeffNF; + I(gi,si) <+ ddt(CGSO * tmp * V(gi,si)); + I(gi,di) <+ ddt(CGDO * tmp * V(gi,di)); + I(gi,bi) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(gi,bi)); // SERIES RESISTORS - I(s ,si) <+ M * V(s,si) / rs_wt; - I(s ,si) <+ white_noise(KT4 / rs_wt); - I(d ,di) <+ M * V(d,di) / rd_wt; - I(d ,di) <+ white_noise(KT4 / rd_wt); + I(s ,si) <+ M * V(s,si) / rs_wt; + I(s ,si) <+ white_noise(KT4 / rs_wt); + I(d ,di) <+ M * V(d,di) / rd_wt; + I(d ,di) <+ white_noise(KT4 / rd_wt); // GATE RESISTANCE - I(g ,gi ) <+ M * V(g ,gi ) / rg_t; - I(g ,gi ) <+ white_noise(KT4 / rg_t); + I(g ,gi ) <+ M * V(g ,gi ) / rg_t; + I(g ,gi ) <+ white_noise(KT4 / rg_t); // SUBSTRATE RESISTANCE NETWORK - I(b ,bi ) <+ M * V(b ,bi ) / rb_t; - I(b ,bi ) <+ white_noise(KT4 / rb_t); - I(b ,bsi) <+ M * V(b ,bsi) / rsb_t; - I(b ,bsi) <+ white_noise(KT4 / rsb_t); - I(b ,bdi) <+ M * V(b ,bdi) / rdb_t; - I(b ,bdi) <+ white_noise(KT4 / rdb_t); - tmp = M * 2.0 / rdsb_t; - I(bi,bsi) <+ V(bi,bsi) * tmp; - I(bi,bsi) <+ white_noise(KT4 * tmp); - I(bi,bdi) <+ V(bi,bdi) * tmp; - I(bi,bdi) <+ white_noise(KT4 * tmp); -`endif + I(b ,bi ) <+ M * V(b ,bi ) / rb_t; + I(b ,bi ) <+ white_noise(KT4 / rb_t); + I(b ,bsi) <+ M * V(b ,bsi) / rsb_t; + I(b ,bsi) <+ white_noise(KT4 / rsb_t); + I(b ,bdi) <+ M * V(b ,bdi) / rdb_t; + I(b ,bdi) <+ white_noise(KT4 / rdb_t); + tmp = M * 2.0 / rdsb_t; + I(bi,bsi) <+ V(bi,bsi) * tmp; + I(bi,bsi) <+ white_noise(KT4 * tmp); + I(bi,bdi) <+ V(bi,bdi) * tmp; + I(bi,bdi) <+ white_noise(KT4 * tmp); +`endif diff --git a/code/ekv3_include/ekv3_fringing.va b/code/ekv3_include/ekv3_fringing.va index bc9cbee..5eb4d31 100644 --- a/code/ekv3_include/ekv3_fringing.va +++ b/code/ekv3_include/ekv3_fringing.va @@ -1,31 +1,31 @@ // ANALYTICAL CALCULATION OF THE FRINGING CAPACITANCES begin : FRINGING_CAPACITANCES_GUILDENBLAT - tmp = vbi + VFR / UT + vs - (psi_p - 2.0 * qs); - QSFR = Weffc * NF * KJF * (1.0 + CJF * UT * vs) * sqrt(UT * `MAXA(tmp,0.0,DFR)); - tmp = vbi + VFR / UT + vdp - (psi_p - 2.0 * qdp); - QDFR = Weffc * NF * KJF * (1.0 + CJF * UT * vdp) * sqrt(UT * `MAXA(tmp,0.0,DFR)); + tmp = vbi + VFR / UT + vs - (psi_p - 2.0 * qs); + QSFR = Weffc * NF * KJF * (1.0 + CJF * UT * vs) * sqrt(UT * `MAXA(tmp,0.0,DFR)); + tmp = vbi + VFR / UT + vdp - (psi_p - 2.0 * qdp); + QDFR = Weffc * NF * KJF * (1.0 + CJF * UT * vdp) * sqrt(UT * `MAXA(tmp,0.0,DFR)); end // FRINGING_CAPACITANCES_GUILDENBLAT // ASSIGNMENT OF DYNAMIC BEHAVIOUR VIA THE BIAS-DEPENDENT FRINGING CAPACITANCES `ifdef DC_S - I(d ,g ) <+ SIGN_M * (d_gt_s * ddt(QDFR) + s_gt_d * ddt(QSFR)); - I(s ,g ) <+ SIGN_M * (d_gt_s * ddt(QSFR) + s_gt_d * ddt(QDFR)); + I(d ,g ) <+ SIGN_M * (d_gt_s * ddt(QDFR) + s_gt_d * ddt(QSFR)); + I(s ,g ) <+ SIGN_M * (d_gt_s * ddt(QSFR) + s_gt_d * ddt(QDFR)); `endif `ifdef DC - I(di,g ) <+ SIGN_M * (d_gt_s * ddt(QDFR) + s_gt_d * ddt(QSFR)); - I(si,g ) <+ SIGN_M * (d_gt_s * ddt(QSFR) + s_gt_d * ddt(QDFR)); + I(di,g ) <+ SIGN_M * (d_gt_s * ddt(QDFR) + s_gt_d * ddt(QSFR)); + I(si,g ) <+ SIGN_M * (d_gt_s * ddt(QSFR) + s_gt_d * ddt(QDFR)); `endif `ifdef RF_S - I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QDFR) + s_gt_d * ddt(QSFR)); - I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QSFR) + s_gt_d * ddt(QDFR)); + I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QDFR) + s_gt_d * ddt(QSFR)); + I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QSFR) + s_gt_d * ddt(QDFR)); `endif `ifdef RF - I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QDFR) + s_gt_d * ddt(QSFR)); - I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QSFR) + s_gt_d * ddt(QDFR)); + I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QDFR) + s_gt_d * ddt(QSFR)); + I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QSFR) + s_gt_d * ddt(QDFR)); `endif `ifdef NQS - I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QDFR) + s_gt_d * ddt(QSFR)); - I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QSFR) + s_gt_d * ddt(QDFR)); + I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QDFR) + s_gt_d * ddt(QSFR)); + I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QSFR) + s_gt_d * ddt(QDFR)); `endif diff --git a/code/ekv3_include/ekv3_functions_def.va b/code/ekv3_include/ekv3_functions_def.va index 29d844d..eb7070a 100644 --- a/code/ekv3_include/ekv3_functions_def.va +++ b/code/ekv3_include/ekv3_functions_def.va @@ -1,93 +1,93 @@ `ifdef FUNCTIONS_INCLUDE `else -// FUNCTION `QV CALCULATES NORMALIZED INVERSION CHARGE, AT ANY POINT OF THE CHANNEL, AFTER THE DIFFERENCE BETWEEN THE PINCH-OFF VOLTAGE AND THE VOLTAGE AT THAT POINT. -// IT IS USED TO CALCULATE qs AND qd, THE NORMALIZED INVERSION CHARGES AT THE EDGES OF THE CHANNEL, THE SOURCE AND THE DRAIN END RESPECTIVELY. +// FUNCTION `QV CALCULATES NORMALIZED INVERSION CHARGE, AT ANY POINT OF THE CHANNEL, AFTER THE DIFFERENCE BETWEEN THE PINCH-OFF VOLTAGE AND THE VOLTAGE AT THAT POINT. +// IT IS USED TO CALCULATE qs AND qd, THE NORMALIZED INVERSION CHARGES AT THE EDGES OF THE CHANNEL, THE SOURCE AND THE DRAIN END RESPECTIVELY. // `QV IS THE INVERSE FUNCTION OF THE v(q) = 2q + lnq. -`define QV(q,v) \ -begin \ - vv = v / NUV; \ - if (vv > -0.6) \ - begin \ - z1 = 0.25 * (vv - 1.4 + sqrt(vv * (vv - 0.394036) + 9.662671)); \ - ln_z1_ = ln(z1); \ - z2 = (vv - (2.0 * z1 + ln_z1_)) / (2.0 * z1 + 1.0); \ - q = z1 * (1.0 + z2 * (1.0 + 0.070 * z2)) * NUV; \ - end \ - else \ - begin \ - ln_z1_ = 0.5 * (vv - 0.201491 - sqrt(vv * (vv + 0.402982) + 2.446562)); \ - z1 = exp(ln_z1_); \ - z2 = (vv - (2.0 * z1 + ln_z1_)) / (2.0 * z1 + 1.0); \ - q = z1 * (1.0 + z2 * (1.0 + 0.483 * z2)) * NUV; \ - end \ +`define QV(q,v) \ +begin \ + vv = v / NUV; \ + if (vv > -0.6) \ + begin \ + z1 = 0.25 * (vv - 1.4 + sqrt(vv * (vv - 0.394036) + 9.662671)); \ + ln_z1_ = ln(z1); \ + z2 = (vv - (2.0 * z1 + ln_z1_)) / (2.0 * z1 + 1.0); \ + q = z1 * (1.0 + z2 * (1.0 + 0.070 * z2)) * NUV; \ + end \ + else \ + begin \ + ln_z1_ = 0.5 * (vv - 0.201491 - sqrt(vv * (vv + 0.402982) + 2.446562)); \ + z1 = exp(ln_z1_); \ + z2 = (vv - (2.0 * z1 + ln_z1_)) / (2.0 * z1 + 1.0); \ + q = z1 * (1.0 + z2 * (1.0 + 0.483 * z2)) * NUV; \ + end \ end // FUNCITON `NQ CALCULATES THE CHARGE SLOPE FACTOR. THE FORMULATION TAKES INTO ACCOUNT POLYSILICON DEPLETION -`define NQ(nq,psi_p,sqrt_psi_p,qs,qd,dpd,gamma_b,gamma_g2) \ -begin \ - tmp_psi_sa = psi_p - qs - qd; \ - sqrt_psi_sa = sqrt(`MAXA(tmp_psi_sa,1.0e-4,1.0E-2)); \ - if (TG < 0) \ - begin \ - z0 = 1.0 + dpd + gamma_b / (sqrt_psi_p + sqrt_psi_sa); \ - zk = 0.5 + dpd * sqrt_psi_sa / gamma_b; \ - nq = z0 / (zk + sqrt(zk * zk + z0 * (qs + qd) / gamma_g2)); \ - end \ - else \ - begin \ - nq = 1.0 + gamma_b / (sqrt_psi_p + sqrt_psi_sa); \ - end \ +`define NQ(nq,psi_p,sqrt_psi_p,qs,qd,dpd,gamma_b,gamma_g2) \ +begin \ + tmp_psi_sa = psi_p - qs - qd; \ + sqrt_psi_sa = sqrt(`MAXA(tmp_psi_sa,1.0e-4,1.0E-2)); \ + if (TG < 0) \ + begin \ + z0 = 1.0 + dpd + gamma_b / (sqrt_psi_p + sqrt_psi_sa); \ + zk = 0.5 + dpd * sqrt_psi_sa / gamma_b; \ + nq = z0 / (zk + sqrt(zk * zk + z0 * (qs + qd) / gamma_g2)); \ + end \ + else \ + begin \ + nq = 1.0 + gamma_b / (sqrt_psi_p + sqrt_psi_sa); \ + end \ end // FUNCTION `QX CALCULATES THE CHARGES AT THE END OF THE CHANNEL (SOURCE AND DRAIN NODES). -`define QX(qx,psi_p,nq,qs,qd,powqs_qd2,powqsqd1_2) \ -begin \ - if (psi_p > 2.0) \ - begin \ - qx = inv_dqmip1 * nq * `ONE3RD * (qs + qd + qs + 0.5 * (1.0 + 0.8 * qs + 1.2 * qd) * powqs_qd2 * powqsqd1_2); \ - end \ - else \ - begin \ - qx = 0.0; \ - end \ +`define QX(qx,psi_p,nq,qs,qd,powqs_qd2,powqsqd1_2) \ +begin \ + if (psi_p > 2.0) \ + begin \ + qx = inv_dqmip1 * nq * `ONE3RD * (qs + qd + qs + 0.5 * (1.0 + 0.8 * qs + 1.2 * qd) * powqs_qd2 * powqsqd1_2); \ + end \ + else \ + begin \ + qx = 0.0; \ + end \ end // FUNCTION `QG CALCULATES THE CHARGE AT THE GATE NODE. -`define QG(qG,psi_p,qs,qd,powqs_qd2,powqsqd1_2,qsqd1,v_o,gamma_g2) \ -begin \ - if (psi_p > 2.0) \ - begin \ - if (TG < 0) \ - begin \ - v1_qg = v_o + 2.0 * qs * inv_dqmip1; \ - v2_qg = v_o + 2.0 * qd * inv_dqmip1; \ - k1 = sqrt(0.25 + v1_qg / gamma_g2); \ - k2 = sqrt(0.25 + v2_qg / gamma_g2); \ - k12 = k1 + k2; \ - k12_2 = k12 * k12; \ - k12_3 = k12_2 * k12; \ - qG = v1_qg / (1.0 + 2.0 * k1) + v2_qg / (1.0 + 2.0 * k2) + inv_dqmip1 * `ONE3RD * (powqs_qd2 / k12_3) * (0.8 * (k12_2 + k1 * k2) / qsqd1 + 2.0 / gamma_g2); \ - end \ - else \ - begin \ - qG = v_o + qs + qd + inv_dqmip1 * `ONE3RD * powqs_qd2 / qsqd1; \ - end \ - end \ - else if (psi_p > 0.0) \ - begin \ - qG = (TG < 0) ? v_o / (0.5 + sqrt(0.25 + v_o / gamma_g2)) : v_o; \ - end \ - else \ - begin \ - qG = (TG > 0) ? v_o / (0.5 + sqrt(0.25 - v_o / gamma_g2)) : v_o; \ - end \ -end +`define QG(qG,psi_p,qs,qd,powqs_qd2,powqsqd1_2,qsqd1,v_o,gamma_g2) \ +begin \ + if (psi_p > 2.0) \ + begin \ + if (TG < 0) \ + begin \ + v1_qg = v_o + 2.0 * qs * inv_dqmip1; \ + v2_qg = v_o + 2.0 * qd * inv_dqmip1; \ + k1 = sqrt(0.25 + v1_qg / gamma_g2); \ + k2 = sqrt(0.25 + v2_qg / gamma_g2); \ + k12 = k1 + k2; \ + k12_2 = k12 * k12; \ + k12_3 = k12_2 * k12; \ + qG = v1_qg / (1.0 + 2.0 * k1) + v2_qg / (1.0 + 2.0 * k2) + inv_dqmip1 * `ONE3RD * (powqs_qd2 / k12_3) * (0.8 * (k12_2 + k1 * k2) / qsqd1 + 2.0 / gamma_g2); \ + end \ + else \ + begin \ + qG = v_o + qs + qd + inv_dqmip1 * `ONE3RD * powqs_qd2 / qsqd1; \ + end \ + end \ + else if (psi_p > 0.0) \ + begin \ + qG = (TG < 0) ? v_o / (0.5 + sqrt(0.25 + v_o / gamma_g2)) : v_o; \ + end \ + else \ + begin \ + qG = (TG > 0) ? v_o / (0.5 + sqrt(0.25 - v_o / gamma_g2)) : v_o; \ + end \ +end `define FUNCTIONS_INCLUDE `endif diff --git a/code/ekv3_include/ekv3_gate_current.va b/code/ekv3_include/ekv3_gate_current.va index f2b928a..2457783 100644 --- a/code/ekv3_include/ekv3_gate_current.va +++ b/code/ekv3_include/ekv3_gate_current.va @@ -1,174 +1,174 @@ // ANALYTICAL CALCULATION OF THE GATE CURRENT begin : GATE_CURRENT - if (((psi_p > 0) && (TG < 0)) || ((psi_p < 0) && (TG > 0))) - begin - v1_gc = sqrt(0.25 + (v_o_qme + 2.0 * qs) / gamma_g2); - v2_gc = 0.5 + v1_gc; - psi_ox = (v_o_qme + 2.0 * qs) / v2_gc; - dpsi_dq = (2.0 / v2_gc) * (1.0 - (v_o_qme + 2.0 * qs) / (2.0 * v1_gc * v2_gc * gamma_g2)); - end - else - begin - psi_ox = v_o_qme + 2.0 * qs; - dpsi_dq = 2.0; - end - psi_x = abs(psi_ox) / xb; + if (((psi_p > 0) && (TG < 0)) || ((psi_p < 0) && (TG > 0))) + begin + v1_gc = sqrt(0.25 + (v_o_qme + 2.0 * qs) / gamma_g2); + v2_gc = 0.5 + v1_gc; + psi_ox = (v_o_qme + 2.0 * qs) / v2_gc; + dpsi_dq = (2.0 / v2_gc) * (1.0 - (v_o_qme + 2.0 * qs) / (2.0 * v1_gc * v2_gc * gamma_g2)); + end + else + begin + psi_ox = v_o_qme + 2.0 * qs; + dpsi_dq = 2.0; + end + psi_x = abs(psi_ox) / xb; // CALCULATION OF PROBABILITY OF TUNNELING - if (psi_x < 1.0) - begin - tmp = sqrt(1.0 - psi_x); - p_tun = exp( - ub * (1.0 / (1.0 + tmp) + tmp)); - end - else - begin - p_tun = exp( - ub / psi_x); - end - - igo = qs * psi_ox * p_tun; - if ((vs == vd) || (psi_ox == 0.0)) // NOTE: Symmetrical bias case, symmetrical distribution of current to source and drain nodes. - begin - nigc = igo * nq; - nigs = nigc * 0.5; - nigd = nigs; - end - else // NOTE: Asymmetrical bias case, asymmetrical partition scheme to source and drain nodes. - begin - dq_dksi = (irp - if_) / (2.0 * qs + 1.0); - a_gc = dq_dksi * (1.0 / qs + dpsi_dq / psi_ox); - if (psi_x < 1.0) - begin - if (psi_ox > 0.0) - begin - b_gc = dq_dksi * dpsi_dq * (ub / xb) * (3.0 + psi_x) / (4.0 + 2.0 * sqrt(1.0 - psi_x) * (2.0 + psi_x)); - end - else - begin - b_gc = -dq_dksi * dpsi_dq * (ub / xb) * (3.0 + psi_x) / (4.0 + 2.0 * sqrt(1.0 - psi_x) * (2.0 + psi_x)); - end - end - else - begin - b_gc = dpsi_dq * dq_dksi * ub / (psi_x * psi_ox); - end - nigc = nq * igo * (2.0 + a_gc) / (2.0 - b_gc); - nigs = 0.5 * nq * igo * (3.0 + a_gc) / (3.0 - b_gc); - nigd = nigc - nigs; - end -// CALCULATION OF DENORMALIZED GATE CURRENTS - if (vg > vfb) // NOTE: Depletion and inversion region. Gate current flows between the gate and the channel and is distributed to source and drain nodes. - begin - IGB = 0.0; - tmp = 2.0 * KG * WeffNF * Leff * UT2 / TOX2; - IG = tmp * nigc; // NOTE: Also used in gate shot noise and gate flicker noise (ekv3_noise.va) - IGD = tmp * nigd; - IGS = IG - IGD; - end - else // NOTE: Accumulation region. Gate current flows between the gate and the bulk. - begin - IGB = KG * WeffNF * Leff * psi_ox * abs(psi_ox) * UT2 * p_tun / TOX2; - IG = 0.0; - IGD = 0.0; - IGS = 0.0; - end + if (psi_x < 1.0) + begin + tmp = sqrt(1.0 - psi_x); + p_tun = exp( - ub * (1.0 / (1.0 + tmp) + tmp)); + end + else + begin + p_tun = exp( - ub / psi_x); + end + + igo = qs * psi_ox * p_tun; + if ((vs == vd) || (psi_ox == 0.0)) // NOTE: Symmetrical bias case, symmetrical distribution of current to source and drain nodes. + begin + nigc = igo * nq; + nigs = nigc * 0.5; + nigd = nigs; + end + else // NOTE: Asymmetrical bias case, asymmetrical partition scheme to source and drain nodes. + begin + dq_dksi = (irp - if_) / (2.0 * qs + 1.0); + a_gc = dq_dksi * (1.0 / qs + dpsi_dq / psi_ox); + if (psi_x < 1.0) + begin + if (psi_ox > 0.0) + begin + b_gc = dq_dksi * dpsi_dq * (ub / xb) * (3.0 + psi_x) / (4.0 + 2.0 * sqrt(1.0 - psi_x) * (2.0 + psi_x)); + end + else + begin + b_gc = -dq_dksi * dpsi_dq * (ub / xb) * (3.0 + psi_x) / (4.0 + 2.0 * sqrt(1.0 - psi_x) * (2.0 + psi_x)); + end + end + else + begin + b_gc = dpsi_dq * dq_dksi * ub / (psi_x * psi_ox); + end + nigc = nq * igo * (2.0 + a_gc) / (2.0 - b_gc); + nigs = 0.5 * nq * igo * (3.0 + a_gc) / (3.0 - b_gc); + nigd = nigc - nigs; + end +// CALCULATION OF DENORMALIZED GATE CURRENTS + if (vg > vfb) // NOTE: Depletion and inversion region. Gate current flows between the gate and the channel and is distributed to source and drain nodes. + begin + IGB = 0.0; + tmp = 2.0 * KG * WeffNF * Leff * UT2 / TOX2; + IG = tmp * nigc; // NOTE: Also used in gate shot noise and gate flicker noise (ekv3_noise.va) + IGD = tmp * nigd; + IGS = IG - IGD; + end + else // NOTE: Accumulation region. Gate current flows between the gate and the bulk. + begin + IGB = KG * WeffNF * Leff * psi_ox * abs(psi_ox) * UT2 * p_tun / TOX2; + IG = 0.0; + IGD = 0.0; + IGS = 0.0; + end // CALCULATION OF OVERLAP GATE CURRENTS, BETWEEN GATE AND SOURCE, ON ONE SIDE, AND GATE AND DRAIN, ON THE OTHER // SOURCE SIDE CALCULATIONS if (LOVIG !=0 ) begin - if (vg - vs > vfb_ov) - begin - tmp = sqrt( vg - vs - vfb_ov + gamma_g2 * 0.25) - gamma_g * 0.5; - psi_ox_sovgc = vg - vs - tmp * tmp; - end - else - begin - tmp = sqrt(-vg + vs + vfb_ov + gamma_ov2 * 0.25) - gamma_ov * 0.5; - psi_ox_sovgc = vg - vs + tmp * tmp; - end - psi_x_sovgc = abs(psi_ox_sovgc) / xb; - if (psi_x_sovgc < 1.0) - begin - tmp = sqrt(1.0 - psi_x_sovgc); - p_tun_sovgc = exp( - ub * (1.0 / (1.0 + tmp) + tmp)); - end - else - begin - p_tun_sovgc = exp( - ub / psi_x_sovgc); - end + if (vg - vs > vfb_ov) + begin + tmp = sqrt( vg - vs - vfb_ov + gamma_g2 * 0.25) - gamma_g * 0.5; + psi_ox_sovgc = vg - vs - tmp * tmp; + end + else + begin + tmp = sqrt(-vg + vs + vfb_ov + gamma_ov2 * 0.25) - gamma_ov * 0.5; + psi_ox_sovgc = vg - vs + tmp * tmp; + end + psi_x_sovgc = abs(psi_ox_sovgc) / xb; + if (psi_x_sovgc < 1.0) + begin + tmp = sqrt(1.0 - psi_x_sovgc); + p_tun_sovgc = exp( - ub * (1.0 / (1.0 + tmp) + tmp)); + end + else + begin + p_tun_sovgc = exp( - ub / psi_x_sovgc); + end // DRAIN SIDE CALCULATIONS - if (vg - vd > vfb_ov) - begin - tmp = sqrt(vg - vd - vfb_ov + gamma_g2 * 0.25) - gamma_g * 0.5; - psi_ox_dovgc = vg - vd - tmp * tmp; - end - else - begin - tmp = sqrt(-vg + vd + vfb_ov + gamma_ov2 * 0.25) - gamma_ov * 0.5; - psi_ox_dovgc = vg - vd + tmp * tmp; - end - psi_x_dovgc = abs(psi_ox_dovgc) / xb; - if (psi_x_dovgc < 1.0) - begin - tmp = sqrt(1.0 - psi_x_dovgc); - p_tun_dovgc = exp( - ub * (1.0 / (1.0 + tmp) + tmp)); - end - else - begin - p_tun_dovgc = exp( - ub / psi_x_dovgc); - end + if (vg - vd > vfb_ov) + begin + tmp = sqrt(vg - vd - vfb_ov + gamma_g2 * 0.25) - gamma_g * 0.5; + psi_ox_dovgc = vg - vd - tmp * tmp; + end + else + begin + tmp = sqrt(-vg + vd + vfb_ov + gamma_ov2 * 0.25) - gamma_ov * 0.5; + psi_ox_dovgc = vg - vd + tmp * tmp; + end + psi_x_dovgc = abs(psi_ox_dovgc) / xb; + if (psi_x_dovgc < 1.0) + begin + tmp = sqrt(1.0 - psi_x_dovgc); + p_tun_dovgc = exp( - ub * (1.0 / (1.0 + tmp) + tmp)); + end + else + begin + p_tun_dovgc = exp( - ub / psi_x_dovgc); + end // CALCULATION OF DENORMALIZED OVERLAP GATE CURERNTS - tmp = KG * WeffNF * LOVIG * UT2 / TOX2; - IGSOV = tmp * psi_ox_sovgc * abs(psi_ox_sovgc) * p_tun_sovgc; - IGDOV = tmp * psi_ox_dovgc * abs(psi_ox_dovgc) * p_tun_dovgc; + tmp = KG * WeffNF * LOVIG * UT2 / TOX2; + IGSOV = tmp * psi_ox_sovgc * abs(psi_ox_sovgc) * p_tun_sovgc; + IGDOV = tmp * psi_ox_dovgc * abs(psi_ox_dovgc) * p_tun_dovgc; end -else begin - IGSOV = 0; - IGDOV = 0; +else begin + IGSOV = 0; + IGDOV = 0; end end // ASSIGNMENT OF GATE CURRENTS AND OVERLAP GATE CURRENTS. `ifdef DC_S // GATE CURRENTS - I(b ,g ) <+ -SIGN_M * IGB; - I(s ,g ) <+ -SIGN_M * (d_gt_s * IGS + s_gt_d * IGD); - I(d ,g ) <+ -SIGN_M * (d_gt_s * IGD + s_gt_d * IGS); + I(b ,g ) <+ -SIGN_M * IGB; + I(s ,g ) <+ -SIGN_M * (d_gt_s * IGS + s_gt_d * IGD); + I(d ,g ) <+ -SIGN_M * (d_gt_s * IGD + s_gt_d * IGS); // OVERLAP GATE CURRENTS - I(s ,g ) <+ -SIGN_M * (d_gt_s * IGSOV + s_gt_d * IGDOV); - I(d ,g ) <+ -SIGN_M * (d_gt_s * IGDOV + s_gt_d * IGSOV); + I(s ,g ) <+ -SIGN_M * (d_gt_s * IGSOV + s_gt_d * IGDOV); + I(d ,g ) <+ -SIGN_M * (d_gt_s * IGDOV + s_gt_d * IGSOV); `endif `ifdef DC // GATE CURRENTS - I(b ,g ) <+ -SIGN_M * IGB; - I(si,g ) <+ -SIGN_M * (d_gt_s * IGS + s_gt_d * IGD); - I(di,g ) <+ -SIGN_M * (d_gt_s * IGD + s_gt_d * IGS); + I(b ,g ) <+ -SIGN_M * IGB; + I(si,g ) <+ -SIGN_M * (d_gt_s * IGS + s_gt_d * IGD); + I(di,g ) <+ -SIGN_M * (d_gt_s * IGD + s_gt_d * IGS); // OVERLAP GATE CURRENTS - I(si,g ) <+ -SIGN_M * (d_gt_s * IGSOV + s_gt_d * IGDOV); - I(di,g ) <+ -SIGN_M * (d_gt_s * IGDOV + s_gt_d * IGSOV); + I(si,g ) <+ -SIGN_M * (d_gt_s * IGSOV + s_gt_d * IGDOV); + I(di,g ) <+ -SIGN_M * (d_gt_s * IGDOV + s_gt_d * IGSOV); `endif `ifdef RF_S // GATE CURRENTS - I(b ,gi) <+ -SIGN_M * IGB; - I(si,gi) <+ -SIGN_M * (d_gt_s * IGS + s_gt_d * IGD); - I(di,gi) <+ -SIGN_M * (d_gt_s * IGD + s_gt_d * IGS); + I(b ,gi) <+ -SIGN_M * IGB; + I(si,gi) <+ -SIGN_M * (d_gt_s * IGS + s_gt_d * IGD); + I(di,gi) <+ -SIGN_M * (d_gt_s * IGD + s_gt_d * IGS); // OVERLAP GATE CURRENTS - I(si,gi) <+ -SIGN_M * (d_gt_s * IGSOV + s_gt_d * IGDOV); - I(di,gi) <+ -SIGN_M * (d_gt_s * IGDOV + s_gt_d * IGSOV); + I(si,gi) <+ -SIGN_M * (d_gt_s * IGSOV + s_gt_d * IGDOV); + I(di,gi) <+ -SIGN_M * (d_gt_s * IGDOV + s_gt_d * IGSOV); `endif `ifdef RF // GATE CURRENTS - I(b ,gi) <+ -SIGN_M * IGB; - I(si,gi) <+ -SIGN_M * (d_gt_s * IGS + s_gt_d * IGD); - I(di,gi) <+ -SIGN_M * (d_gt_s * IGD + s_gt_d * IGS); + I(b ,gi) <+ -SIGN_M * IGB; + I(si,gi) <+ -SIGN_M * (d_gt_s * IGS + s_gt_d * IGD); + I(di,gi) <+ -SIGN_M * (d_gt_s * IGD + s_gt_d * IGS); // OVERLAP GATE CURRENTS - I(si,gi) <+ -SIGN_M * (d_gt_s * IGSOV + s_gt_d * IGDOV); - I(di,gi) <+ -SIGN_M * (d_gt_s * IGDOV + s_gt_d * IGSOV); + I(si,gi) <+ -SIGN_M * (d_gt_s * IGSOV + s_gt_d * IGDOV); + I(di,gi) <+ -SIGN_M * (d_gt_s * IGDOV + s_gt_d * IGSOV); `endif `ifdef NQS // GATE CURRENTS - I(b ,gi) <+ -SIGN_M * IGB; - I(si,gi) <+ -SIGN_M * (d_gt_s * IGS + s_gt_d * IGD); - I(di,gi) <+ -SIGN_M * (d_gt_s * IGD + s_gt_d * IGS); + I(b ,gi) <+ -SIGN_M * IGB; + I(si,gi) <+ -SIGN_M * (d_gt_s * IGS + s_gt_d * IGD); + I(di,gi) <+ -SIGN_M * (d_gt_s * IGD + s_gt_d * IGS); // OVERLAP GATE CURRENTS - I(si,gi) <+ -SIGN_M * (d_gt_s * IGSOV + s_gt_d * IGDOV); - I(di,gi) <+ -SIGN_M * (d_gt_s * IGDOV + s_gt_d * IGSOV); + I(si,gi) <+ -SIGN_M * (d_gt_s * IGSOV + s_gt_d * IGDOV); + I(di,gi) <+ -SIGN_M * (d_gt_s * IGDOV + s_gt_d * IGSOV); `endif diff --git a/code/ekv3_include/ekv3_gidl.va b/code/ekv3_include/ekv3_gidl.va index 82fbe93..1f1d749 100644 --- a/code/ekv3_include/ekv3_gidl.va +++ b/code/ekv3_include/ekv3_gidl.va @@ -2,51 +2,51 @@ // DRAIN SIDE begin : GIDL - vgse = vfb + psi_p - 2.0 * qs; - tmp1 = (vdp - vs - vgse) * UT - EGIDL; -// PATCH FOR + vgse = vfb + psi_p - 2.0 * qs; + tmp1 = (vdp - vs - vgse) * UT - EGIDL; +// PATCH FOR if (AGIDL==0 || tmp1 <=0 ) begin IGIDL = 0; end else begin - tmp2 = vdp * vdp * vdp * UT3; - IGIDL = AGIDL * WeffNF * (tmp1 / (3.0 * TOX)) * exp(-(3.0 * TOX * BGIDL) / tmp1) * tmp2 / (CGIDL + tmp2); - end -end // GIDL + tmp2 = vdp * vdp * vdp * UT3; + IGIDL = AGIDL * WeffNF * (tmp1 / (3.0 * TOX)) * exp(-(3.0 * TOX * BGIDL) / tmp1) * tmp2 / (CGIDL + tmp2); + end +end // GIDL // SOURCE SIDE begin : GISL - vgde = vfb + psi_p - 2.0 * qdp; - tmp1 = (vs - vdp - vgde) * UT - EGIDL; + vgde = vfb + psi_p - 2.0 * qdp; + tmp1 = (vs - vdp - vgde) * UT - EGIDL; if (AGIDL==0 || tmp1 <=0 ) begin IGISL = 0; end else begin - tmp2 = vs * vs * vs * UT3; - IGISL = AGIDL * WeffNF * (tmp1 / (3.0 * TOX)) * exp(-(3.0 * TOX * BGIDL) / tmp1) * tmp2 / (CGIDL + tmp2); - end -end // GISL + tmp2 = vs * vs * vs * UT3; + IGISL = AGIDL * WeffNF * (tmp1 / (3.0 * TOX)) * exp(-(3.0 * TOX * BGIDL) / tmp1) * tmp2 / (CGIDL + tmp2); + end +end // GISL // ASSIGNMENT OF THE GIDL AND GISL CURRENT `ifdef DC_S - I(d ,b ) <+ SIGN_M * (d_gt_s * IGIDL + s_gt_d * IGISL); - I(s ,b ) <+ SIGN_M * (d_gt_s * IGISL + s_gt_d * IGIDL); + I(d ,b ) <+ SIGN_M * (d_gt_s * IGIDL + s_gt_d * IGISL); + I(s ,b ) <+ SIGN_M * (d_gt_s * IGISL + s_gt_d * IGIDL); `endif `ifdef DC - I(di,b ) <+ SIGN_M * (d_gt_s * IGIDL + s_gt_d * IGISL); - I(si,b ) <+ SIGN_M * (d_gt_s * IGISL + s_gt_d * IGIDL); + I(di,b ) <+ SIGN_M * (d_gt_s * IGIDL + s_gt_d * IGISL); + I(si,b ) <+ SIGN_M * (d_gt_s * IGISL + s_gt_d * IGIDL); `endif `ifdef RF_S - I(di,bi) <+ SIGN_M * (d_gt_s * IGIDL + s_gt_d * IGISL); - I(si,bi) <+ SIGN_M * (d_gt_s * IGISL + s_gt_d * IGIDL); + I(di,bi) <+ SIGN_M * (d_gt_s * IGIDL + s_gt_d * IGISL); + I(si,bi) <+ SIGN_M * (d_gt_s * IGISL + s_gt_d * IGIDL); `endif `ifdef RF - I(di,bi) <+ SIGN_M * (d_gt_s * IGIDL + s_gt_d * IGISL); - I(si,bi) <+ SIGN_M * (d_gt_s * IGISL + s_gt_d * IGIDL); + I(di,bi) <+ SIGN_M * (d_gt_s * IGIDL + s_gt_d * IGISL); + I(si,bi) <+ SIGN_M * (d_gt_s * IGISL + s_gt_d * IGIDL); `endif `ifdef NQS - I(di,bi) <+ SIGN_M * (d_gt_s * IGIDL + s_gt_d * IGISL); - I(si,bi) <+ SIGN_M * (d_gt_s * IGISL + s_gt_d * IGIDL); + I(di,bi) <+ SIGN_M * (d_gt_s * IGIDL + s_gt_d * IGISL); + I(si,bi) <+ SIGN_M * (d_gt_s * IGISL + s_gt_d * IGIDL); `endif diff --git a/code/ekv3_include/ekv3_idb.va b/code/ekv3_include/ekv3_idb.va index 4a7a85d..b4ce71e 100644 --- a/code/ekv3_include/ekv3_idb.va +++ b/code/ekv3_include/ekv3_idb.va @@ -1,42 +1,42 @@ // ANALYTICAL CALCULATION OF IMPACT IONIZATION CURRENT begin : IMPACT_IONIZATION_CURRENT_IDB - v_ib = (vd - vs) - IBN * 2.0 * vdssat; - if (v_ib > 0.0) - begin - tmp = IBB_t * LC / (v_ib * UT); - tmp1 = `MINA(tmp,70,1.0E-2); // NOTE: Limiting the argument of the exponential function at the IDB calculation. - IDB = IDS * v_ib * UT * exp(-tmp1) * IBA / IBB_t; - end - else - begin - IDB = 0.0; - end + v_ib = (vd - vs) - IBN * 2.0 * vdssat; + if (v_ib > 0.0) + begin + tmp = IBB_t * LC / (v_ib * UT); + tmp1 = `MINA(tmp,70,1.0E-2); // NOTE: Limiting the argument of the exponential function at the IDB calculation. + IDB = IDS * v_ib * UT * exp(-tmp1) * IBA / IBB_t; + end + else + begin + IDB = 0.0; + end end // IMPACT_IONIZATION_CURRENT_IDB // ASSIGNMENT OF THE IMPACT IONIZATION CURRENT `ifdef DC_S - I(d ,b ) <+ SIGN_M * d_gt_s * IDB; - I(s ,b ) <+ SIGN_M * s_gt_d * IDB; + I(d ,b ) <+ SIGN_M * d_gt_s * IDB; + I(s ,b ) <+ SIGN_M * s_gt_d * IDB; `endif `ifdef DC - I(di,b ) <+ SIGN_M * d_gt_s * IDB; - I(si,b ) <+ SIGN_M * s_gt_d * IDB; + I(di,b ) <+ SIGN_M * d_gt_s * IDB; + I(si,b ) <+ SIGN_M * s_gt_d * IDB; `endif `ifdef RF_S - I(di,bi) <+ SIGN_M * d_gt_s * IDB; - I(si,bi) <+ SIGN_M * s_gt_d * IDB; + I(di,bi) <+ SIGN_M * d_gt_s * IDB; + I(si,bi) <+ SIGN_M * s_gt_d * IDB; `endif `ifdef RF - I(di,bi) <+ SIGN_M * d_gt_s * IDB; - I(si,bi) <+ SIGN_M * s_gt_d * IDB; + I(di,bi) <+ SIGN_M * d_gt_s * IDB; + I(si,bi) <+ SIGN_M * s_gt_d * IDB; `endif `ifdef NQS - I(di,bi) <+ SIGN_M * d_gt_s * IDB; - I(si,bi) <+ SIGN_M * s_gt_d * IDB; + I(di,bi) <+ SIGN_M * d_gt_s * IDB; + I(si,bi) <+ SIGN_M * s_gt_d * IDB; `endif diff --git a/code/ekv3_include/ekv3_natures.va b/code/ekv3_include/ekv3_natures.va index ee695c4..2c4a077 100644 --- a/code/ekv3_include/ekv3_natures.va +++ b/code/ekv3_include/ekv3_natures.va @@ -8,63 +8,63 @@ // The following lines are part of the discipline.(h/vams) file. // Here they are written directly for portability purposes. // -// `include "discipline.h" - +// `include "discipline.h" + nature Current - units = "A"; - access = I; - idt_nature = Charge; + units = "A"; + access = I; + idt_nature = Charge; `ifdef CURRENT_ABSTOL - abstol = `CURRENT_ABSTOL; + abstol = `CURRENT_ABSTOL; `else - abstol = 1E-12; + abstol = 1E-12; `endif endnature nature Charge - units = "coul"; - access = Q; - ddt_nature = Current; + units = "coul"; + access = Q; + ddt_nature = Current; `ifdef CHARGE_ABSTOL - abstol = `CHARGE_ABSTOL; + abstol = `CHARGE_ABSTOL; `else - abstol = 1E-14; + abstol = 1E-14; `endif endnature nature Voltage - units = "V"; - access = V; - idt_nature = Flux; + units = "V"; + access = V; + idt_nature = Flux; `ifdef VOLTAGE_ABSTOL - abstol = `VOLTAGE_ABSTOL; + abstol = `VOLTAGE_ABSTOL; `else - abstol = 1E-6; + abstol = 1E-6; `endif endnature nature Flux - units = "Wb"; - access = Phi; - ddt_nature = Voltage; + units = "Wb"; + access = Phi; + ddt_nature = Voltage; `ifdef FLUX_ABSTOL - abstol = `FLUX_ABSTOL; + abstol = `FLUX_ABSTOL; `else - abstol = 1E-9; + abstol = 1E-9; `endif endnature discipline electrical - potential Voltage; - flow Current; + potential Voltage; + flow Current; enddiscipline discipline voltage - potential Voltage; + potential Voltage; enddiscipline discipline current - potential Current; + potential Current; enddiscipline // END: discipline.h `define NATURES_INCLUDE diff --git a/code/ekv3_include/ekv3_noise.va b/code/ekv3_include/ekv3_noise.va index 0fe134b..fdb16fb 100644 --- a/code/ekv3_include/ekv3_noise.va +++ b/code/ekv3_include/ekv3_noise.va @@ -9,21 +9,21 @@ begin : noise // FREQUENTLY PERFORMED CALCULATION - Snspec = KT4 * Gspec; + Snspec = KT4 * Gspec; begin : CHANNEL_NOISE // CALCULATION OF THERMAL NOISE, INCLUDING SHORT CHANNEL EFFECTS (ANANDA ROY - CHRISTIAN ENZ) - tmp = 1 + e_clm * qs_qdp; - tmp1 = e_clm * i; - gn = (2 / (tmp * tmp * qsqdpp1)) * (`ONE3RD * (qs2 + qs * qdp + qdp2) + tmp1 * tmp1 * 0.25 + 0.25 * (tmp1 + 1) * qsqdp + (tmp1 - 1) * 0.125 * e_clm2 * i * qsqdpp1 * ln(max(1.0E-24,abs((xf - 0.5 * tmp1) / (xrp - 0.5 * tmp1))))); - thermal = Snspec * gn; + tmp = 1 + e_clm * qs_qdp; + tmp1 = e_clm * i; + gn = (2 / (tmp * tmp * qsqdpp1)) * (`ONE3RD * (qs2 + qs * qdp + qdp2) + tmp1 * tmp1 * 0.25 + 0.25 * (tmp1 + 1) * qsqdp + (tmp1 - 1) * 0.125 * e_clm2 * i * qsqdpp1 * ln(max(1.0E-24,abs((xf - 0.5 * tmp1) / (xrp - 0.5 * tmp1))))); + thermal = Snspec * gn; //////////////////////////////////////////////////////////////////////////// /////////////////////OLD FLICKER MODEL////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// - gmg_ = Gspec * (qs_qdp) / nv; -if (LFNOI == 0) + gmg_ = Gspec * (qs_qdp) / nv; +if (LFNOI == 0) begin - flicker = KF * exp(EF * ln(max(1.0E-24,abs(gmg_)))) / (WeffNF * Leff * COX * inv_dqmip1); + flicker = KF * exp(EF * ln(max(1.0E-24,abs(gmg_)))) / (WeffNF * Leff * COX * inv_dqmip1); end //////////////////////////////////////////////////////////////////////////// /////////////////////NEW FLICKER MODEL////////////////////////////////////// @@ -31,86 +31,86 @@ end else begin // FLICKER NOISE DUE TO CARRIER NUMBER FLUCTUATIONS-MC WORTHER MODEL - qel2 = `C_QE*`C_QE; - qel4 = qel2*qel2; - NT_var = NT*(1.6E+25); - sddn = (qel4*`TAD*NT_var)/(`C_K * T *WeffNF*(Leff - deltal)*(COX * inv_dqmip1)*(COX * inv_dqmip1)*nq*nq); - Qspec = 2*nq*UT*COX* inv_dqmip1; - alpha = ALPHAC*Qspec; - a_m = alpha*beta/COX ; - LC_R = (2*UT)/(ECN*(Leff-deltal)); + qel2 = `C_QE*`C_QE; + qel4 = qel2*qel2; + NT_var = NT*(1.6E+25); + sddn = (qel4*`TAD*NT_var)/(`C_K * T *WeffNF*(Leff - deltal)*(COX * inv_dqmip1)*(COX * inv_dqmip1)*nq*nq); + Qspec = 2*nq*UT*COX* inv_dqmip1; + alpha = ALPHAC*Qspec; + a_m = alpha*beta/COX ; + LC_R = (2*UT)/(ECN*(Leff-deltal)); if (i!=0) begin - kddn = (1/(2*i*i))*(((qs2+qs)-(qdp2+qdp))/((1+LC_R*(qs-qdp))*(1+LC_R*(qs-qdp))*(1+LC_R*(qs-qdp))))*ln(max(1.0E-24,(qs+0.5-((LC_R*((qs2+qs)-(qdp2+qdp)))/(2*(1+LC_R*(qs-qdp)))))/(qdp+0.5-((LC_R*((qs2+qs)-(qdp2+qdp)))/(2*(1+LC_R*(qs-qdp)))))))+ a_m/(1+qs+qdp) + (a_m/2)*(a_m/2); + kddn = (1/(2*i*i))*(((qs2+qs)-(qdp2+qdp))/((1+LC_R*(qs-qdp))*(1+LC_R*(qs-qdp))*(1+LC_R*(qs-qdp))))*ln(max(1.0E-24,(qs+0.5-((LC_R*((qs2+qs)-(qdp2+qdp)))/(2*(1+LC_R*(qs-qdp)))))/(qdp+0.5-((LC_R*((qs2+qs)-(qdp2+qdp)))/(2*(1+LC_R*(qs-qdp)))))))+ a_m/(1+qs+qdp) + (a_m/2)*(a_m/2); end else -begin +begin kddn = 0; end - sidn = sddn*kddn*IDS*IDS; + sidn = sddn*kddn*IDS*IDS; // FLICKER NOISE DUE TO MOBILITY FLUCTUATIONS-HOOGE MODEL if (i!=0) begin - sddm = (ALPHAH*qel2)/(`C_K * T * WeffNF*(Leff - deltal)*COX * inv_dqmip1*nq); - kddm = (1/(1+qs+qdp))*(1+((ln(qs/qdp))/(2*qs_qdp))); + sddm = (ALPHAH*qel2)/(`C_K * T * WeffNF*(Leff - deltal)*COX * inv_dqmip1*nq); + kddm = (1/(1+qs+qdp))*(1+((ln(qs/qdp))/(2*qs_qdp))); end else begin kddm = 0; end - sidm = sddm * kddm *IDS*IDS ; + sidm = sddm * kddm *IDS*IDS ; // FLICKER NOISE DUE TO SOURCE AND DRAIN ACESS RESISTANCES -// PATCH : 22 / 11 / 2013 -// Gspec_fn = Ispec/(COX * inv_dqmip1); +// PATCH : 22 / 11 / 2013 +// Gspec_fn = Ispec/(COX * inv_dqmip1); Gspec_fn = Gspec / (1.0 + rs_wt * Gspec * qs + rd_wt * Gspec * qdp); - sddr = (qs2+qdp2)*Gspec_fn*Gspec_fn*SDR; - sidr = sddr*IDS*IDS ; + sddr = (qs2+qdp2)*Gspec_fn*Gspec_fn*SDR; + sidr = sddr*IDS*IDS ; // TOTAL FLICKER NOISE - flicker = sidn + sidm +sidr ; -end + flicker = sidn + sidm +sidr ; +end end // CHANNEL_NOISE begin : CORRELATED_NOISE // CALCULATION OF NON-QUASI-STATIC THERMAL NOISE, CORRELATED INDUCED GATE AND BULK NOISE - omegaspec = beta / COX * UT / Leff2; // NOTE: Normalization factor for angular frequency. - OMEGA = (omegaspec != 0.0) ? - 1.0 / omegaspec : 0.0; - tmp = xf + xrp; - tmp1 = xf * xrp; - tmp2 = tmp * tmp; - tmp3 = tmp2 * tmp; - snidid = 2.0 * (xf2 - 0.75 * tmp + tmp1 + xrp2) / (3.0 * tmp); - snigig = OMEGA * OMEGA * (16.0 * (xf2 * xf2 + xrp2 * xrp2) + 80.0 * tmp1 * (xrp2 + xf2) + 168.0 * xf2 * xrp2 - 15.0 * (xf2 * xf + xrp2 * xrp) - 75.0 * tmp1 * tmp) / (540.0 * nq0 * nq0 * tmp3 * tmp2); - snibib = snigig * (nq0 - 1.0) * (nq0 - 1.0); - snigid = (OMEGA / (18.0 * nq0)) * ((xf - xrp) * (xf2 + 4.0 * tmp1 + xrp2)) / tmp3; // NOTE: snigid is imaginary + omegaspec = beta / COX * UT / Leff2; // NOTE: Normalization factor for angular frequency. + OMEGA = (omegaspec != 0.0) ? + 1.0 / omegaspec : 0.0; + tmp = xf + xrp; + tmp1 = xf * xrp; + tmp2 = tmp * tmp; + tmp3 = tmp2 * tmp; + snidid = 2.0 * (xf2 - 0.75 * tmp + tmp1 + xrp2) / (3.0 * tmp); + snigig = OMEGA * OMEGA * (16.0 * (xf2 * xf2 + xrp2 * xrp2) + 80.0 * tmp1 * (xrp2 + xf2) + 168.0 * xf2 * xrp2 - 15.0 * (xf2 * xf + xrp2 * xrp) - 75.0 * tmp1 * tmp) / (540.0 * nq0 * nq0 * tmp3 * tmp2); + snibib = snigig * (nq0 - 1.0) * (nq0 - 1.0); + snigid = (OMEGA / (18.0 * nq0)) * ((xf - xrp) * (xf2 + 4.0 * tmp1 + xrp2)) / tmp3; // NOTE: snigid is imaginary ////////////////////////////////////////////////////// // PATCH : LIMIT THE VALUES / NON ZERO VALUES NEEDED - snigig = `MAX(snigig,1e-54); - snibib = `MAX(snibib,1e-54); - snidid = `MAX(snidid,1e-54); + snigig = `MAX(snigig,1e-54); + snibib = `MAX(snibib,1e-54); + snidid = `MAX(snidid,1e-54); ////////////////////////////////////////////////////// - c_igid = ((snidid != 0.0) && (snigig != 0.0)) ? - snigid / sqrt(snidid * snigig) : 0.0; // NOTE: c_igid is imaginary + c_igid = ((snidid != 0.0) && (snigig != 0.0)) ? + snigid / sqrt(snidid * snigig) : 0.0; // NOTE: c_igid is imaginary // VARIABLES USED IN ASSIGNMENT OF THE NQS NOISE - noise_ds1 = `MAX((snidid * (1.0 - c_igid * c_igid)),0.0); // NOTE: Thermal noise, uncorrelated part. - noise_ds2 = `MAX(c_igid * snidid,0.0); // NOTE: Thermal noise, correlated part. - noise_g = `MAX(snigig,0.0); - noise_b = `MAX(snibib,0.0); -end // CORRELATED_NOISE + noise_ds1 = `MAX((snidid * (1.0 - c_igid * c_igid)),0.0); // NOTE: Thermal noise, uncorrelated part. + noise_ds2 = `MAX(c_igid * snidid,0.0); // NOTE: Thermal noise, correlated part. + noise_g = `MAX(snigig,0.0); + noise_b = `MAX(snibib,0.0); +end // CORRELATED_NOISE begin : GATE_NOISE__SHOT_AND_FLICKER // CALCULATION OF THE GATE SHOT NOISE AND GATE FLICKER NOISE - if (IG > 0.0) // NOTE: IG is the gate to channel current, calculated in ekv3_gate_current.va. - begin - sig_shot = 2.0 * `C_QE * IG; - sig_flicker = KGFN * IG * IG; - end - else - begin - sig_shot = 0.0; - sig_flicker = 0.0; - end + if (IG > 0.0) // NOTE: IG is the gate to channel current, calculated in ekv3_gate_current.va. + begin + sig_shot = 2.0 * `C_QE * IG; + sig_flicker = KGFN * IG * IG; + end + else + begin + sig_shot = 0.0; + sig_flicker = 0.0; + end end // GATE_NOISE__SHOT_AND_FLICKER // ASSIGNMENT OF THE CALCULATED NOISE SOURCES @@ -121,120 +121,120 @@ sig_flicker_m = sig_flicker / M; `ifdef DC_S // THERMAL NOISE (INCLUDING SHORT CHANNEL EFFECTS, TH_NOI=1) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL - I(d,s) <+ white_noise (M * thermal * TH_NOI + M * Snspec * noise_ds1*NQS_NOI, "THERMAL NOISE IN CHANNEL (TH_NOI=1)"); +//PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL + I(d,s) <+ white_noise (M * thermal * TH_NOI + M * Snspec * noise_ds1*NQS_NOI, "THERMAL NOISE IN CHANNEL (TH_NOI=1)"); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FLICKER NOISE - I(d ,s ) <+ flicker_noise (flicker_m, AF, "FLICKER NOISE IN CHANNEL"); + I(d ,s ) <+ flicker_noise (flicker_m, AF, "FLICKER NOISE IN CHANNEL"); // NQS THERMAL NOISE (INCLUDING INDUCED GATE AND BULK NOISE, NQS_NOI=1) - I(noi) <+ V(noi); // NOTE: Auxiliary node for defining correlated noise sources. - I(noi) <+ white_noise(M * Snspec * NQS_NOI, "AUXILIARY NOISE SOURCE FOR CORRELATION, CORRELATED PART (NQS_NOI=1)"); + I(noi) <+ V(noi); // NOTE: Auxiliary node for defining correlated noise sources. + I(noi) <+ white_noise(M * Snspec * NQS_NOI, "AUXILIARY NOISE SOURCE FOR CORRELATION, CORRELATED PART (NQS_NOI=1)"); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PATCH CMI ERROR DUE TO THE FACT THAT IT CAN NOT RECOGNIZE PARALLEL NOISE SOURCES (12/11) -// I(d,s) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); +// I(d,s) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - I(d ,s ) <+ V(noi) * noise_ds2 * NQS_NOI; // NOTE: Correlated part of thermal noise assigned to channel. - I(g) <+ ddt(V(noi) * noise_g * NQS_NOI); // NOTE: Correlated part of thermal noise assigned to gate. The derivate allows the multiplication with the unity imaginary. - I(b) <+ flicker_noise(Snspec * noise_b * 2.0 * `PI * NQS_NOI / M, -2.0, "INDUCED BULK NOISE (NQS_NOI=1)"); -// GATE SHOT NOISE - I(g) <+ white_noise (M * sig_shot, "GATE SHOT NOISE"); + I(d ,s ) <+ V(noi) * noise_ds2 * NQS_NOI; // NOTE: Correlated part of thermal noise assigned to channel. + I(g) <+ ddt(V(noi) * noise_g * NQS_NOI); // NOTE: Correlated part of thermal noise assigned to gate. The derivate allows the multiplication with the unity imaginary. + I(b) <+ flicker_noise(Snspec * noise_b * 2.0 * `PI * NQS_NOI / M, -2.0, "INDUCED BULK NOISE (NQS_NOI=1)"); +// GATE SHOT NOISE + I(g) <+ white_noise (M * sig_shot, "GATE SHOT NOISE"); // GATE FLICKER NOISE - I(g) <+ flicker_noise (sig_flicker_m, 1.0, "GATE FLICKER NOISE"); + I(g) <+ flicker_noise (sig_flicker_m, 1.0, "GATE FLICKER NOISE"); `endif `ifdef DC // THERMAL NOISE (INCLUDING SHORT CHANNEL EFFECTS, TH_NOI=1) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL - I(di,si) <+ white_noise (M * thermal * TH_NOI + M * Snspec * noise_ds1*NQS_NOI, "THERMAL NOISE IN CHANNEL (TH_NOI=1)"); +//PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL + I(di,si) <+ white_noise (M * thermal * TH_NOI + M * Snspec * noise_ds1*NQS_NOI, "THERMAL NOISE IN CHANNEL (TH_NOI=1)"); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FLICKER NOISE - I(di,si) <+ flicker_noise (flicker_m, AF, "FLICKER NOISE IN CHANNEL"); + I(di,si) <+ flicker_noise (flicker_m, AF, "FLICKER NOISE IN CHANNEL"); // NQS THERMAL NOISE (INCLUDING INDUCED GATE AND BULK NOISE, NQS_NOI=1) - I(noi) <+ V(noi); // NOTE: Auxiliary node for defining correlated noise sources. - I(noi) <+ white_noise(M * Snspec * NQS_NOI, "AUXILIARY NOISE SOURCE FOR CORRELATION, CORRELATED PART (NQS_NOI=1)"); + I(noi) <+ V(noi); // NOTE: Auxiliary node for defining correlated noise sources. + I(noi) <+ white_noise(M * Snspec * NQS_NOI, "AUXILIARY NOISE SOURCE FOR CORRELATION, CORRELATED PART (NQS_NOI=1)"); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PATCH CMI ERROR DUE TO THE FACT THAT IT CAN NOT RECOGNIZE PARALLEL NOISE SOURCES (12/11) -// I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); +// I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - I(di,si) <+ V(noi) * noise_ds2 * NQS_NOI; // NOTE: Correlated part of thermal noise assigned to channel. - I(g) <+ ddt(V(noi) * noise_g * NQS_NOI); // NOTE: Correlated part of thermal noise assigned to gate. The derivate allows the multiplication with the unity imaginary. - I(b) <+ flicker_noise(Snspec * noise_b * 2.0 * `PI * NQS_NOI / M, -2.0, "INDUCED BULK NOISE (NQS_NOI=1)"); -// GATE SHOT NOISE - I(g) <+ white_noise (M * sig_shot, "GATE SHOT NOISE"); + I(di,si) <+ V(noi) * noise_ds2 * NQS_NOI; // NOTE: Correlated part of thermal noise assigned to channel. + I(g) <+ ddt(V(noi) * noise_g * NQS_NOI); // NOTE: Correlated part of thermal noise assigned to gate. The derivate allows the multiplication with the unity imaginary. + I(b) <+ flicker_noise(Snspec * noise_b * 2.0 * `PI * NQS_NOI / M, -2.0, "INDUCED BULK NOISE (NQS_NOI=1)"); +// GATE SHOT NOISE + I(g) <+ white_noise (M * sig_shot, "GATE SHOT NOISE"); // GATE FLICKER NOISE - I(g) <+ flicker_noise (sig_flicker_m, 1.0, "GATE FLICKER NOISE"); + I(g) <+ flicker_noise (sig_flicker_m, 1.0, "GATE FLICKER NOISE"); `endif `ifdef RF_S // THERMAL NOISE (INCLUDING SHORT CHANNEL EFFECTS, TH_NOI=1) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL - I(di,si) <+ white_noise (M * thermal * TH_NOI + M * Snspec * noise_ds1*NQS_NOI, "THERMAL NOISE IN CHANNEL (TH_NOI=1)"); +//PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL + I(di,si) <+ white_noise (M * thermal * TH_NOI + M * Snspec * noise_ds1*NQS_NOI, "THERMAL NOISE IN CHANNEL (TH_NOI=1)"); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FLICKER NOISE - I(di,si) <+ flicker_noise (flicker_m, AF, "FLICKER NOISE IN CHANNEL"); + I(di,si) <+ flicker_noise (flicker_m, AF, "FLICKER NOISE IN CHANNEL"); // NQS THERMAL NOISE (INCLUDING INDUCED GATE AND BULK NOISE, NQS_NOI=1) - I(noi) <+ V(noi); // NOTE: Auxiliary node for defining correlated noise sources. - I(noi) <+ white_noise(M * Snspec * NQS_NOI, "AUXILIARY NOISE SOURCE FOR CORRELATION, CORRELATED PART (NQS_NOI=1)"); + I(noi) <+ V(noi); // NOTE: Auxiliary node for defining correlated noise sources. + I(noi) <+ white_noise(M * Snspec * NQS_NOI, "AUXILIARY NOISE SOURCE FOR CORRELATION, CORRELATED PART (NQS_NOI=1)"); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PATCH CMI ERROR DUE TO THE FACT THAT IT CAN NOT RECOGNIZE PARALLEL NOISE SOURCES (12/11) -// I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); +// I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - I(di,si) <+ V(noi) * noise_ds2 * NQS_NOI; // NOTE: Correlated part of thermal noise assigned to channel. - I(gi) <+ ddt(V(noi) * noise_g * NQS_NOI); // NOTE: Correlated part of thermal noise assigned to gate. The derivate allows the multiplication with the unity imaginary. - I(bi) <+ flicker_noise(Snspec * noise_b * 2.0 * `PI * NQS_NOI / M, -2.0, "INDUCED BULK NOISE (NQS_NOI=1)"); -// GATE SHOT NOISE - I(gi) <+ white_noise (M * sig_shot, "GATE SHOT NOISE"); + I(di,si) <+ V(noi) * noise_ds2 * NQS_NOI; // NOTE: Correlated part of thermal noise assigned to channel. + I(gi) <+ ddt(V(noi) * noise_g * NQS_NOI); // NOTE: Correlated part of thermal noise assigned to gate. The derivate allows the multiplication with the unity imaginary. + I(bi) <+ flicker_noise(Snspec * noise_b * 2.0 * `PI * NQS_NOI / M, -2.0, "INDUCED BULK NOISE (NQS_NOI=1)"); +// GATE SHOT NOISE + I(gi) <+ white_noise (M * sig_shot, "GATE SHOT NOISE"); // GATE FLICKER NOISE - I(gi) <+ flicker_noise (sig_flicker_m, 1.0, "GATE FLICKER NOISE"); -`endif + I(gi) <+ flicker_noise (sig_flicker_m, 1.0, "GATE FLICKER NOISE"); +`endif `ifdef RF // THERMAL NOISE (INCLUDING SHORT CHANNEL EFFECTS, TH_NOI=1) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL - I(di,si) <+ white_noise (M * thermal * TH_NOI + M * Snspec * noise_ds1*NQS_NOI, "THERMAL NOISE IN CHANNEL (TH_NOI=1)"); +//PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL + I(di,si) <+ white_noise (M * thermal * TH_NOI + M * Snspec * noise_ds1*NQS_NOI, "THERMAL NOISE IN CHANNEL (TH_NOI=1)"); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FLICKER NOISE - I(di,si) <+ flicker_noise (flicker_m, AF, "FLICKER NOISE IN CHANNEL"); + I(di,si) <+ flicker_noise (flicker_m, AF, "FLICKER NOISE IN CHANNEL"); // NQS THERMAL NOISE (INCLUDING INDUCED GATE AND BULK NOISE, NQS_NOI=1) - I(noi) <+ V(noi); + I(noi) <+ V(noi); // NOTE: Auxiliary node for defining correlated noise sources. - I(noi) <+ white_noise(M * Snspec * NQS_NOI , "AUXILIARY NOISE SOURCE FOR CORRELATION, CORRELATED PART (NQS_NOI=1)"); + I(noi) <+ white_noise(M * Snspec * NQS_NOI , "AUXILIARY NOISE SOURCE FOR CORRELATION, CORRELATED PART (NQS_NOI=1)"); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PATCH CMI ERROR DUE TO THE FACT THAT IT CAN NOT RECOGNIZE PARALLEL NOISE SOURCES (12/11) -// I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); +// I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - I(di,si) <+ V(noi) * noise_ds2 * NQS_NOI ; // NOTE: Correlated part of thermal noise assigned to channel. - I(gi) <+ ddt(V(noi) * noise_g * NQS_NOI ); // NOTE: Correlated part of thermal noise assigned to gate. The derivate allows the multiplication with the unity imaginary. - I(bi) <+ flicker_noise(Snspec * noise_b * NQS_NOI * 2.0 * `PI / M, -2.0, "INDUCED BULK NOISE (NQS_NOI=1)"); + I(di,si) <+ V(noi) * noise_ds2 * NQS_NOI ; // NOTE: Correlated part of thermal noise assigned to channel. + I(gi) <+ ddt(V(noi) * noise_g * NQS_NOI ); // NOTE: Correlated part of thermal noise assigned to gate. The derivate allows the multiplication with the unity imaginary. + I(bi) <+ flicker_noise(Snspec * noise_b * NQS_NOI * 2.0 * `PI / M, -2.0, "INDUCED BULK NOISE (NQS_NOI=1)"); -// GATE SHOT NOISE - I(gi) <+ white_noise (M * sig_shot, "GATE SHOT NOISE"); +// GATE SHOT NOISE + I(gi) <+ white_noise (M * sig_shot, "GATE SHOT NOISE"); // GATE FLICKER NOISE - I(gi) <+ flicker_noise (sig_flicker_m, 1.0, "GATE FLICKER NOISE"); + I(gi) <+ flicker_noise (sig_flicker_m, 1.0, "GATE FLICKER NOISE"); -`endif -`ifdef NQS +`endif +`ifdef NQS // THERMAL NOISE (INCLUDING SHORT CHANNEL EFFECTS, TH_NOI=1) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL - I(di,si) <+ white_noise (M * thermal * TH_NOI + M * Snspec * noise_ds1*NQS_NOI, "THERMAL NOISE IN CHANNEL (TH_NOI=1)"); +//PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL + I(di,si) <+ white_noise (M * thermal * TH_NOI + M * Snspec * noise_ds1*NQS_NOI, "THERMAL NOISE IN CHANNEL (TH_NOI=1)"); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // FLICKER NOISE - I(di,si) <+ flicker_noise (flicker_m, AF, "FLICKER NOISE IN CHANNEL"); + I(di,si) <+ flicker_noise (flicker_m, AF, "FLICKER NOISE IN CHANNEL"); // NQS THERMAL NOISE (INCLUDING INDUCED GATE AND BULK NOISE, NQS_NOI=1) - I(noi) <+ V(noi); // NOTE: Auxiliary node for defining correlated noise sources. - I(noi) <+ white_noise(M * Snspec * NQS_NOI, "AUXILIARY NOISE SOURCE FOR CORRELATION, CORRELATED PART (NQS_NOI=1)"); + I(noi) <+ V(noi); // NOTE: Auxiliary node for defining correlated noise sources. + I(noi) <+ white_noise(M * Snspec * NQS_NOI, "AUXILIARY NOISE SOURCE FOR CORRELATION, CORRELATED PART (NQS_NOI=1)"); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PATCH CMI ERROR DUE TO THE FACT THAT IT CAN NOT RECOGNIZE PARALLEL NOISE SOURCES (12/11) -// I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); +// I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - I(di,si) <+ V(noi) * noise_ds2 * NQS_NOI; // NOTE: Correlated part of thermal noise assigned to channel. - I(gi) <+ ddt(V(noi) * noise_g * NQS_NOI); // NOTE: Correlated part of thermal noise assigned to gate. The derivate allows the multiplication with the unity imaginary. - I(bi) <+ flicker_noise(Snspec * noise_b * 2.0 * `PI * NQS_NOI / M, -2.0, "INDUCED BULK NOISE (NQS_NOI=1)"); -// GATE SHOT NOISE - I(gi) <+ white_noise (M * sig_shot, "GATE SHOT NOISE"); + I(di,si) <+ V(noi) * noise_ds2 * NQS_NOI; // NOTE: Correlated part of thermal noise assigned to channel. + I(gi) <+ ddt(V(noi) * noise_g * NQS_NOI); // NOTE: Correlated part of thermal noise assigned to gate. The derivate allows the multiplication with the unity imaginary. + I(bi) <+ flicker_noise(Snspec * noise_b * 2.0 * `PI * NQS_NOI / M, -2.0, "INDUCED BULK NOISE (NQS_NOI=1)"); +// GATE SHOT NOISE + I(gi) <+ white_noise (M * sig_shot, "GATE SHOT NOISE"); // GATE FLICKER NOISE - I(gi) <+ flicker_noise (sig_flicker_m, 1.0, "GATE FLICKER NOISE"); + I(gi) <+ flicker_noise (sig_flicker_m, 1.0, "GATE FLICKER NOISE"); `endif end diff --git a/code/ekv3_include/ekv3_oppoints.va b/code/ekv3_include/ekv3_oppoints.va index e0435d7..c91276c 100644 --- a/code/ekv3_include/ekv3_oppoints.va +++ b/code/ekv3_include/ekv3_oppoints.va @@ -35,7 +35,7 @@ IB = SIGN*M*( - IDBJ - ISBJ - IGB - IDB - IGIDL - IGISL ) ; ///////////Transconductances////////////// -tmp = (IDS+IDS_edge); +tmp = (IDS+IDS_edge); gmsi = abs(SIGN_M * d_gt_s_flag * ddx( tmp,V(`SEFF))); gmgi = abs(SIGN_M * d_gt_s_flag * ddx( tmp,V(`GEFF))); gmdi = abs(SIGN_M * d_gt_s_flag * ddx( tmp,V(`DEFF))); @@ -55,15 +55,15 @@ gmbt = gmbi + M * ( `abs_ddx(tmp,V(`BEFF)) ); `ifdef DC_S gmsex = gmst ; -gmgex = gmgt ; -gmdex = gmdt ; +gmgex = gmgt ; +gmdex = gmdt ; gmbex = gmbt ; `else gmsex = gmst / (1.0 + (gmdt*rd_wt/M) + (gmst*rs_wt/M)); -gmgex = gmgt / (1.0 + (gmdt*rd_wt/M) + (gmst*rs_wt/M)); -gmdex = gmdt / (1.0 + (gmdt*rd_wt/M) + (gmst*rs_wt/M)); -gmbex = gmbt / (1.0 + (gmdt*rd_wt/M) + (gmst*rs_wt/M)); -`endif +gmgex = gmgt / (1.0 + (gmdt*rd_wt/M) + (gmst*rs_wt/M)); +gmdex = gmdt / (1.0 + (gmdt*rd_wt/M) + (gmst*rs_wt/M)); +gmbex = gmbt / (1.0 + (gmdt*rd_wt/M) + (gmst*rs_wt/M)); +`endif ///////////slope factor calculation//////// @@ -79,21 +79,21 @@ Cgsi = M *( abs(ddx(tmp,V(`SEFF))) ); Cgdi = M *( abs(ddx(tmp,V(`DEFF))) ); Cgbi = M *( abs(ddx(tmp,V(`BEFF))) ); -tmp = QS + QS_edge; +tmp = QS + QS_edge; Csgi = M *( abs(ddx(tmp,V(`GEFF))) ); Cssi = M *( abs(ddx(tmp,V(`SEFF))) ); Csdi = M *( abs(ddx(tmp,V(`DEFF))) ); Csbi = M *( abs(ddx(tmp,V(`BEFF))) ); -tmp = QD + QD_edge; +tmp = QD + QD_edge; Cdgi = M *( abs(ddx(tmp,V(`GEFF))) ); Cdsi = M *( abs(ddx(tmp,V(`SEFF))) ); Cddi = M *( abs(ddx(tmp,V(`DEFF))) ); Cdbi = M *( abs(ddx(tmp,V(`BEFF))) ); -tmp = QB + QB_edge; +tmp = QB + QB_edge; Cbgi = M *( abs(ddx(tmp,V(`GEFF))) ); Cbsi = M *( abs(ddx(tmp,V(`SEFF))) ); @@ -122,7 +122,7 @@ GmgUtId = UT * abs(gmgex / ID); GmsUtId = UT * abs(gmsex / ID); GmbUtId = UT * abs(gmbex / ID); GmdUtId = UT * abs(gmdex / ID); -GmId =abs( gmgex / ID ); +GmId =abs( gmgex / ID ); end else begin GmgUtId = 0.0; @@ -140,11 +140,11 @@ end //siId = sqrt(tmp + tmp2); //siVg = (GmId == 0.0 )? -// 0.0: -// siId/GmId; +// 0.0: +// siId/GmId; SID_flicker = flicker/M; -SID_thermal = thermal*M; +SID_thermal = thermal*M; @@ -161,13 +161,13 @@ SVG_thermal = (gmgex != 0)? SID_thermal / (gmgex*gmgex) : 0; tmp = i0 /( nq * UT * COX ); tau0 = pow(Leff - deltal,2.0) / (tmp); -tmp = xf + xrp; -tmp1 = xf * xrp; -tmp3 = tmp * tmp * tmp; +tmp = xf + xrp; +tmp1 = xf * xrp; +tmp3 = tmp * tmp * tmp; tau = tau0 *( 4.0/15.0 ) * (xf2 + 3.0*tmp1 +xrp2) / tmp3; - + diff --git a/code/ekv3_include/ekv3_overlap.va b/code/ekv3_include/ekv3_overlap.va index 4709be7..4e09bba 100644 --- a/code/ekv3_include/ekv3_overlap.va +++ b/code/ekv3_include/ekv3_overlap.va @@ -1,166 +1,166 @@ -// ANALYTICAL CALCULATION OF THE BIAS-DEPENDENT OVERLAP CAPACITANCES FORMED BETWEEN GATE AND SOURCE, ON THE ONE SIDE, AND GATE AND DRAIN, ON THE OTHER. +// ANALYTICAL CALCULATION OF THE BIAS-DEPENDENT OVERLAP CAPACITANCES FORMED BETWEEN GATE AND SOURCE, ON THE ONE SIDE, AND GATE AND DRAIN, ON THE OTHER. // THE CHARGE CALCULATION IS BASED ON THE FORMULATION OF THE CHARGE CALCULATION OF THE INTRINSIC DEVICE, FOCUSSING ONLY ON TWO NODES (GATE AND BULK), WHERE BULK HERE IS SOURCE OR DRAIN AND WHERE THE DOPING IS OF THE DIFFERENT TYPE. begin : OVERLAP_CAPACITANCES_CHARGES -// CALCULATION OF NORMALIZED BIAS-DEPENDENT OVERLAP CHARGES +// CALCULATION OF NORMALIZED BIAS-DEPENDENT OVERLAP CHARGES // SOURCE SIDE - if (TG < 0) // NOTE: Doping type of GATE opposite to the one of the bulk. - begin - vgsov_p = vg - VOV * vs - vfb_ov; // NOTE: Default value of VOV is 1 - if (vgsov_p > 0.0) - begin - gamma_dep_sov = gamma_g_ov; - gamma_acc_sov = gamma_ov; - v0_sov = vgsov_p; - end - else - begin - gamma_dep_sov = gamma_ov; - gamma_acc_sov = gamma_g_ov; - v0_sov = - vgsov_p; - end - a0_sov = 1.0 + gamma_acc_sov * `ONESQRT2; - a1_sov = gamma_dep_sov / gamma_acc_sov; - a2_sov = a0_sov / (a0_sov + a1_sov); - a3_sov = 1.0 + gamma_dep_sov * `ONESQRT2 + a1_sov; - v1_sov = v0_sov * 0.5 - 3.0 * a2_sov * a3_sov; - dpsi_sov0 = v1_sov + sqrt(v1_sov * v1_sov + 6.0 * a2_sov * v0_sov); - gamma_dep2_sov = gamma_dep_sov * (0.5 + 3.0 / (3.0 * `SQRT2 * gamma_acc_sov + v0_sov - dpsi_sov0)); - a4_sov = 1.0 - exp(-dpsi_sov0); - v2_sov = v0_sov - a4_sov; - tmp = v2_sov / (gamma_dep2_sov + sqrt(gamma_dep2_sov * gamma_dep2_sov + v2_sov)); - dpsi_sov = tmp * tmp + a4_sov; - v2b_sov = v0_sov - dpsi_sov; - v3_sov = v2b_sov * 0.5; - tmp = v3_sov + 3.0 * a0_sov; - if (vgsov_p > 0.0) - dpsiox_sov = v3_sov - 3.0 * a0_sov + sqrt(tmp * tmp - 6.0 * v2b_sov); - else - dpsiox_sov = - (v3_sov - 3.0 * a0_sov + sqrt(tmp * tmp - 6.0 * v2b_sov)); - end - else // NOTE: Doping type of GATE the same with the one of the bulk. - begin - vgsov_p = vg - VOV * vs - vfb_ov; // NOTE: Default value of VOV is 1 - if (vgsov_p > 0.0) - begin - gamma_acc_sov = gamma_ov; - v0_sov = vgsov_p; - a0_sov = 1.0 + gamma_acc_sov * `ONESQRT2; - v1_sov = v0_sov * 0.5 - 3.0 * a0_sov * a0_sov; - dpsi_sov0 = v1_sov + sqrt(v1_sov * v1_sov); - dpsi_sov = 1.0 - exp(-dpsi_sov0); - v2b_sov = v0_sov - dpsi_sov; - v3_sov = v2b_sov * 0.5; - tmp = v3_sov + 3.0 * a0_sov; - dpsiox_sov = v3_sov - 3.0 * a0_sov + sqrt(tmp * tmp - 6.0 * v2b_sov); - end - else - begin - gamma_dep_sov = gamma_ov; - v0_sov = - vgsov_p; - a3_sov = 1.0 + gamma_dep_sov * `ONESQRT2; - v1_sov = v0_sov * 0.5 - 3.0 * a3_sov; - dpsi_sov0 = v1_sov + sqrt(v1_sov * v1_sov + 6.0 * v0_sov); - gamma_dep2_sov = gamma_dep_sov * 0.5; - a4_sov = 1.0 - exp(-dpsi_sov0); - v2_sov = v0_sov - a4_sov; - tmp = v2_sov / (gamma_dep2_sov + sqrt(gamma_dep2_sov * gamma_dep2_sov + v2_sov)); - dpsi_sov = tmp * tmp + a4_sov; - v2b_sov = v0_sov - dpsi_sov; - dpsiox_sov = - v2b_sov; - end - end + if (TG < 0) // NOTE: Doping type of GATE opposite to the one of the bulk. + begin + vgsov_p = vg - VOV * vs - vfb_ov; // NOTE: Default value of VOV is 1 + if (vgsov_p > 0.0) + begin + gamma_dep_sov = gamma_g_ov; + gamma_acc_sov = gamma_ov; + v0_sov = vgsov_p; + end + else + begin + gamma_dep_sov = gamma_ov; + gamma_acc_sov = gamma_g_ov; + v0_sov = - vgsov_p; + end + a0_sov = 1.0 + gamma_acc_sov * `ONESQRT2; + a1_sov = gamma_dep_sov / gamma_acc_sov; + a2_sov = a0_sov / (a0_sov + a1_sov); + a3_sov = 1.0 + gamma_dep_sov * `ONESQRT2 + a1_sov; + v1_sov = v0_sov * 0.5 - 3.0 * a2_sov * a3_sov; + dpsi_sov0 = v1_sov + sqrt(v1_sov * v1_sov + 6.0 * a2_sov * v0_sov); + gamma_dep2_sov = gamma_dep_sov * (0.5 + 3.0 / (3.0 * `SQRT2 * gamma_acc_sov + v0_sov - dpsi_sov0)); + a4_sov = 1.0 - exp(-dpsi_sov0); + v2_sov = v0_sov - a4_sov; + tmp = v2_sov / (gamma_dep2_sov + sqrt(gamma_dep2_sov * gamma_dep2_sov + v2_sov)); + dpsi_sov = tmp * tmp + a4_sov; + v2b_sov = v0_sov - dpsi_sov; + v3_sov = v2b_sov * 0.5; + tmp = v3_sov + 3.0 * a0_sov; + if (vgsov_p > 0.0) + dpsiox_sov = v3_sov - 3.0 * a0_sov + sqrt(tmp * tmp - 6.0 * v2b_sov); + else + dpsiox_sov = - (v3_sov - 3.0 * a0_sov + sqrt(tmp * tmp - 6.0 * v2b_sov)); + end + else // NOTE: Doping type of GATE the same with the one of the bulk. + begin + vgsov_p = vg - VOV * vs - vfb_ov; // NOTE: Default value of VOV is 1 + if (vgsov_p > 0.0) + begin + gamma_acc_sov = gamma_ov; + v0_sov = vgsov_p; + a0_sov = 1.0 + gamma_acc_sov * `ONESQRT2; + v1_sov = v0_sov * 0.5 - 3.0 * a0_sov * a0_sov; + dpsi_sov0 = v1_sov + sqrt(v1_sov * v1_sov); + dpsi_sov = 1.0 - exp(-dpsi_sov0); + v2b_sov = v0_sov - dpsi_sov; + v3_sov = v2b_sov * 0.5; + tmp = v3_sov + 3.0 * a0_sov; + dpsiox_sov = v3_sov - 3.0 * a0_sov + sqrt(tmp * tmp - 6.0 * v2b_sov); + end + else + begin + gamma_dep_sov = gamma_ov; + v0_sov = - vgsov_p; + a3_sov = 1.0 + gamma_dep_sov * `ONESQRT2; + v1_sov = v0_sov * 0.5 - 3.0 * a3_sov; + dpsi_sov0 = v1_sov + sqrt(v1_sov * v1_sov + 6.0 * v0_sov); + gamma_dep2_sov = gamma_dep_sov * 0.5; + a4_sov = 1.0 - exp(-dpsi_sov0); + v2_sov = v0_sov - a4_sov; + tmp = v2_sov / (gamma_dep2_sov + sqrt(gamma_dep2_sov * gamma_dep2_sov + v2_sov)); + dpsi_sov = tmp * tmp + a4_sov; + v2b_sov = v0_sov - dpsi_sov; + dpsiox_sov = - v2b_sov; + end + end // DRAIN SIDE - if (TG < 0) - begin - vgdov_p = vg - VOV * vd - vfb_ov; // NOTE: Default value of VOV is 1 - if (vgdov_p > 0.0) - begin - gamma_dep_dov = gamma_g_ov; - gamma_acc_dov = gamma_ov; - v0_dov = vgdov_p; - end - else - begin - gamma_dep_dov = gamma_ov; - gamma_acc_dov = gamma_g_ov; - v0_dov = - vgdov_p; - end - a0_dov = 1.0 + gamma_acc_dov * `ONESQRT2; - a1_dov = gamma_dep_dov / gamma_acc_dov; - a2_dov = a0_dov / (a0_dov + a1_dov); - a3_dov = 1.0 + gamma_dep_dov * `ONESQRT2 + a1_dov; - v1_dov = v0_dov * 0.5 - 3.0 * a2_dov * a3_dov; - dpsi_dov0 = v1_dov + sqrt(v1_dov * v1_dov + 6.0 * a2_dov * v0_dov); - gamma_dep2_dov = gamma_dep_dov * (0.5 + 3.0 / (3.0 * `SQRT2 * gamma_acc_dov + v0_dov - dpsi_dov0)); - a4_dov = 1.0 - exp(-dpsi_dov0); - v2_dov = v0_dov - a4_dov; - tmp = v2_dov / (gamma_dep2_dov + sqrt(gamma_dep2_dov * gamma_dep2_dov + v2_dov)); - dpsi_dov = tmp * tmp + a4_dov; - v2b_dov = v0_dov - dpsi_dov; - v3_dov = v2b_dov * 0.5; - tmp = v3_dov + 3.0 * a0_dov; - if (vgdov_p > 0.0) - dpsiox_dov = v3_dov - 3.0 * a0_dov + sqrt(tmp * tmp - 6.0 * v2b_dov); - else - dpsiox_dov = - (v3_dov - 3.0 * a0_dov + sqrt(tmp * tmp - 6.0 * v2b_dov)); - end - else - begin - vgdov_p = vg - VOV * vd - vfb_ov; // NOTE: Default value of VOV is 1 - if (vgdov_p > 0.0) - begin - gamma_acc_dov = gamma_ov; - v0_dov = vgdov_p; - a0_dov = 1.0 + gamma_acc_dov * `ONESQRT2; - v1_dov = v0_dov * 0.5 - 3.0 * a0_dov * a0_dov; - dpsi_dov0 = v1_dov + sqrt(v1_dov * v1_dov); - dpsi_dov = 1.0 - exp(-dpsi_dov0); - v2b_dov = v0_dov - dpsi_dov; - v3_dov = v2b_dov * 0.5; - tmp = v3_dov + 3.0 * a0_dov; - dpsiox_dov = v3_dov - 3.0 * a0_dov + sqrt(tmp * tmp - 6.0 * v2b_dov); - end - else - begin - gamma_dep_dov = gamma_ov; - v0_dov = - vgdov_p; - a3_dov = 1.0 + gamma_dep_dov * `ONESQRT2; - v1_dov = v0_dov * 0.5 - 3.0 * a3_dov; - dpsi_dov0 = v1_dov + sqrt(v1_dov * v1_dov + 6.0 * v0_dov); - gamma_dep2_dov = gamma_dep_dov * 0.5; - a4_dov = 1.0 - exp(-dpsi_dov0); - v2_dov = v0_dov - a4_dov; - tmp = v2_dov / (gamma_dep2_dov + sqrt(gamma_dep2_dov * gamma_dep2_dov + v2_dov)); - dpsi_dov = tmp * tmp + a4_dov; - v2b_dov = v0_dov - dpsi_dov; - dpsiox_dov = - v2b_dov; - end - end + if (TG < 0) + begin + vgdov_p = vg - VOV * vd - vfb_ov; // NOTE: Default value of VOV is 1 + if (vgdov_p > 0.0) + begin + gamma_dep_dov = gamma_g_ov; + gamma_acc_dov = gamma_ov; + v0_dov = vgdov_p; + end + else + begin + gamma_dep_dov = gamma_ov; + gamma_acc_dov = gamma_g_ov; + v0_dov = - vgdov_p; + end + a0_dov = 1.0 + gamma_acc_dov * `ONESQRT2; + a1_dov = gamma_dep_dov / gamma_acc_dov; + a2_dov = a0_dov / (a0_dov + a1_dov); + a3_dov = 1.0 + gamma_dep_dov * `ONESQRT2 + a1_dov; + v1_dov = v0_dov * 0.5 - 3.0 * a2_dov * a3_dov; + dpsi_dov0 = v1_dov + sqrt(v1_dov * v1_dov + 6.0 * a2_dov * v0_dov); + gamma_dep2_dov = gamma_dep_dov * (0.5 + 3.0 / (3.0 * `SQRT2 * gamma_acc_dov + v0_dov - dpsi_dov0)); + a4_dov = 1.0 - exp(-dpsi_dov0); + v2_dov = v0_dov - a4_dov; + tmp = v2_dov / (gamma_dep2_dov + sqrt(gamma_dep2_dov * gamma_dep2_dov + v2_dov)); + dpsi_dov = tmp * tmp + a4_dov; + v2b_dov = v0_dov - dpsi_dov; + v3_dov = v2b_dov * 0.5; + tmp = v3_dov + 3.0 * a0_dov; + if (vgdov_p > 0.0) + dpsiox_dov = v3_dov - 3.0 * a0_dov + sqrt(tmp * tmp - 6.0 * v2b_dov); + else + dpsiox_dov = - (v3_dov - 3.0 * a0_dov + sqrt(tmp * tmp - 6.0 * v2b_dov)); + end + else + begin + vgdov_p = vg - VOV * vd - vfb_ov; // NOTE: Default value of VOV is 1 + if (vgdov_p > 0.0) + begin + gamma_acc_dov = gamma_ov; + v0_dov = vgdov_p; + a0_dov = 1.0 + gamma_acc_dov * `ONESQRT2; + v1_dov = v0_dov * 0.5 - 3.0 * a0_dov * a0_dov; + dpsi_dov0 = v1_dov + sqrt(v1_dov * v1_dov); + dpsi_dov = 1.0 - exp(-dpsi_dov0); + v2b_dov = v0_dov - dpsi_dov; + v3_dov = v2b_dov * 0.5; + tmp = v3_dov + 3.0 * a0_dov; + dpsiox_dov = v3_dov - 3.0 * a0_dov + sqrt(tmp * tmp - 6.0 * v2b_dov); + end + else + begin + gamma_dep_dov = gamma_ov; + v0_dov = - vgdov_p; + a3_dov = 1.0 + gamma_dep_dov * `ONESQRT2; + v1_dov = v0_dov * 0.5 - 3.0 * a3_dov; + dpsi_dov0 = v1_dov + sqrt(v1_dov * v1_dov + 6.0 * v0_dov); + gamma_dep2_dov = gamma_dep_dov * 0.5; + a4_dov = 1.0 - exp(-dpsi_dov0); + v2_dov = v0_dov - a4_dov; + tmp = v2_dov / (gamma_dep2_dov + sqrt(gamma_dep2_dov * gamma_dep2_dov + v2_dov)); + dpsi_dov = tmp * tmp + a4_dov; + v2b_dov = v0_dov - dpsi_dov; + dpsiox_dov = - v2b_dov; + end + end // DENORMALIZATION OF BIAS-DEPENDENT OVERLAP CHARGES - QSOV = - Q0OV * dpsiox_sov; - QDOV = - Q0OV * dpsiox_dov; -end + QSOV = - Q0OV * dpsiox_sov; + QDOV = - Q0OV * dpsiox_dov; +end // ASSIGNMENT OF DYNAMIC BEHAVIOUR VIA THE BIAS-DEPENDENT OVERLAP CHARGES `ifdef DC_S - I(d ,g ) <+ SIGN_M * (d_gt_s * ddt(QDOV) + s_gt_d * ddt(QSOV)); - I(s ,g ) <+ SIGN_M * (d_gt_s * ddt(QSOV) + s_gt_d * ddt(QDOV)); + I(d ,g ) <+ SIGN_M * (d_gt_s * ddt(QDOV) + s_gt_d * ddt(QSOV)); + I(s ,g ) <+ SIGN_M * (d_gt_s * ddt(QSOV) + s_gt_d * ddt(QDOV)); `endif `ifdef DC - I(di,g ) <+ SIGN_M * (d_gt_s * ddt(QDOV) + s_gt_d * ddt(QSOV)); - I(si,g ) <+ SIGN_M * (d_gt_s * ddt(QSOV) + s_gt_d * ddt(QDOV)); + I(di,g ) <+ SIGN_M * (d_gt_s * ddt(QDOV) + s_gt_d * ddt(QSOV)); + I(si,g ) <+ SIGN_M * (d_gt_s * ddt(QSOV) + s_gt_d * ddt(QDOV)); `endif `ifdef RF_S - I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QDOV) + s_gt_d * ddt(QSOV)); - I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QSOV) + s_gt_d * ddt(QDOV)); + I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QDOV) + s_gt_d * ddt(QSOV)); + I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QSOV) + s_gt_d * ddt(QDOV)); `endif `ifdef RF - I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QDOV) + s_gt_d * ddt(QSOV)); - I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QSOV) + s_gt_d * ddt(QDOV)); + I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QDOV) + s_gt_d * ddt(QSOV)); + I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QSOV) + s_gt_d * ddt(QDOV)); `endif -`ifdef NQS - I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QDOV) + s_gt_d * ddt(QSOV)); - I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QSOV) + s_gt_d * ddt(QDOV)); +`ifdef NQS + I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QDOV) + s_gt_d * ddt(QSOV)); + I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QSOV) + s_gt_d * ddt(QDOV)); `endif diff --git a/code/ekv3_include/ekv3_parameters.va b/code/ekv3_include/ekv3_parameters.va index 1694a63..06f1f66 100644 --- a/code/ekv3_include/ekv3_parameters.va +++ b/code/ekv3_include/ekv3_parameters.va @@ -2,54 +2,54 @@ // INSTANCE PARAMETERS // ///////////////////////// -//parameter real L = 10.0E-06 from [1.0E-9:inf) `ATTR(type="instance" info="GATE'S LENGTH"); -//parameter real W = 10.0E-06 from [1.0E-9:inf) `ATTR(type="instance" info="GATE'S WIDTH"); -//parameter integer NF = 1 from [1:inf) `ATTR(type="instance" info="NUMBER OF FINGERS"); -//parameter real M = 1 from [1:inf) `ATTR(type="instance" info="NUMBER OF DEVICES IN PARALLEL"); -//parameter real AD = 0.0 from [0.0:inf) `ATTR(type="instance" info="DRAIN'S AREA"); -//parameter real AS = 0.0 from [0.0:inf) `ATTR(type="instance" info="SOURCE'S AREA"); -//parameter real PD = 0.0 from [0.0:inf) `ATTR(type="instance" info="DRAIN'S PERIMETER"); -//parameter real PS = 0.0 from [0.0:inf) `ATTR(type="instance" info="SOURCE'S PERIMETER"); -//parameter real SA = 0.0 from [0.0:inf) `ATTR(type="instance" info="STI PARAMETER; DISTANCE FROM STI (SIDE A)"); -//parameter real SB = 0.0 from [0.0:inf) `ATTR(type="instance" info="STI PARAMETER; DISTANCE FROM STI (SIDE B)"); -//parameter real SD = 0.0 from [0.0:inf) `ATTR(type="instance" info="STI PARAMETER; DISTANCE BETWEEN GATES"); - - - -(* type="instance" *) parameter real L = 10.0E-06 from [1.0E-9:inf) ; -(* type="instance" *) parameter real W = 10.0E-06 from [1.0E-9:inf) ; -(* type="instance" *) parameter integer NF = 1 from [1:inf) ; -(* type="instance" *) parameter real M = 1 from [1:inf) ; -(* type="instance" *) parameter real AD = 0.0 from [0.0:inf) ; -(* type="instance" *) parameter real AS = 0.0 from [0.0:inf) ; -(* type="instance" *) parameter real PD = 0.0 from [0.0:inf) ; -(* type="instance" *) parameter real PS = 0.0 from [0.0:inf) ; - -(* type="instance" *) parameter real SA = 0.0 from [0.0:inf) ; -(* type="instance" *) parameter real SB = 0.0 from [0.0:inf) ; -(* type="instance" *) parameter real SD = 0.0 from [0.0:inf) ; +//parameter real L = 10.0E-06 from [1.0E-9:inf) `ATTR(type="instance" info="GATE'S LENGTH"); +//parameter real W = 10.0E-06 from [1.0E-9:inf) `ATTR(type="instance" info="GATE'S WIDTH"); +//parameter integer NF = 1 from [1:inf) `ATTR(type="instance" info="NUMBER OF FINGERS"); +//parameter real M = 1 from [1:inf) `ATTR(type="instance" info="NUMBER OF DEVICES IN PARALLEL"); +//parameter real AD = 0.0 from [0.0:inf) `ATTR(type="instance" info="DRAIN'S AREA"); +//parameter real AS = 0.0 from [0.0:inf) `ATTR(type="instance" info="SOURCE'S AREA"); +//parameter real PD = 0.0 from [0.0:inf) `ATTR(type="instance" info="DRAIN'S PERIMETER"); +//parameter real PS = 0.0 from [0.0:inf) `ATTR(type="instance" info="SOURCE'S PERIMETER"); +//parameter real SA = 0.0 from [0.0:inf) `ATTR(type="instance" info="STI PARAMETER; DISTANCE FROM STI (SIDE A)"); +//parameter real SB = 0.0 from [0.0:inf) `ATTR(type="instance" info="STI PARAMETER; DISTANCE FROM STI (SIDE B)"); +//parameter real SD = 0.0 from [0.0:inf) `ATTR(type="instance" info="STI PARAMETER; DISTANCE BETWEEN GATES"); + + + +(* type="instance" *) parameter real L = 10.0E-06 from [1.0E-9:inf) ; +(* type="instance" *) parameter real W = 10.0E-06 from [1.0E-9:inf) ; +(* type="instance" *) parameter integer NF = 1 from [1:inf) ; +(* type="instance" *) parameter real M = 1 from [1:inf) ; +(* type="instance" *) parameter real AD = 0.0 from [0.0:inf) ; +(* type="instance" *) parameter real AS = 0.0 from [0.0:inf) ; +(* type="instance" *) parameter real PD = 0.0 from [0.0:inf) ; +(* type="instance" *) parameter real PS = 0.0 from [0.0:inf) ; + +(* type="instance" *) parameter real SA = 0.0 from [0.0:inf) ; +(* type="instance" *) parameter real SB = 0.0 from [0.0:inf) ; +(* type="instance" *) parameter real SD = 0.0 from [0.0:inf) ; //////////////////////////////// // FLAGS AND SETUP PARAMETERS // //////////////////////////////// -parameter real SIGN = 1 from [-1:1] `ATTR(info="SIGN = 1 FOR NMOS; SIGN = -1 FOR PMOS"); -parameter real TG = -1 from [-1:1] `ATTR(info="TYPE OF GATE: -1 ENHANCEMENT TYPE; 1 DEPLETION TYPE"); -parameter real TNOM = 27.0 from [-273.15:inf) `ATTR(info="NOMINAL TEMPERATURE FOR MODEL PARAMETERS"); -parameter real SCALE = 1.0 from (0.0:inf) `ATTR(info="SCALING SIZE FACTOR"); -parameter real XL = 0.0 from (-inf:inf) `ATTR(info="OPTICAL OFFSET FOR CHANNEL LENGTH"); -parameter real XW = 0.0 from (-inf:inf) `ATTR(info="OPTICAL OFFSET FOR CHANNEL WIDTH"); -parameter real NQS_NOI = 1.0 from [0:1] `ATTR(info="FLAG TURNING ON NQS THERMAL NOISE MODEL. (NOT BOTH NQS_NOI AND TH_NOI SHOULD BE SET TO 1)."); -parameter real TH_NOI = 0.0 from [0:1] `ATTR(info="FLAG TURNING ON SHORT CHANNEL EFFECTS THERMAL NOISE MODEL. (NOT BOTH NQS_NOI AND TH_NOI SHOULD BE SET TO 1)."); -parameter real INFO_LEVEL = 0.0 from [0:inf) `ATTR(info="FLAG FOR INFORMATION PRINTOUT. CURRENTLY ONLY VALUE OF 1 IS SUPPORTED."); -parameter real QOFF = 0.0 from [0:1] `ATTR(info="FLAG FOR TURNING OFF THE DYNAMIC BEHAVIOUR OF THE MODEL (FOR DEBUGGING PURPOSES)"); +parameter real SIGN = 1 from [-1:1] `ATTR(info="SIGN = 1 FOR NMOS; SIGN = -1 FOR PMOS"); +parameter real TG = -1 from [-1:1] `ATTR(info="TYPE OF GATE: -1 ENHANCEMENT TYPE; 1 DEPLETION TYPE"); +parameter real TNOM = 27.0 from [-273.15:inf) `ATTR(info="NOMINAL TEMPERATURE FOR MODEL PARAMETERS"); +parameter real SCALE = 1.0 from (0.0:inf) `ATTR(info="SCALING SIZE FACTOR"); +parameter real XL = 0.0 from (-inf:inf) `ATTR(info="OPTICAL OFFSET FOR CHANNEL LENGTH"); +parameter real XW = 0.0 from (-inf:inf) `ATTR(info="OPTICAL OFFSET FOR CHANNEL WIDTH"); +parameter real NQS_NOI = 1.0 from [0:1] `ATTR(info="FLAG TURNING ON NQS THERMAL NOISE MODEL. (NOT BOTH NQS_NOI AND TH_NOI SHOULD BE SET TO 1)."); +parameter real TH_NOI = 0.0 from [0:1] `ATTR(info="FLAG TURNING ON SHORT CHANNEL EFFECTS THERMAL NOISE MODEL. (NOT BOTH NQS_NOI AND TH_NOI SHOULD BE SET TO 1)."); +parameter real INFO_LEVEL = 0.0 from [0:inf) `ATTR(info="FLAG FOR INFORMATION PRINTOUT. CURRENTLY ONLY VALUE OF 1 IS SUPPORTED."); +parameter real QOFF = 0.0 from [0:1] `ATTR(info="FLAG FOR TURNING OFF THE DYNAMIC BEHAVIOUR OF THE MODEL (FOR DEBUGGING PURPOSES)"); // MATCHING -parameter real AVTO = 0.0 from (-inf:inf) `ATTR(info="MATCHING PARAMETER FOR THRESHOLD VOLTAGE (VTO)"); -parameter real AGAMMA = 0.0 from (-inf:inf) `ATTR(info="MATCHING PARAMETER FOR BODY FACTOR (GAMMA)"); -parameter real AKP = 0.0 from (-inf:inf) `ATTR(info="MATCHING PARAMETER FOR MOBILITY (KP)"); +parameter real AVTO = 0.0 from (-inf:inf) `ATTR(info="MATCHING PARAMETER FOR THRESHOLD VOLTAGE (VTO)"); +parameter real AGAMMA = 0.0 from (-inf:inf) `ATTR(info="MATCHING PARAMETER FOR BODY FACTOR (GAMMA)"); +parameter real AKP = 0.0 from (-inf:inf) `ATTR(info="MATCHING PARAMETER FOR MOBILITY (KP)"); ////////////////////// // MODEL PARAMETERS // @@ -57,198 +57,198 @@ parameter real AKP = 0.0 from (-inf:inf) `ATTR(info="MATCHING PARAMETER FOR // OXIDE, SUBSTRATE AND GATE DOPING RELATED PARAMETERS (7(8)) -parameter real COX = 0.012 from (0.0:inf) `ATTR(info="OXIDE CAPACITANCE PER UNIT AREA"); -parameter real XJ = 20.0E-09 from (0.0:inf) `ATTR(info="DEPTH OF JUNCTION (SOURCE AND DRAIN)"); -parameter real VTO = 0.3 from (-inf:inf) `ATTR(info="THRESHOLD VOLTAGE"); -parameter real PHIF = 0.45 from [0.0:inf) `ATTR(info="FERMI BULK POTENTIAL"); -parameter real GAMMA = 0.3 from (0.0:inf) `ATTR(info="BODY EFFECT COEFFECIENT"); -parameter real GAMMAG = 4.1 from (0.0:inf) `ATTR(info="GATE DOPING COEFFICIENT FOR POLYSILICON DEPLETION EFFECT"); -parameter real N0 = 1.0 from [0.0:inf) `ATTR(info="WEAK INVERSION FINE TUNING PARAMETER"); -parameter real VBI = 0.0 from [0.0:inf) `ATTR(info="BUILT-IN VOLTAGE DROP-OFF. IF LEFT TO DEFAULT ZERO VALUE, IT IS SET TO THE NOMINAL VALUE OF 3UT HIGHER THAN PHI."); +parameter real COX = 0.012 from (0.0:inf) `ATTR(info="OXIDE CAPACITANCE PER UNIT AREA"); +parameter real XJ = 20.0E-09 from (0.0:inf) `ATTR(info="DEPTH OF JUNCTION (SOURCE AND DRAIN)"); +parameter real VTO = 0.3 from (-inf:inf) `ATTR(info="THRESHOLD VOLTAGE"); +parameter real PHIF = 0.45 from [0.0:inf) `ATTR(info="FERMI BULK POTENTIAL"); +parameter real GAMMA = 0.3 from (0.0:inf) `ATTR(info="BODY EFFECT COEFFECIENT"); +parameter real GAMMAG = 4.1 from (0.0:inf) `ATTR(info="GATE DOPING COEFFICIENT FOR POLYSILICON DEPLETION EFFECT"); +parameter real N0 = 1.0 from [0.0:inf) `ATTR(info="WEAK INVERSION FINE TUNING PARAMETER"); +parameter real VBI = 0.0 from [0.0:inf) `ATTR(info="BUILT-IN VOLTAGE DROP-OFF. IF LEFT TO DEFAULT ZERO VALUE, IT IS SET TO THE NOMINAL VALUE OF 3UT HIGHER THAN PHI."); -// QUANTUM EFFECTS (3) +// QUANTUM EFFECTS (3) -parameter real AQMA = 0.5 from [0.0:inf) `ATTR(info="QUANTUM MECHANICAL EFFECT ACCUMULATION REGION COEFFICIENT"); -parameter real AQMI = 0.4 from [0.0:inf) `ATTR(info="QUANTUM MECHANICAL EFFECT INVERSION REGION COEFFICIENT"); -parameter real ETAQM = 0.75 from [0.0:inf) `ATTR(info="QUANTUM MECHANICAL EFFECT ACCUMULATION ETA PARAMETER"); +parameter real AQMA = 0.5 from [0.0:inf) `ATTR(info="QUANTUM MECHANICAL EFFECT ACCUMULATION REGION COEFFICIENT"); +parameter real AQMI = 0.4 from [0.0:inf) `ATTR(info="QUANTUM MECHANICAL EFFECT INVERSION REGION COEFFICIENT"); +parameter real ETAQM = 0.75 from [0.0:inf) `ATTR(info="QUANTUM MECHANICAL EFFECT ACCUMULATION ETA PARAMETER"); // VERTICAL FIELD MOBILITY EFFECTS PARAMETERS (4) -parameter real KP = 500.0E-06 from [0.0:inf) `ATTR(info="MOBILITY (MULTIPLIED BY COX) PARAMETER"); -parameter real E0 = 1.0E+10 from (0.0:inf) `ATTR(info="FIRST ORDER PARAMETER FOR MOBILITY REDUCTION DUE TO VERTICAL FIELD EFFECT"); -parameter real E1 = 3.1E+08 from (0.0:inf) `ATTR(info="SECOND ORDER PARAMETER FOR MOBILITY REDUCTION DUE TO VERTICAL FIELD EFFECT"); -parameter real ETA = 0.5 from [0.0:inf) `ATTR(info="INVERSION CHARGE COEFFICIENT FOR VERTICAL FIELD CALCULATION"); +parameter real KP = 500.0E-06 from [0.0:inf) `ATTR(info="MOBILITY (MULTIPLIED BY COX) PARAMETER"); +parameter real E0 = 1.0E+10 from (0.0:inf) `ATTR(info="FIRST ORDER PARAMETER FOR MOBILITY REDUCTION DUE TO VERTICAL FIELD EFFECT"); +parameter real E1 = 3.1E+08 from (0.0:inf) `ATTR(info="SECOND ORDER PARAMETER FOR MOBILITY REDUCTION DUE TO VERTICAL FIELD EFFECT"); +parameter real ETA = 0.5 from [0.0:inf) `ATTR(info="INVERSION CHARGE COEFFICIENT FOR VERTICAL FIELD CALCULATION"); -// COULOMB SCATTERING (2) +// COULOMB SCATTERING (2) + +parameter real THC = 0.0 from [0.0:inf) `ATTR(info="COULOMB SCATTERING PARAMETER"); +parameter real ZC = 1.0E-6 from [0.0:inf) `ATTR(info="COULOMB SCATTERING INVERSION CHARGE COEFFICIENT"); -parameter real THC = 0.0 from [0.0:inf) `ATTR(info="COULOMB SCATTERING PARAMETER"); -parameter real ZC = 1.0E-6 from [0.0:inf) `ATTR(info="COULOMB SCATTERING INVERSION CHARGE COEFFICIENT"); - // MOBILITY RELATED GEOMETRICAL PARAMETERS (7) -parameter real LA = 1.0 from [0.0:inf) `ATTR(info="CRITICAL LENGTH A OF MOBILITY LENGTH SCALING"); -parameter real LB = 1.0 from [0.0:inf) `ATTR(info="CRITICAL LENGTH B OF MOBILITY LENGTH SCALING"); -parameter real KA = 0.0 from (-inf:inf) `ATTR(info="PARAMETER FOR CRITICAL LENGTH A OF MOBILITY LENGTH SCALING"); -parameter real KB = 0.0 from (-inf:inf) `ATTR(info="PARAMETER FOR CRITICAL LENGTH B OF MOBILITY LENGTH SCALING"); +parameter real LA = 1.0 from [0.0:inf) `ATTR(info="CRITICAL LENGTH A OF MOBILITY LENGTH SCALING"); +parameter real LB = 1.0 from [0.0:inf) `ATTR(info="CRITICAL LENGTH B OF MOBILITY LENGTH SCALING"); +parameter real KA = 0.0 from (-inf:inf) `ATTR(info="PARAMETER FOR CRITICAL LENGTH A OF MOBILITY LENGTH SCALING"); +parameter real KB = 0.0 from (-inf:inf) `ATTR(info="PARAMETER FOR CRITICAL LENGTH B OF MOBILITY LENGTH SCALING"); // LIMIT WKP1 CHANGES TO (-INF FROM [0 -parameter real WKP1 = 1.0E-6 from (-inf:inf) `ATTR(info="CRITICAL WIDTH OF MOBILITY WIDTH SCALING"); +parameter real WKP1 = 1.0E-6 from (-inf:inf) `ATTR(info="CRITICAL WIDTH OF MOBILITY WIDTH SCALING"); // LIMIT WKP2 CHANGES TO (-INF FROM [0 -parameter real WKP2 = 0.0 from (-inf:inf) `ATTR(info="AMPLITUDE PARAMETER FOR MOBILITY WIDTH SCALING"); +parameter real WKP2 = 0.0 from (-inf:inf) `ATTR(info="AMPLITUDE PARAMETER FOR MOBILITY WIDTH SCALING"); // LIMIT WKP3 CHANGES TO (-INF FROM [0 -parameter real WKP3 = 1.0 from (-inf:inf) `ATTR(info="SPAN PARAMETER FOR MOBILITY WIDTH SCALING"); +parameter real WKP3 = 1.0 from (-inf:inf) `ATTR(info="SPAN PARAMETER FOR MOBILITY WIDTH SCALING"); // GEOMETRICAL PARAMETERS (8) -parameter real DL = -10.0E-9 from (-inf:inf) `ATTR(info="EFFECTIVE LENGTH PARAMETER"); -parameter real DLC = 0.0 from (-inf:inf) `ATTR(info="EFFECTIVE LENGTH PARAMETER FOR DYNAMIC BEHAVIOUR"); -parameter real DW = -10.0E-9 from (-inf:inf) `ATTR(info="EFFECTIVE WIDTH PARAMETER"); -parameter real DWC = 0.0 from (-inf:inf) `ATTR(info="EFFECTIVE WIDTH PARAMETER FOR DYNAMIC BEHAVIOUR"); -parameter real WDL = 0.0 from (-inf:inf) `ATTR(info="EFFECTIVE LENGTH PARAMETER FOR NARROW CHANNEL DEVICES"); -parameter real LDW = 0.0 from (-inf:inf) `ATTR(info="EFFECTIVE WIDTH PARAMETER FOR SHORT CHANNEL DEVICES"); -parameter real LL = 0.0 from (-inf:inf) `ATTR(info="BASE OF EXPONENTIAL MODEL FOR EFFECTIVE LENGTH"); -parameter real LLN = 1.0 from (-inf:inf) `ATTR(info="EXPONENT OF EXPONENTIAL MODEL FOR EFFECTIVE LENGTH"); - +parameter real DL = -10.0E-9 from (-inf:inf) `ATTR(info="EFFECTIVE LENGTH PARAMETER"); +parameter real DLC = 0.0 from (-inf:inf) `ATTR(info="EFFECTIVE LENGTH PARAMETER FOR DYNAMIC BEHAVIOUR"); +parameter real DW = -10.0E-9 from (-inf:inf) `ATTR(info="EFFECTIVE WIDTH PARAMETER"); +parameter real DWC = 0.0 from (-inf:inf) `ATTR(info="EFFECTIVE WIDTH PARAMETER FOR DYNAMIC BEHAVIOUR"); +parameter real WDL = 0.0 from (-inf:inf) `ATTR(info="EFFECTIVE LENGTH PARAMETER FOR NARROW CHANNEL DEVICES"); +parameter real LDW = 0.0 from (-inf:inf) `ATTR(info="EFFECTIVE WIDTH PARAMETER FOR SHORT CHANNEL DEVICES"); +parameter real LL = 0.0 from (-inf:inf) `ATTR(info="BASE OF EXPONENTIAL MODEL FOR EFFECTIVE LENGTH"); +parameter real LLN = 1.0 from (-inf:inf) `ATTR(info="EXPONENT OF EXPONENTIAL MODEL FOR EFFECTIVE LENGTH"); + // LONG AND WIDE CHANNEL VTO AND GAMMA CORRECTION (8) -parameter real AVT = 0.0 from (-inf:inf) `ATTR(info="PARAMETER FOR LONG AND WIDE CHANNEL VTO CORRECTION"); -parameter real LVT = 1.0 from [0.0:inf) `ATTR(info="LENGTH FOR LONG AND WIDE CHANNEL VTO CORRECTION"); -parameter real WVT = 1.0 from [0.0:inf) `ATTR(info="WIDTH FOR LONG AND WIDE CHANNEL VTO CORRECTION"); -parameter real AGAM = 0.0 from (-inf:inf) `ATTR(info="PARAMETER FOR LONG AND WIDE CHANNEL GAMMA CORRECTION"); -parameter real LGAM = 1.0 from [0.0:inf) `ATTR(info="LENGTH FOR LONG AND WIDE CHANNEL GAMMA CORRECTION"); -parameter real WGAM = 1.0 from [0.0:inf) `ATTR(info="WIDTH FOR LONG AND WIDE CHANNEL GAMMA CORRECTION"); -parameter real NFVTA = 0.0 from [0.0:inf) `ATTR(info="NUMBER OF FINGERS FOR VTO CORRECTION FOR MULTIFINGER DEVICES (OBSOLETE MODEL BY STI STRESS EFFECT)"); -parameter real NFVTB = 10000.0 from (-inf:inf) `ATTR(info="PARAMETER FOR VTO CORRECTION FOR MULTIFINGER DEVICES (OBSOLETE MODEL BY STI STRESS EFFECT)"); - +parameter real AVT = 0.0 from (-inf:inf) `ATTR(info="PARAMETER FOR LONG AND WIDE CHANNEL VTO CORRECTION"); +parameter real LVT = 1.0 from [0.0:inf) `ATTR(info="LENGTH FOR LONG AND WIDE CHANNEL VTO CORRECTION"); +parameter real WVT = 1.0 from [0.0:inf) `ATTR(info="WIDTH FOR LONG AND WIDE CHANNEL VTO CORRECTION"); +parameter real AGAM = 0.0 from (-inf:inf) `ATTR(info="PARAMETER FOR LONG AND WIDE CHANNEL GAMMA CORRECTION"); +parameter real LGAM = 1.0 from [0.0:inf) `ATTR(info="LENGTH FOR LONG AND WIDE CHANNEL GAMMA CORRECTION"); +parameter real WGAM = 1.0 from [0.0:inf) `ATTR(info="WIDTH FOR LONG AND WIDE CHANNEL GAMMA CORRECTION"); +parameter real NFVTA = 0.0 from [0.0:inf) `ATTR(info="NUMBER OF FINGERS FOR VTO CORRECTION FOR MULTIFINGER DEVICES (OBSOLETE MODEL BY STI STRESS EFFECT)"); +parameter real NFVTB = 10000.0 from (-inf:inf) `ATTR(info="PARAMETER FOR VTO CORRECTION FOR MULTIFINGER DEVICES (OBSOLETE MODEL BY STI STRESS EFFECT)"); + // VELOCITY SATURATION & CLM RELATED PARAMETERS (4) -parameter real UCRIT = 5.0E+06 from (0.0:inf) `ATTR(info="CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT"); -parameter real DELTA = 2.0 from [1.0:2.0] `ATTR(info="VARIABLE ORDER (FROM 1.0 TO 2.0) OF VELOCITY SATURATION EFFECT"); -parameter real LAMBDA = 0.5 from [0.0:inf) `ATTR(info="LENGTH PARAMETER FOR CHANNEL LENGTH MODULATION"); -parameter real ACLM = 0.83 from [0.0:inf) `ATTR(info="FINE TUNING PARAMETER FOR CHANNEL LENGTH MODULATION"); - +parameter real UCRIT = 5.0E+06 from (0.0:inf) `ATTR(info="CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT"); +parameter real DELTA = 2.0 from [1.0:2.0] `ATTR(info="VARIABLE ORDER (FROM 1.0 TO 2.0) OF VELOCITY SATURATION EFFECT"); +parameter real LAMBDA = 0.5 from [0.0:inf) `ATTR(info="LENGTH PARAMETER FOR CHANNEL LENGTH MODULATION"); +parameter real ACLM = 0.83 from [0.0:inf) `ATTR(info="FINE TUNING PARAMETER FOR CHANNEL LENGTH MODULATION"); + // REVERSE SHORT CHANNEL EFFECT (4) -parameter real LR = 50.0E-09 from (0.0:inf) `ATTR(info="LENGTH PARAMETER FOR REVERSE SHORT CHANNEL EFFECT"); -parameter real QLR = 0.5E-3 from (-inf:inf) `ATTR(info="CHARGE PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (VTO)"); -parameter real NLR = 10.0E-3 from (-inf:inf) `ATTR(info="DOPING PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (GAMMA)"); -parameter real FLR = 1.0 from [0.0:inf) `ATTR(info="FERMI POTENTIAL FINE TUNING PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (PHIF)"); - +parameter real LR = 50.0E-09 from (0.0:inf) `ATTR(info="LENGTH PARAMETER FOR REVERSE SHORT CHANNEL EFFECT"); +parameter real QLR = 0.5E-3 from (-inf:inf) `ATTR(info="CHARGE PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (VTO)"); +parameter real NLR = 10.0E-3 from (-inf:inf) `ATTR(info="DOPING PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (GAMMA)"); +parameter real FLR = 1.0 from [0.0:inf) `ATTR(info="FERMI POTENTIAL FINE TUNING PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (PHIF)"); + // CHARGE SHARING EFFECT (5) -parameter real LETA0 = 0.0 from (-inf:inf) `ATTR(info="LENGTH INDEPENDENT PARAMETER FOR CHARGE SHARING (LONG CHANNEL)"); -parameter real LETA = 500.0E-3 from [0.0:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR CHARGE SHARING"); -parameter real LETA2 = 0.0 from (-inf:inf) `ATTR(info="SECOND ORDER LENGTH SCALING PARAMETER FOR CHARGE SHARING (SHORTEST CHANNEL)"); -parameter real WETA = 200.0E-3 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR CHARGE SHARING"); -parameter real NCS = 1.0 from [0.0:inf) `ATTR(info="WEAK INVERSION SLOPE PARAMETER FOR CHARGE SHARING"); +parameter real LETA0 = 0.0 from (-inf:inf) `ATTR(info="LENGTH INDEPENDENT PARAMETER FOR CHARGE SHARING (LONG CHANNEL)"); +parameter real LETA = 500.0E-3 from [0.0:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR CHARGE SHARING"); +parameter real LETA2 = 0.0 from (-inf:inf) `ATTR(info="SECOND ORDER LENGTH SCALING PARAMETER FOR CHARGE SHARING (SHORTEST CHANNEL)"); +parameter real WETA = 200.0E-3 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR CHARGE SHARING"); +parameter real NCS = 1.0 from [0.0:inf) `ATTR(info="WEAK INVERSION SLOPE PARAMETER FOR CHARGE SHARING"); // DRAIN INDUCED BARRIER LOWERING (2) -parameter real ETAD = 1.0 from [0.0:inf) `ATTR(info="ETA PARAMETER FOR DRAIN INDUCED BARRIER LOWERING"); -parameter real SIGMAD = 1.0 from [0.0:inf) `ATTR(info="SIGMA PARAMETER FOR DRAIN INDUCED BARRIER LOWERING"); - +parameter real ETAD = 1.0 from [0.0:inf) `ATTR(info="ETA PARAMETER FOR DRAIN INDUCED BARRIER LOWERING"); +parameter real SIGMAD = 1.0 from [0.0:inf) `ATTR(info="SIGMA PARAMETER FOR DRAIN INDUCED BARRIER LOWERING"); + // INVERSE NARROW CHANNEL EFFECT (3) -parameter real WR = 90.0E-09 from (0.0:inf) `ATTR(info="WIDTH PARAMETER FOR INVERSE NARROW CHANNEL EFFECT"); -parameter real QWR = 0.3E-3 from (-inf:inf) `ATTR(info="CHARGE PARAMETER FOR INVERSE NARROW CHANNEL EFFECT (VTO)"); -parameter real NWR = 5.0E-3 from (-inf:inf) `ATTR(info="DOPING PARAMETER FOR INVERSE NARROW CHANNEL EFFECT (GAMMA)"); - +parameter real WR = 90.0E-09 from (0.0:inf) `ATTR(info="WIDTH PARAMETER FOR INVERSE NARROW CHANNEL EFFECT"); +parameter real QWR = 0.3E-3 from (-inf:inf) `ATTR(info="CHARGE PARAMETER FOR INVERSE NARROW CHANNEL EFFECT (VTO)"); +parameter real NWR = 5.0E-3 from (-inf:inf) `ATTR(info="DOPING PARAMETER FOR INVERSE NARROW CHANNEL EFFECT (GAMMA)"); + // DITS (5) -parameter real FPROUT = 1.0E6 from [0.0:inf) `ATTR(info="OUTPUT RESISTANCE PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT"); -parameter real PDITS = 0.0 from [0.0:inf) `ATTR(info="PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT (IF SET TO ZERO THE DITS EFFECT IS DISABLED)"); -parameter real PDITSL = 0.0 from [0.0:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT"); -parameter real PDITSD = 1.0 from [0.0:inf) `ATTR(info="BIAS PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT"); -parameter real DDITS = 0.3 from [0.0:inf) `ATTR(info="SMOOTH FACTOR OF OUTPUT CONDUCTANCE FOR DRAIN INDUCED THRESHOLD SHIFT"); - +parameter real FPROUT = 1.0E6 from [0.0:inf) `ATTR(info="OUTPUT RESISTANCE PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT"); +parameter real PDITS = 0.0 from [0.0:inf) `ATTR(info="PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT (IF SET TO ZERO THE DITS EFFECT IS DISABLED)"); +parameter real PDITSL = 0.0 from [0.0:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT"); +parameter real PDITSD = 1.0 from [0.0:inf) `ATTR(info="BIAS PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT"); +parameter real DDITS = 0.3 from [0.0:inf) `ATTR(info="SMOOTH FACTOR OF OUTPUT CONDUCTANCE FOR DRAIN INDUCED THRESHOLD SHIFT"); + // IMPACT IONIZATION CURRENT (3) -parameter real IBA = 000.0E+06 from [0.0:inf) `ATTR(info="PARAMETER A OF IMPACT IONIZATION CURRENT"); -parameter real IBB = 300.0E+06 from [0.0:inf) `ATTR(info="PARAMETER B OF IMPACT IONIZATION CURRENT"); -parameter real IBN = 1.0 from [0.0:inf) `ATTR(info="PARAMETER N OF IMPACT IONIZATION CURRENT"); - +parameter real IBA = 000.0E+06 from [0.0:inf) `ATTR(info="PARAMETER A OF IMPACT IONIZATION CURRENT"); +parameter real IBB = 300.0E+06 from [0.0:inf) `ATTR(info="PARAMETER B OF IMPACT IONIZATION CURRENT"); +parameter real IBN = 1.0 from [0.0:inf) `ATTR(info="PARAMETER N OF IMPACT IONIZATION CURRENT"); + // GATE CURRENT (4) -parameter real XB = 3.1 from (0.0:inf) `ATTR(info="SILICON TO SILICON OXIDE TUNNELING BARRIER HEIGHT"); -parameter real EB = 29.0E+09 from (0.0:inf) `ATTR(info="CHARACTERISTIC ELECTRICAL FIELD"); -parameter real KG = 00.0E-6 from [0.0:inf) `ATTR(info="MOBILITY FOR GATE CURRENT"); -parameter real LOVIG = 20.0E-9 from [0.0:inf) `ATTR(info="OVERLAP GATE LENGTH FOR OVERLAP GATE CURRENT"); - +parameter real XB = 3.1 from (0.0:inf) `ATTR(info="SILICON TO SILICON OXIDE TUNNELING BARRIER HEIGHT"); +parameter real EB = 29.0E+09 from (0.0:inf) `ATTR(info="CHARACTERISTIC ELECTRICAL FIELD"); +parameter real KG = 00.0E-6 from [0.0:inf) `ATTR(info="MOBILITY FOR GATE CURRENT"); +parameter real LOVIG = 20.0E-9 from [0.0:inf) `ATTR(info="OVERLAP GATE LENGTH FOR OVERLAP GATE CURRENT"); + // GIDL - GISL (4) -parameter real AGIDL = 0.0 from [0.0:inf) `ATTR(info="PARAMETER A OF GATE INDUCED DRAIN LEAKAGE"); -parameter real BGIDL = 2.3E+09 from [0.0:inf) `ATTR(info="PARAMETER B OF GATE INDUCED DRAIN LEAKAGE"); -parameter real CGIDL = 0.5 from [0.0:inf) `ATTR(info="PARAMETER C OF GATE INDUCED DRAIN LEAKAGE"); -parameter real EGIDL = 0.8 from [0.0:inf) `ATTR(info="PARAMETER E OF GATE INDUCED DRAIN LEAKAGE"); +parameter real AGIDL = 0.0 from [0.0:inf) `ATTR(info="PARAMETER A OF GATE INDUCED DRAIN LEAKAGE"); +parameter real BGIDL = 2.3E+09 from [0.0:inf) `ATTR(info="PARAMETER B OF GATE INDUCED DRAIN LEAKAGE"); +parameter real CGIDL = 0.5 from [0.0:inf) `ATTR(info="PARAMETER C OF GATE INDUCED DRAIN LEAKAGE"); +parameter real EGIDL = 0.8 from [0.0:inf) `ATTR(info="PARAMETER E OF GATE INDUCED DRAIN LEAKAGE"); // FLICKER NOISE PARAMETERS (4) -parameter integer LFNOI = 0 from [0.0:inf) `ATTR(info="FLICKER NOISE MODEL SELECTION"); -parameter real KF = 0.0 from [0.0:inf) `ATTR(info="FLICKER NOISE PARAMETER"); -parameter real AF = 1.0 from [0.0:inf) `ATTR(info="FLICKER NOISE FREQUENCY EXPONENT"); -parameter real EF = 2.0 from [0.0:inf) `ATTR(info="FLICKER NOISE TRANSCONDUCTANCE EXPONENT"); -parameter real NT = 1.0E+14 from [0.0:inf) `ATTR(info="NUMBER OF TRAPPED CARRIERS"); -parameter real ALPHAC = 10.0E+4 from [0.0:inf) `ATTR(info="COULOMB SCATTERING COEFFICIENT"); -parameter real ALPHAH = 1.0E-20 from [0.0:inf) `ATTR(info="HOOGE PARAMETER FOR MOBILITY FLUCTUATION NOISE MODEL"); -parameter real KGFN = 0.0 from [0.0:inf) `ATTR(info="GATE FLICKER NOISE PARAMETER"); -parameter real ECN = 1.0E+4 from [0.0:inf) `ATTR(info="CRITICAL FIELD VALUE"); -//parameter real SDR = 1.0E-10 from [0.0:inf) `ATTR(info="SERIES RESISTANCE NOISE PARAMETER"); -parameter real SDR = 1.0E-6 from [0.0:inf) `ATTR(info="SERIES RESISTANCE NOISE PARAMETER"); +parameter integer LFNOI = 0 from [0.0:inf) `ATTR(info="FLICKER NOISE MODEL SELECTION"); +parameter real KF = 0.0 from [0.0:inf) `ATTR(info="FLICKER NOISE PARAMETER"); +parameter real AF = 1.0 from [0.0:inf) `ATTR(info="FLICKER NOISE FREQUENCY EXPONENT"); +parameter real EF = 2.0 from [0.0:inf) `ATTR(info="FLICKER NOISE TRANSCONDUCTANCE EXPONENT"); +parameter real NT = 1.0E+14 from [0.0:inf) `ATTR(info="NUMBER OF TRAPPED CARRIERS"); +parameter real ALPHAC = 10.0E+4 from [0.0:inf) `ATTR(info="COULOMB SCATTERING COEFFICIENT"); +parameter real ALPHAH = 1.0E-20 from [0.0:inf) `ATTR(info="HOOGE PARAMETER FOR MOBILITY FLUCTUATION NOISE MODEL"); +parameter real KGFN = 0.0 from [0.0:inf) `ATTR(info="GATE FLICKER NOISE PARAMETER"); +parameter real ECN = 1.0E+4 from [0.0:inf) `ATTR(info="CRITICAL FIELD VALUE"); +//parameter real SDR = 1.0E-10 from [0.0:inf) `ATTR(info="SERIES RESISTANCE NOISE PARAMETER"); +parameter real SDR = 1.0E-6 from [0.0:inf) `ATTR(info="SERIES RESISTANCE NOISE PARAMETER"); // LENGTH SCALING PARAMETERS (3) -parameter real LWR = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR WR"); -parameter real LQWR = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR QWR"); -parameter real LNWR = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR NWR"); -parameter real LDPHIEDGE = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR DPHIEDGE"); +parameter real LWR = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR WR"); +parameter real LQWR = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR QWR"); +parameter real LNWR = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR NWR"); +parameter real LDPHIEDGE = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR DPHIEDGE"); // WIDTH SCALING PARAMETERS (11) -parameter real WLR = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR LR"); -parameter real WQLR = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR QLR"); -parameter real WNLR = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR NLR"); -parameter real WUCRIT = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR UCRIT"); -parameter real WLAMBDA = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR LAMBDA"); -parameter real WETAD = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR ETAD"); -parameter real WE0 = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR E0"); -parameter real WE1 = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR E1"); -parameter real WRLX = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR RLX"); -parameter real WUCEX = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR UCEX"); -parameter real WDPHIEDGE = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR DPHIEDGE"); +parameter real WLR = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR LR"); +parameter real WQLR = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR QLR"); +parameter real WNLR = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR NLR"); +parameter real WUCRIT = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR UCRIT"); +parameter real WLAMBDA = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR LAMBDA"); +parameter real WETAD = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR ETAD"); +parameter real WE0 = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR E0"); +parameter real WE1 = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR E1"); +parameter real WRLX = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR RLX"); +parameter real WUCEX = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR UCEX"); +parameter real WDPHIEDGE = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR DPHIEDGE"); // COMBINED SCALING PARAMETERS (2) -parameter real WLDPHIEDGE = 0.0 from (-inf:inf) `ATTR(info="FINE TUNING SCALING FOR COMBINED SHORT AND NARROW DEVICES FOR DPHIEDGE"); -parameter real WLDGAMMAEDGE = 0.0 from (-inf:inf) `ATTR(info="FINE TUNING SCALING FOR COMBINED SHORT AND NARROW DEVICES FOR DGAMMAEDGE"); +parameter real WLDPHIEDGE = 0.0 from (-inf:inf) `ATTR(info="FINE TUNING SCALING FOR COMBINED SHORT AND NARROW DEVICES FOR DPHIEDGE"); +parameter real WLDGAMMAEDGE = 0.0 from (-inf:inf) `ATTR(info="FINE TUNING SCALING FOR COMBINED SHORT AND NARROW DEVICES FOR DGAMMAEDGE"); // EDGE DEVICE (3) -parameter real WEDGE = 0.0 from [0.0:inf) `ATTR(info="TOTAL EFFECTIVE WIDTH OF EDGE DEVICE FOR EDGE CONDUCTANCE EFFECT"); -parameter real DGAMMAEDGE = 0.0 from (-inf:inf) `ATTR(info="DIFFERENTIAL GAMMA PARAMETER OF EDGE DEVICE WITH RESPECT TO THE MAIN DEVICE"); -parameter real DPHIEDGE = 0.0 from (-inf:inf) `ATTR(info="DIFFERENTIAL PHI PARAMETER OF EDGE DEVICE WITH RESPECT TO THE MAIN DEVICE"); +parameter real WEDGE = 0.0 from [0.0:inf) `ATTR(info="TOTAL EFFECTIVE WIDTH OF EDGE DEVICE FOR EDGE CONDUCTANCE EFFECT"); +parameter real DGAMMAEDGE = 0.0 from (-inf:inf) `ATTR(info="DIFFERENTIAL GAMMA PARAMETER OF EDGE DEVICE WITH RESPECT TO THE MAIN DEVICE"); +parameter real DPHIEDGE = 0.0 from (-inf:inf) `ATTR(info="DIFFERENTIAL PHI PARAMETER OF EDGE DEVICE WITH RESPECT TO THE MAIN DEVICE"); // STI STRESS EFFECT (13) -parameter real SAREF = 0.0 from [0.0:inf) `ATTR(info="REFERENCE SA PARAMETER FOR STI STRESS EFFECT PARAMETER EXTRACION"); -parameter real SBREF = 0.0 from [0.0:inf) `ATTR(info="REFERENCE SB PARAMETER FOR STI STRESS EFFECT PARAMETER EXTRACION"); -parameter real WLOD = 0.0 from (-inf:inf) `ATTR(info="WIDTH EFFECTIVE PARAMETER FOR STI STRESS EFFECT"); -parameter real KKP = 0.0 from (-inf:inf) `ATTR(info="MOBILITY PARAMETER FOR STI STRESS EFFECT"); -parameter real LKKP = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING OF MOBILITY FOR STI STRESS EFFECT"); -parameter real WKKP = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING OF MOBILITY FOR STI STRESS EFFECT"); -parameter real PKKP = 0.0 from (-inf:inf) `ATTR(info="AREA SCALING OF MOBILITY FOR STI STRESS EFFECT"); -parameter real TKKP = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF MOBILITY FOR STI STRESS EFFECT"); -parameter real LLODKKP = 1.0 from (-inf:inf) `ATTR(info="EXPONENTIAL LENGTH SCALING PARAMETER OF MOBILITY FOR STI STRESS EFFECT"); -parameter real WLODKKP = 1.0 from (-inf:inf) `ATTR(info="EXPONENTIAL WIDTH SCALING PARAMETER OF MOBILITY FOR STI STRESS EFFECT"); -parameter real KVTO = 0.0 from (-inf:inf) `ATTR(info="THRESHOLD VOLTAGE PARAMETER FOR STI STRESS EFFECT"); -parameter real LKVTO = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT"); -parameter real WKVTO = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT"); -parameter real PKVTO = 0.0 from (-inf:inf) `ATTR(info="AREA SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT"); -parameter real LLODKVTO = 1.0 from (-inf:inf) `ATTR(info="EXPONENTIAL LENGTH SCALING PARAMETER OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT"); -parameter real WLODKVTO = 1.0 from (-inf:inf) `ATTR(info="EXPONENTIAL WIDTH SCALING PARAMETER OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT"); -parameter real KGAMMA = 0.0 from (-inf:inf) `ATTR(info="BODY EFFECT COEFFICIENT PARAMETER FOR STI STRESS EFFECT"); -parameter real LODKGAMMA = 1.0 from (-inf:inf) `ATTR(info="FINE TUNING PARAMETER FOR BODY EFFECT COEFFICIENT SCALING OF STI STRESS EFFECT"); -parameter real KETAD = 0.0 from (-inf:inf) `ATTR(info="DIBL EFFECT PARAMETER FOR STI STRESS EFFECT"); -parameter real LODKETAD = 1.0 from (-inf:inf) `ATTR(info="FINE TUNING PARAMETER FOR DIBL EFFECT PARAMETER SCALING OF STI STRESS EFFECT"); -parameter real KUCRIT = 0.0 from (-inf:inf) `ATTR(info="CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT PARAMETER FOR STI STRESS EFFECT"); +parameter real SAREF = 0.0 from [0.0:inf) `ATTR(info="REFERENCE SA PARAMETER FOR STI STRESS EFFECT PARAMETER EXTRACION"); +parameter real SBREF = 0.0 from [0.0:inf) `ATTR(info="REFERENCE SB PARAMETER FOR STI STRESS EFFECT PARAMETER EXTRACION"); +parameter real WLOD = 0.0 from (-inf:inf) `ATTR(info="WIDTH EFFECTIVE PARAMETER FOR STI STRESS EFFECT"); +parameter real KKP = 0.0 from (-inf:inf) `ATTR(info="MOBILITY PARAMETER FOR STI STRESS EFFECT"); +parameter real LKKP = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING OF MOBILITY FOR STI STRESS EFFECT"); +parameter real WKKP = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING OF MOBILITY FOR STI STRESS EFFECT"); +parameter real PKKP = 0.0 from (-inf:inf) `ATTR(info="AREA SCALING OF MOBILITY FOR STI STRESS EFFECT"); +parameter real TKKP = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF MOBILITY FOR STI STRESS EFFECT"); +parameter real LLODKKP = 1.0 from (-inf:inf) `ATTR(info="EXPONENTIAL LENGTH SCALING PARAMETER OF MOBILITY FOR STI STRESS EFFECT"); +parameter real WLODKKP = 1.0 from (-inf:inf) `ATTR(info="EXPONENTIAL WIDTH SCALING PARAMETER OF MOBILITY FOR STI STRESS EFFECT"); +parameter real KVTO = 0.0 from (-inf:inf) `ATTR(info="THRESHOLD VOLTAGE PARAMETER FOR STI STRESS EFFECT"); +parameter real LKVTO = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT"); +parameter real WKVTO = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT"); +parameter real PKVTO = 0.0 from (-inf:inf) `ATTR(info="AREA SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT"); +parameter real LLODKVTO = 1.0 from (-inf:inf) `ATTR(info="EXPONENTIAL LENGTH SCALING PARAMETER OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT"); +parameter real WLODKVTO = 1.0 from (-inf:inf) `ATTR(info="EXPONENTIAL WIDTH SCALING PARAMETER OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT"); +parameter real KGAMMA = 0.0 from (-inf:inf) `ATTR(info="BODY EFFECT COEFFICIENT PARAMETER FOR STI STRESS EFFECT"); +parameter real LODKGAMMA = 1.0 from (-inf:inf) `ATTR(info="FINE TUNING PARAMETER FOR BODY EFFECT COEFFICIENT SCALING OF STI STRESS EFFECT"); +parameter real KETAD = 0.0 from (-inf:inf) `ATTR(info="DIBL EFFECT PARAMETER FOR STI STRESS EFFECT"); +parameter real LODKETAD = 1.0 from (-inf:inf) `ATTR(info="FINE TUNING PARAMETER FOR DIBL EFFECT PARAMETER SCALING OF STI STRESS EFFECT"); +parameter real KUCRIT = 0.0 from (-inf:inf) `ATTR(info="CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT PARAMETER FOR STI STRESS EFFECT"); @@ -256,20 +256,20 @@ parameter real KUCRIT = 0.0 from (-inf:inf) `ATTR(info="CRITICAL VELOCITY // TEMPERATURE PARAMETERS (8) // //////////////////////////////// -parameter real TCV = 600.0E-6 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF THRESHOLD VOLTAGE"); -parameter real BEX = -1.5 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF MOBILITY"); -parameter real TE0EX = 0.5 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF E0"); -parameter real TE1EX = 0.5 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF E1"); -parameter real TETA = -0.9E-3 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF ETA PARAMETER"); -parameter real UCEX = 1.5 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT"); -parameter real TLAMBDA = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF LAMBDA PARAMETER"); -parameter real IBBT = 800.0E-6 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF IBB"); +parameter real TCV = 600.0E-6 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF THRESHOLD VOLTAGE"); +parameter real BEX = -1.5 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF MOBILITY"); +parameter real TE0EX = 0.5 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF E0"); +parameter real TE1EX = 0.5 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF E1"); +parameter real TETA = -0.9E-3 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF ETA PARAMETER"); +parameter real UCEX = 1.5 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT"); +parameter real TLAMBDA = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF LAMBDA PARAMETER"); +parameter real IBBT = 800.0E-6 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF IBB"); // TEMPERATURE AND GEOMETRY SCALING (3) -parameter real TCVL = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING OF TCV"); -parameter real TCVW = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING OF TCV"); -parameter real TCVWL = 0.0 from (-inf:inf) `ATTR(info="AREA SCALING OF TCV"); +parameter real TCVL = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING OF TCV"); +parameter real TCVW = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING OF TCV"); +parameter real TCVWL = 0.0 from (-inf:inf) `ATTR(info="AREA SCALING OF TCV"); //////////////////// // EXTRINSIC PART // @@ -277,155 +277,155 @@ parameter real TCVWL = 0.0 from (-inf:inf) `ATTR(info="AREA SCALING OF TCV" // OVERLAP CAPACITANCES (8) -parameter real GAMMAOV = 1.6 from (0.0:inf) `ATTR(info="BODY EFFECT COEFFICIENT OF THE GATE OVERLAP REGION"); -parameter real GAMMAGOV = 10.0 from (0.0:inf) `ATTR(info="GATE DOPING COEFFICIENT FOR POLYSILICON DEPLETION EFFECT OF THE GATE OVERLAP REGION"); -parameter real VFBOV = 0.0 from (-inf:inf) `ATTR(info="FLAT-BAND VOLTAGE OF THE GATE OVERLAP REGION"); -parameter real LOV = 20.0E-9 from [0.0:inf) `ATTR(info="EFFECTIVE LENGTH OF THE GATE OVERLAP REGION"); -parameter real VOV = 1.0 from [0.0:1.0] `ATTR(info="BIAS PARAMETER OF THE OVERLAP CAPACITANCES"); -parameter real CGSO = 0.0 from [0.0:inf) `ATTR(info="BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE WIDTH UNIT BETWEEN GATE AND SOURCE"); -parameter real CGDO = 0.0 from [0.0:inf) `ATTR(info="BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE WIDTH UNIT BETWEEN GATE AND DRAIN"); -parameter real CGBO = 0.0 from [0.0:inf) `ATTR(info="BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE LENGTH UNIT BETWEEN GATE AND BULK"); +parameter real GAMMAOV = 1.6 from (0.0:inf) `ATTR(info="BODY EFFECT COEFFICIENT OF THE GATE OVERLAP REGION"); +parameter real GAMMAGOV = 10.0 from (0.0:inf) `ATTR(info="GATE DOPING COEFFICIENT FOR POLYSILICON DEPLETION EFFECT OF THE GATE OVERLAP REGION"); +parameter real VFBOV = 0.0 from (-inf:inf) `ATTR(info="FLAT-BAND VOLTAGE OF THE GATE OVERLAP REGION"); +parameter real LOV = 20.0E-9 from [0.0:inf) `ATTR(info="EFFECTIVE LENGTH OF THE GATE OVERLAP REGION"); +parameter real VOV = 1.0 from [0.0:1.0] `ATTR(info="BIAS PARAMETER OF THE OVERLAP CAPACITANCES"); +parameter real CGSO = 0.0 from [0.0:inf) `ATTR(info="BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE WIDTH UNIT BETWEEN GATE AND SOURCE"); +parameter real CGDO = 0.0 from [0.0:inf) `ATTR(info="BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE WIDTH UNIT BETWEEN GATE AND DRAIN"); +parameter real CGBO = 0.0 from [0.0:inf) `ATTR(info="BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE LENGTH UNIT BETWEEN GATE AND BULK"); // FRINGING CAPACITANCE (4) -parameter real KJF = 0.0 from [0.0:inf) `ATTR(info="FRINGING CAPACITANCE PARAMETER"); -parameter real CJF = 0.0 from [0.0:inf) `ATTR(info="BIAS SCALING OF FRINGING CAPACITANCE"); -parameter real VFR = 0.0 from [0.0:inf) `ATTR(info="BUILT-IN VOLTAGE FINE TUNING FOR FRINGING CAPACITANCE MODEL"); -parameter real DFR = 1.0E-3 from [0.0:inf) `ATTR(info="SMOOTH PARAMETER OF FRINGING CAPACITANCE MODEL"); +parameter real KJF = 0.0 from [0.0:inf) `ATTR(info="FRINGING CAPACITANCE PARAMETER"); +parameter real CJF = 0.0 from [0.0:inf) `ATTR(info="BIAS SCALING OF FRINGING CAPACITANCE"); +parameter real VFR = 0.0 from [0.0:inf) `ATTR(info="BUILT-IN VOLTAGE FINE TUNING FOR FRINGING CAPACITANCE MODEL"); +parameter real DFR = 1.0E-3 from [0.0:inf) `ATTR(info="SMOOTH PARAMETER OF FRINGING CAPACITANCE MODEL"); // SERIES RESISTANCES RS AND RD // - TYPICAL SPICE MODEL -parameter real HDIF = 0.0e-6 from [0.0:inf) `ATTR(info="HALF LENGTH OF THE ACTIVE AREA"); -parameter real RSH = 0.0 from [0.0:inf) `ATTR(info="SQUARE RESISTANCE OF ACTIVE AREA"); -parameter real LDIF = 0.0 from [0.0:inf) `ATTR(info="DISTANCE BETWEEN THE MIDDLE OF THE ACTIVE AREA AND THE START OF THE CHANNEL"); -parameter real RS = 0.0 from [0.0:inf) `ATTR(info="LDD SOURCE SERIES RESISTANCE"); -parameter real RD = 0.0 from [0.0:inf) `ATTR(info="LDD DRAIN SERIES RESISTANCE"); +parameter real HDIF = 0.0e-6 from [0.0:inf) `ATTR(info="HALF LENGTH OF THE ACTIVE AREA"); +parameter real RSH = 0.0 from [0.0:inf) `ATTR(info="SQUARE RESISTANCE OF ACTIVE AREA"); +parameter real LDIF = 0.0 from [0.0:inf) `ATTR(info="DISTANCE BETWEEN THE MIDDLE OF THE ACTIVE AREA AND THE START OF THE CHANNEL"); +parameter real RS = 0.0 from [0.0:inf) `ATTR(info="LDD SOURCE SERIES RESISTANCE"); +parameter real RD = 0.0 from [0.0:inf) `ATTR(info="LDD DRAIN SERIES RESISTANCE"); // - NON-GEOMETRICAL APPROACH -parameter real RLX = -1.0 from (-inf:inf) `ATTR(info="EXTERNAL SERIES RESISTANCE PER WIDTH UNIT"); -parameter real RSX = -1.0 from (-inf:inf) `ATTR(info="EXTERNAL SERIES RESISTANCE PER WIDTH UNIT, SOURCE SIDE (ASYMMETRIC MODEL)"); -parameter real RDX = -1.0 from (-inf:inf) `ATTR(info="EXTERNAL SERIES RESISTANCE PER WIDTH UNIT, DRAIN SIDE (ASYMMETRIC MODEL)"); +parameter real RLX = -1.0 from (-inf:inf) `ATTR(info="EXTERNAL SERIES RESISTANCE PER WIDTH UNIT"); +parameter real RSX = -1.0 from (-inf:inf) `ATTR(info="EXTERNAL SERIES RESISTANCE PER WIDTH UNIT, SOURCE SIDE (ASYMMETRIC MODEL)"); +parameter real RDX = -1.0 from (-inf:inf) `ATTR(info="EXTERNAL SERIES RESISTANCE PER WIDTH UNIT, DRAIN SIDE (ASYMMETRIC MODEL)"); // - TEMPERATURE SCALING -parameter real TR = 0.0 from (-inf:inf) `ATTR(info="FIRST ORDER RESISTANCE TEMPERATURE SCALING PARAMETER"); -parameter real TR2 = 0.0 from (-inf:inf) `ATTR(info="SECOND ORDER RESISTANCE TEMPERATURE SCALING PARAMETER"); +parameter real TR = 0.0 from (-inf:inf) `ATTR(info="FIRST ORDER RESISTANCE TEMPERATURE SCALING PARAMETER"); +parameter real TR2 = 0.0 from (-inf:inf) `ATTR(info="SECOND ORDER RESISTANCE TEMPERATURE SCALING PARAMETER"); // JUNCTION DRAIN - BULK AND SOURCE-BULK AREA, CURRENT, CAPACITANCE -parameter real GMIN = 0.0 from [0.0:inf) `ATTR(info="MINIMUM CONDUCTANCE OF JUNCTION DIODES"); - +parameter real GMIN = 0.0 from [0.0:inf) `ATTR(info="MINIMUM CONDUCTANCE OF JUNCTION DIODES"); + // SOURCE SIDE -parameter real NJS = 1.0 from (-inf:inf) `ATTR(info="SLOPE FACTOR FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real XJBVS = 0.0 from (-inf:inf) `ATTR(info="BREAK-DOWN EFFECT COEFFICIENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real BVS = 10.0 from (-inf:inf) `ATTR(info="BREAK-DOWN VOLTAGE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real NJS = 1.0 from (-inf:inf) `ATTR(info="SLOPE FACTOR FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real XJBVS = 0.0 from (-inf:inf) `ATTR(info="BREAK-DOWN EFFECT COEFFICIENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real BVS = 10.0 from (-inf:inf) `ATTR(info="BREAK-DOWN VOLTAGE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); + +parameter real JSS = 0.0E-09 from (-inf:inf) `ATTR(info="AREA COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real JSSWS = 0.0E-12 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real JSSWGS = 0.0E-12 from (-inf:inf) `ATTR(info="GATE-SIDE COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real JSS = 0.0E-09 from (-inf:inf) `ATTR(info="AREA COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real JSSWS = 0.0E-12 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real JSSWGS = 0.0E-12 from (-inf:inf) `ATTR(info="GATE-SIDE COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); - -parameter real JTSS = 0.0E-09 from (-inf:inf) `ATTR(info="AREA COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real JTSSWS = 0.0E-12 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real JTSSWGS = 0.0E-12 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real JTSS = 0.0E-09 from (-inf:inf) `ATTR(info="AREA COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real JTSSWS = 0.0E-12 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real JTSSWGS = 0.0E-12 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real NJTSS = 1.0 from (-inf:inf) `ATTR(info="AREA SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real NJTSSWS = 1.0 from (-inf:inf) `ATTR(info="SIDEWAYS SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real NJTSSWGS = 1.0 from (-inf:inf) `ATTR(info="GATESIDE SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real NJTSS = 1.0 from (-inf:inf) `ATTR(info="AREA SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real NJTSSWS = 1.0 from (-inf:inf) `ATTR(info="SIDEWAYS SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real NJTSSWGS = 1.0 from (-inf:inf) `ATTR(info="GATESIDE SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real VTSS = 0.0 from (-inf:inf) `ATTR(info="AREA VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real VTSSWS = 0.0 from (-inf:inf) `ATTR(info="SIDEWAYS VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real VTSSWGS = 0.0 from (-inf:inf) `ATTR(info="GATESIDE VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real VTSS = 0.0 from (-inf:inf) `ATTR(info="AREA VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real VTSSWS = 0.0 from (-inf:inf) `ATTR(info="SIDEWAYS VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real VTSSWGS = 0.0 from (-inf:inf) `ATTR(info="GATESIDE VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real CJS = 0.0E-06 from (-inf:inf) `ATTR(info="AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real CJSWS = 0.0E-09 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real CJSWGS = 0.0E-09 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real CJS = 0.0E-06 from (-inf:inf) `ATTR(info="AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real CJSWS = 0.0E-09 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real CJSWGS = 0.0E-09 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real PBS = 0.800 from (-inf:inf) `ATTR(info="AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real PBSWS = 0.600 from (-inf:inf) `ATTR(info="SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real PBSWGS = 0.600 from (-inf:inf) `ATTR(info="GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real PBS = 0.800 from (-inf:inf) `ATTR(info="AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real PBSWS = 0.600 from (-inf:inf) `ATTR(info="SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real PBSWGS = 0.600 from (-inf:inf) `ATTR(info="GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real MJS = 0.900 from (-inf:inf) `ATTR(info="AREA EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real MJSWS = 0.700 from (-inf:inf) `ATTR(info="SIDEWAYS EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real MJSWGS = 0.700 from (-inf:inf) `ATTR(info="GATESIDE EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real MJS = 0.900 from (-inf:inf) `ATTR(info="AREA EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real MJSWS = 0.700 from (-inf:inf) `ATTR(info="SIDEWAYS EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real MJSWGS = 0.700 from (-inf:inf) `ATTR(info="GATESIDE EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real XTIS = 3.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); - -parameter real XTSS = 0.0 from (-inf:inf) `ATTR(info="AREA COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real XTSSWS = 0.0 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real XTSSWGS = 0.0 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real XTIS = 3.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real TNJTSS = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSS (AREA), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real TNJTSSWS = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSSWS (SIDEWAYS), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real TNJTSSWGS = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSSWGS (GATESIDE), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real XTSS = 0.0 from (-inf:inf) `ATTR(info="AREA COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real XTSSWS = 0.0 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real XTSSWGS = 0.0 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); + +parameter real TNJTSS = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSS (AREA), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real TNJTSSWS = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSSWS (SIDEWAYS), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); +parameter real TNJTSSWGS = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSSWGS (GATESIDE), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); // BOTH SIDES -parameter real TCJ = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJS AND CJD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); -parameter real TCJSW = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJSWS AND CJSWD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); -parameter real TCJSWG = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJSWGS AND CJSWGD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); - -parameter real TPB = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBS AND PBD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); -parameter real TPBSW = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBSWS AND PBSWD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); -parameter real TPBSWG = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBSWGS AND PBSWGD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); +parameter real TCJ = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJS AND CJD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); +parameter real TCJSW = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJSWS AND CJSWD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); +parameter real TCJSWG = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJSWGS AND CJSWGD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); + +parameter real TPB = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBS AND PBD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); +parameter real TPBSW = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBSWS AND PBSWD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); +parameter real TPBSWG = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBSWGS AND PBSWGD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); // DRAIN SIDE -parameter real NJD = 1.0 from (-inf:inf) `ATTR(info="SLOPE FACTOR FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real XJBVD = 0.0 from (-inf:inf) `ATTR(info="BREAK-DOWN EFFECT COEFFICIENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real BVD = 10.0 from (-inf:inf) `ATTR(info="BREAK-DOWN VOLTAGE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real NJD = 1.0 from (-inf:inf) `ATTR(info="SLOPE FACTOR FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real XJBVD = 0.0 from (-inf:inf) `ATTR(info="BREAK-DOWN EFFECT COEFFICIENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real BVD = 10.0 from (-inf:inf) `ATTR(info="BREAK-DOWN VOLTAGE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); + +parameter real JSD = 0.0E-09 from (-inf:inf) `ATTR(info="AREA COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real JSSWD = 0.0E-12 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real JSSWGD = 0.0E-12 from (-inf:inf) `ATTR(info="GATE-SIDE COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real JSD = 0.0E-09 from (-inf:inf) `ATTR(info="AREA COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real JSSWD = 0.0E-12 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real JSSWGD = 0.0E-12 from (-inf:inf) `ATTR(info="GATE-SIDE COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real JTSD = 0.0E-09 from (-inf:inf) `ATTR(info="AREA COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real JTSSWD = 0.0E-12 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real JTSSWGD = 0.0E-12 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real JTSD = 0.0E-09 from (-inf:inf) `ATTR(info="AREA COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real JTSSWD = 0.0E-12 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real JTSSWGD = 0.0E-12 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real NJTSD = 1.0 from (-inf:inf) `ATTR(info="AREA SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real NJTSSWD = 1.0 from (-inf:inf) `ATTR(info="SIDEWAYS SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real NJTSSWGD = 1.0 from (-inf:inf) `ATTR(info="GATESIDE SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real NJTSD = 1.0 from (-inf:inf) `ATTR(info="AREA SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real NJTSSWD = 1.0 from (-inf:inf) `ATTR(info="SIDEWAYS SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real NJTSSWGD = 1.0 from (-inf:inf) `ATTR(info="GATESIDE SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real VTSD = 0.0 from (-inf:inf) `ATTR(info="AREA VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real VTSSWD = 0.0 from (-inf:inf) `ATTR(info="SIDEWAYS VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real VTSSWGD = 0.0 from (-inf:inf) `ATTR(info="GATESIDE VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real VTSD = 0.0 from (-inf:inf) `ATTR(info="AREA VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real VTSSWD = 0.0 from (-inf:inf) `ATTR(info="SIDEWAYS VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real VTSSWGD = 0.0 from (-inf:inf) `ATTR(info="GATESIDE VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real CJD = 0.0E-06 from (-inf:inf) `ATTR(info="AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real CJSWD = 0.0E-09 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real CJSWGD = 0.0E-09 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real CJD = 0.0E-06 from (-inf:inf) `ATTR(info="AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real CJSWD = 0.0E-09 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real CJSWGD = 0.0E-09 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real PBD = 0.800 from (-inf:inf) `ATTR(info="AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real PBSWD = 0.600 from (-inf:inf) `ATTR(info="SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real PBSWGD = 0.600 from (-inf:inf) `ATTR(info="GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real PBD = 0.800 from (-inf:inf) `ATTR(info="AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real PBSWD = 0.600 from (-inf:inf) `ATTR(info="SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real PBSWGD = 0.600 from (-inf:inf) `ATTR(info="GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real MJD = 0.900 from (-inf:inf) `ATTR(info="AREA EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real MJSWD = 0.700 from (-inf:inf) `ATTR(info="SIDEWAYS EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real MJSWGD = 0.700 from (-inf:inf) `ATTR(info="GATESIDE EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real MJD = 0.900 from (-inf:inf) `ATTR(info="AREA EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real MJSWD = 0.700 from (-inf:inf) `ATTR(info="SIDEWAYS EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real MJSWGD = 0.700 from (-inf:inf) `ATTR(info="GATESIDE EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real XTID = 3.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real XTID = 3.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); - -parameter real XTSD = 0.0 from (-inf:inf) `ATTR(info="AREA COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real XTSSWD = 0.0 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real XTSSWGD = 0.0 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real XTSD = 0.0 from (-inf:inf) `ATTR(info="AREA COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real XTSSWD = 0.0 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real XTSSWGD = 0.0 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real TNJTSD = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSS (AREA), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real TNJTSSWD = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSSWS (SIDEWAYS), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real TNJTSSWGD = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSSWGS (GATESIDE), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real TNJTSD = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSS (AREA), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real TNJTSSWD = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSSWS (SIDEWAYS), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); +parameter real TNJTSSWGD = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSSWGS (GATESIDE), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); // PARAMETERS RF -parameter real RGSH = 3.0 from [0.0:inf) `ATTR(info="GATE SHEET REISTANCE"); -parameter real GC = 1 from [1.0:2.0] `ATTR(info="TYPE OF GATE CONTACTS (GC = 1: SINLGE SIDED, GC = 2: BOTH SIDES)"); -parameter real KRGL1 = 0.0 from [0.0:inf) `ATTR(info="GATE RESISTANCE LENGTH SCALING PARAMETER"); -parameter real RDSBSH = 1.0E+3 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK SHEET RESISTANCE BETWEEN INTERNAL DRAIN AND SOURCE NODES (USED AT RF AND NQS MODES)"); -parameter real RBWSH = 3.0E-3 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK BULK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL BULK AND EXTERNAL BULK NODES (USED AT RF4, RF AND NQS MODES)"); -parameter real RBN = 0.0 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK BULK RESISTANCE PER FINGER BETWEEN INTERNAL BULK AND EXTERNAL BULK NODES (USED AT RF4, RF AND NQS MODES)"); -parameter real RSBWSH = 1.0E-3 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL SOURCE AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)"); -parameter real RSBN = 0.0 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK RESISTANCE PER FINGER BETWEEN INTERNAL SOURCE AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)"); -parameter real RDBWSH = 1.0E-3 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL DRAIN AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)"); -parameter real RDBN = 0.0 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK RESISTANCE PER FINGER BETWEEN INTERNAL DRAIN AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)"); -parameter real RINGTYPE = 1.0 from [0.0:inf) `ATTR(info="RINGTYPE, SHAPE OF BULK CONNECTOR (RINGTYPE = 1 FOR HORSE-SHOE, THREE SIDES CONTACT, RINGTYPE = 2 FOR SYMMETRIC, TWO SIDES CONTACT), (USED AT RF4, RF AND NQS MODES)"); +parameter real RGSH = 3.0 from [0.0:inf) `ATTR(info="GATE SHEET REISTANCE"); +parameter real GC = 1 from [1.0:2.0] `ATTR(info="TYPE OF GATE CONTACTS (GC = 1: SINLGE SIDED, GC = 2: BOTH SIDES)"); +parameter real KRGL1 = 0.0 from [0.0:inf) `ATTR(info="GATE RESISTANCE LENGTH SCALING PARAMETER"); +parameter real RDSBSH = 1.0E+3 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK SHEET RESISTANCE BETWEEN INTERNAL DRAIN AND SOURCE NODES (USED AT RF AND NQS MODES)"); +parameter real RBWSH = 3.0E-3 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK BULK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL BULK AND EXTERNAL BULK NODES (USED AT RF4, RF AND NQS MODES)"); +parameter real RBN = 0.0 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK BULK RESISTANCE PER FINGER BETWEEN INTERNAL BULK AND EXTERNAL BULK NODES (USED AT RF4, RF AND NQS MODES)"); +parameter real RSBWSH = 1.0E-3 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL SOURCE AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)"); +parameter real RSBN = 0.0 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK RESISTANCE PER FINGER BETWEEN INTERNAL SOURCE AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)"); +parameter real RDBWSH = 1.0E-3 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL DRAIN AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)"); +parameter real RDBN = 0.0 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK RESISTANCE PER FINGER BETWEEN INTERNAL DRAIN AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)"); +parameter real RINGTYPE = 1.0 from [0.0:inf) `ATTR(info="RINGTYPE, SHAPE OF BULK CONNECTOR (RINGTYPE = 1 FOR HORSE-SHOE, THREE SIDES CONTACT, RINGTYPE = 2 FOR SYMMETRIC, TWO SIDES CONTACT), (USED AT RF4, RF AND NQS MODES)"); diff --git a/code/ekv3_include/ekv3_variables.va b/code/ekv3_include/ekv3_variables.va index 12b81c3..3645b90 100644 --- a/code/ekv3_include/ekv3_variables.va +++ b/code/ekv3_include/ekv3_variables.va @@ -6,558 +6,558 @@ // Variables in the file: ekv3.va -real QON; -real TSI; -real TOX; -real TOX2; -real LC; -integer even_nf; -real TNOMK; -real UTNOM; -real hdif; -real ldif; -real NF_M; -real SIGN_NF; -real SIGN_M; -real SIGN_NF_M; -real l; -real WF; -real w; -real Leff; -real Weff; -real Leffc; -real Weffc; -real WeffNF; -real WeffcNF; -real WLeff; -real WLeffNF; -real Leff2; -real rWedge; -real rWNedge; -real rWNWedge; -real awl; -real VTO_a; -real GAMMA_a; -real KP_a; -real DVT_long; -real DVT_wide; -real DGAMMA_long; -real DGAMMA_wide; -real DVT_nf; -real LR_w; -real QLR_w; -real NLR_w; -real E0_w; -real E1_w; -real UCRIT_w; -real LAMBDA_w; -real ETAD_w; -real TCV_w; -real UCEX_w; -real WR_l; -real QWR_l; -real NWR_l; -real TCV_wl; -real TCV_wlc; -real Leff_o_LR; -real tmp_rsce; -real f_rsce; -real DVT_rsce; -real fn_rsce; -real MGAMMA_rcse; -real DPHIF_rsce; -real Weff_o_WR; -real tmp_inwe; -real f_inwe; -real DVT_inwe; -real MGAMMA_inwe; -real Leff_o_LA; -real Leff_o_LB; -real MKP_l; -real tmp_kpw; -real MKP_w; -real lhalf_sti; -real SA_lhalf_sti; -real SB_lhalf_sti; -real SD_l_sti; -real i_sti; -real inv_sa05l; -real inv_sb05l; -real inv_saref05l; -real inv_sbref05l; -real tmpl; -real tmpw; -real KKP_sti; -real a_sti; -real aref_sti; -real MKP_sti; -real MUCRIT_sti; -real KVTO_sti; -real b_sti; -real DVT_sti; -real DGAMMA_sti; -real DETAD_sti; -real VTO_DEV; -real GAMMA_DEV; -real PHIF_DEV; -real KP_DEV; -real ETAD_DEV; -real UCRIT_DEV; -real CHSHL; -real CHSHW; -real NUV; -real CHSHLTSI; -real CHSHWTSI; -real T; -real dT; -real dT2; -real rT; -real lnrT; -real UT; -real UT2; -real UT3; -real sqrtUT; -real KT4; -real KKP_sti_t; -real a_sti_t; -real aref_sti_t; -real MKP_sti_t; -real VTO_DEV_t; -real KP_DEV_t; -real ETA_t; -real E0_wt; -real E1_wt; -real UCRIT_DEV_t; -real LAMBDA_wt; -real IBB_t; -real eg_tnom; -real eg_t; -real PHIF_DEV_t; -real phif; -real sqrtphif; -real vto; -real gamma_b_dev; -real gamma_b_dev2; -real gamma_g; -real gamma_g2; -real dpd; -real gamma_ov; -real gamma_g_ov; -real vfb_ov; -real gamma_ov2; -real ucrit; -real xb; -real ub; -real ev; -real tmp; -real tmp1; -real tmp2; -real tmp3; -real ev1; -real nq0; -real aqma; -real axetaqm2_3; -real dqmi; -real inv_dqmip1; -real dpsi0; -real DPSI0; -real phi; -real sqrtphi; -real nul; -real vbi; -real sqrtvbi; -real Q0; -real Q0OV; -real VS; -real VD; -real VG; -real d_gt_s_flag; -real d_gt_s; -real s_gt_d; -real vd; -real vs; -real vg; -real chsh_1w; -real tmp_chsh1; -real tmp_chsh2; -real tmp_chsh3; -real tmp_chsh3b; -real tmp_chsh4; -real chsh_1l; -real chsh_1wl; -real chsh_1wlpd; -real gamma_b_chsh; -real gamma_b_chsh2; -real gamma_b_eff; -real gamma_b_eff2; -real chsh_1l0; -real chsh_1wl0; -real chsh_1wlpd0; -real gamma_b_chsh0; -real gamma_b_chsh02; -real tmp_vfb; -real vfb; -real vg_p; -real vg_p_chsh; -real vg_p_chsh_pd; -real vg_p_chsh_pd0; -real psi_po; -real psi_po0; -real psi_p; -real psi_p0; -real one_m_epsilon; -real sqrt_psi_p; -real sqrt_psi_p0; -real vp; -real nv; -real deltapsis; -real vp_dibl; -real qs; -real l0; -real v_o_dibl; -real v_o_dibl2; -real dv_dibl; -real qs2; -real if_; -real xf2; -real xf; -real g_clm; -real e_clm; -real e_clm2; -real e_clmx2; -real e_clmp2; -real e_clmx2xqs; -real qsat; -real qs_qsat; -real qs_qsat2; -real mdm2; -real e_clmxmdm2_2; -real tmp_vdsat1; -real tmp_vdsat11; -real tmp_vdsat2; -real vdsat; -real dv_clm; -real vdssat; -real tmp_vdp1; -real tmp_vdp2; -real tmp_vdp3; -real vdp; -real u_clm; -real alpha_clm; -real deltal; -real qdp; -real qdp2; -real irp; -real xrp2; -real xrp; -real qsqdp; -real qs_qdp; -real powqs_qdp2; -real qsqdpp1; -real powqsqdpp1_2; -real i; -real nq; -real v_o; -real qr1; -real qbo; -real dpsiv; -real v_o_qme; -real qS; -real qD; -real qG; -real qI; -real qB; -real beta_coul; -real nu; -real gpnu; -real eq; -real eq1; -real beta_nom; -real beta_denom; -real beta; -real beta_clm_denom; -//real i0; -real Ispec; -real Gspec; -real dits_factor; -real Ispec_dits; -real Gspec_dits; -real f_dits; -real va_dits; -real vdseff; -real QS; -real QD; -real QG; -real QB; -real IDS; +real QON; +real TSI; +real TOX; +real TOX2; +real LC; +integer even_nf; +real TNOMK; +real UTNOM; +real hdif; +real ldif; +real NF_M; +real SIGN_NF; +real SIGN_M; +real SIGN_NF_M; +real l; +real WF; +real w; +real Leff; +real Weff; +real Leffc; +real Weffc; +real WeffNF; +real WeffcNF; +real WLeff; +real WLeffNF; +real Leff2; +real rWedge; +real rWNedge; +real rWNWedge; +real awl; +real VTO_a; +real GAMMA_a; +real KP_a; +real DVT_long; +real DVT_wide; +real DGAMMA_long; +real DGAMMA_wide; +real DVT_nf; +real LR_w; +real QLR_w; +real NLR_w; +real E0_w; +real E1_w; +real UCRIT_w; +real LAMBDA_w; +real ETAD_w; +real TCV_w; +real UCEX_w; +real WR_l; +real QWR_l; +real NWR_l; +real TCV_wl; +real TCV_wlc; +real Leff_o_LR; +real tmp_rsce; +real f_rsce; +real DVT_rsce; +real fn_rsce; +real MGAMMA_rcse; +real DPHIF_rsce; +real Weff_o_WR; +real tmp_inwe; +real f_inwe; +real DVT_inwe; +real MGAMMA_inwe; +real Leff_o_LA; +real Leff_o_LB; +real MKP_l; +real tmp_kpw; +real MKP_w; +real lhalf_sti; +real SA_lhalf_sti; +real SB_lhalf_sti; +real SD_l_sti; +real i_sti; +real inv_sa05l; +real inv_sb05l; +real inv_saref05l; +real inv_sbref05l; +real tmpl; +real tmpw; +real KKP_sti; +real a_sti; +real aref_sti; +real MKP_sti; +real MUCRIT_sti; +real KVTO_sti; +real b_sti; +real DVT_sti; +real DGAMMA_sti; +real DETAD_sti; +real VTO_DEV; +real GAMMA_DEV; +real PHIF_DEV; +real KP_DEV; +real ETAD_DEV; +real UCRIT_DEV; +real CHSHL; +real CHSHW; +real NUV; +real CHSHLTSI; +real CHSHWTSI; +real T; +real dT; +real dT2; +real rT; +real lnrT; +real UT; +real UT2; +real UT3; +real sqrtUT; +real KT4; +real KKP_sti_t; +real a_sti_t; +real aref_sti_t; +real MKP_sti_t; +real VTO_DEV_t; +real KP_DEV_t; +real ETA_t; +real E0_wt; +real E1_wt; +real UCRIT_DEV_t; +real LAMBDA_wt; +real IBB_t; +real eg_tnom; +real eg_t; +real PHIF_DEV_t; +real phif; +real sqrtphif; +real vto; +real gamma_b_dev; +real gamma_b_dev2; +real gamma_g; +real gamma_g2; +real dpd; +real gamma_ov; +real gamma_g_ov; +real vfb_ov; +real gamma_ov2; +real ucrit; +real xb; +real ub; +real ev; +real tmp; +real tmp1; +real tmp2; +real tmp3; +real ev1; +real nq0; +real aqma; +real axetaqm2_3; +real dqmi; +real inv_dqmip1; +real dpsi0; +real DPSI0; +real phi; +real sqrtphi; +real nul; +real vbi; +real sqrtvbi; +real Q0; +real Q0OV; +real VS; +real VD; +real VG; +real d_gt_s_flag; +real d_gt_s; +real s_gt_d; +real vd; +real vs; +real vg; +real chsh_1w; +real tmp_chsh1; +real tmp_chsh2; +real tmp_chsh3; +real tmp_chsh3b; +real tmp_chsh4; +real chsh_1l; +real chsh_1wl; +real chsh_1wlpd; +real gamma_b_chsh; +real gamma_b_chsh2; +real gamma_b_eff; +real gamma_b_eff2; +real chsh_1l0; +real chsh_1wl0; +real chsh_1wlpd0; +real gamma_b_chsh0; +real gamma_b_chsh02; +real tmp_vfb; +real vfb; +real vg_p; +real vg_p_chsh; +real vg_p_chsh_pd; +real vg_p_chsh_pd0; +real psi_po; +real psi_po0; +real psi_p; +real psi_p0; +real one_m_epsilon; +real sqrt_psi_p; +real sqrt_psi_p0; +real vp; +real nv; +real deltapsis; +real vp_dibl; +real qs; +real l0; +real v_o_dibl; +real v_o_dibl2; +real dv_dibl; +real qs2; +real if_; +real xf2; +real xf; +real g_clm; +real e_clm; +real e_clm2; +real e_clmx2; +real e_clmp2; +real e_clmx2xqs; +real qsat; +real qs_qsat; +real qs_qsat2; +real mdm2; +real e_clmxmdm2_2; +real tmp_vdsat1; +real tmp_vdsat11; +real tmp_vdsat2; +real vdsat; +real dv_clm; +real vdssat; +real tmp_vdp1; +real tmp_vdp2; +real tmp_vdp3; +real vdp; +real u_clm; +real alpha_clm; +real deltal; +real qdp; +real qdp2; +real irp; +real xrp2; +real xrp; +real qsqdp; +real qs_qdp; +real powqs_qdp2; +real qsqdpp1; +real powqsqdpp1_2; +real i; +real nq; +real v_o; +real qr1; +real qbo; +real dpsiv; +real v_o_qme; +real qS; +real qD; +real qG; +real qI; +real qB; +real beta_coul; +real nu; +real gpnu; +real eq; +real eq1; +real beta_nom; +real beta_denom; +real beta; +real beta_clm_denom; +//real i0; +real Ispec; +real Gspec; +real dits_factor; +real Ispec_dits; +real Gspec_dits; +real f_dits; +real va_dits; +real vdseff; +real QS; +real QD; +real QG; +real QB; +real IDS; `ifdef NQS -real Ispec_dits_seg; -real Q0_seg; -real v1; -real v2; -real q1; -real q2; -real i1; -real i2; -real q1q2; -real q1_q2; -real powq1_q22; -real q1q2p1; -real powq1q2p1_2; -real qq1; -real qq2; -`endif +real Ispec_dits_seg; +real Q0_seg; +real v1; +real v2; +real q1; +real q2; +real i1; +real i2; +real q1q2; +real q1_q2; +real powq1_q22; +real q1q2p1; +real powq1q2p1_2; +real qq1; +real qq2; +`endif // Variables in the file: ekv3_include/ekv3_extrinsic_diodes.va -real temp_arg_S; -real temp_arg_D; -real jss_t; -real jssws_t; -real jsswgs_t; -real pbs_t; -real pbsws_t; -real pbswgs_t; -real cjs_t; -real cjsws_t; -real cjswgs_t; -real jtss_t; -real jtssws_t; -real jtsswgs_t; -real njtss_t; -real njtssws_t; -real njtsswgs_t; -real jsd_t; -real jsswd_t; -real jsswgd_t; -real pbd_t; -real pbswd_t; -real pbswgd_t; -real cjd_t; -real cjswd_t; -real cjswgd_t; -real jtsd_t; -real jtsswd_t; -real jtsswgd_t; -real njtsd_t; -real njtsswd_t; -real njtsswgd_t; -real as; -real ps; -real ad; -real pd; -real v_sbj; -real v_dbj; -real is_s; -real arg_s; -real f_breakdown_s; -real isb; -real isb_tun; -real ISBJ; -real is_d; -real arg_d; -real f_breakdown_d; -real idb; -real idb_tun; -real IDBJ; -real cj_s; -real cjsw_s; -real cjswg_s; -real qj_s; -real qjsw_s; -real qjswg_s; -real CSBJ; -real QSBJ; -real cj_d; -real cjsw_d; -real cjswg_d; -real qj_d; -real qjsw_d; -real qjswg_d; -real CDBJ; -real QDBJ; +real temp_arg_S; +real temp_arg_D; +real jss_t; +real jssws_t; +real jsswgs_t; +real pbs_t; +real pbsws_t; +real pbswgs_t; +real cjs_t; +real cjsws_t; +real cjswgs_t; +real jtss_t; +real jtssws_t; +real jtsswgs_t; +real njtss_t; +real njtssws_t; +real njtsswgs_t; +real jsd_t; +real jsswd_t; +real jsswgd_t; +real pbd_t; +real pbswd_t; +real pbswgd_t; +real cjd_t; +real cjswd_t; +real cjswgd_t; +real jtsd_t; +real jtsswd_t; +real jtsswgd_t; +real njtsd_t; +real njtsswd_t; +real njtsswgd_t; +real as; +real ps; +real ad; +real pd; +real v_sbj; +real v_dbj; +real is_s; +real arg_s; +real f_breakdown_s; +real isb; +real isb_tun; +real ISBJ; +real is_d; +real arg_d; +real f_breakdown_d; +real idb; +real idb_tun; +real IDBJ; +real cj_s; +real cjsw_s; +real cjswg_s; +real qj_s; +real qjsw_s; +real qjswg_s; +real CSBJ; +real QSBJ; +real cj_d; +real cjsw_d; +real cjswg_d; +real qj_d; +real qjsw_d; +real qjswg_d; +real CDBJ; +real QDBJ; // Variables in the file: ekv3_include/ekv3_extrinsic_rc.va -real rs; -real rd; -real rs_w; -real rd_w; -real rg; -real rb; -real rsb; -real rdb; -real rdsb; -real Mr_t; -real rs_wt; -real rd_wt; -real rg_t; -real rb_t; -real rsb_t; -real rdb_t; -real rdsb_t; +real rs; +real rd; +real rs_w; +real rd_w; +real rg; +real rb; +real rsb; +real rdb; +real rdsb; +real Mr_t; +real rs_wt; +real rd_wt; +real rg_t; +real rb_t; +real rsb_t; +real rdb_t; +real rdsb_t; `ifdef DC_S -real RES_IDS; +real RES_IDS; `endif // Variables in the file: ekv3_include/ekv3_edge.va -real Ispec_dits_edge; -real Gspec_dits_edge; -real Q0_edge; -real dgamma_edge; -real dphi_edge; -real dvp_edge; -real vp_dibl_edge; -real qs_edge; -real qdp_edge; -real ids_edge; -real IDS_edge; -real psi_p_edge; -real sqrt_psi_p_edge; -real gamma_b_chsh_edge; -real nq_edge; -real qsqdp_edge; -real qs_qdp_edge; -real powqs_qdp2_edge; -real qsqdpp1_edge; -real powqsqdpp1_2_edge; -real qS_edge; -real qD_edge; -real qG_edge; -real qB_edge; -real QS_edge; -real QD_edge; -real QG_edge; -real QB_edge; +real Ispec_dits_edge; +real Gspec_dits_edge; +real Q0_edge; +real dgamma_edge; +real dphi_edge; +real dvp_edge; +real vp_dibl_edge; +real qs_edge; +real qdp_edge; +real ids_edge; +real IDS_edge; +real psi_p_edge; +real sqrt_psi_p_edge; +real gamma_b_chsh_edge; +real nq_edge; +real qsqdp_edge; +real qs_qdp_edge; +real powqs_qdp2_edge; +real qsqdpp1_edge; +real powqsqdpp1_2_edge; +real qS_edge; +real qD_edge; +real qG_edge; +real qB_edge; +real QS_edge; +real QD_edge; +real QG_edge; +real QB_edge; `ifdef DC_S -real RES_IDS_edge; +real RES_IDS_edge; `endif `ifdef NQS -real Ispec_dits_edge_seg; -real Q0_edge_seg; +real Ispec_dits_edge_seg; +real Q0_edge_seg; `endif // Variables in the file: ekv3_include/ekv3_overlap.va -real vgsov_p; -real gamma_dep_sov; -real gamma_acc_sov; -real v0_sov; -real a0_sov; -real a1_sov; -real a2_sov; -real a3_sov; -real v1_sov; -real dpsi_sov0; -real gamma_dep2_sov; -real a4_sov; -real v2_sov; -real dpsi_sov; -real v2b_sov; -real v3_sov; -real dpsiox_sov; -real vgdov_p; -real gamma_dep_dov; -real gamma_acc_dov; -real v0_dov; -real a0_dov; -real a1_dov; -real a2_dov; -real a3_dov; -real v1_dov; -real dpsi_dov0; -real gamma_dep2_dov; -real a4_dov; -real v2_dov; -real dpsi_dov; -real v2b_dov; -real v3_dov; -real dpsiox_dov; -real QSOV; -real QDOV; +real vgsov_p; +real gamma_dep_sov; +real gamma_acc_sov; +real v0_sov; +real a0_sov; +real a1_sov; +real a2_sov; +real a3_sov; +real v1_sov; +real dpsi_sov0; +real gamma_dep2_sov; +real a4_sov; +real v2_sov; +real dpsi_sov; +real v2b_sov; +real v3_sov; +real dpsiox_sov; +real vgdov_p; +real gamma_dep_dov; +real gamma_acc_dov; +real v0_dov; +real a0_dov; +real a1_dov; +real a2_dov; +real a3_dov; +real v1_dov; +real dpsi_dov0; +real gamma_dep2_dov; +real a4_dov; +real v2_dov; +real dpsi_dov; +real v2b_dov; +real v3_dov; +real dpsiox_dov; +real QSOV; +real QDOV; // Variables in the file: ekv3_include/ekv3_fringing.va -real QSFR; -real QDFR; +real QSFR; +real QDFR; // Variables in the file: ekv3_include/ekv3_gidl.va -real vgse; -real IGIDL; -real vgde; -real IGISL; +real vgse; +real IGIDL; +real vgde; +real IGISL; // Variables in the file: ekv3_include/ekv3_gate_current.va -real v1_gc; -real v2_gc; -real psi_ox; -real dpsi_dq; -real psi_x; -real p_tun; -real igo; -real nigc; -real nigs; -real nigd; -real dq_dksi; -real a_gc; -real b_gc; -real IGB; -real IG; -real IGD; -real IGS; -real psi_ox_sovgc; -real psi_x_sovgc; -real p_tun_sovgc; -real IGSOV; -real psi_ox_dovgc; -real psi_x_dovgc; -real p_tun_dovgc; -real IGDOV; +real v1_gc; +real v2_gc; +real psi_ox; +real dpsi_dq; +real psi_x; +real p_tun; +real igo; +real nigc; +real nigs; +real nigd; +real dq_dksi; +real a_gc; +real b_gc; +real IGB; +real IG; +real IGD; +real IGS; +real psi_ox_sovgc; +real psi_x_sovgc; +real p_tun_sovgc; +real IGSOV; +real psi_ox_dovgc; +real psi_x_dovgc; +real p_tun_dovgc; +real IGDOV; // Variables in the file: ekv3_include/ekv3_idb.va -real v_ib; -real IDB; +real v_ib; +real IDB; // Variables in the file: ekv3_include/ekv3_noise.va real NT_var; -real sddn; -real kddn; -real sidn; -real qel2; -real qel4; -real alpha; -real a_m; -real Qspec; -real LC_R; -real sddm; -real kddm; -real sidm; +real sddn; +real kddn; +real sidn; +real qel2; +real qel4; +real alpha; +real a_m; +real Qspec; +real LC_R; +real sddm; +real kddm; +real sidm; real Gspec_fn; -real sddr; +real sddr; real sidr; -real Snspec; -real gn; -real thermal; -real gmg_; -real flicker; -real omegaspec; -real OMEGA; -real snidid; -real snigig; -real snibib; -real snigid; -real c_igid; -real noise_ds1; -real noise_ds2; -real noise_g; -real noise_b; -real sig_shot; -real sig_flicker; +real Snspec; +real gn; +real thermal; +real gmg_; +real flicker; +real omegaspec; +real OMEGA; +real snidid; +real snigig; +real snibib; +real snigid; +real c_igid; +real noise_ds1; +real noise_ds2; +real noise_g; +real noise_b; +real sig_shot; +real sig_flicker; real sig_flicker_m; real flicker_m; @@ -568,21 +568,21 @@ real flicker_m; // Variables in the file: ekv3_include/ekv3_functions_def.va -real vv; -real z1; -real z2; -real ln_z1_; -real tmp_psi_sa; -real sqrt_psi_sa; -real z0; -real zk; -real v1_qg; -real v2_qg; -real k1; -real k2; -real k12; -real k12_2; -real k12_3; +real vv; +real z1; +real z2; +real ln_z1_; +real tmp_psi_sa; +real sqrt_psi_sa; +real z0; +real zk; +real v1_qg; +real v2_qg; +real k1; +real k2; +real k12; +real k12_2; +real k12_3; // Variables DC Operating Points diff --git a/code/ekv3_include/ekv3_variables_oppoint.va b/code/ekv3_include/ekv3_variables_oppoint.va index 2d824a7..b717cbb 100644 --- a/code/ekv3_include/ekv3_variables_oppoint.va +++ b/code/ekv3_include/ekv3_variables_oppoint.va @@ -4,16 +4,16 @@ ///////////////////////////////////////////////////////////////////////////// // OPPATTR function used for printing Opeating Points // insideADMS OPPATTR (*spice:name=1 , info=2 , unit=3 , ask="yes" *) -// else OPPATTR (* desc=2 , units=3 *) +// else OPPATTR (* desc=2 , units=3 *) ///////////////////////////////////////////////////////////////////////////// ///// POTENTIAL INFO /////////////////////// -`OPPATTR("VS","VS","V") real VS; -`OPPATTR("VD","VD","V") real VD; -`OPPATTR("VG","VG","V") real VG; -`OPPATTR("VB","VB","V") real VB; -`OPPATTR("VDS","VDS","V") real VDS; +`OPPATTR("VS","VS","V") real VS; +`OPPATTR("VD","VD","V") real VD; +`OPPATTR("VG","VG","V") real VG; +`OPPATTR("VB","VB","V") real VB; +`OPPATTR("VDS","VDS","V") real VDS; `OPPATTR("VGS","VGS","V") real VGS; `OPPATTR("VBS","VBS","V") real VBS; `OPPATTR("VDB","VDB","V") real VDB; @@ -28,8 +28,8 @@ `OPPATTR("IBex","Extrinsic Current Bulk Side","A") real IB; /////////////////////////////////////////////// `OPPATTR("n","Slope Factor n","") real slopefactor; -//`OPPATTR("nq","Inversion Charge Linearization Factor","") real nq; -`OPPATTR("Vp","Pinch-Off Voltage","") real Vp; +//`OPPATTR("nq","Inversion Charge Linearization Factor","") real nq; +`OPPATTR("Vp","Pinch-Off Voltage","") real Vp; `OPPATTR("VOD","Overdrive Voltage n*(Vp-Vs)","V") real VOD; `OPPATTR("VDSAT","Saturation Voltage","V") real VDSAT; `OPPATTR("sat","Saturation Flag","s") real sat; @@ -43,9 +43,9 @@ `OPPATTR("Nf","Number of fingers","") real Nf; //////CURRENT - CHARGE INFO //////////////////// //`OPPATTR("if","Forward Normalized Current","") real if_; -//`OPPATTR("irp","Reverse Normalized Current","") real irp; +//`OPPATTR("irp","Reverse Normalized Current","") real irp; //`OPPATTR("qs","Normalized Source Inversion Charge","") real qs; -//`OPPATTR("qdp","Normalized Drain Inversion Charge","") real qdp; +//`OPPATTR("qdp","Normalized Drain Inversion Charge","") real qdp; `OPPATTR("IC","Inversion Coefficient","")real ic ; `OPPATTR("ISPEC","Specific Current","A") real ISPEC; //////TRANCONDUCTANCE INFO ////////////////// From fac4444a73b6297879c50a970746146b33778ad5 Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 17 Apr 2024 19:46:11 +0200 Subject: [PATCH 02/14] use macros for parameter definitions --- code/ekv3_include/ekv3_definitions.va | 75 +++- code/ekv3_include/ekv3_parameters.va | 544 +++++++++++++------------- 2 files changed, 334 insertions(+), 285 deletions(-) diff --git a/code/ekv3_include/ekv3_definitions.va b/code/ekv3_include/ekv3_definitions.va index 335c102..fd373cf 100644 --- a/code/ekv3_include/ekv3_definitions.va +++ b/code/ekv3_include/ekv3_definitions.va @@ -12,6 +12,9 @@ // Boltzmann constant [J/K] `define C_K (1.3807E-23) +// zero Celsius in Kelvin +`define P_CELSIUS0 273.15 + // Thermal Potential, as a function of temperature (T) in K. `define UT(T) ((`C_K * (T)) / `C_QE) @@ -59,14 +62,78 @@ `define ATTR(txt) `endif - `ifdef insideADMS +`ifdef insideADMS `define OPPATTR(n,d,u) (* spice:name=n, info=d , unit=u , ask="yes" *) - `else +`else `define OPPATTR(n,d,u) (* desc=d , units=u *) - `endif +`endif `define abs_ddx(a,b) abs(ddx(a,b)) `define DEFINITIONS_INCLUDE `endif -`define IPRcc(des) (*type="instance", desc=des*) +// +// Parameter definition macros: "des" description argument is intended to +// be a short description, the "inf" information argument is intended to be +// a detailed description (e.g. for display as part of on-line help). +// +// MPR model parameter real +// MPI model parameter integer +// IPR instance parameter real +// IPI instance parameter integer +// OPP operating point parameter, includes units and description for printing +// OPM operating point parameter, scales with $mfactor +// OPD operating point parameter, scales with 1/$mfactor +// +// Instance parameters have the attribute *type="instance"* and note that +// compilers treat these as both instance and model parameters, with a +// specified instance value taking precedence over a specified model card value. +// +// There are some issues with passing range directives with some compilers, +// so for each parameter declaration there are multiple versions: +// cc closed lower bound, closed upper bound +// co closed lower bound, open upper bound +// cz closed lower bound of zero (no upper bound) +// oc open lower bound, closed upper bound +// oo open lower bound, open upper bound +// oz open lower bound of zero (no upper bound) +// nb no bounds +// sw switch (integer only, values 0=false and >0=true) +// ty switch (integer only, values -1=n-type and +1=p-type) +// + +`define ALIAS(alias,paramName) aliasparam alias = paramName; +`define OPP(nam,uni,des) (*units=uni, desc=des*) real nam; +`define OPM(nam,uni,des) (*units=uni, multiplicity="multiply", desc=des*) real nam; +`define OPD(nam,uni,des) (*units=uni, multiplicity="divide", desc=des*) real nam; +`define MPRcc(nam,def,uni,lwr,upr,des) (*units=uni, ask="yes", desc=des*) parameter real nam=def from[lwr:upr]; +`define MPRco(nam,def,uni,lwr,upr,des) (*units=uni, ask="yes", desc=des*) parameter real nam=def from[lwr:upr); +`define MPRcz(nam,def,uni, des) (*units=uni, ask="yes", desc=des*) parameter real nam=def from[ 0:inf); +`define MPRoc(nam,def,uni,lwr,upr,des) (*units=uni, ask="yes", desc=des*) parameter real nam=def from(lwr:upr]; +`define MPRoo(nam,def,uni,lwr,upr,des) (*units=uni, ask="yes", desc=des*) parameter real nam=def from(lwr:upr); +`define MPRoz(nam,def,uni, des) (*units=uni, ask="yes", desc=des*) parameter real nam=def from( 0:inf); +`define MPRnb(nam,def,uni, des) (*units=uni, ask="yes", desc=des*) parameter real nam=def; +`define MPIcc(nam,def,uni,lwr,upr,des) (*units=uni, ask="yes", desc=des*) parameter integer nam=def from[lwr:upr]; +`define MPIco(nam,def,uni,lwr,upr,des) (*units=uni, ask="yes", desc=des*) parameter integer nam=def from[lwr:upr); +`define MPIcz(nam,def,uni, des) (*units=uni, ask="yes", desc=des*) parameter integer nam=def from[ 0:inf); +`define MPIoc(nam,def,uni,lwr,upr,des) (*units=uni, ask="yes", desc=des*) parameter integer nam=def from(lwr:upr]; +`define MPIoo(nam,def,uni,lwr,upr,des) (*units=uni, ask="yes", desc=des*) parameter integer nam=def from(lwr:upr); +`define MPIoz(nam,def,uni, des) (*units=uni, ask="yes", desc=des*) parameter integer nam=def from( 0:inf); +`define MPInb(nam,def,uni, des) (*units=uni, ask="yes", desc=des*) parameter integer nam=def; +`define MPIsw(nam,def,uni, des) (*units=uni, ask="yes", desc=des*) parameter integer nam=def from[ 0:inf); +`define MPIty(nam,def,uni, des) (*units=uni, ask="yes", desc=des*) parameter integer nam=def from[ -1: 1] exclude 0; +`define IPRcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", ask="yes", desc=des*) parameter real nam=def from[lwr:upr]; +`define IPRco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", ask="yes", desc=des*) parameter real nam=def from[lwr:upr); +`define IPRcz(nam,def,uni, des) (*units=uni, type="instance", ask="yes", desc=des*) parameter real nam=def from[ 0:inf); +`define IPRoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", ask="yes", desc=des*) parameter real nam=def from(lwr:upr]; +`define IPRoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", ask="yes", desc=des*) parameter real nam=def from(lwr:upr); +`define IPRoz(nam,def,uni, des) (*units=uni, type="instance", ask="yes", desc=des*) parameter real nam=def from( 0:inf); +`define IPRnb(nam,def,uni, des) (*units=uni, type="instance", ask="yes", desc=des*) parameter real nam=def; +`define IPIcc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", ask="yes", desc=des*) parameter integer nam=def from[lwr:upr]; +`define IPIco(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", ask="yes", desc=des*) parameter integer nam=def from[lwr:upr); +`define IPIcz(nam,def,uni, des) (*units=uni, type="instance", ask="yes", desc=des*) parameter integer nam=def from[ 0:inf); +`define IPIoc(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", ask="yes", desc=des*) parameter integer nam=def from(lwr:upr]; +`define IPIoo(nam,def,uni,lwr,upr,des) (*units=uni, type="instance", ask="yes", desc=des*) parameter integer nam=def from(lwr:upr); +`define IPIoz(nam,def,uni, des) (*units=uni, type="instance", ask="yes", desc=des*) parameter integer nam=def from( 0:inf); +`define IPInb(nam,def,uni, des) (*units=uni, type="instance", ask="yes", desc=des*) parameter integer nam=def; +`define IPIsw(nam,def,uni, des) (*units=uni, type="instance", ask="yes", desc=des*) parameter integer nam=def from[ 0:inf); diff --git a/code/ekv3_include/ekv3_parameters.va b/code/ekv3_include/ekv3_parameters.va index 06f1f66..af9fde2 100644 --- a/code/ekv3_include/ekv3_parameters.va +++ b/code/ekv3_include/ekv3_parameters.va @@ -2,54 +2,39 @@ // INSTANCE PARAMETERS // ///////////////////////// -//parameter real L = 10.0E-06 from [1.0E-9:inf) `ATTR(type="instance" info="GATE'S LENGTH"); -//parameter real W = 10.0E-06 from [1.0E-9:inf) `ATTR(type="instance" info="GATE'S WIDTH"); -//parameter integer NF = 1 from [1:inf) `ATTR(type="instance" info="NUMBER OF FINGERS"); -//parameter real M = 1 from [1:inf) `ATTR(type="instance" info="NUMBER OF DEVICES IN PARALLEL"); -//parameter real AD = 0.0 from [0.0:inf) `ATTR(type="instance" info="DRAIN'S AREA"); -//parameter real AS = 0.0 from [0.0:inf) `ATTR(type="instance" info="SOURCE'S AREA"); -//parameter real PD = 0.0 from [0.0:inf) `ATTR(type="instance" info="DRAIN'S PERIMETER"); -//parameter real PS = 0.0 from [0.0:inf) `ATTR(type="instance" info="SOURCE'S PERIMETER"); -//parameter real SA = 0.0 from [0.0:inf) `ATTR(type="instance" info="STI PARAMETER; DISTANCE FROM STI (SIDE A)"); -//parameter real SB = 0.0 from [0.0:inf) `ATTR(type="instance" info="STI PARAMETER; DISTANCE FROM STI (SIDE B)"); -//parameter real SD = 0.0 from [0.0:inf) `ATTR(type="instance" info="STI PARAMETER; DISTANCE BETWEEN GATES"); - - - -(* type="instance" *) parameter real L = 10.0E-06 from [1.0E-9:inf) ; -(* type="instance" *) parameter real W = 10.0E-06 from [1.0E-9:inf) ; -(* type="instance" *) parameter integer NF = 1 from [1:inf) ; -(* type="instance" *) parameter real M = 1 from [1:inf) ; -(* type="instance" *) parameter real AD = 0.0 from [0.0:inf) ; -(* type="instance" *) parameter real AS = 0.0 from [0.0:inf) ; -(* type="instance" *) parameter real PD = 0.0 from [0.0:inf) ; -(* type="instance" *) parameter real PS = 0.0 from [0.0:inf) ; - -(* type="instance" *) parameter real SA = 0.0 from [0.0:inf) ; -(* type="instance" *) parameter real SB = 0.0 from [0.0:inf) ; -(* type="instance" *) parameter real SD = 0.0 from [0.0:inf) ; - + `IPRco( L , 1.0e-5 , "m" , 1e-9 , inf , "Gate Length" ) + `IPRco( W , 1.0e-5 , "m" , 1e-9 , inf , "Total Gate Width" ) + `IPIco( NF , 1 , "" , 1 , inf , "Number of Fingers" ) + `IPIco( M , 1 , "" , 1 , inf , "Multiplicity Factor" ) + `IPRcz( AS , 0.0 , "m^2" , "Area of Source Active Area" ) + `IPRcz( AD , 0.0 , "m^2" , "Area of Drain Active Area" ) + `IPRcz( PS , 0.0 , "m" , "Perimeter of Source Active Area" ) + `IPRcz( PD , 0.0 , "m" , "Perimeter of Drain Active Area" ) + + `IPRcz( SA , 0.0 , "m" , "Distance of first gate finger from STI (one side)" ) + `IPRcz( SB , 0.0 , "m" , "Distance of last gate finger from STI (other side)" ) + `IPRcz( SD , 0.0 , "m" , "Distance between neighbouring gate fingers" ) //////////////////////////////// // FLAGS AND SETUP PARAMETERS // //////////////////////////////// -parameter real SIGN = 1 from [-1:1] `ATTR(info="SIGN = 1 FOR NMOS; SIGN = -1 FOR PMOS"); -parameter real TG = -1 from [-1:1] `ATTR(info="TYPE OF GATE: -1 ENHANCEMENT TYPE; 1 DEPLETION TYPE"); -parameter real TNOM = 27.0 from [-273.15:inf) `ATTR(info="NOMINAL TEMPERATURE FOR MODEL PARAMETERS"); -parameter real SCALE = 1.0 from (0.0:inf) `ATTR(info="SCALING SIZE FACTOR"); -parameter real XL = 0.0 from (-inf:inf) `ATTR(info="OPTICAL OFFSET FOR CHANNEL LENGTH"); -parameter real XW = 0.0 from (-inf:inf) `ATTR(info="OPTICAL OFFSET FOR CHANNEL WIDTH"); -parameter real NQS_NOI = 1.0 from [0:1] `ATTR(info="FLAG TURNING ON NQS THERMAL NOISE MODEL. (NOT BOTH NQS_NOI AND TH_NOI SHOULD BE SET TO 1)."); -parameter real TH_NOI = 0.0 from [0:1] `ATTR(info="FLAG TURNING ON SHORT CHANNEL EFFECTS THERMAL NOISE MODEL. (NOT BOTH NQS_NOI AND TH_NOI SHOULD BE SET TO 1)."); -parameter real INFO_LEVEL = 0.0 from [0:inf) `ATTR(info="FLAG FOR INFORMATION PRINTOUT. CURRENTLY ONLY VALUE OF 1 IS SUPPORTED."); -parameter real QOFF = 0.0 from [0:1] `ATTR(info="FLAG FOR TURNING OFF THE DYNAMIC BEHAVIOUR OF THE MODEL (FOR DEBUGGING PURPOSES)"); + `MPIty( SIGN , 1 , "" , "SIGN = 1 FOR NMOS; SIGN = -1 FOR PMOS") + `MPIty( TG ,-1 , "" , "TYPE OF GATE: -1 ENHANCEMENT TYPE; 1 DEPLETION TYPE") + `MPRco( TNOM , 27.0 , "C" , -`P_CELSIUS0 , inf , "NOMINAL TEMPERATURE FOR MODEL PARAMETERS") + `MPRco( SCALE , 1.0 , "" , 1.0 , inf , "SCALING SIZE FACTOR") + `MPRnb( XL , 0.0 , "m" , "OPTICAL OFFSET FOR CHANNEL LENGTH") + `MPRnb( XW , 0.0 , "m" , "OPTICAL OFFSET FOR CHANNEL WIDTH") + `MPIsw( NQS_NOI , 1 , "" , "FLAG TURNING ON NQS THERMAL NOISE MODEL. (NOT BOTH NQS_NOI AND TH_NOI SHOULD BE SET TO 1).") + `MPIsw( TH_NOI , 0 , "" , "FLAG TURNING ON SHORT CHANNEL EFFECTS THERMAL NOISE MODEL. (NOT BOTH NQS_NOI AND TH_NOI SHOULD BE SET TO 1).") + `MPIsw( INFO_LEVEL , 0 , "" , "FLAG FOR INFORMATION PRINTOUT. CURRENTLY ONLY VALUE OF 1 IS SUPPORTED.") + `MPIcc( QOFF , 0 , "" , 0, 1, "FLAG FOR TURNING OFF THE DYNAMIC BEHAVIOUR OF THE MODEL (FOR DEBUGGING PURPOSES)") // MATCHING -parameter real AVTO = 0.0 from (-inf:inf) `ATTR(info="MATCHING PARAMETER FOR THRESHOLD VOLTAGE (VTO)"); -parameter real AGAMMA = 0.0 from (-inf:inf) `ATTR(info="MATCHING PARAMETER FOR BODY FACTOR (GAMMA)"); -parameter real AKP = 0.0 from (-inf:inf) `ATTR(info="MATCHING PARAMETER FOR MOBILITY (KP)"); + `MPRnb( AVTO , 0.0 , "" , "MATCHING PARAMETER FOR THRESHOLD VOLTAGE (VTO)") + `MPRnb( AGAMMA , 0.0 , "" , "MATCHING PARAMETER FOR BODY FACTOR (GAMMA)") + `MPRnb( AKP , 0.0 , "" , "MATCHING PARAMETER FOR MOBILITY (KP)") ////////////////////// // MODEL PARAMETERS // @@ -57,219 +42,216 @@ parameter real AKP = 0.0 from (-inf:inf) `ATTR(info="MATCHING // OXIDE, SUBSTRATE AND GATE DOPING RELATED PARAMETERS (7(8)) -parameter real COX = 0.012 from (0.0:inf) `ATTR(info="OXIDE CAPACITANCE PER UNIT AREA"); -parameter real XJ = 20.0E-09 from (0.0:inf) `ATTR(info="DEPTH OF JUNCTION (SOURCE AND DRAIN)"); -parameter real VTO = 0.3 from (-inf:inf) `ATTR(info="THRESHOLD VOLTAGE"); -parameter real PHIF = 0.45 from [0.0:inf) `ATTR(info="FERMI BULK POTENTIAL"); -parameter real GAMMA = 0.3 from (0.0:inf) `ATTR(info="BODY EFFECT COEFFECIENT"); -parameter real GAMMAG = 4.1 from (0.0:inf) `ATTR(info="GATE DOPING COEFFICIENT FOR POLYSILICON DEPLETION EFFECT"); -parameter real N0 = 1.0 from [0.0:inf) `ATTR(info="WEAK INVERSION FINE TUNING PARAMETER"); -parameter real VBI = 0.0 from [0.0:inf) `ATTR(info="BUILT-IN VOLTAGE DROP-OFF. IF LEFT TO DEFAULT ZERO VALUE, IT IS SET TO THE NOMINAL VALUE OF 3UT HIGHER THAN PHI."); + `MPRoz( COX , 12E-3 , "F/m**2" , "OXIDE CAPACITANCE PER UNIT AREA") + `MPRoz( XJ , 20E-9 , "m" , "DEPTH OF JUNCTION (SOURCE AND DRAIN)") + `MPRnb( VTO , 0.3 , "V" , "THRESHOLD VOLTAGE") + `MPRco( PHIF , 0.45 , "V" , 0.1 , inf , "FERMI BULK POTENTIAL") + `MPRoz( GAMMA , 0.3 , "sqrt(V)" , "BODY EFFECT COEFFICIENT") + `MPRoz( GAMMAG , 4.1 , "sqrt(V)" , "GATE DOPING COEFFICIENT FOR POLYSILICON DEPLETION EFFECT") + `MPRnb( N0 , 1.0 , "" , "WEAK INVERSION FINE TUNING PARAMETER") + `MPRco( VBI , 0.0 , "V" , 0.0 , inf , "BUILT-IN VOLTAGE DROP-OFF. IF LEFT TO DEFAULT ZERO VALUE, IT IS SET TO THE NOMINAL VALUE OF 3UT HIGHER THAN PHI.") // QUANTUM EFFECTS (3) -parameter real AQMA = 0.5 from [0.0:inf) `ATTR(info="QUANTUM MECHANICAL EFFECT ACCUMULATION REGION COEFFICIENT"); -parameter real AQMI = 0.4 from [0.0:inf) `ATTR(info="QUANTUM MECHANICAL EFFECT INVERSION REGION COEFFICIENT"); -parameter real ETAQM = 0.75 from [0.0:inf) `ATTR(info="QUANTUM MECHANICAL EFFECT ACCUMULATION ETA PARAMETER"); + `MPRnb( AQMA , 0.5 , "" , "QUANTUM MECHANICAL EFFECT ACCUMULATION REGION COEFFICIENT") + `MPRnb( AQMI , 0.4 , "" , "QUANTUM MECHANICAL EFFECT INVERSION REGION COEFFICIENT") + `MPRoz( ETAQM , 0.75 , "" , "QUANTUM MECHANICAL EFFECT ACCUMULATION ETA PARAMETER") // VERTICAL FIELD MOBILITY EFFECTS PARAMETERS (4) -parameter real KP = 500.0E-06 from [0.0:inf) `ATTR(info="MOBILITY (MULTIPLIED BY COX) PARAMETER"); -parameter real E0 = 1.0E+10 from (0.0:inf) `ATTR(info="FIRST ORDER PARAMETER FOR MOBILITY REDUCTION DUE TO VERTICAL FIELD EFFECT"); -parameter real E1 = 3.1E+08 from (0.0:inf) `ATTR(info="SECOND ORDER PARAMETER FOR MOBILITY REDUCTION DUE TO VERTICAL FIELD EFFECT"); -parameter real ETA = 0.5 from [0.0:inf) `ATTR(info="INVERSION CHARGE COEFFICIENT FOR VERTICAL FIELD CALCULATION"); + `MPRoz( KP , 500E-6 , "F/Vs" , "MOBILITY (MULTIPLIED BY COX) PARAMETER") + `MPRoz( E0 , 10E9 , "V/m" , "FIRST ORDER PARAMETER FOR MOBILITY REDUCTION DUE TO VERTICAL FIELD EFFECT") + `MPRoz( E1 , 310e6 , "V**2/m**2" , "SECOND ORDER PARAMETER FOR MOBILITY REDUCTION DUE TO VERTICAL FIELD EFFECT") + `MPRcz( ETA , 0.5 , "" , "INVERSION CHARGE COEFFICIENT FOR VERTICAL FIELD CALCULATION") // COULOMB SCATTERING (2) -parameter real THC = 0.0 from [0.0:inf) `ATTR(info="COULOMB SCATTERING PARAMETER"); -parameter real ZC = 1.0E-6 from [0.0:inf) `ATTR(info="COULOMB SCATTERING INVERSION CHARGE COEFFICIENT"); + `MPRcz( THC , 0.0 , "" , "COULOMB SCATTERING PARAMETER") + `MPRcz( ZC , 1e-6 , "" , "COULOMB SCATTERING INVERSION CHARGE COEFFICIENT") // MOBILITY RELATED GEOMETRICAL PARAMETERS (7) -parameter real LA = 1.0 from [0.0:inf) `ATTR(info="CRITICAL LENGTH A OF MOBILITY LENGTH SCALING"); -parameter real LB = 1.0 from [0.0:inf) `ATTR(info="CRITICAL LENGTH B OF MOBILITY LENGTH SCALING"); -parameter real KA = 0.0 from (-inf:inf) `ATTR(info="PARAMETER FOR CRITICAL LENGTH A OF MOBILITY LENGTH SCALING"); -parameter real KB = 0.0 from (-inf:inf) `ATTR(info="PARAMETER FOR CRITICAL LENGTH B OF MOBILITY LENGTH SCALING"); + `MPRoz( LA , 1.0, "m" , "CRITICAL LENGTH A OF MOBILITY LENGTH SCALING") + `MPRoz( LB , 1.0, "m" , "CRITICAL LENGTH B OF MOBILITY LENGTH SCALING") + `MPRnb( KA , 0.0, "" , "PARAMETER FOR CRITICAL LENGTH A OF MOBILITY LENGTH SCALING") + `MPRnb( KB , 0.0, "" , "PARAMETER FOR CRITICAL LENGTH B OF MOBILITY LENGTH SCALING") // LIMIT WKP1 CHANGES TO (-INF FROM [0 -parameter real WKP1 = 1.0E-6 from (-inf:inf) `ATTR(info="CRITICAL WIDTH OF MOBILITY WIDTH SCALING"); + `MPRoz( WKP1 , 1e-6, "m" , "CRITICAL WIDTH OF MOBILITY WIDTH SCALING" ) // LIMIT WKP2 CHANGES TO (-INF FROM [0 -parameter real WKP2 = 0.0 from (-inf:inf) `ATTR(info="AMPLITUDE PARAMETER FOR MOBILITY WIDTH SCALING"); + `MPRnb( WKP2 , 0.0, "" , "AMPLITUDE PARAMETER FOR MOBILITY WIDTH SCALING" ) // LIMIT WKP3 CHANGES TO (-INF FROM [0 -parameter real WKP3 = 1.0 from (-inf:inf) `ATTR(info="SPAN PARAMETER FOR MOBILITY WIDTH SCALING"); + `MPRoz( WKP3 , 1.0, "" , "SPAN PARAMETER FOR MOBILITY WIDTH SCALING" ) // GEOMETRICAL PARAMETERS (8) -parameter real DL = -10.0E-9 from (-inf:inf) `ATTR(info="EFFECTIVE LENGTH PARAMETER"); -parameter real DLC = 0.0 from (-inf:inf) `ATTR(info="EFFECTIVE LENGTH PARAMETER FOR DYNAMIC BEHAVIOUR"); -parameter real DW = -10.0E-9 from (-inf:inf) `ATTR(info="EFFECTIVE WIDTH PARAMETER"); -parameter real DWC = 0.0 from (-inf:inf) `ATTR(info="EFFECTIVE WIDTH PARAMETER FOR DYNAMIC BEHAVIOUR"); -parameter real WDL = 0.0 from (-inf:inf) `ATTR(info="EFFECTIVE LENGTH PARAMETER FOR NARROW CHANNEL DEVICES"); -parameter real LDW = 0.0 from (-inf:inf) `ATTR(info="EFFECTIVE WIDTH PARAMETER FOR SHORT CHANNEL DEVICES"); -parameter real LL = 0.0 from (-inf:inf) `ATTR(info="BASE OF EXPONENTIAL MODEL FOR EFFECTIVE LENGTH"); -parameter real LLN = 1.0 from (-inf:inf) `ATTR(info="EXPONENT OF EXPONENTIAL MODEL FOR EFFECTIVE LENGTH"); + `MPRoo( DL , -10e-9 , "m" , -inf , inf , "EFFECTIVE LENGTH PARAMETER") + `MPRoo( DLC , 0.0 , "m" , -inf , inf , "EFFECTIVE LENGTH PARAMETER FOR DYNAMIC BEHAVIOUR") + `MPRoo( DW , -10e-9 , "m" , -inf , inf , "EFFECTIVE WIDTH PARAMETER") + `MPRoo( DWC , 0.0 , "m" , -inf , inf , "EFFECTIVE WIDTH PARAMETER FOR DYNAMIC BEHAVIOUR") + `MPRco( WDL , 0.0 , "m**2" , 0.0 , inf , "EFFECTIVE LENGTH PARAMETER FOR NARROW CHANNEL DEVICES") + `MPRco( LDW , 0.0 , "m**2" , 0.0 , inf , "EFFECTIVE WIDTH PARAMETER FOR SHORT CHANNEL DEVICES") + `MPRoo( LL , 0.0 , "m" , -inf , inf , "BASE OF EXPONENTIAL MODEL FOR EFFECTIVE LENGTH") + `MPRco( LLN , 1.0 , "" , 0.0 , inf , "EXPONENT OF EXPONENTIAL MODEL FOR EFFECTIVE LENGTH") // LONG AND WIDE CHANNEL VTO AND GAMMA CORRECTION (8) -parameter real AVT = 0.0 from (-inf:inf) `ATTR(info="PARAMETER FOR LONG AND WIDE CHANNEL VTO CORRECTION"); -parameter real LVT = 1.0 from [0.0:inf) `ATTR(info="LENGTH FOR LONG AND WIDE CHANNEL VTO CORRECTION"); -parameter real WVT = 1.0 from [0.0:inf) `ATTR(info="WIDTH FOR LONG AND WIDE CHANNEL VTO CORRECTION"); -parameter real AGAM = 0.0 from (-inf:inf) `ATTR(info="PARAMETER FOR LONG AND WIDE CHANNEL GAMMA CORRECTION"); -parameter real LGAM = 1.0 from [0.0:inf) `ATTR(info="LENGTH FOR LONG AND WIDE CHANNEL GAMMA CORRECTION"); -parameter real WGAM = 1.0 from [0.0:inf) `ATTR(info="WIDTH FOR LONG AND WIDE CHANNEL GAMMA CORRECTION"); -parameter real NFVTA = 0.0 from [0.0:inf) `ATTR(info="NUMBER OF FINGERS FOR VTO CORRECTION FOR MULTIFINGER DEVICES (OBSOLETE MODEL BY STI STRESS EFFECT)"); -parameter real NFVTB = 10000.0 from (-inf:inf) `ATTR(info="PARAMETER FOR VTO CORRECTION FOR MULTIFINGER DEVICES (OBSOLETE MODEL BY STI STRESS EFFECT)"); + `MPRnb( AVT , 0.0, "" , "PARAMETER FOR LONG AND WIDE CHANNEL VTO CORRECTION") + `MPRoz( LVT , 1.0, "m" , "LENGTH FOR LONG AND WIDE CHANNEL VTO CORRECTION") + `MPRoz( WVT , 1.0, "m" , "WIDTH FOR LONG AND WIDE CHANNEL VTO CORRECTION") + `MPRnb( AGAM , 0.0, "" , "PARAMETER FOR LONG AND WIDE CHANNEL GAMMA CORRECTION") + `MPRoz( LGAM , 1.0, "m" , "LENGTH FOR LONG AND WIDE CHANNEL GAMMA CORRECTION") + `MPRoz( WGAM , 1.0, "m" , "WIDTH FOR LONG AND WIDE CHANNEL GAMMA CORRECTION") + `MPInb( NFVTA , 0, "" , "NUMBER OF FINGERS FOR VTO CORRECTION FOR MULTIFINGER DEVICES (OBSOLETE MODEL BY STI STRESS EFFECT)") + `MPRnb( NFVTB , 10e3, "" , "PARAMETER FOR VTO CORRECTION FOR MULTIFINGER DEVICES (OBSOLETE MODEL BY STI STRESS EFFECT)") // VELOCITY SATURATION & CLM RELATED PARAMETERS (4) -parameter real UCRIT = 5.0E+06 from (0.0:inf) `ATTR(info="CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT"); -parameter real DELTA = 2.0 from [1.0:2.0] `ATTR(info="VARIABLE ORDER (FROM 1.0 TO 2.0) OF VELOCITY SATURATION EFFECT"); -parameter real LAMBDA = 0.5 from [0.0:inf) `ATTR(info="LENGTH PARAMETER FOR CHANNEL LENGTH MODULATION"); -parameter real ACLM = 0.83 from [0.0:inf) `ATTR(info="FINE TUNING PARAMETER FOR CHANNEL LENGTH MODULATION"); + `MPRoz( UCRIT , 5.0E6 , "V/m" , "CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT") + `MPRcc( DELTA , 2.0 , "" , 1.0 , 2.0 , "VARIABLE ORDER (FROM 1.0 TO 2.0) OF VELOCITY SATURATION EFFECT") + `MPRcz( LAMBDA , 0.5 , "" , "LENGTH PARAMETER FOR CHANNEL LENGTH MODULATION") + `MPRnb( ACLM , 0.83 , "" , "FINE TUNING PARAMETER FOR CHANNEL LENGTH MODULATION") // REVERSE SHORT CHANNEL EFFECT (4) -parameter real LR = 50.0E-09 from (0.0:inf) `ATTR(info="LENGTH PARAMETER FOR REVERSE SHORT CHANNEL EFFECT"); -parameter real QLR = 0.5E-3 from (-inf:inf) `ATTR(info="CHARGE PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (VTO)"); -parameter real NLR = 10.0E-3 from (-inf:inf) `ATTR(info="DOPING PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (GAMMA)"); -parameter real FLR = 1.0 from [0.0:inf) `ATTR(info="FERMI POTENTIAL FINE TUNING PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (PHIF)"); + `MPRoz( LR , 50e-9 , "m" , "LENGTH PARAMETER FOR REVERSE SHORT CHANNEL EFFECT") + `MPRnb( QLR , 0.5e-3 , "V*m**2/F" , "CHARGE PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (VTO)") + `MPRnb( NLR , 10e-3 , "m**2/F" , "DOPING PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (GAMMA)") + `MPRcz( FLR , 1.0 , "" , "FERMI POTENTIAL FINE TUNING PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (PHIF)") // CHARGE SHARING EFFECT (5) -parameter real LETA0 = 0.0 from (-inf:inf) `ATTR(info="LENGTH INDEPENDENT PARAMETER FOR CHARGE SHARING (LONG CHANNEL)"); -parameter real LETA = 500.0E-3 from [0.0:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR CHARGE SHARING"); -parameter real LETA2 = 0.0 from (-inf:inf) `ATTR(info="SECOND ORDER LENGTH SCALING PARAMETER FOR CHARGE SHARING (SHORTEST CHANNEL)"); -parameter real WETA = 200.0E-3 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR CHARGE SHARING"); -parameter real NCS = 1.0 from [0.0:inf) `ATTR(info="WEAK INVERSION SLOPE PARAMETER FOR CHARGE SHARING"); + `MPRnb( LETA0 , 0.0 , "1/m" , "LENGTH INDEPENDENT PARAMETER FOR CHARGE SHARING (LONG CHANNEL)") + `MPRcz( LETA , 0.5 , "" , "LENGTH SCALING PARAMETER FOR CHARGE SHARING") + `MPRnb( LETA2 , 0.0 , "m" , "SECOND ORDER LENGTH SCALING PARAMETER FOR CHARGE SHARING (SHORTEST CHANNEL)") + `MPRnb( WETA , 0.2 , "" , "WIDTH SCALING PARAMETER FOR CHARGE SHARING") + `MPRcz( NCS , 1.0 , "" , "WEAK INVERSION SLOPE PARAMETER FOR CHARGE SHARING") // DRAIN INDUCED BARRIER LOWERING (2) -parameter real ETAD = 1.0 from [0.0:inf) `ATTR(info="ETA PARAMETER FOR DRAIN INDUCED BARRIER LOWERING"); -parameter real SIGMAD = 1.0 from [0.0:inf) `ATTR(info="SIGMA PARAMETER FOR DRAIN INDUCED BARRIER LOWERING"); + `MPRcz( ETAD , 1.0 , "" , "ETA PARAMETER FOR DRAIN INDUCED BARRIER LOWERING") + `MPRcz( SIGMAD , 1.0 , "" , "SIGMA PARAMETER FOR DRAIN INDUCED BARRIER LOWERING") // INVERSE NARROW CHANNEL EFFECT (3) -parameter real WR = 90.0E-09 from (0.0:inf) `ATTR(info="WIDTH PARAMETER FOR INVERSE NARROW CHANNEL EFFECT"); -parameter real QWR = 0.3E-3 from (-inf:inf) `ATTR(info="CHARGE PARAMETER FOR INVERSE NARROW CHANNEL EFFECT (VTO)"); -parameter real NWR = 5.0E-3 from (-inf:inf) `ATTR(info="DOPING PARAMETER FOR INVERSE NARROW CHANNEL EFFECT (GAMMA)"); + `MPRoz( WR , 90e-9 , "m" , "WIDTH PARAMETER FOR INVERSE NARROW CHANNEL EFFECT") + `MPRnb( QWR , 0.3e-3 , "V*m**2/F" , "CHARGE PARAMETER FOR INVERSE NARROW CHANNEL EFFECT (VTO)") + `MPRnb( NWR , 5e-3 , "m**2/F" , "DOPING PARAMETER FOR INVERSE NARROW CHANNEL EFFECT (GAMMA)") // DITS (5) -parameter real FPROUT = 1.0E6 from [0.0:inf) `ATTR(info="OUTPUT RESISTANCE PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT"); -parameter real PDITS = 0.0 from [0.0:inf) `ATTR(info="PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT (IF SET TO ZERO THE DITS EFFECT IS DISABLED)"); -parameter real PDITSL = 0.0 from [0.0:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT"); -parameter real PDITSD = 1.0 from [0.0:inf) `ATTR(info="BIAS PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT"); -parameter real DDITS = 0.3 from [0.0:inf) `ATTR(info="SMOOTH FACTOR OF OUTPUT CONDUCTANCE FOR DRAIN INDUCED THRESHOLD SHIFT"); + `MPRcz( FPROUT , 1e6 , "1/sqrt(m)", "OUTPUT RESISTANCE PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT") + `MPRcz( PDITS , 0.0, "" , "PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT (IF SET TO ZERO THE DITS EFFECT IS DISABLED)") + `MPRcz( PDITSL , 0.0 , "1/m" , "LENGTH SCALING PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT") + `MPRcz( PDITSD , 1.0 , "1/V" , "BIAS PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT") + `MPRcz( DDITS , 0.3 , "" , "SMOOTH FACTOR OF OUTPUT CONDUCTANCE FOR DRAIN INDUCED THRESHOLD SHIFT") // IMPACT IONIZATION CURRENT (3) -parameter real IBA = 000.0E+06 from [0.0:inf) `ATTR(info="PARAMETER A OF IMPACT IONIZATION CURRENT"); -parameter real IBB = 300.0E+06 from [0.0:inf) `ATTR(info="PARAMETER B OF IMPACT IONIZATION CURRENT"); -parameter real IBN = 1.0 from [0.0:inf) `ATTR(info="PARAMETER N OF IMPACT IONIZATION CURRENT"); + `MPRnb( IBA , 0.0 , "1/m" , "PARAMETER A OF IMPACT IONIZATION CURRENT") + `MPRnb( IBB , 300e6 , "V/m" , "PARAMETER B OF IMPACT IONIZATION CURRENT") + `MPRnb( IBN , 1.0 , "" , "PARAMETER N OF IMPACT IONIZATION CURRENT") // GATE CURRENT (4) -parameter real XB = 3.1 from (0.0:inf) `ATTR(info="SILICON TO SILICON OXIDE TUNNELING BARRIER HEIGHT"); -parameter real EB = 29.0E+09 from (0.0:inf) `ATTR(info="CHARACTERISTIC ELECTRICAL FIELD"); -parameter real KG = 00.0E-6 from [0.0:inf) `ATTR(info="MOBILITY FOR GATE CURRENT"); -parameter real LOVIG = 20.0E-9 from [0.0:inf) `ATTR(info="OVERLAP GATE LENGTH FOR OVERLAP GATE CURRENT"); + `MPRoz( XB , 3.1 , "V" , "SILICON TO SILICON OXIDE TUNNELING BARRIER HEIGHT") + `MPRoz( EB , 29e9 , "V/m" , "CHARACTERISTIC ELECTRICAL FIELD") + `MPRcz( KG , 0.0 , "A/V**2" , "MOBILITY FOR GATE CURRENT") + `MPRoz( LOVIG , 20e-9 , "m" , "OVERLAP GATE LENGTH FOR OVERLAP GATE CURRENT") // GIDL - GISL (4) -parameter real AGIDL = 0.0 from [0.0:inf) `ATTR(info="PARAMETER A OF GATE INDUCED DRAIN LEAKAGE"); -parameter real BGIDL = 2.3E+09 from [0.0:inf) `ATTR(info="PARAMETER B OF GATE INDUCED DRAIN LEAKAGE"); -parameter real CGIDL = 0.5 from [0.0:inf) `ATTR(info="PARAMETER C OF GATE INDUCED DRAIN LEAKAGE"); -parameter real EGIDL = 0.8 from [0.0:inf) `ATTR(info="PARAMETER E OF GATE INDUCED DRAIN LEAKAGE"); + `MPRnb( AGIDL , 0.0 , "A/V" , "PARAMETER A OF GATE INDUCED DRAIN LEAKAGE") + `MPRnb( BGIDL , 2.3e9 , "V/m" , "PARAMETER B OF GATE INDUCED DRAIN LEAKAGE") + `MPRnb( CGIDL , 0.5 , "V**3" , "PARAMETER C OF GATE INDUCED DRAIN LEAKAGE") + `MPRnb( EGIDL , 0.8 , "V" , "PARAMETER E OF GATE INDUCED DRAIN LEAKAGE") // FLICKER NOISE PARAMETERS (4) -parameter integer LFNOI = 0 from [0.0:inf) `ATTR(info="FLICKER NOISE MODEL SELECTION"); -parameter real KF = 0.0 from [0.0:inf) `ATTR(info="FLICKER NOISE PARAMETER"); -parameter real AF = 1.0 from [0.0:inf) `ATTR(info="FLICKER NOISE FREQUENCY EXPONENT"); -parameter real EF = 2.0 from [0.0:inf) `ATTR(info="FLICKER NOISE TRANSCONDUCTANCE EXPONENT"); -parameter real NT = 1.0E+14 from [0.0:inf) `ATTR(info="NUMBER OF TRAPPED CARRIERS"); -parameter real ALPHAC = 10.0E+4 from [0.0:inf) `ATTR(info="COULOMB SCATTERING COEFFICIENT"); -parameter real ALPHAH = 1.0E-20 from [0.0:inf) `ATTR(info="HOOGE PARAMETER FOR MOBILITY FLUCTUATION NOISE MODEL"); -parameter real KGFN = 0.0 from [0.0:inf) `ATTR(info="GATE FLICKER NOISE PARAMETER"); -parameter real ECN = 1.0E+4 from [0.0:inf) `ATTR(info="CRITICAL FIELD VALUE"); -//parameter real SDR = 1.0E-10 from [0.0:inf) `ATTR(info="SERIES RESISTANCE NOISE PARAMETER"); -parameter real SDR = 1.0E-6 from [0.0:inf) `ATTR(info="SERIES RESISTANCE NOISE PARAMETER"); -// LENGTH SCALING PARAMETERS (3) + `MPIcz( LFNOI , 0 , "" , "FLICKER NOISE MODEL SELECTION") + `MPRcz( KF , 0.0 , "" , "FLICKER NOISE PARAMETER") + `MPRnb( AF , 1.0 , "" , "FLICKER NOISE FREQUENCY EXPONENT") + `MPRcz( EF , 2.0 , "" , "FLICKER NOISE TRANSCONDUCTANCE EXPONENT") + `MPRnb( NT , 1.0E+14 , "" , "NUMBER OF TRAPPED CARRIERS") + `MPRnb( ALPHAC , 10E+4 , "" , "COULOMB SCATTERING COEFFICIENT") + `MPRnb( ALPHAH , 1.0E-20 , "" , "HOOGE PARAMETER FOR MOBILITY FLUCTUATION NOISE MODEL") + `MPRnb( KGFN , 0.0 , "" , "GATE FLICKER NOISE PARAMETER") + `MPRoz( ECN , 1.0E+4 , "" , "CRITICAL FIELD VALUE") + `MPRnb( SDR , 1.0E-6 , "" , "SERIES RESISTANCE NOISE PARAMETER") -parameter real LWR = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR WR"); -parameter real LQWR = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR QWR"); -parameter real LNWR = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR NWR"); -parameter real LDPHIEDGE = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING PARAMETER FOR DPHIEDGE"); +// LENGTH SCALING PARAMETERS (3) + `MPRnb( LWR , 0.0, "m**2", "LENGTH SCALING PARAMETER FOR WR") + `MPRnb( LQWR , 0.0, "m" , "LENGTH SCALING PARAMETER FOR QWR") + `MPRnb( LNWR , 0.0, "m" , "LENGTH SCALING PARAMETER FOR NWR") + `MPRnb( LDPHIEDGE, 0.0, "m" , "LENGTH SCALING PARAMETER FOR DPHIEDGE") // WIDTH SCALING PARAMETERS (11) -parameter real WLR = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR LR"); -parameter real WQLR = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR QLR"); -parameter real WNLR = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR NLR"); -parameter real WUCRIT = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR UCRIT"); -parameter real WLAMBDA = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR LAMBDA"); -parameter real WETAD = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR ETAD"); -parameter real WE0 = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR E0"); -parameter real WE1 = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR E1"); -parameter real WRLX = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR RLX"); -parameter real WUCEX = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR UCEX"); -parameter real WDPHIEDGE = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING PARAMETER FOR DPHIEDGE"); + `MPRnb( WLR , 0.0, "m**2", "WIDTH SCALING PARAMETER FOR LR") + `MPRnb( WQLR , 0.0, "m" , "WIDTH SCALING PARAMETER FOR QLR") + `MPRnb( WNLR , 0.0, "m" , "WIDTH SCALING PARAMETER FOR NLR") + `MPRnb( WUCRIT , 0.0, "m" , "WIDTH SCALING PARAMETER FOR UCRIT") + `MPRnb( WLAMBDA , 0.0, "m" , "WIDTH SCALING PARAMETER FOR LAMBDA") + `MPRnb( WETAD , 0.0, "m" , "WIDTH SCALING PARAMETER FOR ETAD") + `MPRnb( WE0 , 0.0, "m" , "WIDTH SCALING PARAMETER FOR E0") + `MPRnb( WE1 , 0.0, "m" , "WIDTH SCALING PARAMETER FOR E1") + `MPRnb( WRLX , 0.0, "m" , "WIDTH SCALING PARAMETER FOR RLX") + `MPRnb( WUCEX , 0.0, "m" , "WIDTH SCALING PARAMETER FOR UCEX") + `MPRnb( WDPHIEDGE, 0.0, "m" , "WIDTH SCALING PARAMETER FOR DPHIEDGE") // COMBINED SCALING PARAMETERS (2) -parameter real WLDPHIEDGE = 0.0 from (-inf:inf) `ATTR(info="FINE TUNING SCALING FOR COMBINED SHORT AND NARROW DEVICES FOR DPHIEDGE"); -parameter real WLDGAMMAEDGE = 0.0 from (-inf:inf) `ATTR(info="FINE TUNING SCALING FOR COMBINED SHORT AND NARROW DEVICES FOR DGAMMAEDGE"); + `MPRnb( WLDPHIEDGE, 0.0, "m**2" , "FINE TUNING SCALING FOR COMBINED SHORT AND NARROW DEVICES FOR DPHIEDGE") + `MPRnb( WLDGAMMAEDGE, 0.0, "m**2" , "FINE TUNING SCALING FOR COMBINED SHORT AND NARROW DEVICES FOR DGAMMAEDGE") // EDGE DEVICE (3) -parameter real WEDGE = 0.0 from [0.0:inf) `ATTR(info="TOTAL EFFECTIVE WIDTH OF EDGE DEVICE FOR EDGE CONDUCTANCE EFFECT"); -parameter real DGAMMAEDGE = 0.0 from (-inf:inf) `ATTR(info="DIFFERENTIAL GAMMA PARAMETER OF EDGE DEVICE WITH RESPECT TO THE MAIN DEVICE"); -parameter real DPHIEDGE = 0.0 from (-inf:inf) `ATTR(info="DIFFERENTIAL PHI PARAMETER OF EDGE DEVICE WITH RESPECT TO THE MAIN DEVICE"); + `MPRcz( WEDGE , 0.0 , "m" , "TOTAL EFFECTIVE WIDTH OF EDGE DEVICE FOR EDGE CONDUCTANCE EFFECT") + `MPRnb( DGAMMAEDGE , 0.0 , "sqrt(V)" , "DIFFERENTIAL GAMMA PARAMETER OF EDGE DEVICE WITH RESPECT TO THE MAIN DEVICE") + `MPRnb( DPHIEDGE , 0.0 , "V" , "DIFFERENTIAL PHI PARAMETER OF EDGE DEVICE WITH RESPECT TO THE MAIN DEVICE") // STI STRESS EFFECT (13) -parameter real SAREF = 0.0 from [0.0:inf) `ATTR(info="REFERENCE SA PARAMETER FOR STI STRESS EFFECT PARAMETER EXTRACION"); -parameter real SBREF = 0.0 from [0.0:inf) `ATTR(info="REFERENCE SB PARAMETER FOR STI STRESS EFFECT PARAMETER EXTRACION"); -parameter real WLOD = 0.0 from (-inf:inf) `ATTR(info="WIDTH EFFECTIVE PARAMETER FOR STI STRESS EFFECT"); -parameter real KKP = 0.0 from (-inf:inf) `ATTR(info="MOBILITY PARAMETER FOR STI STRESS EFFECT"); -parameter real LKKP = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING OF MOBILITY FOR STI STRESS EFFECT"); -parameter real WKKP = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING OF MOBILITY FOR STI STRESS EFFECT"); -parameter real PKKP = 0.0 from (-inf:inf) `ATTR(info="AREA SCALING OF MOBILITY FOR STI STRESS EFFECT"); -parameter real TKKP = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF MOBILITY FOR STI STRESS EFFECT"); -parameter real LLODKKP = 1.0 from (-inf:inf) `ATTR(info="EXPONENTIAL LENGTH SCALING PARAMETER OF MOBILITY FOR STI STRESS EFFECT"); -parameter real WLODKKP = 1.0 from (-inf:inf) `ATTR(info="EXPONENTIAL WIDTH SCALING PARAMETER OF MOBILITY FOR STI STRESS EFFECT"); -parameter real KVTO = 0.0 from (-inf:inf) `ATTR(info="THRESHOLD VOLTAGE PARAMETER FOR STI STRESS EFFECT"); -parameter real LKVTO = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT"); -parameter real WKVTO = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT"); -parameter real PKVTO = 0.0 from (-inf:inf) `ATTR(info="AREA SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT"); -parameter real LLODKVTO = 1.0 from (-inf:inf) `ATTR(info="EXPONENTIAL LENGTH SCALING PARAMETER OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT"); -parameter real WLODKVTO = 1.0 from (-inf:inf) `ATTR(info="EXPONENTIAL WIDTH SCALING PARAMETER OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT"); -parameter real KGAMMA = 0.0 from (-inf:inf) `ATTR(info="BODY EFFECT COEFFICIENT PARAMETER FOR STI STRESS EFFECT"); -parameter real LODKGAMMA = 1.0 from (-inf:inf) `ATTR(info="FINE TUNING PARAMETER FOR BODY EFFECT COEFFICIENT SCALING OF STI STRESS EFFECT"); -parameter real KETAD = 0.0 from (-inf:inf) `ATTR(info="DIBL EFFECT PARAMETER FOR STI STRESS EFFECT"); -parameter real LODKETAD = 1.0 from (-inf:inf) `ATTR(info="FINE TUNING PARAMETER FOR DIBL EFFECT PARAMETER SCALING OF STI STRESS EFFECT"); -parameter real KUCRIT = 0.0 from (-inf:inf) `ATTR(info="CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT PARAMETER FOR STI STRESS EFFECT"); - - + `MPRcz( SAREF , 0.0, "m", "REFERENCE SA PARAMETER FOR STI STRESS EFFECT PARAMETER EXTRACION") + `MPRcz( SBREF , 0.0, "m", "REFERENCE SB PARAMETER FOR STI STRESS EFFECT PARAMETER EXTRACION") + `MPRcz( WLOD , 0.0, "m", "WIDTH EFFECTIVE PARAMETER FOR STI STRESS EFFECT") + `MPRnb( KKP , 0.0, "" , "MOBILITY PARAMETER FOR STI STRESS EFFECT") + `MPRnb( LKKP , 0.0, "" , "LENGTH SCALING OF MOBILITY FOR STI STRESS EFFECT") + `MPRnb( WKKP , 0.0, "" , "WIDTH SCALING OF MOBILITY FOR STI STRESS EFFECT") + `MPRnb( PKKP , 0.0, "" , "AREA SCALING OF MOBILITY FOR STI STRESS EFFECT") + `MPRnb( TKKP , 0.0, "" , "TEMPERATURE SCALING OF MOBILITY FOR STI STRESS EFFECT") + `MPRnb( LLODKKP , 1.0, "" , "EXPONENTIAL LENGTH SCALING PARAMETER OF MOBILITY FOR STI STRESS EFFECT") + `MPRnb( WLODKKP , 1.0, "" , "EXPONENTIAL WIDTH SCALING PARAMETER OF MOBILITY FOR STI STRESS EFFECT") + `MPRnb( KVTO , 0.0, "" , "THRESHOLD VOLTAGE PARAMETER FOR STI STRESS EFFECT") + `MPRnb( LKVTO , 0.0, "" , "LENGTH SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT") + `MPRnb( WKVTO , 0.0, "" , "WIDTH SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT") + `MPRnb( PKVTO , 0.0, "" , "AREA SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT") + `MPRnb( LLODKVTO , 1.0, "" , "EXPONENTIAL LENGTH SCALING PARAMETER OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT") + `MPRnb( WLODKVTO , 1.0, "" , "EXPONENTIAL WIDTH SCALING PARAMETER OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT") + `MPRnb( KGAMMA , 0.0, "" , "BODY EFFECT COEFFICIENT PARAMETER FOR STI STRESS EFFECT") + `MPRnb( LODKGAMMA , 1.0, "" , "FINE TUNING PARAMETER FOR BODY EFFECT COEFFICIENT SCALING OF STI STRESS EFFECT") + `MPRnb( KETAD , 0.0, "" , "DIBL EFFECT PARAMETER FOR STI STRESS EFFECT") + `MPRnb( LODKETAD , 1.0, "" , "FINE TUNING PARAMETER FOR DIBL EFFECT PARAMETER SCALING OF STI STRESS EFFECT") + `MPRnb( KUCRIT , 0.0, "" , "CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT PARAMETER FOR STI STRESS EFFECT") //////////////////////////////// // TEMPERATURE PARAMETERS (8) // //////////////////////////////// -parameter real TCV = 600.0E-6 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF THRESHOLD VOLTAGE"); -parameter real BEX = -1.5 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF MOBILITY"); -parameter real TE0EX = 0.5 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF E0"); -parameter real TE1EX = 0.5 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF E1"); -parameter real TETA = -0.9E-3 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF ETA PARAMETER"); -parameter real UCEX = 1.5 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT"); -parameter real TLAMBDA = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF LAMBDA PARAMETER"); -parameter real IBBT = 800.0E-6 from (-inf:inf) `ATTR(info="TEMPERATURE SCALING OF IBB"); + `MPRnb( TCV , 600e-6 , "V/K" , "TEMPERATURE SCALING OF THRESHOLD VOLTAGE") + `MPRnb( BEX , -1.5 , "" , "TEMPERATURE SCALING OF MOBILITY") + `MPRnb( TE0EX , 0.5 , "" , "TEMPERATURE SCALING OF E0") + `MPRnb( TE1EX , 0.5 , "" , "TEMPERATURE SCALING OF E1") + `MPRnb( TETA , -0.9e-3 , "1/K" , "TEMPERATURE SCALING OF ETA PARAMETER") + `MPRnb( UCEX , 1.5 , "" , "TEMPERATURE SCALING OF CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT") + `MPRnb( TLAMBDA , 0.0 , "" , "TEMPERATURE SCALING OF LAMBDA PARAMETER") + `MPRnb( IBBT , 800e-6 , "" , "TEMPERATURE SCALING OF IBB") // TEMPERATURE AND GEOMETRY SCALING (3) -parameter real TCVL = 0.0 from (-inf:inf) `ATTR(info="LENGTH SCALING OF TCV"); -parameter real TCVW = 0.0 from (-inf:inf) `ATTR(info="WIDTH SCALING OF TCV"); -parameter real TCVWL = 0.0 from (-inf:inf) `ATTR(info="AREA SCALING OF TCV"); + `MPRnb( TCVL , 0.0 , "m*V/K", "LENGTH SCALING OF TCV") + `MPRnb( TCVW , 0.0 , "m**2*V/K*V/K" , "WIDTH SCALING OF TCV") + `MPRnb( TCVWL , 0.0 , "m**2*V/K" , "AREA SCALING OF TCV") //////////////////// // EXTRINSIC PART // @@ -277,42 +259,42 @@ parameter real TCVWL = 0.0 from (-inf:inf) `ATTR(info="AREA // OVERLAP CAPACITANCES (8) -parameter real GAMMAOV = 1.6 from (0.0:inf) `ATTR(info="BODY EFFECT COEFFICIENT OF THE GATE OVERLAP REGION"); -parameter real GAMMAGOV = 10.0 from (0.0:inf) `ATTR(info="GATE DOPING COEFFICIENT FOR POLYSILICON DEPLETION EFFECT OF THE GATE OVERLAP REGION"); -parameter real VFBOV = 0.0 from (-inf:inf) `ATTR(info="FLAT-BAND VOLTAGE OF THE GATE OVERLAP REGION"); -parameter real LOV = 20.0E-9 from [0.0:inf) `ATTR(info="EFFECTIVE LENGTH OF THE GATE OVERLAP REGION"); -parameter real VOV = 1.0 from [0.0:1.0] `ATTR(info="BIAS PARAMETER OF THE OVERLAP CAPACITANCES"); -parameter real CGSO = 0.0 from [0.0:inf) `ATTR(info="BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE WIDTH UNIT BETWEEN GATE AND SOURCE"); -parameter real CGDO = 0.0 from [0.0:inf) `ATTR(info="BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE WIDTH UNIT BETWEEN GATE AND DRAIN"); -parameter real CGBO = 0.0 from [0.0:inf) `ATTR(info="BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE LENGTH UNIT BETWEEN GATE AND BULK"); + `MPRoz( GAMMAOV , 1.6 , "sqr(V)" , "BODY EFFECT COEFFICIENT OF THE GATE OVERLAP REGION") + `MPRoz( GAMMAGOV , 10.0 , "sqr(V)" , "GATE DOPING COEFFICIENT FOR POLYSILICON DEPLETION EFFECT OF THE GATE OVERLAP REGION") + `MPRnb( VFBOV , 0.0 , "V" , "FLAT-BAND VOLTAGE OF THE GATE OVERLAP REGION") + `MPRcz( LOV , 20e-9 , "m" , "EFFECTIVE LENGTH OF THE GATE OVERLAP REGION") + `MPRcc( VOV , 1.0 , "" , 0.0, 1.0 , "BIAS PARAMETER OF THE OVERLAP CAPACITANCES") + `MPRcz( CGSO , 0.0 , "F/m" , "BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE WIDTH UNIT BETWEEN GATE AND SOURCE") + `MPRcz( CGDO , 0.0 , "F/m" , "BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE WIDTH UNIT BETWEEN GATE AND DRAIN") + `MPRcz( CGBO , 0.0 , "F/m" , "BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE LENGTH UNIT BETWEEN GATE AND BULK") // FRINGING CAPACITANCE (4) -parameter real KJF = 0.0 from [0.0:inf) `ATTR(info="FRINGING CAPACITANCE PARAMETER"); -parameter real CJF = 0.0 from [0.0:inf) `ATTR(info="BIAS SCALING OF FRINGING CAPACITANCE"); -parameter real VFR = 0.0 from [0.0:inf) `ATTR(info="BUILT-IN VOLTAGE FINE TUNING FOR FRINGING CAPACITANCE MODEL"); -parameter real DFR = 1.0E-3 from [0.0:inf) `ATTR(info="SMOOTH PARAMETER OF FRINGING CAPACITANCE MODEL"); + `MPRcz( KJF , 0.0 , "C/m" , "FRINGING CAPACITANCE PARAMETER") + `MPRcz( CJF , 0.0 , "1/V" , "BIAS SCALING OF FRINGING CAPACITANCE") + `MPRcz( VFR , 0.0 , "V" , "BUILT-IN VOLTAGE FINE TUNING FOR FRINGING CAPACITANCE MODEL") + `MPRcz( DFR , 1e-3 , "" , "SMOOTH PARAMETER OF FRINGING CAPACITANCE MODEL") // SERIES RESISTANCES RS AND RD // - TYPICAL SPICE MODEL -parameter real HDIF = 0.0e-6 from [0.0:inf) `ATTR(info="HALF LENGTH OF THE ACTIVE AREA"); -parameter real RSH = 0.0 from [0.0:inf) `ATTR(info="SQUARE RESISTANCE OF ACTIVE AREA"); -parameter real LDIF = 0.0 from [0.0:inf) `ATTR(info="DISTANCE BETWEEN THE MIDDLE OF THE ACTIVE AREA AND THE START OF THE CHANNEL"); -parameter real RS = 0.0 from [0.0:inf) `ATTR(info="LDD SOURCE SERIES RESISTANCE"); -parameter real RD = 0.0 from [0.0:inf) `ATTR(info="LDD DRAIN SERIES RESISTANCE"); + `MPRcz( HDIF , 0.0 , "m" , "HALF LENGTH OF THE ACTIVE AREA") + `MPRcz( RSH , 0.0 , "Ohms/sq" , "SQUARE RESISTANCE OF ACTIVE AREA") + `MPRcz( LDIF , 0.0 , "m" , "DISTANCE BETWEEN THE MIDDLE OF THE ACTIVE AREA AND THE START OF THE CHANNEL") + `MPRcz( RS , 0.0 , "Ohms/sq" , "LDD SOURCE SERIES RESISTANCE") + `MPRcz( RD , 0.0 , "Ohms/sq" , "LDD DRAIN SERIES RESISTANCE") // - NON-GEOMETRICAL APPROACH -parameter real RLX = -1.0 from (-inf:inf) `ATTR(info="EXTERNAL SERIES RESISTANCE PER WIDTH UNIT"); -parameter real RSX = -1.0 from (-inf:inf) `ATTR(info="EXTERNAL SERIES RESISTANCE PER WIDTH UNIT, SOURCE SIDE (ASYMMETRIC MODEL)"); -parameter real RDX = -1.0 from (-inf:inf) `ATTR(info="EXTERNAL SERIES RESISTANCE PER WIDTH UNIT, DRAIN SIDE (ASYMMETRIC MODEL)"); + `MPRnb( RLX , -1.0 , "Ohm/m" , "EXTERNAL SERIES RESISTANCE PER WIDTH UNIT") + `MPRnb( RSX , -1.0 , "Ohm/m" , "EXTERNAL SERIES RESISTANCE PER WIDTH UNIT, SOURCE SIDE (ASYMMETRIC MODEL)") + `MPRnb( RDX , -1.0 , "Ohm/m" , "EXTERNAL SERIES RESISTANCE PER WIDTH UNIT, DRAIN SIDE (ASYMMETRIC MODEL)") // - TEMPERATURE SCALING -parameter real TR = 0.0 from (-inf:inf) `ATTR(info="FIRST ORDER RESISTANCE TEMPERATURE SCALING PARAMETER"); -parameter real TR2 = 0.0 from (-inf:inf) `ATTR(info="SECOND ORDER RESISTANCE TEMPERATURE SCALING PARAMETER"); + `MPRnb( TR , 0.0 , "Ohms/K" , "FIRST ORDER RESISTANCE TEMPERATURE SCALING PARAMETER") + `MPRnb( TR2 , 0.0 , "Ohms/K**2" , "SECOND ORDER RESISTANCE TEMPERATURE SCALING PARAMETER") // JUNCTION DRAIN - BULK AND SOURCE-BULK AREA, CURRENT, CAPACITANCE @@ -320,112 +302,112 @@ parameter real GMIN = 0.0 from [0.0:inf) `ATTR(info="MINI // SOURCE SIDE -parameter real NJS = 1.0 from (-inf:inf) `ATTR(info="SLOPE FACTOR FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real XJBVS = 0.0 from (-inf:inf) `ATTR(info="BREAK-DOWN EFFECT COEFFICIENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real BVS = 10.0 from (-inf:inf) `ATTR(info="BREAK-DOWN VOLTAGE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); + `MPRoz( NJS ,1.0 , "" ,"SLOPE FACTOR FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRcz( XJBVS ,0.0 , "" ,"BREAK-DOWN EFFECT COEFFICIENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRnb( BVS ,10.0 , "V" ,"BREAK-DOWN VOLTAGE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") -parameter real JSS = 0.0E-09 from (-inf:inf) `ATTR(info="AREA COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real JSSWS = 0.0E-12 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real JSSWGS = 0.0E-12 from (-inf:inf) `ATTR(info="GATE-SIDE COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); + `MPRcz( JSS ,1.0e-4 , "A/m^2" ,"AREA COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRcz( JSSWS ,0.0 , "A/m" ,"SIDEWAYS COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRcz( JSSWGS ,0.0 , "A/m" ,"GATE-SIDE COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") -parameter real JTSS = 0.0E-09 from (-inf:inf) `ATTR(info="AREA COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real JTSSWS = 0.0E-12 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real JTSSWGS = 0.0E-12 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); + `MPRcz( JTSS ,0.0 , "A/m" ,"AREA COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRcz( JTSSWS ,0.0 , "A/m^2" ,"SIDEWAYS COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRcz( JTSSWGS ,0.0 , "A/m" ,"GATESIDE COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") -parameter real NJTSS = 1.0 from (-inf:inf) `ATTR(info="AREA SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real NJTSSWS = 1.0 from (-inf:inf) `ATTR(info="SIDEWAYS SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real NJTSSWGS = 1.0 from (-inf:inf) `ATTR(info="GATESIDE SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); + `MPRoz( NJTSS ,20.0 , "" ,"AREA SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRoz( NJTSSWS ,20.0 , "" ,"SIDEWAYS SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRoz( NJTSSWGS ,20.0 , "" ,"GATESIDE SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") -parameter real VTSS = 0.0 from (-inf:inf) `ATTR(info="AREA VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real VTSSWS = 0.0 from (-inf:inf) `ATTR(info="SIDEWAYS VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real VTSSWGS = 0.0 from (-inf:inf) `ATTR(info="GATESIDE VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); + `MPRnb( VTSS ,10.0 , "V" ,"AREA VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRnb( VTSSWS ,10.0 , "V" ,"SIDEWAYS VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRnb( VTSSWGS ,10.0 , "V" ,"GATESIDE VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") -parameter real CJS = 0.0E-06 from (-inf:inf) `ATTR(info="AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real CJSWS = 0.0E-09 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real CJSWGS = 0.0E-09 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); + `MPRcz( CJS ,5.0e-4 , "F/m^2" ,"AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRcz( CJSWS ,5.0e-10, "F/m" ,"SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRcz( CJSWGS ,0.0 , "F/m" ,"GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") -parameter real PBS = 0.800 from (-inf:inf) `ATTR(info="AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real PBSWS = 0.600 from (-inf:inf) `ATTR(info="SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real PBSWGS = 0.600 from (-inf:inf) `ATTR(info="GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); + `MPRcz( PBS ,1.0 , "V" ,"AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRcz( PBSWS ,1.0 , "V" ,"SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRcz( PBSWGS ,PBSWS , "V" ,"GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") -parameter real MJS = 0.900 from (-inf:inf) `ATTR(info="AREA EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real MJSWS = 0.700 from (-inf:inf) `ATTR(info="SIDEWAYS EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real MJSWGS = 0.700 from (-inf:inf) `ATTR(info="GATESIDE EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); + `MPRoo( MJS ,0.5 , "" ,-inf ,1.0 ,"AREA EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRoo( MJSWS ,0.33 , "" ,-inf ,1.0 ,"SIDEWAYS EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRoo( MJSWGS ,MJSWS , "" ,-inf ,1.0 ,"GATESIDE EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") -parameter real XTIS = 3.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); + `MPRnb( XTIS ,3.0 , "" ,"TEMPERATURE DEPENDENCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") -parameter real XTSS = 0.0 from (-inf:inf) `ATTR(info="AREA COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real XTSSWS = 0.0 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real XTSSWGS = 0.0 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); + `MPRnb( XTSS ,0.02 , "" ,"AREA COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRnb( XTSSWS ,0.02 , "" ,"SIDEWAYS COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRnb( XTSSWGS ,0.02 , "" ,"GATESIDE COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") -parameter real TNJTSS = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSS (AREA), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real TNJTSSWS = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSSWS (SIDEWAYS), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); -parameter real TNJTSSWGS = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSSWGS (GATESIDE), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)"); + `MPRnb( TNJTSS ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSS (AREA), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRnb( TNJTSSWS ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSSWS (SIDEWAYS), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") + `MPRnb( TNJTSSWGS ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSSWGS (GATESIDE), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") // BOTH SIDES -parameter real TCJ = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJS AND CJD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); -parameter real TCJSW = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJSWS AND CJSWD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); -parameter real TCJSWG = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJSWGS AND CJSWGD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); + `MPRnb( TCJ , 0.0, "1/K" , "TEMPERATURE DEPENDENCE OF AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJS AND CJD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") + `MPRnb( TCJSW , 0.0, "1/K" , "TEMPERATURE DEPENDENCE OF SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJSWS AND CJSWD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") + `MPRnb( TCJSWG, 0.0, "1/K" , "TEMPERATURE DEPENDENCE OF GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJSWGS AND CJSWGD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") -parameter real TPB = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBS AND PBD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); -parameter real TPBSW = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBSWS AND PBSWD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); -parameter real TPBSWG = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBSWGS AND PBSWGD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)"); + `MPRnb( TPB , 0.0, "V/K" , "TEMPERATURE DEPENDENCE OF AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBS AND PBD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") + `MPRnb( TPBSW , 0.0, "V/K" , "TEMPERATURE DEPENDENCE OF SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBSWS AND PBSWD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") + `MPRnb( TPBSWG, 0.0, "V/K" , "TEMPERATURE DEPENDENCE OF GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBSWGS AND PBSWGD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") // DRAIN SIDE -parameter real NJD = 1.0 from (-inf:inf) `ATTR(info="SLOPE FACTOR FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real XJBVD = 0.0 from (-inf:inf) `ATTR(info="BREAK-DOWN EFFECT COEFFICIENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real BVD = 10.0 from (-inf:inf) `ATTR(info="BREAK-DOWN VOLTAGE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); + `MPRoz( NJD ,1.0 , "" ,"SLOPE FACTOR FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRcz( XJBVD ,0.0 , "" ,"BREAK-DOWN EFFECT COEFFICIENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRnb( BVD ,10.0 , "V" ,"BREAK-DOWN VOLTAGE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") -parameter real JSD = 0.0E-09 from (-inf:inf) `ATTR(info="AREA COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real JSSWD = 0.0E-12 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real JSSWGD = 0.0E-12 from (-inf:inf) `ATTR(info="GATE-SIDE COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); + `MPRcz( JSD ,1.0e-4 , "A/m^2" ,"AREA COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRcz( JSSWD ,0.0 , "A/m" ,"SIDEWAYS COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRcz( JSSWGD ,0.0 , "A/m" ,"GATE-SIDE COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") -parameter real JTSD = 0.0E-09 from (-inf:inf) `ATTR(info="AREA COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real JTSSWD = 0.0E-12 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real JTSSWGD = 0.0E-12 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); + `MPRcz( JTSD ,0.0 , "A/m" ,"AREA COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRcz( JTSSWD ,0.0 , "A/m^2" ,"SIDEWAYS COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRcz( JTSSWGD ,0.0 , "A/m" ,"GATESIDE COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") -parameter real NJTSD = 1.0 from (-inf:inf) `ATTR(info="AREA SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real NJTSSWD = 1.0 from (-inf:inf) `ATTR(info="SIDEWAYS SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real NJTSSWGD = 1.0 from (-inf:inf) `ATTR(info="GATESIDE SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); + `MPRoz( NJTSD ,20.0 , "" ,"AREA SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRoz( NJTSSWD ,20.0 , "" ,"SIDEWAYS SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRoz( NJTSSWGD ,20.0 , "" ,"GATESIDE SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") -parameter real VTSD = 0.0 from (-inf:inf) `ATTR(info="AREA VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real VTSSWD = 0.0 from (-inf:inf) `ATTR(info="SIDEWAYS VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real VTSSWGD = 0.0 from (-inf:inf) `ATTR(info="GATESIDE VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); + `MPRnb( VTSD ,10.0 , "V" ,"AREA VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRnb( VTSSWD ,10.0 , "V" ,"SIDEWAYS VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRnb( VTSSWGD ,10.0 , "V" ,"GATESIDE VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") -parameter real CJD = 0.0E-06 from (-inf:inf) `ATTR(info="AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real CJSWD = 0.0E-09 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real CJSWGD = 0.0E-09 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); + `MPRcz( CJD ,5.0e-4 , "F/m^2" ,"AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRcz( CJSWD ,5.0e-10, "F/m" ,"SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRcz( CJSWGD ,0.0 , "F/m" ,"GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") -parameter real PBD = 0.800 from (-inf:inf) `ATTR(info="AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real PBSWD = 0.600 from (-inf:inf) `ATTR(info="SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real PBSWGD = 0.600 from (-inf:inf) `ATTR(info="GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); + `MPRcz( PBD ,1.0 , "V" ,"AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRcz( PBSWD ,1.0 , "V" ,"SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRcz( PBSWGD ,PBSWD , "V" ,"GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") -parameter real MJD = 0.900 from (-inf:inf) `ATTR(info="AREA EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real MJSWD = 0.700 from (-inf:inf) `ATTR(info="SIDEWAYS EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real MJSWGD = 0.700 from (-inf:inf) `ATTR(info="GATESIDE EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); + `MPRoo( MJD ,0.5 , "" ,-inf ,1.0 ,"AREA EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRoo( MJSWD ,0.33 , "" ,-inf ,1.0 ,"SIDEWAYS EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRoo( MJSWGD ,MJSWD , "" ,-inf ,1.0 ,"GATESIDE EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") -parameter real XTID = 3.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); + `MPRnb( XTID ,3.0 , "" ,"TEMPERATURE DEPENDENCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") -parameter real XTSD = 0.0 from (-inf:inf) `ATTR(info="AREA COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real XTSSWD = 0.0 from (-inf:inf) `ATTR(info="SIDEWAYS COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real XTSSWGD = 0.0 from (-inf:inf) `ATTR(info="GATESIDE COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); + `MPRnb( XTSD ,0.02 , "" ,"AREA COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRnb( XTSSWD ,0.02 , "" ,"SIDEWAYS COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRnb( XTSSWGD ,0.02 , "" ,"GATESIDE COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") -parameter real TNJTSD = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSS (AREA), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real TNJTSSWD = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSSWS (SIDEWAYS), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); -parameter real TNJTSSWGD = 0.0 from (-inf:inf) `ATTR(info="TEMPERATURE DEPENDENCE OF NJTSSWGS (GATESIDE), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)"); + `MPRnb( TNJTSD ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSS (AREA), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRnb( TNJTSSWD ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSSWS (SIDEWAYS), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") + `MPRnb( TNJTSSWGD ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSSWGS (GATESIDE), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") // PARAMETERS RF -parameter real RGSH = 3.0 from [0.0:inf) `ATTR(info="GATE SHEET REISTANCE"); -parameter real GC = 1 from [1.0:2.0] `ATTR(info="TYPE OF GATE CONTACTS (GC = 1: SINLGE SIDED, GC = 2: BOTH SIDES)"); -parameter real KRGL1 = 0.0 from [0.0:inf) `ATTR(info="GATE RESISTANCE LENGTH SCALING PARAMETER"); -parameter real RDSBSH = 1.0E+3 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK SHEET RESISTANCE BETWEEN INTERNAL DRAIN AND SOURCE NODES (USED AT RF AND NQS MODES)"); -parameter real RBWSH = 3.0E-3 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK BULK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL BULK AND EXTERNAL BULK NODES (USED AT RF4, RF AND NQS MODES)"); -parameter real RBN = 0.0 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK BULK RESISTANCE PER FINGER BETWEEN INTERNAL BULK AND EXTERNAL BULK NODES (USED AT RF4, RF AND NQS MODES)"); -parameter real RSBWSH = 1.0E-3 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL SOURCE AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)"); -parameter real RSBN = 0.0 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK RESISTANCE PER FINGER BETWEEN INTERNAL SOURCE AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)"); -parameter real RDBWSH = 1.0E-3 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL DRAIN AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)"); -parameter real RDBN = 0.0 from [0.0:inf) `ATTR(info="SUBSTRATE NETWORK RESISTANCE PER FINGER BETWEEN INTERNAL DRAIN AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)"); -parameter real RINGTYPE = 1.0 from [0.0:inf) `ATTR(info="RINGTYPE, SHAPE OF BULK CONNECTOR (RINGTYPE = 1 FOR HORSE-SHOE, THREE SIDES CONTACT, RINGTYPE = 2 FOR SYMMETRIC, TWO SIDES CONTACT), (USED AT RF4, RF AND NQS MODES)"); + `MPRcz( RGSH , 3.0 , "Ohms/sq" , "GATE SHEET REISTANCE") + `MPIcc( GC , 1 , "" , 1 , 2, "TYPE OF GATE CONTACTS (GC = 1: SINLGE SIDED, GC = 2: BOTH SIDES)") + `MPRnb( KRGL1 , 0.0 , "1/m" , "GATE RESISTANCE LENGTH SCALING PARAMETER") + `MPRoz( RDSBSH , 1e+3 , "Ohms/sq" , "SUBSTRATE NETWORK SHEET RESISTANCE BETWEEN INTERNAL DRAIN AND SOURCE NODES (USED AT RF AND NQS MODES)") + `MPRoz( RBWSH , 3e-3 , "Ohms/m" , "SUBSTRATE NETWORK BULK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL BULK AND EXTERNAL BULK NODES (USED AT RF4, RF AND NQS MODES)") + `MPRcz( RBN , 0.0 , "Ohms" , "SUBSTRATE NETWORK BULK RESISTANCE PER FINGER BETWEEN INTERNAL BULK AND EXTERNAL BULK NODES (USED AT RF4, RF AND NQS MODES)") + `MPRoz( RSBWSH , 1e-3 , "Ohms/m" , "SUBSTRATE NETWORK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL SOURCE AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)") + `MPRcz( RSBN , 0.0 , "Ohms" , "SUBSTRATE NETWORK RESISTANCE PER FINGER BETWEEN INTERNAL SOURCE AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)") + `MPRoz( RDBWSH , 1e-3 , "Ohms/m" , "SUBSTRATE NETWORK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL DRAIN AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)") + `MPRcz( RDBN , 0.0 , "Ohms" , "SUBSTRATE NETWORK RESISTANCE PER FINGER BETWEEN INTERNAL DRAIN AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)") + `MPIcc( RINGTYPE , 1 , "" , 1 , 2, "RINGTYPE, SHAPE OF BULK CONNECTOR (RINGTYPE = 1 FOR HORSE-SHOE, THREE SIDES CONTACT, RINGTYPE = 2 FOR SYMMETRIC, TWO SIDES CONTACT), (USED AT RF4, RF AND NQS MODES)") From ba5aeb74a4a9aa6a244dedcc4a74748d19e1343a Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 17 Apr 2024 19:53:55 +0200 Subject: [PATCH 03/14] use analog function for exp limiting instead limexp --- code/ekv3.va | 59 +++++++++++++++++---------- code/ekv3_include/ekv3_definitions.va | 5 +++ 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/code/ekv3.va b/code/ekv3.va index fc5453a..42fb8fc 100644 --- a/code/ekv3.va +++ b/code/ekv3.va @@ -107,6 +107,21 @@ module ekv3 (d,g,s,b); `endif +////////// 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 +endfunction + inout d,g,s,b ; `ifdef DC_S electrical d, g, s, b; @@ -224,7 +239,7 @@ begin : EFFECTIVE_GATE_LENGTH_AND_WIDTH___SCALING // EFFECTIVE CHANNEL DIMENSIONS Leff = (LL == 0.0) ? l + DL + WDL / w: - l + DL + WDL / w - LL * limexp(LLN * ln(1.0 / l)); + l + DL + WDL / w - LL * lexp(LLN * ln(1.0 / l)); Weff = w + DW + LDW / l; // NOTE: Weff is the effective width of each finger. Leffc = Leff + DLC; Weffc = Weff + DWC; // NOTE: Weffc is the effective width, for capacitive aspects, of each finger. @@ -301,7 +316,7 @@ end // COMBINED_SHORT_AND_NARROW_DEVICES begin : RSCE // REVERSE SHORT CHANNEL EFFECT Leff_o_LR = Leff / LR_w; - tmp_rsce = 1.0 - limexp( - Leff_o_LR * Leff_o_LR); + tmp_rsce = 1.0 - lexp( - Leff_o_LR * Leff_o_LR); f_rsce = 2.0 * tmp_rsce / (COX * Leff_o_LR); DVT_rsce = QLR_w * f_rsce; fn_rsce = 1.0 + NLR_w * f_rsce; @@ -313,7 +328,7 @@ begin : INWE // INVERSE NARROW WIDTH EFFECT // Weff_o_WR = Weff / WR; = > Weff_o_WR = Weff / WR_l; Weff_o_WR = Weff / WR_l; - tmp_inwe = 1.0 - limexp( - Weff_o_WR * Weff_o_WR); + tmp_inwe = 1.0 - lexp( - Weff_o_WR * Weff_o_WR); // bACK TO ORIGINAL f_inwe = - 2.0 * tmp_inwe / (COX * Weff_o_WR) => 2.0 * tmp_inwe / (COX * Weff_o_WR) f_inwe = 2.0 * tmp_inwe / (COX * Weff_o_WR); DVT_inwe = - QWR_l * f_inwe; @@ -327,13 +342,13 @@ begin : MOBILITY_LENGTH_SCALING // LENGTH SCALING OF THE MOBILITY FOR SHORT AND INTERMEDIATE LENGTH CHANNEL DEVICES Leff_o_LA = Leff / LA; Leff_o_LB = Leff / LB; - MKP_l = 1.0 / (1.0 + (KA / Leff_o_LA) * (1.0 - limexp( - Leff_o_LA)) + (KB / Leff_o_LB) * (1.0 - limexp( - Leff_o_LB))); + MKP_l = 1.0 / (1.0 + (KA / Leff_o_LA) * (1.0 - lexp( - Leff_o_LA)) + (KB / Leff_o_LB) * (1.0 - lexp( - Leff_o_LB))); end // MOBILITY_LENGTH_SCALING begin : MOBILITY_WIDTH_SCALING // WIDTH SCALING OF THE MOBILITY AROUND THE VALUE OF WKP1 PARAMETER tmp_kpw = (ln(Weff / WKP1)) / WKP3; - MKP_w = 1.0 + WKP2 * limexp( - tmp_kpw * tmp_kpw); + MKP_w = 1.0 + WKP2 * lexp( - tmp_kpw * tmp_kpw); end // MOBILITY_WIDTH_SCALING begin : STI_STRESS @@ -359,7 +374,7 @@ begin : STI_STRESS // for loop replaced with while // for (i_sti = 1.0; i_sti < NF; i_sti = i_sti + 1.0) i_sti = 1.0; - while(i_sti < NF) + while (i_sti < NF) begin inv_sa05l = inv_sa05l + 1.0 / (SA_lhalf_sti + i_sti * SD_l_sti); inv_sb05l = inv_sb05l + 1.0 / (SB_lhalf_sti + i_sti * SD_l_sti); @@ -378,20 +393,20 @@ begin : STI_STRESS inv_saref05l = 1.0 / (SAREF + lhalf_sti); inv_sbref05l = 1.0 / (SBREF + lhalf_sti); - tmpl = limexp(-LLODKKP*ln(l)); - tmpw = limexp(-WLODKKP*ln(w+WLOD)); + tmpl = lexp(-LLODKKP*ln(l)); + tmpw = lexp(-WLODKKP*ln(w+WLOD)); KKP_sti = (1.0 + LKKP * tmpl + WKKP * tmpw + PKKP * tmpl * tmpw); a_sti = KKP / KKP_sti * (inv_sa05l + inv_sb05l); aref_sti = KKP / KKP_sti * (inv_saref05l + inv_sbref05l); MKP_sti = (1.0 + a_sti) / (1.0 + aref_sti); MUCRIT_sti = (1.0 + KUCRIT * a_sti) / (1.0 + KUCRIT * aref_sti); - tmpl = limexp(-LLODKVTO*ln(l)); - tmpw = limexp(-WLODKVTO*ln(w+WLOD)); + tmpl = lexp(-LLODKVTO*ln(l)); + tmpw = lexp(-WLODKVTO*ln(w+WLOD)); KVTO_sti = 1.0 + LKVTO * tmpl + WKVTO * tmpw + PKVTO * tmpl * tmpw; b_sti = inv_sa05l + inv_sb05l - inv_saref05l - inv_sbref05l; DVT_sti = KVTO / KVTO_sti * b_sti; - DGAMMA_sti = KGAMMA / limexp(LODKGAMMA*ln(KVTO_sti)) * b_sti; - DETAD_sti = KETAD / limexp(LODKETAD*ln(KVTO_sti)) * b_sti; + DGAMMA_sti = KGAMMA / lexp(LODKGAMMA*ln(KVTO_sti)) * b_sti; + DETAD_sti = KETAD / lexp(LODKETAD*ln(KVTO_sti)) * b_sti; end else // NOTE: If no basic STI parameters have been defined (are zero) begin @@ -463,11 +478,11 @@ end // TEMPERATURE_ON_STI begin : TEMPERATURE // MODEL PARAMETERS AFFECTED BY TEMPERATURE VTO_DEV_t = VTO_DEV - TCV_wlc * dT; // NOTE: VTO_DEV_t is negative for PMOS devices. - KP_DEV_t = KP_DEV * limexp(BEX * lnrT) * MKP_sti_t; + KP_DEV_t = KP_DEV * lexp(BEX * lnrT) * MKP_sti_t; ETA_t = ETA + (TETA * dT); - E0_wt = E0_w * limexp(TE0EX * lnrT); - E1_wt = E1_w * limexp(TE1EX * lnrT); - UCRIT_DEV_t = UCRIT_DEV * limexp(UCEX_w * lnrT); + E0_wt = E0_w * lexp(TE0EX * lnrT); + E1_wt = E1_w * lexp(TE1EX * lnrT); + UCRIT_DEV_t = UCRIT_DEV * lexp(UCEX_w * lnrT); LAMBDA_wt = LAMBDA_w + TLAMBDA * (rT - 1.0); IBB_t = IBB * (1.0 + IBBT * dT); // PHIF @@ -530,12 +545,12 @@ end // NORMALIZING begin : QUANTUM_MECHANICAL_EFFECT // BIAS INDEPENDENT CALCULATIONS FOR THE ACCUMULATION REGION - aqma = AQMA * limexp(`ONE3RD * ln(COX * COX / UT)); - axetaqm2_3 = aqma * limexp(`TWO3RDS * ln(ETAQM)); + aqma = AQMA * lexp(`ONE3RD * ln(COX * COX / UT)); + axetaqm2_3 = aqma * lexp(`TWO3RDS * ln(ETAQM)); // QUANTUM MECHANICAL EFFECT ON SURFACE POTENTIAL SHIFT - dqmi = `ONE3RD * AQMI * limexp(`TWO3RDS * ln(gamma_b_dev * COX * 0.5 / (sqrtUT * phif))) * (2.0 * `SQRT2 * ETAQM * nq0 * sqrtphif / gamma_b_dev - 1.0); + dqmi = `ONE3RD * AQMI * lexp(`TWO3RDS * ln(gamma_b_dev * COX * 0.5 / (sqrtUT * phif))) * (2.0 * `SQRT2 * ETAQM * nq0 * sqrtphif / gamma_b_dev - 1.0); inv_dqmip1 = 1.0 / ( 1.0 + dqmi); - dpsi0 = AQMI * limexp(`TWO3RDS * ln(gamma_b_dev * COX * `SQRT2 * sqrtphif)); + dpsi0 = AQMI * lexp(`TWO3RDS * ln(gamma_b_dev * COX * `SQRT2 * sqrtphif)); DPSI0 = dpsi0 * UT; // NOTE: Denormalized value of the surface potential shift. end // QUANTUM_MECHANICAL_EFFECT @@ -805,7 +820,7 @@ begin : CHARGE_MODEL qr1 = 3.0 * `ONESQRT2 * gamma_b_chsh; if (vg_p < 0.0) qbo = vg_p_chsh - psi_p; else qbo = vg_p_chsh / (1.0 + dpd) - psi_po; - dpsiv = axetaqm2_3 * (limexp(`TWO3RDS * ln(sqrt(`MAXA(0.25 * qbo * qbo + 4.0 * axetaqm2_3 * gamma_b_chsh2,0.0,`POS_MIN)) - 0.5 * qbo)) - limexp(`TWO3RDS * ln(sqrt(`MAXA(qr1 * qr1 + 4.0 * axetaqm2_3 * gamma_b_chsh2,0.0,`POS_MIN)) - qr1))); + dpsiv = axetaqm2_3 * (lexp(`TWO3RDS * ln(sqrt(`MAXA(0.25 * qbo * qbo + 4.0 * axetaqm2_3 * gamma_b_chsh2,0.0,`POS_MIN)) - 0.5 * qbo)) - lexp(`TWO3RDS * ln(sqrt(`MAXA(qr1 * qr1 + 4.0 * axetaqm2_3 * gamma_b_chsh2,0.0,`POS_MIN)) - qr1))); v_o_qme = v_o + dpsiv; // CALCULATIONS OF THE NORMALIZED CHARGES qS, qD, qG begin @@ -853,7 +868,7 @@ begin : DITS else // NOTE: Otherwise, the following coding calculates a DITS factor (dits_factor) which is multiplied with the channel current (IDS). begin f_dits = 1.0 / (1.0 + FPROUT * sqrt(Leff) / (qI + 2.0)); - va_dits = (f_dits / PDITS) * (1.0 + (1.0 + PDITSL * Leff) * limexp(PDITSD * (vd - vs) * UT)); + va_dits = (f_dits / PDITS) * (1.0 + (1.0 + PDITSL * Leff) * lexp(PDITSD * (vd - vs) * UT)); vdseff = vdssat - `MAXA(vdssat - (vd - vs) - DDITS, 0.0, 4.0 * DDITS * vdssat); dits_factor = (1.0 + (vd - vs - vdseff) / va_dits ); end diff --git a/code/ekv3_include/ekv3_definitions.va b/code/ekv3_include/ekv3_definitions.va index fd373cf..9dc7180 100644 --- a/code/ekv3_include/ekv3_definitions.va +++ b/code/ekv3_include/ekv3_definitions.va @@ -51,6 +51,11 @@ // Nested maximum in minimum function (smoothened) `define MINA_MAXA(val,min,max,a) (`MINA(`MAXA(val,min,a),max,a)) +// Used for limiting exponent by analog function lexp +`define EXPL_THRESHOLD 80.0 +`define MAX_EXPL 5.540622384e+34 +`define MIN_EXPL 1.804851387e-35 + // Definition used in ADMS `ifdef insideADMS `define MODEL @(initial_model) From 5c9e1129371f3b5b70e283f836111fb1c0430d6d Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 17 Apr 2024 19:56:54 +0200 Subject: [PATCH 04/14] name for white_noise contribution --- code/ekv3_include/ekv3_extrinsic_rc.va | 44 +++++++++++++------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/code/ekv3_include/ekv3_extrinsic_rc.va b/code/ekv3_include/ekv3_extrinsic_rc.va index ad4b9cf..be2cede 100644 --- a/code/ekv3_include/ekv3_extrinsic_rc.va +++ b/code/ekv3_include/ekv3_extrinsic_rc.va @@ -113,9 +113,9 @@ end // EXTERNAL_RESISTORS I(g,b) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(g,b)); // SERIES RESISTORS I(s ,si) <+ M * V(s,si) / rs_wt; - I(s ,si) <+ white_noise(KT4 / rs_wt); + I(s ,si) <+ white_noise(KT4 / rs_wt, "rs"); I(d ,di) <+ M * V(d,di) / rd_wt; - I(d ,di) <+ white_noise(KT4 / rd_wt); + I(d ,di) <+ white_noise(KT4 / rd_wt, "rd"); `endif `ifdef RF_S @@ -126,15 +126,15 @@ end // EXTERNAL_RESISTORS I(gi,bi) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(gi,bi)); // SERIES RESISTORS I(s ,si) <+ M * V(s,si) / rs_wt; - I(s ,si) <+ white_noise(KT4 / rs_wt); + I(s ,si) <+ white_noise(KT4 / rs_wt, "rs"); I(d ,di) <+ M * V(d,di) / rd_wt; - I(d ,di) <+ white_noise(KT4 / rd_wt); + I(d ,di) <+ white_noise(KT4 / rd_wt, "rd"); // GATE RESISTANCE I(g ,gi) <+ M * V(g,gi) / rg_t; - I(g ,gi) <+ white_noise(KT4 / rg_t); + I(g ,gi) <+ white_noise(KT4 / rg_t, "rg"); // SUBSTRATE RESISTANCE NETWORK I(b ,bi) <+ M * V(b,bi) / rb_t; - I(b ,bi) <+ white_noise(KT4 / rb_t); + I(b ,bi) <+ white_noise(KT4 / rb_t, "rb"); `endif `ifdef RF @@ -145,24 +145,24 @@ end // EXTERNAL_RESISTORS I(gi,bi) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(gi,bi)); // SERIES RESISTORS I(s ,si) <+ M * V(s,si) / rs_wt; - I(s ,si) <+ white_noise(KT4 / rs_wt); + I(s ,si) <+ white_noise(KT4 / rs_wt, "rs"); I(d ,di) <+ M * V(d,di) / rd_wt; - I(d ,di) <+ white_noise(KT4 / rd_wt); + I(d ,di) <+ white_noise(KT4 / rd_wt, "rd"); // GATE RESISTANCE I(g ,gi ) <+ M * V(g ,gi ) / rg_t; - I(g ,gi ) <+ white_noise(KT4 / rg_t); + I(g ,gi ) <+ white_noise(KT4 / rg_t, "rg"); // SUBSTRATE RESISTANCE NETWORK I(b ,bi ) <+ M * V(b ,bi ) / rb_t; - I(b ,bi ) <+ white_noise(KT4 / rb_t); + I(b ,bi ) <+ white_noise(KT4 / rb_t, "rb"); I(b ,bsi) <+ M * V(b ,bsi) / rsb_t; - I(b ,bsi) <+ white_noise(KT4 / rsb_t); + I(b ,bsi) <+ white_noise(KT4 / rsb_t, "rsb"); I(b ,bdi) <+ M * V(b ,bdi) / rdb_t; - I(b ,bdi) <+ white_noise(KT4 / rdb_t); + I(b ,bdi) <+ white_noise(KT4 / rdb_t, "rdb"); tmp = M * 2.0 / rdsb_t; I(bi,bsi) <+ V(bi,bsi) * tmp; - I(bi,bsi) <+ white_noise(KT4 * tmp); + I(bi,bsi) <+ white_noise(KT4 * tmp, "shot ibs"); I(bi,bdi) <+ V(bi,bdi) * tmp; - I(bi,bdi) <+ white_noise(KT4 * tmp); + I(bi,bdi) <+ white_noise(KT4 * tmp, "shot ibd"); `endif `ifdef NQS @@ -173,22 +173,22 @@ end // EXTERNAL_RESISTORS I(gi,bi) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(gi,bi)); // SERIES RESISTORS I(s ,si) <+ M * V(s,si) / rs_wt; - I(s ,si) <+ white_noise(KT4 / rs_wt); + I(s ,si) <+ white_noise(KT4 / rs_wt, "rs"); I(d ,di) <+ M * V(d,di) / rd_wt; - I(d ,di) <+ white_noise(KT4 / rd_wt); + I(d ,di) <+ white_noise(KT4 / rd_wt, "rd"); // GATE RESISTANCE I(g ,gi ) <+ M * V(g ,gi ) / rg_t; - I(g ,gi ) <+ white_noise(KT4 / rg_t); + I(g ,gi ) <+ white_noise(KT4 / rg_t, "rg"); // SUBSTRATE RESISTANCE NETWORK I(b ,bi ) <+ M * V(b ,bi ) / rb_t; - I(b ,bi ) <+ white_noise(KT4 / rb_t); + I(b ,bi ) <+ white_noise(KT4 / rb_t, "rb"); I(b ,bsi) <+ M * V(b ,bsi) / rsb_t; - I(b ,bsi) <+ white_noise(KT4 / rsb_t); + I(b ,bsi) <+ white_noise(KT4 / rsb_t, "rsb"); I(b ,bdi) <+ M * V(b ,bdi) / rdb_t; - I(b ,bdi) <+ white_noise(KT4 / rdb_t); + I(b ,bdi) <+ white_noise(KT4 / rdb_t, "rdb"); tmp = M * 2.0 / rdsb_t; I(bi,bsi) <+ V(bi,bsi) * tmp; - I(bi,bsi) <+ white_noise(KT4 * tmp); + I(bi,bsi) <+ white_noise(KT4 * tmp, "shot ibs"); I(bi,bdi) <+ V(bi,bdi) * tmp; - I(bi,bdi) <+ white_noise(KT4 * tmp); + I(bi,bdi) <+ white_noise(KT4 * tmp, "shot ibd"); `endif From 67d2a3b383a400cb1f2fdc6271a89abdf5019193 Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 18 Apr 2024 10:26:14 +0200 Subject: [PATCH 05/14] mv VS, VD, VG op declaration, so they are setted for op info --- code/ekv3_include/ekv3_variables.va | 6 +++--- code/ekv3_include/ekv3_variables_oppoint.va | 3 --- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/code/ekv3_include/ekv3_variables.va b/code/ekv3_include/ekv3_variables.va index 3645b90..10bdd57 100644 --- a/code/ekv3_include/ekv3_variables.va +++ b/code/ekv3_include/ekv3_variables.va @@ -168,9 +168,9 @@ real vbi; real sqrtvbi; real Q0; real Q0OV; -real VS; -real VD; -real VG; +`OPPATTR("VS","VS","V") real VS; +`OPPATTR("VD","VD","V") real VD; +`OPPATTR("VG","VG","V") real VG; real d_gt_s_flag; real d_gt_s; real s_gt_d; diff --git a/code/ekv3_include/ekv3_variables_oppoint.va b/code/ekv3_include/ekv3_variables_oppoint.va index b717cbb..4f4478c 100644 --- a/code/ekv3_include/ekv3_variables_oppoint.va +++ b/code/ekv3_include/ekv3_variables_oppoint.va @@ -9,9 +9,6 @@ ///// POTENTIAL INFO /////////////////////// -`OPPATTR("VS","VS","V") real VS; -`OPPATTR("VD","VD","V") real VD; -`OPPATTR("VG","VG","V") real VG; `OPPATTR("VB","VB","V") real VB; `OPPATTR("VDS","VDS","V") real VDS; `OPPATTR("VGS","VGS","V") real VGS; From 6597fe85974a37ac8c01e5610abdecd87daf46a7 Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 18 Apr 2024 10:29:20 +0200 Subject: [PATCH 06/14] IBB prevent division by zero --- code/ekv3_include/ekv3_parameters.va | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ekv3_include/ekv3_parameters.va b/code/ekv3_include/ekv3_parameters.va index af9fde2..e108328 100644 --- a/code/ekv3_include/ekv3_parameters.va +++ b/code/ekv3_include/ekv3_parameters.va @@ -148,7 +148,7 @@ // IMPACT IONIZATION CURRENT (3) `MPRnb( IBA , 0.0 , "1/m" , "PARAMETER A OF IMPACT IONIZATION CURRENT") - `MPRnb( IBB , 300e6 , "V/m" , "PARAMETER B OF IMPACT IONIZATION CURRENT") + `MPRoz( IBB , 300e6 , "V/m" , "PARAMETER B OF IMPACT IONIZATION CURRENT") `MPRnb( IBN , 1.0 , "" , "PARAMETER N OF IMPACT IONIZATION CURRENT") // GATE CURRENT (4) From 3ffd918177bade96c12127a84fba3b67ec7b4037 Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 18 Apr 2024 22:27:45 +0200 Subject: [PATCH 07/14] mv certain op declaration, so they are setted for op info --- code/ekv3_include/ekv3_variables.va | 6 +++--- code/ekv3_include/ekv3_variables_oppoint.va | 4 ---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/code/ekv3_include/ekv3_variables.va b/code/ekv3_include/ekv3_variables.va index 10bdd57..93f1b30 100644 --- a/code/ekv3_include/ekv3_variables.va +++ b/code/ekv3_include/ekv3_variables.va @@ -23,11 +23,11 @@ real SIGN_NF_M; real l; real WF; real w; -real Leff; -real Weff; +`OPPATTR("Weff","Effective finger Width","m") real Weff; +`OPPATTR("Leff","Effective Length","m") real Leff; real Leffc; real Weffc; -real WeffNF; +`OPPATTR("WeffNF","Effective Total Width","m") real WeffNF; real WeffcNF; real WLeff; real WLeffNF; diff --git a/code/ekv3_include/ekv3_variables_oppoint.va b/code/ekv3_include/ekv3_variables_oppoint.va index 4f4478c..f8b2dee 100644 --- a/code/ekv3_include/ekv3_variables_oppoint.va +++ b/code/ekv3_include/ekv3_variables_oppoint.va @@ -9,7 +9,6 @@ ///// POTENTIAL INFO /////////////////////// -`OPPATTR("VB","VB","V") real VB; `OPPATTR("VDS","VDS","V") real VDS; `OPPATTR("VGS","VGS","V") real VGS; `OPPATTR("VBS","VBS","V") real VBS; @@ -34,9 +33,6 @@ `OPPATTR("VTB","Effective Threshold Voltage VTB","V") real Vtb; /////////////////////////////////////////////// /////////////////////////////////////////////// -`OPPATTR("WeffNF","Effective Total Width","m") real WeffNF; -`OPPATTR("Weff","Effective finger Width","m") real Weff; -`OPPATTR("Leff","Effective Length","m") real Leff; `OPPATTR("Nf","Number of fingers","") real Nf; //////CURRENT - CHARGE INFO //////////////////// //`OPPATTR("if","Forward Normalized Current","") real if_; From 0397136353da940e288cfbced2761a8af1950bfd Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 18 Apr 2024 22:41:16 +0200 Subject: [PATCH 08/14] format --- code/ekv3_include/ekv3_oppoints.va | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/ekv3_include/ekv3_oppoints.va b/code/ekv3_include/ekv3_oppoints.va index c91276c..6f2f433 100644 --- a/code/ekv3_include/ekv3_oppoints.va +++ b/code/ekv3_include/ekv3_oppoints.va @@ -117,12 +117,12 @@ VM = ID/ gmdex; ///Transit Fr4equency ///////////////// Ft = gmgex / (2.0*`PI*Ctotex); -if (ID !=0.0) begin +if (ID !=0.0) begin GmgUtId = UT * abs(gmgex / ID); GmsUtId = UT * abs(gmsex / ID); GmbUtId = UT * abs(gmbex / ID); GmdUtId = UT * abs(gmdex / ID); -GmId =abs( gmgex / ID ); +GmId = abs( gmgex / ID ); end else begin GmgUtId = 0.0; From 0c4e0fe258e9a7d3e915ee0f52e13858a368a82e Mon Sep 17 00:00:00 2001 From: dwarning Date: Fri, 19 Apr 2024 07:55:11 +0200 Subject: [PATCH 09/14] move or comment-out certain op declaration, so they are setted for op info --- code/ekv3_include/ekv3_variables.va | 2 +- code/ekv3_include/ekv3_variables_oppoint.va | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/code/ekv3_include/ekv3_variables.va b/code/ekv3_include/ekv3_variables.va index 93f1b30..8e41a38 100644 --- a/code/ekv3_include/ekv3_variables.va +++ b/code/ekv3_include/ekv3_variables.va @@ -506,7 +506,7 @@ real dq_dksi; real a_gc; real b_gc; real IGB; -real IG; +`OPPATTR("IGex","Extrinsic Current Gate Side","A") real IG; real IGD; real IGS; real psi_ox_sovgc; diff --git a/code/ekv3_include/ekv3_variables_oppoint.va b/code/ekv3_include/ekv3_variables_oppoint.va index f8b2dee..b64c1da 100644 --- a/code/ekv3_include/ekv3_variables_oppoint.va +++ b/code/ekv3_include/ekv3_variables_oppoint.va @@ -20,7 +20,6 @@ `OPPATTR("IDSedge","Edge Effect Current","A") real ids_edge_effect; `OPPATTR("IDex","Extrinsic Current Drain Side","A") real ID; `OPPATTR("ISex","Extrinsic Current Source Side","A") real IS; -`OPPATTR("IGex","Extrinsic Current Gate Side","A") real IG; `OPPATTR("IBex","Extrinsic Current Bulk Side","A") real IB; /////////////////////////////////////////////// `OPPATTR("n","Slope Factor n","") real slopefactor; @@ -28,7 +27,7 @@ `OPPATTR("Vp","Pinch-Off Voltage","") real Vp; `OPPATTR("VOD","Overdrive Voltage n*(Vp-Vs)","V") real VOD; `OPPATTR("VDSAT","Saturation Voltage","V") real VDSAT; -`OPPATTR("sat","Saturation Flag","s") real sat; +//`OPPATTR("sat","Saturation Flag","s") real sat; `OPPATTR("VTH","Effective Threshold Voltage VTH","V") real VTH; `OPPATTR("VTB","Effective Threshold Voltage VTB","V") real Vtb; /////////////////////////////////////////////// @@ -92,8 +91,8 @@ `OPPATTR("SVG_flicker","Flicker Noise PSD SdVG @ 1Hz","V^2/Hz") real SVG_flicker; `OPPATTR("SVG_thermal","Thermal Noise PSD SdVG","V^2/Hz") real SVG_thermal; -`OPPATTR("sigmaDIdoId","Relative Current Mismatch","") real siId; -`OPPATTR("sigmaVg","Gate Voltage Offset","V") real siVg; +//`OPPATTR("sigmaDIdoId","Relative Current Mismatch","") real siId; +//`OPPATTR("sigmaVg","Gate Voltage Offset","V") real siVg; `OPPATTR("I0","Technology Current","V") real i0; //`OPPATTR("M_","M_"," ") real mtmp; From aa1fbf626aebaf66587778af4da2f290a187382b Mon Sep 17 00:00:00 2001 From: dwarning Date: Fri, 19 Apr 2024 11:14:07 +0200 Subject: [PATCH 10/14] assume flicker noise is zero if no current --- code/ekv3_include/ekv3_noise.va | 1 + 1 file changed, 1 insertion(+) diff --git a/code/ekv3_include/ekv3_noise.va b/code/ekv3_include/ekv3_noise.va index fdb16fb..f542a33 100644 --- a/code/ekv3_include/ekv3_noise.va +++ b/code/ekv3_include/ekv3_noise.va @@ -57,6 +57,7 @@ begin end else begin +sddm = 0; kddm = 0; end sidm = sddm * kddm *IDS*IDS ; From e445791c4877aac354ba8867a87bea85e9417b8a Mon Sep 17 00:00:00 2001 From: dwarning Date: Fri, 19 Apr 2024 11:39:41 +0200 Subject: [PATCH 11/14] format --- code/ekv3.va | 1716 ++++++++++---------- code/ekv3_include/ekv3_definitions.va | 16 +- code/ekv3_include/ekv3_edge.va | 88 +- code/ekv3_include/ekv3_extract_debug.va | 142 +- code/ekv3_include/ekv3_extrinsic_diodes.va | 252 +-- code/ekv3_include/ekv3_extrinsic_rc.va | 62 +- code/ekv3_include/ekv3_functions_def.va | 120 +- code/ekv3_include/ekv3_gate_current.va | 124 +- code/ekv3_include/ekv3_gidl.va | 22 +- code/ekv3_include/ekv3_noise.va | 324 ++-- code/ekv3_include/ekv3_oppoints.va | 286 ++-- code/ekv3_include/ekv3_overlap.va | 8 +- code/ekv3_include/ekv3_parameters.va | 524 +++--- 13 files changed, 1842 insertions(+), 1842 deletions(-) diff --git a/code/ekv3.va b/code/ekv3.va index 42fb8fc..e8a30a5 100644 --- a/code/ekv3.va +++ b/code/ekv3.va @@ -104,7 +104,7 @@ module ekv3_nqs (d,g,s,b); `endif `else - module ekv3 (d,g,s,b); + module ekv3 (d,g,s,b); `endif ////////// Clamped Exponential Function ////////// @@ -126,7 +126,7 @@ inout d,g,s,b ; `ifdef DC_S electrical d, g, s, b; electrical noi; -//Operating Point definitions of nodes + //Operating Point definitions of nodes `define GEFF g `define DEFF d `define SEFF s @@ -136,7 +136,7 @@ inout d,g,s,b ; electrical d, g, s, b; electrical di, si; electrical noi; -//Operating Point definitions of nodes + //Operating Point definitions of nodes `define GEFF g `define DEFF di `define SEFF si @@ -147,7 +147,7 @@ inout d,g,s,b ; electrical di, si; electrical gi, bi; electrical noi; -//Operating Point definitions of nodes + //Operating Point definitions of nodes `define GEFF gi `define DEFF di `define SEFF si @@ -159,7 +159,7 @@ inout d,g,s,b ; electrical gi, bi; electrical bdi, bsi; electrical noi; -//Operating Point definitions of nodes + //Operating Point definitions of nodes `define GEFF gi `define DEFF di `define SEFF si @@ -172,7 +172,7 @@ inout d,g,s,b ; electrical bdi, bsi; electrical m1, m2, m3, m4; electrical noi; -//Operating Point definitions of nodes + //Operating Point definitions of nodes `define GEFF gi `define DEFF di `define SEFF si @@ -186,704 +186,704 @@ inout d,g,s,b ; `include "ekv3_include/ekv3_variables_oppoint.va" analog begin -//////////////////////////////////////////////////////////////////////////////// -// LEVEL 0 // -// MODEL LEVEL CALCULATIONS // -//////////////////////////////////////////////////////////////////////////////// -begin:EKV3 + //////////////////////////////////////////////////////////////////////////////// + // LEVEL 0 // + // MODEL LEVEL CALCULATIONS // + //////////////////////////////////////////////////////////////////////////////// + begin:EKV3 `include "ekv3_include/ekv3_variables.va" -`MODEL -begin - -begin : GENERAL_VALUES -// SIMULATION FLAGS - QON = (1.0 - QOFF); -// IMPORTANT LENGTHS - TSI = `C_EPSSIL / COX; - TOX = `C_EPSOX / COX; - LC = sqrt(TSI * XJ); // NOTE: used in the Velocity Saturation model -// NOMINAL TEMPERATURE PARAMETERS - TNOMK = TNOM + 273.15; // Nominal temperature of model parameters in Kelvin - UTNOM = `UT(TNOMK); -end // GENERAL_VALUES - -// SCALING OF NON-INSTANCE RELATED DIMENSIONS - hdif = HDIF * SCALE; - ldif = LDIF * SCALE; -// FREQUENTLY PERFOMED CALCULATIONS - TOX2 = TOX * TOX; - -end - -//////////////////////////////////////////////////////////////////////////////// -// LEVEL 1 // -// INSTANCE LEVEL CALCULATIONS // -//////////////////////////////////////////////////////////////////////////////// - -`INSTANCE -begin -// This variable is set in order to overcome the modulo (%) operand problem in ADMS - even_nf =(NF/2); - even_nf =even_nf*2; -// FREQUENTLY PERFOMED CALCULATIONS - NF_M = NF * M; - SIGN_NF = SIGN * NF; - SIGN_M = SIGN * M; - SIGN_NF_M = SIGN * NF_M; - -begin : EFFECTIVE_GATE_LENGTH_AND_WIDTH___SCALING -// SCALING OF INSTANCE RELATED DIMENSIONS - l = L * SCALE + XL; - WF = W / NF; // NOTE: W is the drawn width of the device, while WF is the drawn width of each finger. - w = WF * SCALE + XW; // NOTE: w is the scaled width of each finger. -// EFFECTIVE CHANNEL DIMENSIONS - Leff = (LL == 0.0) ? - l + DL + WDL / w: - l + DL + WDL / w - LL * lexp(LLN * ln(1.0 / l)); - Weff = w + DW + LDW / l; // NOTE: Weff is the effective width of each finger. - Leffc = Leff + DLC; - Weffc = Weff + DWC; // NOTE: Weffc is the effective width, for capacitive aspects, of each finger. -// LIMITING CHANNEL DIMENSIONS TO HIGHER THAN 1nm - Leff = `MAX(Leff ,1.0e-9); - Weff = `MAX(Weff ,1.0e-9); - Leffc = `MAX(Leffc,1.0e-9); - Weffc = `MAX(Weffc,1.0e-9); -// FREQUENTLY PERFOMED CALCULATIONS - WeffNF = Weff * NF; - WeffcNF = Weffc * NF; - WLeff = Weff * Leff; // NOTE: WLeff is the channel area of each finger. - WLeffNF = WeffNF * Leff; // NOTE: WLeffNF is the channel area of the whole device. - Leff2 = Leff * Leff; - rWedge = WEDGE/Weff; // NOTE: Edge device width over full width ratio - rWNedge = 1.0 - rWedge; // NOTE: Non-edge device width over full width ratio - rWNWedge = rWedge / rWNedge; // NOTE: Non-edge over edge width ratio -end // EFFECTIVE_GATE_LENGTH_AND_WIDTH___SCALING - -begin : MATCHING_PROPERTIES -// FREQUENTLY PERFOMED CALCULATIONS - awl = 1.0E6 / sqrt(WLeffNF); -// VTO, GAMMA, KP MISMATCH CALCULATIONS - VTO_a = VTO + AVTO * awl; - GAMMA_a = GAMMA + AGAMMA * awl; - KP_a = KP * (1.0 + AKP * awl); -end // MATCHING_PROPERTIES - -begin : LONG_AND_WIDE_CHANNEL_VTO_CORRECTION -// THRESHOLD VOLTAGE CORRECTION FOR LONG AND WIDE CHANNEL - DVT_long = - AVT * `MAXA(ln(Leff / LVT),0.0,1.0e-2); - DVT_wide = - AVT * `MAXA(ln(Weff / WVT),0.0,1.0e-2); -end // LONG_AND_WIDE_CHANNEL_VTO_CORRECTION - -begin : LONG_AND_WIDE_CHANNEL_GAMMA_CORRECTION -// BODY EFFECT COEFFICIENT CORRECTION FOR LONG AND WIDE CHANNEL - DGAMMA_long = - AGAM * `MAXA(ln(Leff / LGAM),0.0,1.0e-2); - DGAMMA_wide = - AGAM * `MAXA(ln(Weff / WGAM),0.0,1.0e-2); -end // LONG_AND_WIDE_CHANNEL_GAMMA_CORRECTION - -begin : NF_DEPENDENCE_ON_THRESHOLD_VOLTAGE -// THRESHOLD VOLTAGE DEPENDENCE ON NUMBER OF FINGERS -// EMPIRICAL MODEL, OBSOLETE BY SHALLOW TRENCH ISOLATION STRESS EFFECT - DVT_nf = NFVTA * log(((NF)-1)*NFVTB+1); -end // NF_DEPENDENCE_ON_THRESHOLD_VOLTAGE - -begin : WIDTH_SCALING -// WIDTH SCALING OF MODEL PARAMETERS FOR NARROW CHANNEL DEVICES - LR_w = LR + WLR / Weff; - QLR_w = QLR * (1.0 + WQLR / Weff); - NLR_w = NLR * (1.0 + WNLR / Weff); - E0_w = E0 * (1.0 + WE0 / Weff); - E1_w = E1 * (1.0 + WE1 / Weff); - UCRIT_w = UCRIT * (1.0 + WUCRIT / Weff); - LAMBDA_w = LAMBDA * (1.0 + WLAMBDA / Weff); - ETAD_w = ETAD * (1.0 + WETAD / Weff); - TCV_w = TCV + TCVW / Weff; - UCEX_w = UCEX * (1.0 + WUCEX / Weff); -end // WIDTH_SCALING - -begin : LENGTH_SCALING -// LENGTH SCALING OF MODEL PARAMETERS FOR SHORT CHANNEL DEVICES - WR_l = WR + LWR / Leff; - QWR_l = QWR * (1.0 + LQWR / Leff); - NWR_l = NWR * (1.0 + LNWR / Leff); - TCV_wl = TCV_w + TCVL / Leff; -end // LENGTH_SCALING - -begin : COMBINED_SHORT_AND_NARROW_DEVICES -// SCALING OF MODEL PARAMETERS FOR COMBINED SHORT AND NARROW CHANNEL DEVICES - TCV_wlc = TCV_wl + TCVWL / WLeff; -end // COMBINED_SHORT_AND_NARROW_DEVICES - -begin : RSCE -// REVERSE SHORT CHANNEL EFFECT - Leff_o_LR = Leff / LR_w; - tmp_rsce = 1.0 - lexp( - Leff_o_LR * Leff_o_LR); - f_rsce = 2.0 * tmp_rsce / (COX * Leff_o_LR); - DVT_rsce = QLR_w * f_rsce; - fn_rsce = 1.0 + NLR_w * f_rsce; - MGAMMA_rcse = sqrt(fn_rsce); - DPHIF_rsce = UTNOM * FLR * ln(fn_rsce); -end // RSCE - -begin : INWE -// INVERSE NARROW WIDTH EFFECT -// Weff_o_WR = Weff / WR; = > Weff_o_WR = Weff / WR_l; - Weff_o_WR = Weff / WR_l; - tmp_inwe = 1.0 - lexp( - Weff_o_WR * Weff_o_WR); -// bACK TO ORIGINAL f_inwe = - 2.0 * tmp_inwe / (COX * Weff_o_WR) => 2.0 * tmp_inwe / (COX * Weff_o_WR) - f_inwe = 2.0 * tmp_inwe / (COX * Weff_o_WR); - DVT_inwe = - QWR_l * f_inwe; - MGAMMA_inwe = 1.0 / sqrt(1.0 + NWR_l * f_inwe); -end // INWE - - - - -begin : MOBILITY_LENGTH_SCALING -// LENGTH SCALING OF THE MOBILITY FOR SHORT AND INTERMEDIATE LENGTH CHANNEL DEVICES - Leff_o_LA = Leff / LA; - Leff_o_LB = Leff / LB; - MKP_l = 1.0 / (1.0 + (KA / Leff_o_LA) * (1.0 - lexp( - Leff_o_LA)) + (KB / Leff_o_LB) * (1.0 - lexp( - Leff_o_LB))); -end // MOBILITY_LENGTH_SCALING - -begin : MOBILITY_WIDTH_SCALING -// WIDTH SCALING OF THE MOBILITY AROUND THE VALUE OF WKP1 PARAMETER - tmp_kpw = (ln(Weff / WKP1)) / WKP3; - MKP_w = 1.0 + WKP2 * lexp( - tmp_kpw * tmp_kpw); -end // MOBILITY_WIDTH_SCALING - -begin : STI_STRESS -// SHALLOW TRENCH ISOLATION STRESS EFFECT - if ((SA > 0) && (SB > 0)) // NOTE: Basic STI parameters - begin -// FREQUENTLY PERFOMED CALCULATIONS - lhalf_sti = 0.5 * l; - SA_lhalf_sti = SA + lhalf_sti; - SB_lhalf_sti = SB + lhalf_sti; - SD_l_sti = SD + l; - - i_sti = 0.0; // NOTE: Index used in multi-finger devices in for-loop. - if (NF == 1) // For single-finger devices + `MODEL begin - inv_sa05l = 1.0 / (SA_lhalf_sti); - inv_sb05l = 1.0 / (SB_lhalf_sti); + + begin : GENERAL_VALUES + // SIMULATION FLAGS + QON = (1.0 - QOFF); + // IMPORTANT LENGTHS + TSI = `C_EPSSIL / COX; + TOX = `C_EPSOX / COX; + LC = sqrt(TSI * XJ); // NOTE: used in the Velocity Saturation model + // NOMINAL TEMPERATURE PARAMETERS + TNOMK = TNOM + 273.15; // Nominal temperature of model parameters in Kelvin + UTNOM = `UT(TNOMK); + end // GENERAL_VALUES + + // SCALING OF NON-INSTANCE RELATED DIMENSIONS + hdif = HDIF * SCALE; + ldif = LDIF * SCALE; + // FREQUENTLY PERFOMED CALCULATIONS + TOX2 = TOX * TOX; + end - else if (NF > 1) // For multi-finger devices (for-loop calculation) + + //////////////////////////////////////////////////////////////////////////////// + // LEVEL 1 // + // INSTANCE LEVEL CALCULATIONS // + //////////////////////////////////////////////////////////////////////////////// + + `INSTANCE begin - inv_sa05l = 1.0 / (SA_lhalf_sti); - inv_sb05l = 1.0 / (SB_lhalf_sti); -// for loop replaced with while -// for (i_sti = 1.0; i_sti < NF; i_sti = i_sti + 1.0) + // This variable is set in order to overcome the modulo (%) operand problem in ADMS + even_nf =(NF/2); + even_nf =even_nf*2; + // FREQUENTLY PERFOMED CALCULATIONS + NF_M = NF * M; + SIGN_NF = SIGN * NF; + SIGN_M = SIGN * M; + SIGN_NF_M = SIGN * NF_M; + + begin : EFFECTIVE_GATE_LENGTH_AND_WIDTH___SCALING + // SCALING OF INSTANCE RELATED DIMENSIONS + l = L * SCALE + XL; + WF = W / NF; // NOTE: W is the drawn width of the device, while WF is the drawn width of each finger. + w = WF * SCALE + XW; // NOTE: w is the scaled width of each finger. + // EFFECTIVE CHANNEL DIMENSIONS + Leff = (LL == 0.0) ? + l + DL + WDL / w: + l + DL + WDL / w - LL * lexp(LLN * ln(1.0 / l)); + Weff = w + DW + LDW / l; // NOTE: Weff is the effective width of each finger. + Leffc = Leff + DLC; + Weffc = Weff + DWC; // NOTE: Weffc is the effective width, for capacitive aspects, of each finger. + // LIMITING CHANNEL DIMENSIONS TO HIGHER THAN 1nm + Leff = `MAX(Leff ,1.0e-9); + Weff = `MAX(Weff ,1.0e-9); + Leffc = `MAX(Leffc,1.0e-9); + Weffc = `MAX(Weffc,1.0e-9); + // FREQUENTLY PERFOMED CALCULATIONS + WeffNF = Weff * NF; + WeffcNF = Weffc * NF; + WLeff = Weff * Leff; // NOTE: WLeff is the channel area of each finger. + WLeffNF = WeffNF * Leff; // NOTE: WLeffNF is the channel area of the whole device. + Leff2 = Leff * Leff; + rWedge = WEDGE/Weff; // NOTE: Edge device width over full width ratio + rWNedge = 1.0 - rWedge; // NOTE: Non-edge device width over full width ratio + rWNWedge = rWedge / rWNedge; // NOTE: Non-edge over edge width ratio + end // EFFECTIVE_GATE_LENGTH_AND_WIDTH___SCALING + + begin : MATCHING_PROPERTIES + // FREQUENTLY PERFOMED CALCULATIONS + awl = 1.0E6 / sqrt(WLeffNF); + // VTO, GAMMA, KP MISMATCH CALCULATIONS + VTO_a = VTO + AVTO * awl; + GAMMA_a = GAMMA + AGAMMA * awl; + KP_a = KP * (1.0 + AKP * awl); + end // MATCHING_PROPERTIES + + begin : LONG_AND_WIDE_CHANNEL_VTO_CORRECTION + // THRESHOLD VOLTAGE CORRECTION FOR LONG AND WIDE CHANNEL + DVT_long = - AVT * `MAXA(ln(Leff / LVT),0.0,1.0e-2); + DVT_wide = - AVT * `MAXA(ln(Weff / WVT),0.0,1.0e-2); + end // LONG_AND_WIDE_CHANNEL_VTO_CORRECTION + + begin : LONG_AND_WIDE_CHANNEL_GAMMA_CORRECTION + // BODY EFFECT COEFFICIENT CORRECTION FOR LONG AND WIDE CHANNEL + DGAMMA_long = - AGAM * `MAXA(ln(Leff / LGAM),0.0,1.0e-2); + DGAMMA_wide = - AGAM * `MAXA(ln(Weff / WGAM),0.0,1.0e-2); + end // LONG_AND_WIDE_CHANNEL_GAMMA_CORRECTION + + begin : NF_DEPENDENCE_ON_THRESHOLD_VOLTAGE + // THRESHOLD VOLTAGE DEPENDENCE ON NUMBER OF FINGERS + // EMPIRICAL MODEL, OBSOLETE BY SHALLOW TRENCH ISOLATION STRESS EFFECT + DVT_nf = NFVTA * log(((NF)-1)*NFVTB+1); + end // NF_DEPENDENCE_ON_THRESHOLD_VOLTAGE + + begin : WIDTH_SCALING + // WIDTH SCALING OF MODEL PARAMETERS FOR NARROW CHANNEL DEVICES + LR_w = LR + WLR / Weff; + QLR_w = QLR * (1.0 + WQLR / Weff); + NLR_w = NLR * (1.0 + WNLR / Weff); + E0_w = E0 * (1.0 + WE0 / Weff); + E1_w = E1 * (1.0 + WE1 / Weff); + UCRIT_w = UCRIT * (1.0 + WUCRIT / Weff); + LAMBDA_w = LAMBDA * (1.0 + WLAMBDA / Weff); + ETAD_w = ETAD * (1.0 + WETAD / Weff); + TCV_w = TCV + TCVW / Weff; + UCEX_w = UCEX * (1.0 + WUCEX / Weff); + end // WIDTH_SCALING + + begin : LENGTH_SCALING + // LENGTH SCALING OF MODEL PARAMETERS FOR SHORT CHANNEL DEVICES + WR_l = WR + LWR / Leff; + QWR_l = QWR * (1.0 + LQWR / Leff); + NWR_l = NWR * (1.0 + LNWR / Leff); + TCV_wl = TCV_w + TCVL / Leff; + end // LENGTH_SCALING + + begin : COMBINED_SHORT_AND_NARROW_DEVICES + // SCALING OF MODEL PARAMETERS FOR COMBINED SHORT AND NARROW CHANNEL DEVICES + TCV_wlc = TCV_wl + TCVWL / WLeff; + end // COMBINED_SHORT_AND_NARROW_DEVICES + + begin : RSCE + // REVERSE SHORT CHANNEL EFFECT + Leff_o_LR = Leff / LR_w; + tmp_rsce = 1.0 - lexp( - Leff_o_LR * Leff_o_LR); + f_rsce = 2.0 * tmp_rsce / (COX * Leff_o_LR); + DVT_rsce = QLR_w * f_rsce; + fn_rsce = 1.0 + NLR_w * f_rsce; + MGAMMA_rcse = sqrt(fn_rsce); + DPHIF_rsce = UTNOM * FLR * ln(fn_rsce); + end // RSCE + + begin : INWE + // INVERSE NARROW WIDTH EFFECT + // Weff_o_WR = Weff / WR; = > Weff_o_WR = Weff / WR_l; + Weff_o_WR = Weff / WR_l; + tmp_inwe = 1.0 - lexp( - Weff_o_WR * Weff_o_WR); + // bACK TO ORIGINAL f_inwe = - 2.0 * tmp_inwe / (COX * Weff_o_WR) => 2.0 * tmp_inwe / (COX * Weff_o_WR) + f_inwe = 2.0 * tmp_inwe / (COX * Weff_o_WR); + DVT_inwe = - QWR_l * f_inwe; + MGAMMA_inwe = 1.0 / sqrt(1.0 + NWR_l * f_inwe); + end // INWE + + + + + begin : MOBILITY_LENGTH_SCALING + // LENGTH SCALING OF THE MOBILITY FOR SHORT AND INTERMEDIATE LENGTH CHANNEL DEVICES + Leff_o_LA = Leff / LA; + Leff_o_LB = Leff / LB; + MKP_l = 1.0 / (1.0 + (KA / Leff_o_LA) * (1.0 - lexp( - Leff_o_LA)) + (KB / Leff_o_LB) * (1.0 - lexp( - Leff_o_LB))); + end // MOBILITY_LENGTH_SCALING + + begin : MOBILITY_WIDTH_SCALING + // WIDTH SCALING OF THE MOBILITY AROUND THE VALUE OF WKP1 PARAMETER + tmp_kpw = (ln(Weff / WKP1)) / WKP3; + MKP_w = 1.0 + WKP2 * lexp( - tmp_kpw * tmp_kpw); + end // MOBILITY_WIDTH_SCALING + + begin : STI_STRESS + // SHALLOW TRENCH ISOLATION STRESS EFFECT + if ((SA > 0) && (SB > 0)) // NOTE: Basic STI parameters + begin + // FREQUENTLY PERFOMED CALCULATIONS + lhalf_sti = 0.5 * l; + SA_lhalf_sti = SA + lhalf_sti; + SB_lhalf_sti = SB + lhalf_sti; + SD_l_sti = SD + l; + + i_sti = 0.0; // NOTE: Index used in multi-finger devices in for-loop. + if (NF == 1) // For single-finger devices + begin + inv_sa05l = 1.0 / (SA_lhalf_sti); + inv_sb05l = 1.0 / (SB_lhalf_sti); + end + else if (NF > 1) // For multi-finger devices (for-loop calculation) + begin + inv_sa05l = 1.0 / (SA_lhalf_sti); + inv_sb05l = 1.0 / (SB_lhalf_sti); + // for loop replaced with while + // for (i_sti = 1.0; i_sti < NF; i_sti = i_sti + 1.0) i_sti = 1.0; while (i_sti < NF) - begin - inv_sa05l = inv_sa05l + 1.0 / (SA_lhalf_sti + i_sti * SD_l_sti); - inv_sb05l = inv_sb05l + 1.0 / (SB_lhalf_sti + i_sti * SD_l_sti); - i_sti = i_sti + 1.0; - end - inv_sa05l = inv_sa05l / NF; - inv_sb05l = inv_sb05l / NF; - - end - else // For completeness - begin - inv_sa05l = 1.0; - inv_sb05l = 1.0; - end - - inv_saref05l = 1.0 / (SAREF + lhalf_sti); - inv_sbref05l = 1.0 / (SBREF + lhalf_sti); - - tmpl = lexp(-LLODKKP*ln(l)); - tmpw = lexp(-WLODKKP*ln(w+WLOD)); - KKP_sti = (1.0 + LKKP * tmpl + WKKP * tmpw + PKKP * tmpl * tmpw); - a_sti = KKP / KKP_sti * (inv_sa05l + inv_sb05l); - aref_sti = KKP / KKP_sti * (inv_saref05l + inv_sbref05l); - MKP_sti = (1.0 + a_sti) / (1.0 + aref_sti); - MUCRIT_sti = (1.0 + KUCRIT * a_sti) / (1.0 + KUCRIT * aref_sti); - tmpl = lexp(-LLODKVTO*ln(l)); - tmpw = lexp(-WLODKVTO*ln(w+WLOD)); - KVTO_sti = 1.0 + LKVTO * tmpl + WKVTO * tmpw + PKVTO * tmpl * tmpw; - b_sti = inv_sa05l + inv_sb05l - inv_saref05l - inv_sbref05l; - DVT_sti = KVTO / KVTO_sti * b_sti; - DGAMMA_sti = KGAMMA / lexp(LODKGAMMA*ln(KVTO_sti)) * b_sti; - DETAD_sti = KETAD / lexp(LODKETAD*ln(KVTO_sti)) * b_sti; - end - else // NOTE: If no basic STI parameters have been defined (are zero) - begin - inv_sa05l = 1.0; - inv_sb05l = 1.0; - inv_saref05l = 1.0; - inv_sbref05l = 1.0; - KKP_sti = 1.0; - MKP_sti = 1.0; - MUCRIT_sti = 1.0; - DVT_sti = 0.0; - DGAMMA_sti = 0.0; - DETAD_sti = 0.0; - end -end // STI_STRESS - -// CALCULATIONS OF THE DEVICE LEVEL PARAMETERS - VTO_DEV = VTO_a + SIGN * (DVT_long + DVT_wide + DVT_rsce + DVT_inwe + DVT_nf + DVT_sti); // NOTE: SIGN switches the sign of the threshold voltage shift of each effect. VTO_DEV is negative for PMOS devices. - GAMMA_DEV = GAMMA_a * MGAMMA_rcse * MGAMMA_inwe + DGAMMA_sti + DGAMMA_long + DGAMMA_wide; - PHIF_DEV = PHIF + DPHIF_rsce; - KP_DEV = KP_a * MKP_l * MKP_w * MKP_sti; - ETAD_DEV = ETAD_w + DETAD_sti; - UCRIT_DEV = UCRIT_w * MUCRIT_sti; - -begin : CHARGE_SHARING -// DEVICE LEVEL PARAMETERS FOR CHARGE SHARING EFFECT - CHSHL = LETA0 + LETA / Leff + LETA2 / Leff2; - CHSHW = WETA / Weff; - NUV = N0 + NCS * 3.0 * TOX * CHSHL; - CHSHLTSI = CHSHL * TSI; - CHSHWTSI = CHSHW * TSI; -end // CHARGE_SHARING - -//////////////////////////////////////////////////////////////////////////////// -// LEVEL 2 // -// TEMPERATURE MODELLING OF INSTANCE LEVEL // -//////////////////////////////////////////////////////////////////////////////// - -begin : STANDARD_VALUES -// TEMPERATURE PARAMETERS - T = $temperature; // Simulation temperature of the device in Kelvin - UT = `UT(T); -// FREQUENTLY PERFORMED CALCULATIONS - dT = T - TNOMK; - dT2 = dT * dT; - rT = T / TNOMK; - lnrT = ln(rT); - UT2 = UT * UT; - UT3 = UT * UT2; - sqrtUT = sqrt(UT); - KT4 = 4.0 * `C_K * T; -end // STANDARD_VALUES - -begin : TEMPERATURE_ON_STI -// TEMPERATURE EFFECT ON STI STRESS EFFECT - if ((SA > 0) && (SB > 0)) - begin - KKP_sti_t = KKP_sti * (1.0 + TKKP * (rT - 1.0)); - a_sti_t = KKP / KKP_sti_t * (inv_sa05l + inv_sb05l); - aref_sti_t = KKP / KKP_sti_t * (inv_saref05l + inv_sbref05l); - MKP_sti_t = (1.0 + a_sti_t) / (1.0 + aref_sti_t) / MKP_sti; - end - else - begin - MKP_sti_t = 1.0; - end -end // TEMPERATURE_ON_STI - -begin : TEMPERATURE -// MODEL PARAMETERS AFFECTED BY TEMPERATURE - VTO_DEV_t = VTO_DEV - TCV_wlc * dT; // NOTE: VTO_DEV_t is negative for PMOS devices. - KP_DEV_t = KP_DEV * lexp(BEX * lnrT) * MKP_sti_t; - ETA_t = ETA + (TETA * dT); - E0_wt = E0_w * lexp(TE0EX * lnrT); - E1_wt = E1_w * lexp(TE1EX * lnrT); - UCRIT_DEV_t = UCRIT_DEV * lexp(UCEX_w * lnrT); - LAMBDA_wt = LAMBDA_w + TLAMBDA * (rT - 1.0); - IBB_t = IBB * (1.0 + IBBT * dT); -// PHIF - eg_tnom = 1.16 - (7.02E-4 * TNOMK * TNOMK) / (TNOMK + 1108.0); // NOTE: Also used for junction diode temperature dependence - eg_t = 1.16 - (7.02E-4 * T * T) / (T + 1108); // NOTE: Also used for junction diode temperature dependence - PHIF_DEV_t = PHIF_DEV * rT + (- UT * 3.0 * lnrT + eg_t - eg_tnom * rT) / 2.0; -end // TEMPERATURE - -//////////////////////////////////////////////////////////////////////////////// -// LEVEL 3a // -// INTRINSIC PART OF THE MODEL // -// CALCULATION OF NORMALIZED VALUES (INDEPENDENT OF EXTERNAL POTENTIAL) // -//////////////////////////////////////////////////////////////////////////////// - -begin : NORMALIZING -// CALCULATING NORMALIZED VALUES OF INTRINSIC PART PARAMETERS -// FERMI POTENTIAL -// phif = PHIF_DEV_t / UT; -// PHIF is limited with a lower bound in order to avoid negative values. - phif = `MAXA(PHIF_DEV_t / UT,0.0,0.01); -// THRESHOLD VOLTAGE (UNDER ZERO BIAS) - vto = SIGN * VTO_DEV_t / UT; // NOTE: The normalized vto is positive for both NMOS and PMOS devices. -// BODY EFFECT COEFFICIENT - gamma_b_dev = GAMMA_DEV / sqrtUT; -// POLYSILICON DEPLETION, GATE NODE COEFFICIENT - gamma_g = GAMMAG / sqrtUT; -// OVERLAP REGION, BODY EFFECT COEFFICIENT, GATE NODE COEFFICIENT, FLAT-BAND VOLTAGE - gamma_ov = GAMMAOV / sqrtUT; - gamma_g_ov = GAMMAGOV / sqrtUT; - vfb_ov = VFBOV / UT; -// VELOCITY SATURATION EFFECT, CRITICAL VELOCITY - ucrit = UCRIT_DEV_t / (UT / Leff); -// GATE CURRENT PARAMETERS - xb = XB / UT; - ub = EB * TOX / XB; -// MOBILITY REDUCED DUE TO VERTICAL FIELD EFFECT PARAMETERS - ev = UT / (E0_wt * TSI); - tmp = E1_wt * TSI; - ev1 = UT2 / (tmp * tmp); -// FREQUENTLY PERFORMED CALCULATIONS - sqrtphif = sqrt(phif); - gamma_b_dev2 = gamma_b_dev * gamma_b_dev; - gamma_g2 = gamma_g * gamma_g; - dpd = (TG != 0) ? - gamma_b_dev2 / gamma_g2 : - 0.0; - gamma_ov2 = gamma_ov * gamma_ov; -end // NORMALIZING - -//////////////////////////////////////////////////////////////////////////////// -// LEVEL 3b // -// INTRINSIC PART OF THE MODEL // -// CALCULATION OF VARIABLES CONSIDERING ZERO EXTERNAL POTENTIAL // -//////////////////////////////////////////////////////////////////////////////// - -// NQ0: SLOPE FACTOR (CHARGE) CALCULATED UNDER ZERO BIAS - nq0 = (TG < 0) ? + begin + inv_sa05l = inv_sa05l + 1.0 / (SA_lhalf_sti + i_sti * SD_l_sti); + inv_sb05l = inv_sb05l + 1.0 / (SB_lhalf_sti + i_sti * SD_l_sti); + i_sti = i_sti + 1.0; + end + inv_sa05l = inv_sa05l / NF; + inv_sb05l = inv_sb05l / NF; + + end + else // For completeness + begin + inv_sa05l = 1.0; + inv_sb05l = 1.0; + end + + inv_saref05l = 1.0 / (SAREF + lhalf_sti); + inv_sbref05l = 1.0 / (SBREF + lhalf_sti); + + tmpl = lexp(-LLODKKP*ln(l)); + tmpw = lexp(-WLODKKP*ln(w+WLOD)); + KKP_sti = (1.0 + LKKP * tmpl + WKKP * tmpw + PKKP * tmpl * tmpw); + a_sti = KKP / KKP_sti * (inv_sa05l + inv_sb05l); + aref_sti = KKP / KKP_sti * (inv_saref05l + inv_sbref05l); + MKP_sti = (1.0 + a_sti) / (1.0 + aref_sti); + MUCRIT_sti = (1.0 + KUCRIT * a_sti) / (1.0 + KUCRIT * aref_sti); + tmpl = lexp(-LLODKVTO*ln(l)); + tmpw = lexp(-WLODKVTO*ln(w+WLOD)); + KVTO_sti = 1.0 + LKVTO * tmpl + WKVTO * tmpw + PKVTO * tmpl * tmpw; + b_sti = inv_sa05l + inv_sb05l - inv_saref05l - inv_sbref05l; + DVT_sti = KVTO / KVTO_sti * b_sti; + DGAMMA_sti = KGAMMA / lexp(LODKGAMMA*ln(KVTO_sti)) * b_sti; + DETAD_sti = KETAD / lexp(LODKETAD*ln(KVTO_sti)) * b_sti; + end + else // NOTE: If no basic STI parameters have been defined (are zero) + begin + inv_sa05l = 1.0; + inv_sb05l = 1.0; + inv_saref05l = 1.0; + inv_sbref05l = 1.0; + KKP_sti = 1.0; + MKP_sti = 1.0; + MUCRIT_sti = 1.0; + DVT_sti = 0.0; + DGAMMA_sti = 0.0; + DETAD_sti = 0.0; + end + end // STI_STRESS + + // CALCULATIONS OF THE DEVICE LEVEL PARAMETERS + VTO_DEV = VTO_a + SIGN * (DVT_long + DVT_wide + DVT_rsce + DVT_inwe + DVT_nf + DVT_sti); // NOTE: SIGN switches the sign of the threshold voltage shift of each effect. VTO_DEV is negative for PMOS devices. + GAMMA_DEV = GAMMA_a * MGAMMA_rcse * MGAMMA_inwe + DGAMMA_sti + DGAMMA_long + DGAMMA_wide; + PHIF_DEV = PHIF + DPHIF_rsce; + KP_DEV = KP_a * MKP_l * MKP_w * MKP_sti; + ETAD_DEV = ETAD_w + DETAD_sti; + UCRIT_DEV = UCRIT_w * MUCRIT_sti; + + begin : CHARGE_SHARING + // DEVICE LEVEL PARAMETERS FOR CHARGE SHARING EFFECT + CHSHL = LETA0 + LETA / Leff + LETA2 / Leff2; + CHSHW = WETA / Weff; + NUV = N0 + NCS * 3.0 * TOX * CHSHL; + CHSHLTSI = CHSHL * TSI; + CHSHWTSI = CHSHW * TSI; + end // CHARGE_SHARING + + //////////////////////////////////////////////////////////////////////////////// + // LEVEL 2 // + // TEMPERATURE MODELLING OF INSTANCE LEVEL // + //////////////////////////////////////////////////////////////////////////////// + + begin : STANDARD_VALUES + // TEMPERATURE PARAMETERS + T = $temperature; // Simulation temperature of the device in Kelvin + UT = `UT(T); + // FREQUENTLY PERFORMED CALCULATIONS + dT = T - TNOMK; + dT2 = dT * dT; + rT = T / TNOMK; + lnrT = ln(rT); + UT2 = UT * UT; + UT3 = UT * UT2; + sqrtUT = sqrt(UT); + KT4 = 4.0 * `C_K * T; + end // STANDARD_VALUES + + begin : TEMPERATURE_ON_STI + // TEMPERATURE EFFECT ON STI STRESS EFFECT + if ((SA > 0) && (SB > 0)) + begin + KKP_sti_t = KKP_sti * (1.0 + TKKP * (rT - 1.0)); + a_sti_t = KKP / KKP_sti_t * (inv_sa05l + inv_sb05l); + aref_sti_t = KKP / KKP_sti_t * (inv_saref05l + inv_sbref05l); + MKP_sti_t = (1.0 + a_sti_t) / (1.0 + aref_sti_t) / MKP_sti; + end + else + begin + MKP_sti_t = 1.0; + end + end // TEMPERATURE_ON_STI + + begin : TEMPERATURE + // MODEL PARAMETERS AFFECTED BY TEMPERATURE + VTO_DEV_t = VTO_DEV - TCV_wlc * dT; // NOTE: VTO_DEV_t is negative for PMOS devices. + KP_DEV_t = KP_DEV * lexp(BEX * lnrT) * MKP_sti_t; + ETA_t = ETA + (TETA * dT); + E0_wt = E0_w * lexp(TE0EX * lnrT); + E1_wt = E1_w * lexp(TE1EX * lnrT); + UCRIT_DEV_t = UCRIT_DEV * lexp(UCEX_w * lnrT); + LAMBDA_wt = LAMBDA_w + TLAMBDA * (rT - 1.0); + IBB_t = IBB * (1.0 + IBBT * dT); + // PHIF + eg_tnom = 1.16 - (7.02E-4 * TNOMK * TNOMK) / (TNOMK + 1108.0); // NOTE: Also used for junction diode temperature dependence + eg_t = 1.16 - (7.02E-4 * T * T) / (T + 1108); // NOTE: Also used for junction diode temperature dependence + PHIF_DEV_t = PHIF_DEV * rT + (- UT * 3.0 * lnrT + eg_t - eg_tnom * rT) / 2.0; + end // TEMPERATURE + + //////////////////////////////////////////////////////////////////////////////// + // LEVEL 3a // + // INTRINSIC PART OF THE MODEL // + // CALCULATION OF NORMALIZED VALUES (INDEPENDENT OF EXTERNAL POTENTIAL) // + //////////////////////////////////////////////////////////////////////////////// + + begin : NORMALIZING + // CALCULATING NORMALIZED VALUES OF INTRINSIC PART PARAMETERS + // FERMI POTENTIAL + // phif = PHIF_DEV_t / UT; + // PHIF is limited with a lower bound in order to avoid negative values. + phif = `MAXA(PHIF_DEV_t / UT,0.0,0.01); + // THRESHOLD VOLTAGE (UNDER ZERO BIAS) + vto = SIGN * VTO_DEV_t / UT; // NOTE: The normalized vto is positive for both NMOS and PMOS devices. + // BODY EFFECT COEFFICIENT + gamma_b_dev = GAMMA_DEV / sqrtUT; + // POLYSILICON DEPLETION, GATE NODE COEFFICIENT + gamma_g = GAMMAG / sqrtUT; + // OVERLAP REGION, BODY EFFECT COEFFICIENT, GATE NODE COEFFICIENT, FLAT-BAND VOLTAGE + gamma_ov = GAMMAOV / sqrtUT; + gamma_g_ov = GAMMAGOV / sqrtUT; + vfb_ov = VFBOV / UT; + // VELOCITY SATURATION EFFECT, CRITICAL VELOCITY + ucrit = UCRIT_DEV_t / (UT / Leff); + // GATE CURRENT PARAMETERS + xb = XB / UT; + ub = EB * TOX / XB; + // MOBILITY REDUCED DUE TO VERTICAL FIELD EFFECT PARAMETERS + ev = UT / (E0_wt * TSI); + tmp = E1_wt * TSI; + ev1 = UT2 / (tmp * tmp); + // FREQUENTLY PERFORMED CALCULATIONS + sqrtphif = sqrt(phif); + gamma_b_dev2 = gamma_b_dev * gamma_b_dev; + gamma_g2 = gamma_g * gamma_g; + dpd = (TG != 0) ? + gamma_b_dev2 / gamma_g2 : + 0.0; + gamma_ov2 = gamma_ov * gamma_ov; + end // NORMALIZING + + //////////////////////////////////////////////////////////////////////////////// + // LEVEL 3b // + // INTRINSIC PART OF THE MODEL // + // CALCULATION OF VARIABLES CONSIDERING ZERO EXTERNAL POTENTIAL // + //////////////////////////////////////////////////////////////////////////////// + + // NQ0: SLOPE FACTOR (CHARGE) CALCULATED UNDER ZERO BIAS + nq0 = (TG < 0) ? (1.0 / (1.0 + (dpd * 2.0 * `SQRT2 * sqrtphif / gamma_b_dev)) + gamma_b_dev / (2.0 * `SQRT2 * sqrtphif)) : 1.0 + (gamma_b_dev / (2.0 * `SQRT2 * sqrtphif)); -begin : QUANTUM_MECHANICAL_EFFECT -// BIAS INDEPENDENT CALCULATIONS FOR THE ACCUMULATION REGION - aqma = AQMA * lexp(`ONE3RD * ln(COX * COX / UT)); - axetaqm2_3 = aqma * lexp(`TWO3RDS * ln(ETAQM)); -// QUANTUM MECHANICAL EFFECT ON SURFACE POTENTIAL SHIFT - dqmi = `ONE3RD * AQMI * lexp(`TWO3RDS * ln(gamma_b_dev * COX * 0.5 / (sqrtUT * phif))) * (2.0 * `SQRT2 * ETAQM * nq0 * sqrtphif / gamma_b_dev - 1.0); - inv_dqmip1 = 1.0 / ( 1.0 + dqmi); - dpsi0 = AQMI * lexp(`TWO3RDS * ln(gamma_b_dev * COX * `SQRT2 * sqrtphif)); - DPSI0 = dpsi0 * UT; // NOTE: Denormalized value of the surface potential shift. -end // QUANTUM_MECHANICAL_EFFECT - -// CALCULATION OF PHI, (or PSI0), USED IN CALCULATION OF PINCH-OFF VOLTAGE AFTER PINCH-OFF SURFACE POTENTIAL -// AND FOR THE CALCULATION OF FLAT-BAND VOLTAGE AFTER THRESHOLD VOLTAGE - phi = phif * 2.0 + ln (4.0 * nq0 * sqrtphif * `SQRT2 / gamma_b_dev) + dpsi0; -// FREQUENTLY PERFORMED CALCULATION - sqrtphi = sqrt(phi); -// CALCULATION OF VBI (BUILT-IN VOLTAGE), USED IN CHARGE SHARING MODEL AND FLAT-BAND VOLTAGE -// VBI IS NOMINALLY 3*UT HIGHER THAN PHI BUT MAY, AS WELL, BE DEFINED MANUALLY BY THE USER - if (VBI == 0.0) // NOTE: VBI has the physically non-logical default value of 0.0, so this 'if' statement checks if VBI has been redefined by the user, or not. - begin - nul = 3.0; - vbi = phi + nul; - end - else // NOTE: The following code is used when VBI is set to a value other than the default. - begin - vbi = VBI / UT; - nul = vbi - phi; - end -// FREQUENTLY PERFORMED CALCULATION - sqrtvbi = sqrt(vbi); - -begin : NORMALIZATION_FACTORS_FOR_CHARGES -// CALCULATION OF NORMALIZATION FACTORS FOR CHARGES OF THE CHANNEL AND THE OVERLAP REGION. - tmp = WeffcNF * COX * UT * inv_dqmip1; - Q0 = - Leffc * tmp * rWNedge; - Q0OV = LOV * tmp; -end // NORMALIZATION_FACTORS_FOR_CHARGES - -end + begin : QUANTUM_MECHANICAL_EFFECT + // BIAS INDEPENDENT CALCULATIONS FOR THE ACCUMULATION REGION + aqma = AQMA * lexp(`ONE3RD * ln(COX * COX / UT)); + axetaqm2_3 = aqma * lexp(`TWO3RDS * ln(ETAQM)); + // QUANTUM MECHANICAL EFFECT ON SURFACE POTENTIAL SHIFT + dqmi = `ONE3RD * AQMI * lexp(`TWO3RDS * ln(gamma_b_dev * COX * 0.5 / (sqrtUT * phif))) * (2.0 * `SQRT2 * ETAQM * nq0 * sqrtphif / gamma_b_dev - 1.0); + inv_dqmip1 = 1.0 / ( 1.0 + dqmi); + dpsi0 = AQMI * lexp(`TWO3RDS * ln(gamma_b_dev * COX * `SQRT2 * sqrtphif)); + DPSI0 = dpsi0 * UT; // NOTE: Denormalized value of the surface potential shift. + end // QUANTUM_MECHANICAL_EFFECT + + // CALCULATION OF PHI, (or PSI0), USED IN CALCULATION OF PINCH-OFF VOLTAGE AFTER PINCH-OFF SURFACE POTENTIAL + // AND FOR THE CALCULATION OF FLAT-BAND VOLTAGE AFTER THRESHOLD VOLTAGE + phi = phif * 2.0 + ln (4.0 * nq0 * sqrtphif * `SQRT2 / gamma_b_dev) + dpsi0; + // FREQUENTLY PERFORMED CALCULATION + sqrtphi = sqrt(phi); + // CALCULATION OF VBI (BUILT-IN VOLTAGE), USED IN CHARGE SHARING MODEL AND FLAT-BAND VOLTAGE + // VBI IS NOMINALLY 3*UT HIGHER THAN PHI BUT MAY, AS WELL, BE DEFINED MANUALLY BY THE USER + if (VBI == 0.0) // NOTE: VBI has the physically non-logical default value of 0.0, so this 'if' statement checks if VBI has been redefined by the user, or not. + begin + nul = 3.0; + vbi = phi + nul; + end + else // NOTE: The following code is used when VBI is set to a value other than the default. + begin + vbi = VBI / UT; + nul = vbi - phi; + end + // FREQUENTLY PERFORMED CALCULATION + sqrtvbi = sqrt(vbi); -//////////////////////////////////////////////////////////////////////////////// -// LEVEL 3c // -// INTRINSIC PART OF THE MODEL // -// CALCULATION OF BIAS DEPENDENT VARIABLES OF THE DEVICE // -// VARIABLES WITH "0" AT THE END ARE CALCULATED CONSIDERING VD=VS=0V // -//////////////////////////////////////////////////////////////////////////////// + begin : NORMALIZATION_FACTORS_FOR_CHARGES + // CALCULATION OF NORMALIZATION FACTORS FOR CHARGES OF THE CHANNEL AND THE OVERLAP REGION. + tmp = WeffcNF * COX * UT * inv_dqmip1; + Q0 = - Leffc * tmp * rWNedge; + Q0OV = LOV * tmp; + end // NORMALIZATION_FACTORS_FOR_CHARGES -// READING THE INPUT VOLTAGES -// THE EXACT NODES DEPEND ON THE MODE USED AND THE INTERNAL NODES CREATED. + end -`ifdef DC_S - VS = V(s ,b ); - VD = V(d ,b ); - VG = V(g ,b ); -`endif -`ifdef DC - VS = V(si,b ); - VD = V(di,b ); - VG = V(g ,b ); -`endif -`ifdef RF_S - VS = V(si,bi); - VD = V(di,bi); - VG = V(gi,bi); -`endif -`ifdef RF - VS = V(si,bi); - VD = V(di,bi); - VG = V(gi,bi); -`endif -`ifdef NQS - VS = V(si,bi); - VD = V(di,bi); - VG = V(gi,bi); -`endif + //////////////////////////////////////////////////////////////////////////////// + // LEVEL 3c // + // INTRINSIC PART OF THE MODEL // + // CALCULATION OF BIAS DEPENDENT VARIABLES OF THE DEVICE // + // VARIABLES WITH "0" AT THE END ARE CALCULATED CONSIDERING VD=VS=0V // + //////////////////////////////////////////////////////////////////////////////// + + // READING THE INPUT VOLTAGES + // THE EXACT NODES DEPEND ON THE MODE USED AND THE INTERNAL NODES CREATED. + + `ifdef DC_S + VS = V(s ,b ); + VD = V(d ,b ); + VG = V(g ,b ); + `endif + `ifdef DC + VS = V(si,b ); + VD = V(di,b ); + VG = V(g ,b ); + `endif + `ifdef RF_S + VS = V(si,bi); + VD = V(di,bi); + VG = V(gi,bi); + `endif + `ifdef RF + VS = V(si,bi); + VD = V(di,bi); + VG = V(gi,bi); + `endif + `ifdef NQS + VS = V(si,bi); + VD = V(di,bi); + VG = V(gi,bi); + `endif + + begin : NORMALIZING_INPUT_VOLTAGES + // NORMALIZATION OF THE INPUT VOLTAGES, + // SWAPPING ELECTRICAL AND PHYSICAL SOURCE AND DRAIN NODES IF NECESSARY, + // SWITCHING SIGNS OF DIFFERENCE POTENTIALS FOR THE PMOS CASE. + if (SIGN * VD >= SIGN * VS) + begin + d_gt_s_flag = 1; + d_gt_s = 1; + s_gt_d = 0; + end + else + begin + d_gt_s_flag = -1; + d_gt_s = 0; + s_gt_d = 1; + end + vd = SIGN * (d_gt_s * VD + s_gt_d * VS) / UT; + vs = SIGN * (d_gt_s * VS + s_gt_d * VD) / UT; + vg = SIGN * VG / UT; + end // NORMALIZING_INPUT_VOLTAGES + + begin : EFFECTIVE_GAMMA_DUE_TO_CHARGE_SHARING_AND_POLYDEPLETION + // CALCULATION OF EFFECTIVE BODY EFFECT COEFFICIENT DUE TO CHARGE SHARING AND POLYSILICON DEPLETION. + // THE FOLLOWING VARIABLES ARE ALSO USED IN THE CALCULATION OF FLAT-BAND VOLTAGE (vfb), VG' (vg_p) AND VOLTAGE SLOPE FACTOR (nv). + chsh_1w = 1.0 + CHSHWTSI; // NOTE: Also used in "vfb" and "vg_p_chsh" + tmp_chsh1 = CHSHLTSI / gamma_b_dev; + tmp_chsh2 = tmp_chsh1 * (sqrt(`MAXA(vbi + vs,0.0,`POS_MIN)) + sqrt(`MAXA(vbi + vd,0.0,`POS_MIN))); + chsh_1l = 1.0 - tmp_chsh2; // NOTE: Also used in "nv" + tmp_chsh3 = CHSHWTSI * sqrtphi / gamma_b_dev; // NOTE: Also used in "tmp_vfb" + tmp_chsh3b = tmp_chsh3 + tmp_chsh3; + chsh_1wl = 1.0 - tmp_chsh2 - tmp_chsh2 + tmp_chsh3b; + chsh_1wlpd = chsh_1w + dpd * chsh_1wl; // NOTE: Also used in "vg_p_chsh_pd" and "nv" + gamma_b_chsh = gamma_b_dev * chsh_1l / chsh_1w; // NOTE: gamma_b_chsh takes into account charge sharing but not polydepletion. + gamma_b_eff = gamma_b_dev * chsh_1l / chsh_1wlpd; // NOTE: gamma_b_eff takes into account charge sharing and polydepletion. + tmp_chsh4 = tmp_chsh1 * 2.0 * sqrtvbi; // NOTE: Also used in "tmp_vfb" and "vfb" + chsh_1l0 = 1.0 - tmp_chsh4; + chsh_1wl0 = 1.0 - tmp_chsh4 - tmp_chsh4 + tmp_chsh3b; + chsh_1wlpd0 = chsh_1w + dpd * chsh_1wl0; // NOTE: Used ONLY in "vg_p_chsh_pd0" + gamma_b_chsh0 = gamma_b_dev * chsh_1l0 / chsh_1w; // NOTE: gamma_b_chsh0 takes into account charge sharing under zero longitudinal bias (VD=VS=0V) but not polydepletion. + // FREQUENTLY PERFORMED CALCULATIONS + gamma_b_chsh2 = gamma_b_chsh * gamma_b_chsh; + gamma_b_eff2 = gamma_b_eff * gamma_b_eff; + gamma_b_chsh02 = gamma_b_chsh0 * gamma_b_chsh0; + end // EFFECTIVE_GAMMA_DUE_TO_CHARGE_SHARING_AND_POLYDEPLETION + + begin : FLAT_BAND_VOLTAGE + // CALCULATION OF THE FLAT-BAND VOLTAGE. + // vfb IS CALCULATED AFTER gamma_b_dev. "tmp_chsh3" and "tmp_chsh4" ARE CALCULATED AFTER gamma_b_dev AS WELL. + // "tmp_chsh4", "tmp_chsh3", "chsh_1w" DEPEND ALSO ON CHARGE SHARING PARAMETERS + // "dpd" DEPENDS ON POLYSILICON DEPLETION PARAMETERS + tmp_vfb = 1.0 - tmp_chsh4 + tmp_chsh3; + vfb = vto - phi * (chsh_1w + dpd * tmp_vfb * tmp_vfb) - gamma_b_dev * (1.0 - tmp_chsh4) * sqrtphi; + end // FLAT_BAND_VOLTAGE + + begin : EFFECTIVE_GATE_VOLTAGE + // CALCULATION OF THE EFFECTIVE GATE VOLTAGE (VG' or VG_PRIME) + // TAKING INTO ACCOUNT VARIOUS EFFECTS EACH TIME + vg_p = vg - vfb; + vg_p_chsh = vg_p / chsh_1w; // NOTE: Including CHARGE SHARING, used in calculation of psi_po (appoximation of psi_p when psi_p is close to zero) and psi_po0 and of psi_p and psi_p0 in accumulation and of dpsiv of QUANTUM MECHANICAL EFFECTS. + vg_p_chsh_pd = vg_p / chsh_1wlpd; // NOTE: Including CHARGE SHARING and POLYDEPLETION and VD, VS BIAS DEPENDENCES, used in calculation of psi_p in depletion and inversion. + vg_p_chsh_pd0 = vg_p / chsh_1wlpd0; // NOTE: Including CHARGE SHARING and POLYDEPLETION at VD=VS=0V BIAS, used in calculation of psi_p0 in depletion and inversion. + end // EFFECTIVE_GATE_VOLTAGE + + begin : PSI_PO___APPROXIMATION_AROUND_PSI_P_EQUALS_ZERO + // CALCULATION OF PSI_PO, APPROXIMATION OF PINCH-OFF SURFACE POTENTIAL (PSI_P) WHEN PSI_P IS CLOSE TO ZERO. + // CHARGE SHARING EFFECT IS TAKEN INTO ACCOUNT, POLYDEPLETION DOES NOT EFFECT PSI_PO + // PSI_PO IS USED FOR THE CALCULATION OF THE EXACT PINCH-OFF SURFACE POTENTIAL, AND ALSO FOR THE QUANTUM MECHANICAL EFFECT. + tmp = vg_p_chsh * 0.5 - 3.0 * (1.0 + gamma_b_chsh * `ONESQRT2); + psi_po = tmp + sqrt(tmp * tmp + 6.0 * vg_p_chsh); + tmp = vg_p_chsh * 0.5 - 3.0 * (1.0 + gamma_b_chsh0 * `ONESQRT2); + psi_po0 = tmp + sqrt(tmp * tmp + 6.0 * vg_p_chsh); // NOTE: Considering VD=VS=0V. + end // PSI_PO___APPROXIMATION_AROUND_PSI_P_EQUALS_ZERO + + ///////////////////////////////// + // PINCH-OFF SURFACE POTENTIAL // + ///////////////////////////////// + + begin : PINCH_OFF_SURFACE_POTENTIAL_VOLTAGE_SLOPE_FACTOR + // CALCULATION OF THE PINCH-OFF SURFACE POTENTIAL (PSI_P), AFTER PSI_PO + if (vg_p < 0.0) // NOTE: Accumulation Region, only CHARGE SHARING affects PSI_P, not POLYDEPLETION. + begin + tmp = (psi_po - vg_p_chsh) / gamma_b_chsh; + psi_p = - ln(1.0 - psi_po + tmp * tmp); + tmp = (psi_po0 - vg_p_chsh) / gamma_b_chsh0; + psi_p0 = - ln(1.0 - psi_po0 + tmp * tmp); + end + else // NOTE: Depletion and Inversion Regions, CHARGE SHARING and POLYDEPLETION affect PSI_P + begin + one_m_epsilon = 1.0 - exp( - psi_po); + tmp = sqrt(vg_p_chsh_pd - one_m_epsilon + gamma_b_eff2 * 0.25) - gamma_b_eff * 0.5; + psi_p = tmp * tmp + one_m_epsilon; + one_m_epsilon = 1.0 - exp( - psi_po0); + tmp = sqrt(vg_p_chsh_pd0 - one_m_epsilon + gamma_b_chsh02 * 0.25) - gamma_b_chsh0 * 0.5; + psi_p0 = tmp * tmp + one_m_epsilon; + end + // FREQUENTLY PERFORMED CALCULATIONSekv3_edge.va + sqrt_psi_p = sqrt(`MAXA(psi_p ,1.0E-4,1.0E-2)); // NOTE: Ensuring positive argument for the square root function. + sqrt_psi_p0 = sqrt(`MAXA(psi_p0,1.0E-4,1.0E-2)); // NOTE: Ensuring positive argument for the square root function. + + // CALCULATION OF THE PINCH-OFF VOLTAGE, AFTER PINCH-OFF SURFACE POTENTIAL AND PHI + vp = psi_p - phi; + // CALCULATION OF SLOPE FACTOR NV + nv = chsh_1wlpd + gamma_b_dev * chsh_1l / (2.0 * sqrt_psi_p); // NOTE: Used for the calculation of COULOMB SCATTERING and MOBILITY REDUCTION DUE TO VERTICAL FIELD. + end -begin : NORMALIZING_INPUT_VOLTAGES -// NORMALIZATION OF THE INPUT VOLTAGES, -// SWAPPING ELECTRICAL AND PHYSICAL SOURCE AND DRAIN NODES IF NECESSARY, -// SWITCHING SIGNS OF DIFFERENCE POTENTIALS FOR THE PMOS CASE. - if (SIGN * VD >= SIGN * VS) - begin - d_gt_s_flag = 1; - d_gt_s = 1; - s_gt_d = 0; - end - else - begin - d_gt_s_flag = -1; - d_gt_s = 0; - s_gt_d = 1; - end - vd = SIGN * (d_gt_s * VD + s_gt_d * VS) / UT; - vs = SIGN * (d_gt_s * VS + s_gt_d * VD) / UT; - vg = SIGN * VG / UT; -end // NORMALIZING_INPUT_VOLTAGES - -begin : EFFECTIVE_GAMMA_DUE_TO_CHARGE_SHARING_AND_POLYDEPLETION -// CALCULATION OF EFFECTIVE BODY EFFECT COEFFICIENT DUE TO CHARGE SHARING AND POLYSILICON DEPLETION. -// THE FOLLOWING VARIABLES ARE ALSO USED IN THE CALCULATION OF FLAT-BAND VOLTAGE (vfb), VG' (vg_p) AND VOLTAGE SLOPE FACTOR (nv). - chsh_1w = 1.0 + CHSHWTSI; // NOTE: Also used in "vfb" and "vg_p_chsh" - tmp_chsh1 = CHSHLTSI / gamma_b_dev; - tmp_chsh2 = tmp_chsh1 * (sqrt(`MAXA(vbi + vs,0.0,`POS_MIN)) + sqrt(`MAXA(vbi + vd,0.0,`POS_MIN))); - chsh_1l = 1.0 - tmp_chsh2; // NOTE: Also used in "nv" - tmp_chsh3 = CHSHWTSI * sqrtphi / gamma_b_dev; // NOTE: Also used in "tmp_vfb" - tmp_chsh3b = tmp_chsh3 + tmp_chsh3; - chsh_1wl = 1.0 - tmp_chsh2 - tmp_chsh2 + tmp_chsh3b; - chsh_1wlpd = chsh_1w + dpd * chsh_1wl; // NOTE: Also used in "vg_p_chsh_pd" and "nv" - gamma_b_chsh = gamma_b_dev * chsh_1l / chsh_1w; // NOTE: gamma_b_chsh takes into account charge sharing but not polydepletion. - gamma_b_eff = gamma_b_dev * chsh_1l / chsh_1wlpd; // NOTE: gamma_b_eff takes into account charge sharing and polydepletion. - tmp_chsh4 = tmp_chsh1 * 2.0 * sqrtvbi; // NOTE: Also used in "tmp_vfb" and "vfb" - chsh_1l0 = 1.0 - tmp_chsh4; - chsh_1wl0 = 1.0 - tmp_chsh4 - tmp_chsh4 + tmp_chsh3b; - chsh_1wlpd0 = chsh_1w + dpd * chsh_1wl0; // NOTE: Used ONLY in "vg_p_chsh_pd0" - gamma_b_chsh0 = gamma_b_dev * chsh_1l0 / chsh_1w; // NOTE: gamma_b_chsh0 takes into account charge sharing under zero longitudinal bias (VD=VS=0V) but not polydepletion. -// FREQUENTLY PERFORMED CALCULATIONS - gamma_b_chsh2 = gamma_b_chsh * gamma_b_chsh; - gamma_b_eff2 = gamma_b_eff * gamma_b_eff; - gamma_b_chsh02 = gamma_b_chsh0 * gamma_b_chsh0; -end // EFFECTIVE_GAMMA_DUE_TO_CHARGE_SHARING_AND_POLYDEPLETION - -begin : FLAT_BAND_VOLTAGE -// CALCULATION OF THE FLAT-BAND VOLTAGE. -// vfb IS CALCULATED AFTER gamma_b_dev. "tmp_chsh3" and "tmp_chsh4" ARE CALCULATED AFTER gamma_b_dev AS WELL. -// "tmp_chsh4", "tmp_chsh3", "chsh_1w" DEPEND ALSO ON CHARGE SHARING PARAMETERS -// "dpd" DEPENDS ON POLYSILICON DEPLETION PARAMETERS - tmp_vfb = 1.0 - tmp_chsh4 + tmp_chsh3; - vfb = vto - phi * (chsh_1w + dpd * tmp_vfb * tmp_vfb) - gamma_b_dev * (1.0 - tmp_chsh4) * sqrtphi; -end // FLAT_BAND_VOLTAGE - -begin : EFFECTIVE_GATE_VOLTAGE -// CALCULATION OF THE EFFECTIVE GATE VOLTAGE (VG' or VG_PRIME) -// TAKING INTO ACCOUNT VARIOUS EFFECTS EACH TIME - vg_p = vg - vfb; - vg_p_chsh = vg_p / chsh_1w; // NOTE: Including CHARGE SHARING, used in calculation of psi_po (appoximation of psi_p when psi_p is close to zero) and psi_po0 and of psi_p and psi_p0 in accumulation and of dpsiv of QUANTUM MECHANICAL EFFECTS. - vg_p_chsh_pd = vg_p / chsh_1wlpd; // NOTE: Including CHARGE SHARING and POLYDEPLETION and VD, VS BIAS DEPENDENCES, used in calculation of psi_p in depletion and inversion. - vg_p_chsh_pd0 = vg_p / chsh_1wlpd0; // NOTE: Including CHARGE SHARING and POLYDEPLETION at VD=VS=0V BIAS, used in calculation of psi_p0 in depletion and inversion. -end // EFFECTIVE_GATE_VOLTAGE - -begin : PSI_PO___APPROXIMATION_AROUND_PSI_P_EQUALS_ZERO -// CALCULATION OF PSI_PO, APPROXIMATION OF PINCH-OFF SURFACE POTENTIAL (PSI_P) WHEN PSI_P IS CLOSE TO ZERO. -// CHARGE SHARING EFFECT IS TAKEN INTO ACCOUNT, POLYDEPLETION DOES NOT EFFECT PSI_PO -// PSI_PO IS USED FOR THE CALCULATION OF THE EXACT PINCH-OFF SURFACE POTENTIAL, AND ALSO FOR THE QUANTUM MECHANICAL EFFECT. - tmp = vg_p_chsh * 0.5 - 3.0 * (1.0 + gamma_b_chsh * `ONESQRT2); - psi_po = tmp + sqrt(tmp * tmp + 6.0 * vg_p_chsh); - tmp = vg_p_chsh * 0.5 - 3.0 * (1.0 + gamma_b_chsh0 * `ONESQRT2); - psi_po0 = tmp + sqrt(tmp * tmp + 6.0 * vg_p_chsh); // NOTE: Considering VD=VS=0V. -end // PSI_PO___APPROXIMATION_AROUND_PSI_P_EQUALS_ZERO - -///////////////////////////////// -// PINCH-OFF SURFACE POTENTIAL // -///////////////////////////////// - -begin : PINCH_OFF_SURFACE_POTENTIAL_VOLTAGE_SLOPE_FACTOR -// CALCULATION OF THE PINCH-OFF SURFACE POTENTIAL (PSI_P), AFTER PSI_PO - if (vg_p < 0.0) // NOTE: Accumulation Region, only CHARGE SHARING affects PSI_P, not POLYDEPLETION. - begin - tmp = (psi_po - vg_p_chsh) / gamma_b_chsh; - psi_p = - ln(1.0 - psi_po + tmp * tmp); - tmp = (psi_po0 - vg_p_chsh) / gamma_b_chsh0; - psi_p0 = - ln(1.0 - psi_po0 + tmp * tmp); - end - else // NOTE: Depletion and Inversion Regions, CHARGE SHARING and POLYDEPLETION affect PSI_P - begin - one_m_epsilon = 1.0 - exp( - psi_po); - tmp = sqrt(vg_p_chsh_pd - one_m_epsilon + gamma_b_eff2 * 0.25) - gamma_b_eff * 0.5; - psi_p = tmp * tmp + one_m_epsilon; - one_m_epsilon = 1.0 - exp( - psi_po0); - tmp = sqrt(vg_p_chsh_pd0 - one_m_epsilon + gamma_b_chsh02 * 0.25) - gamma_b_chsh0 * 0.5; - psi_p0 = tmp * tmp + one_m_epsilon; - end -// FREQUENTLY PERFORMED CALCULATIONSekv3_edge.va - sqrt_psi_p = sqrt(`MAXA(psi_p ,1.0E-4,1.0E-2)); // NOTE: Ensuring positive argument for the square root function. - sqrt_psi_p0 = sqrt(`MAXA(psi_p0,1.0E-4,1.0E-2)); // NOTE: Ensuring positive argument for the square root function. - -// CALCULATION OF THE PINCH-OFF VOLTAGE, AFTER PINCH-OFF SURFACE POTENTIAL AND PHI - vp = psi_p - phi; -// CALCULATION OF SLOPE FACTOR NV - nv = chsh_1wlpd + gamma_b_dev * chsh_1l / (2.0 * sqrt_psi_p); // NOTE: Used for the calculation of COULOMB SCATTERING and MOBILITY REDUCTION DUE TO VERTICAL FIELD. -end - -begin : DIBL -// CALCULATION OF THE DRAIN INDUCED BARRIER LOWERING. - l0 = ETAD_DEV * TSI * sqrt(2.0 * sqrtphi / gamma_b_dev); - v_o_dibl = 4.0 + 40.0 * l0 / Leff; - v_o_dibl2 = v_o_dibl * v_o_dibl; - dv_dibl = `MINA(vp,`MINA(vs,vd ,v_o_dibl2),v_o_dibl2); - if (l0 == 0.0) - begin - deltapsis = 0.0; - end - else - begin - tmp = Leff / (l0 + l0); - deltapsis = exp( - tmp) * (2.0 + SIGMAD * tmp * dv_dibl / (2.0 * phi)) * sqrt((nul + vs - dv_dibl) * (nul + vd - dv_dibl)); // NOTE: deltapsis is used at the calculation of the normalized inversion charges at the source and drain ends. Effective PINCH-OFF VOLTAGE (vp_dibl) is increased by a factor of "deltapsis", due to DIBL. - end -end // DIBL - -// CALCULATION OF THE EFFECTIVE PINCH-OFF VOLTAGE DUE TO DIBL - vp_dibl = vp + deltapsis; - -begin : NORMALIZED_FORWARD_CURRENT -// CALCULATION OF NORMALIZED INVERSION CHARGE OF THE (ELECTRICAL) SOURCE SIDE - `QV(qs,(vp_dibl - vs)) -// FREQUENTLY PERFORMED CALCULATION - qs2 = qs * qs; -// CALCULATION OF THE NORMALIZED FORWARD CURRENT - if_ = qs2 + qs; -// FREQUENTLY PERFORMED CALCULATIONS - xf2 = if_ + 0.25; - xf = qs + 0.5; -end // NORMALIZED_FORWARD_CURRENT - -begin : VELOCITY_SATURATION -// CALCULATIONS FOR THE VELOCITY SATURATION EFFECT AND THE CHANNEL LENGTH MODULATION -// -- VELOCITY SATURATION (NOT DEPENDENT ON VD) - g_clm = 0.1; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION - e_clm = 2.0 / ucrit; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION - e_clm2 = e_clm * e_clm; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION - e_clmx2 = 2.0 * e_clm; - e_clmp2 = 2.0 + e_clm; - e_clmx2xqs = e_clmx2 * qs; - qsat = e_clmx2 * if_ / (e_clmp2 + e_clmx2xqs + sqrt(e_clmp2 * e_clmp2 + 4.0 * e_clmx2xqs)); // NOTE: The inversion charge at a point of maximum velocity saturation. - qs_qsat = qs - qsat; - qs_qsat2 = qs_qsat * qs_qsat; - mdm2 = 2.0 - DELTA; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION - e_clmxmdm2_2 = e_clm2 * mdm2 * mdm2; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION - tmp_vdsat1 = (2.0 * qsat + ln(qsat)) * (1.0 + e_clm * qs_qsat); - tmp_vdsat11 = g_clm + e_clm * mdm2 * qs_qsat; - tmp_vdsat2 = sqrt(1.0 + (2.0 * e_clm2 * mdm2 * mdm2 * qs_qsat2) / tmp_vdsat11 + e_clm2 * qs_qsat2); - vdsat = vp - tmp_vdsat1 / tmp_vdsat2; // NOTE: The potential at a point of the channel of maximum velocity saturation. - vdssat = `MAXA(vdsat - vs,3.0,4.0); // NOTE: The diffence potential along a fully velocity saturated part of the channel, limited to a minimum of 3*UT. Used also for the calculation of impact ionization current (ekv3_idb.va) -// -- VELOCITY SATURATION (DEPENDENT ON VD) - dv_clm = (ACLM / DELTA) * (4.0 * qsat + DELTA) / (qs + 1.0); - tmp_vdp1 = (vd - vs) * sqrt(1.0 + 4.0 * dv_clm / vdssat); - tmp_vdp2 = sqrt((tmp_vdp1 + vdssat) * (tmp_vdp1 + vdssat) + 4.0 * dv_clm * vdssat); - tmp_vdp3 = sqrt((tmp_vdp1 - vdssat) * (tmp_vdp1 - vdssat) + 4.0 * dv_clm * vdssat); - vdp = 0.5 * (tmp_vdp2 - tmp_vdp3) + vs; // NOTE: The potential at the velocity saturated point of the channel, limited by the maximum value (vdsat) -// -- CHANNEL LENGTH MODULATION - u_clm = 0.5 * e_clm * Leff / LC * (vd - vdp); - alpha_clm = LC / (Leff - 2.0 * LC); - deltal = LAMBDA_wt * LC * ln((alpha_clm + u_clm + sqrt(u_clm * u_clm + 2.0 * alpha_clm * u_clm + 1.0)) / (alpha_clm + 1.0)); // NOTE: The distance between the velocity saturated point of the channel and the (electrical) drain end. Used at the SPECIFIC CURRENT calculation. -end // VELOCITY_SATURATION - -begin : NORMALIZED_REVERSE_CURRENT -// CALCULATION OF NORMALIZED INVERSION CHARGE OF THE VELOCITY SATURATED POINT (ELECTRICAL DRAIN END) - `QV(qdp,(vp_dibl - vdp)) -// FREQUENTLY PERFORMED CALCULATION - qdp2 = qdp * qdp; -// CALCULATION OF THE NORMALIZED REVERSE CURRENT - irp = qdp2 + qdp; -// FREQUENTLY PERFORMED CALCULATIONS - xrp2 = irp + 0.25; - xrp = qdp + 0.5; -end // NORMALIZED_REVERSE_CURRENT - -// FREQUENTLY PERFORMED CALCULATIONS COMBINING BOTH NORMALIZED INVERSION CHARGES - qsqdp = qs + qdp; - qs_qdp = qs - qdp; - powqs_qdp2 = qs_qdp * qs_qdp; - qsqdpp1 = qsqdp + 1.0; - powqsqdpp1_2 = 1.0 / (qsqdpp1 * qsqdpp1); - -// CALCULATION OF NORMALIZED CHANNEL CURRENT - i = if_ - irp; - -// CALCULATION OF CHARGE SLOPE FACTOR NQ - `NQ(nq,psi_p,sqrt_psi_p,qs,qdp,dpd,gamma_b_chsh,gamma_g2) - -begin : CHARGE_MODEL -// THE DYNAMIC PART OF THE MODEL. -// CALCULATIONS OF THE CHARGES OF EACH NODE - v_o = vg_p_chsh - psi_p0; // NOTE: psi_p0 used instead of psi_p. -// CALCULATIONS OF THE QUANTUM MECHANICAL EFFECT - qr1 = 3.0 * `ONESQRT2 * gamma_b_chsh; - if (vg_p < 0.0) qbo = vg_p_chsh - psi_p; - else qbo = vg_p_chsh / (1.0 + dpd) - psi_po; - dpsiv = axetaqm2_3 * (lexp(`TWO3RDS * ln(sqrt(`MAXA(0.25 * qbo * qbo + 4.0 * axetaqm2_3 * gamma_b_chsh2,0.0,`POS_MIN)) - 0.5 * qbo)) - lexp(`TWO3RDS * ln(sqrt(`MAXA(qr1 * qr1 + 4.0 * axetaqm2_3 * gamma_b_chsh2,0.0,`POS_MIN)) - qr1))); - v_o_qme = v_o + dpsiv; -// CALCULATIONS OF THE NORMALIZED CHARGES qS, qD, qG - begin - `QX(qS,psi_p,nq,qs,qdp,powqs_qdp2,powqsqdpp1_2) - `QX(qD,psi_p,nq,qdp,qs,powqs_qdp2,powqsqdpp1_2) - `QG(qG,psi_p,qs,qdp,powqs_qdp2,powqsqdpp1_2,qsqdpp1,v_o_qme,gamma_g2) // NOTE: qG is considered with the same sign as qS and qD, although in absolute values they are of opposite signs. This is taken care at the denormalization part of the code. - end - qI = qS + qD; -// CALCULATION OF THE NORMALIZED CHARGE qB AS COMPLEMENTARY TO qS, qD AND qG. -// NOTE: THE ABSOLUTE VALUES OF THE CHARGES ARE NOT OF INTEREST, SINCE ONLY THE THEIR DERIVATIVES WITH RESPECT TO THE VOLTAGES DESCRIBE THE DYNAMIC BEHAVIOUR OF THE DEVICE. - qB = qG - qI; -end // CHARGE_MODEL - -begin : MOBILITY_EFFECTS -// CALCULATION OF THE EFFECTIVE MOBILITY (beta). -// TAKING INTO ACCOUNT THE COULOMB SCATTERING EFFECT. - beta_coul = THC / ((1.0 + (nv * ZC * qs)) * (1.0 + (nv * ZC * qdp))); // NOTE: used in "beta_denom" -// TAKING INTO ACCOUNT THE MOBILITY REDUCTION DUE TO VERTICAL FIELD. - nu = nv * (1.0 - ETA_t) - 1.0; - gpnu = gamma_b_eff * sqrt_psi_p + nu; - eq = qB + ETA_t * nv * qI; - eq1 = gpnu * gpnu + nu * nu * (1.0 + if_ + if_ + irp + irp) - 8.0 * `ONE3RD * nu * gpnu * (xf2 + xf * xrp + xrp2) / (xf + xrp); - beta_nom = 1.0 + ev * gamma_b_eff * sqrtphi + ev1 * gamma_b_eff2 * phi; - beta_denom = 1.0 + ev * eq + ev1 * eq1 + beta_coul; -// TAKING INTO ACCOUNT THE CHANNEL LENGTH MODULATION EFFECT ON MOBILITY. - beta_clm_denom = sqrt(1.0 + 2.0 * e_clmxmdm2_2 * powqs_qdp2 / (g_clm + e_clm * mdm2 * (qs_qdp)) + e_clm2 * powqs_qdp2); -// COMBINING ALL THE ABOVE PHENOMENA INTO THE CALCULATION OF beta. - beta = KP_DEV_t * (beta_nom / beta_denom) / beta_clm_denom; -end // MOBILITY_EFFECTS - -begin : SPECIFIC_CURRENT -// CALCULATION OF THE SPECIFIC CURRENT OF THE TRANSISTOR (THE NORMALIZATION FACTOR FOR THE CHANNEL CURRENT) - i0 = 2.0 * nq * UT2 * beta * inv_dqmip1; - Ispec = i0 * WeffNF / (Leff - deltal) * rWNedge; -// CALCULATION OF NORMALIZATION FACTOR FOR CONDUCTANCES (AND ALSO FREQUENTLY PERFORMED CALCULATION) - Gspec = Ispec / UT; -end // SPECIFIC_CURRENT - -begin : DITS -// CALCULATION OF THE DRAIN INDUCED THRESHOLD VOTLAGE SHIFT (AFTER BSIM4 FORMULATION, ADAPTED FOR EKV) - if (PDITS == 0.0) // NOTE: This value for PDITS switches off the effect. - begin - dits_factor = 1.0; - end - else // NOTE: Otherwise, the following coding calculates a DITS factor (dits_factor) which is multiplied with the channel current (IDS). - begin - f_dits = 1.0 / (1.0 + FPROUT * sqrt(Leff) / (qI + 2.0)); - va_dits = (f_dits / PDITS) * (1.0 + (1.0 + PDITSL * Leff) * lexp(PDITSD * (vd - vs) * UT)); - vdseff = vdssat - `MAXA(vdssat - (vd - vs) - DDITS, 0.0, 4.0 * DDITS * vdssat); - dits_factor = (1.0 + (vd - vs - vdseff) / va_dits ); - end - Ispec_dits = Ispec * dits_factor; - Gspec_dits = Gspec * dits_factor; -end // DITS - -begin : DENORMALISING -// CALCULATIONS OF THE DENORMALIZED CHARGES OF THE NODES OF THE TRANSISTOR AND THE CHANNEL CURRENT - QS = qS * Q0; - QD = qD * Q0; - QG = - qG * Q0; // NOTE: Here, QG has different sign with QS and QD, as it is physically correct. - QB = - QS - QD - QG; // NOTE: Instead of multiplying, subtraction is used, since charges are complementary. - IDS = i * Ispec_dits; -end // DENORMALISING + begin : DIBL + // CALCULATION OF THE DRAIN INDUCED BARRIER LOWERING. + l0 = ETAD_DEV * TSI * sqrt(2.0 * sqrtphi / gamma_b_dev); + v_o_dibl = 4.0 + 40.0 * l0 / Leff; + v_o_dibl2 = v_o_dibl * v_o_dibl; + dv_dibl = `MINA(vp,`MINA(vs,vd ,v_o_dibl2),v_o_dibl2); + if (l0 == 0.0) + begin + deltapsis = 0.0; + end + else + begin + tmp = Leff / (l0 + l0); + deltapsis = exp( - tmp) * (2.0 + SIGMAD * tmp * dv_dibl / (2.0 * phi)) * sqrt((nul + vs - dv_dibl) * (nul + vd - dv_dibl)); // NOTE: deltapsis is used at the calculation of the normalized inversion charges at the source and drain ends. Effective PINCH-OFF VOLTAGE (vp_dibl) is increased by a factor of "deltapsis", due to DIBL. + end + end // DIBL + + // CALCULATION OF THE EFFECTIVE PINCH-OFF VOLTAGE DUE TO DIBL + vp_dibl = vp + deltapsis; + + begin : NORMALIZED_FORWARD_CURRENT + // CALCULATION OF NORMALIZED INVERSION CHARGE OF THE (ELECTRICAL) SOURCE SIDE + `QV(qs,(vp_dibl - vs)) + // FREQUENTLY PERFORMED CALCULATION + qs2 = qs * qs; + // CALCULATION OF THE NORMALIZED FORWARD CURRENT + if_ = qs2 + qs; + // FREQUENTLY PERFORMED CALCULATIONS + xf2 = if_ + 0.25; + xf = qs + 0.5; + end // NORMALIZED_FORWARD_CURRENT + + begin : VELOCITY_SATURATION + // CALCULATIONS FOR THE VELOCITY SATURATION EFFECT AND THE CHANNEL LENGTH MODULATION + // -- VELOCITY SATURATION (NOT DEPENDENT ON VD) + g_clm = 0.1; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION + e_clm = 2.0 / ucrit; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION + e_clm2 = e_clm * e_clm; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION + e_clmx2 = 2.0 * e_clm; + e_clmp2 = 2.0 + e_clm; + e_clmx2xqs = e_clmx2 * qs; + qsat = e_clmx2 * if_ / (e_clmp2 + e_clmx2xqs + sqrt(e_clmp2 * e_clmp2 + 4.0 * e_clmx2xqs)); // NOTE: The inversion charge at a point of maximum velocity saturation. + qs_qsat = qs - qsat; + qs_qsat2 = qs_qsat * qs_qsat; + mdm2 = 2.0 - DELTA; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION + e_clmxmdm2_2 = e_clm2 * mdm2 * mdm2; // NOTE: Also used for the calculation of mobility reduction due to CHANNEL LENGTH MODULATION + tmp_vdsat1 = (2.0 * qsat + ln(qsat)) * (1.0 + e_clm * qs_qsat); + tmp_vdsat11 = g_clm + e_clm * mdm2 * qs_qsat; + tmp_vdsat2 = sqrt(1.0 + (2.0 * e_clm2 * mdm2 * mdm2 * qs_qsat2) / tmp_vdsat11 + e_clm2 * qs_qsat2); + vdsat = vp - tmp_vdsat1 / tmp_vdsat2; // NOTE: The potential at a point of the channel of maximum velocity saturation. + vdssat = `MAXA(vdsat - vs,3.0,4.0); // NOTE: The diffence potential along a fully velocity saturated part of the channel, limited to a minimum of 3*UT. Used also for the calculation of impact ionization current (ekv3_idb.va) + // -- VELOCITY SATURATION (DEPENDENT ON VD) + dv_clm = (ACLM / DELTA) * (4.0 * qsat + DELTA) / (qs + 1.0); + tmp_vdp1 = (vd - vs) * sqrt(1.0 + 4.0 * dv_clm / vdssat); + tmp_vdp2 = sqrt((tmp_vdp1 + vdssat) * (tmp_vdp1 + vdssat) + 4.0 * dv_clm * vdssat); + tmp_vdp3 = sqrt((tmp_vdp1 - vdssat) * (tmp_vdp1 - vdssat) + 4.0 * dv_clm * vdssat); + vdp = 0.5 * (tmp_vdp2 - tmp_vdp3) + vs; // NOTE: The potential at the velocity saturated point of the channel, limited by the maximum value (vdsat) + // -- CHANNEL LENGTH MODULATION + u_clm = 0.5 * e_clm * Leff / LC * (vd - vdp); + alpha_clm = LC / (Leff - 2.0 * LC); + deltal = LAMBDA_wt * LC * ln((alpha_clm + u_clm + sqrt(u_clm * u_clm + 2.0 * alpha_clm * u_clm + 1.0)) / (alpha_clm + 1.0)); // NOTE: The distance between the velocity saturated point of the channel and the (electrical) drain end. Used at the SPECIFIC CURRENT calculation. + end // VELOCITY_SATURATION + + begin : NORMALIZED_REVERSE_CURRENT + // CALCULATION OF NORMALIZED INVERSION CHARGE OF THE VELOCITY SATURATED POINT (ELECTRICAL DRAIN END) + `QV(qdp,(vp_dibl - vdp)) + // FREQUENTLY PERFORMED CALCULATION + qdp2 = qdp * qdp; + // CALCULATION OF THE NORMALIZED REVERSE CURRENT + irp = qdp2 + qdp; + // FREQUENTLY PERFORMED CALCULATIONS + xrp2 = irp + 0.25; + xrp = qdp + 0.5; + end // NORMALIZED_REVERSE_CURRENT + + // FREQUENTLY PERFORMED CALCULATIONS COMBINING BOTH NORMALIZED INVERSION CHARGES + qsqdp = qs + qdp; + qs_qdp = qs - qdp; + powqs_qdp2 = qs_qdp * qs_qdp; + qsqdpp1 = qsqdp + 1.0; + powqsqdpp1_2 = 1.0 / (qsqdpp1 * qsqdpp1); + + // CALCULATION OF NORMALIZED CHANNEL CURRENT + i = if_ - irp; + + // CALCULATION OF CHARGE SLOPE FACTOR NQ + `NQ(nq,psi_p,sqrt_psi_p,qs,qdp,dpd,gamma_b_chsh,gamma_g2) + + begin : CHARGE_MODEL + // THE DYNAMIC PART OF THE MODEL. + // CALCULATIONS OF THE CHARGES OF EACH NODE + v_o = vg_p_chsh - psi_p0; // NOTE: psi_p0 used instead of psi_p. + // CALCULATIONS OF THE QUANTUM MECHANICAL EFFECT + qr1 = 3.0 * `ONESQRT2 * gamma_b_chsh; + if (vg_p < 0.0) qbo = vg_p_chsh - psi_p; + else qbo = vg_p_chsh / (1.0 + dpd) - psi_po; + dpsiv = axetaqm2_3 * (lexp(`TWO3RDS * ln(sqrt(`MAXA(0.25 * qbo * qbo + 4.0 * axetaqm2_3 * gamma_b_chsh2,0.0,`POS_MIN)) - 0.5 * qbo)) - lexp(`TWO3RDS * ln(sqrt(`MAXA(qr1 * qr1 + 4.0 * axetaqm2_3 * gamma_b_chsh2,0.0,`POS_MIN)) - qr1))); + v_o_qme = v_o + dpsiv; + // CALCULATIONS OF THE NORMALIZED CHARGES qS, qD, qG + begin + `QX(qS,psi_p,nq,qs,qdp,powqs_qdp2,powqsqdpp1_2) + `QX(qD,psi_p,nq,qdp,qs,powqs_qdp2,powqsqdpp1_2) + `QG(qG,psi_p,qs,qdp,powqs_qdp2,powqsqdpp1_2,qsqdpp1,v_o_qme,gamma_g2) // NOTE: qG is considered with the same sign as qS and qD, although in absolute values they are of opposite signs. This is taken care at the denormalization part of the code. + end + qI = qS + qD; + // CALCULATION OF THE NORMALIZED CHARGE qB AS COMPLEMENTARY TO qS, qD AND qG. + // NOTE: THE ABSOLUTE VALUES OF THE CHARGES ARE NOT OF INTEREST, SINCE ONLY THE THEIR DERIVATIVES WITH RESPECT TO THE VOLTAGES DESCRIBE THE DYNAMIC BEHAVIOUR OF THE DEVICE. + qB = qG - qI; + end // CHARGE_MODEL + + begin : MOBILITY_EFFECTS + // CALCULATION OF THE EFFECTIVE MOBILITY (beta). + // TAKING INTO ACCOUNT THE COULOMB SCATTERING EFFECT. + beta_coul = THC / ((1.0 + (nv * ZC * qs)) * (1.0 + (nv * ZC * qdp))); // NOTE: used in "beta_denom" + // TAKING INTO ACCOUNT THE MOBILITY REDUCTION DUE TO VERTICAL FIELD. + nu = nv * (1.0 - ETA_t) - 1.0; + gpnu = gamma_b_eff * sqrt_psi_p + nu; + eq = qB + ETA_t * nv * qI; + eq1 = gpnu * gpnu + nu * nu * (1.0 + if_ + if_ + irp + irp) - 8.0 * `ONE3RD * nu * gpnu * (xf2 + xf * xrp + xrp2) / (xf + xrp); + beta_nom = 1.0 + ev * gamma_b_eff * sqrtphi + ev1 * gamma_b_eff2 * phi; + beta_denom = 1.0 + ev * eq + ev1 * eq1 + beta_coul; + // TAKING INTO ACCOUNT THE CHANNEL LENGTH MODULATION EFFECT ON MOBILITY. + beta_clm_denom = sqrt(1.0 + 2.0 * e_clmxmdm2_2 * powqs_qdp2 / (g_clm + e_clm * mdm2 * (qs_qdp)) + e_clm2 * powqs_qdp2); + // COMBINING ALL THE ABOVE PHENOMENA INTO THE CALCULATION OF beta. + beta = KP_DEV_t * (beta_nom / beta_denom) / beta_clm_denom; + end // MOBILITY_EFFECTS + + begin : SPECIFIC_CURRENT + // CALCULATION OF THE SPECIFIC CURRENT OF THE TRANSISTOR (THE NORMALIZATION FACTOR FOR THE CHANNEL CURRENT) + i0 = 2.0 * nq * UT2 * beta * inv_dqmip1; + Ispec = i0 * WeffNF / (Leff - deltal) * rWNedge; + // CALCULATION OF NORMALIZATION FACTOR FOR CONDUCTANCES (AND ALSO FREQUENTLY PERFORMED CALCULATION) + Gspec = Ispec / UT; + end // SPECIFIC_CURRENT + + begin : DITS + // CALCULATION OF THE DRAIN INDUCED THRESHOLD VOTLAGE SHIFT (AFTER BSIM4 FORMULATION, ADAPTED FOR EKV) + if (PDITS == 0.0) // NOTE: This value for PDITS switches off the effect. + begin + dits_factor = 1.0; + end + else // NOTE: Otherwise, the following coding calculates a DITS factor (dits_factor) which is multiplied with the channel current (IDS). + begin + f_dits = 1.0 / (1.0 + FPROUT * sqrt(Leff) / (qI + 2.0)); + va_dits = (f_dits / PDITS) * (1.0 + (1.0 + PDITSL * Leff) * lexp(PDITSD * (vd - vs) * UT)); + vdseff = vdssat - `MAXA(vdssat - (vd - vs) - DDITS, 0.0, 4.0 * DDITS * vdssat); + dits_factor = (1.0 + (vd - vs - vdseff) / va_dits ); + end + Ispec_dits = Ispec * dits_factor; + Gspec_dits = Gspec * dits_factor; + end // DITS + + begin : DENORMALISING + // CALCULATIONS OF THE DENORMALIZED CHARGES OF THE NODES OF THE TRANSISTOR AND THE CHANNEL CURRENT + QS = qS * Q0; + QD = qD * Q0; + QG = - qG * Q0; // NOTE: Here, QG has different sign with QS and QD, as it is physically correct. + QB = - QS - QD - QG; // NOTE: Instead of multiplying, subtraction is used, since charges are complementary. + IDS = i * Ispec_dits; + end // DENORMALISING `include "ekv3_include/ekv3_extrinsic_diodes.va" // Modelling the extrinsic junction diodes formed bewteen source and bulk, on the source side, and between the drain and bulk, on the drain side. `include "ekv3_include/ekv3_extrinsic_rc.va" // Modelling the part of the extrinsic model that contains resistors and bias-independent capacitances (Related parameters: CGDO, CGSO, CGBO). @@ -895,175 +895,175 @@ end // DENORMALISING `include "ekv3_include/ekv3_idb.va" // Modelling of the impact ionization current. `include "ekv3_include/ekv3_noise.va" // Modelling of the noise. -// ASSIGNMENT OF CHANNEL CURRENT AND THE DYNAMIC BEHAVIOUR VIA THE CHARGES AT THE NODES TO THE RESPECTIVE BRANCES. -// ACCORDING TO THE MODE OF THE MODEL AND THE INTERNAL NODES USED EACH TIME, THE NODES USED DIFFER. - -`ifdef DC_S -// SERIES RESISTANCE - IDS = IDS / RES_IDS; // NOTE: Internal, first-order calculation of the series resistance effect for the simplest mode of the model, where no internal nodes are introduced. -// CHANNEL CURRENT - I(d ,s ) <+ SIGN_M * d_gt_s_flag * IDS; -// CAPACITANCES - I(b ,g ) <+ SIGN_M * ddt(QB) * QON; - I(d ,g ) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; - I(s ,g ) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; -`endif - -`ifdef DC -// CHANNEL CURRENT - I(di,si) <+ SIGN_M * d_gt_s_flag * IDS; -// CAPACITANCES - I(b ,g ) <+ SIGN_M * ddt(QB) * QON; - I(di,g ) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; - I(si,g ) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; -`endif - -`ifdef RF_S -// CHANNEL CURRENT - I(di,si) <+ SIGN_M * d_gt_s_flag * IDS; -// CAPACITANCES - I(bi,gi) <+ SIGN_M * ddt(QB) * QON; - I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; - I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; -`endif - -`ifdef RF -// CHANNEL CURRENT - I(di,si) <+ SIGN_M * d_gt_s_flag * IDS; -// CAPACITANCES - I(bi,gi) <+ SIGN_M * ddt(QB) * QON; - I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; - I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; -`endif - -`ifdef NQS -// HARD-WRITTEN INTRINSIC CHANNEL SEGMENTATION TO FIVE SEGMENTS (NoCS: Number of Channel Segments). THE FOLLOWING CODING WAS WRITTEN ALLOWING VARIABLE NUMBERS OF SEGMENTS, USING THE A FOR-LOOP, BUT WAS SIMPLIFIED TO FIVE SEGMENTS FOR PORTABILITY REASONS, SINCE THE FOR-LOOP COMMAND OF THE VERILOG-A LANGUAGE WAS NOT SUPPORTED BY ALL SIMULATORS. - Ispec_dits_seg = Ispec_dits * `NoCS; - Q0_seg = Q0 / `NoCS; - begin : MOS_S0 -// STATIC PART OF THE SEGMENT, CHANNEL CURRENT - v1 = d_gt_s * vs + s_gt_d * vdp; - v2 = SIGN * V(m1,bi) / UT; - `QV(q1,(vp_dibl - v1)) - i1 = q1 * (q1 + 1.0); - `QV(q2,(vp_dibl - v2)) - i2 = q2 * (q2 + 1.0); - I(m1,si) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); -// DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES - `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) - q1q2 = q1 + q2; - q1_q2 = q1 - q2; - powq1_q22 = q1_q2 * q1_q2; - q1q2p1 = q1q2 + 1.0; - powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); - `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) - `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) - `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) - qB = - qq1 - qq2 + qG; - I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; - I(m1,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; - I(si,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; - end // MOS_S0 - begin : MOS_S1 -// STATIC PART OF THE SEGMENT, CHANNEL CURRENT - v1 = SIGN * V(m1,bi) / UT; - v2 = SIGN * V(m2,bi) / UT; - `QV(q1,(vp_dibl - v1)) - i1 = q1 * (q1 + 1.0); - `QV(q2,(vp_dibl - v2)) - i2 = q2 * (q2 + 1.0); - I(m2,m1) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); -// DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES - `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) - q1q2 = q1 + q2; - q1_q2 = q1 - q2; - powq1_q22 = q1_q2 * q1_q2; - q1q2p1 = q1q2 + 1.0; - powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); - `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) - `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) - `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) - qB = - qq1 - qq2 + qG; - I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; - I(m2,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; - I(m1,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; - end // MOS_S1 - begin : MOS_M -// STATIC PART OF THE SEGMENT, CHANNEL CURRENT - v1 = SIGN * V(m2,bi) / UT; - v2 = SIGN * V(m3,bi) / UT; - `QV(q1,(vp_dibl - v1)) - i1 = q1 * (q1 + 1.0); - `QV(q2,(vp_dibl - v2)) - i2 = q2 * (q2 + 1.0); - I(m3,m2) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); -// DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES - `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) - q1q2 = q1 + q2; - q1_q2 = q1 - q2; - powq1_q22 = q1_q2 * q1_q2; - q1q2p1 = q1q2 + 1.0; - powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); - `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) - `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) - `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) - qB = - qq1 - qq2 + qG; - I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; - I(m3,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; - I(m2,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; - end // MOS_M - begin : MOS_D1 -// STATIC PART OF THE SEGMENT, CHANNEL CURRENT - v1 = SIGN * V(m3,bi) / UT; - v2 = SIGN * V(m4,bi) / UT; - `QV(q1,(vp_dibl - v1)) - i1 = q1 * (q1 + 1.0); - `QV(q2,(vp_dibl - v2)) - i2 = q2 * (q2 + 1.0); - I(m4,m3) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); -// DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES - `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) - q1q2 = q1 + q2; - q1_q2 = q1 - q2; - powq1_q22 = q1_q2 * q1_q2; - q1q2p1 = q1q2 + 1.0; - powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); - `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) - `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) - `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) - qB = - qq1 - qq2 + qG; - I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; - I(m4,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; - I(m3,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; - end // MOS_D1 - begin : MOS_D0 -// STATIC PART OF THE SEGMENT, CHANNEL CURRENT - v1 = SIGN * V(m4,bi) / UT; - v2 = d_gt_s * vdp + s_gt_d * vs; - `QV(q1,(vp_dibl - v1)) - i1 = q1 * (q1 + 1.0); - `QV(q2,(vp_dibl - v2)) - i2 = q2 * (q2 + 1.0); - I(di,m4) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); -// DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES - `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) - q1q2 = q1 + q2; - q1_q2 = q1 - q2; - powq1_q22 = q1_q2 * q1_q2; - q1q2p1 = q1q2 + 1.0; - powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); - `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) - `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) - `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) - qB = - qq1 - qq2 + qG; - I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; - I(di,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; - I(m4,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; - end // MOS_D0 -`endif + // ASSIGNMENT OF CHANNEL CURRENT AND THE DYNAMIC BEHAVIOUR VIA THE CHARGES AT THE NODES TO THE RESPECTIVE BRANCES. + // ACCORDING TO THE MODE OF THE MODEL AND THE INTERNAL NODES USED EACH TIME, THE NODES USED DIFFER. + + `ifdef DC_S + // SERIES RESISTANCE + IDS = IDS / RES_IDS; // NOTE: Internal, first-order calculation of the series resistance effect for the simplest mode of the model, where no internal nodes are introduced. + // CHANNEL CURRENT + I(d ,s ) <+ SIGN_M * d_gt_s_flag * IDS; + // CAPACITANCES + I(b ,g ) <+ SIGN_M * ddt(QB) * QON; + I(d ,g ) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; + I(s ,g ) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; + `endif + + `ifdef DC + // CHANNEL CURRENT + I(di,si) <+ SIGN_M * d_gt_s_flag * IDS; + // CAPACITANCES + I(b ,g ) <+ SIGN_M * ddt(QB) * QON; + I(di,g ) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; + I(si,g ) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; + `endif + + `ifdef RF_S + // CHANNEL CURRENT + I(di,si) <+ SIGN_M * d_gt_s_flag * IDS; + // CAPACITANCES + I(bi,gi) <+ SIGN_M * ddt(QB) * QON; + I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; + I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; + `endif + + `ifdef RF + // CHANNEL CURRENT + I(di,si) <+ SIGN_M * d_gt_s_flag * IDS; + // CAPACITANCES + I(bi,gi) <+ SIGN_M * ddt(QB) * QON; + I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QD) + s_gt_d * ddt(QS)) * QON; + I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QS) + s_gt_d * ddt(QD)) * QON; + `endif + + `ifdef NQS + // HARD-WRITTEN INTRINSIC CHANNEL SEGMENTATION TO FIVE SEGMENTS (NoCS: Number of Channel Segments). THE FOLLOWING CODING WAS WRITTEN ALLOWING VARIABLE NUMBERS OF SEGMENTS, USING THE A FOR-LOOP, BUT WAS SIMPLIFIED TO FIVE SEGMENTS FOR PORTABILITY REASONS, SINCE THE FOR-LOOP COMMAND OF THE VERILOG-A LANGUAGE WAS NOT SUPPORTED BY ALL SIMULATORS. + Ispec_dits_seg = Ispec_dits * `NoCS; + Q0_seg = Q0 / `NoCS; + begin : MOS_S0 + // STATIC PART OF THE SEGMENT, CHANNEL CURRENT + v1 = d_gt_s * vs + s_gt_d * vdp; + v2 = SIGN * V(m1,bi) / UT; + `QV(q1,(vp_dibl - v1)) + i1 = q1 * (q1 + 1.0); + `QV(q2,(vp_dibl - v2)) + i2 = q2 * (q2 + 1.0); + I(m1,si) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); + // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES + `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) + q1q2 = q1 + q2; + q1_q2 = q1 - q2; + powq1_q22 = q1_q2 * q1_q2; + q1q2p1 = q1q2 + 1.0; + powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); + `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) + `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) + `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) + qB = - qq1 - qq2 + qG; + I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; + I(m1,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; + I(si,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; + end // MOS_S0 + begin : MOS_S1 + // STATIC PART OF THE SEGMENT, CHANNEL CURRENT + v1 = SIGN * V(m1,bi) / UT; + v2 = SIGN * V(m2,bi) / UT; + `QV(q1,(vp_dibl - v1)) + i1 = q1 * (q1 + 1.0); + `QV(q2,(vp_dibl - v2)) + i2 = q2 * (q2 + 1.0); + I(m2,m1) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); + // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES + `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) + q1q2 = q1 + q2; + q1_q2 = q1 - q2; + powq1_q22 = q1_q2 * q1_q2; + q1q2p1 = q1q2 + 1.0; + powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); + `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) + `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) + `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) + qB = - qq1 - qq2 + qG; + I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; + I(m2,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; + I(m1,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; + end // MOS_S1 + begin : MOS_M + // STATIC PART OF THE SEGMENT, CHANNEL CURRENT + v1 = SIGN * V(m2,bi) / UT; + v2 = SIGN * V(m3,bi) / UT; + `QV(q1,(vp_dibl - v1)) + i1 = q1 * (q1 + 1.0); + `QV(q2,(vp_dibl - v2)) + i2 = q2 * (q2 + 1.0); + I(m3,m2) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); + // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES + `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) + q1q2 = q1 + q2; + q1_q2 = q1 - q2; + powq1_q22 = q1_q2 * q1_q2; + q1q2p1 = q1q2 + 1.0; + powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); + `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) + `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) + `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) + qB = - qq1 - qq2 + qG; + I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; + I(m3,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; + I(m2,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; + end // MOS_M + begin : MOS_D1 + // STATIC PART OF THE SEGMENT, CHANNEL CURRENT + v1 = SIGN * V(m3,bi) / UT; + v2 = SIGN * V(m4,bi) / UT; + `QV(q1,(vp_dibl - v1)) + i1 = q1 * (q1 + 1.0); + `QV(q2,(vp_dibl - v2)) + i2 = q2 * (q2 + 1.0); + I(m4,m3) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); + // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES + `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) + q1q2 = q1 + q2; + q1_q2 = q1 - q2; + powq1_q22 = q1_q2 * q1_q2; + q1q2p1 = q1q2 + 1.0; + powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); + `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) + `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) + `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) + qB = - qq1 - qq2 + qG; + I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; + I(m4,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; + I(m3,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; + end // MOS_D1 + begin : MOS_D0 + // STATIC PART OF THE SEGMENT, CHANNEL CURRENT + v1 = SIGN * V(m4,bi) / UT; + v2 = d_gt_s * vdp + s_gt_d * vs; + `QV(q1,(vp_dibl - v1)) + i1 = q1 * (q1 + 1.0); + `QV(q2,(vp_dibl - v2)) + i2 = q2 * (q2 + 1.0); + I(di,m4) <+ SIGN_M * Ispec_dits_seg * (i1 - i2); + // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES + `NQ(nq,psi_p,sqrt_psi_p,q1,q2,dpd,gamma_b_chsh,gamma_g2) + q1q2 = q1 + q2; + q1_q2 = q1 - q2; + powq1_q22 = q1_q2 * q1_q2; + q1q2p1 = q1q2 + 1.0; + powq1q2p1_2 = 1.0 / (q1q2p1 * q1q2p1); + `QX(qq1,psi_p,nq,q1,q2,powq1_q22,powq1q2p1_2) + `QX(qq2,psi_p,nq,q2,q1,powq1_q22,powq1q2p1_2) + `QG(qG,psi_p,q1,q2,powq1_q22,powq1q2p1_2,q1q2p1,v_o_qme,gamma_g2) + qB = - qq1 - qq2 + qG; + I(bi,gi) <+ SIGN_M * ddt(qB * Q0_seg) * QON; + I(di,gi) <+ SIGN_M * ddt(qq2 * Q0_seg) * QON; + I(m4,gi) <+ SIGN_M * ddt(qq1 * Q0_seg) * QON; + end // MOS_D0 + `endif `include "ekv3_include/ekv3_oppoints.va" `include "ekv3_include/ekv3_extract_debug.va" -end + end end // EKV3 endmodule diff --git a/code/ekv3_include/ekv3_definitions.va b/code/ekv3_include/ekv3_definitions.va index 9dc7180..1850f68 100644 --- a/code/ekv3_include/ekv3_definitions.va +++ b/code/ekv3_include/ekv3_definitions.va @@ -58,19 +58,19 @@ // Definition used in ADMS `ifdef insideADMS - `define MODEL @(initial_model) - `define INSTANCE @(initial_instance) - `define ATTR(txt) (*txt*) +`define MODEL @(initial_model) +`define INSTANCE @(initial_instance) +`define ATTR(txt) (*txt*) `else - `define MODEL - `define INSTANCE - `define ATTR(txt) +`define MODEL +`define INSTANCE +`define ATTR(txt) `endif `ifdef insideADMS - `define OPPATTR(n,d,u) (* spice:name=n, info=d , unit=u , ask="yes" *) +`define OPPATTR(n,d,u) (* spice:name=n, info=d , unit=u , ask="yes" *) `else - `define OPPATTR(n,d,u) (* desc=d , units=u *) +`define OPPATTR(n,d,u) (* desc=d , units=u *) `endif `define abs_ddx(a,b) abs(ddx(a,b)) diff --git a/code/ekv3_include/ekv3_edge.va b/code/ekv3_include/ekv3_edge.va index bafb6e6..18822aa 100644 --- a/code/ekv3_include/ekv3_edge.va +++ b/code/ekv3_include/ekv3_edge.va @@ -2,16 +2,16 @@ // CHANNEL CURRENT AND CHARGES FOR THE NODES OF THE EDGE TRANSISTOR ARE CALCULATED. // CALCULATION OF EDGE_DEVICE'S_NORMALIZATION_FACTORS - Ispec_dits_edge = Ispec_dits * rWNWedge; - Q0_edge = Q0 * rWNWedge; - Gspec_dits_edge = Gspec_dits * rWNWedge; +Ispec_dits_edge = Ispec_dits * rWNWedge; +Q0_edge = Q0 * rWNWedge; +Gspec_dits_edge = Gspec_dits * rWNWedge; // CALCULATION OF NORMALIZED AND SCALED THE DEVICE'S GEOMETRY PARAMETERS - dgamma_edge = DGAMMAEDGE * (1.0 + WLDGAMMAEDGE / WLeff) / sqrtUT; - dphi_edge = DPHIEDGE * (1.0 + LDPHIEDGE / Leff) * (1.0 + WDPHIEDGE / Weff) * (1.0 + WLDPHIEDGE / WLeff) / UT; +dgamma_edge = DGAMMAEDGE * (1.0 + WLDGAMMAEDGE / WLeff) / sqrtUT; +dphi_edge = DPHIEDGE * (1.0 + LDPHIEDGE / Leff) * (1.0 + WDPHIEDGE / Weff) * (1.0 + WLDPHIEDGE / WLeff) / UT; // CALCULATION OF DIFFERENTIAL PINCH-OFF VOLTAGE OF THE EDGE DEVICE WITH RESPECT TO THE MAIN DEVICE - dvp_edge = - dgamma_edge * psi_p / (sqrt_psi_p + 0.5 * gamma_b_eff) - dphi_edge; +dvp_edge = - dgamma_edge * psi_p / (sqrt_psi_p + 0.5 * gamma_b_eff) - dphi_edge; begin : INVERSION_CHARGES vp_dibl_edge = vp_dibl + dvp_edge; @@ -20,36 +20,36 @@ begin : INVERSION_CHARGES end // CALCULATION OF EDGE DEVICE'S CHANNEL CURRENT, NORMALIZED AND DENORMALIZED - ids_edge = qs_edge * (qs_edge + 1.0) - qdp_edge * (qdp_edge + 1.0); - IDS_edge = Ispec_dits_edge * ids_edge; +ids_edge = qs_edge * (qs_edge + 1.0) - qdp_edge * (qdp_edge + 1.0); +IDS_edge = Ispec_dits_edge * ids_edge; // CALCULATION OF PINCH-OFF SURFACE POTENTIAL OF THE EDGE DEVICE, NORMALIZED - psi_p_edge = psi_p - dgamma_edge * psi_p / (sqrt_psi_p + 0.5 * gamma_b_eff); - sqrt_psi_p_edge = sqrt(`MAXA(psi_p_edge,1.0E-4,1.0E-2)); +psi_p_edge = psi_p - dgamma_edge * psi_p / (sqrt_psi_p + 0.5 * gamma_b_eff); +sqrt_psi_p_edge = sqrt(`MAXA(psi_p_edge,1.0E-4,1.0E-2)); // CALCULATION OF BODY EFFECT COEFFICIENT OF THE EDGE DEVICE, NORMALIZED - gamma_b_chsh_edge = gamma_b_chsh + dgamma_edge; +gamma_b_chsh_edge = gamma_b_chsh + dgamma_edge; // CALCULATION OF THE CHARGE SLOPE FACTOR OF THE EDGE DEVICE - `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,qs_edge,qdp_edge,dpd,gamma_b_chsh_edge,gamma_g2) +`NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,qs_edge,qdp_edge,dpd,gamma_b_chsh_edge,gamma_g2) // FREQUENTLY PERFORMED CALCULATIONS - qsqdp_edge = qs_edge + qdp_edge; - qs_qdp_edge = qs_edge - qdp_edge; - powqs_qdp2_edge = qs_qdp_edge * qs_qdp_edge; - qsqdpp1_edge = qsqdp_edge + 1.0; - powqsqdpp1_2_edge = 1.0 / (qsqdpp1_edge * qsqdpp1_edge); +qsqdp_edge = qs_edge + qdp_edge; +qs_qdp_edge = qs_edge - qdp_edge; +powqs_qdp2_edge = qs_qdp_edge * qs_qdp_edge; +qsqdpp1_edge = qsqdp_edge + 1.0; +powqsqdpp1_2_edge = 1.0 / (qsqdpp1_edge * qsqdpp1_edge); // CALCULATION OF THE CHARGES AT THE NODES OF THE EDGE DEVICE, NORMALIZED - `QX(qS_edge,psi_p_edge,nq_edge,qs_edge,qdp_edge,powqs_qdp2_edge,powqsqdpp1_2_edge) - `QX(qD_edge,psi_p_edge,nq_edge,qdp_edge,qs_edge,powqs_qdp2_edge,powqsqdpp1_2_edge) - `QG(qG_edge,psi_p_edge,qs_edge,qdp_edge,powqs_qdp2_edge,powqsqdpp1_2_edge,qsqdpp1_edge,v_o_qme,gamma_g2) - qB_edge = qG_edge - qS_edge - qD_edge; +`QX(qS_edge,psi_p_edge,nq_edge,qs_edge,qdp_edge,powqs_qdp2_edge,powqsqdpp1_2_edge) +`QX(qD_edge,psi_p_edge,nq_edge,qdp_edge,qs_edge,powqs_qdp2_edge,powqsqdpp1_2_edge) +`QG(qG_edge,psi_p_edge,qs_edge,qdp_edge,powqs_qdp2_edge,powqsqdpp1_2_edge,qsqdpp1_edge,v_o_qme,gamma_g2) +qB_edge = qG_edge - qS_edge - qD_edge; // DEMORMALIZATION OF THE CHARGES AT THE NODES OF THE EDGE DEVICE - QS_edge = qS_edge * Q0_edge; - QD_edge = qD_edge * Q0_edge; - QG_edge = - qG_edge * Q0_edge; - QB_edge = - QS_edge - QD_edge - QG_edge; +QS_edge = qS_edge * Q0_edge; +QD_edge = qD_edge * Q0_edge; +QG_edge = - qG_edge * Q0_edge; +QB_edge = - QS_edge - QD_edge - QG_edge; // ASSIGNMENT OF CHANNEL CURRENT AND DYNAMIC BEHAVIOUR OF THE EDGE DEVICE @@ -57,47 +57,47 @@ end // SERIES RESISTANCE RES_IDS_edge = 1.0 + rs_wt * Gspec_dits_edge * qs_edge + rd_wt * Gspec_dits_edge * qdp_edge; // NOTE: Internal, first-order calculation of the series resistance effect for the simplest mode of the model (DC_S), where no internal nodes are introduced. IDS_edge = IDS_edge / RES_IDS_edge; -// CHANNEL CURRENT OF THE EDGE DEVICE + // CHANNEL CURRENT OF THE EDGE DEVICE I(d ,s ) <+ SIGN_M * d_gt_s_flag * IDS_edge; -// CAPACITANCES OF THE EDGE DEVICE + // CAPACITANCES OF THE EDGE DEVICE I(b ,g ) <+ SIGN_M * ddt(QB_edge) * QON; I(d ,g ) <+ SIGN_M * (d_gt_s * ddt(QD_edge) + s_gt_d * ddt(QS_edge)) * QON; I(s ,g ) <+ SIGN_M * (d_gt_s * ddt(QS_edge) + s_gt_d * ddt(QD_edge)) * QON; `endif `ifdef DC -// CHANNEL CURRENT OF THE EDGE DEVICE + // CHANNEL CURRENT OF THE EDGE DEVICE I(di,si) <+ SIGN_M * d_gt_s_flag * IDS_edge; -// CAPACITANCES OF THE EDGE DEVICE + // CAPACITANCES OF THE EDGE DEVICE I(b ,g ) <+ SIGN_M * ddt(QB_edge) * QON; I(di,g ) <+ SIGN_M * (d_gt_s * ddt(QD_edge) + s_gt_d * ddt(QS_edge)) * QON; I(si,g ) <+ SIGN_M * (d_gt_s * ddt(QS_edge) + s_gt_d * ddt(QD_edge)) * QON; `endif `ifdef RF_S -// CHANNEL CURRENT OF THE EDGE DEVICE + // CHANNEL CURRENT OF THE EDGE DEVICE I(di,si) <+ SIGN_M * d_gt_s_flag * IDS_edge; -// CAPACITANCES OF THE EDGE DEVICE + // CAPACITANCES OF THE EDGE DEVICE I(bi,gi) <+ SIGN_M * ddt(QB_edge) * QON; I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QD_edge) + s_gt_d * ddt(QS_edge)) * QON; I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QS_edge) + s_gt_d * ddt(QD_edge)) * QON; `endif `ifdef RF -// CHANNEL CURRENT OF THE EDGE DEVICE + // CHANNEL CURRENT OF THE EDGE DEVICE I(di,si) <+ SIGN_M * d_gt_s_flag * IDS_edge; -// CAPACITANCES OF THE EDGE DEVICE + // CAPACITANCES OF THE EDGE DEVICE I(bi,gi) <+ SIGN_M * ddt(QB_edge) * QON; I(di,gi) <+ SIGN_M * (d_gt_s * ddt(QD_edge) + s_gt_d * ddt(QS_edge)) * QON; I(si,gi) <+ SIGN_M * (d_gt_s * ddt(QS_edge) + s_gt_d * ddt(QD_edge)) * QON; `endif `ifdef NQS -// HARD-WRITTEN INTRINSIC CHANNEL SEGMENTATION TO FIVE SEGMENTS (NCS: Number of Channel Segments) FOR EDGE DEVICE. + // HARD-WRITTEN INTRINSIC CHANNEL SEGMENTATION TO FIVE SEGMENTS (NCS: Number of Channel Segments) FOR EDGE DEVICE. Ispec_dits_edge_seg = Ispec_dits_edge * `NoCS; Q0_edge_seg = Q0_edge / `NoCS; begin : EDGE_MOS_S0 -// STATIC PART OF THE SEGMENT, CHANNEL CURRENT, EDGE CONDUCTANCE + // STATIC PART OF THE SEGMENT, CHANNEL CURRENT, EDGE CONDUCTANCE v1 = d_gt_s * vs + s_gt_d * vdp; v2 = SIGN * V(m1,bi) / UT; `QV(q1,(vp_dibl_edge - v1)) @@ -105,7 +105,7 @@ end `QV(q2,(vp_dibl_edge - v2)) i2 = q2 * (q2 + 1.0); I(m1,si) <+ SIGN_M * Ispec_dits_edge_seg * (i1 - i2); -// DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES, EDGE CONDUCTANCE + // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES, EDGE CONDUCTANCE `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,q1,q2,dpd,gamma_b_chsh_edge,gamma_g2) q1q2 = q1 + q2; q1_q2 = q1 - q2; @@ -121,7 +121,7 @@ end I(si,gi) <+ SIGN_M * ddt(qq1 * Q0_edge_seg) * QON; end // EDGE_MOS_S0 begin : EDGE_MOS_S1 -// STATIC PART OF THE SEGMENT, CHANNEL CURRENT, EDGE CONDUCTANCE + // STATIC PART OF THE SEGMENT, CHANNEL CURRENT, EDGE CONDUCTANCE v1 = SIGN * V(m1,bi) / UT; v2 = SIGN * V(m2,bi) / UT; `QV(q1,(vp_dibl_edge - v1)) @@ -129,7 +129,7 @@ end `QV(q2,(vp_dibl_edge - v2)) i2 = q2 * (q2 + 1.0); I(m2,m1) <+ SIGN_M * Ispec_dits_edge_seg * (i1 - i2); -// DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES, EDGE CONDUCTANCE + // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES, EDGE CONDUCTANCE `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,q1,q2,dpd,gamma_b_chsh_edge,gamma_g2) q1q2 = q1 + q2; q1_q2 = q1 - q2; @@ -145,7 +145,7 @@ end I(m1,gi) <+ SIGN_M * ddt(qq1 * Q0_edge_seg) * QON; end // EDGE_MOS_S1 begin : EDGE_MOS_M -// STATIC PART OF THE SEGMENT, CHANNEL CURRENT, EDGE CONDUCTANCE + // STATIC PART OF THE SEGMENT, CHANNEL CURRENT, EDGE CONDUCTANCE v1 = SIGN * V(m2,bi) / UT; v2 = SIGN * V(m3,bi) / UT; `QV(q1,(vp_dibl_edge - v1)) @@ -153,7 +153,7 @@ end `QV(q2,(vp_dibl_edge - v2)) i2 = q2 * (q2 + 1.0); I(m3,m2) <+ SIGN_M * Ispec_dits_edge_seg * (i1 - i2); -// DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES, EDGE CONDUCTANCE + // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES, EDGE CONDUCTANCE `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,q1,q2,dpd,gamma_b_chsh_edge,gamma_g2) q1q2 = q1 + q2; q1_q2 = q1 - q2; @@ -169,7 +169,7 @@ end I(m2,gi) <+ SIGN_M * ddt(qq1 * Q0_edge_seg) * QON; end // EDGE_MOS_M begin : EDGE_MOS_D1 -// STATIC PART OF THE SEGMENT, CHANNEL CURRENT, EDGE CONDUCTANCE + // STATIC PART OF THE SEGMENT, CHANNEL CURRENT, EDGE CONDUCTANCE v1 = SIGN * V(m3,bi) / UT; v2 = SIGN * V(m4,bi) / UT; `QV(q1,(vp_dibl_edge - v1)) @@ -177,7 +177,7 @@ end `QV(q2,(vp_dibl_edge - v2)) i2 = q2 * (q2 + 1.0); I(m4,m3) <+ SIGN_M * Ispec_dits_edge_seg * (i1 - i2); -// DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES, EDGE CONDUCTANCE + // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES, EDGE CONDUCTANCE `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,q1,q2,dpd,gamma_b_chsh_edge,gamma_g2) q1q2 = q1 + q2; q1_q2 = q1 - q2; @@ -193,7 +193,7 @@ end I(m3,gi) <+ SIGN_M * ddt(qq1 * Q0_edge_seg) * QON; end // EDGE_MOS_D1 begin : EDGE_MOS_D0 -// STATIC PART OF THE SEGMENT, CHANNEL CURRENT, EDGE CONDUCTANCE + // STATIC PART OF THE SEGMENT, CHANNEL CURRENT, EDGE CONDUCTANCE v1 = SIGN * V(m4,bi) / UT; v2 = d_gt_s * vdp + s_gt_d * vs; `QV(q1,(vp_dibl_edge - v1)) @@ -201,7 +201,7 @@ end `QV(q2,(vp_dibl_edge - v2)) i2 = q2 * (q2 + 1.0); I(di,m4) <+ SIGN_M * Ispec_dits_edge_seg * (i1 - i2); -// DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES, EDGE CONDUCTANCE + // DYNAMIC PART OF THE SEGMENT, CHARGES AT THE NODES, EDGE CONDUCTANCE `NQ(nq_edge,psi_p_edge,sqrt_psi_p_edge,q1,q2,dpd,gamma_b_chsh_edge,gamma_g2) q1q2 = q1 + q2; q1_q2 = q1 - q2; diff --git a/code/ekv3_include/ekv3_extract_debug.va b/code/ekv3_include/ekv3_extract_debug.va index 6fdaea6..385981d 100644 --- a/code/ekv3_include/ekv3_extract_debug.va +++ b/code/ekv3_include/ekv3_extract_debug.va @@ -3,7 +3,7 @@ begin : EXTRACTING_RESULTS begin if (INFO_LEVEL == 1.0) begin -// INTRODUCTION + // INTRODUCTION $strobe(""); $strobe("########################################"); $strobe("# #"); @@ -14,23 +14,23 @@ begin : EXTRACTING_RESULTS $strobe("# #"); $strobe("########################################"); $strobe(""); -// GENERAL INFORMATION + // GENERAL INFORMATION $strobe(" On device: %m"); - `ifdef DC_S + `ifdef DC_S $strobe(" Model mode: simple low frequency (DC_S: no intrinsic nodes) "); - `endif - `ifdef DC + `endif + `ifdef DC $strobe(" Model mode: low frequency (DC: two intrinsic nodes) "); - `endif - `ifdef RF_S + `endif + `ifdef RF_S $strobe(" Model mode: simple high frequency (RF_S: four intrinsic nodes) "); - `endif - `ifdef RF + `endif + `ifdef RF $strobe(" Model mode: high frequency (RF: six intrinsic nodes) "); - `endif - `ifdef NQS + `endif + `ifdef NQS $strobe(" Model mode: non-quasi-static high frequency (NQS: ten intrinsic nodes) "); - `endif + `endif $strobe(" Temperature: %g C \t UT = %g V \t TNOM = %g C", (T-273.15), UT, TNOM); $strobe(""); $strobe("+ GENERAL CHARACTERISTICS "); @@ -39,14 +39,14 @@ begin : EXTRACTING_RESULTS $strobe(">- COX = %g F*m^(-2)", COX); $strobe(">- VSB = %g V ", V(s,b)); $strobe(""); -// EXTERNAL BIAS + // EXTERNAL BIAS $strobe("+ EXTERNAL BIAS "); $strobe("|"); $strobe(">- VGB = %g V \t VGS = %g V", V(g,b), (V(g,b)-V(s,b))); $strobe(">- VDB = %g V \t VDS = %g V", V(d,b), (V(d,b)-V(s,b))); $strobe(">- VSB = %g V ", V(s,b)); $strobe(""); -// DEVICE GEOMETRY + // DEVICE GEOMETRY $strobe("+ DEVICE GEOMETRY "); $strobe("|"); $strobe(">- Leff = %g m \t Leffc = %g m ", Leff, Leffc); @@ -59,7 +59,7 @@ begin : EXTRACTING_RESULTS $strobe(">"); $strobe(">- W/L = %g ", ((Weff-WEDGE)*NF/(Leff-deltal))); $strobe(""); -// THRESHOLD VOLTAGE + // THRESHOLD VOLTAGE $strobe("+ THRESHOLD VOLTAGE "); $strobe("|"); $strobe(">- VTO(dev,T) = %g V \t VTO(dev,TNOM) = %g V", VTO_DEV_t, VTO_DEV); @@ -75,7 +75,7 @@ begin : EXTRACTING_RESULTS $strobe(">"); $strobe(">- VFB = %g V ", (vfb*UT)); $strobe(""); -// BODY EFFECT FACTOR + // BODY EFFECT FACTOR $strobe("+ BODY EFFECT FACTOR "); $strobe("|"); $strobe(">- GAMMA(dev) = %g V^(1/2)", GAMMA_DEV); @@ -91,7 +91,7 @@ begin : EXTRACTING_RESULTS $strobe(">- GAMMAeff0(CHSH)= %g V^(1/2) \t\t (CHARGE SHARING, NO BIAS)", (gamma_b_chsh0*UT)); $strobe(">- GAMMAeff = %g V^(1/2) \t\t (ALL PHENOMENA, POLYSILICON DEPLETION)", (gamma_b_eff*UT)); $strobe(""); -// FERMI POTENTIAL + // FERMI POTENTIAL $strobe("+ FERMI POTENTIAL "); $strobe("|"); $strobe(">- PHIF(dev,T) = %g V \t PHIF(dev,TNOM) = %g V", PHIF_DEV_t, PHIF_DEV); @@ -105,7 +105,7 @@ begin : EXTRACTING_RESULTS $strobe(">- DPSI(QM) = %g V \t\t (QUANTUM MECHANICAL EFFECTS)", DPSI0); $strobe(">- VBI(dev,T) = %g V", (vbi*UT)); $strobe(""); -// MOBILITY + // MOBILITY $strobe("+ MOBILITY RELATED EFFECTS "); $strobe("|"); $strobe(">- MOB(dev,T) = %g m^2/(V*s)", (beta/COX)); @@ -119,7 +119,7 @@ begin : EXTRACTING_RESULTS $strobe(">- AMOB(MRVF) = %g \t\t (MOBILITY REDUCTION DUE TO VERTICAL FIELD)", (beta_nom/beta_denom)); $strobe(">- AMOB(MRLF) = %g \t\t (MOBILITY REDUCTION DUE TO LONGITUDINAL FIELD)", (1.0 / beta_clm_denom)); $strobe(""); -// QUANTUM MECHANICAL + // QUANTUM MECHANICAL $strobe("+ QUANTUM MECHANICAL EFFECTS "); $strobe("|"); $strobe(">- AQMA = %g \t AQMI = %g \t ETAQM = %g", AQMA, AQMI, ETAQM); @@ -128,14 +128,14 @@ begin : EXTRACTING_RESULTS $strobe(">- DPSI = %g V \t\t (FERMI POTENTIAL)", DPSI0); $strobe(">- DPSIV = %g V \t\t (DVO ON CHARGE MODEL OF QB)", (dpsiv*UT)); $strobe(""); -// SLOPE FACTOR + // SLOPE FACTOR $strobe("+ SLOPE FACTOR "); $strobe("|"); $strobe(">- nv = %g ", nv); $strobe(">- nq = %g ", nq); $strobe(">- nq0 = %g ", nq0); $strobe(""); -// PINCH-OFF + // PINCH-OFF $strobe("+ PINCH-OFF SURFACE POTENTIAL AND VOLTAGE "); $strobe("|"); $strobe(">- PSI_P = %g V ", (psi_p*UT)); @@ -148,7 +148,7 @@ begin : EXTRACTING_RESULTS $strobe(">- DPSI_S(DIBL)= %g V \t\t (DRAIN INDUCED BARRIER LOWERING)", (deltapsis*UT)); $strobe(">- V_P(DIBL) = %g V ", ((vp+deltapsis)*UT)); $strobe(""); -// VELOCITY SATURATION + // VELOCITY SATURATION $strobe("+ VELOCITY SATURATION "); $strobe("|"); $strobe(">- UCRIT = %g V/m \t\t LAMBDA = %g \t\t DELTA = %g \t\t ACLM = %g ", UCRIT, LAMBDA, DELTA, ACLM); @@ -184,10 +184,10 @@ begin : EXTRACTING_RESULTS $strobe(">- DITS = %g ", dits_factor); $strobe(">"); $strobe(">- #### IDS #### = %g A", IDS); - `ifdef DC_S + `ifdef DC_S $strobe(">"); $strobe(">- SERIES RESISTANCE = %g ", (1.0/(1.0+(rs_wt*Ispec/UT)*qs+(rd_wt*Ispec/UT)*qdp))); - `endif + `endif $strobe(""); $strobe("+ CHARGES "); $strobe("|"); @@ -320,21 +320,21 @@ begin : EXTRACTING_RESULTS $strobe(""); $strobe("+ EXTRINSIC RESISTORS "); $strobe("|"); - `ifdef DC_S + `ifdef DC_S $strobe(">- RS = %g Ohm \t\t NOISE = %g (PSD)", rs_wt, (KT4/rs_wt)); $strobe(">- RD = %g Ohm \t\t NOISE = %g (PSD)", rd_wt, (KT4/rd_wt)); - `endif - `ifdef DC + `endif + `ifdef DC $strobe(">- RS = %g Ohm \t\t NOISE = %g (PSD)", rs_wt, (KT4/rs_wt)); $strobe(">- RD = %g Ohm \t\t NOISE = %g (PSD)", rd_wt, (KT4/rd_wt)); - `endif - `ifdef RF_S + `endif + `ifdef RF_S $strobe(">- RS = %g Ohm \t\t NOISE = %g (PSD)", rs_wt, (KT4/rs_wt)); $strobe(">- RD = %g Ohm \t\t NOISE = %g (PSD)", rd_wt, (KT4/rd_wt)); $strobe(">- RG = %g Ohm \t\t NOISE = %g (PSD)", rg_t, (KT4/rg_t)); $strobe(">- RB = %g Ohm \t\t NOISE = %g (PSD)", rb_t, (KT4/rb_t)); - `endif - `ifdef RF + `endif + `ifdef RF $strobe(">- RS = %g Ohm \t\t NOISE = %g (PSD)", rs_wt, (KT4/rs_wt)); $strobe(">- RD = %g Ohm \t\t NOISE = %g (PSD)", rd_wt, (KT4/rd_wt)); $strobe(">- RG = %g Ohm \t\t NOISE = %g (PSD)", rg_t, (KT4/rg_t)); @@ -343,8 +343,8 @@ begin : EXTRACTING_RESULTS $strobe(">- RDB = %g Ohm \t\t NOISE = %g (PSD)", rdb_t, (KT4/rdb_t)); $strobe(">- RDSB = %g Ohm \t\t NOISE = %g (PSD)", rdsb_t, (KT4/rdsb_t)); $strobe(">- RDSB/2 = %g Ohm \t\t NOISE = %g (PSD)", rdsb_t*0.5, (0.5*KT4/rdsb_t)); - `endif - `ifdef NQS + `endif + `ifdef NQS $strobe(">- RS = %g Ohm \t\t NOISE = %g (PSD)", rs_wt, (KT4/rs_wt)); $strobe(">- RD = %g Ohm \t\t NOISE = %g (PSD)", rd_wt, (KT4/rd_wt)); $strobe(">- RG = %g Ohm \t\t NOISE = %g (PSD)", rg_t, (KT4/rg_t)); @@ -353,10 +353,10 @@ begin : EXTRACTING_RESULTS $strobe(">- RDB = %g Ohm \t\t NOISE = %g (PSD)", rdb_t, (KT4/rdb_t)); $strobe(">- RDSB = %g Ohm \t\t NOISE = %g (PSD)", rdsb_t, (KT4/rdsb_t)); $strobe(">- RDSB/2 = %g Ohm \t\t NOISE = %g (PSD)", rdsb_t*0.5, (0.5*KT4/rdsb_t)); - `endif + `endif $strobe(""); $strobe(""); - `ifdef DC_S + `ifdef DC_S $strobe("#######################################################"); $strobe(" "); $strobe(" MACROMODEL: "); @@ -389,8 +389,8 @@ begin : EXTRACTING_RESULTS $strobe(" V_B = %g V ", V(b )); $strobe(" "); $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - `endif - `ifdef DC + `endif + `ifdef DC $strobe("#######################################################"); $strobe(" "); $strobe(" MACROMODEL: "); @@ -426,8 +426,8 @@ begin : EXTRACTING_RESULTS $strobe(" V_SSi = %g V ", (V(s )-V(si ))); $strobe(" "); $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - `endif - `ifdef RF_S + `endif + `ifdef RF_S $strobe("#######################################################"); $strobe(" "); $strobe(" MACROMODEL: "); @@ -480,8 +480,8 @@ begin : EXTRACTING_RESULTS $strobe(" V_BBi = %g V ", (V(b )-V(bi ))); $strobe(" "); $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - `endif - `ifdef RF + `endif + `ifdef RF $strobe("#######################################################"); $strobe(" "); $strobe(" MACROMODEL: "); @@ -538,8 +538,8 @@ begin : EXTRACTING_RESULTS $strobe(" V_BBDi = %g V ", (V(b )-V(bdi))); $strobe(" "); $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - `endif - `ifdef NQS + `endif + `ifdef NQS $strobe("#######################################################"); $strobe(" "); $strobe(" MACROMODEL: "); @@ -604,7 +604,7 @@ begin : EXTRACTING_RESULTS $strobe(" V_DiBi = %g V \t V_DiM4 = %g V ", (V(di )-V(bi )), (V(di )-V(m4 ))); $strobe(" "); $strobe("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - `endif + `endif $strobe(" "); $strobe(" CGSex = CGS_OV + CGS_FR_I + CGS_FR_O "); $strobe(" CGDex = CGD_OV + CGD_FR_I + CGD_FR_O "); @@ -642,33 +642,33 @@ begin : EXTRACTING_RESULTS begin // NO INFO REQUESTED end -// file = 0; -// file_info = 0; -// -// $strobe("START_DEBUG_1 %m"); -// -// @(initial_step) $strobe("START_DEBUG %m"); -// @(final_step) $strobe("VGB:%g \t VSB:%g \t VDB:%g",V(g)-V(b),V(s)-V(b),V(d)-V(b)); -// @(final_step) $strobe("qs:%g \t qdp:%g",qs,qdp); -// @(final_step) $strobe("END_DEBUG %m"); -// -// extract info to file (ekv3_debug.txt) -// uncomment the "integer file" command at the ekv3_variables.va file -// -// @(initial_step) file = $fopen("ekv3_debug.txt"); -// @(final_step) $fstrobe(file,"VGB:%g \t VSB:%g \t VDB:%g",V(g)-V(b),V(s)-V(b),V(d)-V(b)); -// @(final_step) $fstrobe(file,"qs:%g \t qdp:%g",qs,qdp); -// @(final_step) $fclose(file); -// -// extract info to file (ekv3_info.txt) -// uncomment the "integer file_info" command at the ekv3_variables.va file -// -// @(initial_step) file_info = $fopen("ekv3_info.txt"); -// -// @(final_step) $fstrobe(file_info,"VGB:%g \t VSB:%g \t VDB:%g",V(g)-V(b),V(s)-V(b),V(d)-V(b)); -// @(final_step) $fstrobe(file_info,"qs:%g \t qdp:%g",qs,qdp); -// -// @(final_step) $fclose(file_info); + // file = 0; + // file_info = 0; + // + // $strobe("START_DEBUG_1 %m"); + // + // @(initial_step) $strobe("START_DEBUG %m"); + // @(final_step) $strobe("VGB:%g \t VSB:%g \t VDB:%g",V(g)-V(b),V(s)-V(b),V(d)-V(b)); + // @(final_step) $strobe("qs:%g \t qdp:%g",qs,qdp); + // @(final_step) $strobe("END_DEBUG %m"); + // + // extract info to file (ekv3_debug.txt) + // uncomment the "integer file" command at the ekv3_variables.va file + // + // @(initial_step) file = $fopen("ekv3_debug.txt"); + // @(final_step) $fstrobe(file,"VGB:%g \t VSB:%g \t VDB:%g",V(g)-V(b),V(s)-V(b),V(d)-V(b)); + // @(final_step) $fstrobe(file,"qs:%g \t qdp:%g",qs,qdp); + // @(final_step) $fclose(file); + // + // extract info to file (ekv3_info.txt) + // uncomment the "integer file_info" command at the ekv3_variables.va file + // + // @(initial_step) file_info = $fopen("ekv3_info.txt"); + // + // @(final_step) $fstrobe(file_info,"VGB:%g \t VSB:%g \t VDB:%g",V(g)-V(b),V(s)-V(b),V(d)-V(b)); + // @(final_step) $fstrobe(file_info,"qs:%g \t qdp:%g",qs,qdp); + // + // @(final_step) $fclose(file_info); end diff --git a/code/ekv3_include/ekv3_extrinsic_diodes.va b/code/ekv3_include/ekv3_extrinsic_diodes.va index 57ff773..7d7f3af 100644 --- a/code/ekv3_include/ekv3_extrinsic_diodes.va +++ b/code/ekv3_include/ekv3_extrinsic_diodes.va @@ -1,102 +1,102 @@ // EXTERNAL: DIODES begin : DIODES -begin : TEMPERATURE_DIODES -// CALCULATION OF JUNCTION DIODES PARAMETERS, FOR BOTH (SOURCE AND DRAIN) SIDES AS THEY ARE AFFECTED BY TEMPERATURE -// CURRENT PARAMETERS - tmp = eg_tnom / UTNOM - eg_t / UT; // NOTE: Used in temp_arg_S and temp_arg_D variables - temp_arg_S = exp((tmp + XTIS * lnrT) / NJS); // NOTE: Used in jss_t, jssws_t and jsswgs_t variables - temp_arg_D = exp((tmp + XTID * lnrT) / NJD); // NOTE: Used in jsd_t, jsswd_t and jsswgd_t variables - jss_t = JSS * temp_arg_S; - jssws_t = JSSWS * temp_arg_S; - jsswgs_t = JSSWGS * temp_arg_S; - jsd_t = JSD * temp_arg_D; - jsswd_t = JSSWD * temp_arg_D; - jsswgd_t = JSSWGD * temp_arg_D; -// CAPACITANCE PARAMETERS - cjs_t = CJS * (1.0 + TCJ * dT); - cjsws_t = CJSWS * (1.0 + TCJSW * dT); - cjswgs_t = CJSWGS * (1.0 + TCJSWG * dT); - cjd_t = CJD * (1.0 + TCJ * dT); - cjswd_t = CJSWD * (1.0 + TCJSW * dT); - cjswgd_t = CJSWGD * (1.0 + TCJSWG * dT); -// CAPACITANCE VOLTAGE PARAMETERS - pbs_t = PBS - (TPB * dT); - pbsws_t = PBSWS - (TPBSW * dT); - pbswgs_t = PBSWGS - (TPBSWG * dT); - pbd_t = PBD - (TPB * dT); - pbswd_t = PBSWD - (TPBSW * dT); - pbswgd_t = PBSWGD - (TPBSWG * dT); -// TRAP-ASSISTED CURERNT PARAMETERS - tmp = - eg_tnom / UT * (1.0 - rT); // NOTE: Used in jtss_t, jtssws_t, jtsswgs_t, jtsd_t, jtsswd_t and jtsswgd_t variables - jtss_t = JTSS * exp(tmp * XTSS); - jtssws_t = JTSSWS * exp(tmp * XTSSWS); - jtsswgs_t = JTSSWGS * exp(tmp * XTSSWGS); - jtsd_t = JTSD * exp(tmp * XTSD); - jtsswd_t = JTSSWD * exp(tmp * XTSSWD); - jtsswgd_t = JTSSWGD * exp(tmp * XTSSWGD); -// SLOPE PARAMETER FOR TRAP-ASSISTED CURRENT - tmp = rT - 1.0; // NOTE: Used in njtss_t, njtssws_t, njtsswgs_t, njtsd_t, njtsswd_t and njtsswgd_t variables - njtss_t = NJTSS * (1.0 + tmp * TNJTSS); - njtssws_t = NJTSSWS * (1.0 + tmp * TNJTSSWS); - njtsswgs_t = NJTSSWGS * (1.0 + tmp * TNJTSSWGS); - njtsd_t = NJTSD * (1.0 + tmp * TNJTSD); - njtsswd_t = NJTSSWD * (1.0 + tmp * TNJTSSWD); - njtsswgd_t = NJTSSWGD * (1.0 + tmp * TNJTSSWGD); -end // TEMPERATURE_DIODES - -begin : SCALING_GEOMETRY_JUNCTION_DIODES -// CALCULATIONS OF GEOMETRIC CHARACTERISTICS OF THE JUNCTION DIODES -// AREA AND SIDEWAYS PERIMETER OF BOTH (SOURCE AND DRAIN) SIDES JUNCTIONS ARE CALCULATED -// GATESIDE PERIMETER IS ALREADY CALCULATED AND IS EQUAL TO "WeffNF" -// AS, PS, AD AND PD PARAMETERS OVERRIDE HDIF PARAMETER - if ((AS == 0.0) && (HDIF > 0.0)) - begin -// if (NF % 2 == 0) // EVEN NUMBER OF FINGERS - if (even_nf == NF) - as = hdif * Weff * (NF + 2); // NOTE: hdif and Weff are already scaled with SCALE parameter - else // ODD NUMBER OF FINGERS - as = hdif * Weff * (NF + 1); // NOTE: hdif and Weff are already scaled with SCALE parameter - end - else - as = AS * SCALE * SCALE; - - if ((PS == 0.0) && (HDIF > 0.0)) - begin -// if (NF % 2 == 0) // EVEN NUMBER OF FINGERS - if (even_nf == NF) - ps = 2.0 * (hdif * (NF + 2) + Weff); // NOTE: hdif and Weff are already scaled with SCALE parameter - else // ODD NUMBER OF FINGERS - ps = 2.0 * hdif * (NF + 1) + Weff; // NOTE: hdif and Weff are already scaled with SCALE parameter - end - else - ps = PS * SCALE; - - if ((AD == 0.0) && (HDIF > 0.0)) - begin -// if (NF % 2 == 0) // EVEN NUMBER OF FINGERS - if (even_nf == NF) - ad = hdif * Weff * (NF ); // NOTE: hdif and Weff are already scaled with SCALE parameter - else // ODD NUMBER OF FINGERS - ad = hdif * Weff * (NF + 1); // NOTE: hdif and Weff are already scaled with SCALE parameter - end - else - ad = AD * SCALE * SCALE; - - if ((PD == 0.0) && (HDIF > 0.0)) - begin -// if (NF % 2 == 0) // EVEN NUMBER OF FINGERS - if (even_nf == NF) - pd = 2.0 * hdif * NF; // NOTE: hdif and Weff are already scaled with SCALE parameter - else // ODD NUMBER OF FINGERS - pd = 2.0 * hdif * (NF + 1) + Weff; // NOTE: hdif and Weff are already scaled with SCALE parameter - end - else - pd = PD * SCALE; -end // SCALING_GEOMETRY_JUNCTION_DIODES - -// READING THE INPUT VOLTAGES FOR THE JUNCTION DIODES -// THE EXACT NODES DEPEND ON THE MODE USED AND THE INTERNAL NODES CREATED. + begin : TEMPERATURE_DIODES + // CALCULATION OF JUNCTION DIODES PARAMETERS, FOR BOTH (SOURCE AND DRAIN) SIDES AS THEY ARE AFFECTED BY TEMPERATURE + // CURRENT PARAMETERS + tmp = eg_tnom / UTNOM - eg_t / UT; // NOTE: Used in temp_arg_S and temp_arg_D variables + temp_arg_S = exp((tmp + XTIS * lnrT) / NJS); // NOTE: Used in jss_t, jssws_t and jsswgs_t variables + temp_arg_D = exp((tmp + XTID * lnrT) / NJD); // NOTE: Used in jsd_t, jsswd_t and jsswgd_t variables + jss_t = JSS * temp_arg_S; + jssws_t = JSSWS * temp_arg_S; + jsswgs_t = JSSWGS * temp_arg_S; + jsd_t = JSD * temp_arg_D; + jsswd_t = JSSWD * temp_arg_D; + jsswgd_t = JSSWGD * temp_arg_D; + // CAPACITANCE PARAMETERS + cjs_t = CJS * (1.0 + TCJ * dT); + cjsws_t = CJSWS * (1.0 + TCJSW * dT); + cjswgs_t = CJSWGS * (1.0 + TCJSWG * dT); + cjd_t = CJD * (1.0 + TCJ * dT); + cjswd_t = CJSWD * (1.0 + TCJSW * dT); + cjswgd_t = CJSWGD * (1.0 + TCJSWG * dT); + // CAPACITANCE VOLTAGE PARAMETERS + pbs_t = PBS - (TPB * dT); + pbsws_t = PBSWS - (TPBSW * dT); + pbswgs_t = PBSWGS - (TPBSWG * dT); + pbd_t = PBD - (TPB * dT); + pbswd_t = PBSWD - (TPBSW * dT); + pbswgd_t = PBSWGD - (TPBSWG * dT); + // TRAP-ASSISTED CURERNT PARAMETERS + tmp = - eg_tnom / UT * (1.0 - rT); // NOTE: Used in jtss_t, jtssws_t, jtsswgs_t, jtsd_t, jtsswd_t and jtsswgd_t variables + jtss_t = JTSS * exp(tmp * XTSS); + jtssws_t = JTSSWS * exp(tmp * XTSSWS); + jtsswgs_t = JTSSWGS * exp(tmp * XTSSWGS); + jtsd_t = JTSD * exp(tmp * XTSD); + jtsswd_t = JTSSWD * exp(tmp * XTSSWD); + jtsswgd_t = JTSSWGD * exp(tmp * XTSSWGD); + // SLOPE PARAMETER FOR TRAP-ASSISTED CURRENT + tmp = rT - 1.0; // NOTE: Used in njtss_t, njtssws_t, njtsswgs_t, njtsd_t, njtsswd_t and njtsswgd_t variables + njtss_t = NJTSS * (1.0 + tmp * TNJTSS); + njtssws_t = NJTSSWS * (1.0 + tmp * TNJTSSWS); + njtsswgs_t = NJTSSWGS * (1.0 + tmp * TNJTSSWGS); + njtsd_t = NJTSD * (1.0 + tmp * TNJTSD); + njtsswd_t = NJTSSWD * (1.0 + tmp * TNJTSSWD); + njtsswgd_t = NJTSSWGD * (1.0 + tmp * TNJTSSWGD); + end // TEMPERATURE_DIODES + + begin : SCALING_GEOMETRY_JUNCTION_DIODES + // CALCULATIONS OF GEOMETRIC CHARACTERISTICS OF THE JUNCTION DIODES + // AREA AND SIDEWAYS PERIMETER OF BOTH (SOURCE AND DRAIN) SIDES JUNCTIONS ARE CALCULATED + // GATESIDE PERIMETER IS ALREADY CALCULATED AND IS EQUAL TO "WeffNF" + // AS, PS, AD AND PD PARAMETERS OVERRIDE HDIF PARAMETER + if ((AS == 0.0) && (HDIF > 0.0)) + begin + // if (NF % 2 == 0) // EVEN NUMBER OF FINGERS + if (even_nf == NF) + as = hdif * Weff * (NF + 2); // NOTE: hdif and Weff are already scaled with SCALE parameter + else // ODD NUMBER OF FINGERS + as = hdif * Weff * (NF + 1); // NOTE: hdif and Weff are already scaled with SCALE parameter + end + else + as = AS * SCALE * SCALE; + + if ((PS == 0.0) && (HDIF > 0.0)) + begin + // if (NF % 2 == 0) // EVEN NUMBER OF FINGERS + if (even_nf == NF) + ps = 2.0 * (hdif * (NF + 2) + Weff); // NOTE: hdif and Weff are already scaled with SCALE parameter + else // ODD NUMBER OF FINGERS + ps = 2.0 * hdif * (NF + 1) + Weff; // NOTE: hdif and Weff are already scaled with SCALE parameter + end + else + ps = PS * SCALE; + + if ((AD == 0.0) && (HDIF > 0.0)) + begin + // if (NF % 2 == 0) // EVEN NUMBER OF FINGERS + if (even_nf == NF) + ad = hdif * Weff * (NF ); // NOTE: hdif and Weff are already scaled with SCALE parameter + else // ODD NUMBER OF FINGERS + ad = hdif * Weff * (NF + 1); // NOTE: hdif and Weff are already scaled with SCALE parameter + end + else + ad = AD * SCALE * SCALE; + + if ((PD == 0.0) && (HDIF > 0.0)) + begin + // if (NF % 2 == 0) // EVEN NUMBER OF FINGERS + if (even_nf == NF) + pd = 2.0 * hdif * NF; // NOTE: hdif and Weff are already scaled with SCALE parameter + else // ODD NUMBER OF FINGERS + pd = 2.0 * hdif * (NF + 1) + Weff; // NOTE: hdif and Weff are already scaled with SCALE parameter + end + else + pd = PD * SCALE; + end // SCALING_GEOMETRY_JUNCTION_DIODES + + // READING THE INPUT VOLTAGES FOR THE JUNCTION DIODES + // THE EXACT NODES DEPEND ON THE MODE USED AND THE INTERNAL NODES CREATED. `ifdef DC_S v_sbj = SIGN * V(s ,b ); @@ -119,35 +119,35 @@ end // SCALING_GEOMETRY_JUNCTION_DIODES v_dbj = SIGN * V(di,bdi); `endif -// CALCULATION OF THE DIODE-CURRENTS + // CALCULATION OF THE DIODE-CURRENTS -// SOURCE-SIDE + // SOURCE-SIDE is_s = jss_t * as + jssws_t * ps + jsswgs_t * WeffNF; tmp = rT / (UT * NJS); arg_s = - v_sbj * tmp; f_breakdown_s = 1.0 + XJBVS * exp(-(-v_sbj + BVS) * tmp); // NOTE: Breakdown effect isb = is_s * (1.0 - exp(arg_s)) * f_breakdown_s; -// SOURCE-SIDE TRAP-ASSISTED CURRENT + // SOURCE-SIDE TRAP-ASSISTED CURRENT tmp = v_sbj * rT / UT; isb_tun = as * jtss_t * (exp(tmp / njtss_t * VTSS / max(VTSS + v_sbj,1.0E-3)) - 1.0) + ps * jtssws_t * (exp(tmp / njtssws_t * VTSSWS / max(VTSSWS + v_sbj,1.0E-3)) - 1.0) + WeffNF * jtsswgs_t * (exp(tmp / njtsswgs_t * VTSSWGS / max(VTSSWGS + v_sbj,1.0E-3)) - 1.0); -// TOTAL SOURCE-SIDE JUNCTION DIODE CURRENT + // TOTAL SOURCE-SIDE JUNCTION DIODE CURRENT ISBJ = isb + v_sbj * GMIN + isb_tun; -// DRAIN-SIDE + // DRAIN-SIDE is_d = jsd_t * ad + jsswd_t * pd + jsswgd_t * WeffNF; tmp = rT / (UT * NJD); arg_d = - v_dbj * tmp; f_breakdown_d = 1.0 + XJBVD * exp(-(-v_dbj + BVD) * tmp); // NOTE: Breakdown effect idb = is_d * (1.0 - exp(arg_d)) * f_breakdown_d; -// DRAIN-SIDE TRAP-ASSISTED CURRENT + // DRAIN-SIDE TRAP-ASSISTED CURRENT tmp = v_dbj * rT / UT; idb_tun = ad * jtsd_t * (exp(tmp / njtsd_t * VTSD / max(VTSD + v_dbj,1.0E-3)) - 1.0) + pd * jtsswd_t * (exp(tmp / njtsswd_t * VTSSWD / max(VTSSWD + v_dbj,1.0E-3)) - 1.0) + WeffNF * jtsswgd_t * (exp(tmp / njtsswgd_t * VTSSWGD / max(VTSSWGD + v_dbj,1.0E-3)) - 1.0); -// TOTAL DRAIN-SIDE JUNCTION DIODE CURRENT + // TOTAL DRAIN-SIDE JUNCTION DIODE CURRENT IDBJ = idb + v_dbj * GMIN + idb_tun; -// CALCULATION OF THE DIODE-CHARGES (THE CAPACITANCE BEHAVIOUR IS DESCRIBED AS THE DERIVATIVE OF THE CHARGES) + // CALCULATION OF THE DIODE-CHARGES (THE CAPACITANCE BEHAVIOUR IS DESCRIBED AS THE DERIVATIVE OF THE CHARGES) -// SOURCE-SIDE CAPACITANCE CHARGES + // SOURCE-SIDE CAPACITANCE CHARGES if (v_sbj > 0.0) begin cj_s = cjs_t * as * exp( - MJS * ln(1.0 + v_sbj / pbs_t )); @@ -169,7 +169,7 @@ end // SCALING_GEOMETRY_JUNCTION_DIODES end CSBJ = cj_s + cjsw_s + cjswg_s; // NOTE: CALCULATION OF CSBJ (AS WELL AS OF cj_s, cjsw_s AND cjswg_s) IS NOT NECESSARY SINCE THE DYNAMICAL BEHAVIOUR IS DESCRIBED BY THE TIME DERIVATIVE OF THE CHARGE "QSBJ" QSBJ = - (qj_s + qjsw_s + qjswg_s); -// DRAIN-SIDE CAPACITANCE CHARGES + // DRAIN-SIDE CAPACITANCE CHARGES if (v_dbj > 0.0) begin cj_d = cjd_t * ad * exp( - MJD * ln(1.0 + v_dbj / pbd_t )); @@ -198,45 +198,45 @@ end // DIODES `ifdef DC_S // DIODES IV - I(d ,b ) <+ SIGN_M * IDBJ; - I(s ,b ) <+ SIGN_M * ISBJ; +I(d ,b ) <+ SIGN_M * IDBJ; +I(s ,b ) <+ SIGN_M * ISBJ; // DIODES CV - I(d ,b ) <+ SIGN_M * ddt(QDBJ); - I(s ,b ) <+ SIGN_M * ddt(QSBJ); +I(d ,b ) <+ SIGN_M * ddt(QDBJ); +I(s ,b ) <+ SIGN_M * ddt(QSBJ); `endif `ifdef DC // DIODES IV - I(di,b ) <+ SIGN_M * IDBJ; - I(si,b ) <+ SIGN_M * ISBJ; +I(di,b ) <+ SIGN_M * IDBJ; +I(si,b ) <+ SIGN_M * ISBJ; // DIODES CV - I(di,b ) <+ SIGN_M * ddt(QDBJ); - I(si,b ) <+ SIGN_M * ddt(QSBJ); +I(di,b ) <+ SIGN_M * ddt(QDBJ); +I(si,b ) <+ SIGN_M * ddt(QSBJ); `endif `ifdef RF_S // DIODES IV - I(di,bi) <+ SIGN_M * IDBJ; - I(si,bi) <+ SIGN_M * ISBJ; +I(di,bi) <+ SIGN_M * IDBJ; +I(si,bi) <+ SIGN_M * ISBJ; // DIODES CV - I(di,bi) <+ SIGN_M * ddt(QDBJ); - I(si,bi) <+ SIGN_M * ddt(QSBJ); +I(di,bi) <+ SIGN_M * ddt(QDBJ); +I(si,bi) <+ SIGN_M * ddt(QSBJ); `endif `ifdef RF // DIODES IV - I(di,bdi) <+ SIGN_M * IDBJ; - I(si,bsi) <+ SIGN_M * ISBJ; +I(di,bdi) <+ SIGN_M * IDBJ; +I(si,bsi) <+ SIGN_M * ISBJ; // DIODES CV - I(di,bdi) <+ SIGN_M * ddt(QDBJ); - I(si,bsi) <+ SIGN_M * ddt(QSBJ); +I(di,bdi) <+ SIGN_M * ddt(QDBJ); +I(si,bsi) <+ SIGN_M * ddt(QSBJ); `endif `ifdef NQS // DIODES IV - I(di,bdi) <+ SIGN_M * IDBJ; - I(si,bsi) <+ SIGN_M * ISBJ; +I(di,bdi) <+ SIGN_M * IDBJ; +I(si,bsi) <+ SIGN_M * ISBJ; // DIODES CV - I(di,bdi) <+ SIGN_M * ddt(QDBJ); - I(si,bsi) <+ SIGN_M * ddt(QSBJ); +I(di,bdi) <+ SIGN_M * ddt(QDBJ); +I(si,bsi) <+ SIGN_M * ddt(QSBJ); `endif diff --git a/code/ekv3_include/ekv3_extrinsic_rc.va b/code/ekv3_include/ekv3_extrinsic_rc.va index be2cede..11e1903 100644 --- a/code/ekv3_include/ekv3_extrinsic_rc.va +++ b/code/ekv3_include/ekv3_extrinsic_rc.va @@ -1,9 +1,9 @@ // EXTERNAL: RESISTORS ANS BIAS INDEPENDENT OVERLAP CAPACITANCES begin : EXTERNAL_RESISTORS -// CALCULATION OF THE SERIES RESISTANCES -// IN MODES DC, RF_S, RF AND NQS THESE RESISTANCES ARE PLACED BETWEEN THE INTERNAL AND THE EXTERNAL NODES OF SOURCE AND DRAIN -// IN MODE DC_S THE CALCULATION OF THE SERIES RESISTANCE EFFECT IS PERFORMED ANALYTICALLY AS A FIRST ORDER APPROXIMATION AND NO INTERNAL NODES ARE CREATED + // CALCULATION OF THE SERIES RESISTANCES + // IN MODES DC, RF_S, RF AND NQS THESE RESISTANCES ARE PLACED BETWEEN THE INTERNAL AND THE EXTERNAL NODES OF SOURCE AND DRAIN + // IN MODE DC_S THE CALCULATION OF THE SERIES RESISTANCE EFFECT IS PERFORMED ANALYTICALLY AS A FIRST ORDER APPROXIMATION AND NO INTERNAL NODES ARE CREATED if (RLX < 0.0) // NOTE: RLX parameter overrides the assymetric model parameters RSX and RDX. A non-physical negative value for RLX sets the parameter off. begin if (RSX < 0.0) // NOTE: RSX parameter overrides the RSH (resistance factor for the active area of source and drain) and RS (resistance factor of the LDD area) model. A non-physical negative value for RSX sets the parameter off. @@ -20,25 +20,25 @@ begin : EXTERNAL_RESISTORS rs = RLX / WeffNF; // NOTE: RLX used. rd = rs; // NOTE: Symmetric model. end -// WIDTH SCALING OF SERIES RESISTANCES + // WIDTH SCALING OF SERIES RESISTANCES tmp = (1.0 + WRLX / Weff); rs_w = rs * tmp; rd_w = rd * tmp; -// CALCULATION OF GATE RESISTANCE -// GATE RESISTANCE IS USED IN RF_S, RF AND NQS MODES + // CALCULATION OF GATE RESISTANCE + // GATE RESISTANCE IS USED IN RF_S, RF AND NQS MODES rg = RGSH * Weff / (3.0 * GC * GC * NF * Leff) * (1.0 + KRGL1 * Leff2); -// CALCULATION OF SUBSTRATE NETWORK RESISTANCES (RB, RSB, RDB, RDSB) -// RB IS USED IN RF_S, RF AND NQS MODES -// RSB, RDB AND RDSB ARE USED IN RF AND NQS MODES + // CALCULATION OF SUBSTRATE NETWORK RESISTANCES (RB, RSB, RDB, RDSB) + // RB IS USED IN RF_S, RF AND NQS MODES + // RSB, RDB AND RDSB ARE USED IN RF AND NQS MODES if (RINGTYPE == 1.0) // NOTE: Check if the shape of the bulk contact is of HORSE-SHOE type (three sides) begin rb = (RBN == 0.0) ? // NOTE: Check if bulk resistance per finger is defined. RBWSH * 0.5 / Weff : 1.0 / ((Weff * 2.0 / RBWSH) + (NF / RBN)); -// if (NF % 2 == 0) // NOTE: EVEN NUMBER OF FINGERS (Asymmetric device, substrate source-bulk resistance is NOT equal with substrate drain-bulk resistance.) - if (even_nf == NF) + // if (NF % 2 == 0) // NOTE: EVEN NUMBER OF FINGERS (Asymmetric device, substrate source-bulk resistance is NOT equal with substrate drain-bulk resistance.) + if (even_nf == NF) begin rsb = (RSBN == 0.0) ? // NOTE: Check if substrate source-bulk resistance per finger is defined. RSBWSH * 0.5 / Weff : @@ -58,8 +58,8 @@ begin : EXTERNAL_RESISTORS else // NOTE: The shape of the bulk contact is SYMMETRIC type (two sides). No resistance pef finger parameter is used. begin rb = RBWSH * 0.5 / Weff; -// if (NF % 2 == 0) // NOTE: EVEN NUMBER OF FINGERS (Asymmetric device, substrate source-bulk resistance is NOT equal with substrate drain-bulk resistance.) - if (even_nf == NF) + // if (NF % 2 == 0) // NOTE: EVEN NUMBER OF FINGERS (Asymmetric device, substrate source-bulk resistance is NOT equal with substrate drain-bulk resistance.) + if (even_nf == NF) begin rsb = RSBWSH * 0.5 / Weff ; rdb = RDBWSH * 0.5 / Weff ; @@ -70,10 +70,10 @@ begin : EXTERNAL_RESISTORS rdb = rsb; // NOTE: Symmetric device, substrate source-bulk resistance is equal with substrate drain-bulk end end -// CALCULATION OF SUBSTRATE SOURCE-DRAIN RESISTANCE + // CALCULATION OF SUBSTRATE SOURCE-DRAIN RESISTANCE rdsb = RDSBSH * Leff / WeffNF; -// CALCULATION OF TEMPERATURE EFFECT ON RESISTORS + // CALCULATION OF TEMPERATURE EFFECT ON RESISTORS Mr_t = (1.0 + TR * dT + TR2 * dT2); rs_wt = rs_w * Mr_t; rd_wt = rd_w * Mr_t; @@ -83,7 +83,7 @@ begin : EXTERNAL_RESISTORS rdb_t = rdb * Mr_t; rdsb_t = rdsb * Mr_t; -// TRIMMING ALL RESISTANCES TO A POSITIVE MINIMUM VALUE + // TRIMMING ALL RESISTANCES TO A POSITIVE MINIMUM VALUE rs_wt = `MAX(rs_wt ,`MINIMUM_RESISTANCE); rd_wt = `MAX(rd_wt ,`MINIMUM_RESISTANCE); rg_t = `MAX(rg_t ,`MINIMUM_RESISTANCE); @@ -101,17 +101,17 @@ end // EXTERNAL_RESISTORS I(g,s) <+ ddt(CGSO * tmp * V(g,s)); I(g,d) <+ ddt(CGDO * tmp * V(g,d)); I(g,b) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(g,b)); -// CALCULATION OF SERIES RESISTANCE EFFECT ON CHANNEL CURRENT + // CALCULATION OF SERIES RESISTANCE EFFECT ON CHANNEL CURRENT RES_IDS = 1.0 + rs_wt * Gspec_dits * qs + rd_wt * Gspec_dits * qdp; // NOTE: RES_IDS is used at the ekv3.va file `endif `ifdef DC -// BIAS-INDEPENDENT OVERLAP CAPACITANCES + // BIAS-INDEPENDENT OVERLAP CAPACITANCES tmp = M * WeffNF; I(g,si) <+ ddt(CGSO * tmp * V(g,si)); I(g,di) <+ ddt(CGDO * tmp * V(g,di)); I(g,b) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(g,b)); -// SERIES RESISTORS + // SERIES RESISTORS I(s ,si) <+ M * V(s,si) / rs_wt; I(s ,si) <+ white_noise(KT4 / rs_wt, "rs"); I(d ,di) <+ M * V(d,di) / rd_wt; @@ -119,39 +119,39 @@ end // EXTERNAL_RESISTORS `endif `ifdef RF_S -// BIAS-INDEPENDENT OVERLAP CAPACITANCES + // BIAS-INDEPENDENT OVERLAP CAPACITANCES tmp = M * WeffNF; I(gi,si) <+ ddt(CGSO * tmp * V(gi,si)); I(gi,di) <+ ddt(CGDO * tmp * V(gi,di)); I(gi,bi) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(gi,bi)); -// SERIES RESISTORS + // SERIES RESISTORS I(s ,si) <+ M * V(s,si) / rs_wt; I(s ,si) <+ white_noise(KT4 / rs_wt, "rs"); I(d ,di) <+ M * V(d,di) / rd_wt; I(d ,di) <+ white_noise(KT4 / rd_wt, "rd"); -// GATE RESISTANCE + // GATE RESISTANCE I(g ,gi) <+ M * V(g,gi) / rg_t; I(g ,gi) <+ white_noise(KT4 / rg_t, "rg"); -// SUBSTRATE RESISTANCE NETWORK + // SUBSTRATE RESISTANCE NETWORK I(b ,bi) <+ M * V(b,bi) / rb_t; I(b ,bi) <+ white_noise(KT4 / rb_t, "rb"); `endif `ifdef RF -// BIAS-INDEPENDENT OVERLAP CAPACITANCES + // BIAS-INDEPENDENT OVERLAP CAPACITANCES tmp = M * WeffNF; I(gi,si) <+ ddt(CGSO * tmp * V(gi,si)); I(gi,di) <+ ddt(CGDO * tmp * V(gi,di)); I(gi,bi) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(gi,bi)); -// SERIES RESISTORS + // SERIES RESISTORS I(s ,si) <+ M * V(s,si) / rs_wt; I(s ,si) <+ white_noise(KT4 / rs_wt, "rs"); I(d ,di) <+ M * V(d,di) / rd_wt; I(d ,di) <+ white_noise(KT4 / rd_wt, "rd"); -// GATE RESISTANCE + // GATE RESISTANCE I(g ,gi ) <+ M * V(g ,gi ) / rg_t; I(g ,gi ) <+ white_noise(KT4 / rg_t, "rg"); -// SUBSTRATE RESISTANCE NETWORK + // SUBSTRATE RESISTANCE NETWORK I(b ,bi ) <+ M * V(b ,bi ) / rb_t; I(b ,bi ) <+ white_noise(KT4 / rb_t, "rb"); I(b ,bsi) <+ M * V(b ,bsi) / rsb_t; @@ -166,20 +166,20 @@ end // EXTERNAL_RESISTORS `endif `ifdef NQS -// BIAS-INDEPENDENT OVERLAP CAPACITANCES + // BIAS-INDEPENDENT OVERLAP CAPACITANCES tmp = M * WeffNF; I(gi,si) <+ ddt(CGSO * tmp * V(gi,si)); I(gi,di) <+ ddt(CGDO * tmp * V(gi,di)); I(gi,bi) <+ ddt(CGBO * M * 2.0 * Leff * NF * V(gi,bi)); -// SERIES RESISTORS + // SERIES RESISTORS I(s ,si) <+ M * V(s,si) / rs_wt; I(s ,si) <+ white_noise(KT4 / rs_wt, "rs"); I(d ,di) <+ M * V(d,di) / rd_wt; I(d ,di) <+ white_noise(KT4 / rd_wt, "rd"); -// GATE RESISTANCE + // GATE RESISTANCE I(g ,gi ) <+ M * V(g ,gi ) / rg_t; I(g ,gi ) <+ white_noise(KT4 / rg_t, "rg"); -// SUBSTRATE RESISTANCE NETWORK + // SUBSTRATE RESISTANCE NETWORK I(b ,bi ) <+ M * V(b ,bi ) / rb_t; I(b ,bi ) <+ white_noise(KT4 / rb_t, "rb"); I(b ,bsi) <+ M * V(b ,bsi) / rsb_t; diff --git a/code/ekv3_include/ekv3_functions_def.va b/code/ekv3_include/ekv3_functions_def.va index eb7070a..6d6c24e 100644 --- a/code/ekv3_include/ekv3_functions_def.va +++ b/code/ekv3_include/ekv3_functions_def.va @@ -6,88 +6,88 @@ // `QV IS THE INVERSE FUNCTION OF THE v(q) = 2q + lnq. `define QV(q,v) \ -begin \ - vv = v / NUV; \ - if (vv > -0.6) \ - begin \ - z1 = 0.25 * (vv - 1.4 + sqrt(vv * (vv - 0.394036) + 9.662671)); \ - ln_z1_ = ln(z1); \ - z2 = (vv - (2.0 * z1 + ln_z1_)) / (2.0 * z1 + 1.0); \ - q = z1 * (1.0 + z2 * (1.0 + 0.070 * z2)) * NUV; \ - end \ - else \ - begin \ - ln_z1_ = 0.5 * (vv - 0.201491 - sqrt(vv * (vv + 0.402982) + 2.446562)); \ - z1 = exp(ln_z1_); \ - z2 = (vv - (2.0 * z1 + ln_z1_)) / (2.0 * z1 + 1.0); \ - q = z1 * (1.0 + z2 * (1.0 + 0.483 * z2)) * NUV; \ - end \ -end + begin \ + vv = v / NUV; \ + if (vv > -0.6) \ + begin \ + z1 = 0.25 * (vv - 1.4 + sqrt(vv * (vv - 0.394036) + 9.662671)); \ + ln_z1_ = ln(z1); \ + z2 = (vv - (2.0 * z1 + ln_z1_)) / (2.0 * z1 + 1.0); \ + q = z1 * (1.0 + z2 * (1.0 + 0.070 * z2)) * NUV; \ + end \ + else \ + begin \ + ln_z1_ = 0.5 * (vv - 0.201491 - sqrt(vv * (vv + 0.402982) + 2.446562)); \ + z1 = exp(ln_z1_); \ + z2 = (vv - (2.0 * z1 + ln_z1_)) / (2.0 * z1 + 1.0); \ + q = z1 * (1.0 + z2 * (1.0 + 0.483 * z2)) * NUV; \ + end \ + end // FUNCITON `NQ CALCULATES THE CHARGE SLOPE FACTOR. THE FORMULATION TAKES INTO ACCOUNT POLYSILICON DEPLETION `define NQ(nq,psi_p,sqrt_psi_p,qs,qd,dpd,gamma_b,gamma_g2) \ -begin \ - tmp_psi_sa = psi_p - qs - qd; \ - sqrt_psi_sa = sqrt(`MAXA(tmp_psi_sa,1.0e-4,1.0E-2)); \ - if (TG < 0) \ - begin \ - z0 = 1.0 + dpd + gamma_b / (sqrt_psi_p + sqrt_psi_sa); \ - zk = 0.5 + dpd * sqrt_psi_sa / gamma_b; \ - nq = z0 / (zk + sqrt(zk * zk + z0 * (qs + qd) / gamma_g2)); \ - end \ - else \ - begin \ - nq = 1.0 + gamma_b / (sqrt_psi_p + sqrt_psi_sa); \ - end \ -end + begin \ + tmp_psi_sa = psi_p - qs - qd; \ + sqrt_psi_sa = sqrt(`MAXA(tmp_psi_sa,1.0e-4,1.0E-2)); \ + if (TG < 0) \ + begin \ + z0 = 1.0 + dpd + gamma_b / (sqrt_psi_p + sqrt_psi_sa); \ + zk = 0.5 + dpd * sqrt_psi_sa / gamma_b; \ + nq = z0 / (zk + sqrt(zk * zk + z0 * (qs + qd) / gamma_g2)); \ + end \ + else \ + begin \ + nq = 1.0 + gamma_b / (sqrt_psi_p + sqrt_psi_sa); \ + end \ + end // FUNCTION `QX CALCULATES THE CHARGES AT THE END OF THE CHANNEL (SOURCE AND DRAIN NODES). `define QX(qx,psi_p,nq,qs,qd,powqs_qd2,powqsqd1_2) \ -begin \ - if (psi_p > 2.0) \ - begin \ - qx = inv_dqmip1 * nq * `ONE3RD * (qs + qd + qs + 0.5 * (1.0 + 0.8 * qs + 1.2 * qd) * powqs_qd2 * powqsqd1_2); \ - end \ - else \ - begin \ - qx = 0.0; \ - end \ -end + begin \ + if (psi_p > 2.0) \ + begin \ + qx = inv_dqmip1 * nq * `ONE3RD * (qs + qd + qs + 0.5 * (1.0 + 0.8 * qs + 1.2 * qd) * powqs_qd2 * powqsqd1_2); \ + end \ + else \ + begin \ + qx = 0.0; \ + end \ + end // FUNCTION `QG CALCULATES THE CHARGE AT THE GATE NODE. `define QG(qG,psi_p,qs,qd,powqs_qd2,powqsqd1_2,qsqd1,v_o,gamma_g2) \ -begin \ - if (psi_p > 2.0) \ + begin \ + if (psi_p > 2.0) \ begin \ - if (TG < 0) \ - begin \ + if (TG < 0) \ + begin \ v1_qg = v_o + 2.0 * qs * inv_dqmip1; \ v2_qg = v_o + 2.0 * qd * inv_dqmip1; \ - k1 = sqrt(0.25 + v1_qg / gamma_g2); \ - k2 = sqrt(0.25 + v2_qg / gamma_g2); \ - k12 = k1 + k2; \ - k12_2 = k12 * k12; \ - k12_3 = k12_2 * k12; \ - qG = v1_qg / (1.0 + 2.0 * k1) + v2_qg / (1.0 + 2.0 * k2) + inv_dqmip1 * `ONE3RD * (powqs_qd2 / k12_3) * (0.8 * (k12_2 + k1 * k2) / qsqd1 + 2.0 / gamma_g2); \ - end \ - else \ - begin \ + k1 = sqrt(0.25 + v1_qg / gamma_g2); \ + k2 = sqrt(0.25 + v2_qg / gamma_g2); \ + k12 = k1 + k2; \ + k12_2 = k12 * k12; \ + k12_3 = k12_2 * k12; \ + qG = v1_qg / (1.0 + 2.0 * k1) + v2_qg / (1.0 + 2.0 * k2) + inv_dqmip1 * `ONE3RD * (powqs_qd2 / k12_3) * (0.8 * (k12_2 + k1 * k2) / qsqd1 + 2.0 / gamma_g2); \ + end \ + else \ + begin \ qG = v_o + qs + qd + inv_dqmip1 * `ONE3RD * powqs_qd2 / qsqd1; \ end \ end \ else if (psi_p > 0.0) \ - begin \ - qG = (TG < 0) ? v_o / (0.5 + sqrt(0.25 + v_o / gamma_g2)) : v_o; \ + begin \ + qG = (TG < 0) ? v_o / (0.5 + sqrt(0.25 + v_o / gamma_g2)) : v_o; \ end \ - else \ - begin \ - qG = (TG > 0) ? v_o / (0.5 + sqrt(0.25 - v_o / gamma_g2)) : v_o; \ + else \ + begin \ + qG = (TG > 0) ? v_o / (0.5 + sqrt(0.25 - v_o / gamma_g2)) : v_o; \ end \ -end + end `define FUNCTIONS_INCLUDE `endif diff --git a/code/ekv3_include/ekv3_gate_current.va b/code/ekv3_include/ekv3_gate_current.va index 2457783..25022fd 100644 --- a/code/ekv3_include/ekv3_gate_current.va +++ b/code/ekv3_include/ekv3_gate_current.va @@ -14,7 +14,7 @@ begin : GATE_CURRENT dpsi_dq = 2.0; end psi_x = abs(psi_ox) / xb; -// CALCULATION OF PROBABILITY OF TUNNELING + // CALCULATION OF PROBABILITY OF TUNNELING if (psi_x < 1.0) begin tmp = sqrt(1.0 - psi_x); @@ -55,7 +55,7 @@ begin : GATE_CURRENT nigs = 0.5 * nq * igo * (3.0 + a_gc) / (3.0 - b_gc); nigd = nigc - nigs; end -// CALCULATION OF DENORMALIZED GATE CURRENTS + // CALCULATION OF DENORMALIZED GATE CURRENTS if (vg > vfb) // NOTE: Depletion and inversion region. Gate current flows between the gate and the channel and is distributed to source and drain nodes. begin IGB = 0.0; @@ -71,59 +71,59 @@ begin : GATE_CURRENT IGD = 0.0; IGS = 0.0; end -// CALCULATION OF OVERLAP GATE CURRENTS, BETWEEN GATE AND SOURCE, ON ONE SIDE, AND GATE AND DRAIN, ON THE OTHER -// SOURCE SIDE CALCULATIONS -if (LOVIG !=0 ) begin - if (vg - vs > vfb_ov) - begin - tmp = sqrt( vg - vs - vfb_ov + gamma_g2 * 0.25) - gamma_g * 0.5; - psi_ox_sovgc = vg - vs - tmp * tmp; - end - else - begin - tmp = sqrt(-vg + vs + vfb_ov + gamma_ov2 * 0.25) - gamma_ov * 0.5; - psi_ox_sovgc = vg - vs + tmp * tmp; - end - psi_x_sovgc = abs(psi_ox_sovgc) / xb; - if (psi_x_sovgc < 1.0) - begin - tmp = sqrt(1.0 - psi_x_sovgc); - p_tun_sovgc = exp( - ub * (1.0 / (1.0 + tmp) + tmp)); - end - else - begin - p_tun_sovgc = exp( - ub / psi_x_sovgc); - end -// DRAIN SIDE CALCULATIONS - if (vg - vd > vfb_ov) - begin - tmp = sqrt(vg - vd - vfb_ov + gamma_g2 * 0.25) - gamma_g * 0.5; - psi_ox_dovgc = vg - vd - tmp * tmp; - end - else - begin - tmp = sqrt(-vg + vd + vfb_ov + gamma_ov2 * 0.25) - gamma_ov * 0.5; - psi_ox_dovgc = vg - vd + tmp * tmp; - end - psi_x_dovgc = abs(psi_ox_dovgc) / xb; - if (psi_x_dovgc < 1.0) - begin - tmp = sqrt(1.0 - psi_x_dovgc); - p_tun_dovgc = exp( - ub * (1.0 / (1.0 + tmp) + tmp)); + // CALCULATION OF OVERLAP GATE CURRENTS, BETWEEN GATE AND SOURCE, ON ONE SIDE, AND GATE AND DRAIN, ON THE OTHER + // SOURCE SIDE CALCULATIONS + if (LOVIG !=0 ) begin + if (vg - vs > vfb_ov) + begin + tmp = sqrt( vg - vs - vfb_ov + gamma_g2 * 0.25) - gamma_g * 0.5; + psi_ox_sovgc = vg - vs - tmp * tmp; + end + else + begin + tmp = sqrt(-vg + vs + vfb_ov + gamma_ov2 * 0.25) - gamma_ov * 0.5; + psi_ox_sovgc = vg - vs + tmp * tmp; + end + psi_x_sovgc = abs(psi_ox_sovgc) / xb; + if (psi_x_sovgc < 1.0) + begin + tmp = sqrt(1.0 - psi_x_sovgc); + p_tun_sovgc = exp( - ub * (1.0 / (1.0 + tmp) + tmp)); + end + else + begin + p_tun_sovgc = exp( - ub / psi_x_sovgc); + end + // DRAIN SIDE CALCULATIONS + if (vg - vd > vfb_ov) + begin + tmp = sqrt(vg - vd - vfb_ov + gamma_g2 * 0.25) - gamma_g * 0.5; + psi_ox_dovgc = vg - vd - tmp * tmp; + end + else + begin + tmp = sqrt(-vg + vd + vfb_ov + gamma_ov2 * 0.25) - gamma_ov * 0.5; + psi_ox_dovgc = vg - vd + tmp * tmp; + end + psi_x_dovgc = abs(psi_ox_dovgc) / xb; + if (psi_x_dovgc < 1.0) + begin + tmp = sqrt(1.0 - psi_x_dovgc); + p_tun_dovgc = exp( - ub * (1.0 / (1.0 + tmp) + tmp)); + end + else + begin + p_tun_dovgc = exp( - ub / psi_x_dovgc); + end + // CALCULATION OF DENORMALIZED OVERLAP GATE CURERNTS + tmp = KG * WeffNF * LOVIG * UT2 / TOX2; + IGSOV = tmp * psi_ox_sovgc * abs(psi_ox_sovgc) * p_tun_sovgc; + IGDOV = tmp * psi_ox_dovgc * abs(psi_ox_dovgc) * p_tun_dovgc; end - else - begin - p_tun_dovgc = exp( - ub / psi_x_dovgc); + else begin + IGSOV = 0; + IGDOV = 0; end -// CALCULATION OF DENORMALIZED OVERLAP GATE CURERNTS - tmp = KG * WeffNF * LOVIG * UT2 / TOX2; - IGSOV = tmp * psi_ox_sovgc * abs(psi_ox_sovgc) * p_tun_sovgc; - IGDOV = tmp * psi_ox_dovgc * abs(psi_ox_dovgc) * p_tun_dovgc; -end -else begin - IGSOV = 0; - IGDOV = 0; -end end // ASSIGNMENT OF GATE CURRENTS AND OVERLAP GATE CURRENTS. @@ -132,43 +132,43 @@ end I(b ,g ) <+ -SIGN_M * IGB; I(s ,g ) <+ -SIGN_M * (d_gt_s * IGS + s_gt_d * IGD); I(d ,g ) <+ -SIGN_M * (d_gt_s * IGD + s_gt_d * IGS); -// OVERLAP GATE CURRENTS + // OVERLAP GATE CURRENTS I(s ,g ) <+ -SIGN_M * (d_gt_s * IGSOV + s_gt_d * IGDOV); I(d ,g ) <+ -SIGN_M * (d_gt_s * IGDOV + s_gt_d * IGSOV); `endif `ifdef DC -// GATE CURRENTS + // GATE CURRENTS I(b ,g ) <+ -SIGN_M * IGB; I(si,g ) <+ -SIGN_M * (d_gt_s * IGS + s_gt_d * IGD); I(di,g ) <+ -SIGN_M * (d_gt_s * IGD + s_gt_d * IGS); -// OVERLAP GATE CURRENTS + // OVERLAP GATE CURRENTS I(si,g ) <+ -SIGN_M * (d_gt_s * IGSOV + s_gt_d * IGDOV); I(di,g ) <+ -SIGN_M * (d_gt_s * IGDOV + s_gt_d * IGSOV); `endif `ifdef RF_S -// GATE CURRENTS + // GATE CURRENTS I(b ,gi) <+ -SIGN_M * IGB; I(si,gi) <+ -SIGN_M * (d_gt_s * IGS + s_gt_d * IGD); I(di,gi) <+ -SIGN_M * (d_gt_s * IGD + s_gt_d * IGS); -// OVERLAP GATE CURRENTS + // OVERLAP GATE CURRENTS I(si,gi) <+ -SIGN_M * (d_gt_s * IGSOV + s_gt_d * IGDOV); I(di,gi) <+ -SIGN_M * (d_gt_s * IGDOV + s_gt_d * IGSOV); `endif `ifdef RF -// GATE CURRENTS + // GATE CURRENTS I(b ,gi) <+ -SIGN_M * IGB; I(si,gi) <+ -SIGN_M * (d_gt_s * IGS + s_gt_d * IGD); I(di,gi) <+ -SIGN_M * (d_gt_s * IGD + s_gt_d * IGS); -// OVERLAP GATE CURRENTS + // OVERLAP GATE CURRENTS I(si,gi) <+ -SIGN_M * (d_gt_s * IGSOV + s_gt_d * IGDOV); I(di,gi) <+ -SIGN_M * (d_gt_s * IGDOV + s_gt_d * IGSOV); `endif `ifdef NQS -// GATE CURRENTS + // GATE CURRENTS I(b ,gi) <+ -SIGN_M * IGB; I(si,gi) <+ -SIGN_M * (d_gt_s * IGS + s_gt_d * IGD); I(di,gi) <+ -SIGN_M * (d_gt_s * IGD + s_gt_d * IGS); -// OVERLAP GATE CURRENTS + // OVERLAP GATE CURRENTS I(si,gi) <+ -SIGN_M * (d_gt_s * IGSOV + s_gt_d * IGDOV); I(di,gi) <+ -SIGN_M * (d_gt_s * IGDOV + s_gt_d * IGSOV); `endif diff --git a/code/ekv3_include/ekv3_gidl.va b/code/ekv3_include/ekv3_gidl.va index 1f1d749..af0d309 100644 --- a/code/ekv3_include/ekv3_gidl.va +++ b/code/ekv3_include/ekv3_gidl.va @@ -4,13 +4,13 @@ begin : GIDL vgse = vfb + psi_p - 2.0 * qs; tmp1 = (vdp - vs - vgse) * UT - EGIDL; -// PATCH FOR - if (AGIDL==0 || tmp1 <=0 ) begin + // PATCH FOR + if (AGIDL==0 || tmp1 <=0 ) begin IGIDL = 0; - end - else begin - tmp2 = vdp * vdp * vdp * UT3; - IGIDL = AGIDL * WeffNF * (tmp1 / (3.0 * TOX)) * exp(-(3.0 * TOX * BGIDL) / tmp1) * tmp2 / (CGIDL + tmp2); + end + else begin + tmp2 = vdp * vdp * vdp * UT3; + IGIDL = AGIDL * WeffNF * (tmp1 / (3.0 * TOX)) * exp(-(3.0 * TOX * BGIDL) / tmp1) * tmp2 / (CGIDL + tmp2); end end // GIDL @@ -18,12 +18,12 @@ end // GIDL begin : GISL vgde = vfb + psi_p - 2.0 * qdp; tmp1 = (vs - vdp - vgde) * UT - EGIDL; - if (AGIDL==0 || tmp1 <=0 ) begin + if (AGIDL==0 || tmp1 <=0 ) begin IGISL = 0; - end - else begin - tmp2 = vs * vs * vs * UT3; - IGISL = AGIDL * WeffNF * (tmp1 / (3.0 * TOX)) * exp(-(3.0 * TOX * BGIDL) / tmp1) * tmp2 / (CGIDL + tmp2); + end + else begin + tmp2 = vs * vs * vs * UT3; + IGISL = AGIDL * WeffNF * (tmp1 / (3.0 * TOX)) * exp(-(3.0 * TOX * BGIDL) / tmp1) * tmp2 / (CGIDL + tmp2); end end // GISL diff --git a/code/ekv3_include/ekv3_noise.va b/code/ekv3_include/ekv3_noise.va index f542a33..caf7c32 100644 --- a/code/ekv3_include/ekv3_noise.va +++ b/code/ekv3_include/ekv3_noise.va @@ -8,233 +8,233 @@ // ALSO NOTE THAT THE THERMAL NOISE OF THE RESISTANCES OF THE EXTRINSIC NETWORK IS DEFINED IN ekv3_extrinsic_rc.va. begin : noise -// FREQUENTLY PERFORMED CALCULATION + // FREQUENTLY PERFORMED CALCULATION Snspec = KT4 * Gspec; -begin : CHANNEL_NOISE -// CALCULATION OF THERMAL NOISE, INCLUDING SHORT CHANNEL EFFECTS (ANANDA ROY - CHRISTIAN ENZ) - tmp = 1 + e_clm * qs_qdp; - tmp1 = e_clm * i; - gn = (2 / (tmp * tmp * qsqdpp1)) * (`ONE3RD * (qs2 + qs * qdp + qdp2) + tmp1 * tmp1 * 0.25 + 0.25 * (tmp1 + 1) * qsqdp + (tmp1 - 1) * 0.125 * e_clm2 * i * qsqdpp1 * ln(max(1.0E-24,abs((xf - 0.5 * tmp1) / (xrp - 0.5 * tmp1))))); - thermal = Snspec * gn; -//////////////////////////////////////////////////////////////////////////// -/////////////////////OLD FLICKER MODEL////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////// - gmg_ = Gspec * (qs_qdp) / nv; -if (LFNOI == 0) -begin - flicker = KF * exp(EF * ln(max(1.0E-24,abs(gmg_)))) / (WeffNF * Leff * COX * inv_dqmip1); -end -//////////////////////////////////////////////////////////////////////////// -/////////////////////NEW FLICKER MODEL////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////// -else -begin -// FLICKER NOISE DUE TO CARRIER NUMBER FLUCTUATIONS-MC WORTHER MODEL - qel2 = `C_QE*`C_QE; - qel4 = qel2*qel2; - NT_var = NT*(1.6E+25); - sddn = (qel4*`TAD*NT_var)/(`C_K * T *WeffNF*(Leff - deltal)*(COX * inv_dqmip1)*(COX * inv_dqmip1)*nq*nq); - Qspec = 2*nq*UT*COX* inv_dqmip1; - alpha = ALPHAC*Qspec; - a_m = alpha*beta/COX ; - LC_R = (2*UT)/(ECN*(Leff-deltal)); -if (i!=0) -begin - kddn = (1/(2*i*i))*(((qs2+qs)-(qdp2+qdp))/((1+LC_R*(qs-qdp))*(1+LC_R*(qs-qdp))*(1+LC_R*(qs-qdp))))*ln(max(1.0E-24,(qs+0.5-((LC_R*((qs2+qs)-(qdp2+qdp)))/(2*(1+LC_R*(qs-qdp)))))/(qdp+0.5-((LC_R*((qs2+qs)-(qdp2+qdp)))/(2*(1+LC_R*(qs-qdp)))))))+ a_m/(1+qs+qdp) + (a_m/2)*(a_m/2); -end -else -begin -kddn = 0; -end - sidn = sddn*kddn*IDS*IDS; + begin : CHANNEL_NOISE + // CALCULATION OF THERMAL NOISE, INCLUDING SHORT CHANNEL EFFECTS (ANANDA ROY - CHRISTIAN ENZ) + tmp = 1 + e_clm * qs_qdp; + tmp1 = e_clm * i; + gn = (2 / (tmp * tmp * qsqdpp1)) * (`ONE3RD * (qs2 + qs * qdp + qdp2) + tmp1 * tmp1 * 0.25 + 0.25 * (tmp1 + 1) * qsqdp + (tmp1 - 1) * 0.125 * e_clm2 * i * qsqdpp1 * ln(max(1.0E-24,abs((xf - 0.5 * tmp1) / (xrp - 0.5 * tmp1))))); + thermal = Snspec * gn; + //////////////////////////////////////////////////////////////////////////// + /////////////////////OLD FLICKER MODEL////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + gmg_ = Gspec * (qs_qdp) / nv; + if (LFNOI == 0) + begin + flicker = KF * exp(EF * ln(max(1.0E-24,abs(gmg_)))) / (WeffNF * Leff * COX * inv_dqmip1); + end + //////////////////////////////////////////////////////////////////////////// + /////////////////////NEW FLICKER MODEL////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////// + else + begin + // FLICKER NOISE DUE TO CARRIER NUMBER FLUCTUATIONS-MC WORTHER MODEL + qel2 = `C_QE*`C_QE; + qel4 = qel2*qel2; + NT_var = NT*(1.6E+25); + sddn = (qel4*`TAD*NT_var)/(`C_K * T *WeffNF*(Leff - deltal)*(COX * inv_dqmip1)*(COX * inv_dqmip1)*nq*nq); + Qspec = 2*nq*UT*COX* inv_dqmip1; + alpha = ALPHAC*Qspec; + a_m = alpha*beta/COX ; + LC_R = (2*UT)/(ECN*(Leff-deltal)); + if (i!=0) + begin + kddn = (1/(2*i*i))*(((qs2+qs)-(qdp2+qdp))/((1+LC_R*(qs-qdp))*(1+LC_R*(qs-qdp))*(1+LC_R*(qs-qdp))))*ln(max(1.0E-24,(qs+0.5-((LC_R*((qs2+qs)-(qdp2+qdp)))/(2*(1+LC_R*(qs-qdp)))))/(qdp+0.5-((LC_R*((qs2+qs)-(qdp2+qdp)))/(2*(1+LC_R*(qs-qdp)))))))+ a_m/(1+qs+qdp) + (a_m/2)*(a_m/2); + end + else + begin + kddn = 0; + end + sidn = sddn*kddn*IDS*IDS; -// FLICKER NOISE DUE TO MOBILITY FLUCTUATIONS-HOOGE MODEL -if (i!=0) -begin - sddm = (ALPHAH*qel2)/(`C_K * T * WeffNF*(Leff - deltal)*COX * inv_dqmip1*nq); - kddm = (1/(1+qs+qdp))*(1+((ln(qs/qdp))/(2*qs_qdp))); -end -else -begin -sddm = 0; -kddm = 0; -end - sidm = sddm * kddm *IDS*IDS ; -// FLICKER NOISE DUE TO SOURCE AND DRAIN ACESS RESISTANCES -// PATCH : 22 / 11 / 2013 -// Gspec_fn = Ispec/(COX * inv_dqmip1); - Gspec_fn = Gspec / (1.0 + rs_wt * Gspec * qs + rd_wt * Gspec * qdp); - sddr = (qs2+qdp2)*Gspec_fn*Gspec_fn*SDR; - sidr = sddr*IDS*IDS ; + // FLICKER NOISE DUE TO MOBILITY FLUCTUATIONS-HOOGE MODEL + if (i!=0) + begin + sddm = (ALPHAH*qel2)/(`C_K * T * WeffNF*(Leff - deltal)*COX * inv_dqmip1*nq); + kddm = (1/(1+qs+qdp))*(1+((ln(qs/qdp))/(2*qs_qdp))); + end + else + begin + sddm = 0; + kddm = 0; + end + sidm = sddm * kddm *IDS*IDS ; + // FLICKER NOISE DUE TO SOURCE AND DRAIN ACESS RESISTANCES + // PATCH : 22 / 11 / 2013 + // Gspec_fn = Ispec/(COX * inv_dqmip1); + Gspec_fn = Gspec / (1.0 + rs_wt * Gspec * qs + rd_wt * Gspec * qdp); + sddr = (qs2+qdp2)*Gspec_fn*Gspec_fn*SDR; + sidr = sddr*IDS*IDS ; -// TOTAL FLICKER NOISE - flicker = sidn + sidm +sidr ; -end -end // CHANNEL_NOISE -begin : CORRELATED_NOISE -// CALCULATION OF NON-QUASI-STATIC THERMAL NOISE, CORRELATED INDUCED GATE AND BULK NOISE - omegaspec = beta / COX * UT / Leff2; // NOTE: Normalization factor for angular frequency. - OMEGA = (omegaspec != 0.0) ? + // TOTAL FLICKER NOISE + flicker = sidn + sidm +sidr ; + end + end // CHANNEL_NOISE + begin : CORRELATED_NOISE + // CALCULATION OF NON-QUASI-STATIC THERMAL NOISE, CORRELATED INDUCED GATE AND BULK NOISE + omegaspec = beta / COX * UT / Leff2; // NOTE: Normalization factor for angular frequency. + OMEGA = (omegaspec != 0.0) ? 1.0 / omegaspec : 0.0; - tmp = xf + xrp; - tmp1 = xf * xrp; - tmp2 = tmp * tmp; - tmp3 = tmp2 * tmp; - snidid = 2.0 * (xf2 - 0.75 * tmp + tmp1 + xrp2) / (3.0 * tmp); - snigig = OMEGA * OMEGA * (16.0 * (xf2 * xf2 + xrp2 * xrp2) + 80.0 * tmp1 * (xrp2 + xf2) + 168.0 * xf2 * xrp2 - 15.0 * (xf2 * xf + xrp2 * xrp) - 75.0 * tmp1 * tmp) / (540.0 * nq0 * nq0 * tmp3 * tmp2); - snibib = snigig * (nq0 - 1.0) * (nq0 - 1.0); - snigid = (OMEGA / (18.0 * nq0)) * ((xf - xrp) * (xf2 + 4.0 * tmp1 + xrp2)) / tmp3; // NOTE: snigid is imaginary -////////////////////////////////////////////////////// -// PATCH : LIMIT THE VALUES / NON ZERO VALUES NEEDED - snigig = `MAX(snigig,1e-54); - snibib = `MAX(snibib,1e-54); - snidid = `MAX(snidid,1e-54); -////////////////////////////////////////////////////// - c_igid = ((snidid != 0.0) && (snigig != 0.0)) ? + tmp = xf + xrp; + tmp1 = xf * xrp; + tmp2 = tmp * tmp; + tmp3 = tmp2 * tmp; + snidid = 2.0 * (xf2 - 0.75 * tmp + tmp1 + xrp2) / (3.0 * tmp); + snigig = OMEGA * OMEGA * (16.0 * (xf2 * xf2 + xrp2 * xrp2) + 80.0 * tmp1 * (xrp2 + xf2) + 168.0 * xf2 * xrp2 - 15.0 * (xf2 * xf + xrp2 * xrp) - 75.0 * tmp1 * tmp) / (540.0 * nq0 * nq0 * tmp3 * tmp2); + snibib = snigig * (nq0 - 1.0) * (nq0 - 1.0); + snigid = (OMEGA / (18.0 * nq0)) * ((xf - xrp) * (xf2 + 4.0 * tmp1 + xrp2)) / tmp3; // NOTE: snigid is imaginary + ////////////////////////////////////////////////////// + // PATCH : LIMIT THE VALUES / NON ZERO VALUES NEEDED + snigig = `MAX(snigig,1e-54); + snibib = `MAX(snibib,1e-54); + snidid = `MAX(snidid,1e-54); + ////////////////////////////////////////////////////// + c_igid = ((snidid != 0.0) && (snigig != 0.0)) ? snigid / sqrt(snidid * snigig) : 0.0; // NOTE: c_igid is imaginary -// VARIABLES USED IN ASSIGNMENT OF THE NQS NOISE - noise_ds1 = `MAX((snidid * (1.0 - c_igid * c_igid)),0.0); // NOTE: Thermal noise, uncorrelated part. - noise_ds2 = `MAX(c_igid * snidid,0.0); // NOTE: Thermal noise, correlated part. - noise_g = `MAX(snigig,0.0); - noise_b = `MAX(snibib,0.0); -end // CORRELATED_NOISE + // VARIABLES USED IN ASSIGNMENT OF THE NQS NOISE + noise_ds1 = `MAX((snidid * (1.0 - c_igid * c_igid)),0.0); // NOTE: Thermal noise, uncorrelated part. + noise_ds2 = `MAX(c_igid * snidid,0.0); // NOTE: Thermal noise, correlated part. + noise_g = `MAX(snigig,0.0); + noise_b = `MAX(snibib,0.0); + end // CORRELATED_NOISE -begin : GATE_NOISE__SHOT_AND_FLICKER -// CALCULATION OF THE GATE SHOT NOISE AND GATE FLICKER NOISE - if (IG > 0.0) // NOTE: IG is the gate to channel current, calculated in ekv3_gate_current.va. - begin - sig_shot = 2.0 * `C_QE * IG; - sig_flicker = KGFN * IG * IG; - end - else - begin - sig_shot = 0.0; - sig_flicker = 0.0; - end -end // GATE_NOISE__SHOT_AND_FLICKER + begin : GATE_NOISE__SHOT_AND_FLICKER + // CALCULATION OF THE GATE SHOT NOISE AND GATE FLICKER NOISE + if (IG > 0.0) // NOTE: IG is the gate to channel current, calculated in ekv3_gate_current.va. + begin + sig_shot = 2.0 * `C_QE * IG; + sig_flicker = KGFN * IG * IG; + end + else + begin + sig_shot = 0.0; + sig_flicker = 0.0; + end + end // GATE_NOISE__SHOT_AND_FLICKER -// ASSIGNMENT OF THE CALCULATED NOISE SOURCES + // ASSIGNMENT OF THE CALCULATED NOISE SOURCES -flicker_m = flicker / M; -sig_flicker_m = sig_flicker / M; + flicker_m = flicker / M; + sig_flicker_m = sig_flicker / M; `ifdef DC_S -// THERMAL NOISE (INCLUDING SHORT CHANNEL EFFECTS, TH_NOI=1) -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL + // THERMAL NOISE (INCLUDING SHORT CHANNEL EFFECTS, TH_NOI=1) + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL I(d,s) <+ white_noise (M * thermal * TH_NOI + M * Snspec * noise_ds1*NQS_NOI, "THERMAL NOISE IN CHANNEL (TH_NOI=1)"); -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// FLICKER NOISE + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // FLICKER NOISE I(d ,s ) <+ flicker_noise (flicker_m, AF, "FLICKER NOISE IN CHANNEL"); -// NQS THERMAL NOISE (INCLUDING INDUCED GATE AND BULK NOISE, NQS_NOI=1) + // NQS THERMAL NOISE (INCLUDING INDUCED GATE AND BULK NOISE, NQS_NOI=1) I(noi) <+ V(noi); // NOTE: Auxiliary node for defining correlated noise sources. I(noi) <+ white_noise(M * Snspec * NQS_NOI, "AUXILIARY NOISE SOURCE FOR CORRELATION, CORRELATED PART (NQS_NOI=1)"); -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PATCH CMI ERROR DUE TO THE FACT THAT IT CAN NOT RECOGNIZE PARALLEL NOISE SOURCES (12/11) -// I(d,s) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // PATCH CMI ERROR DUE TO THE FACT THAT IT CAN NOT RECOGNIZE PARALLEL NOISE SOURCES (12/11) + // I(d,s) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// I(d ,s ) <+ V(noi) * noise_ds2 * NQS_NOI; // NOTE: Correlated part of thermal noise assigned to channel. I(g) <+ ddt(V(noi) * noise_g * NQS_NOI); // NOTE: Correlated part of thermal noise assigned to gate. The derivate allows the multiplication with the unity imaginary. I(b) <+ flicker_noise(Snspec * noise_b * 2.0 * `PI * NQS_NOI / M, -2.0, "INDUCED BULK NOISE (NQS_NOI=1)"); -// GATE SHOT NOISE + // GATE SHOT NOISE I(g) <+ white_noise (M * sig_shot, "GATE SHOT NOISE"); -// GATE FLICKER NOISE + // GATE FLICKER NOISE I(g) <+ flicker_noise (sig_flicker_m, 1.0, "GATE FLICKER NOISE"); `endif `ifdef DC -// THERMAL NOISE (INCLUDING SHORT CHANNEL EFFECTS, TH_NOI=1) -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL + // THERMAL NOISE (INCLUDING SHORT CHANNEL EFFECTS, TH_NOI=1) + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL I(di,si) <+ white_noise (M * thermal * TH_NOI + M * Snspec * noise_ds1*NQS_NOI, "THERMAL NOISE IN CHANNEL (TH_NOI=1)"); -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// FLICKER NOISE + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // FLICKER NOISE I(di,si) <+ flicker_noise (flicker_m, AF, "FLICKER NOISE IN CHANNEL"); -// NQS THERMAL NOISE (INCLUDING INDUCED GATE AND BULK NOISE, NQS_NOI=1) + // NQS THERMAL NOISE (INCLUDING INDUCED GATE AND BULK NOISE, NQS_NOI=1) I(noi) <+ V(noi); // NOTE: Auxiliary node for defining correlated noise sources. I(noi) <+ white_noise(M * Snspec * NQS_NOI, "AUXILIARY NOISE SOURCE FOR CORRELATION, CORRELATED PART (NQS_NOI=1)"); -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PATCH CMI ERROR DUE TO THE FACT THAT IT CAN NOT RECOGNIZE PARALLEL NOISE SOURCES (12/11) -// I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // PATCH CMI ERROR DUE TO THE FACT THAT IT CAN NOT RECOGNIZE PARALLEL NOISE SOURCES (12/11) + // I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// I(di,si) <+ V(noi) * noise_ds2 * NQS_NOI; // NOTE: Correlated part of thermal noise assigned to channel. I(g) <+ ddt(V(noi) * noise_g * NQS_NOI); // NOTE: Correlated part of thermal noise assigned to gate. The derivate allows the multiplication with the unity imaginary. I(b) <+ flicker_noise(Snspec * noise_b * 2.0 * `PI * NQS_NOI / M, -2.0, "INDUCED BULK NOISE (NQS_NOI=1)"); -// GATE SHOT NOISE + // GATE SHOT NOISE I(g) <+ white_noise (M * sig_shot, "GATE SHOT NOISE"); -// GATE FLICKER NOISE + // GATE FLICKER NOISE I(g) <+ flicker_noise (sig_flicker_m, 1.0, "GATE FLICKER NOISE"); `endif `ifdef RF_S -// THERMAL NOISE (INCLUDING SHORT CHANNEL EFFECTS, TH_NOI=1) -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL + // THERMAL NOISE (INCLUDING SHORT CHANNEL EFFECTS, TH_NOI=1) + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL I(di,si) <+ white_noise (M * thermal * TH_NOI + M * Snspec * noise_ds1*NQS_NOI, "THERMAL NOISE IN CHANNEL (TH_NOI=1)"); -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// FLICKER NOISE + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // FLICKER NOISE I(di,si) <+ flicker_noise (flicker_m, AF, "FLICKER NOISE IN CHANNEL"); -// NQS THERMAL NOISE (INCLUDING INDUCED GATE AND BULK NOISE, NQS_NOI=1) + // NQS THERMAL NOISE (INCLUDING INDUCED GATE AND BULK NOISE, NQS_NOI=1) I(noi) <+ V(noi); // NOTE: Auxiliary node for defining correlated noise sources. I(noi) <+ white_noise(M * Snspec * NQS_NOI, "AUXILIARY NOISE SOURCE FOR CORRELATION, CORRELATED PART (NQS_NOI=1)"); -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PATCH CMI ERROR DUE TO THE FACT THAT IT CAN NOT RECOGNIZE PARALLEL NOISE SOURCES (12/11) -// I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // PATCH CMI ERROR DUE TO THE FACT THAT IT CAN NOT RECOGNIZE PARALLEL NOISE SOURCES (12/11) + // I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// I(di,si) <+ V(noi) * noise_ds2 * NQS_NOI; // NOTE: Correlated part of thermal noise assigned to channel. I(gi) <+ ddt(V(noi) * noise_g * NQS_NOI); // NOTE: Correlated part of thermal noise assigned to gate. The derivate allows the multiplication with the unity imaginary. I(bi) <+ flicker_noise(Snspec * noise_b * 2.0 * `PI * NQS_NOI / M, -2.0, "INDUCED BULK NOISE (NQS_NOI=1)"); -// GATE SHOT NOISE + // GATE SHOT NOISE I(gi) <+ white_noise (M * sig_shot, "GATE SHOT NOISE"); -// GATE FLICKER NOISE + // GATE FLICKER NOISE I(gi) <+ flicker_noise (sig_flicker_m, 1.0, "GATE FLICKER NOISE"); `endif `ifdef RF -// THERMAL NOISE (INCLUDING SHORT CHANNEL EFFECTS, TH_NOI=1) -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL + // THERMAL NOISE (INCLUDING SHORT CHANNEL EFFECTS, TH_NOI=1) + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL I(di,si) <+ white_noise (M * thermal * TH_NOI + M * Snspec * noise_ds1*NQS_NOI, "THERMAL NOISE IN CHANNEL (TH_NOI=1)"); -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// FLICKER NOISE + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // FLICKER NOISE I(di,si) <+ flicker_noise (flicker_m, AF, "FLICKER NOISE IN CHANNEL"); -// NQS THERMAL NOISE (INCLUDING INDUCED GATE AND BULK NOISE, NQS_NOI=1) + // NQS THERMAL NOISE (INCLUDING INDUCED GATE AND BULK NOISE, NQS_NOI=1) I(noi) <+ V(noi); - // NOTE: Auxiliary node for defining correlated noise sources. + // NOTE: Auxiliary node for defining correlated noise sources. I(noi) <+ white_noise(M * Snspec * NQS_NOI , "AUXILIARY NOISE SOURCE FOR CORRELATION, CORRELATED PART (NQS_NOI=1)"); -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PATCH CMI ERROR DUE TO THE FACT THAT IT CAN NOT RECOGNIZE PARALLEL NOISE SOURCES (12/11) -// I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // PATCH CMI ERROR DUE TO THE FACT THAT IT CAN NOT RECOGNIZE PARALLEL NOISE SOURCES (12/11) + // I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// I(di,si) <+ V(noi) * noise_ds2 * NQS_NOI ; // NOTE: Correlated part of thermal noise assigned to channel. I(gi) <+ ddt(V(noi) * noise_g * NQS_NOI ); // NOTE: Correlated part of thermal noise assigned to gate. The derivate allows the multiplication with the unity imaginary. I(bi) <+ flicker_noise(Snspec * noise_b * NQS_NOI * 2.0 * `PI / M, -2.0, "INDUCED BULK NOISE (NQS_NOI=1)"); -// GATE SHOT NOISE + // GATE SHOT NOISE I(gi) <+ white_noise (M * sig_shot, "GATE SHOT NOISE"); -// GATE FLICKER NOISE + // GATE FLICKER NOISE I(gi) <+ flicker_noise (sig_flicker_m, 1.0, "GATE FLICKER NOISE"); `endif `ifdef NQS -// THERMAL NOISE (INCLUDING SHORT CHANNEL EFFECTS, TH_NOI=1) -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL + // THERMAL NOISE (INCLUDING SHORT CHANNEL EFFECTS, TH_NOI=1) + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //PATCH INSERT THE NQS_NOISE TERM IN THE TOTAL I(di,si) <+ white_noise (M * thermal * TH_NOI + M * Snspec * noise_ds1*NQS_NOI, "THERMAL NOISE IN CHANNEL (TH_NOI=1)"); -////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// FLICKER NOISE + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // FLICKER NOISE I(di,si) <+ flicker_noise (flicker_m, AF, "FLICKER NOISE IN CHANNEL"); -// NQS THERMAL NOISE (INCLUDING INDUCED GATE AND BULK NOISE, NQS_NOI=1) + // NQS THERMAL NOISE (INCLUDING INDUCED GATE AND BULK NOISE, NQS_NOI=1) I(noi) <+ V(noi); // NOTE: Auxiliary node for defining correlated noise sources. I(noi) <+ white_noise(M * Snspec * NQS_NOI, "AUXILIARY NOISE SOURCE FOR CORRELATION, CORRELATED PART (NQS_NOI=1)"); -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PATCH CMI ERROR DUE TO THE FACT THAT IT CAN NOT RECOGNIZE PARALLEL NOISE SOURCES (12/11) -// I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // PATCH CMI ERROR DUE TO THE FACT THAT IT CAN NOT RECOGNIZE PARALLEL NOISE SOURCES (12/11) + // I(di,si) <+ white_noise(M * Snspec * noise_ds1*NQS_NOI , "CHANNEL THERMAL NOISE, UNCORRELATED PART (NQS_NOI=1)"); + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// I(di,si) <+ V(noi) * noise_ds2 * NQS_NOI; // NOTE: Correlated part of thermal noise assigned to channel. I(gi) <+ ddt(V(noi) * noise_g * NQS_NOI); // NOTE: Correlated part of thermal noise assigned to gate. The derivate allows the multiplication with the unity imaginary. I(bi) <+ flicker_noise(Snspec * noise_b * 2.0 * `PI * NQS_NOI / M, -2.0, "INDUCED BULK NOISE (NQS_NOI=1)"); -// GATE SHOT NOISE + // GATE SHOT NOISE I(gi) <+ white_noise (M * sig_shot, "GATE SHOT NOISE"); -// GATE FLICKER NOISE + // GATE FLICKER NOISE I(gi) <+ flicker_noise (sig_flicker_m, 1.0, "GATE FLICKER NOISE"); `endif diff --git a/code/ekv3_include/ekv3_oppoints.va b/code/ekv3_include/ekv3_oppoints.va index 6f2f433..15210b2 100644 --- a/code/ekv3_include/ekv3_oppoints.va +++ b/code/ekv3_include/ekv3_oppoints.va @@ -3,168 +3,168 @@ //////////////////////////////////////////////////////////////////////// begin : OPinfo -VOD = nv * (vp_dibl - vs)*UT; -VDSAT = vdssat*UT; -///Effective Beta ///////////////////// -Beta = Ispec / (2.0 * nq * UT2 ); -///Inversion Coefficient //////////////// -ic = i; -ISPEC = Ispec_dits; -VTH = VTO_DEV_t + UT* gamma_b_eff * ( sqrt(`MAXA(phi + vs,0.0,`POS_MIN)) - sqrt(phi)) ; -Vtb = VTO_DEV_t; -Nf=NF; - - -VDS = V(d) - V(s); -VGS = V(g) - V(s); -VBS = V(b) - V(s); -VDB = V(d) - V(b); -VGB = V(g) - V(b); - -//////////////////////////////////////// -//Current Calculation -ids_intr = SIGN_M * d_gt_s_flag * IDS; -ids_edge_effect = SIGN_M * d_gt_s_flag * IDS_edge; - - -tmp = IDS + IDS_edge; -ID = SIGN*M*( tmp + IDB - IGD - IGDOV - IDBJ + IGIDL ) ; -IS = SIGN*M*( - tmp - IGS - IGSOV - ISBJ + IGISL ) ; -IG = SIGN*M*( IGD + IGS + IGB + IGDOV + IGSOV ) ; -IB = SIGN*M*( - IDBJ - ISBJ - IGB - IDB - IGIDL - IGISL ) ; - - -///////////Transconductances////////////// -tmp = (IDS+IDS_edge); -gmsi = abs(SIGN_M * d_gt_s_flag * ddx( tmp,V(`SEFF))); -gmgi = abs(SIGN_M * d_gt_s_flag * ddx( tmp,V(`GEFF))); -gmdi = abs(SIGN_M * d_gt_s_flag * ddx( tmp,V(`DEFF))); -gmbi = abs(SIGN_M * d_gt_s_flag * ddx( tmp,V(`BEFF))); - -tmp = (IDB - IGD - IGDOV - IDBJ + IGIDL); - -gmgt = gmgi + M * ( `abs_ddx(tmp,V(`GEFF)) ); -gmst = gmsi + M * ( `abs_ddx(tmp,V(`SEFF)) ); -gmdt = gmdi + M * ( `abs_ddx(tmp,V(`DEFF)) ); -gmbt = gmbi + M * ( `abs_ddx(tmp,V(`BEFF)) ); - -//gmgt = gmgi + M * ( `abs_ddx(IDB,V(`GEFF))-`abs_ddx(IGB,V(`GEFF))-`abs_ddx(IGDOV,V(`GEFF))-`abs_ddx(IDBJ,V(`GEFF)) + `abs_ddx(IGIDL,V(`GEFF)) ); -//gmst = gmsi + M * ( `abs_ddx(IDB,V(`SEFF))-`abs_ddx(IGB,V(`SEFF))-`abs_ddx(IGDOV,V(`SEFF))-`abs_ddx(IDBJ,V(`SEFF)) + `abs_ddx(IGIDL,V(`SEFF)) ); -//gmdt = gmdi + M * ( `abs_ddx(IDB,V(`DEFF))-`abs_ddx(IGB,V(`DEFF))-`abs_ddx(IGDOV,V(`DEFF))-`abs_ddx(IDBJ,V(`DEFF)) + `abs_ddx(IGIDL,V(`DEFF)) ); -//gmbt = gmbi + M * ( `abs_ddx(IDB,V(`BEFF))-`abs_ddx(IGB,V(`BEFF))-`abs_ddx(IGDOV,V(`BEFF))-`abs_ddx(IDBJ,V(`BEFF)) + `abs_ddx(IGIDL,V(`BEFF)) ); + VOD = nv * (vp_dibl - vs)*UT; + VDSAT = vdssat*UT; + ///Effective Beta ///////////////////// + Beta = Ispec / (2.0 * nq * UT2 ); + ///Inversion Coefficient //////////////// + ic = i; + ISPEC = Ispec_dits; + VTH = VTO_DEV_t + UT* gamma_b_eff * ( sqrt(`MAXA(phi + vs,0.0,`POS_MIN)) - sqrt(phi)) ; + Vtb = VTO_DEV_t; + Nf=NF; + + + VDS = V(d) - V(s); + VGS = V(g) - V(s); + VBS = V(b) - V(s); + VDB = V(d) - V(b); + VGB = V(g) - V(b); + + //////////////////////////////////////// + //Current Calculation + ids_intr = SIGN_M * d_gt_s_flag * IDS; + ids_edge_effect = SIGN_M * d_gt_s_flag * IDS_edge; + + + tmp = IDS + IDS_edge; + ID = SIGN*M*( tmp + IDB - IGD - IGDOV - IDBJ + IGIDL ) ; + IS = SIGN*M*( - tmp - IGS - IGSOV - ISBJ + IGISL ) ; + IG = SIGN*M*( IGD + IGS + IGB + IGDOV + IGSOV ) ; + IB = SIGN*M*( - IDBJ - ISBJ - IGB - IDB - IGIDL - IGISL ) ; + + + ///////////Transconductances////////////// + tmp = (IDS+IDS_edge); + gmsi = abs(SIGN_M * d_gt_s_flag * ddx( tmp,V(`SEFF))); + gmgi = abs(SIGN_M * d_gt_s_flag * ddx( tmp,V(`GEFF))); + gmdi = abs(SIGN_M * d_gt_s_flag * ddx( tmp,V(`DEFF))); + gmbi = abs(SIGN_M * d_gt_s_flag * ddx( tmp,V(`BEFF))); + + tmp = (IDB - IGD - IGDOV - IDBJ + IGIDL); + + gmgt = gmgi + M * ( `abs_ddx(tmp,V(`GEFF)) ); + gmst = gmsi + M * ( `abs_ddx(tmp,V(`SEFF)) ); + gmdt = gmdi + M * ( `abs_ddx(tmp,V(`DEFF)) ); + gmbt = gmbi + M * ( `abs_ddx(tmp,V(`BEFF)) ); + + //gmgt = gmgi + M * ( `abs_ddx(IDB,V(`GEFF))-`abs_ddx(IGB,V(`GEFF))-`abs_ddx(IGDOV,V(`GEFF))-`abs_ddx(IDBJ,V(`GEFF)) + `abs_ddx(IGIDL,V(`GEFF)) ); + //gmst = gmsi + M * ( `abs_ddx(IDB,V(`SEFF))-`abs_ddx(IGB,V(`SEFF))-`abs_ddx(IGDOV,V(`SEFF))-`abs_ddx(IDBJ,V(`SEFF)) + `abs_ddx(IGIDL,V(`SEFF)) ); + //gmdt = gmdi + M * ( `abs_ddx(IDB,V(`DEFF))-`abs_ddx(IGB,V(`DEFF))-`abs_ddx(IGDOV,V(`DEFF))-`abs_ddx(IDBJ,V(`DEFF)) + `abs_ddx(IGIDL,V(`DEFF)) ); + //gmbt = gmbi + M * ( `abs_ddx(IDB,V(`BEFF))-`abs_ddx(IGB,V(`BEFF))-`abs_ddx(IGDOV,V(`BEFF))-`abs_ddx(IDBJ,V(`BEFF)) + `abs_ddx(IGIDL,V(`BEFF)) ); `ifdef DC_S -gmsex = gmst ; -gmgex = gmgt ; -gmdex = gmdt ; -gmbex = gmbt ; + gmsex = gmst ; + gmgex = gmgt ; + gmdex = gmdt ; + gmbex = gmbt ; `else -gmsex = gmst / (1.0 + (gmdt*rd_wt/M) + (gmst*rs_wt/M)); -gmgex = gmgt / (1.0 + (gmdt*rd_wt/M) + (gmst*rs_wt/M)); -gmdex = gmdt / (1.0 + (gmdt*rd_wt/M) + (gmst*rs_wt/M)); -gmbex = gmbt / (1.0 + (gmdt*rd_wt/M) + (gmst*rs_wt/M)); + gmsex = gmst / (1.0 + (gmdt*rd_wt/M) + (gmst*rs_wt/M)); + gmgex = gmgt / (1.0 + (gmdt*rd_wt/M) + (gmst*rs_wt/M)); + gmdex = gmdt / (1.0 + (gmdt*rd_wt/M) + (gmst*rs_wt/M)); + gmbex = gmbt / (1.0 + (gmdt*rd_wt/M) + (gmst*rs_wt/M)); `endif -///////////slope factor calculation//////// -slopefactor = UT*abs(ddx(vp_dibl,V(`GEFF))); -slopefactor = 1/slopefactor; -Vp = vp_dibl * UT; - -//////////Intrinsic Capacitances///////////////// -tmp = QG + QG_edge; - -Cggi = M *( abs(ddx(tmp,V(`GEFF))) ); -Cgsi = M *( abs(ddx(tmp,V(`SEFF))) ); -Cgdi = M *( abs(ddx(tmp,V(`DEFF))) ); -Cgbi = M *( abs(ddx(tmp,V(`BEFF))) ); - -tmp = QS + QS_edge; - -Csgi = M *( abs(ddx(tmp,V(`GEFF))) ); -Cssi = M *( abs(ddx(tmp,V(`SEFF))) ); -Csdi = M *( abs(ddx(tmp,V(`DEFF))) ); -Csbi = M *( abs(ddx(tmp,V(`BEFF))) ); - -tmp = QD + QD_edge; - -Cdgi = M *( abs(ddx(tmp,V(`GEFF))) ); -Cdsi = M *( abs(ddx(tmp,V(`SEFF))) ); -Cddi = M *( abs(ddx(tmp,V(`DEFF))) ); -Cdbi = M *( abs(ddx(tmp,V(`BEFF))) ); - -tmp = QB + QB_edge; - -Cbgi = M *( abs(ddx(tmp,V(`GEFF))) ); -Cbsi = M *( abs(ddx(tmp,V(`SEFF))) ); -Cbdi = M *( abs(ddx(tmp,V(`DEFF))) ); -Cbbi = M *( abs(ddx(tmp,V(`BEFF))) ); -///////////Overlap Voltage Dependent Capacitances /////////////// -Cgsov = M *( abs(ddx((QSOV),V(`GEFF)))); -Cgdov = M *( abs(ddx((QDOV),V(`GEFF)))); - -///Total extrinsic capacitance//////////// -tmp1 = M * abs(ddx(QSFR,V(`GEFF))); -tmp2 = M * abs(ddx(QDFR,V(`GEFF))); -Cgsex = Cgsi + (CGSO * M * WeffNF) + Cgsov + tmp1; -Cgdex = Cgdi + (CGDO * M * WeffNF) + Cgdov + tmp2; -Cgbex = Cgbi + CGBO * M * 2.0 * Leff * NF ; -Ctotex = Cgsex + Cgbex + Cgdex; -////Intrnsic Gain /////////////////////// -Avi = gmgex/gmdex; -///Early voltage /////////////////////// -VM = ID/ gmdex; -///Transit Fr4equency ///////////////// -Ft = gmgex / (2.0*`PI*Ctotex); - -if (ID !=0.0) begin -GmgUtId = UT * abs(gmgex / ID); -GmsUtId = UT * abs(gmsex / ID); -GmbUtId = UT * abs(gmbex / ID); -GmdUtId = UT * abs(gmdex / ID); -GmId = abs( gmgex / ID ); -end -else begin -GmgUtId = 0.0; -GmsUtId = 0.0; -GmbUtId = 0.0; -GmdUtId = 0.0; -GmId = 0.0; -end + ///////////slope factor calculation//////// + slopefactor = UT*abs(ddx(vp_dibl,V(`GEFF))); + slopefactor = 1/slopefactor; + Vp = vp_dibl * UT; + + //////////Intrinsic Capacitances///////////////// + tmp = QG + QG_edge; + + Cggi = M *( abs(ddx(tmp,V(`GEFF))) ); + Cgsi = M *( abs(ddx(tmp,V(`SEFF))) ); + Cgdi = M *( abs(ddx(tmp,V(`DEFF))) ); + Cgbi = M *( abs(ddx(tmp,V(`BEFF))) ); + + tmp = QS + QS_edge; + + Csgi = M *( abs(ddx(tmp,V(`GEFF))) ); + Cssi = M *( abs(ddx(tmp,V(`SEFF))) ); + Csdi = M *( abs(ddx(tmp,V(`DEFF))) ); + Csbi = M *( abs(ddx(tmp,V(`BEFF))) ); + + tmp = QD + QD_edge; + + Cdgi = M *( abs(ddx(tmp,V(`GEFF))) ); + Cdsi = M *( abs(ddx(tmp,V(`SEFF))) ); + Cddi = M *( abs(ddx(tmp,V(`DEFF))) ); + Cdbi = M *( abs(ddx(tmp,V(`BEFF))) ); + + tmp = QB + QB_edge; + + Cbgi = M *( abs(ddx(tmp,V(`GEFF))) ); + Cbsi = M *( abs(ddx(tmp,V(`SEFF))) ); + Cbdi = M *( abs(ddx(tmp,V(`DEFF))) ); + Cbbi = M *( abs(ddx(tmp,V(`BEFF))) ); + ///////////Overlap Voltage Dependent Capacitances /////////////// + Cgsov = M *( abs(ddx((QSOV),V(`GEFF)))); + Cgdov = M *( abs(ddx((QDOV),V(`GEFF)))); + + ///Total extrinsic capacitance//////////// + tmp1 = M * abs(ddx(QSFR,V(`GEFF))); + tmp2 = M * abs(ddx(QDFR,V(`GEFF))); + Cgsex = Cgsi + (CGSO * M * WeffNF) + Cgsov + tmp1; + Cgdex = Cgdi + (CGDO * M * WeffNF) + Cgdov + tmp2; + Cgbex = Cgbi + CGBO * M * 2.0 * Leff * NF ; + Ctotex = Cgsex + Cgbex + Cgdex; + ////Intrnsic Gain /////////////////////// + Avi = gmgex/gmdex; + ///Early voltage /////////////////////// + VM = ID/ gmdex; + ///Transit Fr4equency ///////////////// + Ft = gmgex / (2.0*`PI*Ctotex); + + if (ID !=0.0) begin + GmgUtId = UT * abs(gmgex / ID); + GmsUtId = UT * abs(gmsex / ID); + GmbUtId = UT * abs(gmbex / ID); + GmdUtId = UT * abs(gmdex / ID); + GmId = abs( gmgex / ID ); + end + else begin + GmgUtId = 0.0; + GmsUtId = 0.0; + GmbUtId = 0.0; + GmdUtId = 0.0; + GmId = 0.0; + end -//tmp3 = 1.0/(WeffNF*Leff); -//tmp = AKP * awl * AKP * awl; -//tmp2 = GmId*GmId; -//tmp2 = tmp2 * AVTO * AVTO *awl *awl; -//tmp2 = tmp2 ; -//siId = sqrt(tmp + tmp2); + //tmp3 = 1.0/(WeffNF*Leff); + //tmp = AKP * awl * AKP * awl; + //tmp2 = GmId*GmId; + //tmp2 = tmp2 * AVTO * AVTO *awl *awl; + //tmp2 = tmp2 ; + //siId = sqrt(tmp + tmp2); -//siVg = (GmId == 0.0 )? -// 0.0: -// siId/GmId; + //siVg = (GmId == 0.0 )? + // 0.0: + // siId/GmId; -SID_flicker = flicker/M; -SID_thermal = thermal*M; + SID_flicker = flicker/M; + SID_thermal = thermal*M; -SVG_flicker = (gmgex != 0)? SID_flicker / (gmgex*gmgex) : 0; -SVG_thermal = (gmgex != 0)? SID_thermal / (gmgex*gmgex) : 0; + SVG_flicker = (gmgex != 0)? SID_flicker / (gmgex*gmgex) : 0; + SVG_thermal = (gmgex != 0)? SID_thermal / (gmgex*gmgex) : 0; -//TFP = Ft * GmgUtId / UT; -//GTFP = TFP * Avi; + //TFP = Ft * GmgUtId / UT; + //GTFP = TFP * Avi; -tmp = i0 /( nq * UT * COX ); -tau0 = pow(Leff - deltal,2.0) / (tmp); + tmp = i0 /( nq * UT * COX ); + tau0 = pow(Leff - deltal,2.0) / (tmp); -tmp = xf + xrp; -tmp1 = xf * xrp; -tmp3 = tmp * tmp * tmp; -tau = tau0 *( 4.0/15.0 ) * (xf2 + 3.0*tmp1 +xrp2) / tmp3; + tmp = xf + xrp; + tmp1 = xf * xrp; + tmp3 = tmp * tmp * tmp; + tau = tau0 *( 4.0/15.0 ) * (xf2 + 3.0*tmp1 +xrp2) / tmp3; diff --git a/code/ekv3_include/ekv3_overlap.va b/code/ekv3_include/ekv3_overlap.va index 4e09bba..529bc56 100644 --- a/code/ekv3_include/ekv3_overlap.va +++ b/code/ekv3_include/ekv3_overlap.va @@ -2,8 +2,8 @@ // THE CHARGE CALCULATION IS BASED ON THE FORMULATION OF THE CHARGE CALCULATION OF THE INTRINSIC DEVICE, FOCUSSING ONLY ON TWO NODES (GATE AND BULK), WHERE BULK HERE IS SOURCE OR DRAIN AND WHERE THE DOPING IS OF THE DIFFERENT TYPE. begin : OVERLAP_CAPACITANCES_CHARGES -// CALCULATION OF NORMALIZED BIAS-DEPENDENT OVERLAP CHARGES -// SOURCE SIDE + // CALCULATION OF NORMALIZED BIAS-DEPENDENT OVERLAP CHARGES + // SOURCE SIDE if (TG < 0) // NOTE: Doping type of GATE opposite to the one of the bulk. begin vgsov_p = vg - VOV * vs - vfb_ov; // NOTE: Default value of VOV is 1 @@ -70,7 +70,7 @@ begin : OVERLAP_CAPACITANCES_CHARGES dpsiox_sov = - v2b_sov; end end -// DRAIN SIDE + // DRAIN SIDE if (TG < 0) begin vgdov_p = vg - VOV * vd - vfb_ov; // NOTE: Default value of VOV is 1 @@ -137,7 +137,7 @@ begin : OVERLAP_CAPACITANCES_CHARGES dpsiox_dov = - v2b_dov; end end -// DENORMALIZATION OF BIAS-DEPENDENT OVERLAP CHARGES + // DENORMALIZATION OF BIAS-DEPENDENT OVERLAP CHARGES QSOV = - Q0OV * dpsiox_sov; QDOV = - Q0OV * dpsiox_dov; end diff --git a/code/ekv3_include/ekv3_parameters.va b/code/ekv3_include/ekv3_parameters.va index e108328..166a925 100644 --- a/code/ekv3_include/ekv3_parameters.va +++ b/code/ekv3_include/ekv3_parameters.va @@ -2,39 +2,39 @@ // INSTANCE PARAMETERS // ///////////////////////// - `IPRco( L , 1.0e-5 , "m" , 1e-9 , inf , "Gate Length" ) - `IPRco( W , 1.0e-5 , "m" , 1e-9 , inf , "Total Gate Width" ) - `IPIco( NF , 1 , "" , 1 , inf , "Number of Fingers" ) - `IPIco( M , 1 , "" , 1 , inf , "Multiplicity Factor" ) - `IPRcz( AS , 0.0 , "m^2" , "Area of Source Active Area" ) - `IPRcz( AD , 0.0 , "m^2" , "Area of Drain Active Area" ) - `IPRcz( PS , 0.0 , "m" , "Perimeter of Source Active Area" ) - `IPRcz( PD , 0.0 , "m" , "Perimeter of Drain Active Area" ) - - `IPRcz( SA , 0.0 , "m" , "Distance of first gate finger from STI (one side)" ) - `IPRcz( SB , 0.0 , "m" , "Distance of last gate finger from STI (other side)" ) - `IPRcz( SD , 0.0 , "m" , "Distance between neighbouring gate fingers" ) +`IPRco( L , 1.0e-5 , "m" , 1e-9 , inf , "Gate Length" ) +`IPRco( W , 1.0e-5 , "m" , 1e-9 , inf , "Total Gate Width" ) +`IPIco( NF , 1 , "" , 1 , inf , "Number of Fingers" ) +`IPIco( M , 1 , "" , 1 , inf , "Multiplicity Factor" ) +`IPRcz( AS , 0.0 , "m^2" , "Area of Source Active Area" ) +`IPRcz( AD , 0.0 , "m^2" , "Area of Drain Active Area" ) +`IPRcz( PS , 0.0 , "m" , "Perimeter of Source Active Area" ) +`IPRcz( PD , 0.0 , "m" , "Perimeter of Drain Active Area" ) + +`IPRcz( SA , 0.0 , "m" , "Distance of first gate finger from STI (one side)" ) +`IPRcz( SB , 0.0 , "m" , "Distance of last gate finger from STI (other side)" ) +`IPRcz( SD , 0.0 , "m" , "Distance between neighbouring gate fingers" ) //////////////////////////////// // FLAGS AND SETUP PARAMETERS // //////////////////////////////// - `MPIty( SIGN , 1 , "" , "SIGN = 1 FOR NMOS; SIGN = -1 FOR PMOS") - `MPIty( TG ,-1 , "" , "TYPE OF GATE: -1 ENHANCEMENT TYPE; 1 DEPLETION TYPE") - `MPRco( TNOM , 27.0 , "C" , -`P_CELSIUS0 , inf , "NOMINAL TEMPERATURE FOR MODEL PARAMETERS") - `MPRco( SCALE , 1.0 , "" , 1.0 , inf , "SCALING SIZE FACTOR") - `MPRnb( XL , 0.0 , "m" , "OPTICAL OFFSET FOR CHANNEL LENGTH") - `MPRnb( XW , 0.0 , "m" , "OPTICAL OFFSET FOR CHANNEL WIDTH") - `MPIsw( NQS_NOI , 1 , "" , "FLAG TURNING ON NQS THERMAL NOISE MODEL. (NOT BOTH NQS_NOI AND TH_NOI SHOULD BE SET TO 1).") - `MPIsw( TH_NOI , 0 , "" , "FLAG TURNING ON SHORT CHANNEL EFFECTS THERMAL NOISE MODEL. (NOT BOTH NQS_NOI AND TH_NOI SHOULD BE SET TO 1).") - `MPIsw( INFO_LEVEL , 0 , "" , "FLAG FOR INFORMATION PRINTOUT. CURRENTLY ONLY VALUE OF 1 IS SUPPORTED.") - `MPIcc( QOFF , 0 , "" , 0, 1, "FLAG FOR TURNING OFF THE DYNAMIC BEHAVIOUR OF THE MODEL (FOR DEBUGGING PURPOSES)") +`MPIty( SIGN , 1 , "" , "SIGN = 1 FOR NMOS; SIGN = -1 FOR PMOS") +`MPIty( TG ,-1 , "" , "TYPE OF GATE: -1 ENHANCEMENT TYPE; 1 DEPLETION TYPE") +`MPRco( TNOM , 27.0 , "C" , -`P_CELSIUS0 , inf , "NOMINAL TEMPERATURE FOR MODEL PARAMETERS") +`MPRco( SCALE , 1.0 , "" , 1.0 , inf , "SCALING SIZE FACTOR") +`MPRnb( XL , 0.0 , "m" , "OPTICAL OFFSET FOR CHANNEL LENGTH") +`MPRnb( XW , 0.0 , "m" , "OPTICAL OFFSET FOR CHANNEL WIDTH") +`MPIsw( NQS_NOI , 1 , "" , "FLAG TURNING ON NQS THERMAL NOISE MODEL. (NOT BOTH NQS_NOI AND TH_NOI SHOULD BE SET TO 1).") +`MPIsw( TH_NOI , 0 , "" , "FLAG TURNING ON SHORT CHANNEL EFFECTS THERMAL NOISE MODEL. (NOT BOTH NQS_NOI AND TH_NOI SHOULD BE SET TO 1).") +`MPIsw( INFO_LEVEL , 0 , "" , "FLAG FOR INFORMATION PRINTOUT. CURRENTLY ONLY VALUE OF 1 IS SUPPORTED.") +`MPIcc( QOFF , 0 , "" , 0, 1, "FLAG FOR TURNING OFF THE DYNAMIC BEHAVIOUR OF THE MODEL (FOR DEBUGGING PURPOSES)") // MATCHING - `MPRnb( AVTO , 0.0 , "" , "MATCHING PARAMETER FOR THRESHOLD VOLTAGE (VTO)") - `MPRnb( AGAMMA , 0.0 , "" , "MATCHING PARAMETER FOR BODY FACTOR (GAMMA)") - `MPRnb( AKP , 0.0 , "" , "MATCHING PARAMETER FOR MOBILITY (KP)") +`MPRnb( AVTO , 0.0 , "" , "MATCHING PARAMETER FOR THRESHOLD VOLTAGE (VTO)") +`MPRnb( AGAMMA , 0.0 , "" , "MATCHING PARAMETER FOR BODY FACTOR (GAMMA)") +`MPRnb( AKP , 0.0 , "" , "MATCHING PARAMETER FOR MOBILITY (KP)") ////////////////////// // MODEL PARAMETERS // @@ -42,216 +42,216 @@ // OXIDE, SUBSTRATE AND GATE DOPING RELATED PARAMETERS (7(8)) - `MPRoz( COX , 12E-3 , "F/m**2" , "OXIDE CAPACITANCE PER UNIT AREA") - `MPRoz( XJ , 20E-9 , "m" , "DEPTH OF JUNCTION (SOURCE AND DRAIN)") - `MPRnb( VTO , 0.3 , "V" , "THRESHOLD VOLTAGE") - `MPRco( PHIF , 0.45 , "V" , 0.1 , inf , "FERMI BULK POTENTIAL") - `MPRoz( GAMMA , 0.3 , "sqrt(V)" , "BODY EFFECT COEFFICIENT") - `MPRoz( GAMMAG , 4.1 , "sqrt(V)" , "GATE DOPING COEFFICIENT FOR POLYSILICON DEPLETION EFFECT") - `MPRnb( N0 , 1.0 , "" , "WEAK INVERSION FINE TUNING PARAMETER") - `MPRco( VBI , 0.0 , "V" , 0.0 , inf , "BUILT-IN VOLTAGE DROP-OFF. IF LEFT TO DEFAULT ZERO VALUE, IT IS SET TO THE NOMINAL VALUE OF 3UT HIGHER THAN PHI.") +`MPRoz( COX , 12E-3 , "F/m**2" , "OXIDE CAPACITANCE PER UNIT AREA") +`MPRoz( XJ , 20E-9 , "m" , "DEPTH OF JUNCTION (SOURCE AND DRAIN)") +`MPRnb( VTO , 0.3 , "V" , "THRESHOLD VOLTAGE") +`MPRco( PHIF , 0.45 , "V" , 0.1 , inf , "FERMI BULK POTENTIAL") +`MPRoz( GAMMA , 0.3 , "sqrt(V)" , "BODY EFFECT COEFFICIENT") +`MPRoz( GAMMAG , 4.1 , "sqrt(V)" , "GATE DOPING COEFFICIENT FOR POLYSILICON DEPLETION EFFECT") +`MPRnb( N0 , 1.0 , "" , "WEAK INVERSION FINE TUNING PARAMETER") +`MPRco( VBI , 0.0 , "V" , 0.0 , inf , "BUILT-IN VOLTAGE DROP-OFF. IF LEFT TO DEFAULT ZERO VALUE, IT IS SET TO THE NOMINAL VALUE OF 3UT HIGHER THAN PHI.") // QUANTUM EFFECTS (3) - `MPRnb( AQMA , 0.5 , "" , "QUANTUM MECHANICAL EFFECT ACCUMULATION REGION COEFFICIENT") - `MPRnb( AQMI , 0.4 , "" , "QUANTUM MECHANICAL EFFECT INVERSION REGION COEFFICIENT") - `MPRoz( ETAQM , 0.75 , "" , "QUANTUM MECHANICAL EFFECT ACCUMULATION ETA PARAMETER") +`MPRnb( AQMA , 0.5 , "" , "QUANTUM MECHANICAL EFFECT ACCUMULATION REGION COEFFICIENT") +`MPRnb( AQMI , 0.4 , "" , "QUANTUM MECHANICAL EFFECT INVERSION REGION COEFFICIENT") +`MPRoz( ETAQM , 0.75 , "" , "QUANTUM MECHANICAL EFFECT ACCUMULATION ETA PARAMETER") // VERTICAL FIELD MOBILITY EFFECTS PARAMETERS (4) - `MPRoz( KP , 500E-6 , "F/Vs" , "MOBILITY (MULTIPLIED BY COX) PARAMETER") - `MPRoz( E0 , 10E9 , "V/m" , "FIRST ORDER PARAMETER FOR MOBILITY REDUCTION DUE TO VERTICAL FIELD EFFECT") - `MPRoz( E1 , 310e6 , "V**2/m**2" , "SECOND ORDER PARAMETER FOR MOBILITY REDUCTION DUE TO VERTICAL FIELD EFFECT") - `MPRcz( ETA , 0.5 , "" , "INVERSION CHARGE COEFFICIENT FOR VERTICAL FIELD CALCULATION") +`MPRoz( KP , 500E-6 , "F/Vs" , "MOBILITY (MULTIPLIED BY COX) PARAMETER") +`MPRoz( E0 , 10E9 , "V/m" , "FIRST ORDER PARAMETER FOR MOBILITY REDUCTION DUE TO VERTICAL FIELD EFFECT") +`MPRoz( E1 , 310e6 , "V**2/m**2" , "SECOND ORDER PARAMETER FOR MOBILITY REDUCTION DUE TO VERTICAL FIELD EFFECT") +`MPRcz( ETA , 0.5 , "" , "INVERSION CHARGE COEFFICIENT FOR VERTICAL FIELD CALCULATION") // COULOMB SCATTERING (2) - `MPRcz( THC , 0.0 , "" , "COULOMB SCATTERING PARAMETER") - `MPRcz( ZC , 1e-6 , "" , "COULOMB SCATTERING INVERSION CHARGE COEFFICIENT") +`MPRcz( THC , 0.0 , "" , "COULOMB SCATTERING PARAMETER") +`MPRcz( ZC , 1e-6 , "" , "COULOMB SCATTERING INVERSION CHARGE COEFFICIENT") // MOBILITY RELATED GEOMETRICAL PARAMETERS (7) - `MPRoz( LA , 1.0, "m" , "CRITICAL LENGTH A OF MOBILITY LENGTH SCALING") - `MPRoz( LB , 1.0, "m" , "CRITICAL LENGTH B OF MOBILITY LENGTH SCALING") - `MPRnb( KA , 0.0, "" , "PARAMETER FOR CRITICAL LENGTH A OF MOBILITY LENGTH SCALING") - `MPRnb( KB , 0.0, "" , "PARAMETER FOR CRITICAL LENGTH B OF MOBILITY LENGTH SCALING") +`MPRoz( LA , 1.0, "m" , "CRITICAL LENGTH A OF MOBILITY LENGTH SCALING") +`MPRoz( LB , 1.0, "m" , "CRITICAL LENGTH B OF MOBILITY LENGTH SCALING") +`MPRnb( KA , 0.0, "" , "PARAMETER FOR CRITICAL LENGTH A OF MOBILITY LENGTH SCALING") +`MPRnb( KB , 0.0, "" , "PARAMETER FOR CRITICAL LENGTH B OF MOBILITY LENGTH SCALING") // LIMIT WKP1 CHANGES TO (-INF FROM [0 - `MPRoz( WKP1 , 1e-6, "m" , "CRITICAL WIDTH OF MOBILITY WIDTH SCALING" ) +`MPRoz( WKP1 , 1e-6, "m" , "CRITICAL WIDTH OF MOBILITY WIDTH SCALING" ) // LIMIT WKP2 CHANGES TO (-INF FROM [0 - `MPRnb( WKP2 , 0.0, "" , "AMPLITUDE PARAMETER FOR MOBILITY WIDTH SCALING" ) +`MPRnb( WKP2 , 0.0, "" , "AMPLITUDE PARAMETER FOR MOBILITY WIDTH SCALING" ) // LIMIT WKP3 CHANGES TO (-INF FROM [0 - `MPRoz( WKP3 , 1.0, "" , "SPAN PARAMETER FOR MOBILITY WIDTH SCALING" ) +`MPRoz( WKP3 , 1.0, "" , "SPAN PARAMETER FOR MOBILITY WIDTH SCALING" ) // GEOMETRICAL PARAMETERS (8) - `MPRoo( DL , -10e-9 , "m" , -inf , inf , "EFFECTIVE LENGTH PARAMETER") - `MPRoo( DLC , 0.0 , "m" , -inf , inf , "EFFECTIVE LENGTH PARAMETER FOR DYNAMIC BEHAVIOUR") - `MPRoo( DW , -10e-9 , "m" , -inf , inf , "EFFECTIVE WIDTH PARAMETER") - `MPRoo( DWC , 0.0 , "m" , -inf , inf , "EFFECTIVE WIDTH PARAMETER FOR DYNAMIC BEHAVIOUR") - `MPRco( WDL , 0.0 , "m**2" , 0.0 , inf , "EFFECTIVE LENGTH PARAMETER FOR NARROW CHANNEL DEVICES") - `MPRco( LDW , 0.0 , "m**2" , 0.0 , inf , "EFFECTIVE WIDTH PARAMETER FOR SHORT CHANNEL DEVICES") - `MPRoo( LL , 0.0 , "m" , -inf , inf , "BASE OF EXPONENTIAL MODEL FOR EFFECTIVE LENGTH") - `MPRco( LLN , 1.0 , "" , 0.0 , inf , "EXPONENT OF EXPONENTIAL MODEL FOR EFFECTIVE LENGTH") +`MPRnb( DL , -10e-9 , "m" , "EFFECTIVE LENGTH PARAMETER") +`MPRnb( DLC , 0.0 , "m" , "EFFECTIVE LENGTH PARAMETER FOR DYNAMIC BEHAVIOUR") +`MPRnb( DW , -10e-9 , "m" , "EFFECTIVE WIDTH PARAMETER") +`MPRnb( DWC , 0.0 , "m" , "EFFECTIVE WIDTH PARAMETER FOR DYNAMIC BEHAVIOUR") +`MPRco( WDL , 0.0 , "m**2" , 0.0 , inf , "EFFECTIVE LENGTH PARAMETER FOR NARROW CHANNEL DEVICES") +`MPRco( LDW , 0.0 , "m**2" , 0.0 , inf , "EFFECTIVE WIDTH PARAMETER FOR SHORT CHANNEL DEVICES") +`MPRnb( LL , 0.0 , "m" , "BASE OF EXPONENTIAL MODEL FOR EFFECTIVE LENGTH") +`MPRco( LLN , 1.0 , "" , 0.0 , inf , "EXPONENT OF EXPONENTIAL MODEL FOR EFFECTIVE LENGTH") // LONG AND WIDE CHANNEL VTO AND GAMMA CORRECTION (8) - `MPRnb( AVT , 0.0, "" , "PARAMETER FOR LONG AND WIDE CHANNEL VTO CORRECTION") - `MPRoz( LVT , 1.0, "m" , "LENGTH FOR LONG AND WIDE CHANNEL VTO CORRECTION") - `MPRoz( WVT , 1.0, "m" , "WIDTH FOR LONG AND WIDE CHANNEL VTO CORRECTION") - `MPRnb( AGAM , 0.0, "" , "PARAMETER FOR LONG AND WIDE CHANNEL GAMMA CORRECTION") - `MPRoz( LGAM , 1.0, "m" , "LENGTH FOR LONG AND WIDE CHANNEL GAMMA CORRECTION") - `MPRoz( WGAM , 1.0, "m" , "WIDTH FOR LONG AND WIDE CHANNEL GAMMA CORRECTION") - `MPInb( NFVTA , 0, "" , "NUMBER OF FINGERS FOR VTO CORRECTION FOR MULTIFINGER DEVICES (OBSOLETE MODEL BY STI STRESS EFFECT)") - `MPRnb( NFVTB , 10e3, "" , "PARAMETER FOR VTO CORRECTION FOR MULTIFINGER DEVICES (OBSOLETE MODEL BY STI STRESS EFFECT)") +`MPRnb( AVT , 0.0 , "" , "PARAMETER FOR LONG AND WIDE CHANNEL VTO CORRECTION") +`MPRoz( LVT , 1.0 , "m" , "LENGTH FOR LONG AND WIDE CHANNEL VTO CORRECTION") +`MPRoz( WVT , 1.0 , "m" , "WIDTH FOR LONG AND WIDE CHANNEL VTO CORRECTION") +`MPRnb( AGAM , 0.0 , "" , "PARAMETER FOR LONG AND WIDE CHANNEL GAMMA CORRECTION") +`MPRoz( LGAM , 1.0 , "m" , "LENGTH FOR LONG AND WIDE CHANNEL GAMMA CORRECTION") +`MPRoz( WGAM , 1.0 , "m" , "WIDTH FOR LONG AND WIDE CHANNEL GAMMA CORRECTION") +`MPInb( NFVTA , 0 , "" , "NUMBER OF FINGERS FOR VTO CORRECTION FOR MULTIFINGER DEVICES (OBSOLETE MODEL BY STI STRESS EFFECT)") +`MPRnb( NFVTB , 10e3, "" , "PARAMETER FOR VTO CORRECTION FOR MULTIFINGER DEVICES (OBSOLETE MODEL BY STI STRESS EFFECT)") // VELOCITY SATURATION & CLM RELATED PARAMETERS (4) - `MPRoz( UCRIT , 5.0E6 , "V/m" , "CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT") - `MPRcc( DELTA , 2.0 , "" , 1.0 , 2.0 , "VARIABLE ORDER (FROM 1.0 TO 2.0) OF VELOCITY SATURATION EFFECT") - `MPRcz( LAMBDA , 0.5 , "" , "LENGTH PARAMETER FOR CHANNEL LENGTH MODULATION") - `MPRnb( ACLM , 0.83 , "" , "FINE TUNING PARAMETER FOR CHANNEL LENGTH MODULATION") +`MPRoz( UCRIT , 5.0E6 , "V/m" , "CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT") +`MPRcc( DELTA , 2.0 , "" , 1.0 , 2.0 , "VARIABLE ORDER (FROM 1.0 TO 2.0) OF VELOCITY SATURATION EFFECT") +`MPRcz( LAMBDA , 0.5 , "" , "LENGTH PARAMETER FOR CHANNEL LENGTH MODULATION") +`MPRnb( ACLM , 0.83 , "" , "FINE TUNING PARAMETER FOR CHANNEL LENGTH MODULATION") // REVERSE SHORT CHANNEL EFFECT (4) - `MPRoz( LR , 50e-9 , "m" , "LENGTH PARAMETER FOR REVERSE SHORT CHANNEL EFFECT") - `MPRnb( QLR , 0.5e-3 , "V*m**2/F" , "CHARGE PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (VTO)") - `MPRnb( NLR , 10e-3 , "m**2/F" , "DOPING PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (GAMMA)") - `MPRcz( FLR , 1.0 , "" , "FERMI POTENTIAL FINE TUNING PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (PHIF)") +`MPRoz( LR , 50e-9 , "m" , "LENGTH PARAMETER FOR REVERSE SHORT CHANNEL EFFECT") +`MPRnb( QLR , 0.5e-3 , "V*m**2/F" , "CHARGE PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (VTO)") +`MPRnb( NLR , 10e-3 , "m**2/F" , "DOPING PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (GAMMA)") +`MPRcz( FLR , 1.0 , "" , "FERMI POTENTIAL FINE TUNING PARAMETER FOR REVERSE SHORT CHANNEL EFFECT (PHIF)") // CHARGE SHARING EFFECT (5) - `MPRnb( LETA0 , 0.0 , "1/m" , "LENGTH INDEPENDENT PARAMETER FOR CHARGE SHARING (LONG CHANNEL)") - `MPRcz( LETA , 0.5 , "" , "LENGTH SCALING PARAMETER FOR CHARGE SHARING") - `MPRnb( LETA2 , 0.0 , "m" , "SECOND ORDER LENGTH SCALING PARAMETER FOR CHARGE SHARING (SHORTEST CHANNEL)") - `MPRnb( WETA , 0.2 , "" , "WIDTH SCALING PARAMETER FOR CHARGE SHARING") - `MPRcz( NCS , 1.0 , "" , "WEAK INVERSION SLOPE PARAMETER FOR CHARGE SHARING") +`MPRnb( LETA0 , 0.0 , "1/m" , "LENGTH INDEPENDENT PARAMETER FOR CHARGE SHARING (LONG CHANNEL)") +`MPRcz( LETA , 0.5 , "" , "LENGTH SCALING PARAMETER FOR CHARGE SHARING") +`MPRnb( LETA2 , 0.0 , "m" , "SECOND ORDER LENGTH SCALING PARAMETER FOR CHARGE SHARING (SHORTEST CHANNEL)") +`MPRnb( WETA , 0.2 , "" , "WIDTH SCALING PARAMETER FOR CHARGE SHARING") +`MPRcz( NCS , 1.0 , "" , "WEAK INVERSION SLOPE PARAMETER FOR CHARGE SHARING") // DRAIN INDUCED BARRIER LOWERING (2) - `MPRcz( ETAD , 1.0 , "" , "ETA PARAMETER FOR DRAIN INDUCED BARRIER LOWERING") - `MPRcz( SIGMAD , 1.0 , "" , "SIGMA PARAMETER FOR DRAIN INDUCED BARRIER LOWERING") +`MPRcz( ETAD , 1.0 , "" , "ETA PARAMETER FOR DRAIN INDUCED BARRIER LOWERING") +`MPRcz( SIGMAD , 1.0 , "" , "SIGMA PARAMETER FOR DRAIN INDUCED BARRIER LOWERING") // INVERSE NARROW CHANNEL EFFECT (3) - `MPRoz( WR , 90e-9 , "m" , "WIDTH PARAMETER FOR INVERSE NARROW CHANNEL EFFECT") - `MPRnb( QWR , 0.3e-3 , "V*m**2/F" , "CHARGE PARAMETER FOR INVERSE NARROW CHANNEL EFFECT (VTO)") - `MPRnb( NWR , 5e-3 , "m**2/F" , "DOPING PARAMETER FOR INVERSE NARROW CHANNEL EFFECT (GAMMA)") +`MPRoz( WR , 90e-9 , "m" , "WIDTH PARAMETER FOR INVERSE NARROW CHANNEL EFFECT") +`MPRnb( QWR , 0.3e-3 , "V*m**2/F" , "CHARGE PARAMETER FOR INVERSE NARROW CHANNEL EFFECT (VTO)") +`MPRnb( NWR , 5e-3 , "m**2/F" , "DOPING PARAMETER FOR INVERSE NARROW CHANNEL EFFECT (GAMMA)") // DITS (5) - `MPRcz( FPROUT , 1e6 , "1/sqrt(m)", "OUTPUT RESISTANCE PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT") - `MPRcz( PDITS , 0.0, "" , "PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT (IF SET TO ZERO THE DITS EFFECT IS DISABLED)") - `MPRcz( PDITSL , 0.0 , "1/m" , "LENGTH SCALING PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT") - `MPRcz( PDITSD , 1.0 , "1/V" , "BIAS PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT") - `MPRcz( DDITS , 0.3 , "" , "SMOOTH FACTOR OF OUTPUT CONDUCTANCE FOR DRAIN INDUCED THRESHOLD SHIFT") +`MPRcz( FPROUT , 1e6 , "1/sqrt(m)", "OUTPUT RESISTANCE PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT") +`MPRcz( PDITS , 0.0 , "" , "PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT (IF SET TO ZERO THE DITS EFFECT IS DISABLED)") +`MPRcz( PDITSL , 0.0 , "1/m" , "LENGTH SCALING PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT") +`MPRcz( PDITSD , 1.0 , "1/V" , "BIAS PARAMETER FOR DRAIN INDUCED THRESHOLD SHIFT") +`MPRcz( DDITS , 0.3 , "" , "SMOOTH FACTOR OF OUTPUT CONDUCTANCE FOR DRAIN INDUCED THRESHOLD SHIFT") // IMPACT IONIZATION CURRENT (3) - `MPRnb( IBA , 0.0 , "1/m" , "PARAMETER A OF IMPACT IONIZATION CURRENT") - `MPRoz( IBB , 300e6 , "V/m" , "PARAMETER B OF IMPACT IONIZATION CURRENT") - `MPRnb( IBN , 1.0 , "" , "PARAMETER N OF IMPACT IONIZATION CURRENT") +`MPRnb( IBA , 0.0 , "1/m" , "PARAMETER A OF IMPACT IONIZATION CURRENT") +`MPRoz( IBB , 300e6 , "V/m" , "PARAMETER B OF IMPACT IONIZATION CURRENT") +`MPRnb( IBN , 1.0 , "" , "PARAMETER N OF IMPACT IONIZATION CURRENT") // GATE CURRENT (4) - `MPRoz( XB , 3.1 , "V" , "SILICON TO SILICON OXIDE TUNNELING BARRIER HEIGHT") - `MPRoz( EB , 29e9 , "V/m" , "CHARACTERISTIC ELECTRICAL FIELD") - `MPRcz( KG , 0.0 , "A/V**2" , "MOBILITY FOR GATE CURRENT") - `MPRoz( LOVIG , 20e-9 , "m" , "OVERLAP GATE LENGTH FOR OVERLAP GATE CURRENT") +`MPRoz( XB , 3.1 , "V" , "SILICON TO SILICON OXIDE TUNNELING BARRIER HEIGHT") +`MPRoz( EB , 29e9 , "V/m" , "CHARACTERISTIC ELECTRICAL FIELD") +`MPRcz( KG , 0.0 , "A/V**2" , "MOBILITY FOR GATE CURRENT") +`MPRoz( LOVIG , 20e-9 , "m" , "OVERLAP GATE LENGTH FOR OVERLAP GATE CURRENT") // GIDL - GISL (4) - `MPRnb( AGIDL , 0.0 , "A/V" , "PARAMETER A OF GATE INDUCED DRAIN LEAKAGE") - `MPRnb( BGIDL , 2.3e9 , "V/m" , "PARAMETER B OF GATE INDUCED DRAIN LEAKAGE") - `MPRnb( CGIDL , 0.5 , "V**3" , "PARAMETER C OF GATE INDUCED DRAIN LEAKAGE") - `MPRnb( EGIDL , 0.8 , "V" , "PARAMETER E OF GATE INDUCED DRAIN LEAKAGE") +`MPRnb( AGIDL , 0.0 , "A/V" , "PARAMETER A OF GATE INDUCED DRAIN LEAKAGE") +`MPRnb( BGIDL , 2.3e9 , "V/m" , "PARAMETER B OF GATE INDUCED DRAIN LEAKAGE") +`MPRnb( CGIDL , 0.5 , "V**3" , "PARAMETER C OF GATE INDUCED DRAIN LEAKAGE") +`MPRnb( EGIDL , 0.8 , "V" , "PARAMETER E OF GATE INDUCED DRAIN LEAKAGE") // FLICKER NOISE PARAMETERS (4) - `MPIcz( LFNOI , 0 , "" , "FLICKER NOISE MODEL SELECTION") - `MPRcz( KF , 0.0 , "" , "FLICKER NOISE PARAMETER") - `MPRnb( AF , 1.0 , "" , "FLICKER NOISE FREQUENCY EXPONENT") - `MPRcz( EF , 2.0 , "" , "FLICKER NOISE TRANSCONDUCTANCE EXPONENT") - `MPRnb( NT , 1.0E+14 , "" , "NUMBER OF TRAPPED CARRIERS") - `MPRnb( ALPHAC , 10E+4 , "" , "COULOMB SCATTERING COEFFICIENT") - `MPRnb( ALPHAH , 1.0E-20 , "" , "HOOGE PARAMETER FOR MOBILITY FLUCTUATION NOISE MODEL") - `MPRnb( KGFN , 0.0 , "" , "GATE FLICKER NOISE PARAMETER") - `MPRoz( ECN , 1.0E+4 , "" , "CRITICAL FIELD VALUE") - `MPRnb( SDR , 1.0E-6 , "" , "SERIES RESISTANCE NOISE PARAMETER") +`MPIcz( LFNOI , 0 , "" , "FLICKER NOISE MODEL SELECTION") +`MPRcz( KF , 0.0 , "" , "FLICKER NOISE PARAMETER") +`MPRnb( AF , 1.0 , "" , "FLICKER NOISE FREQUENCY EXPONENT") +`MPRcz( EF , 2.0 , "" , "FLICKER NOISE TRANSCONDUCTANCE EXPONENT") +`MPRnb( NT , 1.0E+14 , "" , "NUMBER OF TRAPPED CARRIERS") +`MPRnb( ALPHAC , 10E+4 , "" , "COULOMB SCATTERING COEFFICIENT") +`MPRnb( ALPHAH , 1.0E-20 , "" , "HOOGE PARAMETER FOR MOBILITY FLUCTUATION NOISE MODEL") +`MPRnb( KGFN , 0.0 , "" , "GATE FLICKER NOISE PARAMETER") +`MPRoz( ECN , 1.0E+4 , "" , "CRITICAL FIELD VALUE") +`MPRnb( SDR , 1.0E-6 , "" , "SERIES RESISTANCE NOISE PARAMETER") // LENGTH SCALING PARAMETERS (3) - `MPRnb( LWR , 0.0, "m**2", "LENGTH SCALING PARAMETER FOR WR") - `MPRnb( LQWR , 0.0, "m" , "LENGTH SCALING PARAMETER FOR QWR") - `MPRnb( LNWR , 0.0, "m" , "LENGTH SCALING PARAMETER FOR NWR") - `MPRnb( LDPHIEDGE, 0.0, "m" , "LENGTH SCALING PARAMETER FOR DPHIEDGE") +`MPRnb( LWR , 0.0, "m**2", "LENGTH SCALING PARAMETER FOR WR") +`MPRnb( LQWR , 0.0, "m" , "LENGTH SCALING PARAMETER FOR QWR") +`MPRnb( LNWR , 0.0, "m" , "LENGTH SCALING PARAMETER FOR NWR") +`MPRnb( LDPHIEDGE, 0.0, "m" , "LENGTH SCALING PARAMETER FOR DPHIEDGE") // WIDTH SCALING PARAMETERS (11) - `MPRnb( WLR , 0.0, "m**2", "WIDTH SCALING PARAMETER FOR LR") - `MPRnb( WQLR , 0.0, "m" , "WIDTH SCALING PARAMETER FOR QLR") - `MPRnb( WNLR , 0.0, "m" , "WIDTH SCALING PARAMETER FOR NLR") - `MPRnb( WUCRIT , 0.0, "m" , "WIDTH SCALING PARAMETER FOR UCRIT") - `MPRnb( WLAMBDA , 0.0, "m" , "WIDTH SCALING PARAMETER FOR LAMBDA") - `MPRnb( WETAD , 0.0, "m" , "WIDTH SCALING PARAMETER FOR ETAD") - `MPRnb( WE0 , 0.0, "m" , "WIDTH SCALING PARAMETER FOR E0") - `MPRnb( WE1 , 0.0, "m" , "WIDTH SCALING PARAMETER FOR E1") - `MPRnb( WRLX , 0.0, "m" , "WIDTH SCALING PARAMETER FOR RLX") - `MPRnb( WUCEX , 0.0, "m" , "WIDTH SCALING PARAMETER FOR UCEX") - `MPRnb( WDPHIEDGE, 0.0, "m" , "WIDTH SCALING PARAMETER FOR DPHIEDGE") +`MPRnb( WLR , 0.0, "m**2", "WIDTH SCALING PARAMETER FOR LR") +`MPRnb( WQLR , 0.0, "m" , "WIDTH SCALING PARAMETER FOR QLR") +`MPRnb( WNLR , 0.0, "m" , "WIDTH SCALING PARAMETER FOR NLR") +`MPRnb( WUCRIT , 0.0, "m" , "WIDTH SCALING PARAMETER FOR UCRIT") +`MPRnb( WLAMBDA , 0.0, "m" , "WIDTH SCALING PARAMETER FOR LAMBDA") +`MPRnb( WETAD , 0.0, "m" , "WIDTH SCALING PARAMETER FOR ETAD") +`MPRnb( WE0 , 0.0, "m" , "WIDTH SCALING PARAMETER FOR E0") +`MPRnb( WE1 , 0.0, "m" , "WIDTH SCALING PARAMETER FOR E1") +`MPRnb( WRLX , 0.0, "m" , "WIDTH SCALING PARAMETER FOR RLX") +`MPRnb( WUCEX , 0.0, "m" , "WIDTH SCALING PARAMETER FOR UCEX") +`MPRnb( WDPHIEDGE, 0.0, "m" , "WIDTH SCALING PARAMETER FOR DPHIEDGE") // COMBINED SCALING PARAMETERS (2) - `MPRnb( WLDPHIEDGE, 0.0, "m**2" , "FINE TUNING SCALING FOR COMBINED SHORT AND NARROW DEVICES FOR DPHIEDGE") - `MPRnb( WLDGAMMAEDGE, 0.0, "m**2" , "FINE TUNING SCALING FOR COMBINED SHORT AND NARROW DEVICES FOR DGAMMAEDGE") +`MPRnb( WLDPHIEDGE, 0.0, "m**2" , "FINE TUNING SCALING FOR COMBINED SHORT AND NARROW DEVICES FOR DPHIEDGE") +`MPRnb( WLDGAMMAEDGE, 0.0, "m**2" , "FINE TUNING SCALING FOR COMBINED SHORT AND NARROW DEVICES FOR DGAMMAEDGE") // EDGE DEVICE (3) - `MPRcz( WEDGE , 0.0 , "m" , "TOTAL EFFECTIVE WIDTH OF EDGE DEVICE FOR EDGE CONDUCTANCE EFFECT") - `MPRnb( DGAMMAEDGE , 0.0 , "sqrt(V)" , "DIFFERENTIAL GAMMA PARAMETER OF EDGE DEVICE WITH RESPECT TO THE MAIN DEVICE") - `MPRnb( DPHIEDGE , 0.0 , "V" , "DIFFERENTIAL PHI PARAMETER OF EDGE DEVICE WITH RESPECT TO THE MAIN DEVICE") +`MPRcz( WEDGE , 0.0 , "m" , "TOTAL EFFECTIVE WIDTH OF EDGE DEVICE FOR EDGE CONDUCTANCE EFFECT") +`MPRnb( DGAMMAEDGE , 0.0 , "sqrt(V)" , "DIFFERENTIAL GAMMA PARAMETER OF EDGE DEVICE WITH RESPECT TO THE MAIN DEVICE") +`MPRnb( DPHIEDGE , 0.0 , "V" , "DIFFERENTIAL PHI PARAMETER OF EDGE DEVICE WITH RESPECT TO THE MAIN DEVICE") // STI STRESS EFFECT (13) - `MPRcz( SAREF , 0.0, "m", "REFERENCE SA PARAMETER FOR STI STRESS EFFECT PARAMETER EXTRACION") - `MPRcz( SBREF , 0.0, "m", "REFERENCE SB PARAMETER FOR STI STRESS EFFECT PARAMETER EXTRACION") - `MPRcz( WLOD , 0.0, "m", "WIDTH EFFECTIVE PARAMETER FOR STI STRESS EFFECT") - `MPRnb( KKP , 0.0, "" , "MOBILITY PARAMETER FOR STI STRESS EFFECT") - `MPRnb( LKKP , 0.0, "" , "LENGTH SCALING OF MOBILITY FOR STI STRESS EFFECT") - `MPRnb( WKKP , 0.0, "" , "WIDTH SCALING OF MOBILITY FOR STI STRESS EFFECT") - `MPRnb( PKKP , 0.0, "" , "AREA SCALING OF MOBILITY FOR STI STRESS EFFECT") - `MPRnb( TKKP , 0.0, "" , "TEMPERATURE SCALING OF MOBILITY FOR STI STRESS EFFECT") - `MPRnb( LLODKKP , 1.0, "" , "EXPONENTIAL LENGTH SCALING PARAMETER OF MOBILITY FOR STI STRESS EFFECT") - `MPRnb( WLODKKP , 1.0, "" , "EXPONENTIAL WIDTH SCALING PARAMETER OF MOBILITY FOR STI STRESS EFFECT") - `MPRnb( KVTO , 0.0, "" , "THRESHOLD VOLTAGE PARAMETER FOR STI STRESS EFFECT") - `MPRnb( LKVTO , 0.0, "" , "LENGTH SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT") - `MPRnb( WKVTO , 0.0, "" , "WIDTH SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT") - `MPRnb( PKVTO , 0.0, "" , "AREA SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT") - `MPRnb( LLODKVTO , 1.0, "" , "EXPONENTIAL LENGTH SCALING PARAMETER OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT") - `MPRnb( WLODKVTO , 1.0, "" , "EXPONENTIAL WIDTH SCALING PARAMETER OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT") - `MPRnb( KGAMMA , 0.0, "" , "BODY EFFECT COEFFICIENT PARAMETER FOR STI STRESS EFFECT") - `MPRnb( LODKGAMMA , 1.0, "" , "FINE TUNING PARAMETER FOR BODY EFFECT COEFFICIENT SCALING OF STI STRESS EFFECT") - `MPRnb( KETAD , 0.0, "" , "DIBL EFFECT PARAMETER FOR STI STRESS EFFECT") - `MPRnb( LODKETAD , 1.0, "" , "FINE TUNING PARAMETER FOR DIBL EFFECT PARAMETER SCALING OF STI STRESS EFFECT") - `MPRnb( KUCRIT , 0.0, "" , "CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT PARAMETER FOR STI STRESS EFFECT") +`MPRcz( SAREF , 0.0, "m", "REFERENCE SA PARAMETER FOR STI STRESS EFFECT PARAMETER EXTRACION") +`MPRcz( SBREF , 0.0, "m", "REFERENCE SB PARAMETER FOR STI STRESS EFFECT PARAMETER EXTRACION") +`MPRcz( WLOD , 0.0, "m", "WIDTH EFFECTIVE PARAMETER FOR STI STRESS EFFECT") +`MPRnb( KKP , 0.0, "" , "MOBILITY PARAMETER FOR STI STRESS EFFECT") +`MPRnb( LKKP , 0.0, "" , "LENGTH SCALING OF MOBILITY FOR STI STRESS EFFECT") +`MPRnb( WKKP , 0.0, "" , "WIDTH SCALING OF MOBILITY FOR STI STRESS EFFECT") +`MPRnb( PKKP , 0.0, "" , "AREA SCALING OF MOBILITY FOR STI STRESS EFFECT") +`MPRnb( TKKP , 0.0, "" , "TEMPERATURE SCALING OF MOBILITY FOR STI STRESS EFFECT") +`MPRnb( LLODKKP , 1.0, "" , "EXPONENTIAL LENGTH SCALING PARAMETER OF MOBILITY FOR STI STRESS EFFECT") +`MPRnb( WLODKKP , 1.0, "" , "EXPONENTIAL WIDTH SCALING PARAMETER OF MOBILITY FOR STI STRESS EFFECT") +`MPRnb( KVTO , 0.0, "" , "THRESHOLD VOLTAGE PARAMETER FOR STI STRESS EFFECT") +`MPRnb( LKVTO , 0.0, "" , "LENGTH SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT") +`MPRnb( WKVTO , 0.0, "" , "WIDTH SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT") +`MPRnb( PKVTO , 0.0, "" , "AREA SCALING OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT") +`MPRnb( LLODKVTO , 1.0, "" , "EXPONENTIAL LENGTH SCALING PARAMETER OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT") +`MPRnb( WLODKVTO , 1.0, "" , "EXPONENTIAL WIDTH SCALING PARAMETER OF THRESHOLD VOLTAGE FOR STI STRESS EFFECT") +`MPRnb( KGAMMA , 0.0, "" , "BODY EFFECT COEFFICIENT PARAMETER FOR STI STRESS EFFECT") +`MPRnb( LODKGAMMA , 1.0, "" , "FINE TUNING PARAMETER FOR BODY EFFECT COEFFICIENT SCALING OF STI STRESS EFFECT") +`MPRnb( KETAD , 0.0, "" , "DIBL EFFECT PARAMETER FOR STI STRESS EFFECT") +`MPRnb( LODKETAD , 1.0, "" , "FINE TUNING PARAMETER FOR DIBL EFFECT PARAMETER SCALING OF STI STRESS EFFECT") +`MPRnb( KUCRIT , 0.0, "" , "CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT PARAMETER FOR STI STRESS EFFECT") //////////////////////////////// // TEMPERATURE PARAMETERS (8) // //////////////////////////////// - `MPRnb( TCV , 600e-6 , "V/K" , "TEMPERATURE SCALING OF THRESHOLD VOLTAGE") - `MPRnb( BEX , -1.5 , "" , "TEMPERATURE SCALING OF MOBILITY") - `MPRnb( TE0EX , 0.5 , "" , "TEMPERATURE SCALING OF E0") - `MPRnb( TE1EX , 0.5 , "" , "TEMPERATURE SCALING OF E1") - `MPRnb( TETA , -0.9e-3 , "1/K" , "TEMPERATURE SCALING OF ETA PARAMETER") - `MPRnb( UCEX , 1.5 , "" , "TEMPERATURE SCALING OF CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT") - `MPRnb( TLAMBDA , 0.0 , "" , "TEMPERATURE SCALING OF LAMBDA PARAMETER") - `MPRnb( IBBT , 800e-6 , "" , "TEMPERATURE SCALING OF IBB") +`MPRnb( TCV , 600e-6 , "V/K" , "TEMPERATURE SCALING OF THRESHOLD VOLTAGE") +`MPRnb( BEX , -1.5 , "" , "TEMPERATURE SCALING OF MOBILITY") +`MPRnb( TE0EX , 0.5 , "" , "TEMPERATURE SCALING OF E0") +`MPRnb( TE1EX , 0.5 , "" , "TEMPERATURE SCALING OF E1") +`MPRnb( TETA , -0.9e-3 , "1/K" , "TEMPERATURE SCALING OF ETA PARAMETER") +`MPRnb( UCEX , 1.5 , "" , "TEMPERATURE SCALING OF CRITICAL VELOCITY OF VELOCITY SATURATION EFFECT") +`MPRnb( TLAMBDA , 0.0 , "" , "TEMPERATURE SCALING OF LAMBDA PARAMETER") +`MPRnb( IBBT , 800e-6 , "" , "TEMPERATURE SCALING OF IBB") // TEMPERATURE AND GEOMETRY SCALING (3) - `MPRnb( TCVL , 0.0 , "m*V/K", "LENGTH SCALING OF TCV") - `MPRnb( TCVW , 0.0 , "m**2*V/K*V/K" , "WIDTH SCALING OF TCV") - `MPRnb( TCVWL , 0.0 , "m**2*V/K" , "AREA SCALING OF TCV") +`MPRnb( TCVL , 0.0 , "m*V/K", "LENGTH SCALING OF TCV") +`MPRnb( TCVW , 0.0 , "m**2*V/K*V/K" , "WIDTH SCALING OF TCV") +`MPRnb( TCVWL , 0.0 , "m**2*V/K" , "AREA SCALING OF TCV") //////////////////// // EXTRINSIC PART // @@ -259,42 +259,42 @@ // OVERLAP CAPACITANCES (8) - `MPRoz( GAMMAOV , 1.6 , "sqr(V)" , "BODY EFFECT COEFFICIENT OF THE GATE OVERLAP REGION") - `MPRoz( GAMMAGOV , 10.0 , "sqr(V)" , "GATE DOPING COEFFICIENT FOR POLYSILICON DEPLETION EFFECT OF THE GATE OVERLAP REGION") - `MPRnb( VFBOV , 0.0 , "V" , "FLAT-BAND VOLTAGE OF THE GATE OVERLAP REGION") - `MPRcz( LOV , 20e-9 , "m" , "EFFECTIVE LENGTH OF THE GATE OVERLAP REGION") - `MPRcc( VOV , 1.0 , "" , 0.0, 1.0 , "BIAS PARAMETER OF THE OVERLAP CAPACITANCES") - `MPRcz( CGSO , 0.0 , "F/m" , "BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE WIDTH UNIT BETWEEN GATE AND SOURCE") - `MPRcz( CGDO , 0.0 , "F/m" , "BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE WIDTH UNIT BETWEEN GATE AND DRAIN") - `MPRcz( CGBO , 0.0 , "F/m" , "BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE LENGTH UNIT BETWEEN GATE AND BULK") +`MPRoz( GAMMAOV , 1.6 , "sqr(V)" , "BODY EFFECT COEFFICIENT OF THE GATE OVERLAP REGION") +`MPRoz( GAMMAGOV , 10.0 , "sqr(V)" , "GATE DOPING COEFFICIENT FOR POLYSILICON DEPLETION EFFECT OF THE GATE OVERLAP REGION") +`MPRnb( VFBOV , 0.0 , "V" , "FLAT-BAND VOLTAGE OF THE GATE OVERLAP REGION") +`MPRcz( LOV , 20e-9 , "m" , "EFFECTIVE LENGTH OF THE GATE OVERLAP REGION") +`MPRcc( VOV , 1.0 , "" , 0.0, 1.0 , "BIAS PARAMETER OF THE OVERLAP CAPACITANCES") +`MPRcz( CGSO , 0.0 , "F/m" , "BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE WIDTH UNIT BETWEEN GATE AND SOURCE") +`MPRcz( CGDO , 0.0 , "F/m" , "BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE WIDTH UNIT BETWEEN GATE AND DRAIN") +`MPRcz( CGBO , 0.0 , "F/m" , "BIAS-INDEPENDENT OVERLAP CAPACITANCE PER GATE LENGTH UNIT BETWEEN GATE AND BULK") // FRINGING CAPACITANCE (4) - `MPRcz( KJF , 0.0 , "C/m" , "FRINGING CAPACITANCE PARAMETER") - `MPRcz( CJF , 0.0 , "1/V" , "BIAS SCALING OF FRINGING CAPACITANCE") - `MPRcz( VFR , 0.0 , "V" , "BUILT-IN VOLTAGE FINE TUNING FOR FRINGING CAPACITANCE MODEL") - `MPRcz( DFR , 1e-3 , "" , "SMOOTH PARAMETER OF FRINGING CAPACITANCE MODEL") +`MPRcz( KJF , 0.0 , "C/m" , "FRINGING CAPACITANCE PARAMETER") +`MPRcz( CJF , 0.0 , "1/V" , "BIAS SCALING OF FRINGING CAPACITANCE") +`MPRcz( VFR , 0.0 , "V" , "BUILT-IN VOLTAGE FINE TUNING FOR FRINGING CAPACITANCE MODEL") +`MPRcz( DFR , 1e-3 , "" , "SMOOTH PARAMETER OF FRINGING CAPACITANCE MODEL") // SERIES RESISTANCES RS AND RD // - TYPICAL SPICE MODEL - `MPRcz( HDIF , 0.0 , "m" , "HALF LENGTH OF THE ACTIVE AREA") - `MPRcz( RSH , 0.0 , "Ohms/sq" , "SQUARE RESISTANCE OF ACTIVE AREA") - `MPRcz( LDIF , 0.0 , "m" , "DISTANCE BETWEEN THE MIDDLE OF THE ACTIVE AREA AND THE START OF THE CHANNEL") - `MPRcz( RS , 0.0 , "Ohms/sq" , "LDD SOURCE SERIES RESISTANCE") - `MPRcz( RD , 0.0 , "Ohms/sq" , "LDD DRAIN SERIES RESISTANCE") +`MPRcz( HDIF , 0.0 , "m" , "HALF LENGTH OF THE ACTIVE AREA") +`MPRcz( RSH , 0.0 , "Ohms/sq" , "SQUARE RESISTANCE OF ACTIVE AREA") +`MPRcz( LDIF , 0.0 , "m" , "DISTANCE BETWEEN THE MIDDLE OF THE ACTIVE AREA AND THE START OF THE CHANNEL") +`MPRcz( RS , 0.0 , "Ohms/sq" , "LDD SOURCE SERIES RESISTANCE") +`MPRcz( RD , 0.0 , "Ohms/sq" , "LDD DRAIN SERIES RESISTANCE") // - NON-GEOMETRICAL APPROACH - `MPRnb( RLX , -1.0 , "Ohm/m" , "EXTERNAL SERIES RESISTANCE PER WIDTH UNIT") - `MPRnb( RSX , -1.0 , "Ohm/m" , "EXTERNAL SERIES RESISTANCE PER WIDTH UNIT, SOURCE SIDE (ASYMMETRIC MODEL)") - `MPRnb( RDX , -1.0 , "Ohm/m" , "EXTERNAL SERIES RESISTANCE PER WIDTH UNIT, DRAIN SIDE (ASYMMETRIC MODEL)") +`MPRnb( RLX , -1.0 , "Ohm/m" , "EXTERNAL SERIES RESISTANCE PER WIDTH UNIT") +`MPRnb( RSX , -1.0 , "Ohm/m" , "EXTERNAL SERIES RESISTANCE PER WIDTH UNIT, SOURCE SIDE (ASYMMETRIC MODEL)") +`MPRnb( RDX , -1.0 , "Ohm/m" , "EXTERNAL SERIES RESISTANCE PER WIDTH UNIT, DRAIN SIDE (ASYMMETRIC MODEL)") // - TEMPERATURE SCALING - `MPRnb( TR , 0.0 , "Ohms/K" , "FIRST ORDER RESISTANCE TEMPERATURE SCALING PARAMETER") - `MPRnb( TR2 , 0.0 , "Ohms/K**2" , "SECOND ORDER RESISTANCE TEMPERATURE SCALING PARAMETER") +`MPRnb( TR , 0.0 , "Ohms/K" , "FIRST ORDER RESISTANCE TEMPERATURE SCALING PARAMETER") +`MPRnb( TR2 , 0.0 , "Ohms/K**2" , "SECOND ORDER RESISTANCE TEMPERATURE SCALING PARAMETER") // JUNCTION DRAIN - BULK AND SOURCE-BULK AREA, CURRENT, CAPACITANCE @@ -302,112 +302,112 @@ parameter real GMIN = 0.0 from [0.0:inf) `ATTR(info="MINI // SOURCE SIDE - `MPRoz( NJS ,1.0 , "" ,"SLOPE FACTOR FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRcz( XJBVS ,0.0 , "" ,"BREAK-DOWN EFFECT COEFFICIENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRnb( BVS ,10.0 , "V" ,"BREAK-DOWN VOLTAGE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRoz( NJS ,1.0 , "" ,"SLOPE FACTOR FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRcz( XJBVS ,0.0 , "" ,"BREAK-DOWN EFFECT COEFFICIENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRnb( BVS ,10.0 , "V" ,"BREAK-DOWN VOLTAGE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRcz( JSS ,1.0e-4 , "A/m^2" ,"AREA COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRcz( JSSWS ,0.0 , "A/m" ,"SIDEWAYS COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRcz( JSSWGS ,0.0 , "A/m" ,"GATE-SIDE COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRcz( JSS ,1.0e-4 , "A/m^2" ,"AREA COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRcz( JSSWS ,0.0 , "A/m" ,"SIDEWAYS COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRcz( JSSWGS ,0.0 , "A/m" ,"GATE-SIDE COMPONENT OF CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRcz( JTSS ,0.0 , "A/m" ,"AREA COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRcz( JTSSWS ,0.0 , "A/m^2" ,"SIDEWAYS COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRcz( JTSSWGS ,0.0 , "A/m" ,"GATESIDE COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRcz( JTSS ,0.0 , "A/m" ,"AREA COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRcz( JTSSWS ,0.0 , "A/m^2" ,"SIDEWAYS COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRcz( JTSSWGS ,0.0 , "A/m" ,"GATESIDE COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRoz( NJTSS ,20.0 , "" ,"AREA SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRoz( NJTSSWS ,20.0 , "" ,"SIDEWAYS SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRoz( NJTSSWGS ,20.0 , "" ,"GATESIDE SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRoz( NJTSS ,20.0 , "" ,"AREA SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRoz( NJTSSWS ,20.0 , "" ,"SIDEWAYS SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRoz( NJTSSWGS ,20.0 , "" ,"GATESIDE SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRnb( VTSS ,10.0 , "V" ,"AREA VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRnb( VTSSWS ,10.0 , "V" ,"SIDEWAYS VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRnb( VTSSWGS ,10.0 , "V" ,"GATESIDE VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRnb( VTSS ,10.0 , "V" ,"AREA VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRnb( VTSSWS ,10.0 , "V" ,"SIDEWAYS VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRnb( VTSSWGS ,10.0 , "V" ,"GATESIDE VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRcz( CJS ,5.0e-4 , "F/m^2" ,"AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRcz( CJSWS ,5.0e-10, "F/m" ,"SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRcz( CJSWGS ,0.0 , "F/m" ,"GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRcz( CJS ,5.0e-4 , "F/m^2" ,"AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRcz( CJSWS ,5.0e-10, "F/m" ,"SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRcz( CJSWGS ,0.0 , "F/m" ,"GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRcz( PBS ,1.0 , "V" ,"AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRcz( PBSWS ,1.0 , "V" ,"SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRcz( PBSWGS ,PBSWS , "V" ,"GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRcz( PBS ,1.0 , "V" ,"AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRcz( PBSWS ,1.0 , "V" ,"SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRcz( PBSWGS ,PBSWS , "V" ,"GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRoo( MJS ,0.5 , "" ,-inf ,1.0 ,"AREA EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRoo( MJSWS ,0.33 , "" ,-inf ,1.0 ,"SIDEWAYS EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRoo( MJSWGS ,MJSWS , "" ,-inf ,1.0 ,"GATESIDE EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRoo( MJS ,0.5 , "" ,-inf ,1.0 ,"AREA EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRoo( MJSWS ,0.33 , "" ,-inf ,1.0 ,"SIDEWAYS EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRoo( MJSWGS ,MJSWS , "" ,-inf ,1.0 ,"GATESIDE EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRnb( XTIS ,3.0 , "" ,"TEMPERATURE DEPENDENCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRnb( XTIS ,3.0 , "" ,"TEMPERATURE DEPENDENCE FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRnb( XTSS ,0.02 , "" ,"AREA COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRnb( XTSSWS ,0.02 , "" ,"SIDEWAYS COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRnb( XTSSWGS ,0.02 , "" ,"GATESIDE COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRnb( XTSS ,0.02 , "" ,"AREA COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRnb( XTSSWS ,0.02 , "" ,"SIDEWAYS COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRnb( XTSSWGS ,0.02 , "" ,"GATESIDE COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRnb( TNJTSS ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSS (AREA), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRnb( TNJTSSWS ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSSWS (SIDEWAYS), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") - `MPRnb( TNJTSSWGS ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSSWGS (GATESIDE), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRnb( TNJTSS ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSS (AREA), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRnb( TNJTSSWS ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSSWS (SIDEWAYS), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") +`MPRnb( TNJTSSWGS ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSSWGS (GATESIDE), JUNCTION DIODE, SOURCE SIDE (ASYMMETRICAL MODEL)") // BOTH SIDES - `MPRnb( TCJ , 0.0, "1/K" , "TEMPERATURE DEPENDENCE OF AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJS AND CJD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") - `MPRnb( TCJSW , 0.0, "1/K" , "TEMPERATURE DEPENDENCE OF SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJSWS AND CJSWD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") - `MPRnb( TCJSWG, 0.0, "1/K" , "TEMPERATURE DEPENDENCE OF GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJSWGS AND CJSWGD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") +`MPRnb( TCJ , 0.0, "1/K" , "TEMPERATURE DEPENDENCE OF AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJS AND CJD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") +`MPRnb( TCJSW , 0.0, "1/K" , "TEMPERATURE DEPENDENCE OF SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJSWS AND CJSWD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") +`MPRnb( TCJSWG, 0.0, "1/K" , "TEMPERATURE DEPENDENCE OF GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODES (CJSWGS AND CJSWGD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") - `MPRnb( TPB , 0.0, "V/K" , "TEMPERATURE DEPENDENCE OF AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBS AND PBD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") - `MPRnb( TPBSW , 0.0, "V/K" , "TEMPERATURE DEPENDENCE OF SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBSWS AND PBSWD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") - `MPRnb( TPBSWG, 0.0, "V/K" , "TEMPERATURE DEPENDENCE OF GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBSWGS AND PBSWGD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") +`MPRnb( TPB , 0.0, "V/K" , "TEMPERATURE DEPENDENCE OF AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBS AND PBD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") +`MPRnb( TPBSW , 0.0, "V/K" , "TEMPERATURE DEPENDENCE OF SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBSWS AND PBSWD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") +`MPRnb( TPBSWG, 0.0, "V/K" , "TEMPERATURE DEPENDENCE OF GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODES (PBSWGS AND PBSWGD), BOTH (SOURCE AND DRAIN) SIDES (ASYMMETRICAL MODEL)") // DRAIN SIDE - `MPRoz( NJD ,1.0 , "" ,"SLOPE FACTOR FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRcz( XJBVD ,0.0 , "" ,"BREAK-DOWN EFFECT COEFFICIENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRnb( BVD ,10.0 , "V" ,"BREAK-DOWN VOLTAGE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRoz( NJD ,1.0 , "" ,"SLOPE FACTOR FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRcz( XJBVD ,0.0 , "" ,"BREAK-DOWN EFFECT COEFFICIENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRnb( BVD ,10.0 , "V" ,"BREAK-DOWN VOLTAGE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRcz( JSD ,1.0e-4 , "A/m^2" ,"AREA COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRcz( JSSWD ,0.0 , "A/m" ,"SIDEWAYS COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRcz( JSSWGD ,0.0 , "A/m" ,"GATE-SIDE COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRcz( JSD ,1.0e-4 , "A/m^2" ,"AREA COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRcz( JSSWD ,0.0 , "A/m" ,"SIDEWAYS COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRcz( JSSWGD ,0.0 , "A/m" ,"GATE-SIDE COMPONENT OF CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRcz( JTSD ,0.0 , "A/m" ,"AREA COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRcz( JTSSWD ,0.0 , "A/m^2" ,"SIDEWAYS COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRcz( JTSSWGD ,0.0 , "A/m" ,"GATESIDE COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRcz( JTSD ,0.0 , "A/m" ,"AREA COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRcz( JTSSWD ,0.0 , "A/m^2" ,"SIDEWAYS COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRcz( JTSSWGD ,0.0 , "A/m" ,"GATESIDE COMPONENT OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRoz( NJTSD ,20.0 , "" ,"AREA SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRoz( NJTSSWD ,20.0 , "" ,"SIDEWAYS SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRoz( NJTSSWGD ,20.0 , "" ,"GATESIDE SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRoz( NJTSD ,20.0 , "" ,"AREA SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRoz( NJTSSWD ,20.0 , "" ,"SIDEWAYS SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRoz( NJTSSWGD ,20.0 , "" ,"GATESIDE SLOPE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRnb( VTSD ,10.0 , "V" ,"AREA VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRnb( VTSSWD ,10.0 , "V" ,"SIDEWAYS VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRnb( VTSSWGD ,10.0 , "V" ,"GATESIDE VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRnb( VTSD ,10.0 , "V" ,"AREA VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRnb( VTSSWD ,10.0 , "V" ,"SIDEWAYS VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRnb( VTSSWGD ,10.0 , "V" ,"GATESIDE VOLTAGE FACTOR OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRcz( CJD ,5.0e-4 , "F/m^2" ,"AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRcz( CJSWD ,5.0e-10, "F/m" ,"SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRcz( CJSWGD ,0.0 , "F/m" ,"GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRcz( CJD ,5.0e-4 , "F/m^2" ,"AREA COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRcz( CJSWD ,5.0e-10, "F/m" ,"SIDEWAYS COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRcz( CJSWGD ,0.0 , "F/m" ,"GATESIDE COMPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRcz( PBD ,1.0 , "V" ,"AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRcz( PBSWD ,1.0 , "V" ,"SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRcz( PBSWGD ,PBSWD , "V" ,"GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRcz( PBD ,1.0 , "V" ,"AREA PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRcz( PBSWD ,1.0 , "V" ,"SIDEWAYS PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRcz( PBSWGD ,PBSWD , "V" ,"GATESIDE PARAMETER OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRoo( MJD ,0.5 , "" ,-inf ,1.0 ,"AREA EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRoo( MJSWD ,0.33 , "" ,-inf ,1.0 ,"SIDEWAYS EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRoo( MJSWGD ,MJSWD , "" ,-inf ,1.0 ,"GATESIDE EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRoo( MJD ,0.5 , "" ,-inf ,1.0 ,"AREA EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRoo( MJSWD ,0.33 , "" ,-inf ,1.0 ,"SIDEWAYS EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRoo( MJSWGD ,MJSWD , "" ,-inf ,1.0 ,"GATESIDE EXPONENT OF CAPACITANCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRnb( XTID ,3.0 , "" ,"TEMPERATURE DEPENDENCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRnb( XTID ,3.0 , "" ,"TEMPERATURE DEPENDENCE FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRnb( XTSD ,0.02 , "" ,"AREA COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRnb( XTSSWD ,0.02 , "" ,"SIDEWAYS COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRnb( XTSSWGD ,0.02 , "" ,"GATESIDE COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRnb( XTSD ,0.02 , "" ,"AREA COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRnb( XTSSWD ,0.02 , "" ,"SIDEWAYS COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRnb( XTSSWGD ,0.02 , "" ,"GATESIDE COMPONENT OF TEMPERATURE DEPENDENCE OF TRAP-ASSISTED CURRENT FOR JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRnb( TNJTSD ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSS (AREA), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRnb( TNJTSSWD ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSSWS (SIDEWAYS), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") - `MPRnb( TNJTSSWGD ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSSWGS (GATESIDE), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRnb( TNJTSD ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSS (AREA), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRnb( TNJTSSWD ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSSWS (SIDEWAYS), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") +`MPRnb( TNJTSSWGD ,0.0 , "" ,"TEMPERATURE DEPENDENCE OF NJTSSWGS (GATESIDE), JUNCTION DIODE, DRAIN SIDE (ASYMMETRICAL MODEL)") // PARAMETERS RF - `MPRcz( RGSH , 3.0 , "Ohms/sq" , "GATE SHEET REISTANCE") - `MPIcc( GC , 1 , "" , 1 , 2, "TYPE OF GATE CONTACTS (GC = 1: SINLGE SIDED, GC = 2: BOTH SIDES)") - `MPRnb( KRGL1 , 0.0 , "1/m" , "GATE RESISTANCE LENGTH SCALING PARAMETER") - `MPRoz( RDSBSH , 1e+3 , "Ohms/sq" , "SUBSTRATE NETWORK SHEET RESISTANCE BETWEEN INTERNAL DRAIN AND SOURCE NODES (USED AT RF AND NQS MODES)") - `MPRoz( RBWSH , 3e-3 , "Ohms/m" , "SUBSTRATE NETWORK BULK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL BULK AND EXTERNAL BULK NODES (USED AT RF4, RF AND NQS MODES)") - `MPRcz( RBN , 0.0 , "Ohms" , "SUBSTRATE NETWORK BULK RESISTANCE PER FINGER BETWEEN INTERNAL BULK AND EXTERNAL BULK NODES (USED AT RF4, RF AND NQS MODES)") - `MPRoz( RSBWSH , 1e-3 , "Ohms/m" , "SUBSTRATE NETWORK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL SOURCE AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)") - `MPRcz( RSBN , 0.0 , "Ohms" , "SUBSTRATE NETWORK RESISTANCE PER FINGER BETWEEN INTERNAL SOURCE AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)") - `MPRoz( RDBWSH , 1e-3 , "Ohms/m" , "SUBSTRATE NETWORK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL DRAIN AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)") - `MPRcz( RDBN , 0.0 , "Ohms" , "SUBSTRATE NETWORK RESISTANCE PER FINGER BETWEEN INTERNAL DRAIN AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)") - `MPIcc( RINGTYPE , 1 , "" , 1 , 2, "RINGTYPE, SHAPE OF BULK CONNECTOR (RINGTYPE = 1 FOR HORSE-SHOE, THREE SIDES CONTACT, RINGTYPE = 2 FOR SYMMETRIC, TWO SIDES CONTACT), (USED AT RF4, RF AND NQS MODES)") +`MPRcz( RGSH , 3.0 , "Ohms/sq" , "GATE SHEET REISTANCE") +`MPIcc( GC , 1 , "" , 1 , 2, "TYPE OF GATE CONTACTS (GC = 1: SINLGE SIDED, GC = 2: BOTH SIDES)") +`MPRnb( KRGL1 , 0.0 , "1/m" , "GATE RESISTANCE LENGTH SCALING PARAMETER") +`MPRoz( RDSBSH , 1e+3 , "Ohms/sq" , "SUBSTRATE NETWORK SHEET RESISTANCE BETWEEN INTERNAL DRAIN AND SOURCE NODES (USED AT RF AND NQS MODES)") +`MPRoz( RBWSH , 3e-3 , "Ohms/m" , "SUBSTRATE NETWORK BULK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL BULK AND EXTERNAL BULK NODES (USED AT RF4, RF AND NQS MODES)") +`MPRcz( RBN , 0.0 , "Ohms" , "SUBSTRATE NETWORK BULK RESISTANCE PER FINGER BETWEEN INTERNAL BULK AND EXTERNAL BULK NODES (USED AT RF4, RF AND NQS MODES)") +`MPRoz( RSBWSH , 1e-3 , "Ohms/m" , "SUBSTRATE NETWORK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL SOURCE AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)") +`MPRcz( RSBN , 0.0 , "Ohms" , "SUBSTRATE NETWORK RESISTANCE PER FINGER BETWEEN INTERNAL SOURCE AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)") +`MPRoz( RDBWSH , 1e-3 , "Ohms/m" , "SUBSTRATE NETWORK RESISTANCE PER WIDTH UNIT BETWEEN INTERNAL DRAIN AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)") +`MPRcz( RDBN , 0.0 , "Ohms" , "SUBSTRATE NETWORK RESISTANCE PER FINGER BETWEEN INTERNAL DRAIN AND EXTERNAL BULK NODES (USED AT RF AND NQS MODES)") +`MPIcc( RINGTYPE , 1 , "" , 1 , 2, "RINGTYPE, SHAPE OF BULK CONNECTOR (RINGTYPE = 1 FOR HORSE-SHOE, THREE SIDES CONTACT, RINGTYPE = 2 FOR SYMMETRIC, TWO SIDES CONTACT), (USED AT RF4, RF AND NQS MODES)") From b430c51a5f7b0be563960c5a84821c0c71b892b2 Mon Sep 17 00:00:00 2001 From: dwarning <> Date: Thu, 14 Nov 2024 11:04:21 +0100 Subject: [PATCH 12/14] add Changelog --- README.md | 1 + code/Changelog.md | 68 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 code/Changelog.md diff --git a/README.md b/README.md index 645a272..b7b5632 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,4 @@ mbucher@tuc.gr Current contributors: Matthias Bucher, Nikolaos Makris \ Past contributors: Antonios Bazigos, Marianna Chalkiadaki, Nikolaos Mavredakis, Francois Krummenacher, Jean-Michel Sallese, Christian Enz, Ananda Roy +This fork has modifications to improve compatibility to Verilog-A standard and simulators ngspice and Xyce. [Changelog](code/Changelog.md) diff --git a/code/Changelog.md b/code/Changelog.md new file mode 100644 index 0000000..0ef8509 --- /dev/null +++ b/code/Changelog.md @@ -0,0 +1,68 @@ +e445791 - dwarning, 2024-04-19 11:39:41 : format +code/ekv3.va +code/ekv3_include/ekv3_definitions.va +code/ekv3_include/ekv3_edge.va +code/ekv3_include/ekv3_extract_debug.va +code/ekv3_include/ekv3_extrinsic_diodes.va +code/ekv3_include/ekv3_extrinsic_rc.va +code/ekv3_include/ekv3_functions_def.va +code/ekv3_include/ekv3_gate_current.va +code/ekv3_include/ekv3_gidl.va +code/ekv3_include/ekv3_noise.va +code/ekv3_include/ekv3_oppoints.va +code/ekv3_include/ekv3_overlap.va +code/ekv3_include/ekv3_parameters.va + +aa1fbf6 - dwarning, 2024-04-19 11:14:07 : assume flicker noise is zero if no current +code/ekv3_include/ekv3_noise.va + +0c4e0fe - dwarning, 2024-04-19 07:55:11 : move or comment-out certain op declaration, so they are setted for op info +code/ekv3_include/ekv3_variables.va +code/ekv3_include/ekv3_variables_oppoint.va + +0397136 - dwarning, 2024-04-18 22:41:16 : format +code/ekv3_include/ekv3_oppoints.va + +3ffd918 - dwarning, 2024-04-18 22:27:45 : mv certain op declaration, so they are setted for op info +code/ekv3_include/ekv3_variables.va +code/ekv3_include/ekv3_variables_oppoint.va + +6597fe8 - dwarning, 2024-04-18 10:29:20 : IBB prevent division by zero +code/ekv3_include/ekv3_parameters.va + +67d2a3b - dwarning, 2024-04-18 10:26:14 : mv VS, VD, VG op declaration, so they are setted for op info +code/ekv3_include/ekv3_variables.va +code/ekv3_include/ekv3_variables_oppoint.va + +5c9e112 - dwarning, 2024-04-17 19:56:54 : name for white_noise contribution +code/ekv3_include/ekv3_extrinsic_rc.va + +ba5aeb7 - dwarning, 2024-04-17 19:53:55 : use analog function for exp limiting instead limexp +code/ekv3.va +code/ekv3_include/ekv3_definitions.va + +fac4444 - dwarning, 2024-04-17 19:46:11 : use macros for parameter definitions +code/ekv3_include/ekv3_definitions.va +code/ekv3_include/ekv3_parameters.va + +a2f1ec0 - dwarning, 2024-04-17 17:24:17 : white spaces +code/ekv3.va +code/ekv3_all.va +code/ekv3_include/ekv3_def_check.va +code/ekv3_include/ekv3_definitions.va +code/ekv3_include/ekv3_edge.va +code/ekv3_include/ekv3_extract_debug.va +code/ekv3_include/ekv3_extrinsic_diodes.va +code/ekv3_include/ekv3_extrinsic_rc.va +code/ekv3_include/ekv3_fringing.va +code/ekv3_include/ekv3_functions_def.va +code/ekv3_include/ekv3_gate_current.va +code/ekv3_include/ekv3_gidl.va +code/ekv3_include/ekv3_idb.va +code/ekv3_include/ekv3_natures.va +code/ekv3_include/ekv3_noise.va +code/ekv3_include/ekv3_oppoints.va +code/ekv3_include/ekv3_overlap.va +code/ekv3_include/ekv3_parameters.va +code/ekv3_include/ekv3_variables.va +code/ekv3_include/ekv3_variables_oppoint.va From 795ff50d562672db0852ed0234530b99b0f764fb Mon Sep 17 00:00:00 2001 From: dwarning <> Date: Thu, 14 Nov 2024 11:15:45 +0100 Subject: [PATCH 13/14] format --- code/Changelog.md | 107 ++++++++++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 47 deletions(-) diff --git a/code/Changelog.md b/code/Changelog.md index 0ef8509..472e78e 100644 --- a/code/Changelog.md +++ b/code/Changelog.md @@ -1,68 +1,81 @@ +## Changelog + e445791 - dwarning, 2024-04-19 11:39:41 : format -code/ekv3.va -code/ekv3_include/ekv3_definitions.va -code/ekv3_include/ekv3_edge.va -code/ekv3_include/ekv3_extract_debug.va -code/ekv3_include/ekv3_extrinsic_diodes.va -code/ekv3_include/ekv3_extrinsic_rc.va -code/ekv3_include/ekv3_functions_def.va -code/ekv3_include/ekv3_gate_current.va -code/ekv3_include/ekv3_gidl.va -code/ekv3_include/ekv3_noise.va -code/ekv3_include/ekv3_oppoints.va -code/ekv3_include/ekv3_overlap.va -code/ekv3_include/ekv3_parameters.va + +* code/ekv3.va +* code/ekv3_include/ekv3_definitions.va +* code/ekv3_include/ekv3_edge.va +* code/ekv3_include/ekv3_extract_debug.va +* code/ekv3_include/ekv3_extrinsic_diodes.va +* code/ekv3_include/ekv3_extrinsic_rc.va +* code/ekv3_include/ekv3_functions_def.va +* code/ekv3_include/ekv3_gate_current.va +* code/ekv3_include/ekv3_gidl.va +* code/ekv3_include/ekv3_noise.va +* code/ekv3_include/ekv3_oppoints.va +* code/ekv3_include/ekv3_overlap.va +* code/ekv3_include/ekv3_parameters.va aa1fbf6 - dwarning, 2024-04-19 11:14:07 : assume flicker noise is zero if no current -code/ekv3_include/ekv3_noise.va + +* code/ekv3_include/ekv3_noise.va 0c4e0fe - dwarning, 2024-04-19 07:55:11 : move or comment-out certain op declaration, so they are setted for op info -code/ekv3_include/ekv3_variables.va -code/ekv3_include/ekv3_variables_oppoint.va + +* code/ekv3_include/ekv3_variables.va +* code/ekv3_include/ekv3_variables_oppoint.va 0397136 - dwarning, 2024-04-18 22:41:16 : format -code/ekv3_include/ekv3_oppoints.va + +* code/ekv3_include/ekv3_oppoints.va 3ffd918 - dwarning, 2024-04-18 22:27:45 : mv certain op declaration, so they are setted for op info -code/ekv3_include/ekv3_variables.va -code/ekv3_include/ekv3_variables_oppoint.va + +* code/ekv3_include/ekv3_variables.va +* code/ekv3_include/ekv3_variables_oppoint.va 6597fe8 - dwarning, 2024-04-18 10:29:20 : IBB prevent division by zero -code/ekv3_include/ekv3_parameters.va + +* code/ekv3_include/ekv3_parameters.va 67d2a3b - dwarning, 2024-04-18 10:26:14 : mv VS, VD, VG op declaration, so they are setted for op info -code/ekv3_include/ekv3_variables.va -code/ekv3_include/ekv3_variables_oppoint.va + +* code/ekv3_include/ekv3_variables.va +* code/ekv3_include/ekv3_variables_oppoint.va 5c9e112 - dwarning, 2024-04-17 19:56:54 : name for white_noise contribution -code/ekv3_include/ekv3_extrinsic_rc.va + +* code/ekv3_include/ekv3_extrinsic_rc.va ba5aeb7 - dwarning, 2024-04-17 19:53:55 : use analog function for exp limiting instead limexp -code/ekv3.va -code/ekv3_include/ekv3_definitions.va + +* code/ekv3.va +* code/ekv3_include/ekv3_definitions.va fac4444 - dwarning, 2024-04-17 19:46:11 : use macros for parameter definitions -code/ekv3_include/ekv3_definitions.va -code/ekv3_include/ekv3_parameters.va + +* code/ekv3_include/ekv3_definitions.va +* code/ekv3_include/ekv3_parameters.va a2f1ec0 - dwarning, 2024-04-17 17:24:17 : white spaces -code/ekv3.va -code/ekv3_all.va -code/ekv3_include/ekv3_def_check.va -code/ekv3_include/ekv3_definitions.va -code/ekv3_include/ekv3_edge.va -code/ekv3_include/ekv3_extract_debug.va -code/ekv3_include/ekv3_extrinsic_diodes.va -code/ekv3_include/ekv3_extrinsic_rc.va -code/ekv3_include/ekv3_fringing.va -code/ekv3_include/ekv3_functions_def.va -code/ekv3_include/ekv3_gate_current.va -code/ekv3_include/ekv3_gidl.va -code/ekv3_include/ekv3_idb.va -code/ekv3_include/ekv3_natures.va -code/ekv3_include/ekv3_noise.va -code/ekv3_include/ekv3_oppoints.va -code/ekv3_include/ekv3_overlap.va -code/ekv3_include/ekv3_parameters.va -code/ekv3_include/ekv3_variables.va -code/ekv3_include/ekv3_variables_oppoint.va + +* code/ekv3.va +* code/ekv3_all.va +* code/ekv3_include/ekv3_def_check.va +* code/ekv3_include/ekv3_definitions.va +* code/ekv3_include/ekv3_edge.va +* code/ekv3_include/ekv3_extract_debug.va +* code/ekv3_include/ekv3_extrinsic_diodes.va +* code/ekv3_include/ekv3_extrinsic_rc.va +* code/ekv3_include/ekv3_fringing.va +* code/ekv3_include/ekv3_functions_def.va +* code/ekv3_include/ekv3_gate_current.va +* code/ekv3_include/ekv3_gidl.va +* code/ekv3_include/ekv3_idb.va +* code/ekv3_include/ekv3_natures.va +* code/ekv3_include/ekv3_noise.va +* code/ekv3_include/ekv3_oppoints.va +* code/ekv3_include/ekv3_overlap.va +* code/ekv3_include/ekv3_parameters.va +* code/ekv3_include/ekv3_variables.va +* code/ekv3_include/ekv3_variables_oppoint.va From 8837826706193508c097569a52087807ad022e9d Mon Sep 17 00:00:00 2001 From: Tom Russo Date: Mon, 20 Jan 2025 21:49:54 -0700 Subject: [PATCH 14/14] Isolate ddx temporary to eliminate ADMS second derivatives The use of "tmp1" and "tmp2" variables in multiple contexts in EKV3 (in expressions destined for contributions and as temporaries holding ddx()) confuses Xyce/ADMS into thinking it needs to generate code for second derivatives in every expression involving tmp1 or tmp2. Wrapping the single instance of tmp1 and tmp2 having ddx stored into them (which are then immediately used in a later computation and then discarded) inside a begin/end block and making those tmp1 and tmp2 variables block local completely fixes the misunderstanding, and Xyce/ADMS no longer generates second derivative code anywhere. This simple fix should be used if (when?) Xyce decides to import the open source version of EKV 3.02 into Xyce, if that happens before Xyce/ADMS is replaced by something good. Without this fix, Xyce/ADMS generates a huge amount of completely unnecessary second derivatives. See also Xyce/Xyce/issues/104 --- code/ekv3_include/ekv3_oppoints.va | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/code/ekv3_include/ekv3_oppoints.va b/code/ekv3_include/ekv3_oppoints.va index 15210b2..60f3937 100644 --- a/code/ekv3_include/ekv3_oppoints.va +++ b/code/ekv3_include/ekv3_oppoints.va @@ -104,10 +104,22 @@ begin : OPinfo Cgdov = M *( abs(ddx((QDOV),V(`GEFF)))); ///Total extrinsic capacitance//////////// - tmp1 = M * abs(ddx(QSFR,V(`GEFF))); - tmp2 = M * abs(ddx(QDFR,V(`GEFF))); - Cgsex = Cgsi + (CGSO * M * WeffNF) + Cgsov + tmp1; - Cgdex = Cgdi + (CGDO * M * WeffNF) + Cgdov + tmp2; + + // MODIFIED BY T.V. Russo, 2025-01-20 + // The four code lines below have been wrapped in a begin/end block + // and tmp1 and tmp2 made block local variables here. This is simply to + // stop Xyce/ADMS from being confused by the ddx into thinking it needs + // to generate second derivative any time the global tmp1 and tmp2 + // variables are used in an expression that will ultimately be used in a + // contribution. + // c.f https://github.com/Xyce/Xyce/issues/104 + begin + real tmp1,tmp2; + tmp1 = M * abs(ddx(QSFR,V(`GEFF))); + tmp2 = M * abs(ddx(QDFR,V(`GEFF))); + Cgsex = Cgsi + (CGSO * M * WeffNF) + Cgsov + tmp1; + Cgdex = Cgdi + (CGDO * M * WeffNF) + Cgdov + tmp2; + end Cgbex = Cgbi + CGBO * M * 2.0 * Leff * NF ; Ctotex = Cgsex + Cgbex + Cgdex; ////Intrnsic Gain ///////////////////////