From dc8c7db71821e9af998899ab2d8b5c056d4288bb Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Thu, 29 Sep 2022 16:14:25 +0200 Subject: [PATCH] Fix a bug in simple diode, when ilimit is set, but not epsilon. Make model more similar to LTSPICE Add an example --- examples/xspice/simple-diode.cir | 25 ++++++++++++++++++++++++ src/xspice/icm/xtradev/sidiode/cfunc.mod | 13 ++++++------ 2 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 examples/xspice/simple-diode.cir diff --git a/examples/xspice/simple-diode.cir b/examples/xspice/simple-diode.cir new file mode 100644 index 000000000..338c32102 --- /dev/null +++ b/examples/xspice/simple-diode.cir @@ -0,0 +1,25 @@ +simple diode automatic test +* 'set ngbehavior=lta' required in .spiceinit +V1 in 0 dc 0 + +D1 in out1 A +R1 out1 0 1u +D2 in out2 B +R2 out2 0 1u +D3 in out3 C +R3 out3 0 1u + +.probe alli + +.model A D(Ron=1 Roff=1Meg Vfwd=1 Vrev=2) +.model B D(Ron=1 Roff=1Meg Vfwd=1 Vrev=2 Ilimit=1 RevILimit=1) +.model C D(Ron=1 Roff=1Meg Vfwd=1 Vrev=2 Ilimit=1 RevILimit=1 epsilon=1 revepsilon=1) + +.control +dc V1 -5 5 1m +display +set xbrushwidth=2 +plot i(r1) i(r2) i(r3) +.endc + +.end diff --git a/src/xspice/icm/xtradev/sidiode/cfunc.mod b/src/xspice/icm/xtradev/sidiode/cfunc.mod index 8406f1253..fecd7ad2a 100644 --- a/src/xspice/icm/xtradev/sidiode/cfunc.mod +++ b/src/xspice/icm/xtradev/sidiode/cfunc.mod @@ -147,23 +147,22 @@ void cm_sidiode(ARGS) /* structure holding parms, grev = 1./PARAM(rrev); hRevepsilon = 0.5 * PARAM(revepsilon); - loc->Va = Va = Vrev - hRevepsilon; - loc->Vb = Vb = Vrev + hRevepsilon; + loc->Va = Va = Vrev - PARAM(revepsilon); //hRevepsilon; + loc->Vb = Vb = Vrev; //+ hRevepsilon; + loc->a2 = grev/Revilimit; if(hRevepsilon > 0.0) { loc->a1 = (goff - grev)/PARAM(revepsilon); - loc->a2 = grev/Revilimit; loc->revepsi = MIF_TRUE; } else loc->revepsi = MIF_FALSE; hEpsilon = 0.5 * PARAM(epsilon); - loc->Vc = Vc = Vfwd - hEpsilon; - loc->Vd = Vd = Vfwd + hEpsilon; - + loc->Vc = Vc = Vfwd; // - hEpsilon; + loc->Vd = Vd = Vfwd + PARAM(epsilon); //hEpsilon; + loc->b2 = gon/Ilimit; if(hEpsilon > 0.0) { loc->b1 = (gon - goff)/PARAM(epsilon); - loc->b2 = gon/Ilimit; loc->epsi = MIF_TRUE; } else