From 0b7c291f37ffa1ae8750697919e60aed82aa0485 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Fri, 12 Oct 2018 20:37:49 +0200 Subject: [PATCH] replace Id by Idd. Use Revilimit instead of Ilimit. Correct for current limits. --- src/xspice/icm/xtradev/sidiode/cfunc.mod | 42 +++++++++++------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/src/xspice/icm/xtradev/sidiode/cfunc.mod b/src/xspice/icm/xtradev/sidiode/cfunc.mod index 2e61bb878..612c8dfbd 100644 --- a/src/xspice/icm/xtradev/sidiode/cfunc.mod +++ b/src/xspice/icm/xtradev/sidiode/cfunc.mod @@ -1,7 +1,7 @@ /*.......1.........2.........3.........4.........5.........6.........7.........8 ================================================================================ -FILE diodes/cfunc.mod +FILE sidiode/cfunc.mod Copyright 2018 GHolger Vogt @@ -87,16 +87,6 @@ typedef struct { /*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ - - - -/*============================================================================== - -FUNCTION void cm_diodes() - - -==============================================================================*/ - static void cm_sidiode_callback(ARGS, Mif_Callback_Reason_t reason) { @@ -110,8 +100,12 @@ cm_sidiode_callback(ARGS, Mif_Callback_Reason_t reason) } -/*=== CM_DIODES ROUTINE ===*/ +/*============================================================================== + +FUNCTION void cm_sidiode() + +==============================================================================*/ void cm_sidiode(ARGS) /* structure holding parms, inputs, outputs, etc. */ @@ -122,7 +116,7 @@ void cm_sidiode(ARGS) /* structure holding parms, Mif_Complex_t ac_gain; /* AC gain */ - double Vrev, Vfwd, Vin, Id, deriv, Ilimit, Revilimit; + double Vrev, Vfwd, Vin, Idd, deriv, Ilimit, Revilimit; Vrev = -PARAM(vrev); Vfwd = PARAM(vfwd); @@ -177,7 +171,7 @@ void cm_sidiode(ARGS) /* structure holding parms, loc->Revili = MIF_TRUE; else loc->Revili = MIF_FALSE; - + loc->grev = grev; loc->goff = goff; @@ -193,43 +187,45 @@ void cm_sidiode(ARGS) /* structure holding parms, if (Vin < loc->Va) { if(loc->Revili) { - double tmp = tanh(loc->a2 * (loc->Va - Vin)); - Id = Ilimit * tmp + loc->goff * loc->Va + double tmp = tanh(loc->a2 * (Vin - loc->Va)); + double ia = loc->goff * loc->Va + 0.5 * (loc->Va - loc->Vb) * (loc->Va - loc->Vb) * loc->a1; + Idd = (Revilimit - ia) * tmp + ia; deriv = loc->grev * (1. - tmp * tmp); } else { - Id = Vrev * loc->goff + (Vin - Vrev) * loc->grev; + Idd = Vrev * loc->goff + (Vin - Vrev) * loc->grev; deriv = loc->grev; } } else if (loc->revepsi && Vin >= loc->Va && Vin < loc->Vb) { - Id = 0.5 * (Vin -loc->Vb) * (Vin - loc->Vb) * loc->a1 + Vin * loc->goff; + Idd = 0.5 * (Vin -loc->Vb) * (Vin - loc->Vb) * loc->a1 + Vin * loc->goff; deriv = (Vin - loc->Vb) * loc->a1 + loc->goff; } else if (Vin >= loc->Vb && Vin < loc->Vc) { - Id = Vin * loc->goff; + Idd = Vin * loc->goff; deriv = loc->goff; } else if (loc->epsi && Vin >= loc->Vc && Vin < loc->Vd) { - Id = 0.5 * (Vin -loc->Vc) * (Vin - loc->Vc) * loc->b1 + Vin * loc->goff; + Idd = 0.5 * (Vin -loc->Vc) * (Vin - loc->Vc) * loc->b1 + Vin * loc->goff; deriv = (Vin - loc->Vc) * loc->b1 + loc->goff; } else { if(loc->Ili) { double tmp = tanh(loc->b2 * (Vin - loc->Vd)); - Id = Ilimit * tmp + loc->goff * loc->Vd + double id = loc->goff * loc->Vd + 0.5 * (loc->Vd - loc->Vc) * (loc->Vd - loc->Vc) * loc->b1; + Idd = (Ilimit - id) * tmp + id; deriv = loc->gon * (1. - tmp * tmp); } else { - Id = Vfwd * loc->goff + (Vin - Vfwd) * loc->gon; + Idd = Vfwd * loc->goff + (Vin - Vfwd) * loc->gon; deriv = loc->gon; } } if(ANALYSIS != MIF_AC) { /* Output DC & Transient Values */ - OUTPUT(ds) = Id; + OUTPUT(ds) = Idd; PARTIAL(ds,ds) = deriv; } else { /* Output AC Gain */