Added substitution for commas in SPICE output, because commas in

instance names and node names are basically fatal to running
ngspice.
This commit is contained in:
Tim Edwards 2019-10-14 21:46:07 -04:00
parent 57a5ff6094
commit e9f3dcadef
4 changed files with 43 additions and 15 deletions

View File

@ -140,9 +140,16 @@ esFormatSubs(outf, suf)
if ((EFTrimFlags & EF_TRIMGLOB ) && suf[l] == '!' ||
(EFTrimFlags & EF_TRIMLOCAL) && suf[l] == '#')
suf[l] = '\0' ;
if (EFTrimFlags & EF_CONVERTCOMMAS)
if (EFTrimFlags & EF_CONVERTCOMMA)
while ((specchar = strchr(suf, ',')) != NULL)
*specchar = ';';
*specchar = '|';
if (EFTrimFlags & EF_CONVERTBRACKETS)
{
while ((specchar = strchr(suf, '[')) != NULL)
*specchar = '_';
while ((specchar = strchr(suf, ']')) != NULL)
*specchar = '_';
}
if (EFTrimFlags & EF_CONVERTEQUAL)
while ((specchar = strchr(suf, '=')) != NULL)
*specchar = ':';
@ -607,7 +614,7 @@ CmdExtToSpice(w, cmd)
case EXTTOSPC_DEFAULT:
LocCapThreshold = 2;
LocResistThreshold = INFINITE_THRESHOLD;
EFTrimFlags = EF_CONVERTCOMMAS | EF_CONVERTEQUAL;
EFTrimFlags = EF_CONVERTCOMMA | EF_CONVERTEQUAL;
EFScale = 0.0;
if (EFArgTech)
{
@ -821,7 +828,7 @@ runexttospice:
// This forces options TRIMGLOB and CONVERTEQUAL, not sure that's such a
// good idea. . .
EFTrimFlags |= EF_TRIMGLOB | EF_CONVERTEQUAL;
EFTrimFlags |= EF_TRIMGLOB | EF_CONVERTEQUAL | EF_CONVERTCOMMA;
if (IS_FINITE_F(EFCapThreshold)) flatFlags |= EF_FLATCAPS;
if (esFormat == HSPICE)
EFTrimFlags |= EF_TRIMLOCAL;
@ -1379,7 +1386,7 @@ subcktVisit(use, hierName, is_top)
else
{
int savflags = EFTrimFlags;
EFTrimFlags = 0; // Do no substitutions on subcircuit names
EFTrimFlags = EF_CONVERTCOMMA; // Only substitute commas on subcircuit names
/* Use full hierarchical decomposition for name */
/* (not just use->use_id. hierName already has use->use_id at end) */
@ -3220,7 +3227,7 @@ EFHNSprintf(str, hierName)
char *str;
HierName *hierName;
{
bool trimGlob, trimLocal, convertComma, convertEqual;
bool trimGlob, trimLocal, convertComma, convertEqual, convertBrackets;
char *s, *cp, c;
char *efHNSprintfPrefix(HierName *, char *);
@ -3231,8 +3238,9 @@ EFHNSprintf(str, hierName)
cp = hierName->hn_name;
trimGlob = (EFTrimFlags & EF_TRIMGLOB);
trimLocal = (EFTrimFlags & EF_TRIMLOCAL);
convertComma = (EFTrimFlags & EF_CONVERTCOMMAS);
convertComma = (EFTrimFlags & EF_CONVERTCOMMA);
convertEqual = (EFTrimFlags & EF_CONVERTEQUAL);
convertBrackets = (EFTrimFlags & EF_CONVERTBRACKETS);
while (c = *cp++)
{
switch (c)
@ -3240,7 +3248,9 @@ EFHNSprintf(str, hierName)
case '!': if (!trimGlob) *str++ = c; break;
case '.': *str++ = (esFormat == HSPICE)?'@':'.'; break;
case '=': if (convertEqual) *str++ = ':'; break;
case ',': if (convertComma) *str++ = ';'; break;
case ',': if (convertComma) *str++ = '|'; break;
case '[': *str++ = (convertBrackets) ? '_' : '['; break;
case ']': *str++ = (convertBrackets) ? '_' : ']'; break;
case '#': if (trimLocal) break; // else fall through
default: *str++ = c; break;
}
@ -3257,6 +3267,8 @@ char *efHNSprintfPrefix(hierName, str)
{
char *cp, c;
bool convertEqual = (EFTrimFlags & EF_CONVERTEQUAL) ? TRUE : FALSE;
bool convertComma = (EFTrimFlags & EF_CONVERTCOMMA) ? TRUE : FALSE;
bool convertBrackets = (EFTrimFlags & EF_CONVERTBRACKETS) ? TRUE : FALSE;
if (hierName->hn_parent)
str = efHNSprintfPrefix(hierName->hn_parent, str);
@ -3265,6 +3277,13 @@ char *efHNSprintfPrefix(hierName, str)
while (1) {
if (convertEqual && (*cp == '='))
*str = ':';
else if (convertBrackets && ((*cp == '[') || (*cp == ']')))
*str = '_';
else if (*cp == ',')
{
if (convertComma) *str = '|';
else str--;
}
else
*str = *cp;
if (!(*str)) break;

View File

@ -209,8 +209,10 @@ EFArgs(argc, argv, err_result, argsProc, cdata)
goto usage;
if (strchr(cp, '!')) EFTrimFlags |= EF_TRIMGLOB;
if (strchr(cp, '#')) EFTrimFlags |= EF_TRIMLOCAL;
if (strchr(cp, ',')) EFTrimFlags |= EF_CONVERTCOMMAS;
if (strchr(cp, ',')) EFTrimFlags |= EF_CONVERTCOMMA;
if (strchr(cp, '=')) EFTrimFlags |= EF_CONVERTEQUAL;
if (strchr(cp, '[')) EFTrimFlags |= EF_CONVERTBRACKETS;
if (strchr(cp, ']')) EFTrimFlags |= EF_CONVERTBRACKETS;
break;
case 'C':
EFCapThreshold = (EFCapValue)INFINITE_THRESHOLD_F;

View File

@ -859,7 +859,7 @@ EFHNOut(hierName, outf)
HierName *hierName;
FILE *outf;
{
bool trimGlob, trimLocal, trimComma;
bool trimGlob, trimLocal, convComma, convBrackets;
char *cp, c;
if (hierName->hn_parent) efHNOutPrefix(hierName->hn_parent, outf);
@ -868,13 +868,19 @@ EFHNOut(hierName, outf)
cp = hierName->hn_name;
trimGlob = (EFTrimFlags & EF_TRIMGLOB);
trimLocal = (EFTrimFlags & EF_TRIMLOCAL);
trimComma = (EFTrimFlags & EF_CONVERTCOMMAS);
convComma = (EFTrimFlags & EF_CONVERTCOMMA);
convBrackets = (EFTrimFlags & EF_CONVERTBRACKETS);
while (c = *cp++)
{
if (*cp)
{
if (trimComma && (c == ','))
putc(';', outf);
if (c == ',')
{
if (convComma)
putc('|', outf);
}
else if (convBrackets && ((c == '[') || (c == ']')))
putc('_', outf);
else
putc(c, outf);
}

View File

@ -40,8 +40,9 @@ typedef unsigned char U_char;
/* Flags to control output of node names. Stored in EFTrimFlags */
#define EF_TRIMGLOB 0x01 /* Delete trailing '!' from names */
#define EF_TRIMLOCAL 0x02 /* Delete trailing '#' from names */
#define EF_CONVERTCOMMAS 0x04 /* Change ',' to ';' in names */
#define EF_CONVERTEQUAL 0x08 /* Change '=' to ':' in names */
#define EF_CONVERTCOMMA 0x04 /* Change ',' to '|' in names, else remove */
#define EF_CONVERTEQUAL 0x08 /* Change '=' to ':' in names, else remove */
#define EF_CONVERTBRACKETS 0x10 /* Change '[' and ']' to '_' in names */
/*
* capacitance type now set to float