Extended the device parameter notation to include offsets using

'+' and '-' in the same way that '*' is currently used for specifying
a parameter scaling.  The combination of a scale and offset for the
same parameter has not (yet) been implemented.
This commit is contained in:
Tim Edwards 2023-06-21 20:44:38 -04:00
parent 482d7534a2
commit 07267dc126
8 changed files with 69 additions and 19 deletions

View File

@ -1 +1 @@
8.3.404
8.3.405

View File

@ -173,8 +173,8 @@ spcHierWriteParams(hc, dev, scale, l, w, sdM)
* esScale * esScale * plist->parm_scale
* 1E-12);
else
esSIvalue(esSpiceF, 1.0E-12 * parmval * scale * scale
* esScale * esScale);
esSIvalue(esSpiceF, 1.0E-12 * (parmval + plist->parm_offset)
* scale * scale * esScale * esScale);
}
else
{
@ -220,7 +220,8 @@ spcHierWriteParams(hc, dev, scale, l, w, sdM)
fprintf(esSpiceF, "%g", parmval * scale
* esScale * plist->parm_scale * 1E-6);
else
esSIvalue(esSpiceF, 1.0E-6 * parmval * scale * esScale);
esSIvalue(esSpiceF, (parmval + plist->parm_offset)
* scale * esScale * 1.0E-6);
}
else
{
@ -264,7 +265,8 @@ spcHierWriteParams(hc, dev, scale, l, w, sdM)
fprintf(esSpiceF, "%g", l * scale * esScale
* plist->parm_scale * 1E-6);
else
esSIvalue(esSpiceF, 1.0E-6 * l * scale * esScale);
esSIvalue(esSpiceF, 1.0E-6 * (l + plist->parm_offset)
* scale * esScale);
}
else
{
@ -287,7 +289,8 @@ spcHierWriteParams(hc, dev, scale, l, w, sdM)
fprintf(esSpiceF, "%g", dval * scale * esScale
* plist->parm_scale * 1E-6);
else
esSIvalue(esSpiceF, 1.0E-6 * dval * scale * esScale);
esSIvalue(esSpiceF, (dval + plist->parm_offset)
* scale * esScale * 1.0E-6);
dparam->parm_name[0] = '\0';
break;
}
@ -304,7 +307,8 @@ spcHierWriteParams(hc, dev, scale, l, w, sdM)
fprintf(esSpiceF, "%g", w * scale * esScale
* plist->parm_scale * 1E-6);
else
esSIvalue(esSpiceF, 1.0E-6 * w * scale * esScale);
esSIvalue(esSpiceF, 1.0E-6 * (w + plist->parm_offset)
* scale * esScale);
break;
case 's':
fprintf(esSpiceF, " %s=", plist->parm_name);
@ -320,7 +324,8 @@ spcHierWriteParams(hc, dev, scale, l, w, sdM)
fprintf(esSpiceF, "%g", dev->dev_rect.r_xbot * scale
* esScale * plist->parm_scale * 1E-6);
else
esSIvalue(esSpiceF, 1.0E-6 * dev->dev_rect.r_xbot * scale * esScale);
esSIvalue(esSpiceF, (dev->dev_rect.r_xbot + plist->parm_offset)
* scale * esScale * 1.0E-6);
break;
case 'y':
fprintf(esSpiceF, " %s=", plist->parm_name);
@ -330,7 +335,8 @@ spcHierWriteParams(hc, dev, scale, l, w, sdM)
fprintf(esSpiceF, "%g", dev->dev_rect.r_ybot * scale
* esScale * plist->parm_scale * 1E-6);
else
esSIvalue(esSpiceF, 1.0E-6 * dev->dev_rect.r_ybot * scale * esScale);
esSIvalue(esSpiceF, (dev->dev_rect.r_ybot + plist->parm_offset)
* scale * esScale * 1.0E-6);
break;
case 'r':
fprintf(esSpiceF, " %s=", plist->parm_name);

View File

@ -2010,8 +2010,8 @@ spcWriteParams(dev, hierName, scale, l, w, sdM)
* esScale * esScale * plist->parm_scale
* 1E-12);
else
esSIvalue(esSpiceF, 1.0E-12 * parmval * scale * scale
* esScale * esScale);
esSIvalue(esSpiceF, 1.0E-12 * (parmval + plist->parm_offset)
* scale * scale * esScale * esScale);
}
else
{
@ -2076,7 +2076,8 @@ spcWriteParams(dev, hierName, scale, l, w, sdM)
fprintf(esSpiceF, "%g", parmval * scale
* esScale * plist->parm_scale * 1E-6);
else
esSIvalue(esSpiceF, 1.0E-12 * parmval * scale * esScale);
esSIvalue(esSpiceF, 1.0E-12 * (parmval + plist->parm_offset)
* scale * esScale);
}
else
{
@ -2139,7 +2140,8 @@ spcWriteParams(dev, hierName, scale, l, w, sdM)
fprintf(esSpiceF, "%g", l * scale * esScale
* plist->parm_scale * 1E-6);
else
esSIvalue(esSpiceF, 1.0E-6 * l * scale * esScale);
esSIvalue(esSpiceF, 1.0E-6 * (l + plist->parm_offset)
* scale * esScale);
}
else
{
@ -2162,7 +2164,8 @@ spcWriteParams(dev, hierName, scale, l, w, sdM)
fprintf(esSpiceF, "%g", dval * scale * esScale
* plist->parm_scale * 1E-6);
else
esSIvalue(esSpiceF, 1.0E-6 * dval * scale * esScale);
esSIvalue(esSpiceF, (dval + plist->parm_offset)
* scale * esScale * 1.0E-6);
dparam->parm_name[0] = '\0';
break;
}
@ -2179,7 +2182,8 @@ spcWriteParams(dev, hierName, scale, l, w, sdM)
fprintf(esSpiceF, "%g", w * scale * esScale
* plist->parm_scale * 1E-6);
else
esSIvalue(esSpiceF, 1.0E-6 * w * scale * esScale);
esSIvalue(esSpiceF, 1.0E-6 * (w + plist->parm_offset)
* scale * esScale);
break;
case 's':
fprintf(esSpiceF, " %s=", plist->parm_name);
@ -2195,7 +2199,8 @@ spcWriteParams(dev, hierName, scale, l, w, sdM)
fprintf(esSpiceF, "%g", dev->dev_rect.r_xbot * scale
* esScale * plist->parm_scale * 1E-6);
else
esSIvalue(esSpiceF, 1.0E-6 * dev->dev_rect.r_xbot * scale * esScale);
esSIvalue(esSpiceF, (dev->dev_rect.r_xbot + plist->parm_offset)
* scale * esScale * 1.0E-6);
break;
case 'y':
fprintf(esSpiceF, " %s=", plist->parm_name);
@ -2205,7 +2210,8 @@ spcWriteParams(dev, hierName, scale, l, w, sdM)
fprintf(esSpiceF, "%g", dev->dev_rect.r_ybot * scale
* esScale * plist->parm_scale * 1E-6);
else
esSIvalue(esSpiceF, 1.0E-6 * dev->dev_rect.r_ybot * scale * esScale);
esSIvalue(esSpiceF, (dev->dev_rect.r_ybot + plist->parm_offset)
* scale * esScale * 1.0E-6);
break;
case 'r':
fprintf(esSpiceF, " %s=", plist->parm_name);

View File

@ -692,7 +692,7 @@ efBuildDeviceParams(name, argc, argv)
/* Parse arguments for each parameter */
for (n = 0; n < argc; n++)
{
char *mult;
char *mult, *offset;
pptr = strchr(argv[n], '=');
if (pptr == NULL)
@ -716,6 +716,19 @@ efBuildDeviceParams(name, argc, argv)
else
newparm->parm_scale = 1.0;
if ((offset = strchr(pptr + 1, '+')) != NULL)
{
*offset = '\0';
newparm->parm_offset = atof(offset + 1);
}
else if ((offset = strchr(pptr + 1, '-')) != NULL)
{
*offset = '\0';
newparm->parm_offset = -atof(offset + 1);
}
else
newparm->parm_offset = 0.0;
// For parameters defined for cell defs, copy the whole
// expression verbatim into parm_name. parm_type is
// reassigned to be a numerical order.

View File

@ -269,6 +269,7 @@ typedef struct parm
char parm_type[2];
char *parm_name;
double parm_scale;
double parm_offset;
struct parm *parm_next;
} DevParam;

View File

@ -1662,6 +1662,10 @@ extOutputParameters(def, transList, outFile)
fprintf(outFile, " %c%c=%s*%g",
plist->pl_param[0], plist->pl_param[1],
plist->pl_name, plist->pl_scale);
else if (plist->pl_offset != 0.0)
fprintf(outFile, " %c%c=%s%+g",
plist->pl_param[0], plist->pl_param[1],
plist->pl_name, plist->pl_offset);
else
fprintf(outFile, " %c%c=%s", plist->pl_param[0],
plist->pl_param[1], plist->pl_name);
@ -1672,6 +1676,10 @@ extOutputParameters(def, transList, outFile)
fprintf(outFile, " %c=%s*%g",
plist->pl_param[0],
plist->pl_name, plist->pl_scale);
if (plist->pl_offset != 0.0)
fprintf(outFile, " %c=%s%+g",
plist->pl_param[0],
plist->pl_name, plist->pl_offset);
else
fprintf(outFile, " %c=%s", plist->pl_param[0],
plist->pl_name);

View File

@ -2364,7 +2364,7 @@ ExtTechLine(sectionName, argc, argv)
subcktParams = NULL;
while ((paramName = strchr(argv[argc - 1], '=')) != NULL)
{
char *mult;
char *mult, *offset;
paramName++;
newParam = (ParamList *)mallocMagic(sizeof(ParamList));
@ -2393,6 +2393,21 @@ ExtTechLine(sectionName, argc, argv)
else
newParam->pl_scale = 1.0;
if ((offset = strchr(paramName, '+')) != NULL)
{
*offset = '\0';
offset++;
newParam->pl_offset = atof(offset);
}
else if ((offset = strchr(paramName, '-')) != NULL)
{
*offset = '\0';
offset++;
newParam->pl_offset = -atof(offset);
}
else
newParam->pl_offset = 0.0;
newParam->pl_name = StrDup((char **)NULL, paramName);
newParam->pl_next = subcktParams;
subcktParams = newParam;

View File

@ -78,6 +78,7 @@ typedef struct pl
char pl_param[2]; /* Default character for parameter */
char *pl_name; /* Full name for parameter */
double pl_scale; /* Scaling of parameter, if specified */
double pl_offset; /* Offset of parameter, if specified */
struct pl *pl_next; /* Next parameter in list */
} ParamList;