Unify the evaluation of number of nodes for each instance

Introduce numnodes as a member of struct card
Modify insert_new_line() to set numnodes
This commit is contained in:
Holger Vogt 2021-02-13 10:11:53 +01:00
parent f600f0599e
commit 3590153fad
3 changed files with 64 additions and 60 deletions

View File

@ -210,7 +210,7 @@ static void inp_poly_err(struct card *deck);
/* insert a new card, just behind the given card */ /* insert a new card, just behind the given card */
static struct card *insert_new_line( static 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, int numnodes)
{ {
struct card *x = TMALLOC(struct card, 1); struct card *x = TMALLOC(struct card, 1);
@ -220,6 +220,7 @@ static struct card *insert_new_line(
x->line = line; x->line = line;
x->linenum = linenum; x->linenum = linenum;
x->linenum_orig = linenum_orig; x->linenum_orig = linenum_orig;
x->numnodes = numnodes;
x->level = card ? card->level : NULL; x->level = card ? card->level : NULL;
if (card) if (card)
@ -463,7 +464,7 @@ static void inp_stitch_continuation_lines(struct card *working)
} }
else { else {
prev->actualLine = prev->actualLine =
insert_new_line(NULL, s, prev->linenum, 0); insert_new_line(NULL, s, prev->linenum, 0, prev->numnodes);
prev->actualLine->level = prev->level; prev->actualLine->level = prev->level;
prev->actualLine->nextcard = working; prev->actualLine->nextcard = working;
} }
@ -1157,7 +1158,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, 0);
if (!cc) if (!cc)
cc = end; cc = end;
@ -1347,7 +1348,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++, 0);
if (!cc) if (!cc)
cc = end; cc = end;
@ -1369,10 +1370,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, 0);
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, 0);
if (!newcompat.lt && !newcompat.ps && !newcompat.s3) { if (!newcompat.lt && !newcompat.ps && !newcompat.s3) {
/* process all library section references */ /* process all library section references */
@ -1387,7 +1388,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++, 0);
/* 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) {
@ -1889,8 +1890,8 @@ static void 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)++, 0); c = insert_new_line(c, m_instance, (*line_number)++, 0, 2);
c = insert_new_line(c, m_model, (*line_number)++, 0); c = insert_new_line(c, m_model, (*line_number)++, 0, 0);
} }
} }
} }
@ -1937,14 +1938,14 @@ static void inp_add_control_section(struct card *deck, int *line_number)
if (!found_run) { if (!found_run) {
prev_card = insert_new_line( prev_card = insert_new_line(
prev_card, copy("run"), (*line_number)++, 0); prev_card, copy("run"), (*line_number)++, 0, 0);
found_run = TRUE; found_run = TRUE;
} }
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 = prev_card =
insert_new_line(prev_card, line, (*line_number)++, 0); insert_new_line(prev_card, line, (*line_number)++, 0, 0);
} }
} }
@ -1954,19 +1955,19 @@ static void inp_add_control_section(struct card *deck, int *line_number)
// check if need to add control section // check if need to add control section
if (!found_run && found_end) { if (!found_run && found_end) {
deck = insert_new_line(deck, copy(".control"), (*line_number)++, 0); deck = insert_new_line(deck, copy(".control"), (*line_number)++, 0, 0);
deck = insert_new_line(deck, copy("run"), (*line_number)++, 0); deck = insert_new_line(deck, copy("run"), (*line_number)++, 0, 0);
if (op_line) if (op_line)
deck = insert_new_line(deck, copy(op_line), (*line_number)++, 0); deck = insert_new_line(deck, copy(op_line), (*line_number)++, 0, 0);
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);
deck = insert_new_line(deck, line, (*line_number)++, 0); deck = insert_new_line(deck, line, (*line_number)++, 0, 0);
} }
deck = insert_new_line(deck, copy(".endc"), (*line_number)++, 0); deck = insert_new_line(deck, copy(".endc"), (*line_number)++, 0, 0);
} }
} }
@ -2802,7 +2803,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, 0);
/* 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) {
@ -2823,7 +2824,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, 0);
if (!first_param_card) if (!first_param_card)
first_param_card = c; first_param_card = c;
@ -3057,7 +3058,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->numnodes);
if (t == section_def) { if (t == section_def) {
c->line[0] = '*'; c->line[0] = '*';
c->line[1] = '<'; c->line[1] = '<';
@ -4702,7 +4703,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++, 0); card = insert_new_line(card, array[i], line_num++, 0, 0);
tfree(array); tfree(array);
} }
@ -5145,7 +5146,7 @@ static void inp_compat(struct card *card)
*(card->line) = '*'; *(card->line) = '*';
// insert new lines immediately after current line // insert new lines immediately after current line
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
card = insert_new_line(card, ckt_array[i], 0, 0); card = insert_new_line(card, ckt_array[i], 0, 0, 2);
} }
else { else {
ckt_array[3] = tprintf( ckt_array[3] = tprintf(
@ -5156,7 +5157,7 @@ static void inp_compat(struct card *card)
*(card->line) = '*'; *(card->line) = '*';
// insert new lines immediately after current line // insert new lines immediately after current line
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
card = insert_new_line(card, ckt_array[i], 0, 0); card = insert_new_line(card, ckt_array[i], 0, 0, 2);
} }
tfree(expression); tfree(expression);
tfree(title_tok); tfree(title_tok);
@ -5201,7 +5202,7 @@ static void inp_compat(struct card *card)
*(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++) for (i = 0; i < 2; i++)
card = insert_new_line(card, ckt_array[i], 0, 0); card = insert_new_line(card, ckt_array[i], 0, 0, 2);
tfree(title_tok); tfree(title_tok);
tfree(node1); tfree(node1);
@ -5346,7 +5347,7 @@ static void inp_compat(struct card *card)
*(card->line) = '*'; *(card->line) = '*';
// insert new lines immediately after current line // insert new lines immediately after current line
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
card = insert_new_line(card, ckt_array[i], 0, 0); card = insert_new_line(card, ckt_array[i], 0, 0, 2);
} }
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] "
@ -5355,7 +5356,7 @@ static void inp_compat(struct card *card)
*(card->line) = '*'; *(card->line) = '*';
// insert new lines immediately after current line // insert new lines immediately after current line
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
card = insert_new_line(card, ckt_array[i], 0, 0); card = insert_new_line(card, ckt_array[i], 0, 0, 2);
} }
tfree(expression); tfree(expression);
@ -5412,7 +5413,7 @@ static void inp_compat(struct card *card)
*(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++) for (i = 0; i < 2; i++)
card = insert_new_line(card, ckt_array[i], 0, 0); card = insert_new_line(card, ckt_array[i], 0, 0, 2);
tfree(title_tok); tfree(title_tok);
tfree(m_token); tfree(m_token);
@ -5458,7 +5459,7 @@ static void inp_compat(struct card *card)
*(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++) for (i = 0; i < 3; i++)
card = insert_new_line(card, ckt_array[i], 0, 0); card = insert_new_line(card, ckt_array[i], 0, 0, 2);
tfree(title_tok); tfree(title_tok);
tfree(vnamstr); tfree(vnamstr);
@ -5504,7 +5505,7 @@ static void inp_compat(struct card *card)
*(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++) for (i = 0; i < 3; i++)
card = insert_new_line(card, ckt_array[i], 0, 0); card = insert_new_line(card, ckt_array[i], 0, 0, 2);
tfree(title_tok); tfree(title_tok);
tfree(vnamstr); tfree(vnamstr);
@ -5577,11 +5578,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
card = insert_new_line(card, xline, 0, 0); card = insert_new_line(card, xline, 0, 0, 2);
if (rnoise) { if (rnoise) {
card = insert_new_line(card, x2line, 0, 0); card = insert_new_line(card, x2line, 0, 0, 2);
card = insert_new_line(card, x3line, 0, 0); card = insert_new_line(card, x3line, 0, 0, 2);
card = insert_new_line(card, x4line, 0, 0); card = insert_new_line(card, x4line, 0, 0, 2);
} }
tfree(title_tok); tfree(title_tok);
@ -5658,7 +5659,7 @@ static void inp_compat(struct card *card)
*(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++) for (i = 0; i < 3; i++)
card = insert_new_line(card, ckt_array[i], 0, 0); card = insert_new_line(card, ckt_array[i], 0, 0, 2);
tfree(title_tok); tfree(title_tok);
tfree(node1); tfree(node1);
@ -5718,7 +5719,7 @@ static void inp_compat(struct card *card)
*(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++) for (i = 0; i < 3; i++)
card = insert_new_line(card, ckt_array[i], 0, 0); card = insert_new_line(card, ckt_array[i], 0, 0, 2);
tfree(title_tok); tfree(title_tok);
tfree(node1); tfree(node1);
@ -5874,7 +5875,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], 0, 0); card = insert_new_line(card, ckt_array[ii], 0, 0, 2);
paui = pai; paui = pai;
} }
@ -5971,7 +5972,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], 0, 0); card = insert_new_line(card, ckt_array[ii], 0, 0, 2);
paui = pai; paui = pai;
// continue; // continue;
@ -6075,7 +6076,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, 2);
tfree(new_str); tfree(new_str);
} /* end of if 'b' */ } /* end of if 'b' */
@ -6431,8 +6432,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, 0, 0); card = insert_new_line(card, newL, 0, 0, 2);
card = insert_new_line(card, newR, 0, 0); card = insert_new_line(card, newR, 0, 0, 2);
tfree(title_tok); tfree(title_tok);
tfree(node1); tfree(node1);
@ -6468,7 +6469,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, 0); insert_new_line(card, new_line, card->linenum + 1, 0, 0);
} }
} }
} }
@ -6804,7 +6805,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, 0);
*card->line = '*'; *card->line = '*';
} }
} }
@ -7013,7 +7014,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, 0);
} }
} }
/* final memory clearance */ /* final memory clearance */
@ -7067,7 +7068,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, 0);
return f; return f;
} }
@ -7518,7 +7519,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, 0); insert_new_line(card, new_line, card->linenum + 1, 0, 2);
} }
sn++; sn++;
tfree(new_tok); tfree(new_tok);
@ -7571,7 +7572,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, 0); insert_new_line(card, newbline, 0, 0, 2);
/* read next TABLE function in cut_line */ /* read next TABLE function in cut_line */
ftablebeg = strstr(cut_line, "table("); ftablebeg = strstr(cut_line, "table(");
} }
@ -7851,26 +7852,26 @@ static 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, 0);
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, 0);
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, 0);
/* 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, 0);
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, 0);
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, 0);
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, 0);
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, 0);
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, 0);
nextcard->nextcard = oldcard; nextcard->nextcard = oldcard;
/* add predefined parameters TEMP, VT after each subckt call */ /* add predefined parameters TEMP, VT after each subckt call */
@ -7880,9 +7881,9 @@ static 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, 0, 0);
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, 0, 0);
/* 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:");
@ -8690,16 +8691,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, 0);
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, 0);
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, 0);
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, 0);
nextcard->nextcard = oldcard; nextcard->nextcard = oldcard;
/* remove .backanno, replace 'noiseless' by 'moisy=0' */ /* remove .backanno, replace 'noiseless' by 'moisy=0' */

View File

@ -874,6 +874,7 @@ struct card *inp_deckcopy_oc(struct card * deck)
d->nf = deck->nf; d->nf = deck->nf;
d->linenum_orig = deck->linenum; d->linenum_orig = deck->linenum;
d->linenum = i++; d->linenum = i++;
d->numnodes = deck->numnodes;
d->line = copy(deck->line); d->line = copy(deck->line);
if (deck->error) { if (deck->error) {
d->error = copy(deck->error); d->error = copy(deck->error);
@ -931,6 +932,7 @@ struct card* inp_deckcopy_ln(struct card* deck)
d->nf = deck->nf; d->nf = deck->nf;
d->linenum_orig = deck->linenum_orig; d->linenum_orig = deck->linenum_orig;
d->linenum = deck->linenum; d->linenum = deck->linenum;
d->numnodes = deck->numnodes;
d->line = copy(deck->line); d->line = copy(deck->line);
if (deck->error) { if (deck->error) {
d->error = copy(deck->error); d->error = copy(deck->error);

View File

@ -77,6 +77,7 @@ struct card_assoc {
struct card { struct card {
int linenum; int linenum;
int linenum_orig; int linenum_orig;
int numnodes;
char *line; char *line;
char *error; char *error;
struct card *nextcard; struct card *nextcard;