From 600ff137961587503a3bd8247d79849b6a1db3f6 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sun, 26 Oct 2025 08:34:34 +0100 Subject: [PATCH] Revert "Remove instance parameter temp. To specify offset to ambient temperature use dtemp instead." This reverts commit 3340df46cab90a09038a7a236564aeebc769c94e. --- 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, 28 insertions(+), 19 deletions(-) diff --git a/src/spicelib/devices/vdmos/vdmos.c b/src/spicelib/devices/vdmos/vdmos.c index 858ea0ce0..3fc352631 100644 --- a/src/spicelib/devices/vdmos/vdmos.c +++ b/src/spicelib/devices/vdmos/vdmos.c @@ -16,6 +16,7 @@ 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 6ee8e822b..f29ee0d03 100644 --- a/src/spicelib/devices/vdmos/vdmosask.c +++ b/src/spicelib/devices/vdmos/vdmosask.c @@ -23,6 +23,9 @@ 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 8a88f5bd0..28e42b74b 100644 --- a/src/spicelib/devices/vdmos/vdmosdefs.h +++ b/src/spicelib/devices/vdmos/vdmosdefs.h @@ -148,6 +148,7 @@ 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; @@ -346,10 +347,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; @@ -365,10 +366,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; @@ -497,6 +498,7 @@ 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 7618c8bd8..5e29a989a 100644 --- a/src/spicelib/devices/vdmos/vdmosload.c +++ b/src/spicelib/devices/vdmos/vdmosload.c @@ -296,18 +296,16 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt) /* Calculate temperature dependent values for self-heating effect */ if (selfheat) { - 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)); + 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; rd1T = 0.0; drd1T_dT = 0.0; if (model->VDMOSqsGiven) { - rd1T = here->VDMOSqsResistance; - drd1T_dT = rd1T * model->VDMOStexp1 * pow(Temp, model->VDMOStexp1-1) / pow(model->VDMOStnom, model->VDMOStexp1); + rd1T = here->VDMOSqsResistance * pow(TempRatio, model->VDMOStexp1); + drd1T_dT = rd1T * model->VDMOStexp1 / Temp; } } else { Beta = here->VDMOStTransconductance; diff --git a/src/spicelib/devices/vdmos/vdmospar.c b/src/spicelib/devices/vdmos/vdmospar.c index 23d9de2ad..ba9733164 100644 --- a/src/spicelib/devices/vdmos/vdmospar.c +++ b/src/spicelib/devices/vdmos/vdmospar.c @@ -30,6 +30,10 @@ 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 76b0d5b0f..ab59ede32 100644 --- a/src/spicelib/devices/vdmos/vdmosset.c +++ b/src/spicelib/devices/vdmos/vdmosset.c @@ -304,10 +304,6 @@ 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 6440c056d..53d92a548 100644 --- a/src/spicelib/devices/vdmos/vdmostemp.c +++ b/src/spicelib/devices/vdmos/vdmostemp.c @@ -191,6 +191,11 @@ 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 */