diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 860508862..03e99947f 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -198,7 +198,7 @@ struct inp_read_t { int line_number; }; -struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name, +static struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name, const char* file_name, bool comfile, bool intfile); @@ -432,7 +432,7 @@ static int is_xspice_model(char* buf) */ struct card *insert_new_line( - struct card *card, char *line, int linenum, int linenum_orig) + struct card *card, char *line, int linenum, int linenum_orig, char *lineinfo) { struct card *x = TMALLOC(struct card, 1); @@ -443,6 +443,7 @@ struct card *insert_new_line( x->linenum = linenum; x->linenum_orig = linenum_orig; x->level = card ? card->level : NULL; + x->linesource = lineinfo; if (card) card->nextcard = x; @@ -828,7 +829,7 @@ static void inp_cider_models(struct card* working) } else { prev->actualLine = - insert_new_line(NULL, s, prev->linenum, prev->linenum_orig); + insert_new_line(NULL, s, prev->linenum, prev->linenum_orig, prev->linesource); prev->actualLine->level = prev->level; prev->actualLine->nextcard = working; } @@ -1242,7 +1243,7 @@ struct card *inp_readall(FILE *fp, const char *dir_name, const char* file_name, } -struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name, +static struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name, const char* file_name, bool comfile, bool intfile) /* fp: in, pointer to file to be read, call_depth: in, nested call to fcn @@ -1465,7 +1466,7 @@ struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name, /* append `buffer' to the (cc, end) chain of decks */ { end = insert_new_line( - end, copy(buffer), line_number, line_number); + end, copy(buffer), line_number, line_number, NULL); if (!cc) cc = end; @@ -1700,8 +1701,7 @@ struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name, { end = insert_new_line( - end, copy(buffer), line_number++, line_number_orig++); - end->linesource = sourcelineinfo; + end, copy(buffer), line_number++, line_number_orig++, sourcelineinfo); if (!cc) cc = end; } @@ -1722,10 +1722,10 @@ struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name, if (call_depth == 0 && !comfile) { if (!cp_getvar("no_auto_gnd", CP_BOOL, NULL, 0)) - insert_new_line(cc, copy(".global gnd"), 1, 0); + insert_new_line(cc, copy(".global gnd"), 1, 0, "internal"); else insert_new_line( - cc, copy("* gnd is not set to 0 automatically "), 1, 0); + cc, copy("* gnd is not set to 0 automatically "), 1, 0, "internal"); if (!newcompat.lt && !newcompat.ps && !newcompat.s3) { /* process all library section references */ @@ -1740,7 +1740,7 @@ struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name, if (call_depth == 0 && !comfile) if (found_end == TRUE) end = insert_new_line( - end, copy(".end"), line_number++, line_number_orig++); + end, copy(".end"), line_number++, line_number_orig++, end->linesource); /* Replace first line with the new title, if available */ if (call_depth == 0 && !comfile && new_title) { @@ -2220,8 +2220,8 @@ static int 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)++, c->linenum_orig); - c = insert_new_line(c, m_model, (*line_number)++, c->linenum_orig); + c = insert_new_line(c, m_instance, (*line_number)++, c->linenum_orig, c->linesource); + c = insert_new_line(c, m_model, (*line_number)++, c->linenum_orig, c->linesource); #endif return 1; } else { @@ -2401,7 +2401,7 @@ static void replace_freq(struct card *c, int *line_number) line = tprintf("b_gen_%.*s gen_node_%.*s 0 v=%.*s", BSTR(e), BSTR(e), BSTR(expr)); - c = insert_new_line(c, line, (*line_number)++, c->linenum_orig); + c = insert_new_line(c, line, (*line_number)++, c->linenum_orig, c->linesource); if (n2) { line = tprintf("a_gen_%.*s gen_node_%.*s %%%cd(%.*s %.*s) " "gen_model_%.*s", @@ -2412,13 +2412,13 @@ static void replace_freq(struct card *c, int *line_number) BSTR(e), BSTR(e), pt, BSTR(n1), BSTR(e)); } } - c = insert_new_line(c, line, (*line_number)++, c->linenum_orig); + c = insert_new_line(c, line, (*line_number)++, c->linenum_orig, c->linesource); line = tprintf(".model gen_model_%.*s xfer %s table = [%.*s]", BSTR(e), ri ? "r_i=true" : rad ? "rad=true" : !db ? "db=false" : "", BSTR(list)); - c = insert_new_line(c, line, (*line_number)++, c->linenum_orig); + c = insert_new_line(c, line, (*line_number)++, c->linenum_orig, c->linesource); #endif } @@ -2489,12 +2489,12 @@ static void inp_add_control_section(struct card *deck, int *line_number) if (last_end) prev_card = last_end; for (lp = cards; *lp; ++lp) - prev_card = insert_new_line(prev_card, copy(*lp), (*line_number)++, 0); + prev_card = insert_new_line(prev_card, copy(*lp), (*line_number)++, 0, "internal"); if (cp_getvar("rawfile", CP_STRING, rawfile, sizeof(rawfile))) { line = tprintf("write %s", rawfile); - prev_card = insert_new_line(prev_card, line, (*line_number)++, 0); + prev_card = insert_new_line(prev_card, line, (*line_number)++, 0, "internal"); } - insert_new_line(prev_card, copy(".endc"), (*line_number)++, 0); + insert_new_line(prev_card, copy(".endc"), (*line_number)++, 0, "internal"); } @@ -3410,7 +3410,7 @@ static char *inp_fix_subckt(struct names *subckt_w_params, char *s) beg = skip_back_non_ws(beg, s); beg[-1] = '\0'; /* fixme can be < s */ - head = insert_new_line(NULL, NULL, 0, 0); + head = insert_new_line(NULL, NULL, 0, 0, "internal"); /* create list of parameters that need to get sorted */ first_param_card = c = NULL; while ((ptr1 = strchr(beg, '=')) != NULL) { @@ -3431,7 +3431,7 @@ static char *inp_fix_subckt(struct names *subckt_w_params, char *s) beg = ptr2; - c = insert_new_line(c, copy_substring(ptr1, ptr2), 0, 0); + c = insert_new_line(c, copy_substring(ptr1, ptr2), 0, 0, "internal"); if (!first_param_card) first_param_card = c; @@ -3665,7 +3665,7 @@ static struct card *expand_section_ref(struct card *c, const char *dir_name) struct card *t = section_def; for (; t; t = t->nextcard) { c = insert_new_line( - c, copy(t->line), t->linenum, t->linenum_orig); + c, copy(t->line), t->linenum, t->linenum_orig, t->linesource); if (t == section_def) { c->line[0] = '*'; c->line[1] = '<'; @@ -5450,7 +5450,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++, card->linenum_orig); + card = insert_new_line(card, array[i], line_num++, card->linenum_orig, card->linesource); tfree(array); } @@ -5938,10 +5938,8 @@ static void inp_compat(struct card *card) // comment out current variable e line *(card->line) = '*'; // insert new lines immediately after current line - char* tmpsource = card->linesource; for (i = 0; i < 2; i++) { - card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); - card->linesource = copy(tmpsource); + card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource); } } else { @@ -5952,10 +5950,8 @@ static void inp_compat(struct card *card) // comment out current variable e line *(card->line) = '*'; // insert new lines immediately after current line - char* tmpsource = card->linesource; for (i = 0; i < 4; i++) { - card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); - card->linesource = copy(tmpsource); + card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource); } } tfree(expression); @@ -6000,10 +5996,8 @@ static void inp_compat(struct card *card) // comment out current variable e line *(card->line) = '*'; // insert new B source line immediately after current line - char* tmpsource = card->linesource; for (i = 0; i < 2; i++) { - card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); - card->linesource = copy(tmpsource); + card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource); } tfree(title_tok); tfree(node1); @@ -6159,10 +6153,8 @@ static void inp_compat(struct card *card) // comment out current variable e line *(card->line) = '*'; // insert new lines immediately after current line - char* tmpsource = card->linesource; for (i = 0; i < 2; i++) { - card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); - card->linesource = copy(tmpsource); + card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource); } } else { @@ -6171,10 +6163,8 @@ static void inp_compat(struct card *card) // comment out current variable g line *(card->line) = '*'; // insert new lines immediately after current line - char* tmpsource = card->linesource; for (i = 0; i < 4; i++) { - card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); - card->linesource = copy(tmpsource); + card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource); } } @@ -6231,10 +6221,8 @@ static void inp_compat(struct card *card) // comment out current variable g line *(card->line) = '*'; // insert new B source line immediately after current line - char* tmpsource = card->linesource; for (i = 0; i < 2; i++) { - card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); - card->linesource = copy(tmpsource); + card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource); } tfree(title_tok); @@ -6280,10 +6268,8 @@ static void inp_compat(struct card *card) // comment out current variable f line *(card->line) = '*'; // insert new three lines immediately after current line - char* tmpsource = card->linesource; for (i = 0; i < 3; i++) { - card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); - card->linesource = copy(tmpsource); + card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource); } tfree(title_tok); @@ -6329,10 +6315,8 @@ static void inp_compat(struct card *card) // comment out current variable h line *(card->line) = '*'; // insert new three lines immediately after current line - char* tmpsource = card->linesource; for (i = 0; i < 3; i++) { - card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); - card->linesource = copy(tmpsource); + card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource); } tfree(title_tok); @@ -6404,16 +6388,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 - char* tmpsource = card->linesource; - card = insert_new_line(card, xline, 1, currlinenumber); - card->linesource = copy(tmpsource); + card = insert_new_line(card, xline, 1, currlinenumber, card->linesource); if (rnoise) { - card = insert_new_line(card, x2line, 2, currlinenumber); - card->linesource = copy(tmpsource); - card = insert_new_line(card, x3line, 3, currlinenumber); - card->linesource = copy(tmpsource); - card = insert_new_line(card, x4line, 4, currlinenumber); - card->linesource = copy(tmpsource); + card = insert_new_line(card, x2line, 2, currlinenumber, card->linesource); + card = insert_new_line(card, x3line, 3, currlinenumber, card->linesource); + card = insert_new_line(card, x4line, 4, currlinenumber, card->linesource); } tfree(title_tok); @@ -6488,10 +6467,8 @@ static void inp_compat(struct card *card) // comment out current variable capacitor line *(card->line) = '*'; // insert new B source line immediately after current line - char* tmpsource = card->linesource; for (i = 0; i < 3; i++) { - card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); - card->linesource = copy(tmpsource); + card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource); } tfree(title_tok); @@ -6550,10 +6527,8 @@ static void inp_compat(struct card *card) // comment out current variable inductor line *(card->line) = '*'; // insert new B source line immediately after current line - char* tmpsource = card->linesource; for (i = 0; i < 3; i++) { - card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); - card->linesource = copy(tmpsource); + card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber, card->linesource); } tfree(title_tok); @@ -6712,7 +6687,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], (int)ii + 1, currlinenumber); + card = insert_new_line(card, ckt_array[ii], (int)ii + 1, currlinenumber, card->linesource); paui = pai; } @@ -6809,7 +6784,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], (int)ii + 1, currlinenumber); + card = insert_new_line(card, ckt_array[ii], (int)ii + 1, currlinenumber, card->linesource); paui = pai; // continue; @@ -6910,7 +6885,7 @@ static void inp_bsource_compat(struct card *card) // insert new B source line immediately after current line /* Copy old line numbers into new B source line */ card = insert_new_line( - card, final_str, card->linenum, card->linenum_orig); + card, final_str, card->linenum, card->linenum_orig, card->linesource); tfree(new_str); } /* end of if 'b' */ @@ -7271,8 +7246,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, 1, currlinenumber); - card = insert_new_line(card, newR, 2, currlinenumber); + card = insert_new_line(card, newL, 1, currlinenumber, card->linesource); + card = insert_new_line(card, newR, 2, currlinenumber, card->linesource); tfree(title_tok); tfree(node1); @@ -7308,7 +7283,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, card->linenum_orig); + insert_new_line(card, new_line, card->linenum + 1, card->linenum_orig, card->linesource); } } } @@ -7668,7 +7643,7 @@ static void inp_fix_temper_in_param(struct card *deck) } else { /* Or just enter new line into deck */ - insert_new_line(card, new_str, 0, card->linenum); + insert_new_line(card, new_str, 0, card->linenum_orig, card->linesource); *card->line = '*'; } } @@ -7877,7 +7852,7 @@ static void inp_fix_agauss_in_param(struct card *deck, char *fcn) *card->line = '*'; /* Enter new line into deck */ - insert_new_line(card, new_str, 0, card->linenum); + insert_new_line(card, new_str, 0, card->linenum_orig, card->linesource); } } /* final memory clearance */ @@ -7946,7 +7921,7 @@ static struct func_temper *inp_new_func(char *funcname, char *funcbody, new_str = tprintf(".func %s() %s", funcname, funcbody); *card->line = '*'; - insert_new_line(card, new_str, 0, card->linenum); + insert_new_line(card, new_str, 0, card->linenum_orig, card->linesource); return f; } @@ -8449,7 +8424,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, card->linenum_orig); + insert_new_line(card, new_line, card->linenum + 1, card->linenum_orig, card->linesource); } sn++; tfree(new_tok); diff --git a/src/frontend/inpcom.h b/src/frontend/inpcom.h index e7cf5eaec..69326fe58 100644 --- a/src/frontend/inpcom.h +++ b/src/frontend/inpcom.h @@ -7,7 +7,7 @@ #define ngspice_INPCOM_H struct card *insert_new_line(struct card *card, char *line, - int linenum, int linenum_orig); + int linenum, int linenum_orig, char *linesource); char *inp_pathresolve(const char *name); extern char* inp_remove_ws(char* s); diff --git a/src/frontend/inpcompat.c b/src/frontend/inpcompat.c index 19a2349cf..25a89240a 100644 --- a/src/frontend/inpcompat.c +++ b/src/frontend/inpcompat.c @@ -180,8 +180,7 @@ static void replace_table(struct card *startcard) tfree(begline); tfree(card->line); card->line = cut_line = neweline; - insert_new_line(card, newbline, 0, card->linenum_orig); - card->nextcard->linesource = card->linesource; + insert_new_line(card, newbline, 0, card->linenum_orig, card->linesource); /* read next TABLE function in cut_line */ ftablebeg = strstr(cut_line, "table("); } @@ -672,26 +671,26 @@ struct card *pspice_compat(struct card *oldcard) /* add predefined params TEMP, VT, GMIN to beginning of deck */ char *new_str = copy(".param temp = 'temper'"); - newcard = insert_new_line(NULL, new_str, 1, 0); + newcard = insert_new_line(NULL, new_str, 1, 0, "internal"); new_str = copy(".param vt = '(temper + 273.15) * 8.6173303e-5'"); - nextcard = insert_new_line(newcard, new_str, 2, 0); + nextcard = insert_new_line(newcard, new_str, 2, 0, "internal"); new_str = copy(".param gmin = 1e-12"); - nextcard = insert_new_line(nextcard, new_str, 3, 0); + nextcard = insert_new_line(nextcard, new_str, 3, 0, "internal"); /* add funcs limit, pwr, pwrs, stp, if, int */ /* LIMIT( Output Expression, Limit1, Limit2) Output will stay between the two limits given. */ new_str = copy(".func limit(x, a, b) { ternary_fcn(a > b, max(min(x, a), b), max(min(x, b), a)) }"); - nextcard = insert_new_line(nextcard, new_str, 4, 0); + nextcard = insert_new_line(nextcard, new_str, 4, 0, "internal"); new_str = copy(".func pwr(x, a) { pow(x, a) }"); - nextcard = insert_new_line(nextcard, new_str, 5, 0); + nextcard = insert_new_line(nextcard, new_str, 5, 0, "internal"); new_str = copy(".func pwrs(x, a) { sgn(x) * pow(x, a) }"); - nextcard = insert_new_line(nextcard, new_str, 6, 0); + nextcard = insert_new_line(nextcard, new_str, 6, 0, "internal"); new_str = copy(".func stp(x) { u(x) }"); - nextcard = insert_new_line(nextcard, new_str, 7, 0); + nextcard = insert_new_line(nextcard, new_str, 7, 0, "internal"); new_str = copy(".func if(a, b, c) {ternary_fcn( a , b , c )}"); - nextcard = insert_new_line(nextcard, new_str, 8, 0); + nextcard = insert_new_line(nextcard, new_str, 8, 0, "internal"); new_str = copy(".func int(x) { sign(x)*floor(abs(x)) }"); - nextcard = insert_new_line(nextcard, new_str, 9, 0); + nextcard = insert_new_line(nextcard, new_str, 9, 0, "internal"); nextcard->nextcard = oldcard; #ifdef INTEGRATE_UDEVICES @@ -715,9 +714,9 @@ struct card *pspice_compat(struct card *oldcard) char *cut_line = card->line; if (ciprefix(".subckt", cut_line)) { new_str = copy(".param temp = 'temper'"); - nextcard = insert_new_line(card, new_str, 0, 0); + nextcard = insert_new_line(card, new_str, 0, card->linenum_orig, card->linesource); new_str = copy(".param vt = '(temper + 273.15) * 8.6173303e-5'"); - nextcard = insert_new_line(nextcard, new_str, 1, 0); + nextcard = insert_new_line(nextcard, new_str, 1, card->linenum_orig, card->linesource); /* params: replace comma separator by space. Do nothing if you are inside of { }. */ char* parastr = strstr(cut_line, "params:"); @@ -1727,16 +1726,16 @@ struct card *ltspice_compat(struct card *oldcard) char *new_str = copy(".func uplim(x, pos, z) { min(x, pos - z) + (1 - " "(min(max(0, x - pos + z), 2 * z) / 2 / z - 1)**2)*z }"); - newcard = insert_new_line(NULL, new_str, 1, 0); + newcard = insert_new_line(NULL, new_str, 1, 0, "internal"); new_str = copy(".func dnlim(x, neg, z) { max(x, neg + z) - (1 - " "(min(max(0, -x + neg + z), 2 * z) / 2 / z - 1)**2)*z }"); - nextcard = insert_new_line(newcard, new_str, 2, 0); + nextcard = insert_new_line(newcard, new_str, 2, 0, "internal"); new_str = copy(".func uplim_tanh(x, pos, z) { min(x, pos - z) + " "tanh(max(0, x - pos + z) / z)*z }"); - nextcard = insert_new_line(nextcard, new_str, 3, 0); + nextcard = insert_new_line(nextcard, new_str, 3, 0, "internal"); new_str = copy(".func dnlim_tanh(x, neg, z) { max(x, neg + z) - " "tanh(max(0, neg + z - x) / z)*z }"); - nextcard = insert_new_line(nextcard, new_str, 4, 0); + nextcard = insert_new_line(nextcard, new_str, 4, 0, "internal"); nextcard->nextcard = oldcard; /* remove .backanno, replace 'noiseless' by 'moisy=0' */ diff --git a/src/xspice/evt/evtcheck_nodes.c b/src/xspice/evt/evtcheck_nodes.c index 49f8e29c7..d62f00ed6 100644 --- a/src/xspice/evt/evtcheck_nodes.c +++ b/src/xspice/evt/evtcheck_nodes.c @@ -255,7 +255,7 @@ static struct card *flush_card(struct bridge *bridge, int ln, ln, bridge->held, bridge->held, bridge->vcc); bridge->count = 0; bridge->end_index = 0; - return insert_new_line(last, copy(buff), BIG + ln, 0); + return insert_new_line(last, copy(buff), BIG + ln, last->linenum_orig, last->linesource); } @@ -738,7 +738,8 @@ bool Evtcheck_nodes( head = insert_new_line(lastcard, copy("* Auto-bridge sub-deck."), - BIG + ln++, 0); + BIG + ln++, (lastcard ? lastcard->linenum_orig : 0), + (lastcard ? lastcard->linesource : NULL)); lastcard = head; } @@ -748,7 +749,8 @@ bool Evtcheck_nodes( */ lastcard = insert_new_line(lastcard, bridge->setup, - BIG + ln++, 0); + BIG + ln++, (lastcard ? lastcard->linenum_orig : 0), + (lastcard ? lastcard->linesource : NULL)); bridge->setup = NULL; // Output just once. }