gate resistance und gate conductance added, prime gate node added, not yet o.k. when rg is set, probably wrong signedness

This commit is contained in:
Holger Vogt 2018-04-02 20:15:13 +02:00 committed by rlar
parent 40b9b18b01
commit d63123a269
3 changed files with 91 additions and 9 deletions

View File

@ -44,6 +44,7 @@ typedef struct sVDMOSinstance {
const int VDMOSbNode; /* number of the bulk node of the mosfet */
int VDMOSdNodePrime; /* number of the internal drain node of the mosfet */
int VDMOSsNodePrime; /* number of the internal source node of the mosfet */
int VDMOSgNodePrime; /* number of the internal gate node of the mosfet */
double VDMOSm; /* parallel device multiplier */
@ -231,6 +232,25 @@ typedef struct sVDMOSinstance {
* (source prime node,bulk node) */
double *VDMOSSPdpPtr; /* pointer to sparse matrix element at
* (source prime node,drain prime node) */
/* added for VDMOS */
double *VDMOSGPgpPtr; /* pointer to sparse matrix element at
* (gate prime node, gate prime node) */
double *VDMOSGPbPtr; /* pointer to sparse matrix element at
* (gate prime node, bulk node) */
double *VDMOSGPdpPtr; /* pointer to sparse matrix element at
* (gate prime node, drain prime node) */
double *VDMOSGPspPtr; /* pointer to sparse matrix element at
* (gate prime node, source prime node) */
double *VDMOSBgpPtr; /* pointer to sparse matrix element at
* (bulk node, gate prime node) */
double *VDMOSDPgpPtr; /* pointer to sparse matrix element at
* (drain prime node, gate prime node) */
double *VDMOSSPgpPtr; /* pointer to sparse matrix element at
* (source prime node, gate prime node) */
double *VDMOSGgpPtr; /* pointer to sparse matrix element at
* (gate node, gate prime node) */
double *VDMOSGPgPtr; /* pointer to sparse matrix element at
* (gate prime node, gate node) */
} VDMOSinstance ;

View File

@ -171,7 +171,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
*(ckt->CKTrhsOld + here->VDMOSbNode) -
*(ckt->CKTrhsOld + here->VDMOSsNodePrime));
vgs = model->VDMOStype * (
*(ckt->CKTrhsOld + here->VDMOSgNode) -
*(ckt->CKTrhsOld + here->VDMOSgNodePrime) -
*(ckt->CKTrhsOld + here->VDMOSsNodePrime));
vds = model->VDMOStype * (
*(ckt->CKTrhsOld + here->VDMOSdNodePrime) -
@ -817,7 +817,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
cdreq = -(model->VDMOStype)*(cdrain - here->VDMOSgds*(-vds) -
here->VDMOSgm*vgd - here->VDMOSgmbs*vbd);
}
*(ckt->CKTrhs + here->VDMOSgNode) -=
*(ckt->CKTrhs + here->VDMOSgNodePrime) -=
(model->VDMOStype * (ceqgs + ceqgb + ceqgd));
*(ckt->CKTrhs + here->VDMOSbNode) -=
(ceqbs + ceqbd - model->VDMOStype * ceqgb);
@ -830,7 +830,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
*/
*(here->VDMOSDdPtr) += (here->VDMOSdrainConductance);
*(here->VDMOSGgPtr) += ((gcgd + gcgs + gcgb));
*(here->VDMOSGgPtr) += (here->VDMOSgateConductance); //((gcgd + gcgs + gcgb));
*(here->VDMOSSsPtr) += (here->VDMOSsourceConductance);
*(here->VDMOSBbPtr) += (here->VDMOSgbd + here->VDMOSgbs + gcgb);
*(here->VDMOSDPdpPtr) +=
@ -839,20 +839,24 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
*(here->VDMOSSPspPtr) +=
(here->VDMOSsourceConductance + here->VDMOSgds +
here->VDMOSgbs + xnrm*(here->VDMOSgm + here->VDMOSgmbs) + gcgs);
*(here->VDMOSGPgpPtr) +=
(here->VDMOSgateConductance) + (gcgd + gcgs + gcgb);
*(here->VDMOSGgpPtr) += (-here->VDMOSgateConductance);
*(here->VDMOSDdpPtr) += (-here->VDMOSdrainConductance);
*(here->VDMOSGbPtr) -= gcgb;
*(here->VDMOSGdpPtr) -= gcgd;
*(here->VDMOSGspPtr) -= gcgs;
*(here->VDMOSGPgPtr) += (-here->VDMOSgateConductance);
*(here->VDMOSGPbPtr) -= gcgb;
*(here->VDMOSGPdpPtr) -= gcgd;
*(here->VDMOSGPspPtr) -= gcgs;
*(here->VDMOSSspPtr) += (-here->VDMOSsourceConductance);
*(here->VDMOSBgPtr) -= gcgb;
*(here->VDMOSBgpPtr) -= gcgb;
*(here->VDMOSBdpPtr) -= here->VDMOSgbd;
*(here->VDMOSBspPtr) -= here->VDMOSgbs;
*(here->VDMOSDPdPtr) += (-here->VDMOSdrainConductance);
*(here->VDMOSDPgPtr) += ((xnrm - xrev)*here->VDMOSgm - gcgd);
*(here->VDMOSDPgpPtr) += ((xnrm - xrev)*here->VDMOSgm - gcgd);
*(here->VDMOSDPbPtr) += (-here->VDMOSgbd + (xnrm - xrev)*here->VDMOSgmbs);
*(here->VDMOSDPspPtr) += (-here->VDMOSgds - xnrm*
(here->VDMOSgm + here->VDMOSgmbs));
*(here->VDMOSSPgPtr) += (-(xnrm - xrev)*here->VDMOSgm - gcgs);
*(here->VDMOSSPgpPtr) += (-(xnrm - xrev)*here->VDMOSgm - gcgs);
*(here->VDMOSSPsPtr) += (-here->VDMOSsourceConductance);
*(here->VDMOSSPbPtr) += (-here->VDMOSgbs - (xnrm - xrev)*here->VDMOSgmbs);
*(here->VDMOSSPdpPtr) += (-here->VDMOSgds - xrev*

View File

@ -188,11 +188,36 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
here->VDMOSsNodePrime = here->VDMOSsNode;
}
if (model->VDMOSgateResistance != 0 ) {
if (here->VDMOSgNodePrime == 0) {
error = CKTmkVolt(ckt, &tmp, here->VDMOSname, "gate");
if (error) return(error);
here->VDMOSgNodePrime = tmp->number;
if (ckt->CKTcopyNodesets) {
CKTnode *tmpNode;
IFuid tmpName;
if (CKTinst2Node(ckt, here, 3, &tmpNode, &tmpName) == OK) {
if (tmpNode->nsGiven) {
tmp->nodeset = tmpNode->nodeset;
tmp->nsGiven = tmpNode->nsGiven;
}
}
}
}
}
else {
here->VDMOSgNodePrime = here->VDMOSgNode;
}
/* macro to make elements with built in test for out of memory */
#define TSTALLOC(ptr,first,second) \
do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\
return(E_NOMEM);\
} } while(0)
/*
TSTALLOC(VDMOSDdPtr, VDMOSdNode, VDMOSdNode);
TSTALLOC(VDMOSGgPtr, VDMOSgNode, VDMOSgNode);
TSTALLOC(VDMOSSsPtr, VDMOSsNode, VDMOSsNode);
@ -215,6 +240,34 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\
TSTALLOC(VDMOSDPbPtr, VDMOSdNodePrime, VDMOSbNode);
TSTALLOC(VDMOSSPbPtr, VDMOSsNodePrime, VDMOSbNode);
TSTALLOC(VDMOSSPdpPtr, VDMOSsNodePrime, VDMOSdNodePrime);
*/
TSTALLOC(VDMOSDdPtr, VDMOSdNode, VDMOSdNode);
TSTALLOC(VDMOSGgPtr, VDMOSgNode, VDMOSgNode);
TSTALLOC(VDMOSSsPtr, VDMOSsNode, VDMOSsNode);
TSTALLOC(VDMOSBbPtr, VDMOSbNode, VDMOSbNode);
TSTALLOC(VDMOSDPdpPtr, VDMOSdNodePrime, VDMOSdNodePrime);
TSTALLOC(VDMOSSPspPtr, VDMOSsNodePrime, VDMOSsNodePrime);
TSTALLOC(VDMOSGPgpPtr, VDMOSgNodePrime, VDMOSgNodePrime);
TSTALLOC(VDMOSDdpPtr, VDMOSdNode, VDMOSdNodePrime);
TSTALLOC(VDMOSGPbPtr, VDMOSgNodePrime, VDMOSbNode);
TSTALLOC(VDMOSGPdpPtr, VDMOSgNodePrime, VDMOSdNodePrime);
TSTALLOC(VDMOSGPspPtr, VDMOSgNodePrime, VDMOSsNodePrime);
TSTALLOC(VDMOSSspPtr, VDMOSsNode, VDMOSsNodePrime);
TSTALLOC(VDMOSBdpPtr, VDMOSbNode, VDMOSdNodePrime);
TSTALLOC(VDMOSBspPtr, VDMOSbNode, VDMOSsNodePrime);
TSTALLOC(VDMOSDPspPtr, VDMOSdNodePrime, VDMOSsNodePrime);
TSTALLOC(VDMOSDPdPtr, VDMOSdNodePrime, VDMOSdNode);
TSTALLOC(VDMOSBgpPtr, VDMOSbNode, VDMOSgNodePrime);
TSTALLOC(VDMOSDPgpPtr, VDMOSdNodePrime, VDMOSgNodePrime);
TSTALLOC(VDMOSSPgpPtr, VDMOSsNodePrime, VDMOSgNodePrime);
TSTALLOC(VDMOSSPsPtr, VDMOSsNodePrime, VDMOSsNode);
TSTALLOC(VDMOSDPbPtr, VDMOSdNodePrime, VDMOSbNode);
TSTALLOC(VDMOSSPbPtr, VDMOSsNodePrime, VDMOSbNode);
TSTALLOC(VDMOSSPdpPtr, VDMOSsNodePrime, VDMOSdNodePrime);
TSTALLOC(VDMOSGgpPtr, VDMOSgNode, VDMOSgNodePrime);
TSTALLOC(VDMOSGPgPtr, VDMOSgNodePrime, VDMOSgNode);
}
}
@ -242,6 +295,11 @@ VDMOSunsetup(GENmodel *inModel, CKTcircuit *ckt)
&& here->VDMOSdNodePrime != here->VDMOSdNode)
CKTdltNNum(ckt, here->VDMOSdNodePrime);
here->VDMOSdNodePrime = 0;
if (here->VDMOSgNodePrime > 0
&& here->VDMOSgNodePrime != here->VDMOSgNode)
CKTdltNNum(ckt, here->VDMOSgNodePrime);
here->VDMOSgNodePrime = 0;
}
}
return OK;