From a61fee4aa39c606d12aad1ee730b068bc13f9e6c Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 11 Mar 2026 18:42:37 +0100 Subject: [PATCH] diode fix current reporting for soft recovery model --- src/spicelib/devices/dio/dioask.c | 2 ++ src/spicelib/devices/dio/diodefs.h | 2 ++ src/spicelib/devices/dio/dioload.c | 8 ++++---- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/spicelib/devices/dio/dioask.c b/src/spicelib/devices/dio/dioask.c index dc96ddc14..e40d5c4d0 100644 --- a/src/spicelib/devices/dio/dioask.c +++ b/src/spicelib/devices/dio/dioask.c @@ -75,6 +75,8 @@ DIOask (CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, return(OK); case DIO_CURRENT: value->rValue = *(ckt->CKTstate0+here->DIOcurrent); + if ((here->DIOqpNode > 0) && (here->DIOtTransitTime!=0)) + value->rValue += here->DIOqpGain * *(ckt->CKTstate0 + here->DIOcqcsr); return(OK); case DIO_CAP: value->rValue = here->DIOcap; diff --git a/src/spicelib/devices/dio/diodefs.h b/src/spicelib/devices/dio/diodefs.h index c2637310b..f4e54bb35 100644 --- a/src/spicelib/devices/dio/diodefs.h +++ b/src/spicelib/devices/dio/diodefs.h @@ -94,6 +94,8 @@ typedef struct sDIOinstance { double DIOcap; /* stores the diode capacitance */ double DIOcapSW; /* stores the diode Sw capacitance */ + double DIOqpGain;/* converts iterated diffcharge current */ + double *DIOsens; /* stores the perturbed values of geq and ceq in ac sensitivity analyis */ diff --git a/src/spicelib/devices/dio/dioload.c b/src/spicelib/devices/dio/dioload.c index 513aa42dd..c5160209e 100644 --- a/src/spicelib/devices/dio/dioload.c +++ b/src/spicelib/devices/dio/dioload.c @@ -839,7 +839,7 @@ next2: *(ckt->CKTstate0 + here->DIOvoltage) = vd; if (revrec) { double fac, ceqrr, dcrrdvd, grr; - double gain, ceqrrd, geqrrd; + double ceqrrd, geqrrd; /* QP subcircuit */ fac = here->DIOtTransitTime / model->DIOsoftRevRecParam; dcrrdvd = fac*gdres; @@ -850,10 +850,10 @@ next2: *(ckt->CKTstate0 + here->DIOvoltage) = vd; *(here->DIOqpPosPrimePtr) += -dcrrdvd; *(here->DIOqpNegPtr) += dcrrdvd; /* Contribution to diode current */ - gain = (1 - model->DIOsoftRevRecParam) / here->DIOtTransitTime; + here->DIOqpGain = (1 - model->DIOsoftRevRecParam) / here->DIOtTransitTime; /* Linear contribution -(1-vp)/tau*ddt(Qp) */ - geqrrd = gain*gqcsr; - ceqrrd = gain*cqcsr - geqrrd*vqp; + geqrrd = here->DIOqpGain*gqcsr; + ceqrrd = here->DIOqpGain*cqcsr - geqrrd*vqp; *(ckt->CKTrhs + here->DIOposPrimeNode) -= ceqrrd; *(ckt->CKTrhs + here->DIOnegNode) += ceqrrd; *(here->DIOposPrimeQpPtr) += geqrrd;