From 973b6b6d49d0381e6e23dfd5ec4f3ca0392aeaa1 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Sun, 31 May 2026 15:57:26 +0200 Subject: [PATCH] No integration if dc sweep, but keep calculating capacitances --- src/spicelib/devices/bjt/bjtload.c | 33 ++++++----- src/spicelib/devices/vbic/vbicload.c | 87 ++++++++++++++-------------- 2 files changed, 63 insertions(+), 57 deletions(-) diff --git a/src/spicelib/devices/bjt/bjtload.c b/src/spicelib/devices/bjt/bjtload.c index e9647c458..9625f612f 100644 --- a/src/spicelib/devices/bjt/bjtload.c +++ b/src/spicelib/devices/bjt/bjtload.c @@ -797,21 +797,24 @@ next1: vtn=vt*here->BJTtemissionCoeffF; *(ckt->CKTstate1 + here->BJTqbcx) = *(ckt->CKTstate0 + here->BJTqbcx) ; } - error = NIintegrate(ckt,&geq,&ceq,capbe,here->BJTqbe); - if(error) return(error); - geqcb=geqcb*ckt->CKTag[0]; - gpi=gpi+geq; - cb=cb+*(ckt->CKTstate0 + here->BJTcqbe); - error = NIintegrate(ckt,&geq,&ceq,capbc,here->BJTqbc); - if(error) return(error); - gmu=gmu+geq; - cb=cb+*(ckt->CKTstate0 + here->BJTcqbc); - cc=cc-*(ckt->CKTstate0 + here->BJTcqbc); - if (model->BJTintCollResistGiven) { - error = NIintegrate(ckt,&geq,&ceq,Qbcx_Vbcx,here->BJTqbcx); - if(error) return(error); - gbcx = geq; - cbcx = *(ckt->CKTstate0 + here->BJTcqbcx); + /* no integration, if dc sweep, but keep evaluating capacitances */ + if (!(ckt->CKTmode & MODEDCTRANCURVE)) { + error = NIintegrate(ckt, &geq, &ceq, capbe, here->BJTqbe); + if (error) return(error); + geqcb = geqcb * ckt->CKTag[0]; + gpi = gpi + geq; + cb = cb + *(ckt->CKTstate0 + here->BJTcqbe); + error = NIintegrate(ckt, &geq, &ceq, capbc, here->BJTqbc); + if (error) return(error); + gmu = gmu + geq; + cb = cb + *(ckt->CKTstate0 + here->BJTcqbc); + cc = cc - *(ckt->CKTstate0 + here->BJTcqbc); + if (model->BJTintCollResistGiven) { + error = NIintegrate(ckt, &geq, &ceq, Qbcx_Vbcx, here->BJTqbcx); + if (error) return(error); + gbcx = geq; + cbcx = *(ckt->CKTstate0 + here->BJTcqbcx); + } } if(ckt->CKTmode & MODEINITTRAN) { *(ckt->CKTstate1 + here->BJTcqbe) = diff --git a/src/spicelib/devices/vbic/vbicload.c b/src/spicelib/devices/vbic/vbicload.c index 26851d6ee..c1b7a7161 100644 --- a/src/spicelib/devices/vbic/vbicload.c +++ b/src/spicelib/devices/vbic/vbicload.c @@ -864,54 +864,57 @@ VBICload(GENmodel *inModel, CKTcircuit *ckt) *(ckt->CKTstate0 + here->VBICqxf2) ; } } - error = NIintegrate(ckt,&geq,&ceq,Qbe_Vbei,here->VBICqbe); - if(error) return(error); - Ibe_Vbei = Ibe_Vbei + geq; - Ibe = Ibe + *(ckt->CKTstate0 + here->VBICcqbe); + /* no integration, if dc sweep, but keep evaluating capacitances */ + if (!(ckt->CKTmode& MODEDCTRANCURVE)) { + error = NIintegrate(ckt, &geq, &ceq, Qbe_Vbei, here->VBICqbe); + if (error) return(error); + Ibe_Vbei = Ibe_Vbei + geq; + Ibe = Ibe + *(ckt->CKTstate0 + here->VBICcqbe); - error = NIintegrate(ckt,&geq,&ceq,Qbex_Vbex,here->VBICqbex); - if(error) return(error); - Ibex_Vbex = Ibex_Vbex + geq; - Ibex = Ibex + *(ckt->CKTstate0 + here->VBICcqbex); + error = NIintegrate(ckt, &geq, &ceq, Qbex_Vbex, here->VBICqbex); + if (error) return(error); + Ibex_Vbex = Ibex_Vbex + geq; + Ibex = Ibex + *(ckt->CKTstate0 + here->VBICcqbex); - error = NIintegrate(ckt,&geq,&ceq,Qbc_Vbci,here->VBICqbc); - if(error) return(error); - Ibc_Vbci = Ibc_Vbci + geq; - Ibc = Ibc + *(ckt->CKTstate0 + here->VBICcqbc); + error = NIintegrate(ckt, &geq, &ceq, Qbc_Vbci, here->VBICqbc); + if (error) return(error); + Ibc_Vbci = Ibc_Vbci + geq; + Ibc = Ibc + *(ckt->CKTstate0 + here->VBICcqbc); - error = NIintegrate(ckt,&geq,&ceq,Qbcx_Vbcx,here->VBICqbcx); - if(error) return(error); - gbcx = geq; - cbcx = *(ckt->CKTstate0 + here->VBICcqbcx); + error = NIintegrate(ckt, &geq, &ceq, Qbcx_Vbcx, here->VBICqbcx); + if (error) return(error); + gbcx = geq; + cbcx = *(ckt->CKTstate0 + here->VBICcqbcx); - error = NIintegrate(ckt,&geq,&ceq,Qbep_Vbep,here->VBICqbep); - if(error) return(error); - Ibep_Vbep = Ibep_Vbep + geq; - Ibep = Ibep + *(ckt->CKTstate0 + here->VBICcqbep); + error = NIintegrate(ckt, &geq, &ceq, Qbep_Vbep, here->VBICqbep); + if (error) return(error); + Ibep_Vbep = Ibep_Vbep + geq; + Ibep = Ibep + *(ckt->CKTstate0 + here->VBICcqbep); - error = NIintegrate(ckt,&geq,&ceq,Qbcp_Vbcp,here->VBICqbcp); - if(error) return(error); - Ibcp_Vbcp = Ibcp_Vbcp + geq; - Ibcp = Ibcp + *(ckt->CKTstate0 + here->VBICcqbcp); + error = NIintegrate(ckt, &geq, &ceq, Qbcp_Vbcp, here->VBICqbcp); + if (error) return(error); + Ibcp_Vbcp = Ibcp_Vbcp + geq; + Ibcp = Ibcp + *(ckt->CKTstate0 + here->VBICcqbcp); - if (here->VBIC_selfheat) - { - error = NIintegrate(ckt,&geq,&ceq,Qcth_Vrth,here->VBICqcth); - if(error) return(error); - Icth_Vrth = geq; - Icth = *(ckt->CKTstate0 + here->VBICcqcth); - } - if (here->VBIC_excessPhase) { - //Qxf1 - error = NIintegrate(ckt,&geq,&ceq,Qxf1_Vxf1,here->VBICqxf1); - if(error) return(error); - Ixf1_Vxf1 += geq; - Ixf1 += *(ckt->CKTstate0 + here->VBICcqxf1); - //Qxf2 - error = NIintegrate(ckt,&geq,&ceq,Qxf2_Vxf2,here->VBICqxf2); - if(error) return(error); - Ixf2_Vxf2 += geq; - Ixf2 += *(ckt->CKTstate0 + here->VBICcqxf2); + if (here->VBIC_selfheat) + { + error = NIintegrate(ckt, &geq, &ceq, Qcth_Vrth, here->VBICqcth); + if (error) return(error); + Icth_Vrth = geq; + Icth = *(ckt->CKTstate0 + here->VBICcqcth); + } + if (here->VBIC_excessPhase) { + //Qxf1 + error = NIintegrate(ckt, &geq, &ceq, Qxf1_Vxf1, here->VBICqxf1); + if (error) return(error); + Ixf1_Vxf1 += geq; + Ixf1 += *(ckt->CKTstate0 + here->VBICcqxf1); + //Qxf2 + error = NIintegrate(ckt, &geq, &ceq, Qxf2_Vxf2, here->VBICqxf2); + if (error) return(error); + Ixf2_Vxf2 += geq; + Ixf2 += *(ckt->CKTstate0 + here->VBICcqxf2); + } } if(ckt->CKTmode & MODEINITTRAN) {