From 4a3c7070362292e9fc1bf37d40d67fcf9bcf7440 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Wed, 11 Apr 2018 12:38:40 +0200 Subject: [PATCH] add parallel resistor rds (between outer drain and source nodes, parallel to bulk diode) --- src/spicelib/devices/vdmos/vdmos.c | 1 + src/spicelib/devices/vdmos/vdmosdefs.h | 8 ++++++++ src/spicelib/devices/vdmos/vdmosload.c | 10 +++++----- src/spicelib/devices/vdmos/vdmosmask.c | 3 +++ src/spicelib/devices/vdmos/vdmosmpar.c | 4 ++++ src/spicelib/devices/vdmos/vdmosset.c | 6 ++++++ src/spicelib/devices/vdmos/vdmostemp.c | 12 ++++++++++++ 7 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/spicelib/devices/vdmos/vdmos.c b/src/spicelib/devices/vdmos/vdmos.c index 51c62aa33..547d33095 100644 --- a/src/spicelib/devices/vdmos/vdmos.c +++ b/src/spicelib/devices/vdmos/vdmos.c @@ -97,6 +97,7 @@ IFparm VDMOSmPTable[] = { /* model parameters */ IOP("bv", VDMOS_MOD_BV, IF_REAL, "Vds breakdown voltage"), IOP("ibv", VDMOS_MOD_IBV, IF_REAL, "Current at Vds=bv"), IOP("nbv", VDMOS_MOD_NBV, IF_REAL, "Vds breakdown emission coefficient"), + IOP("rds", VDMOS_MOD_RDS, IF_REAL, "Drain-source shunt resistance"), IOP("rb", VDMOS_MOD_RB, IF_REAL, "Body diode ohmic resistance"), IOP("n", VDMOS_MOD_N, IF_REAL, "Bulk diode emission coefficient"), IOP("tt", VDMOS_MOD_TT, IF_REAL, "Body diode transit time"), diff --git a/src/spicelib/devices/vdmos/vdmosdefs.h b/src/spicelib/devices/vdmos/vdmosdefs.h index 451b13803..82d88e738 100644 --- a/src/spicelib/devices/vdmos/vdmosdefs.h +++ b/src/spicelib/devices/vdmos/vdmosdefs.h @@ -54,6 +54,7 @@ typedef struct sVDMOSinstance { double VDMOSsourceConductance; /*conductance of source(or 0):set in setup*/ double VDMOSdrainConductance; /*conductance of drain(or 0):set in setup*/ double VDMOSgateConductance; /*conductance of gate(or 0):set in setup*/ + double VDMOSdsConductance; /*conductance of drain to source:set in setup*/ double VDMOStemp; /* operating temperature of this instance */ double VDMOSdtemp; /* operating temperature of the instance relative to circuit temperature*/ @@ -245,6 +246,10 @@ typedef struct sVDMOSinstance { * (gate node, gate prime node) */ double *VDMOSGPgPtr; /* pointer to sparse matrix element at * (gate prime node, gate node) */ + double *VDMOSDsPtr; /* pointer to sparse matrix element at + * (source node, drain node) */ + double *VDMOSSdPtr; /* pointer to sparse matrix element at + * (drain node, source node) */ /* bulk diode */ double *VDIORPdPtr; /* pointer to sparse matrix element at * (diode prime node, drain node) */ @@ -340,6 +345,7 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */ double VDIOresistTemp1; double VDIOresistTemp2; double VDIOconductance; + double VDMOSrds; double VDMOSDn; double VDIOtransitTime; double VDIOtranTimeTemp1; @@ -377,6 +383,7 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */ unsigned VDIOjunctionPotGiven :1; unsigned VDIObrkdEmissionCoeffGiven :1; unsigned VDIOresistanceGiven :1; + unsigned VDMOSrdsGiven :1; unsigned VDMOSDnGiven :1; unsigned VDIOtransitTimeGiven :1; unsigned VDMOSDegGiven :1; @@ -437,6 +444,7 @@ enum { VDMOS_MOD_BV, VDMOS_MOD_IBV, VDMOS_MOD_NBV, + VDMOS_MOD_RDS, VDMOS_MOD_N, VDMOS_MOD_TT, VDMOS_MOD_EG, diff --git a/src/spicelib/devices/vdmos/vdmosload.c b/src/spicelib/devices/vdmos/vdmosload.c index d61df0254..d26ee4e58 100644 --- a/src/spicelib/devices/vdmos/vdmosload.c +++ b/src/spicelib/devices/vdmos/vdmosload.c @@ -563,9 +563,6 @@ bypass : ceqgb = ceqgb - gcgb*vgb + ckt->CKTag[0] * *(ckt->CKTstate0 + here->VDMOSqgb); } - /* - * store charge storage info for meyer's cap in lx table - */ /* * load current vector @@ -597,9 +594,9 @@ bypass : * load y matrix */ - *(here->VDMOSDdPtr) += (here->VDMOSdrainConductance); + *(here->VDMOSDdPtr) += (here->VDMOSdrainConductance + here->VDMOSdsConductance); *(here->VDMOSGgPtr) += (here->VDMOSgateConductance); //((gcgd + gcgs + gcgb)); - *(here->VDMOSSsPtr) += (here->VDMOSsourceConductance); + *(here->VDMOSSsPtr) += (here->VDMOSsourceConductance + here->VDMOSdsConductance); *(here->VDMOSBbPtr) += (here->VDMOSgbd + here->VDMOSgbs + gcgb); *(here->VDMOSDPdpPtr) += (here->VDMOSdrainConductance + here->VDMOSgds + @@ -630,6 +627,9 @@ bypass : *(here->VDMOSSPdpPtr) += (-here->VDMOSgds - xrev* (here->VDMOSgm + here->VDMOSgmbs)); + *(here->VDMOSDsPtr) += (-here->VDMOSdsConductance); + *(here->VDMOSSdPtr) += (-here->VDMOSdsConductance); + /* bulk diode model * Delivers reverse conduction and forward breakdown diff --git a/src/spicelib/devices/vdmos/vdmosmask.c b/src/spicelib/devices/vdmos/vdmosmask.c index eedb0b01d..d9364c54b 100644 --- a/src/spicelib/devices/vdmos/vdmosmask.c +++ b/src/spicelib/devices/vdmos/vdmosmask.c @@ -95,6 +95,9 @@ VDMOSmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case VDMOS_MOD_NBV: value->rValue = model->VDIObrkdEmissionCoeff; return(OK); + case VDMOS_MOD_RDS: + value->rValue = model->VDMOSrds; + return(OK); case VDMOS_MOD_FC: value->rValue = model->VDIOdepletionCapCoeff; return(OK); diff --git a/src/spicelib/devices/vdmos/vdmosmpar.c b/src/spicelib/devices/vdmos/vdmosmpar.c index b77610214..30894e0e1 100644 --- a/src/spicelib/devices/vdmos/vdmosmpar.c +++ b/src/spicelib/devices/vdmos/vdmosmpar.c @@ -133,6 +133,10 @@ VDMOSmParam(int param, IFvalue *value, GENmodel *inModel) model->VDIObrkdEmissionCoeff = value->rValue; model->VDIObrkdEmissionCoeffGiven = TRUE; break; + case VDMOS_MOD_RDS: + model->VDMOSrds = value->rValue; + model->VDMOSrdsGiven = TRUE; + break; case VDMOS_MOD_N: model->VDMOSDn = value->rValue; model->VDMOSDnGiven = TRUE; diff --git a/src/spicelib/devices/vdmos/vdmosset.c b/src/spicelib/devices/vdmos/vdmosset.c index edf0bcc41..0548c7b0a 100644 --- a/src/spicelib/devices/vdmos/vdmosset.c +++ b/src/spicelib/devices/vdmos/vdmosset.c @@ -84,6 +84,9 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, if (!model->VDIObrkdEmissionCoeffGiven) { model->VDIObrkdEmissionCoeff = 1.; } + if (!model->VDMOSrdsGiven) { + model->VDMOSrds = 1.0e30; + } if (!model->VDMOSDnGiven) { model->VDMOSDn = 1.; } @@ -279,6 +282,9 @@ do { if((here->ptr = SMPmakeElt(matrix, here->first, here->second)) == NULL){\ TSTALLOC(VDMOSGgpPtr, VDMOSgNode, VDMOSgNodePrime); TSTALLOC(VDMOSGPgPtr, VDMOSgNodePrime, VDMOSgNode); + TSTALLOC(VDMOSDsPtr, VDMOSdNode, VDMOSsNode); + TSTALLOC(VDMOSSdPtr, VDMOSsNode, VDMOSdNode); + TSTALLOC(VDIORPdPtr, VDIOposPrimeNode, VDMOSdNode); TSTALLOC(VDIODrpPtr, VDMOSdNode, VDIOposPrimeNode); TSTALLOC(VDIOSrpPtr, VDMOSsNode, VDIOposPrimeNode); diff --git a/src/spicelib/devices/vdmos/vdmostemp.c b/src/spicelib/devices/vdmos/vdmostemp.c index 5472af216..1a83c5cfc 100644 --- a/src/spicelib/devices/vdmos/vdmostemp.c +++ b/src/spicelib/devices/vdmos/vdmostemp.c @@ -160,6 +160,18 @@ VDMOStemp(GENmodel *inModel, CKTcircuit *ckt) } else { here->VDMOSgateConductance = 0; } + if (model->VDMOSrdsGiven) { + if (model->VDMOSrds != 0) { + here->VDMOSdsConductance = here->VDMOSm / + model->VDMOSrds; + } + else { + here->VDMOSdsConductance = 0; + } + } + else { + here->VDMOSdsConductance = 0; + } /* bulk diode model */ double egfet1, arg1, fact1, pbfact1, pbo, gmaold;