From 2d34cbddf88aac0a08a0a2d26f691af7c85e1761 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Thu, 19 Nov 2020 13:40:55 +0100 Subject: [PATCH] re-write and simplify the tc1, tc2 code for behavioral R, L, C lines invoking the B source. Enable parameterization of the TCs. Create a tc string in an extra function, add this string to the new R, L, C line. --- src/frontend/inpcom.c | 271 +++++++++++++++++------------------------- 1 file changed, 106 insertions(+), 165 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 57ccf4d3e..6a4640323 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -4629,6 +4629,78 @@ static char *search_plain_identifier(char *str, const char *identifier) return NULL; } +/* return a string that consists of tc1 and tc2 evaluated + or having a rhs for numparam expansion {...}. + The retun string has to be freed by the caller after its usage. */ +static char* eval_tc(char* line, char *tline) { + double tc1, tc2; + char *str_ptr, *tc1_ptr, *tc2_ptr, *tc1_str = NULL, *tc2_str = NULL; + char* cut_line = line; + str_ptr = strstr(cut_line, "tc1"); + if (str_ptr) { + /* We need to have 'tc1=something */ + if (str_ptr[3] && + (isspace_c(str_ptr[3]) || (str_ptr[3] == '='))) { + tc1_ptr = strchr(str_ptr, '='); + if (tc1_ptr) { + tc1_ptr++; + int error = 0; + tc1 = INPevaluate(&tc1_ptr, &error, 1); + /*We have a value and create the tc1 string */ + if (error == 0) { + tc1_str = tprintf("tc1=%15.8e", tc1); + } + else if (error == 1 && *tc1_ptr == '{') { + char *bra = gettok_char(&tc1_ptr, '}', TRUE, TRUE); + tc1_str = tprintf("tc1=%s", bra); + tfree(bra); + } + else { + fprintf(stderr, "Warning: Cannot copy tc1 in line\n %s\n ignored\n", tline); + tc1_str = copy(" "); + } + } + } + } + else { + tc1_str = copy(" "); + } + cut_line = line; + str_ptr = strstr(cut_line, "tc2"); + if (str_ptr) { + /* We need to have 'tc2=something */ + if (str_ptr[3] && + (isspace_c(str_ptr[3]) || (str_ptr[3] == '='))) { + tc2_ptr = strchr(str_ptr, '='); + if (tc2_ptr) { + tc2_ptr++; + int error = 0; + tc2 = INPevaluate(&tc2_ptr, &error, 1); + /*We have a value and create the tc2 string */ + if (error == 0) { + tc2_str = tprintf("tc2=%15.8e", tc2); + } + else if (error == 1 && *tc2_ptr == '{') { + char* bra = gettok_char(&tc2_ptr, '}', TRUE, TRUE); + tc2_str = tprintf("tc2=%s", bra); + tfree(bra); + } + else { + fprintf(stderr, "Warning: Cannot copy tc2 in line\n %s\n ignored\n", tline); + tc2_str = copy(" "); + } + } + } + } + else { + tc2_str = copy(" "); + } + char* ret_str = tprintf("%s %s", tc1_str, tc2_str); + tfree(tc1_str); + tfree(tc2_str); + + return ret_str; +} /* ps compatibility: Exxx n1 n2 TABLE {0.45*v(1)} = (-1, -0.5) (-0.5, 0) (0, 2) (0.5, 2) (1, 1) @@ -4700,8 +4772,7 @@ static void inp_compat(struct card *card) int skip_control = 0; - char *equation, *tc1_ptr = NULL, *tc2_ptr = NULL; - double tc1 = 0.0, tc2 = 0.0; + char *equation; for (; card; card = card->nextcard) { @@ -5196,32 +5267,9 @@ static void inp_compat(struct card *card) } else equation = gettok_char(&str_ptr, '}', TRUE, TRUE); - str_ptr = strstr(cut_line, "tc1"); - if (str_ptr) { - /* We need to have 'tc1=something */ - if (str_ptr[3] && - (isspace_c(str_ptr[3]) || (str_ptr[3] == '='))) { - tc1_ptr = strchr(str_ptr, '='); - if (tc1_ptr) { - tc1_ptr++; - int error; - tc1 = INPevaluate(&tc1_ptr, &error, 1); - } - } - } - str_ptr = strstr(cut_line, "tc2"); - if (str_ptr) { - /* We need to have 'tc2=something */ - if (str_ptr[3] && - (isspace_c(str_ptr[3]) || (str_ptr[3] == '='))) { - tc2_ptr = strchr(str_ptr, '='); - if (tc2_ptr) { - tc2_ptr++; - int error; - tc2 = INPevaluate(&tc2_ptr, &error, 1); - } - } - } + + /* evauate tc1 and tc2 */ + char* tcrstr = eval_tc(cut_line, card->line); /* white noise model by x2line, x3line, x4line if instance parameter noisy=1 (or noise=1) is set */ @@ -5229,44 +5277,17 @@ static void inp_compat(struct card *card) if (strstr(cut_line, "noisy=1") || strstr(cut_line, "noise=1")) rnoise = TRUE; - if ((tc1_ptr == NULL) && (tc2_ptr == NULL)) { - xline = tprintf("b%s %s %s i = v(%s, %s)/(%s)", title_tok, - node1, node2, node1, node2, equation); - if (rnoise) { - x2line = tprintf("b%s_1 %s %s i = i(v%s_3)/sqrt(%s)", - title_tok, node1, node2, title_tok, equation); - x3line = - tprintf("r%s_2 %s_3 0 1.0", title_tok, title_tok); - x4line = tprintf("v%s_3 %s_3 0 0", title_tok, title_tok); - } + xline = tprintf("b%s %s %s i = v(%s, %s)/(%s) %s reciproctc=1", + title_tok, node1, node2, node1, node2, equation, tcrstr); + if (rnoise) { + x2line = tprintf("b%s_1 %s %s i = i(v%s_3)/sqrt(%s)", + title_tok, node1, node2, title_tok, equation); + x3line = tprintf("r%s_2 %s_3 0 1.0 %s", + title_tok, title_tok, tcrstr); + x4line = tprintf("v%s_3 %s_3 0 0", title_tok, title_tok); } - else if (tc2_ptr == NULL) { - xline = tprintf("b%s %s %s i = v(%s, %s)/(%s) tc1=%15.8e " - "reciproctc=1", - title_tok, node1, node2, node1, node2, equation, tc1); - if (rnoise) { - x2line = tprintf("b%s_1 %s %s i = i(v%s_3)/sqrt(%s)", - title_tok, node1, node2, title_tok, equation); - x3line = tprintf("r%s_2 %s_3 0 1.0 tc1=%15.8e", title_tok, - title_tok, tc1); - x4line = tprintf("v%s_3 %s_3 0 0", title_tok, title_tok); - } - } - else { - xline = tprintf("b%s %s %s i = v(%s, %s)/(%s) tc1=%15.8e " - "tc2=%15.8e reciproctc=1", - title_tok, node1, node2, node1, node2, equation, tc1, - tc2); - if (rnoise) { - x2line = tprintf("b%s_1 %s %s i = i(v%s_3)/sqrt(%s)", - title_tok, node1, node2, title_tok, equation); - x3line = tprintf("r%s_2 %s_3 0 1.0 tc1=%15.8e tc2=%15.8e", - title_tok, title_tok, tc1, tc2); - x4line = tprintf("v%s_3 %s_3 0 0", title_tok, title_tok); - } - } - tc1_ptr = NULL; - tc2_ptr = NULL; + + tfree(tcrstr); // comment out current old R line *(card->line) = '*'; @@ -5322,32 +5343,10 @@ static void inp_compat(struct card *card) } else equation = gettok_char(&str_ptr, '}', TRUE, TRUE); - str_ptr = strstr(cut_line, "tc1"); - if (str_ptr) { - /* We need to have 'tc1=something */ - if (str_ptr[3] && - (isspace_c(str_ptr[3]) || (str_ptr[3] == '='))) { - tc1_ptr = strchr(str_ptr, '='); - if (tc1_ptr) { - tc1_ptr++; - int error; - tc1 = INPevaluate(&tc1_ptr, &error, 1); - } - } - } - str_ptr = strstr(cut_line, "tc2"); - if (str_ptr) { - /* We need to have 'tc2=something */ - if (str_ptr[3] && - (isspace_c(str_ptr[3]) || (str_ptr[3] == '='))) { - tc2_ptr = strchr(str_ptr, '='); - if (tc2_ptr) { - tc2_ptr++; - int error; - tc2 = INPevaluate(&tc2_ptr, &error, 1); - } - } - } + + /* evauate tc1 and tc2 */ + char* tcrstr = eval_tc(cut_line, card->line); + if (strstr(curr_line, "c=")) { /* capacitance formulation */ // Exxx n-aux 0 n2 n1 1 ckt_array[0] = tprintf("e%s %s_int1 0 %s %s 1", title_tok, @@ -5355,21 +5354,9 @@ static void inp_compat(struct card *card) // Cxxx n-aux 0 1 ckt_array[1] = tprintf("c%s %s_int1 0 1", title_tok, title_tok); // Bxxx n1 n2 I = i(Exxx) * equation - if ((tc1_ptr == NULL) && (tc2_ptr == NULL)) { - ckt_array[2] = tprintf("b%s %s %s i = i(e%s) * (%s)", - title_tok, node1, node2, title_tok, equation); - } - else if (tc2_ptr == NULL) { - ckt_array[2] = tprintf( - "b%s %s %s i = i(e%s) * (%s) tc1=%15.8e reciproctc=1", - title_tok, node1, node2, title_tok, equation, tc1); - } - else { - ckt_array[2] = tprintf("b%s %s %s i = i(e%s) * (%s) " - "tc1=%15.8e tc2=%15.8e reciproctc=1", - title_tok, node1, node2, title_tok, equation, tc1, - tc2); - } + ckt_array[2] = tprintf("b%s %s %s i = i(e%s) * (%s) " + "%s reciproctc=1", + title_tok, node1, node2, title_tok, equation, tcrstr); } else { /* charge formulation */ // Gxxx n1 n2 n-aux 0 1 ckt_array[0] = tprintf("g%s %s %s %s_int1 0 1", @@ -5377,23 +5364,11 @@ static void inp_compat(struct card *card) // Lxxx n-aux 0 1 ckt_array[1] = tprintf("l%s %s_int1 0 1", title_tok, title_tok); // Bxxx 0 n-aux I = equation - if ((tc1_ptr == NULL) && (tc2_ptr == NULL)) { - ckt_array[2] = tprintf("b%s 0 %s_int1 i = (%s)", - title_tok, title_tok, equation); - } - else if (tc2_ptr == NULL) { - ckt_array[2] = tprintf( - "b%s 0 %s_int1 i = (%s) tc1=%15.8e reciproctc=1", - title_tok, title_tok, equation, tc1); - } - else { - ckt_array[2] = tprintf("b%s 0 %s_int1 i = (%s) " - "tc1=%15.8e tc2=%15.8e reciproctc=1", - title_tok, title_tok, equation, tc1, tc2); - } + ckt_array[2] = tprintf("b%s 0 %s_int1 i = (%s) " + "%s reciproctc=1", + title_tok, title_tok, equation, tcrstr); } - tc1_ptr = NULL; - tc2_ptr = NULL; + tfree(tcrstr); // comment out current variable capacitor line *(card->line) = '*'; // insert new B source line immediately after current line @@ -5439,55 +5414,21 @@ static void inp_compat(struct card *card) } else equation = gettok_char(&str_ptr, '}', TRUE, TRUE); - str_ptr = strstr(cut_line, "tc1"); - if (str_ptr) { - /* We need to have 'tc1=something */ - if (str_ptr[3] && - (isspace_c(str_ptr[3]) || (str_ptr[3] == '='))) { - tc1_ptr = strchr(str_ptr, '='); - if (tc1_ptr) { - tc1_ptr++; - int error; - tc1 = INPevaluate(&tc1_ptr, &error, 1); - } - } - } - str_ptr = strstr(cut_line, "tc2"); - if (str_ptr) { - /* We need to have 'tc2=something */ - if (str_ptr[3] && - (isspace_c(str_ptr[3]) || (str_ptr[3] == '='))) { - tc2_ptr = strchr(str_ptr, '='); - if (tc2_ptr) { - tc2_ptr++; - int error; - tc2 = INPevaluate(&tc2_ptr, &error, 1); - } - } - } + + /* evauate tc1 and tc2 */ + char* tcrstr = eval_tc(cut_line, card->line); + // Fxxx n-aux 0 Bxxx 1 ckt_array[0] = tprintf("f%s %s_int2 0 b%s -1", title_tok, title_tok, title_tok); // Lxxx n-aux 0 1 ckt_array[1] = tprintf("l%s %s_int2 0 1", title_tok, title_tok); // Bxxx n1 n2 V = v(n-aux) * equation - if ((tc1_ptr == NULL) && (tc2_ptr == NULL)) { - ckt_array[2] = tprintf("b%s %s %s v = v(%s_int2) * (%s)", - title_tok, node1, node2, title_tok, equation); - } - else if (tc2_ptr == NULL) { - ckt_array[2] = tprintf("b%s %s %s v = v(%s_int2) * (%s) " - "tc1=%15.8e reciproctc=0", - title_tok, node2, node1, title_tok, equation, tc1); - } - else { - ckt_array[2] = tprintf("b%s %s %s v = v(%s_int2) * (%s) " - "tc1=%15.8e tc2=%15.8e reciproctc=0", - title_tok, node2, node1, title_tok, equation, tc1, - tc2); - } - tc1_ptr = NULL; - tc2_ptr = NULL; + ckt_array[2] = tprintf("b%s %s %s v = v(%s_int2) * (%s) " + "%s reciproctc=0", + title_tok, node2, node1, title_tok, equation, tcrstr); + + tfree(tcrstr); // comment out current variable inductor line *(card->line) = '*'; // insert new B source line immediately after current line