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:
parent
482d7534a2
commit
07267dc126
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue