function 'inp_vdmos_model' to process vdmos model lines towards ngspice compatibility

This commit is contained in:
Holger Vogt 2018-04-11 00:26:27 +02:00 committed by rlar
parent f3478d7f13
commit 2f719f7401
1 changed files with 57 additions and 0 deletions

View File

@ -137,6 +137,7 @@ static void replace_token(char *string, char *token, int where, int total);
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_vdmos_model(struct card *deck);
static char *inp_spawn_brace(char *s);
@ -546,6 +547,8 @@ inp_readall(FILE *fp, char *dir_name, bool comfile, bool intfile, bool *expr_w_t
inp_remove_excess_ws(working);
inp_vdmos_model(working);
comment_out_unused_subckt_models(working);
subckt_params_to_param(working);
@ -6042,3 +6045,57 @@ inp_quote_params(struct card *c, struct card *end_c, struct dependency *deps, in
}
}
}
/* VDMOS special:
Check for 'vdmos' in .model line.
check if 'pchan', then add p to vdmos and ignore 'pchan'.
If no 'pchan' is found, add n to vdmos.
Ignore annotations on Vds, Ron, Qg, and mfg.
Assemble all other tokens in a wordlist, and flatten it
to become the new .model line.
*/
static void
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;
curr_line = cut_line = card->line;
if (ciprefix(".model", curr_line) && strstr(curr_line, "vdmos")) {
cut_line = strstr(curr_line, "vdmos");
wl_append_word(&wl, &wl, copy_substring(curr_line, cut_line));
wlb = wl;
if (strstr(cut_line, "pchan")) {
wl_append_word(NULL, &wl, "vdmosp (");
}
else {
wl_append_word(NULL, &wl, "vdmosn (");
}
cut_line = cut_line + 5;
cut_line = skip_ws(cut_line);
if (*cut_line == '(')
cut_line = cut_line + 1;
new_line = NULL;
while (cut_line && *cut_line) {
token = gettok_noparens(&cut_line);
if (!ciprefix("pchan", token) && !ciprefix("ron=", token) && !ciprefix("vds=", token) &&
!ciprefix("qg=", token) && !ciprefix("mfg=", token) && !ciprefix("nchan", token))
wl_append_word(NULL, &wl, token);
if (*cut_line == ')') {
wl_append_word(NULL, &wl, ")");
break;
}
}
new_line = wl_flatten(wlb);
tfree(card->line);
card->line = new_line;
}
}
}