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 */
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);
@ -220,6 +220,7 @@ static struct card *insert_new_line(
x->line = line;
x->linenum = linenum;
x->linenum_orig = linenum_orig;
x->numnodes = numnodes;
x->level = card ? card->level : NULL;
if (card)
@ -463,7 +464,7 @@ static void inp_stitch_continuation_lines(struct card *working)
}
else {
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->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 */
{
end = insert_new_line(
end, copy(buffer), line_number, line_number);
end, copy(buffer), line_number, line_number, 0);
if (!cc)
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, copy(buffer), line_number++, line_number_orig++);
end, copy(buffer), line_number++, line_number_orig++, 0);
if (!cc)
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 (!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
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) {
/* 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 (found_end == TRUE)
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 */
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]);
*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)++, 0, 2);
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) {
prev_card = insert_new_line(
prev_card, copy("run"), (*line_number)++, 0);
prev_card, copy("run"), (*line_number)++, 0, 0);
found_run = TRUE;
}
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);
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
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)
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))) {
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[-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 */
first_param_card = c = NULL;
while ((ptr1 = strchr(beg, '=')) != NULL) {
@ -2823,7 +2824,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, 0);
if (!first_param_card)
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;
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->numnodes);
if (t == section_def) {
c->line[0] = '*';
c->line[1] = '<';
@ -4702,7 +4703,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++, 0, 0);
tfree(array);
}
@ -5145,7 +5146,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], 0, 0, 2);
}
else {
ckt_array[3] = tprintf(
@ -5156,7 +5157,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], 0, 0, 2);
}
tfree(expression);
tfree(title_tok);
@ -5201,7 +5202,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], 0, 0, 2);
tfree(title_tok);
tfree(node1);
@ -5346,7 +5347,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], 0, 0, 2);
}
else {
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) = '*';
// 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], 0, 0, 2);
}
tfree(expression);
@ -5412,7 +5413,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], 0, 0, 2);
tfree(title_tok);
tfree(m_token);
@ -5458,7 +5459,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], 0, 0, 2);
tfree(title_tok);
tfree(vnamstr);
@ -5504,7 +5505,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], 0, 0, 2);
tfree(title_tok);
tfree(vnamstr);
@ -5577,11 +5578,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, 0, 0, 2);
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, 0, 0, 2);
card = insert_new_line(card, x3line, 0, 0, 2);
card = insert_new_line(card, x4line, 0, 0, 2);
}
tfree(title_tok);
@ -5658,7 +5659,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], 0, 0, 2);
tfree(title_tok);
tfree(node1);
@ -5718,7 +5719,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], 0, 0, 2);
tfree(title_tok);
tfree(node1);
@ -5874,7 +5875,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], 0, 0, 2);
paui = pai;
}
@ -5971,7 +5972,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], 0, 0, 2);
paui = pai;
// continue;
@ -6075,7 +6076,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, 2);
tfree(new_str);
} /* end of if 'b' */
@ -6431,8 +6432,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, 0, 0, 2);
card = insert_new_line(card, newR, 0, 0, 2);
tfree(title_tok);
tfree(node1);
@ -6468,7 +6469,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, 0, 0);
}
}
}
@ -6804,7 +6805,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, 0);
*card->line = '*';
}
}
@ -7013,7 +7014,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, 0);
}
}
/* 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);
*card->line = '*';
insert_new_line(card, new_str, 0, card->linenum);
insert_new_line(card, new_str, 0, card->linenum, 0);
return f;
}
@ -7518,7 +7519,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, 0, 2);
}
sn++;
tfree(new_tok);
@ -7571,7 +7572,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, 0, 2);
/* read next TABLE function in cut_line */
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 */
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'");
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");
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 */
/* 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, 0);
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) }");
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) }");
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 )}");
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)) }");
nextcard = insert_new_line(nextcard, new_str, 9, 0);
nextcard = insert_new_line(nextcard, new_str, 9, 0, 0);
nextcard->nextcard = oldcard;
/* 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;
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, 0, 0);
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.
Do nothing if you are inside of { }. */
char* parastr = strstr(cut_line, "params:");
@ -8690,16 +8691,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, 0);
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, 0);
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, 0);
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, 0);
nextcard->nextcard = oldcard;
/* 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->linenum_orig = deck->linenum;
d->linenum = i++;
d->numnodes = deck->numnodes;
d->line = copy(deck->line);
if (deck->error) {
d->error = copy(deck->error);
@ -931,6 +932,7 @@ struct card* inp_deckcopy_ln(struct card* deck)
d->nf = deck->nf;
d->linenum_orig = deck->linenum_orig;
d->linenum = deck->linenum;
d->numnodes = deck->numnodes;
d->line = copy(deck->line);
if (deck->error) {
d->error = copy(deck->error);

View File

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