Compare commits
No commits in common. "master" and "8.3.583" have entirely different histories.
|
|
@ -16,7 +16,6 @@ jobs:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Get Dependencies
|
- name: Get Dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y tcl-dev tk-dev libcairo-dev
|
sudo apt-get install -y tcl-dev tk-dev libcairo-dev
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,8 @@ on:
|
||||||
|
|
||||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||||
jobs:
|
jobs:
|
||||||
simple_build_macos15:
|
simple_build_macos13:
|
||||||
runs-on: macos-15-intel # only and last supported intel MacOS
|
runs-on: macos-13
|
||||||
timeout-minutes: 45 # x86_64 seems non-SSD based (slower)
|
timeout-minutes: 45 # x86_64 seems non-SSD based (slower)
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
|
@ -235,10 +235,10 @@ jobs:
|
||||||
cp *.mak dist/BUILD-INFO/
|
cp *.mak dist/BUILD-INFO/
|
||||||
cp *.LOG dist/BUILD-INFO/
|
cp *.LOG dist/BUILD-INFO/
|
||||||
|
|
||||||
- name: Upload archive magic-macos15
|
- name: Upload archive magic-macos13
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: magic-macos15
|
name: magic-macos13
|
||||||
path: |
|
path: |
|
||||||
${{ github.workspace }}/dist
|
${{ github.workspace }}/dist
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2432,7 +2432,6 @@ calmaProcessBoundary(
|
||||||
freeMagic1(&mm1, lbref);
|
freeMagic1(&mm1, lbref);
|
||||||
lbref = lbref->lb_next;
|
lbref = lbref->lb_next;
|
||||||
}
|
}
|
||||||
freeMagic1(&mm1, lbref);
|
|
||||||
freeMagic1_end(&mm1);
|
freeMagic1_end(&mm1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1867,7 +1867,6 @@ calmaProcessBoundaryZ(
|
||||||
freeMagic1(&mm1, lbref);
|
freeMagic1(&mm1, lbref);
|
||||||
lbref = lbref->lb_next;
|
lbref = lbref->lb_next;
|
||||||
}
|
}
|
||||||
freeMagic1(&mm1, lbref);
|
|
||||||
freeMagic1_end(&mm1);
|
freeMagic1_end(&mm1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -814,10 +814,7 @@ main(
|
||||||
EFVisitDevs(simmergeVisit, PTR2CD(NULL));
|
EFVisitDevs(simmergeVisit, PTR2CD(NULL));
|
||||||
TxPrintf("Devices merged: %d\n", esDevsMerged);
|
TxPrintf("Devices merged: %d\n", esDevsMerged);
|
||||||
esFMIndex = 0;
|
esFMIndex = 0;
|
||||||
free_magic1_t mm1 = freeMagic1_init();
|
for (p = devMergeList; p != NULL; p = p->next) freeMagic((char *)p);
|
||||||
for (p = devMergeList; p != NULL; p = p->next)
|
|
||||||
freeMagic1(&mm1, (char *)p);
|
|
||||||
freeMagic1_end(&mm1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EFVisitDevs(simdevVisit, PTR2CD(NULL));
|
EFVisitDevs(simdevVisit, PTR2CD(NULL));
|
||||||
|
|
|
||||||
|
|
@ -1345,12 +1345,9 @@ main(
|
||||||
TxPrintf("Devs merged: %d\n", esSpiceDevsMerged);
|
TxPrintf("Devs merged: %d\n", esSpiceDevsMerged);
|
||||||
esFMIndex = 0 ;
|
esFMIndex = 0 ;
|
||||||
{
|
{
|
||||||
const devMerge *p;
|
const devMerge *p;
|
||||||
|
|
||||||
free_magic1_t mm1 = freeMagic1_init();
|
for ( p = devMergeList ; p != NULL ; p=p->next ) freeMagic((char *)p);
|
||||||
for (p = devMergeList; p != NULL; p = p->next)
|
|
||||||
freeMagic1(&mm1, (char *)p);
|
|
||||||
freeMagic1_end(&mm1);
|
|
||||||
}
|
}
|
||||||
} else if ( esDistrJunct )
|
} else if ( esDistrJunct )
|
||||||
EFVisitDevs(devDistJunctVisit, (ClientData) NULL);
|
EFVisitDevs(devDistJunctVisit, (ClientData) NULL);
|
||||||
|
|
|
||||||
|
|
@ -603,57 +603,33 @@ efBuildEquiv(def, nodeName1, nodeName2, resist, isspice)
|
||||||
}
|
}
|
||||||
if (!equalByCase)
|
if (!equalByCase)
|
||||||
{
|
{
|
||||||
/* If one of the nodes has been generated from the
|
if ((EFOutputFlags & EF_SHORT_MASK) != EF_SHORT_NONE)
|
||||||
* other by "extract unique", then this is a case where
|
|
||||||
* the "extract unique" algorithm is blind to shorts
|
|
||||||
* through subcell hierarchy and has made a name unique
|
|
||||||
* unnecessarily. In that case, merge the node instead
|
|
||||||
* of generating a short.
|
|
||||||
*/
|
|
||||||
char *uniqstr1, *uniqstr2;
|
|
||||||
bool isuniq;
|
|
||||||
|
|
||||||
uniqstr1 = strstr(nodeName1, "_uq");
|
|
||||||
uniqstr2 = strstr(nodeName2, "_uq");
|
|
||||||
if (uniqstr1) *uniqstr1 = '\0';
|
|
||||||
if (uniqstr2) *uniqstr2 = '\0';
|
|
||||||
isuniq = !strcmp(nodeName1, nodeName2);
|
|
||||||
if (uniqstr1) *uniqstr1 = '_';
|
|
||||||
if (uniqstr2) *uniqstr2 = '_';
|
|
||||||
|
|
||||||
if (!isuniq)
|
|
||||||
{
|
{
|
||||||
if ((EFOutputFlags & EF_SHORT_MASK) != EF_SHORT_NONE)
|
int i;
|
||||||
{
|
int sdev;
|
||||||
int i;
|
char *argv[10], zeroarg[] = "0";
|
||||||
int sdev;
|
|
||||||
char *argv[10], zeroarg[] = "0";
|
|
||||||
|
|
||||||
if ((EFOutputFlags & EF_SHORT_MASK) == EF_SHORT_R)
|
if ((EFOutputFlags & EF_SHORT_MASK) == EF_SHORT_R)
|
||||||
sdev = DEV_RES;
|
sdev = DEV_RES;
|
||||||
else
|
|
||||||
sdev = DEV_VOLT;
|
|
||||||
|
|
||||||
for (i = 0; i < 10; i++) argv[i] = zeroarg;
|
|
||||||
argv[0] = StrDup((char **)NULL, "0.0");
|
|
||||||
argv[1] = StrDup((char **)NULL, "dummy");
|
|
||||||
argv[4] = StrDup((char **)NULL, nodeName1);
|
|
||||||
argv[7] = StrDup((char **)NULL, nodeName2);
|
|
||||||
efBuildDevice(def, sdev, "None", &GeoNullRect, 10, argv);
|
|
||||||
freeMagic(argv[0]);
|
|
||||||
freeMagic(argv[1]);
|
|
||||||
freeMagic(argv[4]);
|
|
||||||
freeMagic(argv[7]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (!resist)
|
|
||||||
TxError("Warning: Ports \"%s\" and \"%s\" are electrically "
|
|
||||||
"shorted.\n", nodeName1, nodeName2);
|
|
||||||
else
|
else
|
||||||
/* Do not merge the nodes when folding in extresist parasitics */
|
sdev = DEV_VOLT;
|
||||||
return;
|
|
||||||
|
for (i = 0; i < 10; i++) argv[i] = zeroarg;
|
||||||
|
argv[0] = StrDup((char **)NULL, "0.0");
|
||||||
|
argv[1] = StrDup((char **)NULL, "dummy");
|
||||||
|
argv[4] = StrDup((char **)NULL, nodeName1);
|
||||||
|
argv[7] = StrDup((char **)NULL, nodeName2);
|
||||||
|
efBuildDevice(def, sdev, "None", &GeoNullRect, 10, argv);
|
||||||
|
freeMagic(argv[0]);
|
||||||
|
freeMagic(argv[1]);
|
||||||
|
freeMagic(argv[4]);
|
||||||
|
freeMagic(argv[7]);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else if (resist)
|
else if (!resist)
|
||||||
|
TxError("Warning: Ports \"%s\" and \"%s\" are electrically shorted.\n",
|
||||||
|
nodeName1, nodeName2);
|
||||||
|
else
|
||||||
/* Do not merge the nodes when folding in extresist parasitics */
|
/* Do not merge the nodes when folding in extresist parasitics */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -676,6 +652,8 @@ efBuildEquiv(def, nodeName1, nodeName2, resist, isspice)
|
||||||
if (efWarn)
|
if (efWarn)
|
||||||
efReadError("Merged nodes %s and %s\n", nodeName1, nodeName2);
|
efReadError("Merged nodes %s and %s\n", nodeName1, nodeName2);
|
||||||
lostnode = efNodeMerge(&nn1->efnn_node, &nn2->efnn_node);
|
lostnode = efNodeMerge(&nn1->efnn_node, &nn2->efnn_node);
|
||||||
|
if (nn1->efnn_port > 0) nn2->efnn_port = nn1->efnn_port;
|
||||||
|
else if (nn2->efnn_port > 0) nn1->efnn_port = nn2->efnn_port;
|
||||||
|
|
||||||
/* Check if there are any device terminals pointing to the
|
/* Check if there are any device terminals pointing to the
|
||||||
* node that was just removed.
|
* node that was just removed.
|
||||||
|
|
@ -1568,25 +1546,7 @@ efBuildConnect(def, nodeName1, nodeName2, deltaC, av, ac)
|
||||||
unsigned size = sizeof (Connection)
|
unsigned size = sizeof (Connection)
|
||||||
+ (efNumResistClasses - 1) * sizeof (EFPerimArea);
|
+ (efNumResistClasses - 1) * sizeof (EFPerimArea);
|
||||||
|
|
||||||
/* If one of the nodes has been generated from the
|
if ((EFOutputFlags & EF_SHORT_MASK) != EF_SHORT_NONE)
|
||||||
* other by "extract unique", then this is a case where
|
|
||||||
* the "extract unique" algorithm is blind to shorts
|
|
||||||
* through subcell hierarchy and has made a name unique
|
|
||||||
* unnecessarily. In that case, merge the node instead
|
|
||||||
* of generating a short.
|
|
||||||
*/
|
|
||||||
char *uniqstr1, *uniqstr2;
|
|
||||||
bool isuniq;
|
|
||||||
|
|
||||||
uniqstr1 = strstr(nodeName1, "_uq");
|
|
||||||
uniqstr2 = strstr(nodeName2, "_uq");
|
|
||||||
if (uniqstr1) *uniqstr1 = '\0';
|
|
||||||
if (uniqstr2) *uniqstr2 = '\0';
|
|
||||||
isuniq = !strcmp(nodeName1, nodeName2);
|
|
||||||
if (uniqstr1) *uniqstr1 = '_';
|
|
||||||
if (uniqstr2) *uniqstr2 = '_';
|
|
||||||
|
|
||||||
if (!isuniq && ((EFOutputFlags & EF_SHORT_MASK) != EF_SHORT_NONE))
|
|
||||||
{
|
{
|
||||||
/* Handle the case where two ports on different nets get merged.
|
/* Handle the case where two ports on different nets get merged.
|
||||||
* If "extract short resistor" or "extract short voltage" has
|
* If "extract short resistor" or "extract short voltage" has
|
||||||
|
|
@ -1989,10 +1949,8 @@ efNodeMerge(node1ptr, node2ptr)
|
||||||
if (*node1ptr == *node2ptr)
|
if (*node1ptr == *node2ptr)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/*
|
/* Keep the node with the greater number of entries, and merge */
|
||||||
* Keep the node with the greater number of entries, and merge
|
/* the node with fewer entries into it. */
|
||||||
* the node with fewer entries into it.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((*node1ptr)->efnode_num >= (*node2ptr)->efnode_num)
|
if ((*node1ptr)->efnode_num >= (*node2ptr)->efnode_num)
|
||||||
{
|
{
|
||||||
|
|
@ -2032,7 +1990,7 @@ efNodeMerge(node1ptr, node2ptr)
|
||||||
/* Make all EFNodeNames point to "keeping" */
|
/* Make all EFNodeNames point to "keeping" */
|
||||||
if (removing->efnode_name)
|
if (removing->efnode_name)
|
||||||
{
|
{
|
||||||
bool topportk, topportr, bestname;
|
bool topportk, topportr;
|
||||||
|
|
||||||
for (nn = removing->efnode_name; nn; nn = nn->efnn_next)
|
for (nn = removing->efnode_name; nn; nn = nn->efnn_next)
|
||||||
{
|
{
|
||||||
|
|
@ -2044,9 +2002,9 @@ efNodeMerge(node1ptr, node2ptr)
|
||||||
topportr = (removing->efnode_flags & EF_TOP_PORT) ? TRUE : FALSE;
|
topportr = (removing->efnode_flags & EF_TOP_PORT) ? TRUE : FALSE;
|
||||||
|
|
||||||
/* Concatenate list of EFNodeNames, taking into account precedence */
|
/* Concatenate list of EFNodeNames, taking into account precedence */
|
||||||
if ((!keeping->efnode_name) || (!topportk && topportr)
|
if ((!keeping->efnode_name) || (!topportk && (topportr
|
||||||
|| EFHNBest(removing->efnode_name->efnn_hier,
|
|| EFHNBest(removing->efnode_name->efnn_hier,
|
||||||
keeping->efnode_name->efnn_hier))
|
keeping->efnode_name->efnn_hier))))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* New official name is that of "removing".
|
* New official name is that of "removing".
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,6 @@ extOutputGeneratedLabels(parentUse, f)
|
||||||
|
|
||||||
parentDef = parentUse->cu_def;
|
parentDef = parentUse->cu_def;
|
||||||
|
|
||||||
free_magic1_t mm1 = freeMagic1_init();
|
|
||||||
while ((lab = parentDef->cd_labels) != NULL)
|
while ((lab = parentDef->cd_labels) != NULL)
|
||||||
{
|
{
|
||||||
if ((lab->lab_flags & LABEL_GENERATE) == 0) return;
|
if ((lab->lab_flags & LABEL_GENERATE) == 0) return;
|
||||||
|
|
@ -107,10 +106,9 @@ extOutputGeneratedLabels(parentUse, f)
|
||||||
for (n = 0; n < ExtCurStyle->exts_numResistClasses; n++)
|
for (n = 0; n < ExtCurStyle->exts_numResistClasses; n++)
|
||||||
fprintf(f, " 0 0");
|
fprintf(f, " 0 0");
|
||||||
putc('\n', f);
|
putc('\n', f);
|
||||||
freeMagic1(&mm1, lab);
|
freeMagic(lab);
|
||||||
parentDef->cd_labels = lab->lab_next;
|
parentDef->cd_labels = lab->lab_next;
|
||||||
}
|
}
|
||||||
freeMagic1_end(&mm1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -2776,12 +2776,8 @@ extOutputDevices(def, transList, outFile)
|
||||||
/* Free the lists */
|
/* Free the lists */
|
||||||
|
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
{
|
|
||||||
free_magic1_t mm1 = freeMagic1_init();
|
|
||||||
for (lb = extSpecialBounds[i]; lb != NULL; lb = lb->b_next)
|
for (lb = extSpecialBounds[i]; lb != NULL; lb = lb->b_next)
|
||||||
freeMagic1(&mm1, (char *)lb);
|
freeMagic((char *)lb);
|
||||||
freeMagic1_end(&mm1);
|
|
||||||
}
|
|
||||||
freeMagic((char *)extSpecialBounds);
|
freeMagic((char *)extSpecialBounds);
|
||||||
|
|
||||||
/* Put the region list back the way we found it: */
|
/* Put the region list back the way we found it: */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue