diff --git a/src/frontend/inpdeg.c b/src/frontend/inpdeg.c index 76e6675cb..08ec96550 100644 --- a/src/frontend/inpdeg.c +++ b/src/frontend/inpdeg.c @@ -153,7 +153,13 @@ int readdegparams (struct card *deck) { Return number of degradation monitors, or 0 in case of error. */ int adddegmonitors(struct card* deck) { static int degmonno; - double tfuture = 315336e3; /* 10 years */ + double tfuture, dlimits; + if (!cp_getvar("deg_tfuture", CP_REAL, &tfuture, 0)) + tfuture = 315360e3; /* 10 years */ + fprintf(stdout, "Note: deg data extrapolated to %e seconds (%.1f years)\n", tfuture, tfuture / 31536e3); + if (!cp_getvar("deg_limits", CP_REAL, &dlimits, 0)) + dlimits = 1e-3; + fprintf(stdout, "Note: deg data lower limit is %e\n", dlimits); int nodes = 4; if (agemods[0].paramhash == NULL) return 1; @@ -214,8 +220,8 @@ int adddegmonitors(struct card* deck) { */ char* aline = tprintf("adegmon%d_%s %%v([%s]) mon%d degmon%d\n", degmonno, instname, fournodes, degmonno, degmonno); - char* mline = tprintf(".model degmon%d degmon (tfuture=%e %s devmod=\"%s\" instname=\"%s\"\n", - degmonno, tfuture, clength, modname, instname); + char* mline = tprintf(".model degmon%d degmon (tfuture=%e dlimits=%e %s devmod=\"%s\" instname=\"%s\"\n", + degmonno, tfuture, dlimits, clength, modname, instname); tfree(clength); insert_new_line(deck, aline, 0, deck->linenum_orig, deck->linesource); insert_new_line(deck, mline, 0, deck->linenum_orig, deck->linesource); diff --git a/src/xspice/icm/xtradev/degmonitor/cfunc.mod b/src/xspice/icm/xtradev/degmonitor/cfunc.mod index 8a7fb5915..c105639a0 100644 --- a/src/xspice/icm/xtradev/degmonitor/cfunc.mod +++ b/src/xspice/icm/xtradev/degmonitor/cfunc.mod @@ -288,6 +288,7 @@ void cm_degmon(ARGS) /* structure holding parms, double constfac; /* static storage of const factor in model equation */ double tfut; double tsim; + double dlimits; double deg; /* monitor output */ double sintegrand = 0; double sintegral; @@ -322,6 +323,7 @@ void cm_degmon(ARGS) /* structure holding parms, devmod = PARAM(devmod); tfut = PARAM(tfuture); devtype = PARAM(type); + dlimits = PARAM(dlimits); L = PARAM(L); tsim = TSTOP; @@ -469,7 +471,7 @@ void cm_degmon(ARGS) /* structure holding parms, /***************************/ sintegral = 1e99; // flag final time step /* only significant degradation */ - if (fabs(deg) < 1e-6) + if (fabs(deg) < dlimits) deg = 0.; loc->result[ii] = deg; } diff --git a/src/xspice/icm/xtradev/degmonitor/ifspec.ifs b/src/xspice/icm/xtradev/degmonitor/ifspec.ifs index c63aabe00..38a5ff153 100644 --- a/src/xspice/icm/xtradev/degmonitor/ifspec.ifs +++ b/src/xspice/icm/xtradev/degmonitor/ifspec.ifs @@ -65,14 +65,14 @@ Null_Allowed: yes no PARAMETER_TABLE: -Parameter_Name: type -Description: "model type PMOS, NMOS" -Data_Type: int -Default_Value: 1 -Limits: - -Vector: no -Vector_Bounds: - -Null_Allowed: yes +Parameter_Name: type dlimits +Description: "model type PMOS, NMOS" "degradation limits" +Data_Type: int real +Default_Value: 1 1e-3 +Limits: - - +Vector: no no +Vector_Bounds: - - +Null_Allowed: yes yes STATIC_VAR_TABLE: