diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index bf4ac4b6a..b5479cbc0 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -6929,12 +6929,17 @@ static void inp_quote_params(struct card *c, struct card *end_c, */ static int inp_vdmos_model(struct card *deck) { +#define MODNUMBERS 256 + struct card *card; + struct card *vmodels[MODNUMBERS]; /* list of pointers to vdmos model cards */ + int j = 0; + vmodels[0] = NULL; + for (card = deck; card; card = card->nextcard) { - char *curr_line, *cut_line, *token, *new_line; - wordlist *wl = NULL, *wlb; - int i; + char* curr_line, * cut_line, * token, * new_line; + wordlist* wl = NULL, * wlb; curr_line = cut_line = card->line; @@ -6971,13 +6976,34 @@ static int inp_vdmos_model(struct card *deck) tfree(card->line); card->line = new_line; wl_free(wlb); + + /* add model card pointer to list */ + vmodels[j] = card; + j++; + if (j == MODNUMBERS) { + vmodels[j - 1] = NULL; + continue; + } + vmodels[j] = NULL; } + } + + /* we don't have vdmos models, so return */ + if (vmodels[0] == NULL) + return 0; + if (j == MODNUMBERS) + fprintf(cp_err, "Warning: Syntax check for VDMOS instances is limited to %d .model cards\n", MODNUMBERS); + + for (card = deck; card; card = card->nextcard) { /* we have a VDMOS instance line with 'thermal' flag and thus need exactly 5 nodes */ - else if (curr_line[0] == 'm' && strstr(curr_line, "thermal")) { - for (i = 0; i < 7; i++) + int i; + char *curr_line = card->line; + if (curr_line[0] == 'm' && strstr(curr_line, "thermal")) { + /* move to model name */ + for (i = 0; i < 6; i++) curr_line = nexttok(curr_line); - if ((curr_line == 0) || (strlen(curr_line) < 1)) { + if (!curr_line || !*curr_line) { fprintf(cp_err, "Error: We need exactly 5 nodes\n" " drain, gate, source, tjunction, tcase\n" @@ -6985,13 +7011,25 @@ static int inp_vdmos_model(struct card *deck) " %s\n", card->line); return 1; } - if (!cieq("thermal", curr_line)) { - fprintf(cp_err, - "Error: Correct flag to activate \n" - " VDMOS thermal model is \"thermal\"\n" - " %s\n", card->line); - return 1; + /* next token is the model name of instance */ + char* instmodname = gettok(&curr_line); + i = 0; + while (vmodels[i]) { + char* mod = vmodels[i]->line; + mod = nexttok(mod); /* skip .model */ + if (ciprefix(instmodname, mod)) { + tfree(instmodname); + return 0; + } + i++; } + fprintf(cp_err, + "Error: We need exactly 5 nodes\n" + " drain, gate, source, tjunction, tcase\n" + " in VDMOS instance line with thermal model\n" + " %s\n", card->line); + tfree(instmodname); + return 1; } } return 0;