From 3340df46cab90a09038a7a236564aeebc769c94e Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 22 Oct 2025 18:21:49 +0200 Subject: [PATCH] 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. --- src/spicelib/devices/vdmos/vdmos.c | 1 - src/spicelib/devices/vdmos/vdmosask.c | 3 --- src/spicelib/devices/vdmos/vdmosdefs.h | 14 ++++++-------- src/spicelib/devices/vdmos/vdmosload.c | 16 +++++++++------- src/spicelib/devices/vdmos/vdmospar.c | 4 ---- src/spicelib/devices/vdmos/vdmosset.c | 4 ++++ src/spicelib/devices/vdmos/vdmostemp.c | 5 ----- 7 files changed, 19 insertions(+), 28 deletions(-) diff --git a/src/spicelib/devices/vdmos/vdmos.c b/src/spicelib/devices/vdmos/vdmos.c index 3fc352631..858ea0ce0 100644 --- a/src/spicelib/devices/vdmos/vdmos.c +++ b/src/spicelib/devices/vdmos/vdmos.c @@ -16,7 +16,6 @@ IFparm VDMOSpTable[] = { /* parameters */ IP("off", VDMOS_OFF, IF_FLAG, "Device initially off"), IOPU("icvds", VDMOS_IC_VDS, IF_REAL, "Initial D-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"), IP( "ic", VDMOS_IC, IF_REALVEC, "Vector of D-S, G-S voltages"), diff --git a/src/spicelib/devices/vdmos/vdmosask.c b/src/spicelib/devices/vdmos/vdmosask.c index f29ee0d03..6ee8e822b 100644 --- a/src/spicelib/devices/vdmos/vdmosask.c +++ b/src/spicelib/devices/vdmos/vdmosask.c @@ -23,9 +23,6 @@ VDMOSask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, NG_IGNORE(select); switch(which) { - case VDMOS_TEMP: - value->rValue = here->VDMOStemp - CONSTCtoK; - return(OK); case VDMOS_DTEMP: value->rValue = here->VDMOSdtemp; return(OK); diff --git a/src/spicelib/devices/vdmos/vdmosdefs.h b/src/spicelib/devices/vdmos/vdmosdefs.h index 28e42b74b..8a88f5bd0 100644 --- a/src/spicelib/devices/vdmos/vdmosdefs.h +++ b/src/spicelib/devices/vdmos/vdmosdefs.h @@ -148,7 +148,6 @@ typedef struct sVDMOSinstance { int VDMOSmode; /* device mode : 1 = normal, -1 = inverse */ 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 VDMOSmGiven :1; unsigned VDMOSdNodePrimeSet :1; @@ -347,10 +346,10 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */ double VDMOSgateResistance; double VDMOSqsResistance; double VDMOSqsVoltage; - double VDMOStransconductance; /* input - use tTransconductance */ + double VDMOStransconductance; /* input - use tTransconductance */ double VDMOSoxideCapFactor; - double VDMOSvth0; /* input - use tVth */ - double VDMOSphi; /* input - use tPhi */ + double VDMOSvth0; /* input - use tVth */ + double VDMOSphi; /* input - use tPhi */ double VDMOSlambda; double VDMOStheta; double VDMOSfNcoef; @@ -366,10 +365,10 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */ double VDMOSrds; /* body diode */ - double VDIOjunctionCap; /* input - use tCj */ - double VDIOjunctionPot; /* input - use tJctPot */ + double VDIOjunctionCap; /* input - use tCj */ + double VDIOjunctionPot; /* input - use tJctPot */ double VDIOdepletionCapCoeff; - double VDIOjctSatCur; /* input - use tSatCur */ + double VDIOjctSatCur; /* input - use tSatCur */ double VDIObv; double VDIOibv; double VDIObrkdEmissionCoeff; @@ -498,7 +497,6 @@ enum { VDMOS_CG, VDMOS_CS, VDMOS_POWER, - VDMOS_TEMP, VDMOS_M, VDMOS_DTEMP, VDMOS_THERMAL, diff --git a/src/spicelib/devices/vdmos/vdmosload.c b/src/spicelib/devices/vdmos/vdmosload.c index 5e29a989a..7618c8bd8 100644 --- a/src/spicelib/devices/vdmos/vdmosload.c +++ b/src/spicelib/devices/vdmos/vdmosload.c @@ -296,16 +296,18 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt) /* Calculate temperature dependent values for self-heating effect */ 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; drd1T_dT = 0.0; 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 { Beta = here->VDMOStTransconductance; diff --git a/src/spicelib/devices/vdmos/vdmospar.c b/src/spicelib/devices/vdmos/vdmospar.c index ba9733164..23d9de2ad 100644 --- a/src/spicelib/devices/vdmos/vdmospar.c +++ b/src/spicelib/devices/vdmos/vdmospar.c @@ -30,10 +30,6 @@ VDMOSparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) scale = 1; switch (param) { - case VDMOS_TEMP: - here->VDMOStemp = value->rValue+CONSTCtoK; - here->VDMOStempGiven = TRUE; - break; case VDMOS_DTEMP: here->VDMOSdtemp = value->rValue; here->VDMOSdtempGiven = TRUE; diff --git a/src/spicelib/devices/vdmos/vdmosset.c b/src/spicelib/devices/vdmos/vdmosset.c index ab59ede32..76b0d5b0f 100644 --- a/src/spicelib/devices/vdmos/vdmosset.c +++ b/src/spicelib/devices/vdmos/vdmosset.c @@ -304,6 +304,10 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, here->VDIOconductance = 0.0; } + if (!here->VDMOSdtempGiven) here->VDMOSdtemp = 0.0; + + here->VDMOStemp = ckt->CKTtemp + here->VDMOSdtemp; + if (model->VDMOSdrainResistance > 0) { if (here->VDMOSdNodePrime == 0) { error = CKTmkVolt(ckt, &tmp, here->VDMOSname, "drain"); diff --git a/src/spicelib/devices/vdmos/vdmostemp.c b/src/spicelib/devices/vdmos/vdmostemp.c index 53d92a548..6440c056d 100644 --- a/src/spicelib/devices/vdmos/vdmostemp.c +++ b/src/spicelib/devices/vdmos/vdmostemp.c @@ -191,11 +191,6 @@ VDMOStemp(GENmodel *inModel, CKTcircuit *ckt) /* loop through all the instances */ 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); } /* instance */