add parallel resistor rds (between outer drain and source nodes, parallel to bulk diode)
This commit is contained in:
parent
b7c6145f5e
commit
4a3c707036
|
|
@ -97,6 +97,7 @@ IFparm VDMOSmPTable[] = { /* model parameters */
|
||||||
IOP("bv", VDMOS_MOD_BV, IF_REAL, "Vds breakdown voltage"),
|
IOP("bv", VDMOS_MOD_BV, IF_REAL, "Vds breakdown voltage"),
|
||||||
IOP("ibv", VDMOS_MOD_IBV, IF_REAL, "Current at Vds=bv"),
|
IOP("ibv", VDMOS_MOD_IBV, IF_REAL, "Current at Vds=bv"),
|
||||||
IOP("nbv", VDMOS_MOD_NBV, IF_REAL, "Vds breakdown emission coefficient"),
|
IOP("nbv", VDMOS_MOD_NBV, IF_REAL, "Vds breakdown emission coefficient"),
|
||||||
|
IOP("rds", VDMOS_MOD_RDS, IF_REAL, "Drain-source shunt resistance"),
|
||||||
IOP("rb", VDMOS_MOD_RB, IF_REAL, "Body diode ohmic resistance"),
|
IOP("rb", VDMOS_MOD_RB, IF_REAL, "Body diode ohmic resistance"),
|
||||||
IOP("n", VDMOS_MOD_N, IF_REAL, "Bulk diode emission coefficient"),
|
IOP("n", VDMOS_MOD_N, IF_REAL, "Bulk diode emission coefficient"),
|
||||||
IOP("tt", VDMOS_MOD_TT, IF_REAL, "Body diode transit time"),
|
IOP("tt", VDMOS_MOD_TT, IF_REAL, "Body diode transit time"),
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,7 @@ typedef struct sVDMOSinstance {
|
||||||
double VDMOSsourceConductance; /*conductance of source(or 0):set in setup*/
|
double VDMOSsourceConductance; /*conductance of source(or 0):set in setup*/
|
||||||
double VDMOSdrainConductance; /*conductance of drain(or 0):set in setup*/
|
double VDMOSdrainConductance; /*conductance of drain(or 0):set in setup*/
|
||||||
double VDMOSgateConductance; /*conductance of gate(or 0):set in setup*/
|
double VDMOSgateConductance; /*conductance of gate(or 0):set in setup*/
|
||||||
|
double VDMOSdsConductance; /*conductance of drain to source:set in setup*/
|
||||||
double VDMOStemp; /* operating temperature of this instance */
|
double VDMOStemp; /* operating temperature of this instance */
|
||||||
double VDMOSdtemp; /* operating temperature of the instance relative to circuit temperature*/
|
double VDMOSdtemp; /* operating temperature of the instance relative to circuit temperature*/
|
||||||
|
|
||||||
|
|
@ -245,6 +246,10 @@ typedef struct sVDMOSinstance {
|
||||||
* (gate node, gate prime node) */
|
* (gate node, gate prime node) */
|
||||||
double *VDMOSGPgPtr; /* pointer to sparse matrix element at
|
double *VDMOSGPgPtr; /* pointer to sparse matrix element at
|
||||||
* (gate prime node, gate node) */
|
* (gate prime node, gate node) */
|
||||||
|
double *VDMOSDsPtr; /* pointer to sparse matrix element at
|
||||||
|
* (source node, drain node) */
|
||||||
|
double *VDMOSSdPtr; /* pointer to sparse matrix element at
|
||||||
|
* (drain node, source node) */
|
||||||
/* bulk diode */
|
/* bulk diode */
|
||||||
double *VDIORPdPtr; /* pointer to sparse matrix element at
|
double *VDIORPdPtr; /* pointer to sparse matrix element at
|
||||||
* (diode prime node, drain node) */
|
* (diode prime node, drain node) */
|
||||||
|
|
@ -340,6 +345,7 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */
|
||||||
double VDIOresistTemp1;
|
double VDIOresistTemp1;
|
||||||
double VDIOresistTemp2;
|
double VDIOresistTemp2;
|
||||||
double VDIOconductance;
|
double VDIOconductance;
|
||||||
|
double VDMOSrds;
|
||||||
double VDMOSDn;
|
double VDMOSDn;
|
||||||
double VDIOtransitTime;
|
double VDIOtransitTime;
|
||||||
double VDIOtranTimeTemp1;
|
double VDIOtranTimeTemp1;
|
||||||
|
|
@ -377,6 +383,7 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */
|
||||||
unsigned VDIOjunctionPotGiven :1;
|
unsigned VDIOjunctionPotGiven :1;
|
||||||
unsigned VDIObrkdEmissionCoeffGiven :1;
|
unsigned VDIObrkdEmissionCoeffGiven :1;
|
||||||
unsigned VDIOresistanceGiven :1;
|
unsigned VDIOresistanceGiven :1;
|
||||||
|
unsigned VDMOSrdsGiven :1;
|
||||||
unsigned VDMOSDnGiven :1;
|
unsigned VDMOSDnGiven :1;
|
||||||
unsigned VDIOtransitTimeGiven :1;
|
unsigned VDIOtransitTimeGiven :1;
|
||||||
unsigned VDMOSDegGiven :1;
|
unsigned VDMOSDegGiven :1;
|
||||||
|
|
@ -437,6 +444,7 @@ enum {
|
||||||
VDMOS_MOD_BV,
|
VDMOS_MOD_BV,
|
||||||
VDMOS_MOD_IBV,
|
VDMOS_MOD_IBV,
|
||||||
VDMOS_MOD_NBV,
|
VDMOS_MOD_NBV,
|
||||||
|
VDMOS_MOD_RDS,
|
||||||
VDMOS_MOD_N,
|
VDMOS_MOD_N,
|
||||||
VDMOS_MOD_TT,
|
VDMOS_MOD_TT,
|
||||||
VDMOS_MOD_EG,
|
VDMOS_MOD_EG,
|
||||||
|
|
|
||||||
|
|
@ -563,9 +563,6 @@ bypass :
|
||||||
ceqgb = ceqgb - gcgb*vgb + ckt->CKTag[0] *
|
ceqgb = ceqgb - gcgb*vgb + ckt->CKTag[0] *
|
||||||
*(ckt->CKTstate0 + here->VDMOSqgb);
|
*(ckt->CKTstate0 + here->VDMOSqgb);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* store charge storage info for meyer's cap in lx table
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* load current vector
|
* load current vector
|
||||||
|
|
@ -597,9 +594,9 @@ bypass :
|
||||||
* load y matrix
|
* load y matrix
|
||||||
*/
|
*/
|
||||||
|
|
||||||
*(here->VDMOSDdPtr) += (here->VDMOSdrainConductance);
|
*(here->VDMOSDdPtr) += (here->VDMOSdrainConductance + here->VDMOSdsConductance);
|
||||||
*(here->VDMOSGgPtr) += (here->VDMOSgateConductance); //((gcgd + gcgs + gcgb));
|
*(here->VDMOSGgPtr) += (here->VDMOSgateConductance); //((gcgd + gcgs + gcgb));
|
||||||
*(here->VDMOSSsPtr) += (here->VDMOSsourceConductance);
|
*(here->VDMOSSsPtr) += (here->VDMOSsourceConductance + here->VDMOSdsConductance);
|
||||||
*(here->VDMOSBbPtr) += (here->VDMOSgbd + here->VDMOSgbs + gcgb);
|
*(here->VDMOSBbPtr) += (here->VDMOSgbd + here->VDMOSgbs + gcgb);
|
||||||
*(here->VDMOSDPdpPtr) +=
|
*(here->VDMOSDPdpPtr) +=
|
||||||
(here->VDMOSdrainConductance + here->VDMOSgds +
|
(here->VDMOSdrainConductance + here->VDMOSgds +
|
||||||
|
|
@ -630,6 +627,9 @@ bypass :
|
||||||
*(here->VDMOSSPdpPtr) += (-here->VDMOSgds - xrev*
|
*(here->VDMOSSPdpPtr) += (-here->VDMOSgds - xrev*
|
||||||
(here->VDMOSgm + here->VDMOSgmbs));
|
(here->VDMOSgm + here->VDMOSgmbs));
|
||||||
|
|
||||||
|
*(here->VDMOSDsPtr) += (-here->VDMOSdsConductance);
|
||||||
|
*(here->VDMOSSdPtr) += (-here->VDMOSdsConductance);
|
||||||
|
|
||||||
|
|
||||||
/* bulk diode model
|
/* bulk diode model
|
||||||
* Delivers reverse conduction and forward breakdown
|
* Delivers reverse conduction and forward breakdown
|
||||||
|
|
|
||||||
|
|
@ -95,6 +95,9 @@ VDMOSmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
|
||||||
case VDMOS_MOD_NBV:
|
case VDMOS_MOD_NBV:
|
||||||
value->rValue = model->VDIObrkdEmissionCoeff;
|
value->rValue = model->VDIObrkdEmissionCoeff;
|
||||||
return(OK);
|
return(OK);
|
||||||
|
case VDMOS_MOD_RDS:
|
||||||
|
value->rValue = model->VDMOSrds;
|
||||||
|
return(OK);
|
||||||
case VDMOS_MOD_FC:
|
case VDMOS_MOD_FC:
|
||||||
value->rValue = model->VDIOdepletionCapCoeff;
|
value->rValue = model->VDIOdepletionCapCoeff;
|
||||||
return(OK);
|
return(OK);
|
||||||
|
|
|
||||||
|
|
@ -133,6 +133,10 @@ VDMOSmParam(int param, IFvalue *value, GENmodel *inModel)
|
||||||
model->VDIObrkdEmissionCoeff = value->rValue;
|
model->VDIObrkdEmissionCoeff = value->rValue;
|
||||||
model->VDIObrkdEmissionCoeffGiven = TRUE;
|
model->VDIObrkdEmissionCoeffGiven = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case VDMOS_MOD_RDS:
|
||||||
|
model->VDMOSrds = value->rValue;
|
||||||
|
model->VDMOSrdsGiven = TRUE;
|
||||||
|
break;
|
||||||
case VDMOS_MOD_N:
|
case VDMOS_MOD_N:
|
||||||
model->VDMOSDn = value->rValue;
|
model->VDMOSDn = value->rValue;
|
||||||
model->VDMOSDnGiven = TRUE;
|
model->VDMOSDnGiven = TRUE;
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,9 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
||||||
if (!model->VDIObrkdEmissionCoeffGiven) {
|
if (!model->VDIObrkdEmissionCoeffGiven) {
|
||||||
model->VDIObrkdEmissionCoeff = 1.;
|
model->VDIObrkdEmissionCoeff = 1.;
|
||||||
}
|
}
|
||||||
|
if (!model->VDMOSrdsGiven) {
|
||||||
|
model->VDMOSrds = 1.0e30;
|
||||||
|
}
|
||||||
if (!model->VDMOSDnGiven) {
|
if (!model->VDMOSDnGiven) {
|
||||||
model->VDMOSDn = 1.;
|
model->VDMOSDn = 1.;
|
||||||
}
|
}
|
||||||
|
|
@ -279,6 +282,9 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\
|
||||||
TSTALLOC(VDMOSGgpPtr, VDMOSgNode, VDMOSgNodePrime);
|
TSTALLOC(VDMOSGgpPtr, VDMOSgNode, VDMOSgNodePrime);
|
||||||
TSTALLOC(VDMOSGPgPtr, VDMOSgNodePrime, VDMOSgNode);
|
TSTALLOC(VDMOSGPgPtr, VDMOSgNodePrime, VDMOSgNode);
|
||||||
|
|
||||||
|
TSTALLOC(VDMOSDsPtr, VDMOSdNode, VDMOSsNode);
|
||||||
|
TSTALLOC(VDMOSSdPtr, VDMOSsNode, VDMOSdNode);
|
||||||
|
|
||||||
TSTALLOC(VDIORPdPtr, VDIOposPrimeNode, VDMOSdNode);
|
TSTALLOC(VDIORPdPtr, VDIOposPrimeNode, VDMOSdNode);
|
||||||
TSTALLOC(VDIODrpPtr, VDMOSdNode, VDIOposPrimeNode);
|
TSTALLOC(VDIODrpPtr, VDMOSdNode, VDIOposPrimeNode);
|
||||||
TSTALLOC(VDIOSrpPtr, VDMOSsNode, VDIOposPrimeNode);
|
TSTALLOC(VDIOSrpPtr, VDMOSsNode, VDIOposPrimeNode);
|
||||||
|
|
|
||||||
|
|
@ -160,6 +160,18 @@ VDMOStemp(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
} else {
|
} else {
|
||||||
here->VDMOSgateConductance = 0;
|
here->VDMOSgateConductance = 0;
|
||||||
}
|
}
|
||||||
|
if (model->VDMOSrdsGiven) {
|
||||||
|
if (model->VDMOSrds != 0) {
|
||||||
|
here->VDMOSdsConductance = here->VDMOSm /
|
||||||
|
model->VDMOSrds;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
here->VDMOSdsConductance = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
here->VDMOSdsConductance = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* bulk diode model */
|
/* bulk diode model */
|
||||||
double egfet1, arg1, fact1, pbfact1, pbo, gmaold;
|
double egfet1, arg1, fact1, pbfact1, pbo, gmaold;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue