From d029ed02dbdc35b18f6fa3956191f6eb79c788b6 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Mon, 1 Jun 2026 11:02:45 +0200 Subject: [PATCH] Diode: No integration if dc sweep, but keep calculating capacitances --- src/spicelib/devices/dio/dioload.c | 57 ++++++++++++++++-------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/src/spicelib/devices/dio/dioload.c b/src/spicelib/devices/dio/dioload.c index 80ade0970..97dade792 100644 --- a/src/spicelib/devices/dio/dioload.c +++ b/src/spicelib/devices/dio/dioload.c @@ -658,36 +658,39 @@ next1: *(ckt->CKTstate1 + here->DIOcapChargeSW) = *(ckt->CKTstate0 + here->DIOcapChargeSW); } - error = NIintegrate(ckt,&geq,&ceq,capd,here->DIOcapCharge); - if(error) return(error); - gd=gd+geq; - cd=cd+*(ckt->CKTstate0 + here->DIOcapCurrent); - if (model->DIOresistSWGiven) { - error = NIintegrate(ckt,&geq,&ceq,capdsw,here->DIOcapChargeSW); - if(error) return(error); - gdsw=gdsw+geq; - cdsw=cdsw+*(ckt->CKTstate0 + here->DIOcapCurrentSW); - } - if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->DIOcapCurrent) = - *(ckt->CKTstate0 + here->DIOcapCurrent); - if (model->DIOresistSWGiven) - *(ckt->CKTstate1 + here->DIOcapCurrentSW) = - *(ckt->CKTstate0 + here->DIOcapCurrentSW); - } - if (revrec) { - /* soft recovery subcircuit */ - if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->DIOsrcapCharge) = - *(ckt->CKTstate0 + here->DIOsrcapCharge); + /* no integration, if dc sweep, but keep evaluating capacitances */ + if (!(ckt->CKTmode & MODEDCTRANCURVE)) { + error = NIintegrate(ckt, &geq, &ceq, capd, here->DIOcapCharge); + if (error) return(error); + gd = gd + geq; + cd = cd + *(ckt->CKTstate0 + here->DIOcapCurrent); + if (model->DIOresistSWGiven) { + error = NIintegrate(ckt, &geq, &ceq, capdsw, here->DIOcapChargeSW); + if (error) return(error); + gdsw = gdsw + geq; + cdsw = cdsw + *(ckt->CKTstate0 + here->DIOcapCurrentSW); } - error = NIintegrate(ckt,&geq,&ceq,capsr,here->DIOsrcapCharge); - if(error) return(error); - gqcsr = geq; - cqcsr = *(ckt->CKTstate0 + here->DIOsrcapCurrent); if (ckt->CKTmode & MODEINITTRAN) { - *(ckt->CKTstate1 + here->DIOsrcapCurrent) = + *(ckt->CKTstate1 + here->DIOcapCurrent) = + *(ckt->CKTstate0 + here->DIOcapCurrent); + if (model->DIOresistSWGiven) + *(ckt->CKTstate1 + here->DIOcapCurrentSW) = + *(ckt->CKTstate0 + here->DIOcapCurrentSW); + } + if (revrec) { + /* soft recovery subcircuit */ + if (ckt->CKTmode & MODEINITTRAN) { + *(ckt->CKTstate1 + here->DIOsrcapCharge) = + *(ckt->CKTstate0 + here->DIOsrcapCharge); + } + error = NIintegrate(ckt, &geq, &ceq, capsr, here->DIOsrcapCharge); + if (error) return(error); + gqcsr = geq; + cqcsr = *(ckt->CKTstate0 + here->DIOsrcapCurrent); + if (ckt->CKTmode & MODEINITTRAN) { + *(ckt->CKTstate1 + here->DIOsrcapCurrent) = *(ckt->CKTstate0 + here->DIOsrcapCurrent); + } } } if (selfheat)