Replace B source pwl by XSPICE PWL Controlled Source

that has smooth rounded and differentiable corners.
This is used in the replacem,ent operation evaluating
Exxx n1 n2 TABLE {expression} = (x0, y0) (x1, y1) (x2, y2)
This commit is contained in:
Holger Vogt 2019-11-09 22:39:22 +01:00
parent 5b2a9474fa
commit cf653ef33a
1 changed files with 59 additions and 3 deletions

View File

@ -4634,10 +4634,13 @@ static void inp_compat(struct card *card)
y1, x2, y2, x2+(x2-x0)/2, y2)
*/
if ((str_ptr = strstr(curr_line, "table")) != NULL) {
char *expression, *firstno, *ffirstno, *secondno, *midline,
/* char *expression, *firstno, *ffirstno, *secondno, *midline,
*lastno, *lastlastno;
double fnumber, lnumber, delta;
int nerror;
int nerror; */
char *expression, *firstno, *secondno;
// char *m_ptr, *m_token;
char xar[1024], yar[1024];
cut_line = curr_line;
/* title and nodes */
title_tok = gettok(&cut_line);
@ -4678,6 +4681,57 @@ static void inp_compat(struct card *card)
*str_ptr = ' ';
if ((str_ptr = strchr(cut_line, '}')) != NULL)
*str_ptr = ' ';
#define newcode
#ifdef newcode
/* E51 50 51 E51_int1 0 1
BE51 e51_int2 0 v = V(40,41)
ae51 %v(e51_int2) %v(e51_int1) xfer_e51
.model xfer_e51 pwl(x_array=[-10 0 1m 2m 3m]
+ y_array=[-1n 0 1m 1 100]
+ input_domain=0.1 fraction=TRUE)
*/
ckt_array[1] = tprintf("b%s %s_int2 0 v = %s", title_tok,
title_tok, expression);
ckt_array[2] = tprintf(
"a%s %%v(%s_int2) %%v(%s_int1) xfer_%s",
title_tok, title_tok, title_tok, title_tok);
/* (x0, y0) (x1, y1) (x2, y2) to x0 x1 x2, y0 y1 y2 */
xar[0] = '\0';
yar[0] = '\0';
while (*cut_line != '\0') {
firstno = gettok_node(&cut_line);
secondno = gettok_node(&cut_line);
if ((!firstno && secondno) ||
(firstno && !secondno)) {
fprintf(stderr, "Error: Missing token in %s\n",
curr_line);
break;
}
else if (!firstno && !secondno)
continue;
strcat(xar, firstno);
strcat(xar, " ");
strcat(yar, secondno);
strcat(yar, " ");
tfree(firstno);
tfree(secondno);
}
ckt_array[3] = tprintf(
".model xfer_%s pwl(x_array=[%s] y_array=[%s] "
"input_domain=0.1 fraction=TRUE)",
title_tok, xar, yar);
// comment out current variable e line
*(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);
tfree(expression);
tfree(title_tok);
tfree(node1);
tfree(node2);
}
#else
/* get first two numbers to establish extrapolation */
str_ptr = cut_line;
ffirstno = gettok_node(&cut_line);
@ -4741,7 +4795,9 @@ static void inp_compat(struct card *card)
tfree(title_tok);
tfree(node1);
tfree(node2);
}
#endif
}
/* Exxx n1 n2 VOL = {equation}
-->
Exxx n1 n2 int1 0 1