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.
485 lines
16 KiB
485 lines
16 KiB
/**********
|
|
Copyright 1990 Regents of the University of California. All rights reserved.
|
|
Author: 1985 Thomas L. Quarles
|
|
Modified: 2000 AlansFixes
|
|
**********/
|
|
|
|
#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 gate 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 */
|
|
const int VDMOSbNode; /* number of the bulk 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 VDIOposPrimeNode; /* number of the internal node of the bulk diode */
|
|
|
|
double VDMOSm; /* parallel device multiplier */
|
|
|
|
double VDMOSl; /* the length of the channel region */
|
|
double VDMOSw; /* the width of the channel region */
|
|
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 VDMOStemp; /* operating temperature of this instance */
|
|
double VDMOSdtemp; /* operating temperature of the instance relative to circuit temperature*/
|
|
|
|
double VDMOStTransconductance; /* temperature corrected transconductance*/
|
|
double VDMOStPhi; /* temperature corrected Phi */
|
|
double VDMOStVto; /* temperature corrected Vto */
|
|
double VDMOStSatCur; /* temperature corrected saturation Cur. */
|
|
|
|
double VDMOSicVBS; /* initial condition B-S voltage */
|
|
double VDMOSicVDS; /* initial condition D-S voltage */
|
|
double VDMOSicVGS; /* initial condition G-S voltage */
|
|
double VDMOSvon;
|
|
double VDMOSvdsat;
|
|
double VDMOSsourceVcrit; /* Vcrit for pos. vds */
|
|
double VDMOSdrainVcrit; /* Vcrit for pos. vds */
|
|
double VDMOScd;
|
|
double VDMOScbs;
|
|
double VDMOScbd;
|
|
double VDMOSgmbs;
|
|
double VDMOSgm;
|
|
double VDMOSgds;
|
|
double VDMOSgbd;
|
|
double VDMOSgbs;
|
|
double VDMOScapbd;
|
|
double VDMOScapbs;
|
|
double VDMOSCbd;
|
|
double VDMOSCbs;
|
|
double VDMOSf2d;
|
|
double VDMOSf3d;
|
|
double VDMOSf4d;
|
|
double VDMOSf2s;
|
|
double VDMOSf3s;
|
|
double VDMOSf4s;
|
|
|
|
double VDIOcap;
|
|
double VDIOtSatCur; /* temperature corrected saturation Cur. density*/
|
|
double VDIOinitCond;
|
|
double VDIOtVcrit;
|
|
double VDIOtConductance;
|
|
double VDIOtBrkdwnV;
|
|
double VDIOtJctCap;
|
|
double VDIOtDepCap; /* temperature adjusted transition point in */
|
|
/* the cureve matching Fc * Vj */
|
|
double VDIOtJctPot; /* temperature corrected Bulk potential */
|
|
double VDIOtGradingCoeff;
|
|
|
|
double VDIOtTransitTime;
|
|
double VDIOtF1;
|
|
double VDIOtF2;
|
|
double VDIOtF3;
|
|
|
|
/*
|
|
* naming convention:
|
|
* x = vgs
|
|
* y = vbs
|
|
* z = vds
|
|
* cdr = cdrain
|
|
*/
|
|
|
|
#define VDMOSNDCOEFFS 30
|
|
|
|
#ifndef NODISTO
|
|
double VDMOSdCoeffs[VDMOSNDCOEFFS];
|
|
#else /* NODISTO */
|
|
double *VDMOSdCoeffs;
|
|
#endif /* NODISTO */
|
|
|
|
#ifndef CONFIG
|
|
|
|
#define capbs2 VDMOSdCoeffs[0]
|
|
#define capbs3 VDMOSdCoeffs[1]
|
|
#define capbd2 VDMOSdCoeffs[2]
|
|
#define capbd3 VDMOSdCoeffs[3]
|
|
#define gbs2 VDMOSdCoeffs[4]
|
|
#define gbs3 VDMOSdCoeffs[5]
|
|
#define gbd2 VDMOSdCoeffs[6]
|
|
#define gbd3 VDMOSdCoeffs[7]
|
|
#define capgb2 VDMOSdCoeffs[8]
|
|
#define capgb3 VDMOSdCoeffs[9]
|
|
#define cdr_x2 VDMOSdCoeffs[10]
|
|
#define cdr_y2 VDMOSdCoeffs[11]
|
|
#define cdr_z2 VDMOSdCoeffs[12]
|
|
#define cdr_xy VDMOSdCoeffs[13]
|
|
#define cdr_yz VDMOSdCoeffs[14]
|
|
#define cdr_xz VDMOSdCoeffs[15]
|
|
#define cdr_x3 VDMOSdCoeffs[16]
|
|
#define cdr_y3 VDMOSdCoeffs[17]
|
|
#define cdr_z3 VDMOSdCoeffs[18]
|
|
#define cdr_x2z VDMOSdCoeffs[19]
|
|
#define cdr_x2y VDMOSdCoeffs[20]
|
|
#define cdr_y2z VDMOSdCoeffs[21]
|
|
#define cdr_xy2 VDMOSdCoeffs[22]
|
|
#define cdr_xz2 VDMOSdCoeffs[23]
|
|
#define cdr_yz2 VDMOSdCoeffs[24]
|
|
#define cdr_xyz VDMOSdCoeffs[25]
|
|
#define capgs2 VDMOSdCoeffs[26]
|
|
#define capgs3 VDMOSdCoeffs[27]
|
|
#define capgd2 VDMOSdCoeffs[28]
|
|
#define capgd3 VDMOSdCoeffs[29]
|
|
|
|
#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 VDMOSlGiven :1;
|
|
unsigned VDMOSwGiven :1;
|
|
unsigned VDMOSdNodePrimeSet :1;
|
|
unsigned VDMOSsNodePrimeSet :1;
|
|
unsigned VDMOSicVBSGiven :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 *VDMOSBbPtr; /* pointer to sparse matrix element at
|
|
* (bulk node,bulk 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 *VDMOSGbPtr; /* pointer to sparse matrix element at
|
|
* (gate node,bulk node) */
|
|
double *VDMOSGdpPtr; /* pointer to sparse matrix element at
|
|
* (gate node,drain prime node) */
|
|
double *VDMOSGspPtr; /* pointer to sparse matrix element at
|
|
* (gate node,source prime node) */
|
|
double *VDMOSSspPtr; /* pointer to sparse matrix element at
|
|
* (source node,source prime node) */
|
|
double *VDMOSBdpPtr; /* pointer to sparse matrix element at
|
|
* (bulk node,drain prime node) */
|
|
double *VDMOSBspPtr; /* pointer to sparse matrix element at
|
|
* (bulk 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 *VDMOSBgPtr; /* pointer to sparse matrix element at
|
|
* (bulk node,gate 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 *VDMOSDPbPtr; /* pointer to sparse matrix element at
|
|
* (drain prime node,bulk node) */
|
|
double *VDMOSSPbPtr; /* pointer to sparse matrix element at
|
|
* (source prime node,bulk 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 *VDMOSGPbPtr; /* pointer to sparse matrix element at
|
|
* (gate prime node, bulk 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 *VDMOSBgpPtr; /* pointer to sparse matrix element at
|
|
* (bulk node, gate 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) */
|
|
|
|
} VDMOSinstance ;
|
|
|
|
#define VDMOSvbd VDMOSstates+ 0 /* bulk-drain voltage */
|
|
#define VDMOSvbs VDMOSstates+ 1 /* bulk-source voltage */
|
|
#define VDMOSvgs VDMOSstates+ 2 /* gate-source voltage */
|
|
#define VDMOSvds VDMOSstates+ 3 /* drain-source voltage */
|
|
|
|
#define VDMOScapgs VDMOSstates+4 /* gate-source capacitor value */
|
|
#define VDMOSqgs VDMOSstates+ 5 /* gate-source capacitor charge */
|
|
#define VDMOScqgs VDMOSstates+ 6 /* gate-source capacitor current */
|
|
|
|
#define VDMOScapgd VDMOSstates+ 7 /* gate-drain capacitor value */
|
|
#define VDMOSqgd VDMOSstates+ 8 /* gate-drain capacitor charge */
|
|
#define VDMOScqgd VDMOSstates+ 9 /* gate-drain capacitor current */
|
|
|
|
#define VDMOScapgb VDMOSstates+10 /* gate-bulk capacitor value */
|
|
#define VDMOSqgb VDMOSstates+ 11 /* gate-bulk capacitor charge */
|
|
#define VDMOScqgb VDMOSstates+ 12 /* gate-bulk capacitor current */
|
|
|
|
#define VDMOSqbd VDMOSstates+ 13 /* bulk-drain capacitor charge */
|
|
#define VDMOScqbd VDMOSstates+ 14 /* bulk-drain capacitor current */
|
|
|
|
#define VDMOSqbs VDMOSstates+ 15 /* bulk-source capacitor charge */
|
|
#define VDMOScqbs VDMOSstates+ 16 /* bulk-source capacitor current */
|
|
|
|
#define VDIOvoltage VDMOSstates+ 17
|
|
#define VDIOcurrent VDMOSstates+ 18
|
|
#define VDIOconduct VDMOSstates+ 19
|
|
#define VDIOcapCharge VDMOSstates+ 20
|
|
#define VDIOcapCurrent VDMOSstates+ 21
|
|
|
|
#define VDMOSnumStates 22
|
|
|
|
|
|
/* per model data */
|
|
|
|
/* NOTE: parameters marked 'input - use xxxx' are paramters 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 VDMOSsheetResistance;
|
|
double VDMOStransconductance; /* input - use tTransconductance */
|
|
double VDMOSoxideCapFactor;
|
|
double VDMOSvt0; /* input - use tVto */
|
|
double VDMOSphi; /* input - use tPhi */
|
|
double VDMOSlambda;
|
|
double VDMOSfNcoef;
|
|
double VDMOSfNexp;
|
|
double VDMOScgdmin;
|
|
double VDMOScgdmax;
|
|
double VDMOSa;
|
|
double VDMOScgs;
|
|
|
|
/* bulk diode */
|
|
double VDIOjunctionCap; /* input - use tCj */
|
|
double VDIOjunctionPot; /* input - use tBulkPot */
|
|
double VDIOdepletionCapCoeff;
|
|
double VDIOjctSatCur; /* input - use tSatCur */
|
|
double VDMOSDbv;
|
|
double VDMOSDibv;
|
|
double VDIObrkdEmissionCoeff;
|
|
double VDIOresistance;
|
|
double VDIOresistTemp1;
|
|
double VDIOresistTemp2;
|
|
double VDIOconductance;
|
|
double VDMOSDn;
|
|
double VDIOtransitTime;
|
|
double VDIOtranTimeTemp1;
|
|
double VDIOtranTimeTemp2;
|
|
double VDMOSDeg;
|
|
double VDMOSDxti;
|
|
double VDIOgradCoeff;
|
|
double VDIOgradCoeffTemp1;
|
|
double VDIOgradCoeffTemp2;
|
|
|
|
unsigned VDMOStypeGiven :1;
|
|
unsigned VDIOjctSatCurGiven :1;
|
|
unsigned VDMOSdrainResistanceGiven :1;
|
|
unsigned VDMOSsourceResistanceGiven :1;
|
|
unsigned VDMOSgateResistanceGiven :1;
|
|
unsigned VDMOStransconductanceGiven :1;
|
|
unsigned VDMOSvt0Given :1;
|
|
unsigned VDIOgradCoeffGiven :1;
|
|
unsigned VDIOdepletionCapCoeffGiven :1;
|
|
unsigned VDMOSphiGiven :1;
|
|
unsigned VDMOSlambdaGiven :1;
|
|
unsigned VDMOStnomGiven :1;
|
|
unsigned VDMOSfNcoefGiven :1;
|
|
unsigned VDMOSfNexpGiven :1;
|
|
|
|
unsigned VDMOScgdminGiven :1;
|
|
unsigned VDMOScgdmaxGiven :1;
|
|
unsigned VDMOScgsGiven :1;
|
|
unsigned VDMOSaGiven :1;
|
|
|
|
unsigned VDMOSDbvGiven :1;
|
|
unsigned VDMOSDibvGiven :1;
|
|
unsigned VDIOjunctionCapGiven :1;
|
|
unsigned VDIOjunctionPotGiven :1;
|
|
unsigned VDIObrkdEmissionCoeffGiven :1;
|
|
unsigned VDIOresistanceGiven :1;
|
|
unsigned VDMOSDnGiven :1;
|
|
unsigned VDIOtransitTimeGiven :1;
|
|
unsigned VDMOSDegGiven :1;
|
|
unsigned VDMOSDxtiGiven :1;
|
|
|
|
} VDMOSmodel;
|
|
|
|
#ifndef NMOS
|
|
#define NMOS 1
|
|
#define PMOS -1
|
|
#endif /*NMOS*/
|
|
|
|
/* device parameters */
|
|
enum {
|
|
VDMOS_W = 1,
|
|
VDMOS_L,
|
|
VDMOS_OFF,
|
|
VDMOS_IC,
|
|
VDMOS_IC_VBS,
|
|
VDMOS_IC_VDS,
|
|
VDMOS_IC_VGS,
|
|
VDMOS_CB,
|
|
VDMOS_CG,
|
|
VDMOS_CS,
|
|
VDMOS_POWER,
|
|
VDMOS_TEMP,
|
|
VDMOS_M,
|
|
VDMOS_DTEMP,
|
|
};
|
|
|
|
/* model paramerers */
|
|
enum {
|
|
VDMOS_MOD_VTO = 101,
|
|
VDMOS_MOD_KP,
|
|
VDMOS_MOD_PHI,
|
|
VDMOS_MOD_LAMBDA,
|
|
VDMOS_MOD_RD,
|
|
VDMOS_MOD_RS,
|
|
VDMOS_MOD_RG,
|
|
VDMOS_MOD_IS,
|
|
VDMOS_MOD_VJ,
|
|
VDMOS_MOD_CJ,
|
|
VDMOS_MOD_MJ,
|
|
VDMOS_MOD_FC,
|
|
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_RB,
|
|
VDMOS_MOD_BV,
|
|
VDMOS_MOD_IBV,
|
|
VDMOS_MOD_NBV,
|
|
VDMOS_MOD_N,
|
|
VDMOS_MOD_TT,
|
|
VDMOS_MOD_EG,
|
|
VDMOS_MOD_XTI,
|
|
};
|
|
|
|
/* device questions */
|
|
enum {
|
|
VDMOS_CGS = 201,
|
|
VDMOS_CGD,
|
|
VDMOS_CDS,
|
|
VDMOS_DNODE,
|
|
VDMOS_GNODE,
|
|
VDMOS_SNODE,
|
|
VDMOS_BNODE,
|
|
VDMOS_DNODEPRIME,
|
|
VDMOS_SNODEPRIME,
|
|
VDMOS_SOURCECONDUCT,
|
|
VDMOS_DRAINCONDUCT,
|
|
VDMOS_VON,
|
|
VDMOS_VDSAT,
|
|
VDMOS_SOURCEVCRIT,
|
|
VDMOS_DRAINVCRIT,
|
|
VDMOS_CD,
|
|
VDMOS_CBS,
|
|
VDMOS_CBD,
|
|
VDMOS_GMBS,
|
|
VDMOS_GM,
|
|
VDMOS_GDS,
|
|
VDMOS_GBD,
|
|
VDMOS_GBS,
|
|
VDMOS_CAPBD,
|
|
VDMOS_CAPBS,
|
|
VDMOS_VBD,
|
|
VDMOS_VBS,
|
|
VDMOS_VGS,
|
|
VDMOS_VDS,
|
|
VDMOS_CAPGS,
|
|
VDMOS_QGS,
|
|
VDMOS_CQGS,
|
|
VDMOS_CAPGD,
|
|
VDMOS_QGD,
|
|
VDMOS_CQGD,
|
|
VDMOS_CAPGB,
|
|
VDMOS_QGB,
|
|
VDMOS_CQGB,
|
|
VDMOS_QBD,
|
|
VDMOS_CQBD,
|
|
VDMOS_QBS,
|
|
VDMOS_CQBS,
|
|
VDMOS_SOURCERESIST,
|
|
VDMOS_DRAINRESIST,
|
|
};
|
|
|
|
/* model questions */
|
|
|
|
#include "vdmosext.h"
|
|
|
|
#endif /*VDMOS*/
|
|
|