diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 577ef2898..bd2e4d64e 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -157,7 +157,7 @@ static void inp_add_series_resistor(struct card *deck); static void subckt_params_to_param(struct card *deck); static void inp_fix_temper_in_param(struct card *deck); static void inp_fix_agauss_in_param(struct card *deck, char *fcn); -static void inp_vdmos_model(struct card *deck); +static int inp_vdmos_model(struct card *deck); static void inp_check_syntax(struct card *deck); static char *inp_spawn_brace(char *s); @@ -636,7 +636,9 @@ struct card *inp_readall(FILE *fp, char *dir_name, bool comfile, bool intfile, inp_remove_excess_ws(working); - inp_vdmos_model(working); + if(inp_vdmos_model(working)) + return NULL;; + /* don't remove unused model if we have an .if clause, because we cannot yet decide here which model we finally will need */ if (!has_if) { @@ -6840,13 +6842,14 @@ static void inp_quote_params(struct card *c, struct card *end_c, Assemble all other tokens in a wordlist, and flatten it to become the new .model line. */ -static void inp_vdmos_model(struct card *deck) +static int inp_vdmos_model(struct card *deck) { struct card *card; for (card = deck; card; card = card->nextcard) { char *curr_line, *cut_line, *token, *new_line; wordlist *wl = NULL, *wlb; + int i; curr_line = cut_line = card->line; @@ -6881,7 +6884,22 @@ static void inp_vdmos_model(struct card *deck) tfree(card->line); card->line = new_line; } + /* we have a VDMOS instance line with 'tnodeout' and thus need exactly 5 nodes + */ + else if (strstr(curr_line, "tnodeout")) { + for (i = 0; i < 7; i++) + curr_line = nexttok(curr_line); + if (!ciprefix("tnodeout", curr_line)) { + fprintf(cp_err, + "Error: We need exactly 5 nodes\n" + " drain, gate, source, tjunction, tcase\n" + " in VDMOS instance line\n" + " %s\n", card->line); + return 1; + } + } } + return 0; }