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