Browse Source

unify the evaluation of '.options scale=xx'

.option in a netlist will override 'options'
from spinit, .spiceinit or a script
'.options scalm=xx' yields a warning, it is not supported.
pre-master-46
Holger Vogt 5 years ago
parent
commit
8da2f3c16d
  1. 92
      src/frontend/inp.c

92
src/frontend/inp.c

@ -761,32 +761,58 @@ inp_spsource(FILE *fp, bool comfile, char *filename, bool intfile)
if (newcompat.hs || newcompat.spe) {
struct card* scan;
double dscale = 1;
/* from .options */
for (scan = options; scan; scan = scan->nextcard) {
/* from options in a script */
for (scan = com_options; scan; scan = scan->nextcard) {
char* tmpscale = strstr(scan->line, "scale=");
if (tmpscale) {
int err;
tmpscale = tmpscale + 6;
dscale = INPevaluate(&tmpscale, &err, 1);
if (err == 0)
if (err == 0) {
cp_vset("scale", CP_REAL, &dscale);
printf("option SCALE: Scale set to %g for instance and model parameters\n", dscale);
}
else
fprintf(stderr, "\nError: Could not set 'scale' variable\n");
break;
}
tmpscale = strstr(scan->line, "scalm=");
if (tmpscale) {
int err;
tmpscale = tmpscale + 6;
dscale = INPevaluate(&tmpscale, &err, 1);
if (err == 0) {
cp_vset("scalm", CP_REAL, &dscale);
fprintf(stderr, "Warning: option SCALM is not supported.\n");
}
else
fprintf(stderr, "\nError: Could not set 'scalm' variable\n");
}
}
/* from options in a .control section */
for (scan = com_options; scan; scan = scan->nextcard) {
/* from .options (will override the previous settings) */
for (scan = options; scan; scan = scan->nextcard) {
char* tmpscale = strstr(scan->line, "scale=");
if (tmpscale) {
int err;
tmpscale = tmpscale + 6;
dscale = INPevaluate(&tmpscale, &err, 1);
if (err == 0)
if (err == 0) {
cp_vset("scale", CP_REAL, &dscale);
printf("option SCALE: Scale set to %g for instance and model parameters\n", dscale);
}
else
fprintf(stderr, "\nError: Could not set 'scale' variable\n");
break;
}
tmpscale = strstr(scan->line, "scalm=");
if (tmpscale) {
int err;
tmpscale = tmpscale + 6;
dscale = INPevaluate(&tmpscale, &err, 1);
if (err == 0) {
cp_vset("scalm", CP_REAL, &dscale);
fprintf(stderr, "Warning: option SCALM is not supported\n");
}
else
fprintf(stderr, "\nError: Could not set 'scalm' variable\n");
}
}
}
@ -1093,11 +1119,9 @@ inp_dodeck(
struct circ *ct;
struct card *dd;
CKTcircuit *ckt;
char *s;
INPtables *tab = NULL;
struct variable *eev = NULL;
wordlist *wl;
bool noparse, ii;
bool noparse;
int print_listing;
bool have_err = FALSE;
int warn; /* whether SOA check should be performed */
@ -1128,52 +1152,6 @@ inp_dodeck(
}
noparse = cp_getvar("noparse", CP_BOOL, NULL, 0);
/* We check preliminary for the scale option. This special processing
is needed because we need the scale info BEFORE building the circuit
and seems there is no other way to do this. */
if (!noparse) {
struct card *opt_beg = options;
for (; options; options = options->nextcard) {
s = skip_non_ws(options->line);
ii = cp_interactive;
cp_interactive = FALSE;
wl = cp_lexer(s);
cp_interactive = ii;
if (!wl || !wl->wl_word || !*wl->wl_word)
continue;
if (eev)
eev->va_next = cp_setparse(wl);
else
ct->ci_vars = eev = cp_setparse(wl);
wl_free(wl);
while (eev && (eev->va_next))
eev = eev->va_next;
}
for (eev = ct->ci_vars; eev; eev = eev->va_next) {
switch (eev->va_type) {
case CP_BOOL:
break;
case CP_NUM:
break;
case CP_REAL:
if (strcmp("scale", eev->va_name) == 0) {
cp_vset("scale", CP_REAL, &eev->va_real);
printf("Scale set to %g\n", eev->va_real);
}
break;
case CP_STRING:
break;
default: {
fprintf(stderr, "ERROR: enumeration value `CP_LIST' not handled in inp_dodeck\nAborting...\n");
controlled_exit(EXIT_FAILURE);
}
} /* switch . . . */
}
options = opt_beg; // back to the beginning
} /* if (!noparse) . . . */
/*----------------------------------------------------
* Now assuming that we wanna parse this deck, we call
* if_inpdeck which takes the deck and returns a

Loading…
Cancel
Save