From 2cfffc5a243cc94aab20824b0a34821213d9bf66 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Sat, 8 Nov 2025 17:28:34 +0100 Subject: [PATCH] Pre-processor flag NEWTRUNC replaced by 'option newtrunc' stored in ->CKTnewtrunc Compiling with pre-processor flag PREDICTOR is required. --- configure.ac | 8 - src/frontend/com_option.c | 18 +- src/frontend/misccoms.c | 3 - src/include/ngspice/cktdefs.h | 10 +- src/include/ngspice/optdefs.h | 4 +- src/include/ngspice/tskdefs.h | 3 +- src/spicelib/analysis/cktdojob.c | 3 +- src/spicelib/analysis/cktntask.c | 11 +- src/spicelib/analysis/cktsopt.c | 17 +- src/spicelib/analysis/ckttrunc.c | 347 +++++++++++++------------- src/spicelib/devices/devsup.c | 17 +- src/xspice/icm/analog/delay/cfunc.mod | 9 +- visualc/src/include/ngspice/config.h | 3 - 13 files changed, 220 insertions(+), 233 deletions(-) diff --git a/configure.ac b/configure.ac index 1c5f7aafc..6ecd1a137 100644 --- a/configure.ac +++ b/configure.ac @@ -229,10 +229,6 @@ AC_ARG_ENABLE([predictor], AC_ARG_ENABLE([newpred], [AS_HELP_STRING([--enable-newpred], [Enable NEWPRED whatever it is(?)])]) -# --enable-newtrunc: define NEWTRUNC for the code -AC_ARG_ENABLE([newtrunc], - [AS_HELP_STRING([--enable-newtrunc], [Enable, how we want extrapolate capacitances.])]) - # --enable-sense2: define WANT_SENSE2 for the code AC_ARG_ENABLE([sense2], [AS_HELP_STRING([--enable-sense2], [Use spice2 sensitivity analysis.])]) @@ -1044,10 +1040,6 @@ if test "x$enable_newpred" = xyes; then AC_DEFINE([NEWPRED], [], [Define if you want to discover :)]) AC_MSG_RESULT([NEWPRED enabled]) fi -if test "x$enable_newtrunc" = xyes; then - AC_DEFINE([NEWTRUNC], [], [Do not trigger unwanted traps by default]) - AC_MSG_RESULT([New truncation error calculation enabled]) -fi if test "x$enable_experimental" = xyes; then AC_DEFINE([EXPERIMENTAL_CODE], [], [Define if we want some experimental code]) AC_MSG_RESULT([EXPERIMENTAL_CODE enabled]) diff --git a/src/frontend/com_option.c b/src/frontend/com_option.c index e4f1804fd..9e9dad477 100644 --- a/src/frontend/com_option.c +++ b/src/frontend/com_option.c @@ -77,14 +77,16 @@ com_option(wordlist *wl) printf("gminsteps = %d\n", circuit->CKTnumGminSteps); printf("srcsteps = %d\n", circuit->CKTnumSrcSteps); - printf("\nTruncation error correction:\n"); - printf("trtol = %f\n", circuit->CKTtrtol); -#ifdef NEWTRUNC - printf("ltereltol = %g\n", circuit->CKTlteReltol); - printf("lteabstol = %g\n", circuit->CKTlteAbstol); - printf("ltetrtol = %g\n", circuit->CKTlteTrtol); -#endif /* NEWTRUNC */ - + if (circuit->CKTnewtrunc) { + printf("\nTruncation error correction, voltage based, is selected:\n"); + printf("ltereltol = %g\n", circuit->CKTlteReltol); + printf("lteabstol = %g\n", circuit->CKTlteAbstol); + printf("ltetrtol = %g\n", circuit->CKTlteTrtol); + } + else { + printf("\nTruncation error correction, charge based, is selected:\n"); + printf("trtol = %f\n", circuit->CKTtrtol); + } printf("\nConductances:\n"); printf("gmin (devices) = %g\n", circuit->CKTgmin); printf("diaggmin (stepping) = %g\n", circuit->CKTdiagGmin); diff --git a/src/frontend/misccoms.c b/src/frontend/misccoms.c index b53a7c1e8..c3efbb9cb 100644 --- a/src/frontend/misccoms.c +++ b/src/frontend/misccoms.c @@ -274,9 +274,6 @@ com_version(wordlist *wl) #ifdef PREDICTOR fprintf(cp_out, "** --enable-predictor\n"); #endif -#ifdef NEWTRUNC - fprintf(cp_out, "** --enable-newtrunc\n"); -#endif #ifdef WANT_SENSE2 fprintf(cp_out, "** --enable-sense2\n"); #endif diff --git a/src/include/ngspice/cktdefs.h b/src/include/ngspice/cktdefs.h index 92f57e8d0..004faf6e6 100644 --- a/src/include/ngspice/cktdefs.h +++ b/src/include/ngspice/cktdefs.h @@ -217,12 +217,10 @@ struct CKTcircuit { double CKTreltol; /* --- */ double CKTchgtol; /* --- */ double CKTvoltTol; /* --- */ - /* What is this define for ? */ -#ifdef NEWTRUNC - double CKTlteReltol; - double CKTlteAbstol; - double CKTlteTrtol; -#endif /* NEWTRUNC */ + double CKTlteReltol; /* relative error in voltage based truncation error estimation */ + double CKTlteAbstol; /* absolute error in voltage based truncation error estimation */ + double CKTlteTrtol; /* scaling time step in voltage based truncation error estimation */ + int CKTnewtrunc; /* enable lte (local truncation error) based on voltages */ double CKTgmin; /* .options GMIN */ double CKTgshunt; /* .options RSHUNT */ double CKTcshunt; /* .options CSHUNT */ diff --git a/src/include/ngspice/optdefs.h b/src/include/ngspice/optdefs.h index 07dc8a90d..25d61eebd 100644 --- a/src/include/ngspice/optdefs.h +++ b/src/include/ngspice/optdefs.h @@ -132,12 +132,10 @@ enum { OPT_KLU_MEMGROW_FACTOR, #endif -#ifdef NEWTRUNC OPT_LTERELTOL, OPT_LTEABSTOL, OPT_LTETRTOL, -#endif - + OPT_NEWTRUNC, }; #ifdef XSPICE diff --git a/src/include/ngspice/tskdefs.h b/src/include/ngspice/tskdefs.h index 588633b79..f59ccec9b 100644 --- a/src/include/ngspice/tskdefs.h +++ b/src/include/ngspice/tskdefs.h @@ -48,11 +48,10 @@ struct TSKtask { double TSKreltol; double TSKchgtol; double TSKvoltTol; -#ifdef NEWTRUNC double TSKlteReltol; double TSKlteAbstol; double TSKlteTrtol; -#endif /* NEWTRUNC */ + unsigned int TSKnewtrunc:1; /* voltage controlled truncation */ double TSKgmin; double TSKgshunt; /* shunt conductance (CKTdiagGmin) */ double TSKcshunt; /* shunt capacitor to ground */ diff --git a/src/spicelib/analysis/cktdojob.c b/src/spicelib/analysis/cktdojob.c index c96d7cc04..5ec0263ff 100644 --- a/src/spicelib/analysis/cktdojob.c +++ b/src/spicelib/analysis/cktdojob.c @@ -114,11 +114,10 @@ CKTdoJob(CKTcircuit* ckt, int reset, TSKtask* task) ckt->CKTkluMemGrowFactor = task->TSKkluMemGrowFactor ; #endif -#ifdef NEWTRUNC ckt->CKTlteReltol = task->TSKlteReltol; ckt->CKTlteAbstol = task->TSKlteAbstol; ckt->CKTlteTrtol = task->TSKlteTrtol; -#endif /* NEWTRUNC */ + ckt->CKTnewtrunc = task->TSKnewtrunc; fprintf(stdout, "Doing analysis at TEMP = %f and TNOM = %f\n\n", ckt->CKTtemp - CONSTCtoK, ckt->CKTnomTemp - CONSTCtoK); diff --git a/src/spicelib/analysis/cktntask.c b/src/spicelib/analysis/cktntask.c index 8b6a1122f..b0667ce8d 100644 --- a/src/spicelib/analysis/cktntask.c +++ b/src/spicelib/analysis/cktntask.c @@ -82,12 +82,10 @@ CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr) tsk->TSKkluMemGrowFactor = def->TSKkluMemGrowFactor ; #endif -#ifdef NEWTRUNC tsk->TSKlteReltol = def->TSKlteReltol; tsk->TSKlteAbstol = def->TSKlteAbstol; tsk->TSKlteTrtol = def->TSKlteTrtol; -#endif - + tsk->TSKnewtrunc = def->TSKnewtrunc; } else { #endif /*CDHW*/ @@ -99,12 +97,11 @@ CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr) tsk->TSKreltol = 1e-3; tsk->TSKchgtol = 1e-14; tsk->TSKvoltTol = 1e-6; -#ifdef NEWTRUNC tsk->TSKlteReltol = 1e-3; tsk->TSKlteAbstol = 1e-6; - tsk->TSKlteTrtol = 7; -#endif - tsk->TSKtrtol = 7; + tsk->TSKlteTrtol = 7.; + tsk->TSKnewtrunc = 0; + tsk->TSKtrtol = 7.; tsk->TSKbypass = 0; tsk->TSKtranMaxIter = 10; tsk->TSKdcMaxIter = 100; diff --git a/src/spicelib/analysis/cktsopt.c b/src/spicelib/analysis/cktsopt.c index 307b615d5..8a1e60b30 100644 --- a/src/spicelib/analysis/cktsopt.c +++ b/src/spicelib/analysis/cktsopt.c @@ -187,7 +187,6 @@ CKTsetOpt(CKTcircuit *ckt, JOB *anal, int opt, IFvalue *val) task->TSKkluMemGrowFactor = (val->rValue == 1.2); break; #endif -#ifdef NEWTRUNC case OPT_LTERELTOL: task->TSKlteReltol = val->rValue; break; @@ -197,8 +196,15 @@ CKTsetOpt(CKTcircuit *ckt, JOB *anal, int opt, IFvalue *val) case OPT_LTETRTOL: task->TSKlteTrtol = val->rValue; break; + case OPT_NEWTRUNC: +#ifdef PREDICTOR + task->TSKnewtrunc = (val->iValue != 0); +#else + task->TSKnewtrunc = 0; + fprintf(stderr, "Warning: Option 'newtrunc' ignored,\n" + " compilation with preprocessor flag 'PREDICTOR' is required.\n"); #endif - + break; /* gtri - begin - wbk - add new options */ #ifdef XSPICE case OPT_EVT_MAX_OP_ALTER: @@ -241,7 +247,7 @@ CKTsetOpt(CKTcircuit *ckt, JOB *anal, int opt, IFvalue *val) ckt->enh->rshunt_data.gshunt = 1.0 / val->rValue; } else { - printf("WARNING - Rshunt option too small. Ignored.\n"); + fprintf(stderr, "WARNING - Rshunt option too small. Ignored.\n"); } break; #endif @@ -367,11 +373,10 @@ static IFparm OPTtbl[] = { "KLU Memory Grow Factor (default is 1.2)" }, #endif -#ifdef NEWTRUNC { "ltereltol", OPT_LTERELTOL,IF_SET | IF_REAL ,"Relative error tolerence" }, { "lteabstol", OPT_LTEABSTOL,IF_SET | IF_REAL,"Absolute error tolerence" }, - { "ltetrtol", OPT_LTETRTOL,IF_SET | IF_REAL,"Truncation error overestimation factor" } -#endif + { "ltetrtol", OPT_LTETRTOL,IF_SET | IF_REAL,"Truncation error overestimation factor" }, + { "newtrunc", OPT_NEWTRUNC,IF_SET | IF_FLAG,"voltage controlled truncation" } }; diff --git a/src/spicelib/analysis/ckttrunc.c b/src/spicelib/analysis/ckttrunc.c index 6dc508786..2d2e0e866 100644 --- a/src/spicelib/analysis/ckttrunc.c +++ b/src/spicelib/analysis/ckttrunc.c @@ -19,107 +19,189 @@ Author: 1985 Thomas L. Quarles int CKTtrunc(CKTcircuit *ckt, double *timeStep) { -#ifndef NEWTRUNC - int i; - double timetemp; + if (ckt->CKTnewtrunc == 0) { + int i; + double timetemp; #ifdef STEPDEBUG - double debugtemp; + double debugtemp; #endif /* STEPDEBUG */ - double startTime; - int error = OK; + double startTime; + int error = OK; - startTime = SPfrontEnd->IFseconds(); + startTime = SPfrontEnd->IFseconds(); - timetemp = HUGE; - for (i=0;iDEVtrunc && ckt->CKThead[i]) { + timetemp = HUGE; + for (i = 0; i < DEVmaxnum; i++) { + if (DEVices[i] && DEVices[i]->DEVtrunc && ckt->CKThead[i]) { #ifdef STEPDEBUG - debugtemp = timetemp; + debugtemp = timetemp; #endif /* STEPDEBUG */ - error = DEVices[i]->DEVtrunc (ckt->CKThead[i], ckt, &timetemp); - if(error) { - ckt->CKTstat->STATtranTruncTime += SPfrontEnd->IFseconds() - - startTime; - return(error); - } -#ifdef STEPDEBUG - if(debugtemp != timetemp) { - printf("timestep cut by device type %s from %g to %g\n", - DEVices[i]->DEVpublic.name, debugtemp, timetemp); - } -#endif /* STEPDEBUG */ - } - } - *timeStep = MIN(2 * *timeStep,timetemp); - - ckt->CKTstat->STATtranTruncTime += SPfrontEnd->IFseconds() - startTime; - return(OK); -#else /* NEWTRUNC */ - int i; - CKTnode *node; - double timetemp; - double tmp; - double diff; - double tol; - double startTime; - int size; - - startTime = SPfrontEnd->IFseconds(); - - timetemp = HUGE; - size = SMPmatSize(ckt->CKTmatrix); -#ifdef STEPDEBUG - printf("\nNEWTRUNC at time %g, delta %g\n",ckt->CKTtime,ckt->CKTdeltaOld[0]); -#endif - node = ckt->CKTnodes; - switch(ckt->CKTintegrateMethod) { - - case TRAPEZOIDAL: -#ifdef STEPDEBUG - printf("TRAP, Order is %d\n", ckt->CKTorder); -#endif - switch(ckt->CKTorder) { - case 1: - for(i=1;iCKTrhs[i]),fabs(ckt->CKTpred[i]))* - ckt->CKTlteReltol+ckt->CKTlteAbstol; - node = node->next; - if(node->type!= SP_VOLTAGE) continue; - diff = ckt->CKTrhs[i]-ckt->CKTpred[i]; -#ifdef STEPDEBUG - printf("%s: cor=%g, pred=%g ",node->name, - ckt->CKTrhs[i],ckt->CKTpred[i]); -#endif - if(diff != 0) { -// if (!AlmostEqualUlps(diff, 0, 10)) { - tmp = ckt->CKTlteTrtol * tol * 2 / diff; - tmp = ckt->CKTdeltaOld[0]*fabs(tmp); - timetemp = MIN(timetemp,tmp); -#ifdef STEPDEBUG - printf("tol = %g, diff = %g, h->%g\n",tol,diff,tmp); -#endif - } else { -#ifdef STEPDEBUG - printf("diff is 0\n"); -#endif + error = DEVices[i]->DEVtrunc(ckt->CKThead[i], ckt, &timetemp); + if (error) { + ckt->CKTstat->STATtranTruncTime += SPfrontEnd->IFseconds() + - startTime; + return(error); } +#ifdef STEPDEBUG + if (debugtemp != timetemp) { + printf("timestep cut by device type %s from %g to %g\n", + DEVices[i]->DEVpublic.name, debugtemp, timetemp); + } +#endif /* STEPDEBUG */ + } + } + *timeStep = MIN(2 * *timeStep, timetemp); + + ckt->CKTstat->STATtranTruncTime += SPfrontEnd->IFseconds() - startTime; + return(OK); + } + else { + int i; + CKTnode* node; + double timetemp; + double tmp; + double diff; + double tol; + double startTime; + int size; + + startTime = SPfrontEnd->IFseconds(); + + timetemp = HUGE; + size = SMPmatSize(ckt->CKTmatrix); +#ifdef STEPDEBUG + printf("\nNEWTRUNC at time %g, delta %g\n", ckt->CKTtime, ckt->CKTdeltaOld[0]); +#endif + node = ckt->CKTnodes; + switch (ckt->CKTintegrateMethod) { + + case TRAPEZOIDAL: +#ifdef STEPDEBUG + printf("TRAP, Order is %d\n", ckt->CKTorder); +#endif + switch (ckt->CKTorder) { + case 1: + for (i = 1; i < size; i++) { + tol = MAX(fabs(ckt->CKTrhs[i]), fabs(ckt->CKTpred[i])) * + ckt->CKTlteReltol + ckt->CKTlteAbstol; + node = node->next; + if (node->type != SP_VOLTAGE) continue; + diff = ckt->CKTrhs[i] - ckt->CKTpred[i]; +#ifdef STEPDEBUG + printf("%s: cor=%g, pred=%g ", node->name, + ckt->CKTrhs[i], ckt->CKTpred[i]); +#endif + if (diff != 0) { + // if (!AlmostEqualUlps(diff, 0, 10)) { + tmp = ckt->CKTlteTrtol * tol * 2 / diff; + tmp = ckt->CKTdeltaOld[0] * fabs(tmp); + timetemp = MIN(timetemp, tmp); +#ifdef STEPDEBUG + printf("tol = %g, diff = %g, h->%g\n", tol, diff, tmp); +#endif + } + else { +#ifdef STEPDEBUG + printf("diff is 0\n"); +#endif + } + } + break; + case 2: + for (i = 1; i < size; i++) { + tol = MAX(fabs(ckt->CKTrhs[i]), fabs(ckt->CKTpred[i])) * + ckt->CKTlteReltol + ckt->CKTlteAbstol; + node = node->next; + if (node->type != SP_VOLTAGE) continue; + diff = ckt->CKTrhs[i] - ckt->CKTpred[i]; +#ifdef STEPDEBUG + printf("%s: cor=%g, pred=%g ", node->name, + ckt->CKTrhs[i], ckt->CKTpred[i]); +#endif + if (diff != 0) { + // if (!AlmostEqualUlps(diff, 0, 10)) { + tmp = ckt->CKTlteTrtol * tol * 2 / diff; + tmp = ckt->CKTdeltaOld[0] * sqrt(fabs(tmp)); + timetemp = MIN(timetemp, tmp); +#ifdef STEPDEBUG + printf("tol = %g, diff = %g, h->%g\n", tol, diff, tmp); +#endif + } + else { +#ifdef STEPDEBUG + printf("diff is 0\n"); +#endif + } + } + break; + /* case 2: + for(i=1;iCKTrhs[i]),fabs(ckt->CKTpred[i]))* + ckt->CKTlteReltol+ckt->CKTlteAbstol; + node = node->next; + if(node->type!= SP_VOLTAGE) continue; + diff = ckt->CKTrhs[i]-ckt->CKTpred[i]; + #ifdef STEPDEBUG + printf("%s: cor=%g, pred=%g ",node->name,ckt->CKTrhs[i], + ckt->CKTpred[i]); + #endif + if(diff != 0) { + // if(!AlmostEqualUlps(diff, 0, 10)) { + tmp = tol * ckt->CKTlteTrtol * (ckt->CKTdeltaOld[0] + ckt->CKTdeltaOld[1]) + / (diff * ckt->CKTdelta); + tmp = fabs(tmp); + tmp = exp(log(tmp) / 3); + tmp *= ckt->CKTdelta; + timetemp = MIN(timetemp,tmp); + #ifdef STEPDEBUG + printf("tol = %g, diff = %g, h->%g\n",tol,diff,tmp); + #endif + } else { + #ifdef STEPDEBUG + printf("diff is 0\n"); + #endif + } + } + break; */ + default: + return(E_ORDER); + break; + } break; - case 2: + + case GEAR: { +#ifdef STEPDEBUG + printf("GEAR, Order is %d\n", ckt->CKTorder); +#endif + double delsum = 0; + for (i = 0; i <= ckt->CKTorder; i++) { + delsum += ckt->CKTdeltaOld[i]; + } for (i = 1; i < size; i++) { - tol = MAX(fabs(ckt->CKTrhs[i]), fabs(ckt->CKTpred[i])) * - ckt->CKTlteReltol + ckt->CKTlteAbstol; node = node->next; if (node->type != SP_VOLTAGE) continue; - diff = ckt->CKTrhs[i] - ckt->CKTpred[i]; + tol = MAX(fabs(ckt->CKTrhs[i]), fabs(ckt->CKTpred[i])) * + ckt->CKTlteReltol + ckt->CKTlteAbstol; + diff = (ckt->CKTrhs[i] - ckt->CKTpred[i]); #ifdef STEPDEBUG - printf("%s: cor=%g, pred=%g ", node->name, - ckt->CKTrhs[i], ckt->CKTpred[i]); + printf("%s: cor=%g, pred=%g ", node->name, ckt->CKTrhs[i], + ckt->CKTpred[i]); #endif if (diff != 0) { - // if (!AlmostEqualUlps(diff, 0, 10)) { - tmp = ckt->CKTlteTrtol * tol * 2 / diff; - tmp = ckt->CKTdeltaOld[0] * sqrt(fabs(tmp)); + tmp = tol * ckt->CKTlteTrtol * delsum / (diff * ckt->CKTdelta); + tmp = fabs(tmp); + switch (ckt->CKTorder) { + case 0: + break; + case 1: + tmp = sqrt(tmp); + break; + default: + tmp = exp(log(tmp) / (ckt->CKTorder + 1)); + break; + } + tmp *= ckt->CKTdelta; timetemp = MIN(timetemp, tmp); #ifdef STEPDEBUG printf("tol = %g, diff = %g, h->%g\n", tol, diff, tmp); @@ -131,94 +213,15 @@ CKTtrunc(CKTcircuit *ckt, double *timeStep) #endif } } - break; -/* case 2: - for(i=1;iCKTrhs[i]),fabs(ckt->CKTpred[i]))* - ckt->CKTlteReltol+ckt->CKTlteAbstol; - node = node->next; - if(node->type!= SP_VOLTAGE) continue; - diff = ckt->CKTrhs[i]-ckt->CKTpred[i]; -#ifdef STEPDEBUG - printf("%s: cor=%g, pred=%g ",node->name,ckt->CKTrhs[i], - ckt->CKTpred[i]); -#endif - if(diff != 0) { -// if(!AlmostEqualUlps(diff, 0, 10)) { - tmp = tol * ckt->CKTlteTrtol * (ckt->CKTdeltaOld[0] + ckt->CKTdeltaOld[1]) - / (diff * ckt->CKTdelta); - tmp = fabs(tmp); - tmp = exp(log(tmp) / 3); - tmp *= ckt->CKTdelta; - timetemp = MIN(timetemp,tmp); -#ifdef STEPDEBUG - printf("tol = %g, diff = %g, h->%g\n",tol,diff,tmp); -#endif - } else { -#ifdef STEPDEBUG - printf("diff is 0\n"); -#endif - } - } - break; */ + } + break; + default: - return(E_ORDER); - break; + return(E_METHOD); } - break; - - case GEAR: { -#ifdef STEPDEBUG - printf("GEAR, Order is %d\n", ckt->CKTorder); -#endif - double delsum=0; - for(i=0;i<=ckt->CKTorder;i++) { - delsum += ckt->CKTdeltaOld[i]; - } - for(i=1;inext; - if(node->type!= SP_VOLTAGE) continue; - tol = MAX( fabs(ckt->CKTrhs[i]),fabs(ckt->CKTpred[i]))* - ckt->CKTlteReltol+ckt->CKTlteAbstol; - diff = (ckt->CKTrhs[i]-ckt->CKTpred[i]); -#ifdef STEPDEBUG - printf("%s: cor=%g, pred=%g ",node->name,ckt->CKTrhs[i], - ckt->CKTpred[i]); -#endif - if(diff != 0) { - tmp = tol*ckt->CKTlteTrtol*delsum/(diff*ckt->CKTdelta); - tmp = fabs(tmp); - switch(ckt->CKTorder) { - case 0: - break; - case 1: - tmp = sqrt(tmp); - break; - default: - tmp = exp(log(tmp)/(ckt->CKTorder+1)); - break; - } - tmp *= ckt->CKTdelta; - timetemp = MIN(timetemp,tmp); -#ifdef STEPDEBUG - printf("tol = %g, diff = %g, h->%g\n",tol,diff,tmp); -#endif - } else { -#ifdef STEPDEBUG - printf("diff is 0\n"); -#endif - } - } - } - break; - - default: - return(E_METHOD); - + *timeStep = MIN(2 * *timeStep, timetemp); + ckt->CKTstat->STATtranTruncTime += SPfrontEnd->IFseconds() - startTime; + return(OK); } - *timeStep = MIN(2 * *timeStep,timetemp); - ckt->CKTstat->STATtranTruncTime += SPfrontEnd->IFseconds() - startTime; - return(OK); -#endif /* NEWTRUNC */ } diff --git a/src/spicelib/devices/devsup.c b/src/spicelib/devices/devsup.c index 15f2b6204..d215b791b 100644 --- a/src/spicelib/devices/devsup.c +++ b/src/spicelib/devices/devsup.c @@ -814,15 +814,16 @@ DEVcap(CKTcircuit *ckt, double vgd, double vgs, double vgb, double covlgd, double DEVpred(CKTcircuit *ckt, int loct) { -#ifndef NEWTRUNC - double xfact; + if (!ckt->CKTnewtrunc) { + double xfact; - xfact = ckt->CKTdelta/ckt->CKTdeltaOld[1]; - return( ( (1+xfact) * *(ckt->CKTstate1+loct) ) - - ( xfact * *(ckt->CKTstate2+loct) ) ); -#else - return 1.; -#endif /* NEWTRUNC */ + xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; + return(((1 + xfact) * *(ckt->CKTstate1 + loct)) - + (xfact * *(ckt->CKTstate2 + loct))); + } + else { + return 1.; + } } diff --git a/src/xspice/icm/analog/delay/cfunc.mod b/src/xspice/icm/analog/delay/cfunc.mod index 0830bcc12..c86bbc82a 100644 --- a/src/xspice/icm/analog/delay/cfunc.mod +++ b/src/xspice/icm/analog/delay/cfunc.mod @@ -142,11 +142,10 @@ struct CKTcircuitmin { double CKTreltol; /* --- */ double CKTchgtol; /* --- */ double CKTvoltTol; /* --- */ - /* What is this define for ? */ -#ifdef NEWTRUNC - double CKTlteReltol; - double CKTlteAbstol; -#endif /* NEWTRUNC */ + double CKTlteReltol; /* relative error in voltage based truncation error estimation */ + double CKTlteAbstol; /* absolute error in voltage based truncation error estimation */ + double CKTlteTrtol; /* scaling time step in voltage based truncation error estimation */ + int CKTnewtrunc; /* enable lte (local truncation error) based on voltages */ double CKTgmin; /* .options GMIN */ double CKTgshunt; /* .options RSHUNT */ double CKTcshunt; /* .options CSHUNT */ diff --git a/visualc/src/include/ngspice/config.h b/visualc/src/include/ngspice/config.h index 7ac24e603..40d617c05 100644 --- a/visualc/src/include/ngspice/config.h +++ b/visualc/src/include/ngspice/config.h @@ -464,9 +464,6 @@ /* Define if you want to discover :) */ /* #undef NEWPRED */ -/* Do not trigger unwanted traps by default */ -#define NEWTRUNC - /* Define if we want NOBYPASS */ /* #undef NOBYPASS */