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

View File

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

View File

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

View File

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