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.
This commit is contained in:
rlar 2017-01-22 19:18:02 +01:00
parent 1fd14fa2ee
commit c0921250b7
5 changed files with 145 additions and 0 deletions

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)
{