Compare commits

..

No commits in common. "master" and "8.3.583" have entirely different histories.

11 changed files with 53 additions and 158 deletions

View File

@ -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: |

View File

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

View File

@ -1 +1 @@
8.3.586 8.3.583

View File

@ -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);
} }
} }

View File

@ -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);
} }
} }

View File

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

View File

@ -242,20 +242,9 @@ spcHierWriteParams(
/* Write all requested parameters to the subcircuit call. */ /* Write all requested parameters to the subcircuit call. */
bool checkme = FALSE;
if ((!strcmp(EFDevTypes[dev->dev_type], "pfet_06v0_dss")) ||
(!strcmp(EFDevTypes[dev->dev_type], "nfet_06v0_dss")))
{
checkme = TRUE;
TxPrintf("Diagnostic: Parameter list for %s\n", EFDevTypes[dev->dev_type]);
}
plist = efGetDeviceParams(EFDevTypes[dev->dev_type]); plist = efGetDeviceParams(EFDevTypes[dev->dev_type]);
while (plist != NULL) while (plist != NULL)
{ {
if (checkme) TxPrintf("Plist entry %s %s\n", plist->parm_name, plist->parm_type);
switch (plist->parm_type[0]) switch (plist->parm_type[0])
{ {
case 'a': case 'a':
@ -356,7 +345,6 @@ spcHierWriteParams(
// Check for device length vs. terminal length // Check for device length vs. terminal length
if (plist->parm_type[1] == '\0' || plist->parm_type[1] == '0') if (plist->parm_type[1] == '\0' || plist->parm_type[1] == '0')
{ {
if (checkme) TxPrintf("Handling entry l or l0\n");
fprintf(esSpiceF, " %s=", plist->parm_name); fprintf(esSpiceF, " %s=", plist->parm_name);
if (esScale < 0) if (esScale < 0)
fprintf(esSpiceF, "%g", l * scale); fprintf(esSpiceF, "%g", l * scale);
@ -371,10 +359,8 @@ spcHierWriteParams(
{ {
/* l1, l2, etc. used to indicate the length of the terminal */ /* l1, l2, etc. used to indicate the length of the terminal */
/* Find value in dev_params */ /* Find value in dev_params */
if (checkme) TxPrintf("Handling entry l1 or l2\n");
for (dparam = dev->dev_params; dparam; dparam = dparam->parm_next) for (dparam = dev->dev_params; dparam; dparam = dparam->parm_next)
{ {
if (checkme) TxPrintf("Checking dev_params entry %s\n", dparam->parm_name);
if ((strlen(dparam->parm_name) > 2) && if ((strlen(dparam->parm_name) > 2) &&
(dparam->parm_name[0] == 'l') && (dparam->parm_name[0] == 'l') &&
(dparam->parm_name[1] == plist->parm_type[1]) && (dparam->parm_name[1] == plist->parm_type[1]) &&
@ -383,8 +369,6 @@ spcHierWriteParams(
int dval; int dval;
if (sscanf(&dparam->parm_name[3], "%d", &dval) == 1) if (sscanf(&dparam->parm_name[3], "%d", &dval) == 1)
{ {
if (checkme) TxPrintf("Handling dev_params entry %s (to be "
"culled at end)\n", dparam->parm_name);
fprintf(esSpiceF, " %s=", plist->parm_name); fprintf(esSpiceF, " %s=", plist->parm_name);
if (esScale < 0) if (esScale < 0)
fprintf(esSpiceF, "%g", dval * scale); fprintf(esSpiceF, "%g", dval * scale);
@ -394,7 +378,6 @@ spcHierWriteParams(
else else
esSIvalue(esSpiceF, (dval + plist->parm_offset) esSIvalue(esSpiceF, (dval + plist->parm_offset)
* scale * esScale * 1.0E-6); * scale * esScale * 1.0E-6);
/* Why is this here? */
dparam->parm_name[0] = '\0'; dparam->parm_name[0] = '\0';
break; break;
} }

View File

@ -1347,10 +1347,7 @@ main(
{ {
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);

View File

@ -602,26 +602,6 @@ efBuildEquiv(def, nodeName1, nodeName2, resist, isspice)
if (!strcasecmp(nodeName1, nodeName2)) equalByCase = TRUE; if (!strcasecmp(nodeName1, nodeName2)) equalByCase = TRUE;
} }
if (!equalByCase) 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)
{ {
@ -647,16 +627,12 @@ efBuildEquiv(def, nodeName1, nodeName2, resist, isspice)
return; return;
} }
else if (!resist) else if (!resist)
TxError("Warning: Ports \"%s\" and \"%s\" are electrically " TxError("Warning: Ports \"%s\" and \"%s\" are electrically shorted.\n",
"shorted.\n", nodeName1, nodeName2); nodeName1, nodeName2);
else else
/* Do not merge the nodes when folding in extresist parasitics */ /* Do not merge the nodes when folding in extresist parasitics */
return; return;
} }
else if (resist)
/* Do not merge the nodes when folding in extresist parasitics */
return;
}
} }
/* If both names exist and are for different nodes, merge them */ /* If both names exist and are for different nodes, merge them */
@ -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.
@ -926,22 +904,20 @@ efBuildDevice(
/* Parse initial arguments for parameters */ /* Parse initial arguments for parameters */
while ((pptr = strchr(argv[argstart], '=')) != NULL) while ((pptr = strchr(argv[argstart], '=')) != NULL)
{ {
/* If the parameter is in the parameter list "devp", then save // Check if this parameter is in the table.
* the value as appropriate. If not, then the entire phrase // If so, handle appropriately. Otherwise, the
* will be output verbatim, so just save the whole string. // parameter gets saved verbatim locally. The
* // "parameters" line comes before any "device" line
* The "parameters" line comes before any "device" line in the // in the .ext file, so the table should be complete.
* .ext file, so the "devp" list should be complete.
*/
*pptr = '\0'; *pptr = '\0';
for (sparm = devp; sparm; sparm = sparm->parm_next) for (sparm = devp; sparm; sparm = sparm->parm_next)
if (!strncasecmp(sparm->parm_type, argv[argstart], 2)) if (!strcasecmp(sparm->parm_type, argv[argstart]))
break; break;
*pptr = '='; *pptr = '=';
if (sparm == NULL) if (sparm == NULL)
{ {
/* Copy the whole string into dev_params */ /* Copy the parameter into dev_params */
/* (parm_type and parm_scale records are not used) */ /* (parm_type and parm_scale records are not used) */
newparm = (DevParam *)mallocMagic(sizeof(DevParam)); newparm = (DevParam *)mallocMagic(sizeof(DevParam));
newparm->parm_name = StrDup((char **)NULL, argv[argstart]); newparm->parm_name = StrDup((char **)NULL, argv[argstart]);
@ -956,59 +932,30 @@ efBuildDevice(
{ {
case 'a': case 'a':
if ((pptr - argv[argstart]) == 2) if ((pptr - argv[argstart]) == 2)
devtmp.dev_area = (int)(0.5 + (float)atoi(pptr) devtmp.dev_area = atoi(pptr);
* locScale * locScale);
else else
{ {
/* Check for a0, a1, a2, ... If a0, handle like "a".
* Otherwise, don't handle it here.
*/
pn = *(argv[argstart] + 1) - '0'; pn = *(argv[argstart] + 1) - '0';
if (pn == 0) if (pn == 0)
devtmp.dev_area = (int)(0.5 + (float)atoi(pptr) devtmp.dev_area = (int)(0.5 + (float)atoi(pptr)
* locScale * locScale); * locScale * locScale);
/* Otherwise, punt */
} }
break; break;
case 'p': case 'p':
if ((pptr - argv[argstart]) == 2) if ((pptr - argv[argstart]) == 2)
devtmp.dev_perim = (int)(0.5 + (float)atoi(pptr) * locScale); devtmp.dev_perim = atoi(pptr);
else else
{ {
/* Check for p0, p1, p2, ... If p0, handle like "p".
* Otherwise, don't handle it here.
*/
pn = *(argv[argstart] + 1) - '0'; pn = *(argv[argstart] + 1) - '0';
if (pn == 0) if (pn == 0)
devtmp.dev_perim = (int)(0.5 + (float)atoi(pptr) * locScale); devtmp.dev_perim = (int)(0.5 + (float)atoi(pptr) * locScale);
/* Otherwise, use verbatim */
} }
break; break;
case 'l': case 'l':
if ((pptr - argv[argstart]) == 2)
devtmp.dev_length = (int)(0.5 + (float)atoi(pptr) * locScale); devtmp.dev_length = (int)(0.5 + (float)atoi(pptr) * locScale);
else
{
/* Check for l0, l1, l2, ... If l0, handle like "l".
* Otherwise, save it verbatim like an unknown parameter,
* because its value will not be calculated from terminal
* values like "a1, a2, ..." or "p1, p2, ...".
*/
pn = *(argv[argstart] + 1) - '0';
if (pn == 0)
devtmp.dev_length = (int)(0.5 + (float)atoi(pptr) * locScale);
else
{
/* Copy the whole string into dev_params */
newparm = (DevParam *)mallocMagic(sizeof(DevParam));
newparm->parm_name = StrDup((char **)NULL, argv[argstart]);
newparm->parm_next = devtmp.dev_params;
devtmp.dev_params = newparm;
}
}
break; break;
case 'w': case 'w':
devtmp.dev_width = (int)(0.5 + (float)atoi(pptr) * locScale); devtmp.dev_width = (int)(0.5 + (float)atoi(pptr) * locScale);
break; break;
@ -1599,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
@ -2020,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)
{ {
@ -2063,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)
{ {
@ -2075,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".

View File

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

View File

@ -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: */