diff --git a/src/spicelib/devices/adms/mextram/admsva/evaluate.inc b/src/spicelib/devices/adms/mextram/admsva/evaluate.inc index 6b7c05ae6..e7a01f9f3 100644 --- a/src/spicelib/devices/adms/mextram/admsva/evaluate.inc +++ b/src/spicelib/devices/adms/mextram/admsva/evaluate.inc @@ -28,6 +28,11 @@ begin // Currents and charges in case of vanishing resistance corresponding node is not addressed: */ +`ifdef insideADMS +//dw we have limited all the RCXXX to MIN_R + Vc4c1 = TYPE * V(c4, c1); + Vc3c4 = TYPE * V(c3, c4); +`else if (RCBLX > 0.0) begin if (RCBLI > 0.0) @@ -54,6 +59,7 @@ else Vc3c4 = 0 ; end end +`endif Vb1c4 = Vb1b2 + Vb2c2 - Vc1c2 - Vc4c1 ; Vcc3 = - Vbc + Vbb1 + Vb1c4 - Vc3c4 ; @@ -257,9 +263,9 @@ Vsc3 = Vsc4 - Vc3c4 ; // nBex since MXT 504.10.1: Ackn. Jos Peters, Geoffrey Coram nBex = (g1 - If0) / (1.0 + sqrt(1.0 + g1)); pWex = g2 / (1.0 + sqrt(1.0 + g2)); -/* Iex until and including MXT 504.9: - Iex = (1.0 / BRI_T) * (0.5 * IK_TM * nBex - IS_TM); -*/ +// Iex until and including MXT 504.9: +// Iex = (1.0 / BRI_T) * (0.5 * IK_TM * nBex - IS_TM); +// // Iex since MXT 504.10: RvdT@TUDelft Q1, 2011: Iex = IK_TM * nBex / (2.0 * BRI_T) ; @@ -295,7 +301,7 @@ if (ICSS < 0.0) XIsub = 0.0; `endif -/* begin: RvdT, Q4 2012, Mextram 504.11: added EXMOD=2 option: */ +// begin: RvdT, Q4 2012, Mextram 504.11: added EXMOD=2 option: if (EXMOD == 1 || EXMOD == 2) begin @@ -310,9 +316,9 @@ if (ICSS < 0.0) // XnBex = Xg1 / (1.0 + sqrt(1.0 + Xg1)); // XnBex in MXT 504.10.1: Ackn. Jos Peters, Geoffrey Coram: XnBex = (Xg1 - If0) / (1.0 + sqrt(1.0 + Xg1)); -/* XIMex until and including MXT 504.9: - XIMex = XEXT * (0.5 * IK_TM * XnBex - IS_TM) / BRI_T; -*/ +// XIMex until and including MXT 504.9: +// XIMex = XEXT * (0.5 * IK_TM * XnBex - IS_TM) / BRI_T; +// // XIMex in MXT 504.10: RvdT@TUDelft Q1, 2011: XIMex = XEXT * 0.5 * IK_TM * XnBex / BRI_T; @@ -592,11 +598,21 @@ 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 +`ifdef insideADMS +//dw we have limited all the RCXXX to MIN_R I(b, c3) <+ TYPE * XIex; I(c, c3) <+ TYPE * Vcc3 * GCCxx_TM ; I(b, c3) <+ ddt(TYPE * (XQtex + XQex)); + 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)); +`else + 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; @@ -635,4 +651,5 @@ else I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ; end end +`endif diff --git a/src/spicelib/devices/adms/mextram/admsva/frontdef.inc b/src/spicelib/devices/adms/mextram/admsva/frontdef.inc index 3ec6711ce..4098d7c89 100644 --- a/src/spicelib/devices/adms/mextram/admsva/frontdef.inc +++ b/src/spicelib/devices/adms/mextram/admsva/frontdef.inc @@ -22,6 +22,10 @@ `define AJS 2.0 `define VEXLIM 400.0 `define PI 3.1415926 +`ifdef insideADMS +//dw needed for RCXXX limiting + `define MIN_R 0.001 +`endif // Desriptions and units `ifdef __VAMS_COMPACT_MODELING__ @@ -34,9 +38,16 @@ `define PAI(des,uni) parameter integer `endif +// ADMS specific definitions +`ifdef insideADMS + `define MODEL @(initial_model) + `define INSTANCE @(initial_instance) + `define NOISE @(noise) +`else `define MODEL `define INSTANCE `define NOISE +`endif // Smooth limitting functions `define max_hyp0(result, x, epsilon)\ diff --git a/src/spicelib/devices/adms/mextram/admsva/tscaling.inc b/src/spicelib/devices/adms/mextram/admsva/tscaling.inc index f696fe305..401c87797 100644 --- a/src/spicelib/devices/adms/mextram/admsva/tscaling.inc +++ b/src/spicelib/devices/adms/mextram/admsva/tscaling.inc @@ -77,9 +77,25 @@ RBC_T = RBC * exp(lntN * AEX); // RvdT, 30-11-2007: new collector resistances RCCxx_T, RCCex_T, RCCin_T +`ifdef insideADMS +//dw limiting all the RCXXX to MIN_R + if (RCC > 0.0) + RCCxx_T = RCC * exp(lntN * AC); + else + RCCxx_T = `MIN_R * exp(lntN * AC); + if (RCBLX > 0.0) + RCCex_T = RCBLX * exp(lntN * ACBL); + else + RCCex_T = `MIN_R * exp(lntN * ACBL); + if (RCBLI > 0.0) + RCCin_T = RCBLI * exp(lntN * ACBL); + else + RCCin_T = `MIN_R * exp(lntN * ACBL); +`else RCCxx_T = RCC * exp(lntN * AC); RCCex_T = RCBLX * exp(lntN * ACBL); RCCin_T = RCBLI * exp(lntN * ACBL); +`endif RCV_T = RCV * exp(lntN * AEPI); @@ -207,6 +223,12 @@ // RvdT, 03-12-2007: new collector conductances +`ifdef insideADMS +//dw we have limited all the RCXXX to MIN_R + GCCxx_TM = 1.0 / RCCxx_TM ; + GCCex_TM = 1.0 / RCCex_TM ; + GCCin_TM = 1.0 / RCCin_TM ; +`else if (RCC > 0.0) begin GCCxx_TM = 1.0 / RCCxx_TM ; @@ -233,6 +255,7 @@ begin GCCin_TM = 0 ; end +`endif `ifdef SELFHEATING RTH_Tamb_M = RTH_Tamb * invMULT;