Add multiplier flag 'm' to behavioral capacitor and inductor
This commit is contained in:
parent
4c8324f166
commit
838ad2b10c
|
|
@ -187,6 +187,7 @@ static void inp_get_w_l_x(struct card* oldcard);
|
||||||
|
|
||||||
static char* eval_m(char* line, char* tline);
|
static char* eval_m(char* line, char* tline);
|
||||||
static char* eval_tc(char* line, char* tline);
|
static char* eval_tc(char* line, char* tline);
|
||||||
|
static char* eval_mvalue(char* line, char* tline);
|
||||||
|
|
||||||
static void rem_double_braces(struct card* card);
|
static void rem_double_braces(struct card* card);
|
||||||
|
|
||||||
|
|
@ -5260,9 +5261,9 @@ static char* eval_tc(char* line, char *tline) {
|
||||||
return ret_str;
|
return ret_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return a string that consists of m evaluated
|
/* return a string that consists of m evaluated (like m=5)
|
||||||
or having a rhs for numparam expansion {...}.
|
or having a rhs for numparam expansion m={...}.
|
||||||
The retun string has to be freed by the caller after its usage. */
|
The return string has to be freed by the caller after its usage. */
|
||||||
static char* eval_m(char* line, char* tline) {
|
static char* eval_m(char* line, char* tline) {
|
||||||
double m;
|
double m;
|
||||||
char* str_ptr, * m_ptr, * m_str = NULL;
|
char* str_ptr, * m_ptr, * m_str = NULL;
|
||||||
|
|
@ -5274,7 +5275,7 @@ static char* eval_m(char* line, char* tline) {
|
||||||
m_ptr = str_ptr + 2;
|
m_ptr = str_ptr + 2;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
m = INPevaluate(&m_ptr, &error, 1);
|
m = INPevaluate(&m_ptr, &error, 1);
|
||||||
/*We have a value and create the tc1 string */
|
/*We have a value and create the m string */
|
||||||
if (error == 0) {
|
if (error == 0) {
|
||||||
m_str = tprintf("m=%15.8e", m);
|
m_str = tprintf("m=%15.8e", m);
|
||||||
}
|
}
|
||||||
|
|
@ -5302,6 +5303,48 @@ static char* eval_m(char* line, char* tline) {
|
||||||
return m_str;
|
return m_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* return a string that consists of the m value only.
|
||||||
|
If m is not given, return string "1".
|
||||||
|
The return string has to be freed by the caller after its usage. */
|
||||||
|
static char* eval_mvalue(char* line, char* tline) {
|
||||||
|
double m;
|
||||||
|
char* str_ptr, * m_ptr, * m_str = NULL;
|
||||||
|
char* cut_line = line;
|
||||||
|
str_ptr = strstr(cut_line, "m=");
|
||||||
|
if (str_ptr) {
|
||||||
|
/* We need to have 'm=something */
|
||||||
|
if (str_ptr[2]) {
|
||||||
|
m_ptr = str_ptr + 2;
|
||||||
|
int error = 0;
|
||||||
|
m = INPevaluate(&m_ptr, &error, 1);
|
||||||
|
/*We have a value and create the m string */
|
||||||
|
if (error == 0) {
|
||||||
|
m_str = tprintf("%15.8e", m);
|
||||||
|
}
|
||||||
|
else if (error == 1 && *m_ptr == '{' && m_ptr + 1 && *(m_ptr + 1) != '}') {
|
||||||
|
char* bra = gettok_char(&m_ptr, '}', TRUE, TRUE);
|
||||||
|
if (bra) {
|
||||||
|
m_str = tprintf("%s", bra);
|
||||||
|
tfree(bra);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "Warning: Cannot copy m in line\n %s\n ignored\n", tline);
|
||||||
|
m_str = copy(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "Warning: Cannot copy m in line\n %s\n ignored\n", tline);
|
||||||
|
m_str = copy(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_str = copy("1");
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_str;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ps compatibility:
|
/* ps compatibility:
|
||||||
Exxx n1 n2 TABLE {0.45*v(1)} = (-1, -0.5) (-0.5, 0) (0, 2) (0.5, 2) (1, 1)
|
Exxx n1 n2 TABLE {0.45*v(1)} = (-1, -0.5) (-0.5, 0) (0, 2) (0.5, 2) (1, 1)
|
||||||
|
|
@ -5930,7 +5973,7 @@ static void inp_compat(struct card *card)
|
||||||
/* evauate tc1 and tc2 */
|
/* evauate tc1 and tc2 */
|
||||||
char* tcrstr = eval_tc(cut_line, card->line);
|
char* tcrstr = eval_tc(cut_line, card->line);
|
||||||
|
|
||||||
/* evauate m */
|
/* evaluate m */
|
||||||
char* mstr = eval_m(cut_line, card->line);
|
char* mstr = eval_m(cut_line, card->line);
|
||||||
|
|
||||||
/* white noise model by x2line, x3line, x4line
|
/* white noise model by x2line, x3line, x4line
|
||||||
|
|
@ -6011,10 +6054,13 @@ static void inp_compat(struct card *card)
|
||||||
/* evauate tc1 and tc2 */
|
/* evauate tc1 and tc2 */
|
||||||
char* tcrstr = eval_tc(cut_line, card->line);
|
char* tcrstr = eval_tc(cut_line, card->line);
|
||||||
|
|
||||||
|
/* evaluate m */
|
||||||
|
char* mstr = eval_mvalue(cut_line, card->line);
|
||||||
|
|
||||||
if (strstr(curr_line, "c=")) { /* capacitance formulation */
|
if (strstr(curr_line, "c=")) { /* capacitance formulation */
|
||||||
// Exxx n-aux 0 n2 n1 1
|
// Exxx n-aux 0 n2 n1 1
|
||||||
ckt_array[0] = tprintf("e%s %s_int1 0 %s %s 1", title_tok,
|
ckt_array[0] = tprintf("e%s %s_int1 0 %s %s %s", title_tok,
|
||||||
title_tok, node2, node1);
|
title_tok, node2, node1, mstr);
|
||||||
// Cxxx n-aux 0 1
|
// Cxxx n-aux 0 1
|
||||||
ckt_array[1] = tprintf("c%s %s_int1 0 1", title_tok, title_tok);
|
ckt_array[1] = tprintf("c%s %s_int1 0 1", title_tok, title_tok);
|
||||||
// Bxxx n1 n2 I = i(Exxx) * equation
|
// Bxxx n1 n2 I = i(Exxx) * equation
|
||||||
|
|
@ -6023,8 +6069,8 @@ static void inp_compat(struct card *card)
|
||||||
title_tok, node1, node2, title_tok, equation, tcrstr);
|
title_tok, node1, node2, title_tok, equation, tcrstr);
|
||||||
} else { /* charge formulation */
|
} else { /* charge formulation */
|
||||||
// Gxxx n1 n2 n-aux 0 1
|
// Gxxx n1 n2 n-aux 0 1
|
||||||
ckt_array[0] = tprintf("g%s %s %s %s_int1 0 1",
|
ckt_array[0] = tprintf("g%s %s %s %s_int1 0 %s",
|
||||||
title_tok, node1, node2, title_tok);
|
title_tok, node1, node2, title_tok, mstr);
|
||||||
// Lxxx n-aux 0 1
|
// Lxxx n-aux 0 1
|
||||||
ckt_array[1] = tprintf("l%s %s_int1 0 1", title_tok, title_tok);
|
ckt_array[1] = tprintf("l%s %s_int1 0 1", title_tok, title_tok);
|
||||||
// Bxxx 0 n-aux I = equation
|
// Bxxx 0 n-aux I = equation
|
||||||
|
|
@ -6033,6 +6079,7 @@ static void inp_compat(struct card *card)
|
||||||
title_tok, title_tok, equation, tcrstr);
|
title_tok, title_tok, equation, tcrstr);
|
||||||
}
|
}
|
||||||
tfree(tcrstr);
|
tfree(tcrstr);
|
||||||
|
tfree(mstr);
|
||||||
// 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
|
||||||
|
|
@ -6082,17 +6129,21 @@ static void inp_compat(struct card *card)
|
||||||
/* evauate tc1 and tc2 */
|
/* evauate tc1 and tc2 */
|
||||||
char* tcrstr = eval_tc(cut_line, card->line);
|
char* tcrstr = eval_tc(cut_line, card->line);
|
||||||
|
|
||||||
|
/* evaluate m */
|
||||||
|
char* mstr = eval_mvalue(cut_line, card->line);
|
||||||
|
|
||||||
// Fxxx n-aux 0 Bxxx 1
|
// Fxxx n-aux 0 Bxxx 1
|
||||||
ckt_array[0] = tprintf("f%s %s_int2 0 b%s -1",
|
ckt_array[0] = tprintf("f%s %s_int2 0 b%s -1",
|
||||||
title_tok, title_tok, title_tok);
|
title_tok, title_tok, title_tok);
|
||||||
// Lxxx n-aux 0 1
|
// Lxxx n-aux 0 1
|
||||||
ckt_array[1] = tprintf("l%s %s_int2 0 1", title_tok, title_tok);
|
ckt_array[1] = tprintf("l%s %s_int2 0 1", title_tok, title_tok);
|
||||||
// Bxxx n1 n2 V = v(n-aux) * equation
|
// Bxxx n1 n2 V = v(n-aux) * equation
|
||||||
ckt_array[2] = tprintf("b%s %s %s v = v(%s_int2) * (%s) "
|
ckt_array[2] = tprintf("b%s %s %s v = v(%s_int2) * (%s) / %s "
|
||||||
"%s reciproctc=0",
|
"%s reciproctc=0",
|
||||||
title_tok, node2, node1, title_tok, equation, tcrstr);
|
title_tok, node2, node1, title_tok, equation, mstr, tcrstr);
|
||||||
|
|
||||||
tfree(tcrstr);
|
tfree(tcrstr);
|
||||||
|
tfree(mstr);
|
||||||
// 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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue