From 88cf4bb92583cf8f02f5f65c23dde02a64f992e8 Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 17 Jun 2020 13:24:03 +0200 Subject: [PATCH] allow SHE also without external temperature node prevent crash with rth=0 --- src/spicelib/devices/hicum2/hicum2setup.c | 25 ++++++++++++++--------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2setup.c b/src/spicelib/devices/hicum2/hicum2setup.c index eafbb3f1d..f246ede85 100644 --- a/src/spicelib/devices/hicum2/hicum2setup.c +++ b/src/spicelib/devices/hicum2/hicum2setup.c @@ -37,6 +37,8 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* loop through all the transistor models */ for( ; model != NULL; model = HICUMnextModel(model)) { + int selfheat = ((model->HICUMflsh == 1) && (model->HICUMrthGiven) && (model->HICUMrth > 0.0)); + //Circuit simulator specific parameters if(model->HICUMtype != NPN && model->HICUMtype != PNP) model->HICUMtype = NPN; @@ -565,18 +567,13 @@ HICUMsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) here->HICUMbaseBINode = tmp->number; } -//VDMOS COPY - if (!(model->HICUMflsh == 0 || model->HICUMrth < MIN_R )) { - if (here->HICUMtempNode == -1) { - error = CKTmkVolt(ckt,&tmp,here->HICUMname,"dT"); + if (selfheat) { + if (here->HICUMtempNode == 0) { // no external node for temperature + error = CKTmkVolt(ckt,&tmp,here->HICUMname,"dT"); // create internal node if (error) return(error); here->HICUMtempNode = tmp->number; } - } else { - here->HICUMtempNode = 0; } -//END VDMOS COPY - // if(here->HICUMxfNode == 0) { // error = CKTmkVolt(ckt, &tmp, here->HICUMname, "xf"); @@ -663,8 +660,8 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ // TSTALLOC(HICUMxf1Xf1Ptr,HICUMxf1Node,HICUMxf1Node); // TSTALLOC(HICUMxf2Xf2Ptr,HICUMxf2Node,HICUMxf2Node); - if (model->HICUMflsh && model->HICUMrth>0.001) { - TSTALLOC(HICUMcollTempPtr,HICUMcollNode,HICUMtempNode); + if (selfheat) { + TSTALLOC(HICUMcollTempPtr, HICUMcollNode, HICUMtempNode); TSTALLOC(HICUMbaseTempPtr,HICUMbaseNode,HICUMtempNode); TSTALLOC(HICUMemitTempPtr,HICUMemitNode,HICUMtempNode); @@ -702,6 +699,8 @@ HICUMunsetup( for (model = (HICUMmodel *)inModel; model != NULL; model = HICUMnextModel(model)) { + int selfheat = ((model->HICUMflsh == 1) && (model->HICUMrthGiven) && (model->HICUMrth > 0.0)); + for (here = HICUMinstances(model); here != NULL; here=HICUMnextInstance(here)) { @@ -729,6 +728,12 @@ HICUMunsetup( CKTdltNNum(ckt, here->HICUMcollCINode); here->HICUMcollCINode = 0; + if (selfheat) { + if (here->HICUMtempNode > 4) // it is an internal node + CKTdltNNum(ckt, here->HICUMtempNode); + here->HICUMtempNode = 0; + } + // if(here->HICUMxfNode > 0) // CKTdltNNum(ckt, here->HICUMxfNode); // here->HICUMxfNode = 0;