Browse Source

New parameter char *linesource for fcn insert_new_line

Make Fcn inp_read in inpcom.c static
pre-master-46
Holger Vogt 2 years ago
parent
commit
63d496b564
  1. 117
      src/frontend/inpcom.c
  2. 2
      src/frontend/inpcom.h
  3. 33
      src/frontend/inpcompat.c
  4. 8
      src/xspice/evt/evtcheck_nodes.c

117
src/frontend/inpcom.c

@ -198,7 +198,7 @@ struct inp_read_t {
int line_number; 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); 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 *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); struct card *x = TMALLOC(struct card, 1);
@ -443,6 +443,7 @@ struct card *insert_new_line(
x->linenum = linenum; x->linenum = linenum;
x->linenum_orig = linenum_orig; x->linenum_orig = linenum_orig;
x->level = card ? card->level : NULL; x->level = card ? card->level : NULL;
x->linesource = lineinfo;
if (card) if (card)
card->nextcard = x; card->nextcard = x;
@ -828,7 +829,7 @@ static void inp_cider_models(struct card* working)
} }
else { else {
prev->actualLine = 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->level = prev->level;
prev->actualLine->nextcard = working; 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) 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
@ -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 */ /* append `buffer' to the (cc, end) chain of decks */
{ {
end = insert_new_line( end = insert_new_line(
end, copy(buffer), line_number, line_number);
end, copy(buffer), line_number, line_number, NULL);
if (!cc) if (!cc)
cc = end; 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 = 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) if (!cc)
cc = end; 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 (call_depth == 0 && !comfile) {
if (!cp_getvar("no_auto_gnd", CP_BOOL, NULL, 0)) 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 else
insert_new_line( 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) { if (!newcompat.lt && !newcompat.ps && !newcompat.s3) {
/* process all library section references */ /* 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 (call_depth == 0 && !comfile)
if (found_end == TRUE) if (found_end == TRUE)
end = insert_new_line( 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 */ /* Replace first line with the new title, if available */
if (call_depth == 0 && !comfile && new_title) { 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]); tfree(xy_values2[1]);
*c->line = '*'; *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 #endif
return 1; return 1;
} else { } 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", line = tprintf("b_gen_%.*s gen_node_%.*s 0 v=%.*s",
BSTR(e), BSTR(e), BSTR(expr)); 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) { if (n2) {
line = tprintf("a_gen_%.*s gen_node_%.*s %%%cd(%.*s %.*s) " line = tprintf("a_gen_%.*s gen_node_%.*s %%%cd(%.*s %.*s) "
"gen_model_%.*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)); 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]", line = tprintf(".model gen_model_%.*s xfer %s table = [%.*s]",
BSTR(e), BSTR(e),
ri ? "r_i=true" : rad ? "rad=true" : !db ? "db=false" : "", ri ? "r_i=true" : rad ? "rad=true" : !db ? "db=false" : "",
BSTR(list)); 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 #endif
} }
@ -2489,12 +2489,12 @@ static void inp_add_control_section(struct card *deck, int *line_number)
if (last_end) if (last_end)
prev_card = last_end; prev_card = last_end;
for (lp = cards; *lp; ++lp) 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))) { if (cp_getvar("rawfile", CP_STRING, rawfile, sizeof(rawfile))) {
line = tprintf("write %s", 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 = skip_back_non_ws(beg, s);
beg[-1] = '\0'; /* fixme can be < 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 */ /* create list of parameters that need to get sorted */
first_param_card = c = NULL; first_param_card = c = NULL;
while ((ptr1 = strchr(beg, '=')) != NULL) { while ((ptr1 = strchr(beg, '=')) != NULL) {
@ -3431,7 +3431,7 @@ static char *inp_fix_subckt(struct names *subckt_w_params, char *s)
beg = ptr2; 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) if (!first_param_card)
first_param_card = c; 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; struct card *t = section_def;
for (; t; t = t->nextcard) { for (; t; t = t->nextcard) {
c = insert_new_line( 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) { if (t == section_def) {
c->line[0] = '*'; c->line[0] = '*';
c->line[1] = '<'; c->line[1] = '<';
@ -5450,7 +5450,7 @@ static int inp_split_multi_param_lines(struct card *card, int line_num)
*(card->line) = '*'; *(card->line) = '*';
// insert new param lines immediately after current line // insert new param lines immediately after current line
for (i = 0; i < counter; i++) 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); tfree(array);
} }
@ -5938,10 +5938,8 @@ 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
char* tmpsource = card->linesource;
for (i = 0; i < 2; i++) { 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 { else {
@ -5952,10 +5950,8 @@ 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
char* tmpsource = card->linesource;
for (i = 0; i < 4; i++) { 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); tfree(expression);
@ -6000,10 +5996,8 @@ 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
char* tmpsource = card->linesource;
for (i = 0; i < 2; i++) { 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(title_tok);
tfree(node1); tfree(node1);
@ -6159,10 +6153,8 @@ 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
char* tmpsource = card->linesource;
for (i = 0; i < 2; i++) { 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 { else {
@ -6171,10 +6163,8 @@ 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
char* tmpsource = card->linesource;
for (i = 0; i < 4; i++) { 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 // 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
char* tmpsource = card->linesource;
for (i = 0; i < 2; i++) { 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(title_tok);
@ -6280,10 +6268,8 @@ 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
char* tmpsource = card->linesource;
for (i = 0; i < 3; i++) { 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); tfree(title_tok);
@ -6329,10 +6315,8 @@ 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
char* tmpsource = card->linesource;
for (i = 0; i < 3; i++) { 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); tfree(title_tok);
@ -6404,16 +6388,11 @@ 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->linesource = copy(tmpsource);
card = insert_new_line(card, xline, 1, currlinenumber, card->linesource);
if (rnoise) { 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); tfree(title_tok);
@ -6488,10 +6467,8 @@ 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
char* tmpsource = card->linesource;
for (i = 0; i < 3; i++) { 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); tfree(title_tok);
@ -6550,10 +6527,8 @@ 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
char* tmpsource = card->linesource;
for (i = 0; i < 3; i++) { 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); tfree(title_tok);
@ -6712,7 +6687,7 @@ static void inp_compat(struct card *card)
card->line = inp_remove_ws(curr_line); card->line = inp_remove_ws(curr_line);
// insert new B source line immediately after current line // insert new B source line immediately after current line
for (ii = paui; ii < pai; ii++) 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; paui = pai;
} }
@ -6809,7 +6784,7 @@ static void inp_compat(struct card *card)
// *(ckt_array[0]) = '*'; // *(ckt_array[0]) = '*';
// insert new B source line immediately after current line // insert new B source line immediately after current line
for (ii = paui; ii < pai; ii++) 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; paui = pai;
// continue; // continue;
@ -6910,7 +6885,7 @@ static void inp_bsource_compat(struct card *card)
// insert new B source line immediately after current line // insert new B source line immediately after current line
/* Copy old line numbers into new B source line */ /* Copy old line numbers into new B source line */
card = insert_new_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); tfree(new_str);
} /* end of if 'b' */ } /* end of if 'b' */
@ -7271,8 +7246,8 @@ static void inp_add_series_resistor(struct card *deck)
*(card->line) = '*'; *(card->line) = '*';
// insert new new L and R lines immediately after current 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(title_tok);
tfree(node1); tfree(node1);
@ -7308,7 +7283,7 @@ static void subckt_params_to_param(struct card *card)
/* card->line ends with subcircuit name */ /* card->line ends with subcircuit name */
cut_line[-1] = '\0'; cut_line[-1] = '\0';
/* insert new_line after card->line */ /* 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 { else {
/* Or just enter new line into deck */ /* 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 = '*'; *card->line = '*';
} }
} }
@ -7877,7 +7852,7 @@ static void inp_fix_agauss_in_param(struct card *deck, char *fcn)
*card->line = '*'; *card->line = '*';
/* Enter new line into deck */ /* 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 */ /* 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); new_str = tprintf(".func %s() %s", funcname, funcbody);
*card->line = '*'; *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; return f;
} }
@ -8449,7 +8424,7 @@ static void inp_meas_current(struct card *deck)
new_line = tprintf("%s %s %s_vmeas_%d 0", new_line = tprintf("%s %s %s_vmeas_%d 0",
new_tok, node1, node1, sn); new_tok, node1, node1, sn);
/* insert new_line after card->line */ /* 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++; sn++;
tfree(new_tok); tfree(new_tok);

2
src/frontend/inpcom.h

@ -7,7 +7,7 @@
#define ngspice_INPCOM_H #define ngspice_INPCOM_H
struct card *insert_new_line(struct card *card, char *line, 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); char *inp_pathresolve(const char *name);
extern char* inp_remove_ws(char* s); extern char* inp_remove_ws(char* s);

33
src/frontend/inpcompat.c

@ -180,8 +180,7 @@ static void replace_table(struct card *startcard)
tfree(begline); tfree(begline);
tfree(card->line); tfree(card->line);
card->line = cut_line = neweline; 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 */ /* read next TABLE function in cut_line */
ftablebeg = strstr(cut_line, "table("); 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 */ /* add predefined params TEMP, VT, GMIN to beginning of deck */
char *new_str = copy(".param temp = 'temper'"); 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'"); 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"); 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 */ /* add funcs limit, pwr, pwrs, stp, if, int */
/* LIMIT( Output Expression, Limit1, Limit2) /* LIMIT( Output Expression, Limit1, Limit2)
Output will stay between the two limits given. */ 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)) }"); 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) }"); 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) }"); 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) }"); 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 )}"); 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)) }"); 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; nextcard->nextcard = oldcard;
#ifdef INTEGRATE_UDEVICES #ifdef INTEGRATE_UDEVICES
@ -715,9 +714,9 @@ struct card *pspice_compat(struct card *oldcard)
char *cut_line = card->line; char *cut_line = card->line;
if (ciprefix(".subckt", cut_line)) { if (ciprefix(".subckt", cut_line)) {
new_str = copy(".param temp = 'temper'"); 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'"); 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. /* params: replace comma separator by space.
Do nothing if you are inside of { }. */ Do nothing if you are inside of { }. */
char* parastr = strstr(cut_line, "params:"); char* parastr = strstr(cut_line, "params:");
@ -1727,16 +1726,16 @@ struct card *ltspice_compat(struct card *oldcard)
char *new_str = char *new_str =
copy(".func uplim(x, pos, z) { min(x, pos - z) + (1 - " copy(".func uplim(x, pos, z) { min(x, pos - z) + (1 - "
"(min(max(0, x - pos + z), 2 * z) / 2 / z - 1)**2)*z }"); "(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 - " 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 }"); "(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) + " new_str = copy(".func uplim_tanh(x, pos, z) { min(x, pos - z) + "
"tanh(max(0, x - pos + z) / z)*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) - " new_str = copy(".func dnlim_tanh(x, neg, z) { max(x, neg + z) - "
"tanh(max(0, neg + z - x) / z)*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; nextcard->nextcard = oldcard;
/* remove .backanno, replace 'noiseless' by 'moisy=0' */ /* remove .backanno, replace 'noiseless' by 'moisy=0' */

8
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); ln, bridge->held, bridge->held, bridge->vcc);
bridge->count = 0; bridge->count = 0;
bridge->end_index = 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, head = insert_new_line(lastcard,
copy("* Auto-bridge sub-deck."), copy("* Auto-bridge sub-deck."),
BIG + ln++, 0);
BIG + ln++, (lastcard ? lastcard->linenum_orig : 0),
(lastcard ? lastcard->linesource : NULL));
lastcard = head; lastcard = head;
} }
@ -748,7 +749,8 @@ bool Evtcheck_nodes(
*/ */
lastcard = insert_new_line(lastcard, bridge->setup, 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. bridge->setup = NULL; // Output just once.
} }

Loading…
Cancel
Save