diff --git a/src/spicelib/devices/adms/hicum0/admsva/hicum0.va b/src/spicelib/devices/adms/hicum0/admsva/hicum0.va index 7163e4bb3..ff4497d6c 100644 --- a/src/spicelib/devices/adms/hicum0/admsva/hicum0.va +++ b/src/spicelib/devices/adms/hicum0/admsva/hicum0.va @@ -809,23 +809,23 @@ analog begin // Following code is an intermediate solution: // ****************************************** - //if(flsh == 0 || rth < `MIN_R) begin - // I(br_sht) <+ Vrth/`MIN_R; - //end else begin - // I(br_sht) <+ Vrth/rth-pterm `P(spectre:gmin="add"); - // I(br_sht) <+ ddt(cth*Vrth); - //end + if(flsh == 0 || rth < `MIN_R) begin + I(br_sht) <+ Vrth/`MIN_R; + end else begin + I(br_sht) <+ Vrth/rth-pterm `P(spectre:gmin="add"); + I(br_sht) <+ ddt(cth*Vrth); + end // ****************************************** // For simulators having no problem with V(br_sht) <+ 0.0 // with external thermal node, follwing code may be used. // This external thermal node should remain accessible. // ******************************************** - if(flsh == 0 || rth < `MIN_R) begin - V(br_sht) <+ 0.0; - end else begin - I(br_sht) <+ Vrth/rth-pterm `P(spectre:gmin="add"); - I(br_sht) <+ ddt(cth*Vrth); - end + //if(flsh == 0 || rth < `MIN_R) begin + // V(br_sht) <+ 0.0; + //end else begin + // I(br_sht) <+ Vrth/rth-pterm `P(spectre:gmin="add"); + // I(br_sht) <+ ddt(cth*Vrth); + //end // ******************************************** // Noise sources diff --git a/src/spicelib/devices/adms/hicum2/admsva/hicum2.va b/src/spicelib/devices/adms/hicum2/admsva/hicum2.va index 9818d124d..3bca4e75b 100644 --- a/src/spicelib/devices/adms/hicum2/admsva/hicum2.va +++ b/src/spicelib/devices/adms/hicum2/admsva/hicum2.va @@ -469,9 +469,9 @@ module hic2_full (c,b,e,s,tnode); inout c,b,e,s,tnode; electrical c,b,e,s,ci,ei,bp,bi,si; -electrical xf1,xf2,xf3,xf4; +electrical xf1,xf2,xf3,xf4; electrical tnode; -electrical n1,n2; +electrical n1,n2; //Branch definitions branch (b,bp) br_bbp_i; @@ -1558,20 +1558,18 @@ begin : Load_sources I(br_sht) <+ V(br_sht)/rth-pterm; I(br_sht) <+ ddt(cth*V(br_sht)); end - // ****************************************** - // For simulators having no problem with V(br_sht) <+ 0.0 // with external thermal node, follwing code may be used. // Note that external thermal node should remain accessible // even without self-heating. // ******************************************** - //if(flsh == 0 || rth < `MIN_R) begin - // V(br_sht) <+ 0.0; - //end else begin - // I(br_sht) <+ V(br_sht)/rth-pterm; - // I(br_sht) <+ ddt(cth*V(br_sht)); - //end + //if(flsh == 0 || rth < `MIN_R) begin + // V(br_sht) <+ 0.0; + //end else begin + // I(br_sht) <+ V(br_sht)/rth-pterm; + // I(br_sht) <+ ddt(cth*V(br_sht)); + //end // ******************************************** // NQS effect diff --git a/src/spicelib/devices/adms/mextram/admsva/COPYRIGHT_NOTICE b/src/spicelib/devices/adms/mextram/admsva/COPYRIGHT_NOTICE index 7a4230461..f1699067e 100644 --- a/src/spicelib/devices/adms/mextram/admsva/COPYRIGHT_NOTICE +++ b/src/spicelib/devices/adms/mextram/admsva/COPYRIGHT_NOTICE @@ -1,10 +1,40 @@ - -Verilog-A implementation of the Philips Mextram (level 504.6) model. +Verilog-A implementation of the Mextram Bipolar Transistor Model, +including variants of the Mextram model released by Delft University. -Copyright (c) 2002-2005 Delft University of Technology (TUD). -All rights reserved. +Copyright (c) 2006 Delft University of Technology +Licensed under the Educational Community License version 1.0 -Permission to modify the code and to distribute modified code is -granted, provided the file with the copyright notice is retained, -and a notice that the code was modified is included. +This Original Work, including software, source code, documents, or other related items, +is being provided by the copyright holder(s) subject to the terms of the Educational +Community License. By obtaining, using and/or copying this Original Work, you agree that +you have read, understand, and will comply with the following terms and conditions of +the Educational Community License: + +Permission to use, copy, modify, merge, publish, distribute, and sublicense this Original +Work and its documentation, with or without modification, for any purpose, and without fee +or royalty to the copyright holder(s) is hereby granted, provided that you include the +following on ALL copies of the Original Work or portions thereof, including modifications +or derivatives, that you make: + +The full text of the Educational Community License in a location viewable to users of the +redistributed or derivative work. + +Any pre-existing intellectual property disclaimers, notices, or terms and conditions. + +Notice of any changes or modifications to the Original Work, including the date the +changes were made. + +Any modifications of the Original Work must be distributed in such a manner as to avoid +any confusion with the Original Work of the copyright holders. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +The name and trademarks of copyright holder(s) may NOT be used in advertising or publicity +pertaining to the Original or Derivative Works without specific, written prior permission. +Title to copyright in the Original Work and any associated documentation will at all times +remain with the copyright holders. \ No newline at end of file diff --git a/src/spicelib/devices/adms/mextram/admsva/evaluate.inc b/src/spicelib/devices/adms/mextram/admsva/evaluate.inc index 5daa730e4..c4d9e1c6a 100644 --- a/src/spicelib/devices/adms/mextram/admsva/evaluate.inc +++ b/src/spicelib/devices/adms/mextram/admsva/evaluate.inc @@ -8,32 +8,72 @@ begin // Currents and sharges Vb2e1 = TYPE * V(b2, e1); Vb1e1 = TYPE * V(b1, e1); Vb1b2 = TYPE * V(b1, b2); - Vb1c1 = TYPE * V(b1, c1); - Vbc1 = TYPE * V(b, c1); `ifdef SUBSTRATE Vsc1 = TYPE * V(s, c1); `endif Vc1c2 = TYPE * V(c1, c2); Vee1 = TYPE * V(e, e1); Vbb1 = TYPE * V(b, b1); - Vcc1 = TYPE * V(c, c1); Vbe = TYPE * V(b, e); Vbc = TYPE * V(b, c); - + +/* RvdT, 03-12-2007, voltage differences + associated with distributed parasitic collector. + Evaluated taking values of resistances into account: + in case of vanishing resistance corresponding node + is not addressed: */ + +if (RCBLX > 0.0) + begin + if (RCBLI > 0.0) + begin + Vc4c1 = TYPE * V(c4, c1); + Vc3c4 = TYPE * V(c3, c4); + end + else + begin + Vc4c1 = 0 ; + Vc3c4 = TYPE * V(c3, c1); + end + end +else + begin + if (RCBLI > 0.0) + begin + Vc4c1 = TYPE * V(c4, c1); + Vc3c4 = 0 ; + end + else + begin + Vc4c1 = 0 ; + Vc3c4 = 0 ; + end + end + + Vb1c4 = Vb1b2 + Vb2c2 - Vc1c2 - Vc4c1 ; + Vcc3 = - Vbc + Vbb1 + Vb1c4 - Vc3c4 ; + Vbc3 = Vbc + Vcc3 ; + +`ifdef SUBSTRATE +Vsc4 = Vsc1 - Vc4c1 ; +Vsc3 = Vsc4 - Vc3c4 ; +`endif + + // Exponential bias terms `expLin(eVb2c2,Vb2c2 * VtINV) `expLin(eVb2e1,Vb2e1 * VtINV) `expLin(eVb1e1,Vb1e1 * VtINV) - `expLin(eVb1c1,Vb1c1 * VtINV) + `expLin(eVb1c4,Vb1c4 * VtINV) `expLin(eVb1b2,Vb1b2 * VtINV) - `expLin(eVbc1,Vbc1 * VtINV) + `expLin(eVbc3,Vbc3 * VtINV) `ifdef SUBSTRATE `expLin(eVsc1,Vsc1 * VtINV) `endif - `expLin(eVbc1VDC,(Vbc1 - VDC_T) * VtINV) - `expLin(eVb1c1VDC,(Vb1c1 - VDC_T) * VtINV) + `expLin(eVbc3VDC,(Vbc3 - VDC_T) * VtINV) + `expLin(eVb1c4VDC,(Vb1c4 - VDC_T) * VtINV) `expLin(eVb2c2VDC,(Vb2c2 - VDC_T) * VtINV) `expLin(eVb2c1VDC,(Vb2c1 - VDC_T) * VtINV) @@ -164,22 +204,22 @@ begin // Currents and sharges Ib1_s = XIBI * Ibf0 * (eVb1e1 - 1.0); `expLin(tmpExp,Vb2e1 * VtINV / MLF) Ib2 = IBF_TM * (tmpExp - 1.0) + GMIN * Vb2e1; - `expLin(tmpExp,0.5 * Vb1c1 * VtINV) - Ib3 = IBR_TM * (eVb1c1 - 1.0) / + `expLin(tmpExp,0.5 * Vb1c4 * VtINV) + Ib3 = IBR_TM * (eVb1c4 - 1.0) / (tmpExp + exp(0.5 * VLR * VtINV)) + - GMIN * Vb1c1; + GMIN * Vb1c4; // Iex, Isub (XIex, XIsub) - g1 = If0 * eVb1c1; - g2 = 4.0 * eVb1c1VDC; + g1 = If0 * eVb1c4; + g2 = 4.0 * eVb1c4VDC; nBex = g1 / (1.0 + sqrt(1.0 + g1)); pWex = g2 / (1.0 + sqrt(1.0 + g2)); Iex = (1.0 / BRI_T) * (0.5 * IK_TM * nBex - IS_TM); `ifdef SUBSTRATE - Isub = 2.0 * ISS_TM * (eVb1c1 - 1.0) / - (1.0 + sqrt(1.0 + 4.0 * (IS_TM / IKS_TM) * eVb1c1)); + Isub = 2.0 * ISS_TM * (eVb1c4 - 1.0) / + (1.0 + sqrt(1.0 + 4.0 * (IS_TM / IKS_TM) * eVb1c4)); Isf = ISS_TM * (eVsc1 - 1.0); `endif @@ -189,7 +229,8 @@ begin // Currents and sharges XIsub = 0.0; `endif - if (EXMOD == 1) begin + if (EXMOD == 1) + begin Iex = Iex * Xext1; @@ -197,32 +238,36 @@ begin // Currents and sharges Isub = Isub * Xext1; `endif - Xg1 = If0 * eVbc1; + Xg1 = If0 * eVbc3; XnBex = Xg1 / (1.0 + sqrt(1.0 + Xg1)); XIMex = XEXT * (0.5 * IK_TM * XnBex - IS_TM) / BRI_T; `ifdef SUBSTRATE - XIMsub = XEXT * 2.0 * ISS_TM * (eVbc1 - 1.0) / - (1.0 + sqrt(1.0 + 4.0 * IS_T / IKS_T * eVbc1)); - Vex_bias = XEXT * (IS_TM / BRI_T + ISS_TM) * RCC_TM; + XIMsub = XEXT * 2.0 * ISS_TM * (eVbc3 - 1.0) / + (1.0 + sqrt(1.0 + 4.0 * IS_T / IKS_T * eVbc3)); + Vex_bias = XEXT * (IS_TM / BRI_T + ISS_TM) * RCCxx_TM; `else XIMsub = 0.0; - Vex_bias = XEXT * (IS_TM / BRI_T) * RCC_TM; + Vex_bias = XEXT * (IS_TM / BRI_T) * RCCxx_TM; `endif Vex = Vt * (2.0 - ln( Vex_bias * VtINV)); - vdif = Vbc1 - Vex; + vdif = Vbc3 - Vex; `max_hyp0(VBex, vdif, 0.11); - Fex = VBex /(Vex_bias + (XIMex + XIMsub) * RCC_TM + VBex); + Fex = VBex /(Vex_bias + (XIMex + XIMsub) * RCCxx_TM + VBex); XIex = Fex * XIMex; `ifdef SUBSTRATE XIsub = Fex * XIMsub; `endif - - end - + end + else + begin + Fex = 0; + XnBex = 0 ; + end + // Variable base resistance q0Q = 1.0 + Vte / VER_T + Vtc / VEF_T; @@ -277,30 +322,35 @@ begin // Currents and sharges RE_TM / (RBC_TM + Rb2); Iavl = Ic1c2 * Gem / (Gem +Gem / Gmax + 1.0); end - -`ifdef SELFHEATING - // Power dissipation - + if (eVb2c2star > 0.0) Vb2c2star = Vt * ln(eVb2c2star); else Vb2c2star = Vb2c2; + +`ifdef SELFHEATING + // Power dissipation +// RvdT 03-12-2007, modified power equation due to distribution collector resistance + power = In * (Vb2e1 - Vb2c2star) + Ic1c2 * (Vb2c2star - Vb2c1) - - Iavl * Vb2c2star + - Vee1 * Vee1 / RE_TM + - Vcc1 * Vcc1 / RCC_TM + - Vbb1 * Vbb1 / RBC_TM + + Iavl * Vb2c2star + + Vee1 * Vee1 / RE_TM + + Vcc3 * Vcc3 * GCCxx_TM + + Vc3c4 * Vc3c4 * GCCex_TM + + Vc4c1 * Vc4c1 * GCCin_TM + + Vbb1 * Vbb1 / RBC_TM + Ib1b2 * Vb1b2 + (Ib1 + Ib2) * Vb2e1 + Ib1_s * Vb1e1 + `ifdef SUBSTRATE - (Iex + Isub + Ib3) * Vb1c1 + - (XIex + XIsub) * Vbc1 - - (XIsub + Isub - Isf) * Vsc1; + (Iex + Ib3) * Vb1c4 + XIex * Vbc3 + + Isub * (Vb1c4 - Vsc4) + + XIsub * (Vbc3 - Vsc3) + + Isf * Vsc1; `else - (Iex + Ib3) * Vb1c1 + XIex * Vbc1; + (Iex + Ib3) * Vb1c4 + XIex * Vbc3; `endif `endif @@ -320,16 +370,16 @@ begin // Currents and sharges Qbc_qs = 0.5 * Qb0 * nB * q1Q; a_VDC = 0.1 * VDC_T; - `min_logexp(Vjcex, Vb1c1, Vfc, a_VDC); + `min_logexp(Vjcex, Vb1c4, Vfc, a_VDC); Vtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - Vjcex / VDC_T, 1.0 - PC)) + - bjc * (Vb1c1 - Vjcex); - Qtex = CJC_TM * ((1.0 - XP_T) * Vtexv + XP_T * Vb1c1) * + bjc * (Vb1c4 - Vjcex); + Qtex = CJC_TM * ((1.0 - XP_T) * Vtexv + XP_T * Vb1c4) * (1.0 - XCJC) * (1.0 - XEXT); - `min_logexp(XVjcex, Vbc1, Vfc, a_VDC); + `min_logexp(XVjcex, Vbc3, Vfc, a_VDC); XVtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - XVjcex / VDC_T, 1.0 - PC)) + - bjc * (Vbc1 - XVjcex); - XQtex = CJC_TM * ((1.0 - XP_T) * XVtexv + XP_T * Vbc1) * + bjc * (Vbc3 - XVjcex); + XQtex = CJC_TM * ((1.0 - XP_T) * XVtexv + XP_T * Vbc3) * (1.0 - XCJC) * XEXT; `ifdef SUBSTRATE @@ -353,7 +403,7 @@ begin // Currents and sharges if (EXMOD == 1) begin Qex = Qex * (1.0 - XEXT); - Xg2 = 4.0 * eVbc1VDC; + Xg2 = 4.0 * eVbc3VDC; XpWex = Xg2 / (1.0 + sqrt(1.0 + Xg2)); XQex = 0.5 * Fex * XEXT * TAUR_T * (Qb0 * XnBex + Qepi0 * XpWex) / (TAUB_T + TEPI_T); @@ -397,8 +447,6 @@ begin // Currents and sharges I(c2, e1) <+ TYPE * In; I(b1, e1) <+ TYPE * Ib1_s; I(b2, e1) <+ TYPE * (Ib1 + Ib2); - I(b1, c1) <+ TYPE * (Ib3 + Iex); - I(b, c1) <+ TYPE * XIex; `ifdef SUBSTRATE I(b1, s) <+ TYPE * Isub; I(b, s) <+ TYPE * XIsub; @@ -407,9 +455,8 @@ begin // Currents and sharges I(b1, b2) <+ TYPE * Ib1b2; I(b2, c2) <+ TYPE * (-1.0 * Iavl); I(e, e1) <+ TYPE * Vee1 / RE_TM; - I(b, b1) <+ TYPE * Vbb1 / RBC_TM; - I(c, c1) <+ TYPE * Vcc1 / RCC_TM; - + I(b, b1) <+ TYPE * Vbb1 / RBC_TM; + `ifdef SELFHEATING // Electrical equivalent for the thermal network I(dt) <+ V(dt) / RTH_Tamb_M; @@ -428,8 +475,6 @@ begin // Currents and sharges I(b2, e1) <+ ddt(TYPE * (Qte + Qbe + Qe)); I(b1, e1) <+ ddt(TYPE * (Qte_s)); I(b2, c2) <+ ddt(TYPE * (Qtc + Qbc + Qepi)); - I(b1, c1) <+ ddt(TYPE * (Qtex + Qex)); - I(b, c1) <+ ddt(TYPE * (XQtex + XQex)); `ifdef SUBSTRATE I(s, c1) <+ ddt(TYPE * Qts); `endif @@ -438,6 +483,57 @@ begin // Currents and sharges I(b, c) <+ ddt(TYPE * CBCO_M * Vbc); end // Currents and charges + + +/* RvdT, Delft Univ. Tech. 03-12-2007. +Distribution of parasitic collector resistance. +This construct supports the case +RCBLI = 0.0 and or RCBLX = 0.0 . +It is up to the compiler to adjust the circuit topology +and perform a node-collapse in such cases. */ +if (RCBLX > 0.0) + begin + I(b, c3) <+ TYPE * XIex; + I(c, c3) <+ TYPE * Vcc3 * GCCxx_TM ; + I(b, c3) <+ ddt(TYPE * (XQtex + XQex)); + if (RCBLI > 0.0) + begin + I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM; + I(b1, c4) <+ TYPE * (Ib3 + Iex); + I(c3, c4) <+ TYPE * Vc3c4 * GCCex_TM ; + I(b1, c4) <+ ddt(TYPE * (Qtex + Qex)); + end + else + begin + V(c4, c1) <+ 0.0 ; + I(b1, c1) <+ TYPE * (Ib3 + Iex); + I(b1, c1) <+ ddt(TYPE * (Qtex + Qex)); + I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ; + end + end +else + begin + V(c3, c4) <+ 0 ; + if (RCBLI > 0.0) + begin + I(b, c4) <+ TYPE * XIex; + I(c, c4) <+ TYPE * Vcc3 * GCCxx_TM ; + I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM; + I(b1, c4) <+ TYPE * (Ib3 + Iex); + I(b1, c4) <+ ddt(TYPE * (Qtex + Qex)); + I(b, c4) <+ ddt(TYPE * (XQtex + XQex)); + end + else + begin + I(b, c1) <+ TYPE * XIex; + I(c, c1) <+ TYPE * Vcc3 * GCCxx_TM ; + V(c4, c1) <+ 0.0 ; + I(b1, c1) <+ TYPE * (Ib3 + Iex); + I(b1, c1) <+ ddt(TYPE * (Qtex + Qex)); + I(b, c1) <+ ddt(TYPE * (XQtex + XQex)); + I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ; + end + end // Noise sources @@ -447,7 +543,10 @@ begin // Currents and sharges common = 4.0 * `KB * Tk; powerREC = common / RE_TM; // Emitter resistance powerRBC = common / RBC_TM; // Base resistance - powerRCC = common / RCC_TM; // Collector resistance + // RvdT, 03-12-2007: distributed collector resistance + powerRCCxx = common * GCCxx_TM; // Collector resistance + powerRCCex = common * GCCex_TM; // Collector resistance + powerRCCin = common * GCCin_TM; // Collector resistance powerRBV = common / Rb2 * (4.0 * eVb1b2 + 5.0) / 3.0; // Variable base resistance // Collector current shot noise @@ -486,15 +585,17 @@ begin // Currents and sharges powerSubsCS_BS = 2.0 * `QQ * abs(XIsub); `endif + // Noise due to the avalanche - twoqIavl = KAVL * 2.0 * `QQ * Iavl; + // twoqIavl = KAVL * 2.0 * `QQ * Iavl; + twoqIavl = KAVL*Gem*powerCCS; powerCCS_A = powerCCS + twoqIavl * (3.0 + 2.0 * Gem - (2.0 + 2.0 * Gem)*(2.0 + 2.0 * Gem)/(1.0 + 2.0 * Gem) ); // Add noise sources I(e, e1) <+ white_noise(powerREC); // "emitter resistance" I(b, b1) <+ white_noise(powerRBC); // "base resistance" - I(c, c1) <+ white_noise(powerRCC); // "collector resistance" + I(b1, b2) <+ white_noise(powerRBV); // "variable baseresistance" I(noi, e1) <+ white_noise(twoqIavl); // "avalanche" @@ -515,5 +616,41 @@ begin // Currents and sharges I(b1, s) <+ white_noise(powerSubsCS_B1S); // "bas_sub_current" I(b, s) <+ white_noise(powerSubsCS_BS); // "bas_sub_current" `endif + +/* RvdT, Delft University of Technology 03-12-2007, +Noise voltage associated with distributed parasitic collector. +In case of vanishing resistance corresponding node +is not addressed: */ + + // RvdT, 31-01-2007: distributed collector resistance + +if (RCBLX > 0.0) + begin + if (RCBLI > 0.0) + begin /* all branches exist */ + I(c, c3) <+ white_noise(powerRCCxx); // "collector plug resistance" + I(c3, c4) <+ white_noise(powerRCCex); // "extrinsic collector BL resistance" + I(c4, c1) <+ white_noise(powerRCCin); // "intrinsic collector BL resistance" + end + else + begin /* only Rcblx exists */ + I(c, c3) <+ white_noise(powerRCCxx); // "collector plug resistance" + I(c3, c1) <+ white_noise(powerRCCex); // "extrinsic collector BL resistance" + end + end +else + begin + if (RCBLI > 0.0) + begin /* only Rcbli exists */ + I(c, c4) <+ white_noise(powerRCCxx); // "collector plug resistance" + I(c4, c1) <+ white_noise(powerRCCin); // "intrinsic collector BL resistance" + end + else + begin /* neither Rcblx nor Rcbli exists */ + I(c, c1) <+ white_noise(powerRCCxx); // "collector plug resistance" + end + end + end // Noise sources + diff --git a/src/spicelib/devices/adms/mextram/admsva/frontdef.inc b/src/spicelib/devices/adms/mextram/admsva/frontdef.inc index b67eb4070..e6ec301db 100644 --- a/src/spicelib/devices/adms/mextram/admsva/frontdef.inc +++ b/src/spicelib/devices/adms/mextram/admsva/frontdef.inc @@ -14,7 +14,18 @@ `define AJC 2.0 `define AJS 2.0 `define VEXLIM 200.0 - +`define PI 3.1415926 + +// Desriptions and units +`ifdef __VAMS_COMPACT_MODELING__ + `define OPP(nam,uni,des) (* desc="des", units="uni" *) real nam; + `define PAR(des,uni) (* desc="des", units="uni" *) parameter real + `define PAI(des,uni) (* desc="des", units="uni" *) parameter integer +`else + `define OPP(nam,uni,des) + `define PAR(des,uni) parameter real + `define PAI(des,uni) parameter integer +`endif // ADMS specific definitions `ifdef insideADMS diff --git a/src/spicelib/devices/adms/mextram/admsva/mextram.va b/src/spicelib/devices/adms/mextram/admsva/mextram.va index 8a40c21f7..2421525aa 100644 --- a/src/spicelib/devices/adms/mextram/admsva/mextram.va +++ b/src/spicelib/devices/adms/mextram/admsva/mextram.va @@ -1,8 +1,9 @@ `include "frontdef.inc" +`define SELFHEATING `define SUBSTRATE -module bjt504_va (c, b, e, s); - +module bjt504_va (c, b, e, s, dt); + `ifdef insideADMS `define P(p) (*p*) `else @@ -10,12 +11,13 @@ module bjt504_va (c, b, e, s); `endif // External ports - inout c, b, e, s; - + inout c, b, e, s, dt; + electrical c `P(info="external collector node"); electrical b `P(info="external base node"); electrical e `P(info="external emitter node"); electrical s `P(info="external substrate node"); + electrical dt `P(info="external thermal node"); // Internal nodes electrical c1 `P(info="internal collector node 1"); @@ -23,26 +25,30 @@ module bjt504_va (c, b, e, s); electrical b1 `P(info="internal base node 1"); electrical b2 `P(info="internal base node 2"); electrical c2 `P(info="internal collector node 2"); + electrical c3 `P(info="internal collector node 3"); + electrical c4 `P(info="internal collector node 4"); // For correlated noise implementation electrical noi `P(info="internal noise node"); - + `include "parameters.inc" `include "variables.inc" +`include "opvars.inc" analog begin -`ifdef insideADMS - @(initial_model) begin -`else - @(initial_step or initial_step("static")) begin -`endif +//`ifdef insideADMS +// @(initial_model) begin +//`else +// @(initial_step or initial_step("static")) begin +//`endif `include "initialize.inc" `include "tscaling.inc" - end // initial_step +// end // initial_step `include "evaluate.inc" +`include "opinfo.inc" end // analog endmodule diff --git a/src/spicelib/devices/adms/mextram/admsva/parameters.inc b/src/spicelib/devices/adms/mextram/admsva/parameters.inc index ef46846f2..e674d65a1 100644 --- a/src/spicelib/devices/adms/mextram/admsva/parameters.inc +++ b/src/spicelib/devices/adms/mextram/admsva/parameters.inc @@ -5,7 +5,7 @@ parameter integer LEVEL = 504 from [504:505) parameter real TREF = 25.0 from [-273.0:inf) `ATTR(info="Reference temperature"); parameter real DTA = 0.0 - `ATTR(info="Difference between the local and global ambient temperatures"); + `ATTR(info="Difference between the local and global ambient temperatures"); parameter integer EXMOD = 1 from [0:1] `ATTR(info="Flag for extended modeling of the reverse current gain"); parameter integer EXPHI = 1 from [0:1] @@ -44,18 +44,20 @@ parameter real VAVL = 3.0 from [0.01:inf) `ATTR(info="Voltage determining curvature of avalanche current"); parameter real SFH = 0.3 from [0.0:inf) `ATTR(info="Current spreading factor of avalanche model when EXAVL=1"); - -parameter real RE = 5.0 from [1.0u:inf) +// RvdT, 22-02-2008: for MXT 504.7 +// increased lower clipping values RE, RBC, RBV, RCC, RCV, SCRCV +// from 1u to 1m: +parameter real RE = 5.0 from [1.0m:inf) `ATTR(info="Emitter resistance"); -parameter real RBC = 23.0 from [1.0u:inf) +parameter real RBC = 23.0 from [1.0m:inf) `ATTR(info="Constant part of the base resistance"); -parameter real RBV = 18.0 from [1.0u:inf) +parameter real RBV = 18.0 from [1.0m:inf) `ATTR(info="Zero-bias value of the variable part of the base resistance"); -parameter real RCC = 12.0 from [1.0u:inf) +parameter real RCC = 12.0 from [1.0m:inf) `ATTR(info="Constant part of the collector resistance"); -parameter real RCV = 150.0 from [1.0u:inf) +parameter real RCV = 150.0 from [1.0m:inf) `ATTR(info="Resistance of the un-modulated epilayer"); -parameter real SCRCV = 1250.0 from [1.0u:inf) +parameter real SCRCV = 1250.0 from [1.0m:inf) `ATTR(info="Space charge resistance of the epilayer"); parameter real IHC = 4.0m from [1.0p:inf) `ATTR(info="Critical current for velocity saturation in the epilayer"); @@ -85,6 +87,12 @@ parameter real MC = 0.5 from [0.0:1.0) `ATTR(info="Coefficient for current modulation of CB depletion capacitance"); parameter real XCJC = 32.0m from [0.0:1.0] `ATTR(info="Fraction of CB depletion capacitance under the emitter"); +// RvdT, 30-11-2007: introduced RCBLX and RCBLI: +//dw clipped to 1m and default to 1 Ohm as long adms-ngspice has no working node-collapsing +parameter real RCBLX = 1.0 from [1.0m:inf) + `ATTR(info="Resistance Collector Buried Layer eXtrinsic"); +parameter real RCBLI = 1.0 from [1.0m:inf) + `ATTR(info="Resistance Collector Buried Layer Intrinsic"); parameter real CBCO = 0.0 from [0.0:inf) `ATTR(info="Collector-base overlap capacitance"); @@ -94,7 +102,7 @@ parameter real TAUE = 2.0p from [0.0:inf) `ATTR(info="Minimum transit time of stored emitter charge"); parameter real TAUB = 4.2p from (0.0:inf) `ATTR(info="Transit time of stored base sharge"); -parameter real TEPI = 41.0p from (0.0:inf) +parameter real TEPI = 41.0p from [0.0:inf) `ATTR(info="Transit time of stored epilayer charge"); parameter real TAUR = 520.0p from [0.0:inf) `ATTR(info="Transit time of reverse extrinsic stored base charge"); @@ -115,7 +123,10 @@ parameter real AEPI = 2.5 parameter real AEX = 0.62 `ATTR(info="Temperature coefficient of the resistivity of the extrinsic base"); parameter real AC = 2.0 - `ATTR(info="Temperature coefficient of the resistivity of the buried layer"); + `ATTR(info="Temperature coefficient of the resistivity of the collector contact"); +// RvdT, 30-01-2007: introduced ACBL +parameter real ACBL = 2.0 from [0.0:inf) + `ATTR(info="Temperature coefficient of the resistivity of the collector buried layer"); parameter real DVGBF = 50.0m `ATTR(info="Band-gap voltage difference of the forward current gain"); parameter real DVGBR = 45.0m diff --git a/src/spicelib/devices/adms/mextram/admsva/tscaling.inc b/src/spicelib/devices/adms/mextram/admsva/tscaling.inc index 1857aa382..3112f7455 100644 --- a/src/spicelib/devices/adms/mextram/admsva/tscaling.inc +++ b/src/spicelib/devices/adms/mextram/admsva/tscaling.inc @@ -61,7 +61,12 @@ RE_T = RE * pow(tN, AE); RBV_T = RBV * pow(tN, AB - AQBO); RBC_T = RBC * pow(tN, AEX); - RCC_T = RCC * pow(tN, AC); + +// RvdT, 30-11-2007: new collector resistances RCCxx_T, RCCex_T, RCCin_T + RCCxx_T = RCC * pow(tN, AC); + RCCex_T = RCBLX * pow(tN, ACBL); + RCCin_T = RCBLI * pow(tN, ACBL); + RCV_T = RCV * pow(tN, AEPI); // Current gains @@ -80,7 +85,7 @@ `ifdef SUBSTRATE ISS_T = ISS * pow(tN, 4.0 - AS) * exp(-VGS * VdtINV); - if (ISS_T > 0.0) + if ((ISS_T > 0.0)) IKS_T = IKS * pow(tN, 1.0 - AS) * (IS_T / IS) * (ISS / ISS_T); else IKS_T = IKS * pow(tN, 1.0 - AS); @@ -95,9 +100,17 @@ // Avalanche constant - Tk300 = Tk - 300.0; - BnT = Bn * (1.0 + 7.2e-4 * Tk300 - 1.6e-6 * Tk300 * Tk300); - + Tk300 = Tk - 300.0; +// RvdT, 15-02-2008: prevent division by zero and overflow at high temperatures: + if (Tk < 525.0) + begin + BnT = Bn * (1.0 + 7.2e-4 * Tk300 - 1.6e-6 * Tk300 * Tk300) ; + end + else + begin + BnT = Bn * 1.081 ; + end + // Heterojunction features DEG_T = DEG * pow(tN, AQBO); @@ -129,11 +142,41 @@ RE_TM = RE_T * invMULT; RBC_TM = RBC_T * invMULT; RBV_TM = RBV_T * invMULT; - RCC_TM = RCC_T * invMULT; +// RvdT, 30-01-2007: new collector resistances: + RCCxx_TM = RCCxx_T * invMULT; + RCCex_TM = RCCex_T * invMULT; + RCCin_TM = RCCin_T * invMULT; RCV_TM = RCV_T * invMULT; + +// RvdT, 03-12-2007: new collector conductances + if (RCC > 0.0) + begin + GCCxx_TM = 1.0 / RCCxx_TM ; + end + else + begin + GCCxx_TM = 0 ; + end + + if (RCBLX > 0.0) + begin + GCCex_TM = 1.0 / RCCex_TM ; + end + else + begin + GCCex_TM = 0 ; + end + + if (RCBLI > 0.0) + begin + GCCin_TM = 1.0 / RCCin_TM ; + end + else + begin + GCCin_TM = 0 ; + end + `ifdef SELFHEATING RTH_Tamb_M = RTH_Tamb * invMULT; `endif - - diff --git a/src/spicelib/devices/adms/mextram/admsva/variables.inc b/src/spicelib/devices/adms/mextram/admsva/variables.inc index fd31584ec..f77389792 100644 --- a/src/spicelib/devices/adms/mextram/admsva/variables.inc +++ b/src/spicelib/devices/adms/mextram/admsva/variables.inc @@ -14,7 +14,10 @@ real UdeT, VDE_T, UdcT, VDC_T; real CJE_T, CJC_T, XP_T; real CJCscale, CJCscaleINV; -real RE_T, RBV_T, RBC_T, RCC_T, RCV_T; +real RE_T, RBV_T, RBC_T, RCV_T; +// RvdT: 30-01-2007, new collector resistances: +real RCCxx_T, RCCex_T, RCCin_T; + real BF_T, BRI_T; real IS_T, IK_T, IBF_T, IBR_T, VEF_T, VER_T; @@ -36,7 +39,13 @@ real invMULT; real IS_TM, IK_TM, IBF_TM, IBR_TM, IHC_M; real CJE_TM, CJC_TM; -real RE_TM, RBC_TM, RBV_TM, RCC_TM, RCV_TM, SCRCV_M; +real RE_TM, RBC_TM, RBV_TM, RCV_TM, SCRCV_M; +// RvdT: 30-01-2007, new collector resistances: +real RCCxx_TM, RCCex_TM, RCCin_TM; +// RvdT: 03-12-2007, new collector conductances: +real GCCxx_TM, GCCex_TM, GCCin_TM; + + real KF_M, KFN_M; `ifdef SELFHEATING @@ -53,7 +62,7 @@ real ISS_TM, IKS_TM, CJS_TM; real K0, Kw, pW, Ec, Ic1c2; real Vqs_th, Vqs, Iqs; real alpha, vyi, yi, xi_w, xi_w1; -real gp0, gp02, p0star, eVb2c2star; +real gp0, gp02, p0star, Vb2c2star, eVb2c2star; real B1, B2, Vxi0, Vch, Icap, pav; // Effective emitter and collector junction bias variables @@ -92,7 +101,7 @@ real lambda, Gem, Gmax, Iavl; real Icap_IHC; `ifdef SELFHEATING -real Vb2c2star, power; +real power; `endif // Charges and capacitances variables @@ -114,10 +123,16 @@ real CBEO_M, CBCO_M; // Biases and exponential terms variables -real Vb2c1, Vb2c2, Vb2e1, Vb1e1, Vb1b2, Vb1c1, Vc1c2; -real Vsc1, Vee1, Vbb1, Vbc1, Vcc1, Vbe, Vbc; -real eVb2c2, eVb2e1, eVb1e1, eVb1b2, eVb1c1, eVbc1, eVsc1; -real eVb1c1VDC, eVb2c2VDC, eVbc1VDC, eVb2c1VDC; +real Vb2c1, Vb2c2, Vb2e1, Vb1e1, Vb1b2, Vb1c4, Vc1c2; +// RvdT, 30-01-2007: new variables Vc3c4, Vc4c1 +real Vc3c4, Vc4c1; +// RvdT, 25-02-2008: new variables Vsc3, Vsc4 +`ifdef SUBSTRATE +real Vsc1, Vsc3, Vsc4; +`endif +real Vee1, Vbb1, Vbc3, Vcc3, Vbe, Vbc; +real eVb2c2, eVb2e1, eVb1e1, eVb1b2, eVb1c4, eVbc3, eVsc1; +real eVb1c4VDC, eVb2c2VDC, eVbc3VDC, eVb2c1VDC; // Help variables @@ -138,7 +153,7 @@ real a_VDS; // Noise variables real common; -real powerREC, powerRBC, powerRCC, powerRBV; +real powerREC, powerRBC, powerRCCxx, powerRCCex, powerRCCin, powerRBV; real powerCCS; real powerFBCS, powerFBC1fB1, exponentFBC1fB2, powerFBC1fB2; real powerEBSCS, powerEBSC1f; diff --git a/tests/adms/mextram/mex_gum.sp b/tests/adms/mextram/mex_gum.sp index a2b45abec..ab3ac38b3 100644 --- a/tests/adms/mextram/mex_gum.sp +++ b/tests/adms/mextram/mex_gum.sp @@ -37,6 +37,8 @@ plot abs(i(vc))/abs(i(vb)) vs abs(-i(vc)) xlog xlimit 1e-09 10e-3 ylimit 0 150 +RE=949.668E-03 +RBC=27.769E+00 +RBV=32.004E+00 ++RCBLX=1.0 ++RCBLI=1.0 +RCC=18.026E+00 +RCV=237.417E+00 +SCRCV=882.839E+00 diff --git a/tests/adms/mextram/mex_out.sp b/tests/adms/mextram/mex_out.sp index cce762b73..aa54b67f0 100644 --- a/tests/adms/mextram/mex_out.sp +++ b/tests/adms/mextram/mex_out.sp @@ -36,6 +36,8 @@ plot abs(i(vc)) +RE=949.668E-03 +RBC=27.769E+00 +RBV=32.004E+00 ++RCBLX=1.0 ++RCBLI=1.0 +RCC=18.026E+00 +RCV=237.417E+00 +SCRCV=882.839E+00