From 6ec6e1c72373e61a822528ebeaecfe0696e4c515 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Mon, 23 Sep 2024 12:34:17 +0200 Subject: [PATCH] Add optional series resistance or junction capacitance, if non is defined in the .model statement. This may help achieving convergence if subcircut models of opamps etc use simple diodes as voltage limiters. Example call: .options diode_cj0=20p diode_rser=20m --- src/spicelib/devices/dio/diosetup.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/spicelib/devices/dio/diosetup.c b/src/spicelib/devices/dio/diosetup.c index ed4bd560a..e23e2644f 100644 --- a/src/spicelib/devices/dio/diosetup.c +++ b/src/spicelib/devices/dio/diosetup.c @@ -79,7 +79,20 @@ DIOsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) model->DIOtranTimeTemp2 = 0.0; } if(!model->DIOjunctionCapGiven) { - model->DIOjunctionCap = 0; + if (newcompat.ps || newcompat.lt) { + double cdiode = 0.; + /* to improve convergence (sometimes) */ + if (cp_getvar("diode_cj0", CP_REAL, &cdiode, 0) && cdiode > 0) { + model->DIOjunctionCap = cdiode; + if (ft_ngdebug) + fprintf(stderr, "Diode junction capacitance in model %s set to %e F\n", model->gen.GENmodName, cdiode); + } + else + model->DIOjunctionCap = 0.0; + } + else { + model->DIOjunctionCap = 0.0; + } } if(!model->DIOjunctionSWCapGiven) { model->DIOjunctionSWCap = 0; @@ -210,10 +223,12 @@ DIOsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) if((!model->DIOresistGiven) || (model->DIOresist==0)) { if (newcompat.ps || newcompat.lt) { double rsdiode = 0.; - if (cp_getvar("rsdiode", CP_REAL, &rsdiode, 0) && rsdiode > 0) { - model->DIOconductance = 1./rsdiode; /* sometimes improves convergence */ + /* to improve convergence (sometimes) */ + if (cp_getvar("diode_rser", CP_REAL, &rsdiode, 0) && rsdiode > 0) { + model->DIOconductance = 1./rsdiode; + model->DIOresist = rsdiode; if (ft_ngdebug) - fprintf(stderr, "Diode series resistance in model %s set to 100 microOhm\n", model->gen.GENmodName); + fprintf(stderr, "Diode series resistance in model %s set to %e Ohm\n", model->gen.GENmodName, rsdiode); } else model->DIOconductance = 0.0;