inpcom.c remove bug: parens around equation h, f

add equation + temper capability to gain of F-Source
This commit is contained in:
h_vogt 2013-12-14 19:06:04 +01:00 committed by rlar
parent 606c98904d
commit 75eee691c4
1 changed files with 76 additions and 2 deletions

View File

@ -4631,9 +4631,83 @@ inp_compat(struct line *card)
/* F element compatibility */
else if (*curr_line == 'f') {
char actchar, *beg_tstr, *equastr, *vnamstr;
/* Fxxx n1 n2 CCCS vnam gain --> Fxxx n1 n2 vnam gain
remove cccs */
replace_token(curr_line, "cccs", 4, 6);
/* Deal with
Fxxx n1 n2 vnam {equation}
if equation contains the 'temper' token */
beg_tstr = curr_line;
while ((beg_tstr = strstr(beg_tstr, "temper")) != NULL) {
actchar = *(beg_tstr - 1);
if (!isspace(actchar) && !is_arith_char(actchar) && !(actchar == ',') && !(actchar == '{')) {
beg_tstr++;
continue;
}
actchar = *(beg_tstr + 6);
if (!isspace(actchar) && !is_arith_char(actchar) && !(actchar == ',') && !(actchar == '}')) {
beg_tstr++;
continue;
}
/* we have found a true 'temper' */
cut_line = curr_line;
title_tok = gettok(&cut_line);
node1 = gettok(&cut_line);
node2 = gettok(&cut_line);
vnamstr = gettok(&cut_line);
equastr = gettok(&cut_line);
/*
Fxxx n1 n2 vnam {equation}
-->
Fxxx n1 n2 vbFxxx -1
bFxxx int1 0 i = i(vnam)*{equation}
vbFxxx int1 0 0
*/
xlen = 2*strlen(title_tok) + strlen(node1) + strlen(node2) + 9;
ckt_array[0] = TMALLOC(char, xlen);
//Fxxx n1 n2 VBFxxx -1
sprintf(ckt_array[0], "%s %s %s vb%s -1",
title_tok, node1, node2, title_tok);
//BFxxx BFxxx_int1 0 I = I(vnam)*{equation}
xlen = 2*strlen(title_tok) + strlen(vnamstr) + strlen(equastr)
+ 23;
ckt_array[1] = TMALLOC(char, xlen);
sprintf(ckt_array[1], "b%s %s_int1 0 i = i(%s) * (%s)",
title_tok, title_tok, vnamstr, equastr);
//VBFxxx int1 0 0
xlen = 2*strlen(title_tok)
+ 16;
ckt_array[2] = TMALLOC(char, xlen);
sprintf(ckt_array[2], "vb%s %s_int1 0 dc 0",
title_tok, title_tok);
// insert new three lines immediately after current line
for (i = 0; i < 3; i++) {
struct line *x = xx_new_line(NULL, ckt_array[i], 0, 0);
if (param_end)
param_end->li_next = x;
else
param_beg = x;
param_end = x;
}
// comment out current variable f line
*(card->li_line) = '*';
// insert new param lines immediately after current line
param_end->li_next = card->li_next;
card->li_next = param_beg;
// point 'card' pointer to last in scalar list
card = param_end;
param_beg = param_end = NULL;
tfree(title_tok);
tfree(vnamstr);
tfree(equastr);
tfree(node1);
tfree(node2);
break;
}
}
/* H element compatibility */
else if (*curr_line == 'h') {
@ -4677,9 +4751,9 @@ inp_compat(struct line *card)
title_tok, node1, node2, title_tok);
//BHxxx BHxxx_int1 0 I = I(vnam)*{equation}
xlen = 2*strlen(title_tok) + strlen(vnamstr) + strlen(equastr)
+ 21;
+ 23;
ckt_array[1] = TMALLOC(char, xlen);
sprintf(ckt_array[1], "b%s %s_int1 0 i = i(%s) * %s",
sprintf(ckt_array[1], "b%s %s_int1 0 i = i(%s) * (%s)",
title_tok, title_tok, vnamstr, equastr);
//VBHxxx int1 0 0
xlen = 2*strlen(title_tok)