Browse Source

Make numoparam error messages more user friendly.

Add line number of netlist to the message.

Original line number added to new lines in inpcom.c.
Internal error messages only when 'ngdebug' is set
pre-master-46
Holger Vogt 4 years ago
parent
commit
632f8c033d
  1. 2
      src/frontend/inp.c
  2. 54
      src/frontend/inpcom.c
  3. 12
      src/frontend/numparam/spicenum.c
  4. 16
      src/frontend/numparam/xpressn.c
  5. 4
      src/spicelib/parser/inpptree.c

2
src/frontend/inp.c

@ -1312,7 +1312,7 @@ inp_dodeck(
out_printf("Warning: Model issue on line %d :\n %.*s ...\n%s\n",
dd->linenum_orig, 72, dd->line, dd->error);
else {
out_printf("Error on line %d :\n %s\n%s\n",
out_printf("Error on line %d or its substitute:\n %s\n%s\n",
dd->linenum_orig, dd->line, dd->error);
have_err = TRUE;
return 1;

54
src/frontend/inpcom.c

@ -2154,8 +2154,8 @@ static void inp_chk_for_multi_in_vcvs(struct card *c, int *line_number)
tfree(xy_values2[1]);
*c->line = '*';
c = insert_new_line(c, m_instance, (*line_number)++, 0);
c = insert_new_line(c, m_model, (*line_number)++, 0);
c = insert_new_line(c, m_instance, (*line_number)++, c->linenum_orig);
c = insert_new_line(c, m_model, (*line_number)++, c->linenum_orig);
}
}
}
@ -4997,7 +4997,7 @@ static void inp_reorder_params(
// iterate through deck and find lines with multiply defined parameters
//
// split line up into multiple lines and place those new lines immediately
// afetr the current multi-param line in the deck
// after the current multi-param line in the deck
static int inp_split_multi_param_lines(struct card *card, int line_num)
{
@ -5063,7 +5063,7 @@ static int inp_split_multi_param_lines(struct card *card, int line_num)
*(card->line) = '*';
// insert new param lines immediately after current line
for (i = 0; i < counter; i++)
card = insert_new_line(card, array[i], line_num++, 0);
card = insert_new_line(card, array[i], line_num++, card->linenum_orig);
tfree(array);
}
@ -5371,6 +5371,7 @@ static void inp_compat(struct card *card)
for (; card; card = card->nextcard) {
char *curr_line = card->line;
int currlinenumber = card->linenum_orig;
/* exclude any command inside .control ... .endc */
if (ciprefix(".control", curr_line)) {
@ -5506,7 +5507,7 @@ static void inp_compat(struct card *card)
*(card->line) = '*';
// insert new lines immediately after current line
for (i = 0; i < 2; i++)
card = insert_new_line(card, ckt_array[i], 0, 0);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
}
else {
ckt_array[3] = tprintf(
@ -5517,7 +5518,7 @@ static void inp_compat(struct card *card)
*(card->line) = '*';
// insert new lines immediately after current line
for (i = 0; i < 4; i++)
card = insert_new_line(card, ckt_array[i], 0, 0);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
}
tfree(expression);
tfree(title_tok);
@ -5562,7 +5563,7 @@ static void inp_compat(struct card *card)
*(card->line) = '*';
// insert new B source line immediately after current line
for (i = 0; i < 2; i++)
card = insert_new_line(card, ckt_array[i], 0, 0);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
tfree(title_tok);
tfree(node1);
@ -5707,7 +5708,7 @@ static void inp_compat(struct card *card)
*(card->line) = '*';
// insert new lines immediately after current line
for (i = 0; i < 2; i++)
card = insert_new_line(card, ckt_array[i], 0, 0);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
}
else {
ckt_array[3] = tprintf(".model xfer_%s pwl(x_array=[%s] y_array=[%s] "
@ -5716,7 +5717,7 @@ static void inp_compat(struct card *card)
*(card->line) = '*';
// insert new lines immediately after current line
for (i = 0; i < 4; i++)
card = insert_new_line(card, ckt_array[i], 0, 0);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
}
tfree(expression);
@ -5773,7 +5774,7 @@ static void inp_compat(struct card *card)
*(card->line) = '*';
// insert new B source line immediately after current line
for (i = 0; i < 2; i++)
card = insert_new_line(card, ckt_array[i], 0, 0);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
tfree(title_tok);
tfree(m_token);
@ -5819,7 +5820,7 @@ static void inp_compat(struct card *card)
*(card->line) = '*';
// insert new three lines immediately after current line
for (i = 0; i < 3; i++)
card = insert_new_line(card, ckt_array[i], 0, 0);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
tfree(title_tok);
tfree(vnamstr);
@ -5865,7 +5866,7 @@ static void inp_compat(struct card *card)
*(card->line) = '*';
// insert new three lines immediately after current line
for (i = 0; i < 3; i++)
card = insert_new_line(card, ckt_array[i], 0, 0);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
tfree(title_tok);
tfree(vnamstr);
@ -5938,11 +5939,11 @@ static void inp_compat(struct card *card)
// comment out current old R line
*(card->line) = '*';
// insert new B source line immediately after current line
card = insert_new_line(card, xline, 0, 0);
card = insert_new_line(card, xline, 1, currlinenumber);
if (rnoise) {
card = insert_new_line(card, x2line, 0, 0);
card = insert_new_line(card, x3line, 0, 0);
card = insert_new_line(card, x4line, 0, 0);
card = insert_new_line(card, x2line, 2, currlinenumber);
card = insert_new_line(card, x3line, 3, currlinenumber);
card = insert_new_line(card, x4line, 4, currlinenumber);
}
tfree(title_tok);
@ -6019,7 +6020,7 @@ static void inp_compat(struct card *card)
*(card->line) = '*';
// insert new B source line immediately after current line
for (i = 0; i < 3; i++)
card = insert_new_line(card, ckt_array[i], 0, 0);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
tfree(title_tok);
tfree(node1);
@ -6079,7 +6080,7 @@ static void inp_compat(struct card *card)
*(card->line) = '*';
// insert new B source line immediately after current line
for (i = 0; i < 3; i++)
card = insert_new_line(card, ckt_array[i], 0, 0);
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
tfree(title_tok);
tfree(node1);
@ -6235,7 +6236,7 @@ static void inp_compat(struct card *card)
card->line = inp_remove_ws(curr_line);
// insert new B source line immediately after current line
for (ii = paui; ii < pai; ii++)
card = insert_new_line(card, ckt_array[ii], 0, 0);
card = insert_new_line(card, ckt_array[ii], (int)ii + 1, currlinenumber);
paui = pai;
}
@ -6332,7 +6333,7 @@ static void inp_compat(struct card *card)
// *(ckt_array[0]) = '*';
// insert new B source line immediately after current line
for (ii = paui; ii < pai; ii++)
card = insert_new_line(card, ckt_array[ii], 0, 0);
card = insert_new_line(card, ckt_array[ii], (int)ii + 1, currlinenumber);
paui = pai;
// continue;
@ -6779,6 +6780,7 @@ static void inp_add_series_resistor(struct card *deck)
if (ciprefix("l", cut_line)) {
int currlinenumber = card->linenum_orig;
char *title_tok = gettok(&cut_line);
char *node1 = gettok(&cut_line);
char *node2 = gettok(&cut_line);
@ -6793,8 +6795,8 @@ static void inp_add_series_resistor(struct card *deck)
*(card->line) = '*';
// insert new new L and R lines immediately after current line
card = insert_new_line(card, newL, 0, 0);
card = insert_new_line(card, newR, 0, 0);
card = insert_new_line(card, newL, 1, currlinenumber);
card = insert_new_line(card, newR, 2, currlinenumber);
tfree(title_tok);
tfree(node1);
@ -6830,7 +6832,7 @@ static void subckt_params_to_param(struct card *card)
/* card->line ends with subcircuit name */
cut_line[-1] = '\0';
/* insert new_line after card->line */
insert_new_line(card, new_line, card->linenum + 1, 0);
insert_new_line(card, new_line, card->linenum + 1, card->linenum_orig);
}
}
}
@ -6948,7 +6950,7 @@ static void inp_dot_if(struct card *card)
char *firstbr = strchr(curr_line, '(');
char *lastbr = strrchr(curr_line, ')');
if ((!firstbr) || (!lastbr)) {
fprintf(cp_err, "Error in netlist line %d\n",
fprintf(cp_err, "Error in netlist line no. %d\n",
card->linenum_orig);
fprintf(cp_err, " Bad syntax: %s\n\n", curr_line);
controlled_exit(EXIT_BAD);
@ -7921,7 +7923,7 @@ static void inp_meas_current(struct card *deck)
new_line = tprintf("%s %s %s_vmeas_%d 0",
new_tok, node1, node1, sn);
/* insert new_line after card->line */
insert_new_line(card, new_line, card->linenum + 1, 0);
insert_new_line(card, new_line, card->linenum + 1, card->linenum_orig);
}
sn++;
tfree(new_tok);
@ -7975,7 +7977,7 @@ static void replace_table(struct card *startcard)
tfree(begline);
tfree(card->line);
card->line = cut_line = neweline;
insert_new_line(card, newbline, 0, 0);
insert_new_line(card, newbline, 0, card->linenum_orig);
/* read next TABLE function in cut_line */
ftablebeg = strstr(cut_line, "table(");
}

12
src/frontend/numparam/spicenum.c

@ -358,13 +358,19 @@ nupa_done(void)
bool is_interactive = FALSE;
if (cp_getvar("interactive", CP_BOOL, NULL, 0))
is_interactive = TRUE;
printf(" Copies=%d Evals=%d Placeholders=%ld Symbols=%d Errors=%d\n",
linecountS, evalcountS, placeholder, dictsize, nerrors);
if (ft_ngdebug)
printf(" Copies=%d Evals=%d Placeholders=%ld Symbols=%d Errors=%d\n",
linecountS, evalcountS, placeholder, dictsize, nerrors);
/* debug: ask if spice run really wanted */
if (ft_batchmode)
controlled_exit(EXIT_FAILURE);
if (!is_interactive) {
fprintf(cp_err, "Numparam expansion errors: Problem with input file.\n");
if (ft_ngdebug) {
fprintf(cp_err, "Numparam expansion errors: Problem with the input netlist.\n");
}
else {
fprintf(cp_err, " Please check your input netlist.\n");
}
controlled_exit(EXIT_FAILURE);
}
for (;;) {

16
src/frontend/numparam/xpressn.c

@ -219,10 +219,18 @@ message(dico_t *dico, const char *fmt, ...)
va_list ap;
if (dico->srcline >= 0)
fprintf
if (ft_ngdebug) {
fprintf
(stderr,
"Original line no.: %d, new internal line no.: %d:\n",
dico->oldline, dico->srcline);
"Netlist line no. %d, new internal line no. %d:\n",
dico->oldline, dico->srcline);
}
else {
fprintf
(stderr,
"Netlist line no. %d:\n",
dico->oldline);
}
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
@ -385,7 +393,7 @@ fetchnumentry(dico_t *dico, char *s, bool *perr)
if (entry && (entry->tp == NUPA_REAL))
return entry->vl;
*perr = message(dico, "Undefined number [%s]\n", s);
*perr = message(dico, "Undefined parameter [%s]\n", s);
return 0.0;
}

4
src/spicelib/parser/inpptree.c

@ -1547,7 +1547,7 @@ void free_tree(INPparseNode *pt)
break;
default:
printf("oops");
printf("oops ");
break;
}
@ -1666,7 +1666,7 @@ void printTree(INPparseNode * pt)
break;
default:
printf("oops");
printf("oops ");
break;
}
return;

Loading…
Cancel
Save