From 519cb8392c4acc64d0106aeb9bb248f29a8377ec Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Mon, 6 Jun 2022 16:27:06 +0200 Subject: [PATCH] dc sweep fails after transient sim: keep MODEDCTRANCURVE as provided by commit 7d8236766 ("b3ld.c, b4ld.c, b3v32ld.c: enable capacitance calculation during dc sweep", 2012-10-03) Instead exclude current integration when MODEDCTRANCURVE is selected. Unify setting ChargeComputationNeeded in b4vdld.c, make it as in other b4xxld.c. --- src/spicelib/devices/bsim3/b3ld.c | 4 ++++ src/spicelib/devices/bsim3v32/b3v32ld.c | 4 ++++ src/spicelib/devices/bsim4/b4ld.c | 4 ++++ src/spicelib/devices/bsim4v5/b4v5ld.c | 7 +++++-- src/spicelib/devices/bsim4v7/b4v7ld.c | 4 ++++ 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/spicelib/devices/bsim3/b3ld.c b/src/spicelib/devices/bsim3/b3ld.c index c85c990c4..6ed5f6ee4 100644 --- a/src/spicelib/devices/bsim3/b3ld.c +++ b/src/spicelib/devices/bsim3/b3ld.c @@ -2812,6 +2812,10 @@ line755: if (!ChargeComputationNeeded) goto line850; + /* no integration, if dc sweep, but keep evaluating capacitances */ + if (ckt->CKTmode & MODEDCTRANCURVE) + goto line850; + if (ckt->CKTmode & MODEINITTRAN) { *(ckt->CKTstate1 + here->BSIM3qb) = *(ckt->CKTstate0 + here->BSIM3qb); diff --git a/src/spicelib/devices/bsim3v32/b3v32ld.c b/src/spicelib/devices/bsim3v32/b3v32ld.c index 06c153c32..60a8c3261 100644 --- a/src/spicelib/devices/bsim3v32/b3v32ld.c +++ b/src/spicelib/devices/bsim3v32/b3v32ld.c @@ -3125,6 +3125,10 @@ line755: if (!ChargeComputationNeeded) goto line850; + /* no integration, if dc sweep, but keep evaluating capacitances */ + if (ckt->CKTmode & MODEDCTRANCURVE) + goto line850; + if (ckt->CKTmode & MODEINITTRAN) { *(ckt->CKTstate1 + here->BSIM3v32qb) = *(ckt->CKTstate0 + here->BSIM3v32qb); diff --git a/src/spicelib/devices/bsim4/b4ld.c b/src/spicelib/devices/bsim4/b4ld.c index ea1321033..300231625 100644 --- a/src/spicelib/devices/bsim4/b4ld.c +++ b/src/spicelib/devices/bsim4/b4ld.c @@ -4614,6 +4614,10 @@ line755: if (!ChargeComputationNeeded) goto line850; + /* no integration, if dc sweep, but keep evaluating capacitances */ + if (ckt->CKTmode & MODEDCTRANCURVE) + goto line850; + if (ckt->CKTmode & MODEINITTRAN) { *(ckt->CKTstate1 + here->BSIM4qb) = *(ckt->CKTstate0 + here->BSIM4qb); diff --git a/src/spicelib/devices/bsim4v5/b4v5ld.c b/src/spicelib/devices/bsim4v5/b4v5ld.c index dda45a395..d2ebca478 100644 --- a/src/spicelib/devices/bsim4v5/b4v5ld.c +++ b/src/spicelib/devices/bsim4v5/b4v5ld.c @@ -231,10 +231,9 @@ int ByPass, ChargeComputationNeeded, error, Check, Check1, Check2; ScalingFactor = 1.0e-9; ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || + ((ckt->CKTmode & (MODEDCTRANCURVE | MODEAC | MODETRAN | MODEINITSMSIG)) || ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) ? 1 : 0; -ChargeComputationNeeded = 1; #ifndef USE_OMP for (; model != NULL; model = BSIM4v5nextModel(model)) @@ -4188,6 +4187,10 @@ line755: if (!ChargeComputationNeeded) goto line850; + /* no integration, if dc sweep, but keep evaluating capacitances */ + if (ckt->CKTmode & MODEDCTRANCURVE) + goto line850; + if (ckt->CKTmode & MODEINITTRAN) { *(ckt->CKTstate1 + here->BSIM4v5qb) = *(ckt->CKTstate0 + here->BSIM4v5qb); diff --git a/src/spicelib/devices/bsim4v7/b4v7ld.c b/src/spicelib/devices/bsim4v7/b4v7ld.c index d984a14d8..bc4058b8a 100644 --- a/src/spicelib/devices/bsim4v7/b4v7ld.c +++ b/src/spicelib/devices/bsim4v7/b4v7ld.c @@ -4523,6 +4523,10 @@ line755: if (!ChargeComputationNeeded) goto line850; + /* no integration, if dc sweep, but keep evaluating capacitances */ + if (ckt->CKTmode & MODEDCTRANCURVE) + goto line850; + if (ckt->CKTmode & MODEINITTRAN) { *(ckt->CKTstate1 + here->BSIM4v7qb) = *(ckt->CKTstate0 + here->BSIM4v7qb);