Browse Source

Remove instance parameter temp. To specify offset to ambient temperature use dtemp instead.

Remove temp update double application for beta and series resistances and fix derivatives for selfheating model.
pre-master-46
dwarning 5 months ago
parent
commit
3340df46ca
  1. 1
      src/spicelib/devices/vdmos/vdmos.c
  2. 3
      src/spicelib/devices/vdmos/vdmosask.c
  3. 2
      src/spicelib/devices/vdmos/vdmosdefs.h
  4. 16
      src/spicelib/devices/vdmos/vdmosload.c
  5. 4
      src/spicelib/devices/vdmos/vdmospar.c
  6. 4
      src/spicelib/devices/vdmos/vdmosset.c
  7. 5
      src/spicelib/devices/vdmos/vdmostemp.c

1
src/spicelib/devices/vdmos/vdmos.c

@ -16,7 +16,6 @@ IFparm VDMOSpTable[] = { /* parameters */
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"),
IOPU("temp", VDMOS_TEMP, IF_REAL, "Instance temperature"),
IOPU("dtemp", VDMOS_DTEMP, IF_REAL, "Instance temperature difference"), IOPU("dtemp", VDMOS_DTEMP, IF_REAL, "Instance temperature difference"),
IP( "ic", VDMOS_IC, IF_REALVEC, "Vector of D-S, G-S voltages"), IP( "ic", VDMOS_IC, IF_REALVEC, "Vector of D-S, G-S voltages"),

3
src/spicelib/devices/vdmos/vdmosask.c

@ -23,9 +23,6 @@ VDMOSask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value,
NG_IGNORE(select); NG_IGNORE(select);
switch(which) { switch(which) {
case VDMOS_TEMP:
value->rValue = here->VDMOStemp - CONSTCtoK;
return(OK);
case VDMOS_DTEMP: case VDMOS_DTEMP:
value->rValue = here->VDMOSdtemp; value->rValue = here->VDMOSdtemp;
return(OK); return(OK);

2
src/spicelib/devices/vdmos/vdmosdefs.h

@ -148,7 +148,6 @@ typedef struct sVDMOSinstance {
int VDMOSmode; /* device mode : 1 = normal, -1 = inverse */ int VDMOSmode; /* device mode : 1 = normal, -1 = inverse */
unsigned VDMOSoff:1; /* non-zero to indicate device is off for dc analysis*/ unsigned VDMOSoff:1; /* non-zero to indicate device is off for dc analysis*/
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 VDMOSdNodePrimeSet :1; unsigned VDMOSdNodePrimeSet :1;
@ -498,7 +497,6 @@ enum {
VDMOS_CG, VDMOS_CG,
VDMOS_CS, VDMOS_CS,
VDMOS_POWER, VDMOS_POWER,
VDMOS_TEMP,
VDMOS_M, VDMOS_M,
VDMOS_DTEMP, VDMOS_DTEMP,
VDMOS_THERMAL, VDMOS_THERMAL,

16
src/spicelib/devices/vdmos/vdmosload.c

@ -296,16 +296,18 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
/* Calculate temperature dependent values for self-heating effect */ /* Calculate temperature dependent values for self-heating effect */
if (selfheat) { if (selfheat) {
double TempRatio = Temp / here->VDMOStemp;
Beta = here->VDMOStTransconductance * pow(TempRatio,model->VDMOSmu);
dBeta_dT = Beta * model->VDMOSmu / Temp;
rd0T = here->VDMOSdrainResistance * pow(TempRatio, model->VDMOStexp0);
drd0T_dT = rd0T * model->VDMOStexp0 / Temp;
Beta = here->VDMOStTransconductance;
dBeta_dT = Beta * model->VDMOSmu * pow(Temp, model->VDMOSmu-1) / pow(model->VDMOStnom, model->VDMOSmu);
rd0T = here->VDMOSdrainResistance;
if (model->VDMOStexp0Given)
drd0T_dT = rd0T * model->VDMOStexp0 * pow(Temp, model->VDMOStexp0-1) / pow(model->VDMOStnom, model->VDMOStexp0);
else
drd0T_dT = rd0T * (model->VDMOStrd1 + model->VDMOStrd2*(2*model->VDMOStnom*Temp - model->VDMOStnom*model->VDMOStnom));
rd1T = 0.0; rd1T = 0.0;
drd1T_dT = 0.0; drd1T_dT = 0.0;
if (model->VDMOSqsGiven) { if (model->VDMOSqsGiven) {
rd1T = here->VDMOSqsResistance * pow(TempRatio, model->VDMOStexp1);
drd1T_dT = rd1T * model->VDMOStexp1 / Temp;
rd1T = here->VDMOSqsResistance;
drd1T_dT = rd1T * model->VDMOStexp1 * pow(Temp, model->VDMOStexp1-1) / pow(model->VDMOStnom, model->VDMOStexp1);
} }
} else { } else {
Beta = here->VDMOStTransconductance; Beta = here->VDMOStTransconductance;

4
src/spicelib/devices/vdmos/vdmospar.c

@ -30,10 +30,6 @@ VDMOSparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
scale = 1; scale = 1;
switch (param) { switch (param) {
case VDMOS_TEMP:
here->VDMOStemp = value->rValue+CONSTCtoK;
here->VDMOStempGiven = TRUE;
break;
case VDMOS_DTEMP: case VDMOS_DTEMP:
here->VDMOSdtemp = value->rValue; here->VDMOSdtemp = value->rValue;
here->VDMOSdtempGiven = TRUE; here->VDMOSdtempGiven = TRUE;

4
src/spicelib/devices/vdmos/vdmosset.c

@ -304,6 +304,10 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
here->VDIOconductance = 0.0; here->VDIOconductance = 0.0;
} }
if (!here->VDMOSdtempGiven) here->VDMOSdtemp = 0.0;
here->VDMOStemp = ckt->CKTtemp + here->VDMOSdtemp;
if (model->VDMOSdrainResistance > 0) { if (model->VDMOSdrainResistance > 0) {
if (here->VDMOSdNodePrime == 0) { if (here->VDMOSdNodePrime == 0) {
error = CKTmkVolt(ckt, &tmp, here->VDMOSname, "drain"); error = CKTmkVolt(ckt, &tmp, here->VDMOSname, "drain");

5
src/spicelib/devices/vdmos/vdmostemp.c

@ -191,11 +191,6 @@ VDMOStemp(GENmodel *inModel, CKTcircuit *ckt)
/* loop through all the instances */ /* loop through all the instances */
for(here=VDMOSinstances(model);here;here=VDMOSnextInstance(here)) { for(here=VDMOSinstances(model);here;here=VDMOSnextInstance(here)) {
if(!here->VDMOSdtempGiven) here->VDMOSdtemp = 0.0;
if(!here->VDMOStempGiven)
here->VDMOStemp = ckt->CKTtemp + here->VDMOSdtemp;
VDMOStempUpdate(model, here, here->VDMOStemp, ckt); VDMOStempUpdate(model, here, here->VDMOStemp, ckt);
} /* instance */ } /* instance */

Loading…
Cancel
Save