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.
This commit is contained in:
parent
8a04d049ab
commit
8da2f3c16d
|
|
@ -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) {
|
||||
char* tmpscale = strstr(scan->line, "scale=");
|
||||
if (tmpscale) {
|
||||
int err;
|
||||
tmpscale = tmpscale + 6;
|
||||
dscale = INPevaluate(&tmpscale, &err, 1);
|
||||
if (err == 0)
|
||||
cp_vset("scale", CP_REAL, &dscale);
|
||||
else
|
||||
fprintf(stderr, "\nError: Could not set 'scale' variable\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* from options in a .control section */
|
||||
/* 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 (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) {
|
||||
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");
|
||||
}
|
||||
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…
Reference in New Issue