Browse Source

Add file_name to fcn inp_read

Add wordlist sourceinfo to store input sources
path/file, internal, etc.)
debug_out.txt adds line info (var. sourcelineinfo)
Add sourcelineinfo to wordlist sourceinfo and to each new line.
When adding lines due to compatibility handling, use existing
linenum_orig and linesource.
pre-master-46
Holger Vogt 2 years ago
parent
commit
c4cbc40a3b
  1. 107
      src/frontend/inpcom.c

107
src/frontend/inpcom.c

@ -115,6 +115,8 @@ int dynMaxckt = 0; /* subckt.c 307 */
/* number of parameter substitutions */ /* number of parameter substitutions */
long dynsubst; /* spicenum.c 221 */ long dynsubst; /* spicenum.c 221 */
wordlist* sourceinfo = NULL;
static bool has_if = FALSE; /* if we have an .if ... .endif pair */ static bool has_if = FALSE; /* if we have an .if ... .endif pair */
static char *readline(FILE *fd); static char *readline(FILE *fd);
@ -197,7 +199,7 @@ struct inp_read_t {
}; };
struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name, struct inp_read_t inp_read( FILE *fp, int call_depth, const char *dir_name,
bool comfile, bool intfile);
const char* file_name, bool comfile, bool intfile);
#ifdef XSPICE #ifdef XSPICE
@ -580,7 +582,7 @@ static struct library *read_a_lib(const char *y, const char *dir_name)
lib->habitat = ngdirname(yy); lib->habitat = ngdirname(yy);
lib->deck = lib->deck =
inp_read(newfp, 1 /*dummy*/, lib->habitat, FALSE, FALSE).cc;
inp_read(newfp, 1 /*dummy*/, lib->habitat, NULL, FALSE, FALSE).cc;
fclose(newfp); fclose(newfp);
} }
@ -826,7 +828,7 @@ static void inp_cider_models(struct card* working)
} }
else { else {
prev->actualLine = prev->actualLine =
insert_new_line(NULL, s, prev->linenum, 0);
insert_new_line(NULL, s, prev->linenum, prev->linenum_orig);
prev->actualLine->level = prev->level; prev->actualLine->level = prev->level;
prev->actualLine->nextcard = working; prev->actualLine->nextcard = working;
} }
@ -1025,7 +1027,7 @@ void inp_get_w_l_x(struct card* card) {
remove the 'level' entries from each card remove the 'level' entries from each card
*-------------------------------------------------------------------------*/ *-------------------------------------------------------------------------*/
struct card *inp_readall(FILE *fp, const char *dir_name,
struct card *inp_readall(FILE *fp, const char *dir_name, const char* file_name,
bool comfile, bool intfile, bool *expr_w_temper_p) bool comfile, bool intfile, bool *expr_w_temper_p)
{ {
struct card *cc; struct card *cc;
@ -1035,7 +1037,7 @@ struct card *inp_readall(FILE *fp, const char *dir_name,
/* set the members of the compatibility structure */ /* set the members of the compatibility structure */
set_compat_mode(); set_compat_mode();
rv = inp_read(fp, 0, dir_name, comfile, intfile);
rv = inp_read(fp, 0, dir_name, file_name, comfile, intfile);
cc = rv.cc; cc = rv.cc;
/* skip all pre-processing for expanded input files created by 'listing r' */ /* skip all pre-processing for expanded input files created by 'listing r' */
@ -1205,22 +1207,22 @@ struct card *inp_readall(FILE *fp, const char *dir_name,
"**************** uncommented deck " "**************** uncommented deck "
"**************\n\n"); "**************\n\n");
/* always print first line */ /* always print first line */
fprintf(fd, "%6d %6d %s\n", cc->linenum_orig, cc->linenum,
fprintf(fd, "%6s %6d %6d %s\n", cc->linesource, cc->linenum_orig, cc->linenum,
cc->line); cc->line);
/* here without out-commented lines */ /* here without out-commented lines */
for (t = cc->nextcard; t; t = t->nextcard) { for (t = cc->nextcard; t; t = t->nextcard) {
if (*(t->line) == '*') if (*(t->line) == '*')
continue; continue;
fprintf(fd, "%6d %6d %s\n",
t->linenum_orig, t->linenum, t->line);
fprintf(fd, "%6s %6d %6d %s\n",
t->linesource, t->linenum_orig, t->linenum, t->line);
} }
fprintf(fd, fprintf(fd,
"\n****************** complete deck " "\n****************** complete deck "
"***************\n\n"); "***************\n\n");
/* now completely */ /* now completely */
for (t = cc; t; t = t->nextcard) for (t = cc; t; t = t->nextcard)
fprintf(fd, "%6d %6d %s\n",
t->linenum_orig, t->linenum, t->line);
fprintf(fd, "%6s %6d %6d %s\n",
t->linesource, t->linenum_orig,t->linenum, t->line);
fclose(fd); fclose(fd);
fprintf(stdout, fprintf(stdout,
@ -1241,7 +1243,7 @@ struct card *inp_readall(FILE *fp, const char *dir_name,
struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name, struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name,
bool comfile, bool intfile)
const char* file_name, bool comfile, bool intfile)
/* fp: in, pointer to file to be read, /* fp: in, pointer to file to be read,
call_depth: in, nested call to fcn call_depth: in, nested call to fcn
dir_name: in, name of directory of file to be read dir_name: in, name of directory of file to be read
@ -1250,8 +1252,8 @@ struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name,
*/ */
{ {
struct inp_read_t rv; struct inp_read_t rv;
struct card* end = NULL, * cc = NULL;
char* buffer = NULL;
struct card* end = NULL, * cc = NULL, *tmpcard=NULL;
char* buffer = NULL, *sourcelineinfo=NULL;
/* segfault fix */ /* segfault fix */
#ifdef XSPICE #ifdef XSPICE
char big_buff[5000]; char big_buff[5000];
@ -1269,6 +1271,13 @@ struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name,
static int in_cider_model = 0; static int in_cider_model = 0;
#endif #endif
if (intfile)
sourcelineinfo = copy("circbyline");
else
sourcelineinfo = copy(file_name);
wl_append_word(&sourceinfo, &sourceinfo, sourcelineinfo);
/* First read in all lines & put them in the struct cc */ /* First read in all lines & put them in the struct cc */
for (;;) { for (;;) {
/* derive lines from circarray */ /* derive lines from circarray */
@ -1440,7 +1449,7 @@ struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name,
y_dir_name = ngdirname(y_resolved); y_dir_name = ngdirname(y_resolved);
newcard = inp_read( newcard = inp_read(
newfp, call_depth + 1, y_dir_name, FALSE, FALSE)
newfp, call_depth + 1, y_dir_name, NULL, FALSE, FALSE)
.cc; /* read stuff in include file into .cc; /* read stuff in include file into
netlist */ netlist */
@ -1464,6 +1473,15 @@ struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name,
line_number++; line_number++;
} }
char* tmpstr = copy(nexttok(buffer));
wl_append_word(&sourceinfo, &sourceinfo, tmpstr);
/* Add source of netlist data, for use in verbose error messages */
for (tmpcard = newcard; tmpcard; tmpcard = tmpcard->nextcard) {
/* skip *include */
tmpcard->linesource = tmpstr;
}
if (newcard) { if (newcard) {
if (newcompat.lt && !newcompat.a) if (newcompat.lt && !newcompat.a)
newcard = ltspice_compat(newcard); newcard = ltspice_compat(newcard);
@ -1476,11 +1494,10 @@ struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name,
for (end = newcard; end && end->nextcard; for (end = newcard; end && end->nextcard;
end = end->nextcard) { end = end->nextcard) {
end->linenum = line_number++; end->linenum = line_number++;
end->linenum_orig = line_number_inc++;
} }
end->linenum = line_number++; /* SJB - renumber last line */ end->linenum = line_number++; /* SJB - renumber last line */
end->linenum_orig = line_number_inc++; end->linenum_orig = line_number_inc++;
/* SJB - renumber the last line */
/* renumber the last line */
} }
/* Fix the buffer up a bit. */ /* Fix the buffer up a bit. */
@ -1684,7 +1701,7 @@ struct inp_read_t inp_read(FILE* fp, int call_depth, const char* dir_name,
{ {
end = insert_new_line( end = insert_new_line(
end, copy(buffer), line_number++, line_number_orig++); end, copy(buffer), line_number++, line_number_orig++);
end->linesource = sourcelineinfo;
if (!cc) if (!cc)
cc = end; cc = end;
} }
@ -5921,8 +5938,11 @@ static void inp_compat(struct card *card)
// comment out current variable e line // comment out current variable e line
*(card->line) = '*'; *(card->line) = '*';
// insert new lines immediately after current line // insert new lines immediately after current line
for (i = 0; i < 2; i++)
char* tmpsource = card->linesource;
for (i = 0; i < 2; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
}
} }
else { else {
ckt_array[3] = tprintf( ckt_array[3] = tprintf(
@ -5932,8 +5952,11 @@ static void inp_compat(struct card *card)
// comment out current variable e line // comment out current variable e line
*(card->line) = '*'; *(card->line) = '*';
// insert new lines immediately after current line // insert new lines immediately after current line
for (i = 0; i < 4; i++)
char* tmpsource = card->linesource;
for (i = 0; i < 4; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
}
} }
tfree(expression); tfree(expression);
tfree(title_tok); tfree(title_tok);
@ -5977,9 +6000,11 @@ static void inp_compat(struct card *card)
// comment out current variable e line // comment out current variable e line
*(card->line) = '*'; *(card->line) = '*';
// insert new B source line immediately after current line // insert new B source line immediately after current line
for (i = 0; i < 2; i++)
char* tmpsource = card->linesource;
for (i = 0; i < 2; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
}
tfree(title_tok); tfree(title_tok);
tfree(node1); tfree(node1);
tfree(node2); tfree(node2);
@ -6134,8 +6159,11 @@ static void inp_compat(struct card *card)
// comment out current variable e line // comment out current variable e line
*(card->line) = '*'; *(card->line) = '*';
// insert new lines immediately after current line // insert new lines immediately after current line
for (i = 0; i < 2; i++)
char* tmpsource = card->linesource;
for (i = 0; i < 2; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
}
} }
else { else {
ckt_array[3] = tprintf(".model xfer_%s pwl(x_array=[%s] y_array=[%s] " ckt_array[3] = tprintf(".model xfer_%s pwl(x_array=[%s] y_array=[%s] "
@ -6143,8 +6171,11 @@ static void inp_compat(struct card *card)
// comment out current variable g line // comment out current variable g line
*(card->line) = '*'; *(card->line) = '*';
// insert new lines immediately after current line // insert new lines immediately after current line
for (i = 0; i < 4; i++)
char* tmpsource = card->linesource;
for (i = 0; i < 4; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
}
} }
tfree(expression); tfree(expression);
@ -6200,8 +6231,11 @@ static void inp_compat(struct card *card)
// comment out current variable g line // comment out current variable g line
*(card->line) = '*'; *(card->line) = '*';
// insert new B source line immediately after current line // insert new B source line immediately after current line
for (i = 0; i < 2; i++)
char* tmpsource = card->linesource;
for (i = 0; i < 2; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
}
tfree(title_tok); tfree(title_tok);
tfree(m_token); tfree(m_token);
@ -6246,8 +6280,11 @@ static void inp_compat(struct card *card)
// comment out current variable f line // comment out current variable f line
*(card->line) = '*'; *(card->line) = '*';
// insert new three lines immediately after current line // insert new three lines immediately after current line
for (i = 0; i < 3; i++)
char* tmpsource = card->linesource;
for (i = 0; i < 3; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
}
tfree(title_tok); tfree(title_tok);
tfree(vnamstr); tfree(vnamstr);
@ -6292,8 +6329,11 @@ static void inp_compat(struct card *card)
// comment out current variable h line // comment out current variable h line
*(card->line) = '*'; *(card->line) = '*';
// insert new three lines immediately after current line // insert new three lines immediately after current line
for (i = 0; i < 3; i++)
char* tmpsource = card->linesource;
for (i = 0; i < 3; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
}
tfree(title_tok); tfree(title_tok);
tfree(vnamstr); tfree(vnamstr);
@ -6364,11 +6404,16 @@ static void inp_compat(struct card *card)
// comment out current old R line // comment out current old R line
*(card->line) = '*'; *(card->line) = '*';
// insert new B source line immediately after current line // insert new B source line immediately after current line
char* tmpsource = card->linesource;
card = insert_new_line(card, xline, 1, currlinenumber); card = insert_new_line(card, xline, 1, currlinenumber);
card->linesource = copy(tmpsource);
if (rnoise) { if (rnoise) {
card = insert_new_line(card, x2line, 2, currlinenumber); card = insert_new_line(card, x2line, 2, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, x3line, 3, currlinenumber); card = insert_new_line(card, x3line, 3, currlinenumber);
card->linesource = copy(tmpsource);
card = insert_new_line(card, x4line, 4, currlinenumber); card = insert_new_line(card, x4line, 4, currlinenumber);
card->linesource = copy(tmpsource);
} }
tfree(title_tok); tfree(title_tok);
@ -6443,8 +6488,11 @@ static void inp_compat(struct card *card)
// comment out current variable capacitor line // comment out current variable capacitor line
*(card->line) = '*'; *(card->line) = '*';
// insert new B source line immediately after current line // insert new B source line immediately after current line
for (i = 0; i < 3; i++)
char* tmpsource = card->linesource;
for (i = 0; i < 3; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
}
tfree(title_tok); tfree(title_tok);
tfree(node1); tfree(node1);
@ -6502,8 +6550,11 @@ static void inp_compat(struct card *card)
// comment out current variable inductor line // comment out current variable inductor line
*(card->line) = '*'; *(card->line) = '*';
// insert new B source line immediately after current line // insert new B source line immediately after current line
for (i = 0; i < 3; i++)
char* tmpsource = card->linesource;
for (i = 0; i < 3; i++) {
card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber); card = insert_new_line(card, ckt_array[i], (int)i + 1, currlinenumber);
card->linesource = copy(tmpsource);
}
tfree(title_tok); tfree(title_tok);
tfree(node1); tfree(node1);

Loading…
Cancel
Save