mirror of
https://git.code.sf.net/p/ngspice/ngspice
synced 2026-08-22 05:47:42 +02:00
Revert "bsimcmg, adms workaround, transform Tempdep to a .va macro"
This commit is contained in:
@@ -41,6 +41,20 @@
|
|||||||
// ___Professor in Graduate School _______
|
// ___Professor in Graduate School _______
|
||||||
// ********************************************************
|
// ********************************************************
|
||||||
|
|
||||||
|
// Temperature Dependence Type
|
||||||
|
analog function real Tempdep;
|
||||||
|
input PARAML, PARAMT, DELTEMP, TEMPMOD;
|
||||||
|
real PARAML, PARAMT, DELTEMP, TEMPMOD;
|
||||||
|
|
||||||
|
begin
|
||||||
|
if (TEMPMOD != 0) begin
|
||||||
|
Tempdep = PARAML + `hypmax(PARAMT * DELTEMP, -PARAML, 1.0e-6);
|
||||||
|
end else begin
|
||||||
|
Tempdep = PARAML * `hypsmooth(1.0 + PARAMT * DELTEMP - 1.0e-6, 1.0e-3);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endfunction
|
||||||
|
|
||||||
// Node Definitions
|
// Node Definitions
|
||||||
`ifdef __RGATEMOD__
|
`ifdef __RGATEMOD__
|
||||||
`define GateEdgeNode ge
|
`define GateEdgeNode ge
|
||||||
@@ -2387,8 +2401,8 @@ analog begin
|
|||||||
dvch_qm = QMFACTOR_i * (E0 / `q + T2);
|
dvch_qm = QMFACTOR_i * (E0 / `q + T2);
|
||||||
|
|
||||||
// Temperature Dependence
|
// Temperature Dependence
|
||||||
ETA0_t = `Tempdep(ETA0_i, TETA0, delTemp, TEMPMOD);
|
ETA0_t = Tempdep(ETA0_i, TETA0, delTemp, TEMPMOD);
|
||||||
ETA0R_t = `Tempdep(ETA0R_i, TETA0R, delTemp, TEMPMOD);
|
ETA0R_t = Tempdep(ETA0R_i, TETA0R, delTemp, TEMPMOD);
|
||||||
T1 = U0_i * pow(TRatio, UTE_i);
|
T1 = U0_i * pow(TRatio, UTE_i);
|
||||||
U0_t = T1 + `hypmax(UTL_i * delTemp, -0.9 * T1, 1.0e-4);
|
U0_t = T1 + `hypmax(UTL_i * delTemp, -0.9 * T1, 1.0e-4);
|
||||||
u0 = U0_t;
|
u0 = U0_t;
|
||||||
@@ -2398,7 +2412,7 @@ analog begin
|
|||||||
u0r = U0R_t;
|
u0r = U0R_t;
|
||||||
end
|
end
|
||||||
|
|
||||||
ETAMOB_t = `Tempdep(ETAMOB_i, EMOBT_i, delTemp, TEMPMOD);
|
ETAMOB_t = Tempdep(ETAMOB_i, EMOBT_i, delTemp, TEMPMOD);
|
||||||
UA_t = UA_i + `hypmax(UA1_i*delTemp, -UA_i, 1.0e-6);
|
UA_t = UA_i + `hypmax(UA1_i*delTemp, -UA_i, 1.0e-6);
|
||||||
if (ASYMMOD != 0) begin
|
if (ASYMMOD != 0) begin
|
||||||
UAR_t = UAR_i + `hypmax(UA1R_i * delTemp, -UAR_i, 1.0e-6);
|
UAR_t = UAR_i + `hypmax(UA1R_i * delTemp, -UAR_i, 1.0e-6);
|
||||||
@@ -2406,9 +2420,9 @@ analog begin
|
|||||||
|
|
||||||
if (BULKMOD != 0) begin
|
if (BULKMOD != 0) begin
|
||||||
if (TEMPMOD == 0) begin
|
if (TEMPMOD == 0) begin
|
||||||
UC_t = `Tempdep(UC_i, UC1_i, delTemp, 0);
|
UC_t = Tempdep(UC_i, UC1_i, delTemp, 0);
|
||||||
if (ASYMMOD != 0) begin
|
if (ASYMMOD != 0) begin
|
||||||
UCR_t = `Tempdep(UCR_i, UC1R_i, delTemp, 0);
|
UCR_t = Tempdep(UCR_i, UC1R_i, delTemp, 0);
|
||||||
end
|
end
|
||||||
end else begin
|
end else begin
|
||||||
UC_t = UC_i + UC1_i * delTemp;
|
UC_t = UC_i + UC1_i * delTemp;
|
||||||
@@ -2426,45 +2440,45 @@ analog begin
|
|||||||
UCS_t = UCS_i * pow(TRatio, UCSTE_i);
|
UCS_t = UCS_i * pow(TRatio, UCSTE_i);
|
||||||
|
|
||||||
rdstemp = `hypsmooth(1.0 + PRT_i * delTemp - 1.0e-6, 1.0e-3);
|
rdstemp = `hypsmooth(1.0 + PRT_i * delTemp - 1.0e-6, 1.0e-3);
|
||||||
RSDR_t = `Tempdep(RSDR, TRSDR, delTemp, TEMPMOD);
|
RSDR_t = Tempdep(RSDR, TRSDR, delTemp, TEMPMOD);
|
||||||
if (ASYMMOD != 0) begin
|
if (ASYMMOD != 0) begin
|
||||||
RSDRR_t = `Tempdep(RSDRR, TRSDR, delTemp, TEMPMOD);
|
RSDRR_t = Tempdep(RSDRR, TRSDR, delTemp, TEMPMOD);
|
||||||
end
|
end
|
||||||
|
|
||||||
RDDR_t = `Tempdep(RDDR, TRDDR, delTemp, TEMPMOD);
|
RDDR_t = Tempdep(RDDR, TRDDR, delTemp, TEMPMOD);
|
||||||
if (ASYMMOD != 0) begin
|
if (ASYMMOD != 0) begin
|
||||||
RDDRR_t = `Tempdep(RDDRR, TRDDR, delTemp, TEMPMOD);
|
RDDRR_t = Tempdep(RDDRR, TRDDR, delTemp, TEMPMOD);
|
||||||
end
|
end
|
||||||
|
|
||||||
VSAT_t = `Tempdep(VSAT_i, -AT_i, delTemp, TEMPMOD);
|
VSAT_t = Tempdep(VSAT_i, -AT_i, delTemp, TEMPMOD);
|
||||||
if (VSAT_t < 1000) begin
|
if (VSAT_t < 1000) begin
|
||||||
$strobe("Warning: VSAT(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT_t);
|
$strobe("Warning: VSAT(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT_t);
|
||||||
VSAT_t = 1000;
|
VSAT_t = 1000;
|
||||||
end
|
end
|
||||||
|
|
||||||
if (ASYMMOD != 0) begin
|
if (ASYMMOD != 0) begin
|
||||||
VSATR_t = `Tempdep(VSATR_i, -ATR_i, delTemp, TEMPMOD);
|
VSATR_t = Tempdep(VSATR_i, -ATR_i, delTemp, TEMPMOD);
|
||||||
if (VSATR_t < 1000) begin
|
if (VSATR_t < 1000) begin
|
||||||
$strobe("Warning: VSATR(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSATR_t);
|
$strobe("Warning: VSATR(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSATR_t);
|
||||||
VSATR_t = 1000;
|
VSATR_t = 1000;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
VSAT1_t = `Tempdep(VSAT1_i, -AT_i, delTemp, TEMPMOD);
|
VSAT1_t = Tempdep(VSAT1_i, -AT_i, delTemp, TEMPMOD);
|
||||||
if (VSAT1_t < 1000) begin
|
if (VSAT1_t < 1000) begin
|
||||||
$strobe("Warning: VSAT1(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT1_t);
|
$strobe("Warning: VSAT1(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT1_t);
|
||||||
VSAT1_t = 1000;
|
VSAT1_t = 1000;
|
||||||
end
|
end
|
||||||
|
|
||||||
if (ASYMMOD != 0) begin
|
if (ASYMMOD != 0) begin
|
||||||
VSAT1R_t = `Tempdep(VSAT1R_i, -AT_i, delTemp, TEMPMOD);
|
VSAT1R_t = Tempdep(VSAT1R_i, -AT_i, delTemp, TEMPMOD);
|
||||||
if (VSAT1R_t < 1000) begin
|
if (VSAT1R_t < 1000) begin
|
||||||
$strobe("Warning: VSAT1R(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT1R_t);
|
$strobe("Warning: VSAT1R(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSAT1R_t);
|
||||||
VSAT1R_t = 1000;
|
VSAT1R_t = 1000;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
VSATCV_t = `Tempdep(VSATCV_i, -ATCV_i, delTemp, TEMPMOD);
|
VSATCV_t = Tempdep(VSATCV_i, -ATCV_i, delTemp, TEMPMOD);
|
||||||
if (VSATCV_t < 1000) begin
|
if (VSATCV_t < 1000) begin
|
||||||
$strobe("Warning: VSATCV(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSATCV_t);
|
$strobe("Warning: VSATCV(%f) = %e is less than 1K, setting it to 1K.", DevTemp, VSATCV_t);
|
||||||
VSATCV_t = 1000;
|
VSATCV_t = 1000;
|
||||||
@@ -2475,9 +2489,9 @@ analog begin
|
|||||||
MEXPR_t = `hypsmooth(MEXPR_i * (1.0 + TMEXPR * delTemp) - 2.0, 1.0e-3) + 2.0;
|
MEXPR_t = `hypsmooth(MEXPR_i * (1.0 + TMEXPR * delTemp) - 2.0, 1.0e-3) + 2.0;
|
||||||
end
|
end
|
||||||
|
|
||||||
PTWG_t = `Tempdep(PTWG_i, -PTWGT_i, delTemp, TEMPMOD);
|
PTWG_t = Tempdep(PTWG_i, -PTWGT_i, delTemp, TEMPMOD);
|
||||||
if (ASYMMOD != 0) begin
|
if (ASYMMOD != 0) begin
|
||||||
PTWGR_t = `Tempdep(PTWGR_i, -PTWGT_i, delTemp, TEMPMOD);
|
PTWGR_t = Tempdep(PTWGR_i, -PTWGT_i, delTemp, TEMPMOD);
|
||||||
end
|
end
|
||||||
|
|
||||||
dvth_temp = (KT1_i + KT1L / Leff) * (TRatio - 1.0);
|
dvth_temp = (KT1_i + KT1L / Leff) * (TRatio - 1.0);
|
||||||
@@ -2509,12 +2523,12 @@ analog begin
|
|||||||
igsd_mult = igsd_mult0 * igtemp;
|
igsd_mult = igsd_mult0 * igtemp;
|
||||||
|
|
||||||
if (BULKMOD != 0) begin
|
if (BULKMOD != 0) begin
|
||||||
CJS_t = `Tempdep(CJS, TCJ, delTemp, TEMPMOD);
|
CJS_t = Tempdep(CJS, TCJ, delTemp, TEMPMOD);
|
||||||
CJD_t = `Tempdep(CJD, TCJ, delTemp, TEMPMOD);
|
CJD_t = Tempdep(CJD, TCJ, delTemp, TEMPMOD);
|
||||||
CJSWS_t = `Tempdep(CJSWS, TCJSW, delTemp, TEMPMOD);
|
CJSWS_t = Tempdep(CJSWS, TCJSW, delTemp, TEMPMOD);
|
||||||
CJSWD_t = `Tempdep(CJSWD, TCJSW, delTemp, TEMPMOD);
|
CJSWD_t = Tempdep(CJSWD, TCJSW, delTemp, TEMPMOD);
|
||||||
CJSWGS_t = `Tempdep(CJSWGS, TCJSWG, delTemp, TEMPMOD);
|
CJSWGS_t = Tempdep(CJSWGS, TCJSWG, delTemp, TEMPMOD);
|
||||||
CJSWGD_t = `Tempdep(CJSWGD, TCJSWG, delTemp, TEMPMOD);
|
CJSWGD_t = Tempdep(CJSWGD, TCJSWG, delTemp, TEMPMOD);
|
||||||
|
|
||||||
PBS_t = `hypsmooth(PBS - TPB * delTemp - 0.01, 1.0e-3) + 0.01;
|
PBS_t = `hypsmooth(PBS - TPB * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||||
PBD_t = `hypsmooth(PBD - TPB * delTemp - 0.01, 1.0e-3) + 0.01;
|
PBD_t = `hypsmooth(PBD - TPB * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||||
|
|||||||
@@ -80,12 +80,6 @@
|
|||||||
`define hypmax(x,xmin,c) \
|
`define hypmax(x,xmin,c) \
|
||||||
((xmin) + 0.5 * ((x) - (xmin) - (c) + sqrt(((x) - (xmin) - (c)) * ((x) - (xmin) - (c)) - 4.0 * (xmin) * (c))))
|
((xmin) + 0.5 * ((x) - (xmin) - (c) + sqrt(((x) - (xmin) - (c)) * ((x) - (xmin) - (c)) - 4.0 * (xmin) * (c))))
|
||||||
|
|
||||||
// Temperature Dependence Type
|
|
||||||
`define Tempdep(PARAML, PARAMT, DELTEMP, TEMPMOD) \
|
|
||||||
(((TEMPMOD) != 0) \
|
|
||||||
? ((PARAML) + `hypmax((PARAMT) * (DELTEMP), -(PARAML), 1.0e-6)) \
|
|
||||||
: ((PARAML) * `hypsmooth(1.0 + (PARAMT) * (DELTEMP) - 1.0e-6, 1.0e-3)))
|
|
||||||
|
|
||||||
|
|
||||||
// Mathematical functions
|
// Mathematical functions
|
||||||
//`define SINH(x) (0.5 * (`lexp(x) - `lexp(-(x))))
|
//`define SINH(x) (0.5 * (`lexp(x) - `lexp(-(x))))
|
||||||
|
|||||||
Reference in New Issue
Block a user