You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

613 lines
19 KiB

/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Modified: 2000 AlansFixes
VDMOS: 2018 Holger Vogt, 2020 Dietmar Warning
**********/
#ifndef VDMOS
#define VDMOS
#include "ngspice/ifsim.h"
#include "ngspice/cktdefs.h"
#include "ngspice/gendefs.h"
#include "ngspice/complex.h"
#include "ngspice/noisedef.h"
/* declarations for VDMOSFETs */
/* indices to the array of MOSFET(1) noise sources */
enum {
VDMOSRDNOIZ = 0,
VDMOSRSNOIZ,
VDMOSIDNOIZ,
VDMOSFLNOIZ,
VDMOSTOTNOIZ,
/* finally, the number of noise sources */
VDMOSNSRCS
};
/* information needed for each instance */
typedef struct sVDMOSinstance {
struct GENinstance gen;
#define VDMOSmodPtr(inst) ((struct sVDMOSmodel *)((inst)->gen.GENmodPtr))
#define VDMOSnextInstance(inst) ((struct sVDMOSinstance *)((inst)->gen.GENnextInstance))
#define VDMOSname gen.GENname
#define VDMOSstates gen.GENstate
const int VDMOSdNode; /* number of the drain node of the mosfet */
const int VDMOSgNode; /* number of the gate node of the mosfet */
const int VDMOSsNode; /* number of the source node of the mosfet */
int VDMOStempNode; /* number of the temperature node of the mosfet */
int VDMOStcaseNode; /* number of the 2nd temperature node of the mosfet */
int VDMOSdNodePrime; /* number of the internal drain node of the mosfet */
int VDMOSsNodePrime; /* number of the internal source node of the mosfet */
int VDMOSgNodePrime; /* number of the internal gate node of the mosfet */
int VDMOStNodePrime; /* number of the internal temp node between voltage source and Rthca */
int VDIOposPrimeNode; /* number of the internal node of the body diode */
int VDMOSvcktTbranch; /* equation number of branch equation added for cktTemp source */
double VDMOSm; /* parallel device multiplier */
double VDMOSsourceConductance; /*conductance of source(or 0):set in setup*/
double VDMOSdrainConductance; /*conductance of drain(or 0):set in setup*/
double VDMOSdrainResistance; /*resistance of drain(or 0): set in temp*/
double VDMOSqsResistance; /*resistance of drain: set in temp*/
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*/
int VDMOSthermal; /* flag indicate self heating on */
double VDMOStTransconductance; /* temperature corrected transconductance*/
double VDMOStPhi; /* temperature corrected Phi */
double VDMOStVth; /* temperature corrected Vth */
double VDMOStksubthres; /* temperature weak inversion slope */
double VDMOSicVDS; /* initial condition D-S voltage */
double VDMOSicVGS; /* initial condition G-S voltage */
double VDMOSvon;
double VDMOSvdsat;
double VDMOScd;
double VDMOSgm;
double VDMOSgds;
double VDIOcap;
double VDIOtSatCur; /* temperature corrected saturation Cur. density */
double VDIOtSatCur_dT;
double VDIOinitCond;
double VDIOtVcrit;
double VDIOconductance;
double VDIOtConductance;
double VDIOtConductance_dT;
double VDIOtBrkdwnV;
double VDIOtJctCap;
double VDIOtDepCap; /* temperature adjusted transition point in */
/* the curve matching Fc * Vj */
double VDIOtJctPot; /* temperature corrected junction potential */
double VDIOtGradingCoeff;
double VDIOtTransitTime;
double VDIOtF1;
double VDIOtF2;
double VDIOtF3;
double VDMOSTempSH; /* for portability of SH temp to noise analysis */
double VDMOSgmT;
double VDMOSgtempg;
double VDMOSgtempd;
double VDMOSgtempT;
double VDMOScgT;
double VDMOScdT;
double VDMOScth; /* current alias power */
/*
* naming convention:
* x = vgs
* y = vbs
* z = vds
* cdr = cdrain
*/
#define VDMOSNDCOEFFS 11
#ifndef NODISTO
double VDMOSdCoeffs[VDMOSNDCOEFFS];
#else /* NODISTO */
double *VDMOSdCoeffs;
#endif /* NODISTO */
#ifndef CONFIG
#define cdr_x2 VDMOSdCoeffs[0]
#define cdr_y2 VDMOSdCoeffs[1]
#define cdr_xy VDMOSdCoeffs[2]
#define cdr_x3 VDMOSdCoeffs[3]
#define cdr_y3 VDMOSdCoeffs[4]
#define cdr_x2y VDMOSdCoeffs[5]
#define cdr_xy2 VDMOSdCoeffs[6]
#define capgs2 VDMOSdCoeffs[7]
#define capgs3 VDMOSdCoeffs[8]
#define capgd2 VDMOSdCoeffs[9]
#define capgd3 VDMOSdCoeffs[10]
#endif
#ifndef NONOISE
double VDMOSnVar[NSTATVARS][VDMOSNSRCS];
#else /* NONOISE */
double **VDMOSnVar;
#endif /* NONOISE */
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;
unsigned VDMOSsNodePrimeSet :1;
unsigned VDMOSicVDSGiven :1;
unsigned VDMOSicVGSGiven :1;
unsigned VDMOSvonGiven : 1;
unsigned VDMOSvdsatGiven :1;
unsigned VDMOSmodeGiven :1;
double *VDMOSDdPtr; /* pointer to sparse matrix element at
(Drain node,drain node) */
double *VDMOSGgPtr; /* pointer to sparse matrix element at
(gate node,gate node) */
double *VDMOSSsPtr; /* pointer to sparse matrix element at
(source node,source node) */
double *VDMOSDPdpPtr; /* pointer to sparse matrix element at
(drain prime node,drain prime node) */
double *VDMOSSPspPtr; /* pointer to sparse matrix element at
(source prime node,source prime node) */
double *VDMOSDdpPtr; /* pointer to sparse matrix element at
(drain node,drain prime node) */
double *VDMOSSspPtr; /* pointer to sparse matrix element at
(source node,source prime node) */
double *VDMOSDPspPtr; /* pointer to sparse matrix element at
(drain prime node,source prime node) */
double *VDMOSDPdPtr; /* pointer to sparse matrix element at
(drain prime node,drain node) */
double *VDMOSDPgPtr; /* pointer to sparse matrix element at
(drain prime node,gate node) */
double *VDMOSSPgPtr; /* pointer to sparse matrix element at
(source prime node,gate node) */
double *VDMOSSPsPtr; /* pointer to sparse matrix element at
(source prime node,source node) */
double *VDMOSSPdpPtr; /* pointer to sparse matrix element at
(source prime node,drain prime node) */
/* added for VDMOS */
double *VDMOSGPgpPtr; /* pointer to sparse matrix element at
(gate prime node, gate prime node) */
double *VDMOSGPdpPtr; /* pointer to sparse matrix element at
(gate prime node, drain prime node) */
double *VDMOSGPspPtr; /* pointer to sparse matrix element at
(gate prime node, source prime node) */
double *VDMOSDPgpPtr; /* pointer to sparse matrix element at
(drain prime node, gate prime node) */
double *VDMOSSPgpPtr; /* pointer to sparse matrix element at
(source prime node, gate prime node) */
double *VDMOSGgpPtr; /* pointer to sparse matrix element at
(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) */
/* body diode */
double *VDIORPdPtr; /* pointer to sparse matrix element at
(diode prime node, drain node) */
double *VDIODrpPtr; /* pointer to sparse matrix element at
(drain node, diode prime node) */
double *VDIORPrpPtr; /* pointer to sparse matrix element at
(diode prime node, diode prime node) */
double *VDIOSrpPtr; /* pointer to sparse matrix element at
(source node, diode prime node) */
double *VDIORPsPtr; /* pointer to sparse matrix element at
(diode prime node, source node) */
/* self heating */
double *VDMOSTemptempPtr; /* Transistor thermal contribution */
double *VDMOSTempdpPtr;
double *VDMOSTempspPtr;
double *VDMOSTempgpPtr;
double *VDMOSGPtempPtr;
double *VDMOSDPtempPtr;
double *VDMOSSPtempPtr;
double *VDIOTempposPrimePtr; /* Diode thermal contribution */
double *VDMOSTempdPtr;
double *VDIOPosPrimetempPtr;
double *VDMOSDtempPtr;
double *VDMOStempSPtr;
double *VDMOSSTempPtr;
double *VDMOSTcasetcasePtr; /* for Rthjc */
double *VDMOSTcasetempPtr;
double *VDMOSTemptcasePtr;
double *VDMOSTptpPtr; /* for Rthca */
double *VDMOSTptcasePtr;
double *VDMOSTcasetpPtr;
double *VDMOSCktTcktTPtr; /* for VcktTemp */
double *VDMOSCktTtpPtr;
double *VDMOSTpcktTPtr;
#ifdef KLU
BindElement *VDMOSDdBinding ;
BindElement *VDMOSGgBinding ;
BindElement *VDMOSSsBinding ;
BindElement *VDMOSDPdpBinding ;
BindElement *VDMOSSPspBinding ;
BindElement *VDMOSGPgpBinding ;
BindElement *VDMOSDdpBinding ;
BindElement *VDMOSGPdpBinding ;
BindElement *VDMOSGPspBinding ;
BindElement *VDMOSSspBinding ;
BindElement *VDMOSDPspBinding ;
BindElement *VDMOSDPdBinding ;
BindElement *VDMOSDPgpBinding ;
BindElement *VDMOSSPgpBinding ;
BindElement *VDMOSSPsBinding ;
BindElement *VDMOSSPdpBinding ;
BindElement *VDMOSGgpBinding ;
BindElement *VDMOSGPgBinding ;
BindElement *VDMOSDsBinding ;
BindElement *VDMOSSdBinding ;
BindElement *VDIORPdBinding ;
BindElement *VDIODrpBinding ;
BindElement *VDIOSrpBinding ;
BindElement *VDIORPsBinding ;
BindElement *VDIORPrpBinding ;
BindElement *VDMOSTemptempBinding ;
BindElement *VDMOSTempdpBinding ;
BindElement *VDMOSTempspBinding ;
BindElement *VDMOSTempgpBinding ;
BindElement *VDMOSGPtempBinding ;
BindElement *VDMOSDPtempBinding ;
BindElement *VDMOSSPtempBinding ;
BindElement *VDIOTempposPrimeBinding ;
BindElement *VDMOSTempdBinding ;
BindElement *VDIOPosPrimetempBinding ;
BindElement *VDMOSDtempBinding ;
BindElement *VDMOStempSBinding ;
BindElement *VDMOSSTempBinding ;
BindElement *VDMOSTcasetcaseBinding ;
BindElement *VDMOSTcasetempBinding ;
BindElement *VDMOSTemptcaseBinding ;
BindElement *VDMOSTptpBinding ;
BindElement *VDMOSTptcaseBinding ;
BindElement *VDMOSTcasetpBinding ;
BindElement *VDMOSCktTcktTBinding ;
BindElement *VDMOSCktTtpBinding ;
BindElement *VDMOSTpcktTBinding ;
#endif
} VDMOSinstance ;
#define VDMOSvgs VDMOSstates+ 0 /* gate-source voltage */
#define VDMOSvds VDMOSstates+ 1 /* drain-source voltage */
#define VDMOSdelTemp VDMOSstates+ 2 /* thermal voltage over rth0 */
#define VDMOScapgs VDMOSstates+3 /* gate-source capacitor value */
#define VDMOSqgs VDMOSstates+ 4 /* gate-source capacitor charge */
#define VDMOScqgs VDMOSstates+ 5 /* gate-source capacitor current */
#define VDMOScapgd VDMOSstates+ 6 /* gate-drain capacitor value */
#define VDMOSqgd VDMOSstates+ 7 /* gate-drain capacitor charge */
#define VDMOScqgd VDMOSstates+ 8 /* gate-drain capacitor current */
#define VDIOvoltage VDMOSstates+ 9
#define VDIOcurrent VDMOSstates+ 10
#define VDIOconduct VDMOSstates+ 11
#define VDIOcapCharge VDMOSstates+ 12
#define VDIOcapCurrent VDMOSstates+ 13
#define VDMOScapth VDMOSstates+ 14 /* thermal capacitor value */
#define VDMOSqth VDMOSstates+ 15 /* thermal capacitor charge */
#define VDMOScqth VDMOSstates+ 16 /* thermal capacitor current */
#define VDIOdIdio_dT VDMOSstates+ 17
#define VDMOSnumStates 18
/* per model data */
/* NOTE: parameters marked 'input - use xxxx' are parameters for
* which a temperature correction is applied in VDMOStemp, thus
* the VDMOSxxxx value in the per-instance structure should be used
* instead in all calculations
*/
typedef struct sVDMOSmodel { /* model structure for a resistor */
struct GENmodel gen;
#define VDMOSmodType gen.GENmodType
#define VDMOSnextModel(inst) ((struct sVDMOSmodel *)((inst)->gen.GENnextModel))
#define VDMOSinstances(inst) ((VDMOSinstance *)((inst)->gen.GENinstances))
#define VDMOSmodName gen.GENmodName
int VDMOStype; /* device type : 1 = nmos, -1 = pmos */
double VDMOStnom; /* temperature at which parameters measured */
double VDMOSdrainResistance;
double VDMOSsourceResistance;
double VDMOSgateResistance;
double VDMOSqsResistance;
double VDMOSqsVoltage;
double VDMOStransconductance; /* input - use tTransconductance */
double VDMOSoxideCapFactor;
double VDMOSvth0; /* input - use tVth */
double VDMOSphi; /* input - use tPhi */
double VDMOSlambda;
double VDMOStheta;
double VDMOSfNcoef;
double VDMOSfNexp;
double VDMOScgdmin;
double VDMOScgdmax;
double VDMOSa;
double VDMOScgs;
double VDMOSsubshift;
double VDMOSksubthres;
double VDMOSmtr;
double VDMOSrds;
/* body diode */
double VDIOjunctionCap; /* input - use tCj */
double VDIOjunctionPot; /* input - use tJctPot */
double VDIOdepletionCapCoeff;
double VDIOjctSatCur; /* input - use tSatCur */
double VDIObv;
double VDIOibv;
double VDIObrkdEmissionCoeff;
double VDIOresistance;
double VDIOn;
double VDIOtransitTime;
double VDIOtranTimeTemp1;
double VDIOtranTimeTemp2;
double VDIOeg;
double VDIOxti;
double VDIOgradCoeff;
double VDIOgradCoeffTemp1;
double VDIOgradCoeffTemp2;
double VDIOtrb1;
double VDIOtrb2;
double VDMOStcvth;
double VDMOSrthjc;
double VDMOSrthca;
double VDMOScthj;
double VDMOSmu;
double VDMOStexp0;
double VDMOStexp1;
double VDMOStrd1;
double VDMOStrd2;
double VDMOStrg1;
double VDMOStrg2;
double VDMOStrs1;
double VDMOStrs2;
double VDMOStksubthres1;
double VDMOStksubthres2;
double VDMOSvgsMax;
double VDMOSvgdMax;
double VDMOSvdsMax;
double VDMOSvgsrMax;
double VDMOSvgdrMax;
double VDMOSid_max;
double VDMOSidr_max;
double VDMOSpd_max;
double VDMOSrth_ext;
double VDMOSte_max;
double VDMOSderating;
unsigned VDMOStypeGiven :1;
unsigned VDMOSdrainResistanceGiven :1;
unsigned VDMOSsourceResistanceGiven :1;
unsigned VDMOSgateResistanceGiven :1;
unsigned VDMOSqsResistanceGiven :1;
unsigned VDMOSqsVoltageGiven :1;
unsigned VDMOSqsGiven :1;
unsigned VDMOStransconductanceGiven :1;
unsigned VDMOSvth0Given :1;
unsigned VDMOSphiGiven :1;
unsigned VDMOSlambdaGiven :1;
unsigned VDMOSthetaGiven :1;
unsigned VDMOStnomGiven :1;
unsigned VDMOSfNcoefGiven :1;
unsigned VDMOSfNexpGiven :1;
unsigned VDMOScgdminGiven :1;
unsigned VDMOScgdmaxGiven :1;
unsigned VDMOScgsGiven :1;
unsigned VDMOSaGiven :1;
unsigned VDMOSsubshiftGiven :1;
unsigned VDMOSksubthresGiven :1;
unsigned VDMOSmtrGiven :1;
unsigned VDMOSrdsGiven :1;
unsigned VDIOjctSatCurGiven :1;
unsigned VDIOgradCoeffGiven :1;
unsigned VDIOdepletionCapCoeffGiven :1;
unsigned VDIObvGiven :1;
unsigned VDIOibvGiven :1;
unsigned VDIOjunctionCapGiven :1;
unsigned VDIOjunctionPotGiven :1;
unsigned VDIObrkdEmissionCoeffGiven :1;
unsigned VDIOresistanceGiven :1;
unsigned VDIOnGiven :1;
unsigned VDIOtransitTimeGiven :1;
unsigned VDIOegGiven :1;
unsigned VDIOxtiGiven :1;
unsigned VDIOtrb1Given :1;
unsigned VDIOtrb2Given :1;
unsigned VDMOStcvthGiven :1;
unsigned VDMOSrthjcGiven :1;
unsigned VDMOSrthcaGiven :1;
unsigned VDMOScthjGiven :1;
unsigned VDMOSmuGiven :1;
unsigned VDMOStexp0Given :1;
unsigned VDMOStexp1Given :1;
unsigned VDMOStrd1Given :1;
unsigned VDMOStrd2Given :1;
unsigned VDMOStrg1Given :1;
unsigned VDMOStrg2Given :1;
unsigned VDMOStrs1Given :1;
unsigned VDMOStrs2Given :1;
unsigned VDMOStksubthres1Given :1;
unsigned VDMOStksubthres2Given :1;
unsigned VDMOSvgsMaxGiven :1;
unsigned VDMOSvgdMaxGiven :1;
unsigned VDMOSvdsMaxGiven :1;
unsigned VDMOSvgsrMaxGiven :1;
unsigned VDMOSvgdrMaxGiven :1;
unsigned VDMOSrth_extGiven :1;
unsigned VDMOSpd_maxGiven :1;
unsigned VDMOSte_maxGiven :1;
unsigned VDMOSid_maxGiven :1;
unsigned VDMOSidr_maxGiven :1;
unsigned VDMOSderatingGiven :1;
} VDMOSmodel;
#ifndef NMOS
#define NMOS 1
#define PMOS -1
#endif /*NMOS*/
/* device parameters */
enum {
VDMOS_OFF = 1,
VDMOS_IC,
VDMOS_IC_VDS,
VDMOS_IC_VGS,
VDMOS_CG,
VDMOS_CS,
VDMOS_POWER,
VDMOS_TEMP,
VDMOS_M,
VDMOS_DTEMP,
VDMOS_THERMAL,
};
/* model parameters */
enum {
VDMOS_MOD_VTH = 101,
VDMOS_MOD_KP,
VDMOS_MOD_PHI,
VDMOS_MOD_LAMBDA,
VDMOS_MOD_THETA,
VDMOS_MOD_RD,
VDMOS_MOD_RS,
VDMOS_MOD_RG,
VDMOS_MOD_RQ,
VDMOS_MOD_VQ,
VDMOS_MOD_NMOS,
VDMOS_MOD_PMOS,
VDMOS_MOD_TNOM,
VDMOS_MOD_KF,
VDMOS_MOD_AF,
VDMOS_MOD_TYPE,
VDMOS_MOD_DMOS,
VDMOS_MOD_CGDMIN,
VDMOS_MOD_CGDMAX,
VDMOS_MOD_A,
VDMOS_MOD_CGS,
VDMOS_MOD_MTRIODE,
VDMOS_MOD_SUBSHIFT,
VDMOS_MOD_KSUBTHRES,
VDMOS_MOD_RDS,
VDIO_MOD_IS,
VDIO_MOD_VJ,
VDIO_MOD_CJ,
VDIO_MOD_MJ,
VDIO_MOD_FC,
VDIO_MOD_RB,
VDIO_MOD_BV,
VDIO_MOD_IBV,
VDIO_MOD_NBV,
VDIO_MOD_N,
VDIO_MOD_TT,
VDIO_MOD_EG,
VDIO_MOD_XTI,
VDIO_MOD_TRB1,
VDIO_MOD_TRB2,
VDMOS_MOD_TCVTH,
VDMOS_MOD_RTHJC,
VDMOS_MOD_RTHCA,
VDMOS_MOD_CTHJ,
VDMOS_MOD_MU,
VDMOS_MOD_TEXP0,
VDMOS_MOD_TEXP1,
VDMOS_MOD_TRD1,
VDMOS_MOD_TRD2,
VDMOS_MOD_TRG1,
VDMOS_MOD_TRG2,
VDMOS_MOD_TRS1,
VDMOS_MOD_TRS2,
VDMOS_MOD_TKSUBTHRES1,
VDMOS_MOD_TKSUBTHRES2,
VDMOS_MOD_VGS_MAX,
VDMOS_MOD_VGD_MAX,
VDMOS_MOD_VDS_MAX,
VDMOS_MOD_VGSR_MAX,
VDMOS_MOD_VGDR_MAX,
VDMOS_MOD_PD_MAX,
VDMOS_MOD_ID_MAX,
VDMOS_MOD_IDR_MAX,
VDMOS_MOD_TE_MAX,
VDMOS_MOD_RTH_EXT,
VDMOS_MOD_DERATING,
};
/* device questions */
enum {
VDMOS_CAPGS = 201,
VDMOS_CAPGD,
VDMOS_CAPDS,
VDMOS_DNODE,
VDMOS_GNODE,
VDMOS_SNODE,
VDMOS_TNODE,
VDMOS_TCASE,
VDMOS_DNODEPRIME,
VDMOS_SNODEPRIME,
VDMOS_SOURCECONDUCT,
VDMOS_DRAINCONDUCT,
VDMOS_VON,
VDMOS_CD,
VDMOS_GM,
VDMOS_GDS,
VDMOS_VGS,
VDMOS_VDS,
VDMOS_QGS,
VDMOS_CQGS,
VDMOS_QGD,
VDMOS_CQGD,
VDMOS_CDIO,
VDMOS_SOURCERESIST,
VDMOS_DRAINRESIST,
};
/* model questions */
void VDMOStempUpdate(VDMOSmodel *, VDMOSinstance *, double , CKTcircuit *);
#include "vdmosext.h"
#endif /*VDMOS*/