Browse Source

Update to release version 504.7 now with selfheating

pre-master-46
dwarning 17 years ago
parent
commit
9c7e45b1d7
  1. 24
      src/spicelib/devices/adms/hicum0/admsva/hicum0.va
  2. 18
      src/spicelib/devices/adms/hicum2/admsva/hicum2.va
  3. 44
      src/spicelib/devices/adms/mextram/admsva/COPYRIGHT_NOTICE
  4. 247
      src/spicelib/devices/adms/mextram/admsva/evaluate.inc
  5. 13
      src/spicelib/devices/adms/mextram/admsva/frontdef.inc
  6. 28
      src/spicelib/devices/adms/mextram/admsva/mextram.va
  7. 31
      src/spicelib/devices/adms/mextram/admsva/parameters.inc
  8. 59
      src/spicelib/devices/adms/mextram/admsva/tscaling.inc
  9. 33
      src/spicelib/devices/adms/mextram/admsva/variables.inc
  10. 2
      tests/adms/mextram/mex_gum.sp
  11. 2
      tests/adms/mextram/mex_out.sp

24
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

18
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

44
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.

247
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

13
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

28
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

31
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

59
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

33
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;

2
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

2
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

Loading…
Cancel
Save