VDMOS consider body diode thermal contribution for self-heatine effect
This commit is contained in:
parent
c86cd740d6
commit
d3da0d5ebf
|
|
@ -3,8 +3,8 @@
|
||||||
vdd 1 0 5.0
|
vdd 1 0 5.0
|
||||||
|
|
||||||
.subckt inv out in vdd vss
|
.subckt inv out in vdd vss
|
||||||
mp1 out in vdd p1 l=2u w=20u
|
mp1 out in vdd p1 m=2
|
||||||
mn1 out in vss n1 l=2u w=10u
|
mn1 out in vss n1
|
||||||
c1 out vss 0.2p
|
c1 out vss 0.2p
|
||||||
.ends
|
.ends
|
||||||
|
|
||||||
|
|
@ -18,10 +18,10 @@ xinv7 9 8 1 0 inv
|
||||||
xinv8 10 9 1 0 inv
|
xinv8 10 9 1 0 inv
|
||||||
xinv9 2 10 1 0 inv
|
xinv9 2 10 1 0 inv
|
||||||
|
|
||||||
.model N1 vdmos cgdmin=0.05p cgdmax=0.2p a=1.2 cgs=0.15p rg=10 kp=2e-5 rb=1e7 cjo=1n ksubthres=0.2
|
.model N1 vdmos cgdmin=0.05p cgdmax=0.2p a=1.2 cgs=0.15p rg=10 kp=1e-5 rb=1e7 cjo=1n ksubthres=0.2
|
||||||
.model P1 vdmos cgdmin=0.05p cgdmax=0.2p a=1.2 cgs=0.15p rg=10 kp=2e-5 rb=1e7 cjo=1n pchan ksubthres=0.2
|
.model P1 vdmos cgdmin=0.05p cgdmax=0.2p a=1.2 cgs=0.15p rg=10 kp=1e-5 rb=1e7 cjo=1n pchan ksubthres=0.2
|
||||||
|
|
||||||
.tran 0.1n 1u
|
.tran 0.1n 5u
|
||||||
|
|
||||||
.control
|
.control
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,6 @@ VDMOS: 2018 Holger Vogt, 2020 Dietmar Warning
|
||||||
|
|
||||||
IFparm VDMOSpTable[] = { /* parameters */
|
IFparm VDMOSpTable[] = { /* parameters */
|
||||||
IOPU("m", VDMOS_M, IF_REAL, "Multiplier"),
|
IOPU("m", VDMOS_M, IF_REAL, "Multiplier"),
|
||||||
IOPU("l", VDMOS_L, IF_REAL, "Length"),
|
|
||||||
IOPU("w", VDMOS_W, IF_REAL, "Width"),
|
|
||||||
IP("off", VDMOS_OFF, IF_FLAG, "Device initially off"),
|
IP("off", VDMOS_OFF, IF_FLAG, "Device initially off"),
|
||||||
IOPU("icvds", VDMOS_IC_VDS, IF_REAL, "Initial D-S voltage"),
|
IOPU("icvds", VDMOS_IC_VDS, IF_REAL, "Initial D-S voltage"),
|
||||||
IOPU("icvgs", VDMOS_IC_VGS, IF_REAL, "Initial G-S voltage"),
|
IOPU("icvgs", VDMOS_IC_VGS, IF_REAL, "Initial G-S voltage"),
|
||||||
|
|
|
||||||
|
|
@ -41,12 +41,6 @@ VDMOSask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value,
|
||||||
case VDMOS_M:
|
case VDMOS_M:
|
||||||
value->rValue = here->VDMOSm;
|
value->rValue = here->VDMOSm;
|
||||||
return(OK);
|
return(OK);
|
||||||
case VDMOS_L:
|
|
||||||
value->rValue = here->VDMOSl;
|
|
||||||
return(OK);
|
|
||||||
case VDMOS_W:
|
|
||||||
value->rValue = here->VDMOSw;
|
|
||||||
return(OK);
|
|
||||||
case VDMOS_OFF:
|
case VDMOS_OFF:
|
||||||
value->iValue = here->VDMOSoff;
|
value->iValue = here->VDMOSoff;
|
||||||
return(OK);
|
return(OK);
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ VDMOSconvTest(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
double vgd;
|
double vgd;
|
||||||
double vgdo;
|
double vgdo;
|
||||||
double tol;
|
double tol;
|
||||||
|
double delvd,vd,cd;
|
||||||
int selfheat;
|
int selfheat;
|
||||||
double delTemp, deldelTemp;
|
double delTemp, deldelTemp;
|
||||||
|
|
||||||
|
|
@ -77,6 +78,34 @@ VDMOSconvTest(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
ckt->CKTtroubleElt = (GENinstance *) here;
|
ckt->CKTtroubleElt = (GENinstance *) here;
|
||||||
return(OK); /* no reason to continue, we haven't converged */
|
return(OK); /* no reason to continue, we haven't converged */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* initialization
|
||||||
|
*/
|
||||||
|
|
||||||
|
vd = *(ckt->CKTrhsOld+here->VDIOposPrimeNode)-
|
||||||
|
*(ckt->CKTrhsOld + here->VDMOSdNode);
|
||||||
|
|
||||||
|
delvd=vd- *(ckt->CKTstate0 + here->VDIOvoltage);
|
||||||
|
|
||||||
|
cdhat= *(ckt->CKTstate0 + here->VDIOcurrent) +
|
||||||
|
*(ckt->CKTstate0 + here->VDIOconduct) * delvd +
|
||||||
|
*(ckt->CKTstate0 + here->VDIOdIdio_dT) * deldelTemp;
|
||||||
|
|
||||||
|
cd= *(ckt->CKTstate0 + here->VDIOcurrent);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* check convergence
|
||||||
|
*/
|
||||||
|
tol=ckt->CKTreltol*
|
||||||
|
MAX(fabs(cdhat),fabs(cd))+ckt->CKTabstol;
|
||||||
|
if (fabs(cdhat-cd) > tol) {
|
||||||
|
ckt->CKTnoncon++;
|
||||||
|
ckt->CKTtroubleElt = (GENinstance *) here;
|
||||||
|
return(OK); /* don't need to check any more device */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(OK);
|
return(OK);
|
||||||
|
|
|
||||||
|
|
@ -54,8 +54,6 @@ typedef struct sVDMOSinstance {
|
||||||
|
|
||||||
double VDMOSm; /* parallel device multiplier */
|
double VDMOSm; /* parallel device multiplier */
|
||||||
|
|
||||||
double VDMOSl; /* the length of the channel region */
|
|
||||||
double VDMOSw; /* the width of the channel region */
|
|
||||||
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 VDMOSdrainResistance; /*resistance of drain(or 0): set in temp*/
|
double VDMOSdrainResistance; /*resistance of drain(or 0): set in temp*/
|
||||||
|
|
@ -107,6 +105,7 @@ typedef struct sVDMOSinstance {
|
||||||
double VDMOScdT;
|
double VDMOScdT;
|
||||||
double VDMOScth; /* current alias power */
|
double VDMOScth; /* current alias power */
|
||||||
|
|
||||||
|
// double VDIOdIth_dVdio;
|
||||||
/*
|
/*
|
||||||
* naming convention:
|
* naming convention:
|
||||||
* x = vgs
|
* x = vgs
|
||||||
|
|
@ -151,8 +150,6 @@ typedef struct sVDMOSinstance {
|
||||||
unsigned VDMOStempGiven :1; /* instance temperature specified */
|
unsigned VDMOStempGiven :1; /* instance temperature specified */
|
||||||
unsigned VDMOSdtempGiven :1; /* instance delta temperature specified */
|
unsigned VDMOSdtempGiven :1; /* instance delta temperature specified */
|
||||||
unsigned VDMOSmGiven :1;
|
unsigned VDMOSmGiven :1;
|
||||||
unsigned VDMOSlGiven :1;
|
|
||||||
unsigned VDMOSwGiven :1;
|
|
||||||
unsigned VDMOSdNodePrimeSet :1;
|
unsigned VDMOSdNodePrimeSet :1;
|
||||||
unsigned VDMOSsNodePrimeSet :1;
|
unsigned VDMOSsNodePrimeSet :1;
|
||||||
unsigned VDMOSicVDSGiven :1;
|
unsigned VDMOSicVDSGiven :1;
|
||||||
|
|
@ -163,68 +160,68 @@ typedef struct sVDMOSinstance {
|
||||||
unsigned VDMOSmodeGiven :1;
|
unsigned VDMOSmodeGiven :1;
|
||||||
|
|
||||||
double *VDMOSDdPtr; /* pointer to sparse matrix element at
|
double *VDMOSDdPtr; /* pointer to sparse matrix element at
|
||||||
* (Drain node,drain node) */
|
(Drain node,drain node) */
|
||||||
double *VDMOSGgPtr; /* pointer to sparse matrix element at
|
double *VDMOSGgPtr; /* pointer to sparse matrix element at
|
||||||
* (gate node,gate node) */
|
(gate node,gate node) */
|
||||||
double *VDMOSSsPtr; /* pointer to sparse matrix element at
|
double *VDMOSSsPtr; /* pointer to sparse matrix element at
|
||||||
* (source node,source node) */
|
(source node,source node) */
|
||||||
double *VDMOSDPdpPtr; /* pointer to sparse matrix element at
|
double *VDMOSDPdpPtr; /* pointer to sparse matrix element at
|
||||||
* (drain prime node,drain prime node) */
|
(drain prime node,drain prime node) */
|
||||||
double *VDMOSSPspPtr; /* pointer to sparse matrix element at
|
double *VDMOSSPspPtr; /* pointer to sparse matrix element at
|
||||||
* (source prime node,source prime node) */
|
(source prime node,source prime node) */
|
||||||
double *VDMOSDdpPtr; /* pointer to sparse matrix element at
|
double *VDMOSDdpPtr; /* pointer to sparse matrix element at
|
||||||
* (drain node,drain prime node) */
|
(drain node,drain prime node) */
|
||||||
double *VDMOSGdpPtr; /* pointer to sparse matrix element at
|
double *VDMOSGdpPtr; /* pointer to sparse matrix element at
|
||||||
* (gate node,drain prime node) */
|
(gate node,drain prime node) */
|
||||||
double *VDMOSGspPtr; /* pointer to sparse matrix element at
|
double *VDMOSGspPtr; /* pointer to sparse matrix element at
|
||||||
* (gate node,source prime node) */
|
(gate node,source prime node) */
|
||||||
double *VDMOSSspPtr; /* pointer to sparse matrix element at
|
double *VDMOSSspPtr; /* pointer to sparse matrix element at
|
||||||
* (source node,source prime node) */
|
(source node,source prime node) */
|
||||||
double *VDMOSDPspPtr; /* pointer to sparse matrix element at
|
double *VDMOSDPspPtr; /* pointer to sparse matrix element at
|
||||||
* (drain prime node,source prime node) */
|
(drain prime node,source prime node) */
|
||||||
double *VDMOSDPdPtr; /* pointer to sparse matrix element at
|
double *VDMOSDPdPtr; /* pointer to sparse matrix element at
|
||||||
* (drain prime node,drain node) */
|
(drain prime node,drain node) */
|
||||||
double *VDMOSDPgPtr; /* pointer to sparse matrix element at
|
double *VDMOSDPgPtr; /* pointer to sparse matrix element at
|
||||||
* (drain prime node,gate node) */
|
(drain prime node,gate node) */
|
||||||
|
|
||||||
double *VDMOSSPgPtr; /* pointer to sparse matrix element at
|
double *VDMOSSPgPtr; /* pointer to sparse matrix element at
|
||||||
* (source prime node,gate node) */
|
(source prime node,gate node) */
|
||||||
double *VDMOSSPsPtr; /* pointer to sparse matrix element at
|
double *VDMOSSPsPtr; /* pointer to sparse matrix element at
|
||||||
* (source prime node,source node) */
|
(source prime node,source node) */
|
||||||
double *VDMOSSPdpPtr; /* pointer to sparse matrix element at
|
double *VDMOSSPdpPtr; /* pointer to sparse matrix element at
|
||||||
* (source prime node,drain prime node) */
|
(source prime node,drain prime node) */
|
||||||
/* added for VDMOS */
|
/* added for VDMOS */
|
||||||
double *VDMOSGPgpPtr; /* pointer to sparse matrix element at
|
double *VDMOSGPgpPtr; /* pointer to sparse matrix element at
|
||||||
* (gate prime node, gate prime node) */
|
(gate prime node, gate prime node) */
|
||||||
double *VDMOSGPdpPtr; /* pointer to sparse matrix element at
|
double *VDMOSGPdpPtr; /* pointer to sparse matrix element at
|
||||||
* (gate prime node, drain prime node) */
|
(gate prime node, drain prime node) */
|
||||||
double *VDMOSGPspPtr; /* pointer to sparse matrix element at
|
double *VDMOSGPspPtr; /* pointer to sparse matrix element at
|
||||||
* (gate prime node, source prime node) */
|
(gate prime node, source prime node) */
|
||||||
double *VDMOSDPgpPtr; /* pointer to sparse matrix element at
|
double *VDMOSDPgpPtr; /* pointer to sparse matrix element at
|
||||||
* (drain prime node, gate prime node) */
|
(drain prime node, gate prime node) */
|
||||||
double *VDMOSSPgpPtr; /* pointer to sparse matrix element at
|
double *VDMOSSPgpPtr; /* pointer to sparse matrix element at
|
||||||
* (source prime node, gate prime node) */
|
(source prime node, gate prime node) */
|
||||||
double *VDMOSGgpPtr; /* pointer to sparse matrix element at
|
double *VDMOSGgpPtr; /* pointer to sparse matrix element at
|
||||||
* (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
|
double *VDMOSDsPtr; /* pointer to sparse matrix element at
|
||||||
* (source node, drain node) */
|
(source node, drain node) */
|
||||||
double *VDMOSSdPtr; /* pointer to sparse matrix element at
|
double *VDMOSSdPtr; /* pointer to sparse matrix element at
|
||||||
* (drain node, source node) */
|
(drain node, source node) */
|
||||||
/* body diode */
|
/* body 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) */
|
||||||
double *VDIODrpPtr; /* pointer to sparse matrix element at
|
double *VDIODrpPtr; /* pointer to sparse matrix element at
|
||||||
* (drain node, diode prime node) */
|
(drain node, diode prime node) */
|
||||||
double *VDIORPrpPtr; /* pointer to sparse matrix element at
|
double *VDIORPrpPtr; /* pointer to sparse matrix element at
|
||||||
* (diode prime node, diode prime node) */
|
(diode prime node, diode prime node) */
|
||||||
double *VDIOSrpPtr; /* pointer to sparse matrix element at
|
double *VDIOSrpPtr; /* pointer to sparse matrix element at
|
||||||
* (source node, diode prime node) */
|
(source node, diode prime node) */
|
||||||
double *VDIORPsPtr; /* pointer to sparse matrix element at
|
double *VDIORPsPtr; /* pointer to sparse matrix element at
|
||||||
* (diode prime node, source node) */
|
(diode prime node, source node) */
|
||||||
/* self heating */
|
/* self heating */
|
||||||
double *VDMOSTemptempPtr;
|
double *VDMOSTemptempPtr; /* Transistor thermal contribution */
|
||||||
double *VDMOSTempdpPtr;
|
double *VDMOSTempdpPtr;
|
||||||
double *VDMOSTempspPtr;
|
double *VDMOSTempspPtr;
|
||||||
double *VDMOSTempgpPtr;
|
double *VDMOSTempgpPtr;
|
||||||
|
|
@ -232,14 +229,17 @@ typedef struct sVDMOSinstance {
|
||||||
double *VDMOSDPtempPtr;
|
double *VDMOSDPtempPtr;
|
||||||
double *VDMOSSPtempPtr;
|
double *VDMOSSPtempPtr;
|
||||||
|
|
||||||
|
double *VDIOTempposPrimePtr; /* Diode thermal contribution */
|
||||||
|
double *VDIOTempnegPtr;
|
||||||
|
double *VDIOPosPrimetempPtr;
|
||||||
|
double *VDIONegtempPtr;
|
||||||
|
|
||||||
double *VDMOSTcasetcasePtr; /* for Rthjc */
|
double *VDMOSTcasetcasePtr; /* for Rthjc */
|
||||||
double *VDMOSTcasetempPtr;
|
double *VDMOSTcasetempPtr;
|
||||||
double *VDMOSTemptcasePtr;
|
double *VDMOSTemptcasePtr;
|
||||||
|
|
||||||
double *VDMOSTptpPtr; /* for Rthca */
|
double *VDMOSTptpPtr; /* for Rthca */
|
||||||
double *VDMOSTptcasePtr;
|
double *VDMOSTptcasePtr;
|
||||||
double *VDMOSTcasetpPtr;
|
double *VDMOSTcasetpPtr;
|
||||||
|
|
||||||
double *VDMOSCktTcktTPtr; /* for VcktTemp */
|
double *VDMOSCktTcktTPtr; /* for VcktTemp */
|
||||||
double *VDMOSCktTtpPtr;
|
double *VDMOSCktTtpPtr;
|
||||||
double *VDMOSTpcktTPtr;
|
double *VDMOSTpcktTPtr;
|
||||||
|
|
@ -248,7 +248,7 @@ typedef struct sVDMOSinstance {
|
||||||
|
|
||||||
#define VDMOSvgs VDMOSstates+ 0 /* gate-source voltage */
|
#define VDMOSvgs VDMOSstates+ 0 /* gate-source voltage */
|
||||||
#define VDMOSvds VDMOSstates+ 1 /* drain-source voltage */
|
#define VDMOSvds VDMOSstates+ 1 /* drain-source voltage */
|
||||||
#define VDMOSdelTemp VDMOSstates+ 2
|
#define VDMOSdelTemp VDMOSstates+ 2 /* thermal voltage over rth0 */
|
||||||
|
|
||||||
#define VDMOScapgs VDMOSstates+3 /* gate-source capacitor value */
|
#define VDMOScapgs VDMOSstates+3 /* gate-source capacitor value */
|
||||||
#define VDMOSqgs VDMOSstates+ 4 /* gate-source capacitor charge */
|
#define VDMOSqgs VDMOSstates+ 4 /* gate-source capacitor charge */
|
||||||
|
|
@ -261,14 +261,17 @@ typedef struct sVDMOSinstance {
|
||||||
#define VDIOvoltage VDMOSstates+ 9
|
#define VDIOvoltage VDMOSstates+ 9
|
||||||
#define VDIOcurrent VDMOSstates+ 10
|
#define VDIOcurrent VDMOSstates+ 10
|
||||||
#define VDIOconduct VDMOSstates+ 11
|
#define VDIOconduct VDMOSstates+ 11
|
||||||
|
|
||||||
#define VDIOcapCharge VDMOSstates+ 12
|
#define VDIOcapCharge VDMOSstates+ 12
|
||||||
#define VDIOcapCurrent VDMOSstates+ 13
|
#define VDIOcapCurrent VDMOSstates+ 13
|
||||||
|
|
||||||
#define VDMOScapth VDMOSstates+ 14 /* thermal capacitor value */
|
#define VDMOScapth VDMOSstates+ 14 /* thermal capacitor value */
|
||||||
#define VDMOSqth VDMOSstates+ 15 /* thermal capacitor charge */
|
#define VDMOSqth VDMOSstates+ 15 /* thermal capacitor charge */
|
||||||
#define VDMOScqth VDMOSstates+ 16 /* thermal capacitor current */
|
#define VDMOScqth VDMOSstates+ 16 /* thermal capacitor current */
|
||||||
|
|
||||||
#define VDMOSnumStates 17
|
#define VDIOdIdio_dT VDMOSstates+ 17
|
||||||
|
|
||||||
|
#define VDMOSnumStates 18
|
||||||
|
|
||||||
|
|
||||||
/* per model data */
|
/* per model data */
|
||||||
|
|
@ -428,9 +431,7 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */
|
||||||
|
|
||||||
/* device parameters */
|
/* device parameters */
|
||||||
enum {
|
enum {
|
||||||
VDMOS_W = 1,
|
VDMOS_OFF = 1,
|
||||||
VDMOS_L,
|
|
||||||
VDMOS_OFF,
|
|
||||||
VDMOS_IC,
|
VDMOS_IC,
|
||||||
VDMOS_IC_VDS,
|
VDMOS_IC_VDS,
|
||||||
VDMOS_IC_VGS,
|
VDMOS_IC_VGS,
|
||||||
|
|
|
||||||
|
|
@ -53,8 +53,7 @@ VDMOSdSetup(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
|
|
||||||
Beta = here->VDMOStTransconductance;
|
Beta = here->VDMOStTransconductance;
|
||||||
|
|
||||||
OxideCap = model->VDMOSoxideCapFactor * here->VDMOSl *
|
OxideCap = model->VDMOSoxideCapFactor * here->VDMOSm;
|
||||||
here->VDMOSm * here->VDMOSw;
|
|
||||||
|
|
||||||
vgs = model->VDMOStype * (
|
vgs = model->VDMOStype * (
|
||||||
*(ckt->CKTrhsOld+here->VDMOSgNode) -
|
*(ckt->CKTrhsOld+here->VDMOSgNode) -
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
|
|
||||||
register int selfheat;
|
register int selfheat;
|
||||||
double rd0T, rd1T, dBeta_dT, dIds_dT;
|
double rd0T, rd1T, dBeta_dT, dIds_dT;
|
||||||
double deldelTemp, delTemp, delTemp1, Temp, Vds, Vgs;
|
double deldelTemp=0.0, delTemp, delTemp1, Temp, Vds, Vgs;
|
||||||
double ceqqth=0.0;
|
double ceqqth=0.0;
|
||||||
double GmT, gTtg, gTtdp, gTtt, gTtsp, gcTt=0.0;
|
double GmT, gTtg, gTtdp, gTtt, gTtsp, gcTt=0.0;
|
||||||
|
|
||||||
|
|
@ -172,7 +172,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
*(ckt->CKTstate0 + here->VDMOSdelTemp) =
|
*(ckt->CKTstate0 + here->VDMOSdelTemp) =
|
||||||
*(ckt->CKTstate1 + here->VDMOSdelTemp);
|
*(ckt->CKTstate1 + here->VDMOSdelTemp);
|
||||||
delTemp = (1 + xfact)* (*(ckt->CKTstate1 + here->VDMOSdelTemp))
|
delTemp = (1 + xfact)* (*(ckt->CKTstate1 + here->VDMOSdelTemp))
|
||||||
- (xfact * (*(ckt->CKTstate2 + here->VDMOSdelTemp)));
|
- (xfact * (*(ckt->CKTstate2 + here->VDMOSdelTemp)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -557,10 +557,10 @@ bypass:
|
||||||
*(ckt->CKTstate0 + here->VDMOSqgd);
|
*(ckt->CKTstate0 + here->VDMOSqgd);
|
||||||
if (selfheat)
|
if (selfheat)
|
||||||
{
|
{
|
||||||
error = NIintegrate(ckt, &gcTt, &ceqqth, 0.0, here->VDMOSqth);
|
error = NIintegrate(ckt, &gcTt, &ceqqth, capth, here->VDMOSqth);
|
||||||
if (error) return(error);
|
if (error) return(error);
|
||||||
gcTt = model->VDMOScthj * ckt->CKTag[0];
|
ceqqth = ceqqth - gcTt*delTemp + ckt->CKTag[0] *
|
||||||
ceqqth = *(ckt->CKTstate0 + here->VDMOScqth) - gcTt * delTemp;
|
*(ckt->CKTstate0 + here->VDMOSqth);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -608,8 +608,11 @@ bypass:
|
||||||
if (selfheat) {
|
if (selfheat) {
|
||||||
*(ckt->CKTrhs + here->VDMOSdNodePrime) += GmT * delTemp;
|
*(ckt->CKTrhs + here->VDMOSdNodePrime) += GmT * delTemp;
|
||||||
*(ckt->CKTrhs + here->VDMOSsNodePrime) += -GmT * delTemp;
|
*(ckt->CKTrhs + here->VDMOSsNodePrime) += -GmT * delTemp;
|
||||||
*(ckt->CKTrhs + here->VDMOStempNode) -= here->VDMOScth + ceqqth; /* MOS dissipated power + Cthj current */
|
*(ckt->CKTrhs + here->VDMOStempNode) -= here->VDMOScth + ceqqth; /* MOS dissipated power + Cthj current */
|
||||||
*(ckt->CKTrhs + here->VDMOSvcktTbranch) = ckt->CKTtemp-CONSTCtoK; /* ckt temperature */
|
double vCktTemp = (ckt->CKTtemp-CONSTCtoK); /* ckt temperature */
|
||||||
|
if (ckt->CKTmode & MODETRANOP)
|
||||||
|
vCktTemp *= ckt->CKTsrcFact;
|
||||||
|
*(ckt->CKTrhs + here->VDMOSvcktTbranch)+= vCktTemp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -646,7 +649,7 @@ bypass:
|
||||||
|
|
||||||
if (selfheat)
|
if (selfheat)
|
||||||
{
|
{
|
||||||
(*(here->VDMOSDPtempPtr) += GmT);
|
(*(here->VDMOSDPtempPtr) += GmT);
|
||||||
(*(here->VDMOSSPtempPtr) += -GmT);
|
(*(here->VDMOSSPtempPtr) += -GmT);
|
||||||
(*(here->VDMOSGPtempPtr) += 0.0);
|
(*(here->VDMOSGPtempPtr) += 0.0);
|
||||||
(*(here->VDMOSTemptempPtr) += gTtt + 1/model->VDMOSrthjc + gcTt);
|
(*(here->VDMOSTemptempPtr) += gTtt + 1/model->VDMOSrthjc + gcTt);
|
||||||
|
|
@ -667,15 +670,17 @@ bypass:
|
||||||
* Delivers reverse conduction and forward breakdown
|
* Delivers reverse conduction and forward breakdown
|
||||||
* of VDMOS transistor
|
* of VDMOS transistor
|
||||||
*/
|
*/
|
||||||
|
double vd, cd;
|
||||||
double vd; /* current diode voltage */
|
|
||||||
double vte;
|
double vte;
|
||||||
double vtebrk, vbrknp;
|
double vtebrk, vbrknp;
|
||||||
double cd, cdb, csat, cdeq;
|
double cdb, csat, cdeq;
|
||||||
double capd;
|
double capd;
|
||||||
double gd, gdb, gspr;
|
double gd, gdb, gspr;
|
||||||
double delvd; /* change in diode voltage temporary */
|
double delvd; /* change in diode voltage temporary */
|
||||||
double evrev;
|
double evrev;
|
||||||
|
double Ith=0.0, dIth_dT=0.0;
|
||||||
|
double dIdio_dT=0.0, dIth_dVdio=0.0;
|
||||||
|
double arg1, darg1_dT, arg2, darg2_dT, csat_dT;
|
||||||
#ifndef NOBYPASS
|
#ifndef NOBYPASS
|
||||||
double tol; /* temporary for tolerance calculations */
|
double tol; /* temporary for tolerance calculations */
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -684,8 +689,8 @@ bypass:
|
||||||
cdb = 0.0;
|
cdb = 0.0;
|
||||||
gd = 0.0;
|
gd = 0.0;
|
||||||
gdb = 0.0;
|
gdb = 0.0;
|
||||||
csat = here->VDIOtSatCur;
|
|
||||||
gspr = here->VDIOtConductance;
|
gspr = here->VDIOtConductance;
|
||||||
|
|
||||||
vt = CONSTKoverQ * Temp;
|
vt = CONSTKoverQ * Temp;
|
||||||
vte = model->VDMOSn * vt;
|
vte = model->VDMOSn * vt;
|
||||||
vtebrk = model->VDIObrkdEmissionCoeff * vt;
|
vtebrk = model->VDIObrkdEmissionCoeff * vt;
|
||||||
|
|
@ -711,6 +716,8 @@ bypass:
|
||||||
*(ckt->CKTstate1 + here->VDIOcurrent);
|
*(ckt->CKTstate1 + here->VDIOcurrent);
|
||||||
*(ckt->CKTstate0 + here->VDIOconduct) =
|
*(ckt->CKTstate0 + here->VDIOconduct) =
|
||||||
*(ckt->CKTstate1 + here->VDIOconduct);
|
*(ckt->CKTstate1 + here->VDIOconduct);
|
||||||
|
*(ckt->CKTstate0 + here->VDIOdIdio_dT) =
|
||||||
|
*(ckt->CKTstate1 + here->VDIOdIdio_dT);
|
||||||
} else {
|
} else {
|
||||||
#endif /* PREDICTOR */
|
#endif /* PREDICTOR */
|
||||||
vd = model->VDMOStype * (*(ckt->CKTrhsOld + here->VDIOposPrimeNode) -
|
vd = model->VDMOStype * (*(ckt->CKTrhsOld + here->VDIOposPrimeNode) -
|
||||||
|
|
@ -720,7 +727,8 @@ bypass:
|
||||||
#endif /* PREDICTOR */
|
#endif /* PREDICTOR */
|
||||||
delvd = vd - *(ckt->CKTstate0 + here->VDIOvoltage);
|
delvd = vd - *(ckt->CKTstate0 + here->VDIOvoltage);
|
||||||
cdhat = *(ckt->CKTstate0 + here->VDIOcurrent) +
|
cdhat = *(ckt->CKTstate0 + here->VDIOcurrent) +
|
||||||
*(ckt->CKTstate0 + here->VDIOconduct) * delvd;
|
*(ckt->CKTstate0 + here->VDIOconduct) * delvd +
|
||||||
|
*(ckt->CKTstate0 + here->VDIOdIdio_dT) * deldelTemp;
|
||||||
/*
|
/*
|
||||||
* bypass if solution has not changed
|
* bypass if solution has not changed
|
||||||
*/
|
*/
|
||||||
|
|
@ -734,10 +742,16 @@ bypass:
|
||||||
ckt->CKTabstol;
|
ckt->CKTabstol;
|
||||||
if (fabs(cdhat - *(ckt->CKTstate0 + here->VDIOcurrent))
|
if (fabs(cdhat - *(ckt->CKTstate0 + here->VDIOcurrent))
|
||||||
< tol) {
|
< tol) {
|
||||||
vd = *(ckt->CKTstate0 + here->VDIOvoltage);
|
if ((here->VDMOStempNode == 0) ||
|
||||||
cd = *(ckt->CKTstate0 + here->VDIOcurrent);
|
(fabs(deldelTemp) < (ckt->CKTreltol * MAX(fabs(delTemp),
|
||||||
gd = *(ckt->CKTstate0 + here->VDIOconduct);
|
fabs(*(ckt->CKTstate0+here->VDMOSdelTemp)))+
|
||||||
goto load;
|
ckt->CKTvoltTol*1e4))) {
|
||||||
|
vd = *(ckt->CKTstate0 + here->VDIOvoltage);
|
||||||
|
cd = *(ckt->CKTstate0 + here->VDIOcurrent);
|
||||||
|
gd = *(ckt->CKTstate0 + here->VDIOconduct);
|
||||||
|
dIdio_dT= *(ckt->CKTstate0 + here->VDIOdIdio_dT);
|
||||||
|
goto load;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -759,38 +773,53 @@ bypass:
|
||||||
vte, here->VDIOtVcrit, &Check_dio);
|
vte, here->VDIOtVcrit, &Check_dio);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* temperature dependent diode saturation current and derivative
|
||||||
|
*/
|
||||||
|
arg1 = ((Temp / model->VDMOStnom) - 1) * model->VDMOSeg / (model->VDMOSn*vt);
|
||||||
|
darg1_dT = model->VDMOSeg / (vte*model->VDMOStnom)
|
||||||
|
- model->VDMOSeg*(Temp/model->VDMOStnom -1)/(vte*Temp);
|
||||||
|
|
||||||
|
arg2 = model->VDMOSxti / model->VDMOSn * log(Temp / model->VDMOStnom);
|
||||||
|
darg2_dT = model->VDMOSxti / model->VDMOSn / Temp;
|
||||||
|
|
||||||
|
csat = here->VDMOSm * model->VDIOjctSatCur * exp(arg1 + arg2);
|
||||||
|
csat_dT = here->VDMOSm * model->VDIOjctSatCur * exp(arg1 + arg2) * (darg1_dT + darg2_dT);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* compute dc current and derivatives
|
* compute dc current and derivatives
|
||||||
*/
|
*/
|
||||||
if (vd >= -3 * vte) { /* bottom current forward */
|
if (vd >= -3 * vte) { /* forward current */
|
||||||
double evd;
|
double evd;
|
||||||
|
|
||||||
evd = exp(vd / vte);
|
evd = exp(vd / vte);
|
||||||
cdb = csat*(evd - 1);
|
cdb = csat*(evd - 1);
|
||||||
|
dIdio_dT = csat_dT * (evd - 1) - csat * vd * evd / (vte * Temp);
|
||||||
gdb = csat*evd / vte;
|
gdb = csat*evd / vte;
|
||||||
|
|
||||||
} else if ((!(model->VDMOSbvGiven)) ||
|
} else if ((!(model->VDMOSbvGiven)) ||
|
||||||
vd >= -vbrknp) { /* reverse */
|
vd >= -vbrknp) { /* reverse */
|
||||||
|
double arg3, darg3_dT;
|
||||||
|
|
||||||
arg = 3 * vte / (vd*CONSTe);
|
arg = 3 * vte / (vd*CONSTe);
|
||||||
arg = arg * arg * arg;
|
arg3 = arg * arg * arg;
|
||||||
cdb = -csat*(1 + arg);
|
darg3_dT = 3 * arg3 / Temp;
|
||||||
|
cdb = -csat*(1 + arg3);
|
||||||
|
dIdio_dT = -csat_dT * (arg3 + 1) - csat * darg3_dT;
|
||||||
gdb = csat * 3 * arg / vd;
|
gdb = csat * 3 * arg / vd;
|
||||||
|
|
||||||
} else { /* breakdown */
|
} else { /* breakdown */
|
||||||
|
|
||||||
evrev = exp(-(vbrknp + vd) / vtebrk);
|
evrev = exp(-(vbrknp + vd) / vtebrk);
|
||||||
cdb = -csat*evrev;
|
cdb = -csat*evrev;
|
||||||
|
dIdio_dT = csat * (-vbrknp-vd) * evrev / vtebrk / Temp - csat_dT * evrev;
|
||||||
gdb = csat*evrev / vtebrk;
|
gdb = csat*evrev / vtebrk;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cd = cdb + ckt->CKTgmin*vd;
|
||||||
cd = cdb;
|
gd = gdb + ckt->CKTgmin;
|
||||||
gd = gdb;
|
|
||||||
|
|
||||||
gd = gd + ckt->CKTgmin;
|
|
||||||
cd = cd + ckt->CKTgmin*vd;
|
|
||||||
|
|
||||||
if ((ckt->CKTmode & (MODEDCTRANCURVE | MODETRAN | MODEAC | MODEINITSMSIG)) ||
|
if ((ckt->CKTmode & (MODEDCTRANCURVE | MODETRAN | MODEAC | MODEINITSMSIG)) ||
|
||||||
((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) {
|
((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) {
|
||||||
|
|
@ -812,7 +841,7 @@ bypass:
|
||||||
}
|
}
|
||||||
diffcharge = here->VDIOtTransitTime*cdb;
|
diffcharge = here->VDIOtTransitTime*cdb;
|
||||||
*(ckt->CKTstate0 + here->VDIOcapCharge) =
|
*(ckt->CKTstate0 + here->VDIOcapCharge) =
|
||||||
diffcharge + deplcharge;
|
diffcharge + deplcharge;
|
||||||
|
|
||||||
diffcap = here->VDIOtTransitTime*gdb;
|
diffcap = here->VDIOtTransitTime*gdb;
|
||||||
capd = diffcap + deplcap;
|
capd = diffcap + deplcap;
|
||||||
|
|
@ -855,16 +884,22 @@ bypass:
|
||||||
|
|
||||||
if ((Check_th == 1) || (Check_dio == 1)) {
|
if ((Check_th == 1) || (Check_dio == 1)) {
|
||||||
ckt->CKTnoncon++;
|
ckt->CKTnoncon++;
|
||||||
ckt->CKTtroubleElt = (GENinstance *)here;
|
ckt->CKTtroubleElt = (GENinstance *) here;
|
||||||
}
|
}
|
||||||
|
|
||||||
*(ckt->CKTstate0 + here->VDIOvoltage) = vd;
|
*(ckt->CKTstate0 + here->VDIOvoltage) = vd;
|
||||||
*(ckt->CKTstate0 + here->VDIOcurrent) = cd;
|
*(ckt->CKTstate0 + here->VDIOcurrent) = cd;
|
||||||
*(ckt->CKTstate0 + here->VDIOconduct) = gd;
|
*(ckt->CKTstate0 + here->VDIOconduct) = gd;
|
||||||
|
*(ckt->CKTstate0 + here->VDIOdIdio_dT) = dIdio_dT;
|
||||||
|
|
||||||
#ifndef NOBYPASS
|
#ifndef NOBYPASS
|
||||||
load:
|
load:
|
||||||
#endif
|
#endif
|
||||||
|
if (selfheat) {
|
||||||
|
Ith = vd*cd;
|
||||||
|
dIth_dVdio = cd + vd*gd;
|
||||||
|
dIth_dT = dIdio_dT*vd;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* load current vector
|
* load current vector
|
||||||
*/
|
*/
|
||||||
|
|
@ -876,7 +911,11 @@ load:
|
||||||
*(ckt->CKTrhs + here->VDMOSdNode) -= cdeq;
|
*(ckt->CKTrhs + here->VDMOSdNode) -= cdeq;
|
||||||
*(ckt->CKTrhs + here->VDIOposPrimeNode) += cdeq;
|
*(ckt->CKTrhs + here->VDIOposPrimeNode) += cdeq;
|
||||||
}
|
}
|
||||||
|
if (selfheat) {
|
||||||
|
*(ckt->CKTrhs + here->VDMOSdNode) += dIdio_dT*delTemp;
|
||||||
|
*(ckt->CKTrhs + here->VDIOposPrimeNode) -= dIdio_dT*delTemp;
|
||||||
|
*(ckt->CKTrhs + here->VDMOStempNode) += Ith - dIth_dVdio*vd - dIth_dT*delTemp; /* Diode dissipated power */
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* load matrix
|
* load matrix
|
||||||
*/
|
*/
|
||||||
|
|
@ -887,6 +926,13 @@ load:
|
||||||
*(here->VDIODrpPtr) -= gd;
|
*(here->VDIODrpPtr) -= gd;
|
||||||
*(here->VDIORPsPtr) -= gspr;
|
*(here->VDIORPsPtr) -= gspr;
|
||||||
*(here->VDIORPdPtr) -= gd;
|
*(here->VDIORPdPtr) -= gd;
|
||||||
|
if (selfheat) {
|
||||||
|
(*(here->VDMOSTemptempPtr) += dIth_dT);
|
||||||
|
(*(here->VDIOTempposPrimePtr) += -dIth_dVdio);
|
||||||
|
(*(here->VDIOTempnegPtr) += dIth_dVdio);
|
||||||
|
(*(here->VDIOPosPrimetempPtr) += -dIdio_dT);
|
||||||
|
(*(here->VDIONegtempPtr) += dIdio_dT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(OK);
|
return(OK);
|
||||||
|
|
|
||||||
|
|
@ -113,9 +113,8 @@ VDMOSnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt,
|
||||||
noizDens[VDMOSFLNOIZ] *= model->VDMOSfNcoef *
|
noizDens[VDMOSFLNOIZ] *= model->VDMOSfNcoef *
|
||||||
exp(model->VDMOSfNexp *
|
exp(model->VDMOSfNexp *
|
||||||
log(MAX(fabs(inst->VDMOScd),N_MINLOG))) /
|
log(MAX(fabs(inst->VDMOScd),N_MINLOG))) /
|
||||||
(data->freq * inst->VDMOSw *
|
(data->freq *
|
||||||
inst->VDMOSm *
|
inst->VDMOSm * coxSquared);
|
||||||
inst->VDMOSl * coxSquared);
|
|
||||||
lnNdens[VDMOSFLNOIZ] =
|
lnNdens[VDMOSFLNOIZ] =
|
||||||
log(MAX(noizDens[VDMOSFLNOIZ],N_MINLOG));
|
log(MAX(noizDens[VDMOSFLNOIZ],N_MINLOG));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,14 +42,6 @@ VDMOSparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
|
||||||
here->VDMOSm = value->rValue;
|
here->VDMOSm = value->rValue;
|
||||||
here->VDMOSmGiven = TRUE;
|
here->VDMOSmGiven = TRUE;
|
||||||
break;
|
break;
|
||||||
case VDMOS_W:
|
|
||||||
here->VDMOSw = value->rValue * scale;
|
|
||||||
here->VDMOSwGiven = TRUE;
|
|
||||||
break;
|
|
||||||
case VDMOS_L:
|
|
||||||
here->VDMOSl = value->rValue * scale;
|
|
||||||
here->VDMOSlGiven = TRUE;
|
|
||||||
break;
|
|
||||||
case VDMOS_OFF:
|
case VDMOS_OFF:
|
||||||
here->VDMOSoff = (value->iValue != 0);
|
here->VDMOSoff = (value->iValue != 0);
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -212,12 +212,6 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
||||||
if(!here->VDMOSmGiven) {
|
if(!here->VDMOSmGiven) {
|
||||||
here->VDMOSm = 1;
|
here->VDMOSm = 1;
|
||||||
}
|
}
|
||||||
if(!here->VDMOSlGiven) {
|
|
||||||
here->VDMOSl = 1;
|
|
||||||
}
|
|
||||||
if(!here->VDMOSwGiven) {
|
|
||||||
here->VDMOSw = 1;
|
|
||||||
}
|
|
||||||
if (model->VDMOSdrainResistance != 0) {
|
if (model->VDMOSdrainResistance != 0) {
|
||||||
here->VDMOSdrainConductance = here->VDMOSm / model->VDMOSdrainResistance;
|
here->VDMOSdrainConductance = here->VDMOSm / model->VDMOSdrainResistance;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -242,7 +236,7 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
||||||
} else {
|
} else {
|
||||||
here->VDMOSdsConductance = 1e-15;
|
here->VDMOSdsConductance = 1e-15;
|
||||||
}
|
}
|
||||||
if (model->VDIOresistance > 10e-03) {
|
if (model->VDIOresistance > 10e-3) {
|
||||||
here->VDIOconductance = here->VDMOSm / model->VDIOresistance;
|
here->VDIOconductance = here->VDMOSm / model->VDIOresistance;
|
||||||
} else {
|
} else {
|
||||||
here->VDIOconductance = here->VDMOSm / 10e-03;
|
here->VDIOconductance = here->VDMOSm / 10e-03;
|
||||||
|
|
@ -375,7 +369,7 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\
|
||||||
} } while(0)
|
} } while(0)
|
||||||
|
|
||||||
if ((here->VDMOSthermalGiven) && (model->VDMOSrthjcGiven)) {
|
if ((here->VDMOSthermalGiven) && (model->VDMOSrthjcGiven)) {
|
||||||
TSTALLOC(VDMOSTemptempPtr, VDMOStempNode, VDMOStempNode);
|
TSTALLOC(VDMOSTemptempPtr, VDMOStempNode, VDMOStempNode); /* Transistor thermal contribution */
|
||||||
TSTALLOC(VDMOSTempdpPtr, VDMOStempNode, VDMOSdNodePrime);
|
TSTALLOC(VDMOSTempdpPtr, VDMOStempNode, VDMOSdNodePrime);
|
||||||
TSTALLOC(VDMOSTempspPtr, VDMOStempNode, VDMOSsNodePrime);
|
TSTALLOC(VDMOSTempspPtr, VDMOStempNode, VDMOSsNodePrime);
|
||||||
TSTALLOC(VDMOSTempgpPtr, VDMOStempNode, VDMOSgNodePrime);
|
TSTALLOC(VDMOSTempgpPtr, VDMOStempNode, VDMOSgNodePrime);
|
||||||
|
|
@ -383,10 +377,15 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\
|
||||||
TSTALLOC(VDMOSDPtempPtr, VDMOSdNodePrime, VDMOStempNode);
|
TSTALLOC(VDMOSDPtempPtr, VDMOSdNodePrime, VDMOStempNode);
|
||||||
TSTALLOC(VDMOSSPtempPtr, VDMOSsNodePrime, VDMOStempNode);
|
TSTALLOC(VDMOSSPtempPtr, VDMOSsNodePrime, VDMOStempNode);
|
||||||
|
|
||||||
TSTALLOC(VDMOSTcasetcasePtr, VDMOStcaseNode, VDMOStcaseNode); /* Rthjc between tj and tcase*/
|
TSTALLOC(VDIOTempposPrimePtr, VDMOStempNode, VDIOposPrimeNode);/* Diode thermal contribution */
|
||||||
|
TSTALLOC(VDIOTempnegPtr, VDMOStempNode, VDMOSdNode);
|
||||||
|
TSTALLOC(VDIOPosPrimetempPtr, VDIOposPrimeNode, VDMOStempNode);
|
||||||
|
TSTALLOC(VDIONegtempPtr, VDMOSdNode, VDMOStempNode);
|
||||||
|
|
||||||
|
TSTALLOC(VDMOSTcasetcasePtr, VDMOStcaseNode, VDMOStcaseNode); /* Rthjc between tj and tcase*/
|
||||||
TSTALLOC(VDMOSTcasetempPtr, VDMOStcaseNode, VDMOStempNode);
|
TSTALLOC(VDMOSTcasetempPtr, VDMOStcaseNode, VDMOStempNode);
|
||||||
TSTALLOC(VDMOSTemptcasePtr, VDMOStempNode, VDMOStcaseNode);
|
TSTALLOC(VDMOSTemptcasePtr, VDMOStempNode, VDMOStcaseNode);
|
||||||
TSTALLOC(VDMOSTptpPtr, VDMOStNodePrime, VDMOStNodePrime); /* Rthca between tcase and Vsrc */
|
TSTALLOC(VDMOSTptpPtr, VDMOStNodePrime, VDMOStNodePrime); /* Rthca between tcase and Vsrc */
|
||||||
TSTALLOC(VDMOSTptcasePtr, VDMOStNodePrime, VDMOStempNode);
|
TSTALLOC(VDMOSTptcasePtr, VDMOStNodePrime, VDMOStempNode);
|
||||||
TSTALLOC(VDMOSTcasetpPtr, VDMOStempNode, VDMOStNodePrime);
|
TSTALLOC(VDMOSTcasetpPtr, VDMOStempNode, VDMOStNodePrime);
|
||||||
TSTALLOC(VDMOSCktTcktTPtr, VDMOSvcktTbranch, VDMOSvcktTbranch); /* Vsrc=cktTemp to gnd */
|
TSTALLOC(VDMOSCktTcktTPtr, VDMOSvcktTbranch, VDMOSvcktTbranch); /* Vsrc=cktTemp to gnd */
|
||||||
|
|
|
||||||
|
|
@ -93,8 +93,7 @@ VDMOStemp(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
/* vdmos temperature model */
|
/* vdmos temperature model */
|
||||||
ratio = here->VDMOStemp/model->VDMOStnom;
|
ratio = here->VDMOStemp/model->VDMOStnom;
|
||||||
here->VDMOStTransconductance = model->VDMOStransconductance
|
here->VDMOStTransconductance = model->VDMOStransconductance
|
||||||
* here->VDMOSm * here->VDMOSw / here->VDMOSl
|
* here->VDMOSm * pow(ratio, model->VDMOSmu);
|
||||||
* pow(ratio, model->VDMOSmu);
|
|
||||||
|
|
||||||
here->VDMOStVth = model->VDMOSvth0 - model->VDMOStype * model->VDMOStcvth * dt;
|
here->VDMOStVth = model->VDMOSvth0 - model->VDMOStype * model->VDMOStcvth * dt;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue