diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 02439c6a0..31bafe459 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -6456,5 +6456,70 @@ pspice_compat(struct card *oldcard) } } + /* get the area factor for diodes and bipolar devices + d1 n1 n2 dmod 7 --> d1 n1 n2 dmod area=7 + q2 n1 n2 n3 [n4] bjtmod 1.35 --> q2 n1 n2 n3 n4 bjtmod area=1.35 + q3 1 2 3 4 bjtmod 1.45 --> q2 1 2 3 4 bjtmod area=1.45 + */ + for (card = newcard; card; card = card->nextcard) { + static struct card *subcktline = NULL; + static int nesting = 0; + char *cut_line = card->line; + if (*cut_line == '*') + continue; + // exclude any command inside .control ... .endc + if (ciprefix(".control", cut_line)) { + skip_control++; + continue; + } + else if (ciprefix(".endc", cut_line)) { + skip_control--; + continue; + } + else if (skip_control > 0) { + continue; + } + if (*cut_line == 'q') { + cut_line = nexttok(cut_line); //.model + cut_line = nexttok(cut_line); // node1 + cut_line = nexttok(cut_line); // node2 + cut_line = nexttok(cut_line); // node3 + if (*cut_line == '[') { // node4 not a number + *cut_line = ' '; + cut_line = strchr(cut_line, ']'); + *cut_line = ' '; + cut_line = skip_ws(cut_line); + cut_line = nexttok(cut_line); // model name + } + else { // if an integer number, it is node4 + bool is_node4 = TRUE; + while (*cut_line && !isspace(*cut_line)) + if (!isdigit(*cut_line++)) + is_node4 = FALSE; // already model name + if(is_node4) + cut_line = nexttok(cut_line); // model name + } + if (*cut_line && atof(cut_line) > 0.0) { // size of area + char *tmpstr1 = copy_substring(card->line, cut_line); + char *tmpstr2 = tprintf("%s area=%s", tmpstr1, cut_line); + tfree(tmpstr1); + tfree(card->line); + card->line = tmpstr2; + } + } + else if (*cut_line == 'd') { + cut_line = nexttok(cut_line); //.model + cut_line = nexttok(cut_line); // node1 + cut_line = nexttok(cut_line); // node2 + cut_line = nexttok(cut_line); // model name + if (*cut_line && atof(cut_line) > 0.0) { // size of area + char *tmpstr1 = copy_substring(card->line, cut_line); + char *tmpstr2 = tprintf("%s area=%s", tmpstr1, cut_line); + tfree(tmpstr1); + tfree(card->line); + card->line = tmpstr2; + } + } + } return newcard; }