From e1aa231db160919ab290c217c7c1d57c87b5fde4 Mon Sep 17 00:00:00 2001 From: Tim Edwards Date: Tue, 15 Oct 2024 20:52:23 -0400 Subject: [PATCH] Corrected another error discovered by Andrei Bondar in which the critical property (e.g., L for transistors) is required to match exactly between devices in order to allow the additive property (e.g., W for transistors) to be summed. The critical property should match if all values are within the slop value, for floating-point values. Note: The implementation is still not rigorous, as the saved critical value may shift from device to device; so comparing, e.g., 1.00 to 1.01 to 1.02 to 1.03, etc., can find that all individual comparisons are within the slop value even though the slop is exceeded across all values. --- VERSION | 2 +- base/netcmp.c | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/VERSION b/VERSION index 636958e..a599a71 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.283 +1.5.284 diff --git a/base/netcmp.c b/base/netcmp.c index 3e82bec..6d44f59 100644 --- a/base/netcmp.c +++ b/base/netcmp.c @@ -5169,6 +5169,7 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int series, // (if any) if (comb == TRUE) { + double pd; int mult, cidx = -1; struct valuelist *avl, *cvl = NULL; critval.type = PROP_ENDLIST; @@ -5187,12 +5188,15 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int series, /* combine as specified by the merge type of the property. */ for (p = 1; p < pcount; p++) { + kl = plist[p]; vl = vlist[p][i]; ctype = clist[p][i]; /* critical properties never combine, but track them */ if ((series == TRUE) && (ctype & MERGE_S_CRIT)) { - if ((vl->type != critval.type) || (vl->value.dval != critval.value.dval)) + pd = 2 * fabs(vl->value.dval - critval.value.dval) / + (vl->value.dval + critval.value.dval); + if ((vl->type != critval.type) || (pd > kl->slop.dval)) { critval.type = vl->type; critval.value = vl->value; @@ -5201,7 +5205,9 @@ int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int series, continue; } if ((series == FALSE) && (ctype & MERGE_P_CRIT)) { - if ((vl->type != critval.type) || (vl->value.dval != critval.value.dval)) + pd = 2 * fabs(vl->value.dval - critval.value.dval) / + (vl->value.dval + critval.value.dval); + if ((vl->type != critval.type) || (pd > kl->slop.dval)) { critval.type = vl->type; critval.value = vl->value;