From 632f8c033d22b8b9218710bdc38501296c87a706 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Sat, 15 Jan 2022 13:43:26 +0100 Subject: [PATCH] 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 --- src/frontend/inp.c | 2 +- src/frontend/inpcom.c | 54 +++++++++++++++++--------------- src/frontend/numparam/spicenum.c | 12 +++++-- src/frontend/numparam/xpressn.c | 16 +++++++--- src/spicelib/parser/inpptree.c | 4 +-- 5 files changed, 52 insertions(+), 36 deletions(-) diff --git a/src/frontend/inp.c b/src/frontend/inp.c index 176b97bc7..1c2babe6b 100644 --- a/src/frontend/inp.c +++ b/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; diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 6886692a2..7b9612932 100644 --- a/src/frontend/inpcom.c +++ b/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("); } diff --git a/src/frontend/numparam/spicenum.c b/src/frontend/numparam/spicenum.c index 7ea060f0c..338e83464 100644 --- a/src/frontend/numparam/spicenum.c +++ b/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 (;;) { diff --git a/src/frontend/numparam/xpressn.c b/src/frontend/numparam/xpressn.c index 3d90c710e..b375442f5 100644 --- a/src/frontend/numparam/xpressn.c +++ b/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; } diff --git a/src/spicelib/parser/inpptree.c b/src/spicelib/parser/inpptree.c index 9b85456c7..7a8818d59 100644 --- a/src/spicelib/parser/inpptree.c +++ b/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;