Add MODEDCTRANCURVE to enable returning capacitance upon dc sweep.

Exclude integration if MODEDCTRANCURVE is active.
This commit is contained in:
Holger Vogt 2026-06-06 14:34:52 +02:00
parent ae06dfe978
commit 2a0a3ab403
5 changed files with 96 additions and 81 deletions

View File

@ -313,7 +313,7 @@ int HFETAload(GENmodel *inModel, CKTcircuit *ckt)
* compute equivalent drain current source
*/
cd = cdrain - cgd;
if ( (ckt->CKTmode & (MODETRAN|MODEINITSMSIG)) ||
if ( (ckt->CKTmode & (MODEDCTRANCURVE|MODETRAN|MODEINITSMSIG)) ||
((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) ){
/*
* charge storage elements
@ -357,28 +357,31 @@ int HFETAload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate1 + here->HFETAqds) =
*(ckt->CKTstate0 + here->HFETAqds);
}
error = NIintegrate(ckt,&geq,&ceq,capgs,here->HFETAqgs);
if(error) return(error);
ggspp = geq;
cgspp = *(ckt->CKTstate0 + here->HFETAcqgs);
cg = cg + cgspp;
error = NIintegrate(ckt,&geq,&ceq,capgd,here->HFETAqgd);
if(error) return(error);
ggdpp = geq;
cgdpp = *(ckt->CKTstate0 + here->HFETAcqgd);
cg = cg + cgdpp;
cd = cd - cgdpp;
error = NIintegrate(ckt,&geq,&ceq,CDS,here->HFETAqds);
if(error) return(error);
gds += geq;
cd += *(ckt->CKTstate0 + here->HFETAcqds);
if (ckt->CKTmode & MODEINITTRAN) {
*(ckt->CKTstate1 + here->HFETAcqgs) =
/* no integration, if dc sweep, but keep evaluating capacitances */
if (!(ckt->CKTmode & MODEDCTRANCURVE)) {
error = NIintegrate(ckt, &geq, &ceq, capgs, here->HFETAqgs);
if (error) return(error);
ggspp = geq;
cgspp = *(ckt->CKTstate0 + here->HFETAcqgs);
cg = cg + cgspp;
error = NIintegrate(ckt, &geq, &ceq, capgd, here->HFETAqgd);
if (error) return(error);
ggdpp = geq;
cgdpp = *(ckt->CKTstate0 + here->HFETAcqgd);
cg = cg + cgdpp;
cd = cd - cgdpp;
error = NIintegrate(ckt, &geq, &ceq, CDS, here->HFETAqds);
if (error) return(error);
gds += geq;
cd += *(ckt->CKTstate0 + here->HFETAcqds);
if (ckt->CKTmode & MODEINITTRAN) {
*(ckt->CKTstate1 + here->HFETAcqgs) =
*(ckt->CKTstate0 + here->HFETAcqgs);
*(ckt->CKTstate1 + here->HFETAcqgd) =
*(ckt->CKTstate1 + here->HFETAcqgd) =
*(ckt->CKTstate0 + here->HFETAcqgd);
*(ckt->CKTstate1 + here->HFETAcqds) =
*(ckt->CKTstate1 + here->HFETAcqds) =
*(ckt->CKTstate0 + here->HFETAcqds);
}
}
}
}

View File

@ -218,7 +218,7 @@ int HFET2load(GENmodel *inModel, CKTcircuit *ckt)
capgd = temp;
}
cd = cdrain - cgd;
if((ckt->CKTmode & (MODETRAN|MODEINITSMSIG)) || ((ckt->CKTmode & MODETRANOP) &&
if((ckt->CKTmode & (MODEDCTRANCURVE|MODETRAN|MODEINITSMSIG)) || ((ckt->CKTmode & MODETRANOP) &&
(ckt->CKTmode & MODEUIC)) ){
/* charge storage elements */
vgs1 = *(ckt->CKTstate1 + here->HFET2vgs);
@ -248,19 +248,22 @@ int HFET2load(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate1 + here->HFET2qgs) = *(ckt->CKTstate0 + here->HFET2qgs);
*(ckt->CKTstate1 + here->HFET2qgd) = *(ckt->CKTstate0 + here->HFET2qgd);
}
error = NIintegrate(ckt,&geq,&ceq,capgs,here->HFET2qgs);
if(error) return(error);
ggs = ggs + geq;
cg = cg + *(ckt->CKTstate0 + here->HFET2cqgs);
error = NIintegrate(ckt,&geq,&ceq,capgd,here->HFET2qgd);
if(error) return(error);
ggd = ggd + geq;
cg = cg + *(ckt->CKTstate0 + here->HFET2cqgd);
cd = cd - *(ckt->CKTstate0 + here->HFET2cqgd);
cgd = cgd + *(ckt->CKTstate0 + here->HFET2cqgd);
if (ckt->CKTmode & MODEINITTRAN) {
*(ckt->CKTstate1 + here->HFET2cqgs) = *(ckt->CKTstate0 + here->HFET2cqgs);
*(ckt->CKTstate1 + here->HFET2cqgd) = *(ckt->CKTstate0 + here->HFET2cqgd);
/* no integration, if dc sweep, but keep evaluating capacitances */
if (!(ckt->CKTmode & MODEDCTRANCURVE)) {
error = NIintegrate(ckt, &geq, &ceq, capgs, here->HFET2qgs);
if (error) return(error);
ggs = ggs + geq;
cg = cg + *(ckt->CKTstate0 + here->HFET2cqgs);
error = NIintegrate(ckt, &geq, &ceq, capgd, here->HFET2qgd);
if (error) return(error);
ggd = ggd + geq;
cg = cg + *(ckt->CKTstate0 + here->HFET2cqgd);
cd = cd - *(ckt->CKTstate0 + here->HFET2cqgd);
cgd = cgd + *(ckt->CKTstate0 + here->HFET2cqgd);
if (ckt->CKTmode & MODEINITTRAN) {
*(ckt->CKTstate1 + here->HFET2cqgs) = *(ckt->CKTstate0 + here->HFET2cqgs);
*(ckt->CKTstate1 + here->HFET2cqgd) = *(ckt->CKTstate0 + here->HFET2cqgd);
}
}
}
}

View File

@ -211,7 +211,7 @@ JFET2load(GENmodel *inModel, CKTcircuit *ckt)
cg = cg + cgd;
cd = cd - cgd;
if ( (ckt->CKTmode & (MODETRAN | MODEAC | MODEINITSMSIG) ) ||
if ( (ckt->CKTmode & (MODEDCTRANCURVE | MODETRAN | MODEAC | MODEINITSMSIG) ) ||
((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) ){
/*
* charge storage elements
@ -244,26 +244,29 @@ JFET2load(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate1 + here->JFET2qds) =
*(ckt->CKTstate0 + here->JFET2qds);
}
error = NIintegrate(ckt,&geq,&ceq,capgs,here->JFET2qgs);
if(error) return(error);
ggs = ggs + geq;
cg = cg + *(ckt->CKTstate0 + here->JFET2cqgs);
error = NIintegrate(ckt,&geq,&ceq,capgd,here->JFET2qgd);
if(error) return(error);
ggd = ggd + geq;
cg = cg + *(ckt->CKTstate0 + here->JFET2cqgd);
cd = cd - *(ckt->CKTstate0 + here->JFET2cqgd);
cgd = cgd + *(ckt->CKTstate0 + here->JFET2cqgd);
error = NIintegrate(ckt,&geq,&ceq,capds,here->JFET2qds);
cd = cd + *(ckt->CKTstate0 + here->JFET2cqds);
if(error) return(error);
if (ckt->CKTmode & MODEINITTRAN) {
*(ckt->CKTstate1 + here->JFET2cqgs) =
/* no integration, if dc sweep, but keep evaluating capacitances */
if (!(ckt->CKTmode & MODEDCTRANCURVE)) {
error = NIintegrate(ckt, &geq, &ceq, capgs, here->JFET2qgs);
if (error) return(error);
ggs = ggs + geq;
cg = cg + *(ckt->CKTstate0 + here->JFET2cqgs);
error = NIintegrate(ckt, &geq, &ceq, capgd, here->JFET2qgd);
if (error) return(error);
ggd = ggd + geq;
cg = cg + *(ckt->CKTstate0 + here->JFET2cqgd);
cd = cd - *(ckt->CKTstate0 + here->JFET2cqgd);
cgd = cgd + *(ckt->CKTstate0 + here->JFET2cqgd);
error = NIintegrate(ckt, &geq, &ceq, capds, here->JFET2qds);
cd = cd + *(ckt->CKTstate0 + here->JFET2cqds);
if (error) return(error);
if (ckt->CKTmode & MODEINITTRAN) {
*(ckt->CKTstate1 + here->JFET2cqgs) =
*(ckt->CKTstate0 + here->JFET2cqgs);
*(ckt->CKTstate1 + here->JFET2cqgd) =
*(ckt->CKTstate1 + here->JFET2cqgd) =
*(ckt->CKTstate0 + here->JFET2cqgd);
*(ckt->CKTstate1 + here->JFET2cqds) =
*(ckt->CKTstate1 + here->JFET2cqds) =
*(ckt->CKTstate0 + here->JFET2cqds);
}
}
}
}

View File

@ -335,7 +335,7 @@ MESload(GENmodel *inModel, CKTcircuit *ckt)
* compute equivalent drain current source
*/
cd = cdrain - cgd;
if ( (ckt->CKTmode & (MODETRAN|MODEINITSMSIG)) ||
if ( (ckt->CKTmode & (MODEDCTRANCURVE | MODETRAN | MODEINITSMSIG)) ||
((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) ){
/*
* charge storage elements
@ -382,21 +382,24 @@ MESload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate1 + here->MESqgd) =
*(ckt->CKTstate0 + here->MESqgd);
}
error = NIintegrate(ckt,&geq,&ceq,capgs,here->MESqgs);
if(error) return(error);
ggs = ggs + geq;
cg = cg + *(ckt->CKTstate0 + here->MEScqgs);
error = NIintegrate(ckt,&geq,&ceq,capgd,here->MESqgd);
if(error) return(error);
ggd = ggd + geq;
cg = cg + *(ckt->CKTstate0 + here->MEScqgd);
cd = cd - *(ckt->CKTstate0 + here->MEScqgd);
cgd = cgd + *(ckt->CKTstate0 + here->MEScqgd);
if (ckt->CKTmode & MODEINITTRAN) {
*(ckt->CKTstate1 + here->MEScqgs) =
/* no integration, if dc sweep, but keep evaluating capacitances */
if (!(ckt->CKTmode & MODEDCTRANCURVE)) {
error = NIintegrate(ckt, &geq, &ceq, capgs, here->MESqgs);
if (error) return(error);
ggs = ggs + geq;
cg = cg + *(ckt->CKTstate0 + here->MEScqgs);
error = NIintegrate(ckt, &geq, &ceq, capgd, here->MESqgd);
if (error) return(error);
ggd = ggd + geq;
cg = cg + *(ckt->CKTstate0 + here->MEScqgd);
cd = cd - *(ckt->CKTstate0 + here->MEScqgd);
cgd = cgd + *(ckt->CKTstate0 + here->MEScqgd);
if (ckt->CKTmode & MODEINITTRAN) {
*(ckt->CKTstate1 + here->MEScqgs) =
*(ckt->CKTstate0 + here->MEScqgs);
*(ckt->CKTstate1 + here->MEScqgd) =
*(ckt->CKTstate1 + here->MEScqgd) =
*(ckt->CKTstate0 + here->MEScqgd);
}
}
}
}

View File

@ -326,7 +326,7 @@ MESAload(GENmodel *inModel, CKTcircuit *ckt)
* compute equivalent drain current source
*/
cd = cdrain - cgd;
if ( (ckt->CKTmode & (MODETRAN|MODEINITSMSIG)) ||
if ( (ckt->CKTmode & (MODEDCTRANCURVE | MODETRAN | MODEINITSMSIG)) ||
((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) ){
/*
* charge storage elements
@ -362,22 +362,25 @@ MESAload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTstate1 + here->MESAqgd) =
*(ckt->CKTstate0 + here->MESAqgd);
}
error = NIintegrate(ckt,&geq,&ceq,capgs,here->MESAqgs);
if(error) return(error);
ggspp = geq;
cgspp = *(ckt->CKTstate0 + here->MESAcqgs);
cg = cg + cgspp;
error = NIintegrate(ckt,&geq,&ceq,capgd,here->MESAqgd);
if(error) return(error);
ggdpp = geq;
cgdpp = *(ckt->CKTstate0 + here->MESAcqgd);
cg = cg + cgdpp;
cd = cd - cgdpp;
if (ckt->CKTmode & MODEINITTRAN) {
*(ckt->CKTstate1 + here->MESAcqgs) =
/* no integration, if dc sweep, but keep evaluating capacitances */
if (!(ckt->CKTmode & MODEDCTRANCURVE)) {
error = NIintegrate(ckt, &geq, &ceq, capgs, here->MESAqgs);
if (error) return(error);
ggspp = geq;
cgspp = *(ckt->CKTstate0 + here->MESAcqgs);
cg = cg + cgspp;
error = NIintegrate(ckt, &geq, &ceq, capgd, here->MESAqgd);
if (error) return(error);
ggdpp = geq;
cgdpp = *(ckt->CKTstate0 + here->MESAcqgd);
cg = cg + cgdpp;
cd = cd - cgdpp;
if (ckt->CKTmode & MODEINITTRAN) {
*(ckt->CKTstate1 + here->MESAcqgs) =
*(ckt->CKTstate0 + here->MESAcqgs);
*(ckt->CKTstate1 + here->MESAcqgd) =
*(ckt->CKTstate1 + here->MESAcqgd) =
*(ckt->CKTstate0 + here->MESAcqgd);
}
}
}
}