From 70d1647cfa3f5e28618549f3afefa9854b33e1bd Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Tue, 29 Dec 2020 15:40:16 +0100 Subject: [PATCH] Update to ps .model selection for MOS, add support for bipolar (Mextram, lateral pnp), enable 'level = nn' (with spaces). --- src/frontend/inpcom.c | 44 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 01a325b30..3b164615f 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -7791,13 +7791,16 @@ static struct card *pspice_compat(struct card *oldcard) } } - /* .model xxx NMOS/PMOS level=6 --> level = 8, version=3.2.4 - .model xxx NMOS/PMOS level=7 --> level = 8, version=3.2.4 - .model xxx NMOS/PMOS level=5 --> level = 45 - .model xxx NMOS/PMOS level=8 --> level = 14, version=4.5.0 */ + /* .model xxx NMOS/PMOS level=6 --> level = 8, version=3.2.4 + .model xxx NMOS/PMOS level=7 --> level = 8, version=3.2.4 + .model xxx NMOS/PMOS level=5 --> level = 44 + .model xxx NMOS/PMOS level=8 --> level = 14, version=4.5.0 + .model xxx NPN/PNP level=2 --> level = 6 + .model xxx LPNP level=n --> level = 1 subs=-1 */ for (card = newcard; card; card = card->nextcard) { char* cut_line = card->line; if (ciprefix(".model", cut_line)) { + char *cut_del = cut_line = inp_remove_ws(copy(cut_line)); char* modname, *modtype; cut_line = nexttok(cut_line); /* skip .model */ modname = gettok(&cut_line); /* save model name */ @@ -7812,6 +7815,7 @@ static struct card *pspice_compat(struct card *oldcard) switch (ll) { case 5: { + /* EKV 2.6 in the adms branch */ char* newline = tprintf(".model %s %s level=44 %s", modname, modtype, lv); tfree(card->line); card->line = newline; @@ -7820,6 +7824,7 @@ static struct card *pspice_compat(struct card *oldcard) case 6: case 7: { + /* BSIM3 version 3.2.4 */ char* newline = tprintf(".model %s %s level=8 version=3.2.4 %s", modname, modtype, lv); tfree(card->line); card->line = newline; @@ -7827,6 +7832,7 @@ static struct card *pspice_compat(struct card *oldcard) break; case 8: { + /* BSIM4 version 4.5.0 */ char* newline = tprintf(".model %s %s level=14 version=4.5.0 %s", modname, modtype, lv); tfree(card->line); card->line = newline; @@ -7838,12 +7844,40 @@ static struct card *pspice_compat(struct card *oldcard) tfree(ntok); } } + else if (cieq(modtype, "NPN") || cieq(modtype, "PNP")) { + char* lv = strstr(cut_line, "level="); + if (lv) { + int ll; + lv = lv + 6; + char* ntok = gettok(&lv); + ll = atoi(ntok); + switch (ll) { + case 2: + { + /* MEXTRAM 504.12.1 in the adms branch */ + char* newline = tprintf(".model %s %s level=6 %s", modname, modtype, lv); + tfree(card->line); + card->line = newline; + } + break; + default: + break; + } + tfree(ntok); + } + } + else if (cieq(modtype, "LPNP")) { + /* lateral PNP enabled */ + char* newline = tprintf(".model %s PNP level=1 subs=-1 %s", modname, cut_line); + tfree(card->line); + card->line = newline; + } tfree(modname); tfree(modtype); + tfree(cut_del); } } - /* x ... params: p1=val1, p2=val2 replace comma separator by space. Do nothing if you are inside of { }. */ for (card = newcard; card; card = card->nextcard) {