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

View File

@ -209,8 +209,10 @@ EFArgs(argc, argv, err_result, argsProc, cdata)
goto usage; goto usage;
if (strchr(cp, '!')) EFTrimFlags |= EF_TRIMGLOB; if (strchr(cp, '!')) EFTrimFlags |= EF_TRIMGLOB;
if (strchr(cp, '#')) EFTrimFlags |= EF_TRIMLOCAL; 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_CONVERTEQUAL;
if (strchr(cp, '[')) EFTrimFlags |= EF_CONVERTBRACKETS;
if (strchr(cp, ']')) EFTrimFlags |= EF_CONVERTBRACKETS;
break; break;
case 'C': case 'C':
EFCapThreshold = (EFCapValue)INFINITE_THRESHOLD_F; EFCapThreshold = (EFCapValue)INFINITE_THRESHOLD_F;

View File

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

View File

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