From 6f6ee47767939a5f60e26dc724c92751bbfd4e2a Mon Sep 17 00:00:00 2001 From: dwarning Date: Mon, 13 May 2024 12:30:32 +0200 Subject: [PATCH 1/3] diode: no need for vte recalculation, rhs not changed --- src/spicelib/devices/dio/diotemp.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/spicelib/devices/dio/diotemp.c b/src/spicelib/devices/dio/diotemp.c index a67dc386e..f2e3d0bd3 100644 --- a/src/spicelib/devices/dio/diotemp.c +++ b/src/spicelib/devices/dio/diotemp.c @@ -210,8 +210,6 @@ void DIOtempUpdate(DIOmodel *inModel, DIOinstance *here, double Temp, CKTcircuit here->DIOtDepSWCap=model->DIOdepletionSWcapCoeff* here->DIOtJctSWPot; /* and Vcrit */ - vte=model->DIOemissionCoeff*vt; - here->DIOtVcrit = vte * log(vte/(CONSTroot2*here->DIOtSatCur)); /* limit junction potential to max of 1/FC */ From 1bf6cc36c5d9d5b65d7699fb8c4b7cb7b5ce4400 Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 14 May 2024 17:45:29 +0200 Subject: [PATCH 2/3] mos1...3: logical error-prevent garbage for nlev=3 --- src/spicelib/devices/mos1/mos1noi.c | 2 ++ src/spicelib/devices/mos2/mos2noi.c | 2 ++ src/spicelib/devices/mos3/mos3noi.c | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/spicelib/devices/mos1/mos1noi.c b/src/spicelib/devices/mos1/mos1noi.c index f64b137e3..f4815841e 100644 --- a/src/spicelib/devices/mos1/mos1noi.c +++ b/src/spicelib/devices/mos1/mos1noi.c @@ -128,6 +128,8 @@ MOS1noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, /* linear region */ alpha = 1.0 - (vds*inst->MOS1mode/(model->MOS1type*inst->MOS1vdsat)); } + } else { + alpha = 0.0; } beta = inst->MOS1tTransconductance * inst->MOS1m * inst->MOS1w/(inst->MOS1l - 2 * model->MOS1latDiff); diff --git a/src/spicelib/devices/mos2/mos2noi.c b/src/spicelib/devices/mos2/mos2noi.c index 5a726f123..be31c37d9 100644 --- a/src/spicelib/devices/mos2/mos2noi.c +++ b/src/spicelib/devices/mos2/mos2noi.c @@ -117,6 +117,8 @@ MOS2noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, /* linear region */ alpha = 1.0 - (vds*inst->MOS2mode/(model->MOS2type*inst->MOS2vdsat)); } + } else { + alpha = 0.0; } beta = inst->MOS2tTransconductance * inst->MOS2m * inst->MOS2w/(inst->MOS2l - 2 * model->MOS2latDiff); diff --git a/src/spicelib/devices/mos3/mos3noi.c b/src/spicelib/devices/mos3/mos3noi.c index f07bc57c3..1fe631f65 100644 --- a/src/spicelib/devices/mos3/mos3noi.c +++ b/src/spicelib/devices/mos3/mos3noi.c @@ -117,6 +117,8 @@ MOS3noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, /* linear region */ alpha = 1.0 - (vds*inst->MOS3mode/(model->MOS3type*inst->MOS3vdsat)); } + } else { + alpha = 0.0; } beta = inst->MOS3tTransconductance * inst->MOS3m * inst->MOS3w/(inst->MOS3l - 2 * model->MOS3latDiff); From 672c52720db939401a101b5c32c052ef6940fdc3 Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 15 May 2024 14:30:16 +0200 Subject: [PATCH 3/3] mos1...3: set channel thermal noise to 0 in subthreshold range for nlev=3 --- src/spicelib/devices/mos1/mos1noi.c | 11 ++++++----- src/spicelib/devices/mos2/mos2noi.c | 11 ++++++----- src/spicelib/devices/mos3/mos3noi.c | 11 ++++++----- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/spicelib/devices/mos1/mos1noi.c b/src/spicelib/devices/mos1/mos1noi.c index f4815841e..dcd31a497 100644 --- a/src/spicelib/devices/mos1/mos1noi.c +++ b/src/spicelib/devices/mos1/mos1noi.c @@ -128,12 +128,13 @@ MOS1noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, /* linear region */ alpha = 1.0 - (vds*inst->MOS1mode/(model->MOS1type*inst->MOS1vdsat)); } - } else { - alpha = 0.0; - } - beta = inst->MOS1tTransconductance * inst->MOS1m * + beta = inst->MOS1tTransconductance * inst->MOS1m * inst->MOS1w/(inst->MOS1l - 2 * model->MOS1latDiff); - Sid = 2.0 / 3.0 * beta * vgst * (1.0+alpha+alpha*alpha) / (1.0+alpha) * model->MOS1gdsnoi; + Sid = 2.0 / 3.0 * beta * vgst * (1.0+alpha+alpha*alpha) / (1.0+alpha) * model->MOS1gdsnoi; + } else { + /* subthreshold region */ + Sid = 0.0; + } } NevalSrcInstanceTemp( & noizDens[MOS1IDNOIZ], & lnNdens[MOS1IDNOIZ], diff --git a/src/spicelib/devices/mos2/mos2noi.c b/src/spicelib/devices/mos2/mos2noi.c index be31c37d9..1d208b5d9 100644 --- a/src/spicelib/devices/mos2/mos2noi.c +++ b/src/spicelib/devices/mos2/mos2noi.c @@ -117,12 +117,13 @@ MOS2noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, /* linear region */ alpha = 1.0 - (vds*inst->MOS2mode/(model->MOS2type*inst->MOS2vdsat)); } - } else { - alpha = 0.0; - } - beta = inst->MOS2tTransconductance * inst->MOS2m * + beta = inst->MOS2tTransconductance * inst->MOS2m * inst->MOS2w/(inst->MOS2l - 2 * model->MOS2latDiff); - Sid = 2.0 / 3.0 * beta * vgst * (1.0+alpha+alpha*alpha) / (1.0+alpha) * model->MOS2gdsnoi; + Sid = 2.0 / 3.0 * beta * vgst * (1.0+alpha+alpha*alpha) / (1.0+alpha) * model->MOS2gdsnoi; + } else { + /* subthreshold region */ + Sid = 0.0; + } } NevalSrcInstanceTemp( & noizDens[MOS2IDNOIZ], & lnNdens[MOS2IDNOIZ], diff --git a/src/spicelib/devices/mos3/mos3noi.c b/src/spicelib/devices/mos3/mos3noi.c index 1fe631f65..4787fa335 100644 --- a/src/spicelib/devices/mos3/mos3noi.c +++ b/src/spicelib/devices/mos3/mos3noi.c @@ -117,12 +117,13 @@ MOS3noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, /* linear region */ alpha = 1.0 - (vds*inst->MOS3mode/(model->MOS3type*inst->MOS3vdsat)); } - } else { - alpha = 0.0; - } - beta = inst->MOS3tTransconductance * inst->MOS3m * + beta = inst->MOS3tTransconductance * inst->MOS3m * inst->MOS3w/(inst->MOS3l - 2 * model->MOS3latDiff); - Sid = 2.0 / 3.0 * beta * vgst * (1.0+alpha+alpha*alpha) / (1.0+alpha) * model->MOS3gdsnoi; + Sid = 2.0 / 3.0 * beta * vgst * (1.0+alpha+alpha*alpha) / (1.0+alpha) * model->MOS3gdsnoi; + } else { + /* subthreshold region */ + Sid = 0.0; + } } NevalSrcInstanceTemp( & noizDens[MOS3IDNOIZ], & lnNdens[MOS3IDNOIZ],