From 03905433bb25ac702172afd77b4291b8c83f6f0e Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Fri, 22 Dec 2023 17:21:55 +0100 Subject: [PATCH] If compatmode hs is set, don't run an extra iteration with differing mode settings, but go directly to CKTop(). If other or none compat modes, keep existing behavior, as for example CIDER example may otherwise slow down significantly. This is to keep dc sim in accordance with other simulators. --- src/spicelib/analysis/dctrcurv.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/spicelib/analysis/dctrcurv.c b/src/spicelib/analysis/dctrcurv.c index 2f53734c9..3ef5986d6 100644 --- a/src/spicelib/analysis/dctrcurv.c +++ b/src/spicelib/analysis/dctrcurv.c @@ -14,6 +14,7 @@ Modified: 1999 Paolo Nenzi #include "ngspice/const.h" #include "ngspice/sperror.h" #include "ngspice/fteext.h" +#include "ngspice/compatmode.h" #ifdef XSPICE #include "ngspice/evt.h" @@ -297,8 +298,8 @@ DCtrCurv(CKTcircuit *ckt, int restart) if (ckt->evt->counts.num_insts == 0) { /* If no event-driven instances, do what SPICE normally does */ #endif - converged = NIiter(ckt, ckt->CKTdcTrcvMaxIter); - if (converged != 0) { + + if (newcompat.hs) { converged = CKTop(ckt, (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITJCT, (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITFLOAT, @@ -306,6 +307,17 @@ DCtrCurv(CKTcircuit *ckt, int restart) if (converged != 0) return(converged); } + else { + converged = NIiter(ckt, ckt->CKTdcTrcvMaxIter); + if (converged != 0) { + converged = CKTop(ckt, + (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITJCT, + (ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITFLOAT, + ckt->CKTdcMaxIter); + if (converged != 0) + return(converged); + } + } #ifdef XSPICE } else {