Added ASRC_TEMP and ASRC_DTEMP handlers.

Changed behavioral R/L/C substitutes to conform to netlist layout.
This commit is contained in:
mhx 2017-01-29 10:24:11 +01:00
parent deb7e6651d
commit 99dc7f4983
2 changed files with 26 additions and 18 deletions

View File

@ -4816,10 +4816,10 @@ inp_compat(struct line *card)
/* Rxxx n1 n2 R = {equation} or Rxxx n1 n2 {equation}
-->
BRxxx pos neg I = V(pos, neg)/{equation} [tc1|2=a] [tc2|1=b] reciproctc=1
(reciproctc = 1/0 when B source divides/multiplies respectively.)
BRxxx pos neg I={V(pos,neg)/equation} [tc1|2=a] [tc2|1=b] [temp=c] [dtemp=d] reciproctc=1
Reciproctc = 1/0 when B source divides/multiplies respectively.
Adding braces and leaving out spaces conforms to how lines should look at this point.
FIXME: When tc1 is absent, but tc2 is present, a WARNING is issued and tc2 is NOT used.
FIXME: the parameters temp and dtemp should be supported (easy)
FIXME: the parameters ac, m, noisy, scale are not supported (very complex,
the device line parser needs to be modified)
FIXME: 'a' and 'b' cannot be expressions (complications with the device line parser).
@ -4854,11 +4854,11 @@ inp_compat(struct line *card)
tc1_ptr = strstr(str_ptr, "tc1");
tc2_ptr = strstr(str_ptr, "tc2");
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);
xline = tprintf("b%s %s %s i={v(%s, %s)/(%s)}", title_tok, node1, node2, node1, node2, equation);
else if (tc1_ptr && tc2_ptr)
xline = tprintf("b%s %s %s i = v(%s, %s)/(%s) %s reciproctc=1", title_tok, node1, node2, node1, node2, equation, tc1_ptr < tc2_ptr ? tc1_ptr : tc2_ptr);
xline = tprintf("b%s %s %s i={v(%s, %s)/(%s)} %s reciproctc=1", title_tok, node1, node2, node1, node2, equation, tc1_ptr < tc2_ptr ? tc1_ptr : tc2_ptr);
else if (tc1_ptr)
xline = tprintf("b%s %s %s i = v(%s, %s)/(%s) %s reciproctc=1", title_tok, node1, node2, node1, node2, equation, tc1_ptr);
xline = tprintf("b%s %s %s i={v(%s, %s)/(%s)} %s reciproctc=1", title_tok, node1, node2, node1, node2, equation, tc1_ptr);
else if (tc2_ptr) fprintf(cp_err, "WARNING: tc2 specified (%s) but tc1 undefined.\n", tc2_ptr);
new_line = xx_new_line(card->li_next, xline, 0, 0, card->level);
@ -4877,10 +4877,10 @@ inp_compat(struct line *card)
-->
Exxx n-aux 0 n1 n2 1
Cxxx n-aux 0 1
Bxxx n2 n1 I = i(Exxx) * equation reciproctc=1
(reciproctc = 1/0 when B source divides/multiplies respectively.)
Bxxx n2 n1 I={i(Exxx)*equation} [tc1|2=a] [tc2|1=b] [temp=c] [dtemp=d] reciproctc=1
Reciproctc = 1/0 when B source divides/multiplies respectively.
Adding braces and leaving out spaces conforms to how lines should look at this point.
FIXME: When tc1 is absent, but tc2 is present, a WARNING is issued and tc2 is NOT used.
FIXME: the parameters temp and dtemp should be supported (easy)
FIXME: the capacitor's IC=init parameter must be supported.
FIXME: the parameters ac, m, noisy, scale are not supported (very complex,
the device line parser needs to be modified)
@ -4921,11 +4921,11 @@ inp_compat(struct line *card)
ckt_array[1] = tprintf("c%s %s_int2 0 1", title_tok, title_tok);
// Bxxx n2 n1 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, node2, node1, title_tok, equation);
ckt_array[2] = tprintf("b%s %s %s i={i(e%s)*(%s)}", title_tok, node2, node1, title_tok, equation);
else if (tc1_ptr && tc2_ptr)
ckt_array[2] = tprintf("b%s %s %s i = i(e%s) * (%s) %s reciproctc=0", title_tok, node2, node1, title_tok, equation, tc1_ptr < tc2_ptr ? tc1_ptr : tc2_ptr);
ckt_array[2] = tprintf("b%s %s %s i={i(e%s)*(%s)} %s reciproctc=0", title_tok, node2, node1, title_tok, equation, tc1_ptr < tc2_ptr ? tc1_ptr : tc2_ptr);
else if (tc1_ptr)
ckt_array[2] = tprintf("b%s %s %s i = i(e%s) * (%s) %s reciproctc=0", title_tok, node2, node1, title_tok, equation, tc1_ptr);
ckt_array[2] = tprintf("b%s %s %s i={i(e%s)*(%s)} %s reciproctc=0", title_tok, node2, node1, title_tok, equation, tc1_ptr);
else if (tc2_ptr) fprintf(cp_err, "WARNING: tc2 specified (%s) but tc1 undefined.\n", tc2_ptr);
// insert new B source line immediately after current line
for (i = 0; i < 3; i++) {
@ -4957,10 +4957,10 @@ inp_compat(struct line *card)
-->
Fxxx n-aux 0 Bxxx -1
Lxxx n-aux 0 1
Bxxx n1 n2 V = v(n-aux) * equation reciproctc=0
(reciproctc = 1/0 when B source divides/multiplies respectively.)
Bxxx n1 n2 V={v(n-aux)*equation} [tc1|2=a] [tc2|1=b] [temp=c] [dtemp=d] reciproctc=0
Reciproctc = 1/0 when B source divides/multiplies respectively.
Adding braces and leaving out spaces conforms to how lines should look at this point.
FIXME: When tc1 is absent, but tc2 is present, a WARNING is issued and tc2 is NOT used.
FIXME: the parameters temp and dtemp should be supported (easy)
FIXME: the inductor's IC=init parameter must be supported.
FIXME: the parameters ac, m, noisy, scale are not supported (very complex,
the device line parser needs to be modified)
@ -5000,11 +5000,11 @@ inp_compat(struct line *card)
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, node2, node1, title_tok, equation);
ckt_array[2] = tprintf("b%s %s %s v={v(%s_int2)*(%s)}", title_tok, node2, node1, title_tok, equation);
else if (tc1_ptr && tc2_ptr)
ckt_array[2] = tprintf("b%s %s %s v = v(%s_int2) * (%s) %s reciproctc=0", title_tok, node2, node1, title_tok, equation, tc1_ptr < tc2_ptr ? tc1_ptr : tc2_ptr);
ckt_array[2] = tprintf("b%s %s %s v={v(%s_int2)*(%s)} %s reciproctc=0", title_tok, node2, node1, title_tok, equation, tc1_ptr < tc2_ptr ? tc1_ptr : tc2_ptr);
else if(tc1_ptr)
ckt_array[2] = tprintf("b%s %s %s v = v(%s_int2) * (%s) %s reciproctc=0", title_tok, node2, node1, title_tok, equation, tc1_ptr);
ckt_array[2] = tprintf("b%s %s %s v={v(%s_int2)*(%s)} %s reciproctc=0", title_tok, node2, node1, title_tok, equation, tc1_ptr);
else if (tc2_ptr) fprintf(cp_err, "WARNING: tc2 specified (%s) but tc1 undefined.\n", tc2_ptr);
// insert new B source line immediately after current line
for (i = 0; i < 3; i++) {

View File

@ -38,6 +38,14 @@ ASRCparam(int param, IFvalue *value, GENinstance *fast, IFvalue *select)
here->ASRCreciproctc = value->iValue;
here->ASRCreciproctcGiven = TRUE;
break;
case ASRC_TEMP:
here->ASRCtemp = value->rValue + CONSTCtoK;
here->ASRCtempGiven = TRUE;
break;
case ASRC_DTEMP:
here->ASRCdtemp = value->rValue;
here->ASRCdtempGiven = TRUE;
break;
default:
return(E_BADPARM);
}