Browse Source

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
pre-master-46
Holger Vogt 2 years ago
parent
commit
2129ac26fd
  1. 23
      src/spicelib/devices/dio/diosetup.c

23
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;

Loading…
Cancel
Save