From c0921250b7273932d4365c7a555fb9b7ae1fdcba Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 22 Jan 2017 19:18:02 +0100 Subject: [PATCH] src/spicelib/devices/*/*set.c, missing CKTdltNNum() invocations, medium cases All locally created nodes (CKTmk..() invocations in XXXsetup()) must be deleted in XXXunsetup() Otherwise CKTmk..() invocations during a following CKTsetup() will re-emit still used node numbers, thus accidentally shorting nodes. This patch fixes a little bit more complex cases, which are local node variables which will start with value 0 and eventually be set with the result of a CKTmk..() invocations, but might as well receive a node number from another node variable. Here CKTdltNNum() must not be invoked if the node number is merely a copy from another node variable. --- src/spicelib/devices/bsim4/b4set.c | 30 +++++++++++++++++++++++++ src/spicelib/devices/bsim4v5/b4v5set.c | 30 +++++++++++++++++++++++++ src/spicelib/devices/bsim4v6/b4v6set.c | 30 +++++++++++++++++++++++++ src/spicelib/devices/bsim4v7/b4v7set.c | 30 +++++++++++++++++++++++++ src/spicelib/devices/bsimsoi/b4soiset.c | 25 +++++++++++++++++++++ 5 files changed, 145 insertions(+) diff --git a/src/spicelib/devices/bsim4/b4set.c b/src/spicelib/devices/bsim4/b4set.c index a5b3d5dc9..5a6dc82b4 100644 --- a/src/spicelib/devices/bsim4/b4set.c +++ b/src/spicelib/devices/bsim4/b4set.c @@ -2770,6 +2770,36 @@ CKTcircuit *ckt) CKTdltNNum(ckt, here->BSIM4qNode); here->BSIM4qNode = 0; } + if (here->BSIM4sbNode && + here->BSIM4sbNode != here->BSIM4bNode) + { + CKTdltNNum(ckt, here->BSIM4sbNode); + here->BSIM4sbNode = 0; + } + if (here->BSIM4bNodePrime && + here->BSIM4bNodePrime != here->BSIM4bNode) + { + CKTdltNNum(ckt, here->BSIM4bNodePrime); + here->BSIM4bNodePrime = 0; + } + if (here->BSIM4dbNode && + here->BSIM4dbNode != here->BSIM4bNode) + { + CKTdltNNum(ckt, here->BSIM4dbNode); + here->BSIM4dbNode = 0; + } + if (here->BSIM4gNodeMid && + here->BSIM4gNodeMid != here->BSIM4gNodeExt) + { + CKTdltNNum(ckt, here->BSIM4gNodeMid); + here->BSIM4gNodeMid = 0; + } + if (here->BSIM4gNodePrime && + here->BSIM4gNodePrime != here->BSIM4gNodeExt) + { + CKTdltNNum(ckt, here->BSIM4gNodePrime); + here->BSIM4gNodePrime = 0; + } if (here->BSIM4sNodePrime && here->BSIM4sNodePrime != here->BSIM4sNode) { diff --git a/src/spicelib/devices/bsim4v5/b4v5set.c b/src/spicelib/devices/bsim4v5/b4v5set.c index ed745d04e..0bbe859a7 100644 --- a/src/spicelib/devices/bsim4v5/b4v5set.c +++ b/src/spicelib/devices/bsim4v5/b4v5set.c @@ -2148,6 +2148,36 @@ BSIM4v5unsetup( CKTdltNNum(ckt, here->BSIM4v5qNode); here->BSIM4v5qNode = 0; } + if (here->BSIM4v5sbNode && + here->BSIM4v5sbNode != here->BSIM4v5bNode) + { + CKTdltNNum(ckt, here->BSIM4v5sbNode); + here->BSIM4v5sbNode = 0; + } + if (here->BSIM4v5bNodePrime && + here->BSIM4v5bNodePrime != here->BSIM4v5bNode) + { + CKTdltNNum(ckt, here->BSIM4v5bNodePrime); + here->BSIM4v5bNodePrime = 0; + } + if (here->BSIM4v5dbNode && + here->BSIM4v5dbNode != here->BSIM4v5bNode) + { + CKTdltNNum(ckt, here->BSIM4v5dbNode); + here->BSIM4v5dbNode = 0; + } + if (here->BSIM4v5gNodeMid && + here->BSIM4v5gNodeMid != here->BSIM4v5gNodeExt) + { + CKTdltNNum(ckt, here->BSIM4v5gNodeMid); + here->BSIM4v5gNodeMid = 0; + } + if (here->BSIM4v5gNodePrime && + here->BSIM4v5gNodePrime != here->BSIM4v5gNodeExt) + { + CKTdltNNum(ckt, here->BSIM4v5gNodePrime); + here->BSIM4v5gNodePrime = 0; + } if (here->BSIM4v5sNodePrime && here->BSIM4v5sNodePrime != here->BSIM4v5sNode) { diff --git a/src/spicelib/devices/bsim4v6/b4v6set.c b/src/spicelib/devices/bsim4v6/b4v6set.c index 404c01b6e..b356634dd 100644 --- a/src/spicelib/devices/bsim4v6/b4v6set.c +++ b/src/spicelib/devices/bsim4v6/b4v6set.c @@ -2481,6 +2481,36 @@ BSIM4v6unsetup(GENmodel *inModel, CKTcircuit *ckt) CKTdltNNum(ckt, here->BSIM4v6qNode); here->BSIM4v6qNode = 0; } + if (here->BSIM4v6sbNode && + here->BSIM4v6sbNode != here->BSIM4v6bNode) + { + CKTdltNNum(ckt, here->BSIM4v6sbNode); + here->BSIM4v6sbNode = 0; + } + if (here->BSIM4v6bNodePrime && + here->BSIM4v6bNodePrime != here->BSIM4v6bNode) + { + CKTdltNNum(ckt, here->BSIM4v6bNodePrime); + here->BSIM4v6bNodePrime = 0; + } + if (here->BSIM4v6dbNode && + here->BSIM4v6dbNode != here->BSIM4v6bNode) + { + CKTdltNNum(ckt, here->BSIM4v6dbNode); + here->BSIM4v6dbNode = 0; + } + if (here->BSIM4v6gNodeMid && + here->BSIM4v6gNodeMid != here->BSIM4v6gNodeExt) + { + CKTdltNNum(ckt, here->BSIM4v6gNodeMid); + here->BSIM4v6gNodeMid = 0; + } + if (here->BSIM4v6gNodePrime && + here->BSIM4v6gNodePrime != here->BSIM4v6gNodeExt) + { + CKTdltNNum(ckt, here->BSIM4v6gNodePrime); + here->BSIM4v6gNodePrime = 0; + } if (here->BSIM4v6sNodePrime && here->BSIM4v6sNodePrime != here->BSIM4v6sNode) { diff --git a/src/spicelib/devices/bsim4v7/b4v7set.c b/src/spicelib/devices/bsim4v7/b4v7set.c index 6137d2e46..8edc59aed 100644 --- a/src/spicelib/devices/bsim4v7/b4v7set.c +++ b/src/spicelib/devices/bsim4v7/b4v7set.c @@ -2638,6 +2638,36 @@ CKTcircuit *ckt) CKTdltNNum(ckt, here->BSIM4v7qNode); here->BSIM4v7qNode = 0; } + if (here->BSIM4v7sbNode && + here->BSIM4v7sbNode != here->BSIM4v7bNode) + { + CKTdltNNum(ckt, here->BSIM4v7sbNode); + here->BSIM4v7sbNode = 0; + } + if (here->BSIM4v7bNodePrime && + here->BSIM4v7bNodePrime != here->BSIM4v7bNode) + { + CKTdltNNum(ckt, here->BSIM4v7bNodePrime); + here->BSIM4v7bNodePrime = 0; + } + if (here->BSIM4v7dbNode && + here->BSIM4v7dbNode != here->BSIM4v7bNode) + { + CKTdltNNum(ckt, here->BSIM4v7dbNode); + here->BSIM4v7dbNode = 0; + } + if (here->BSIM4v7gNodeMid && + here->BSIM4v7gNodeMid != here->BSIM4v7gNodeExt) + { + CKTdltNNum(ckt, here->BSIM4v7gNodeMid); + here->BSIM4v7gNodeMid = 0; + } + if (here->BSIM4v7gNodePrime && + here->BSIM4v7gNodePrime != here->BSIM4v7gNodeExt) + { + CKTdltNNum(ckt, here->BSIM4v7gNodePrime); + here->BSIM4v7gNodePrime = 0; + } if (here->BSIM4v7sNodePrime && here->BSIM4v7sNodePrime != here->BSIM4v7sNode) { diff --git a/src/spicelib/devices/bsimsoi/b4soiset.c b/src/spicelib/devices/bsimsoi/b4soiset.c index 806851043..3943dbf32 100644 --- a/src/spicelib/devices/bsimsoi/b4soiset.c +++ b/src/spicelib/devices/bsimsoi/b4soiset.c @@ -2863,6 +2863,31 @@ B4SOIunsetup( here->B4SOIvbsNode = 0; } + if (here->B4SOIsbNode && + here->B4SOIsbNode != here->B4SOIbNode) + { + CKTdltNNum(ckt, here->B4SOIsbNode); + here->B4SOIsbNode = 0; + } + if (here->B4SOIdbNode && + here->B4SOIdbNode != here->B4SOIbNode) + { + CKTdltNNum(ckt, here->B4SOIdbNode); + here->B4SOIdbNode = 0; + } + if (here->B4SOIgNodeMid && + here->B4SOIgNodeMid != here->B4SOIgNodeExt) + { + CKTdltNNum(ckt, here->B4SOIgNodeMid); + here->B4SOIgNodeMid = 0; + } + if (here->B4SOIgNode && + here->B4SOIgNode != here->B4SOIgNodeExt) + { + CKTdltNNum(ckt, here->B4SOIgNode); + here->B4SOIgNode = 0; + } + if (here->B4SOIsNodePrime && here->B4SOIsNodePrime != here->B4SOIsNode) {