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.
479 lines
13 KiB
479 lines
13 KiB
/**********
|
|
Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved.
|
|
Author: Trond Ytterdal
|
|
**********/
|
|
|
|
#ifndef MESA
|
|
#define MESA
|
|
|
|
#include "ngspice/ifsim.h"
|
|
#include "ngspice/cktdefs.h"
|
|
#include "ngspice/gendefs.h"
|
|
#include "ngspice/complex.h"
|
|
#include "ngspice/noisedef.h"
|
|
|
|
/* structures used to describe MESFET Transistors */
|
|
|
|
|
|
/* information used to describe a single instance */
|
|
|
|
typedef struct sMESAinstance {
|
|
|
|
struct GENinstance gen;
|
|
|
|
#define MESAmodPtr(inst) ((struct sMESAmodel *)((inst)->gen.GENmodPtr))
|
|
#define MESAnextInstance(inst) ((struct sMESAinstance *)((inst)->gen.GENnextInstance))
|
|
#define MESAname gen.GENname
|
|
#define MESAstate gen.GENstate
|
|
|
|
const int MESAdrainNode; /* number of drain node of MESAfet */
|
|
const int MESAgateNode; /* number of gate node of MESAfet */
|
|
const int MESAsourceNode; /* number of source node of MESAfet */
|
|
int MESAdrainPrimeNode; /* number of internal drain node of MESAfet */
|
|
int MESAgatePrimeNode; /* number of internal gate node of MESAfet */
|
|
int MESAsourcePrimeNode; /* number of internal source node of MESAfet */
|
|
int MESAsourcePrmPrmNode;
|
|
int MESAdrainPrmPrmNode;
|
|
double MESAlength; /* length of MESAfet */
|
|
double MESAwidth; /* width of MESAfet */
|
|
double MESAm; /* Parallel Multiplier */
|
|
double MESAicVDS; /* initial condition voltage D-S*/
|
|
double MESAicVGS; /* initial condition voltage G-S*/
|
|
double MESAtd; /* drain temperature */
|
|
double MESAts; /* source temperature */
|
|
double MESAdtemp; /* Instance temperature difference */
|
|
double MESAtVto;
|
|
double MESAtLambda;
|
|
double MESAtLambdahf;
|
|
double MESAtEta;
|
|
double MESAtMu;
|
|
double MESAtPhib;
|
|
double MESAtTheta;
|
|
double MESAtRsi;
|
|
double MESAtRdi;
|
|
double MESAtRs;
|
|
double MESAtRd;
|
|
double MESAtRg;
|
|
double MESAtRi;
|
|
double MESAtRf;
|
|
double MESAtGi;
|
|
double MESAtGf;
|
|
double MESAdrainConduct;
|
|
double MESAsourceConduct;
|
|
double MESAgateConduct;
|
|
double *MESAdrainDrainPrimePtr;
|
|
double *MESAgatePrimeDrainPrimePtr;
|
|
double *MESAgatePrimeSourcePrimePtr;
|
|
double *MESAsourceSourcePrimePtr;
|
|
double *MESAdrainPrimeDrainPtr;
|
|
double *MESAdrainPrimeGatePrimePtr;
|
|
double *MESAdrainPrimeSourcePrimePtr;
|
|
double *MESAsourcePrimeGatePrimePtr;
|
|
double *MESAsourcePrimeSourcePtr;
|
|
double *MESAsourcePrimeDrainPrimePtr;
|
|
double *MESAdrainDrainPtr;
|
|
double *MESAgatePrimeGatePrimePtr;
|
|
double *MESAsourceSourcePtr;
|
|
double *MESAdrainPrimeDrainPrimePtr;
|
|
double *MESAsourcePrimeSourcePrimePtr;
|
|
double *MESAgateGatePrimePtr;
|
|
double *MESAgatePrimeGatePtr;
|
|
double *MESAgateGatePtr;
|
|
double *MESAsourcePrmPrmSourcePrmPrmPtr;
|
|
double *MESAsourcePrmPrmSourcePrimePtr;
|
|
double *MESAsourcePrimeSourcePrmPrmPtr;
|
|
double *MESAsourcePrmPrmGatePrimePtr;
|
|
double *MESAgatePrimeSourcePrmPrmPtr;
|
|
double *MESAdrainPrmPrmDrainPrmPrmPtr;
|
|
double *MESAdrainPrmPrmDrainPrimePtr;
|
|
double *MESAdrainPrimeDrainPrmPrmPtr;
|
|
double *MESAdrainPrmPrmGatePrimePtr;
|
|
double *MESAgatePrimeDrainPrmPrmPtr;
|
|
|
|
#define MESAvgs MESAstate
|
|
#define MESAvgd MESAstate+1
|
|
#define MESAcg MESAstate+2
|
|
#define MESAcd MESAstate+3
|
|
#define MESAcgd MESAstate+4
|
|
#define MESAcgs MESAstate+5
|
|
#define MESAgm MESAstate+6
|
|
#define MESAgds MESAstate+7
|
|
#define MESAggs MESAstate+8
|
|
#define MESAggd MESAstate+9
|
|
#define MESAqgs MESAstate+10
|
|
#define MESAcqgs MESAstate+11
|
|
#define MESAqgd MESAstate+12
|
|
#define MESAcqgd MESAstate+13
|
|
#define MESAvgspp MESAstate+14
|
|
#define MESAggspp MESAstate+15
|
|
#define MESAcgspp MESAstate+16
|
|
#define MESAvgdpp MESAstate+17
|
|
#define MESAggdpp MESAstate+18
|
|
#define MESAcgdpp MESAstate+19
|
|
|
|
int MESAoff;
|
|
unsigned MESAlengthGiven : 1;
|
|
unsigned MESAwidthGiven : 1;
|
|
unsigned MESAmGiven : 1;
|
|
unsigned MESAicVDSGiven : 1;
|
|
unsigned MESAicVGSGiven : 1;
|
|
unsigned MESAtdGiven : 1;
|
|
unsigned MESAtsGiven : 1;
|
|
unsigned MESAdtempGiven : 1;
|
|
|
|
int MESAmode;
|
|
|
|
/*
|
|
* naming convention:
|
|
* x = vgs
|
|
* y = vgd
|
|
* z = vds
|
|
* cdr = cdrain
|
|
*/
|
|
|
|
#define MESANDCOEFFS 27
|
|
|
|
#ifndef NODISTO
|
|
double MESAdCoeffs[MESANDCOEFFS];
|
|
#else /* NODISTO */
|
|
double *MESAdCoeffs;
|
|
#endif /* NODISTO */
|
|
|
|
#ifndef CONFIG
|
|
|
|
#define cdr_x MESAdCoeffs[0]
|
|
#define cdr_z MESAdCoeffs[1]
|
|
#define cdr_x2 MESAdCoeffs[2]
|
|
#define cdr_z2 MESAdCoeffs[3]
|
|
#define cdr_xz MESAdCoeffs[4]
|
|
#define cdr_x3 MESAdCoeffs[5]
|
|
#define cdr_z3 MESAdCoeffs[6]
|
|
#define cdr_x2z MESAdCoeffs[7]
|
|
#define cdr_xz2 MESAdCoeffs[8]
|
|
|
|
#define ggs3 MESAdCoeffs[9]
|
|
#define ggd3 MESAdCoeffs[10]
|
|
#define ggs2 MESAdCoeffs[11]
|
|
#define ggd2 MESAdCoeffs[12]
|
|
|
|
#define qgs_x2 MESAdCoeffs[13]
|
|
#define qgs_y2 MESAdCoeffs[14]
|
|
#define qgs_xy MESAdCoeffs[15]
|
|
#define qgs_x3 MESAdCoeffs[16]
|
|
#define qgs_y3 MESAdCoeffs[17]
|
|
#define qgs_x2y MESAdCoeffs[18]
|
|
#define qgs_xy2 MESAdCoeffs[19]
|
|
|
|
#define qgd_x2 MESAdCoeffs[20]
|
|
#define qgd_y2 MESAdCoeffs[21]
|
|
#define qgd_xy MESAdCoeffs[22]
|
|
#define qgd_x3 MESAdCoeffs[23]
|
|
#define qgd_y3 MESAdCoeffs[24]
|
|
#define qgd_x2y MESAdCoeffs[25]
|
|
#define qgd_xy2 MESAdCoeffs[26]
|
|
|
|
#endif
|
|
|
|
/* indices to the array of MESAFET noise sources */
|
|
|
|
#define MESARDNOIZ 0
|
|
#define MESARSNOIZ 1
|
|
#define MESAIDNOIZ 2
|
|
#define MESAFLNOIZ 3
|
|
#define MESATOTNOIZ 4
|
|
|
|
#define MESANSRCS 5 /* the number of MESAFET noise sources */
|
|
|
|
#ifndef NONOISE
|
|
double MESAnVar[NSTATVARS][MESANSRCS];
|
|
#else /* NONOISE */
|
|
double **MESAnVar;
|
|
#endif /* NONOISE */
|
|
double MESAcsatfs;
|
|
double MESAcsatfd;
|
|
double MESAggrwl;
|
|
double MESAgchi0;
|
|
double MESAbeta;
|
|
double MESAisatb0;
|
|
double MESAimax;
|
|
double MESAcf;
|
|
double MESAfl;
|
|
double MESAdelf;
|
|
double MESAgds0;
|
|
double MESAgm0;
|
|
double MESAgm1;
|
|
double MESAgm2;
|
|
double MESAdelidvds0;
|
|
double MESAdelidvds1;
|
|
double MESAdelidgch0;
|
|
double MESAn0;
|
|
double MESAnsb0;
|
|
double MESAvcrits;
|
|
double MESAvcritd;
|
|
} MESAinstance ;
|
|
|
|
|
|
/* per model data */
|
|
|
|
typedef struct sMESAmodel { /* model structure for a MESAfet */
|
|
|
|
struct GENmodel gen;
|
|
|
|
#define MESAmodType gen.GENmodType
|
|
#define MESAnextModel(inst) ((struct sMESAmodel *)((inst)->gen.GENnextModel))
|
|
#define MESAinstances(inst) ((MESAinstance *)((inst)->gen.GENinstances))
|
|
#define MESAmodName gen.GENmodName
|
|
|
|
int MESAtype;
|
|
|
|
double MESAthreshold;
|
|
double MESAlambda;
|
|
double MESAbeta;
|
|
double MESAvs;
|
|
double MESAeta;
|
|
double MESAm;
|
|
double MESAmc;
|
|
double MESAalpha;
|
|
double MESAsigma0;
|
|
double MESAvsigmat;
|
|
double MESAvsigma;
|
|
double MESAmu;
|
|
double MESAtheta;
|
|
double MESAmu1;
|
|
double MESAmu2;
|
|
double MESAd;
|
|
double MESAnd;
|
|
double MESAdu;
|
|
double MESAndu;
|
|
double MESAth;
|
|
double MESAndelta;
|
|
double MESAdelta;
|
|
double MESAtc;
|
|
double MESArdi;
|
|
double MESArsi;
|
|
double MESAdrainResist;
|
|
double MESAsourceResist;
|
|
double MESAdrainConduct;
|
|
double MESAsourceConduct;
|
|
double MESAgateResist;
|
|
double MESAri;
|
|
double MESArf;
|
|
double MESAphib;
|
|
double MESAphib1;
|
|
double MESAastar;
|
|
double MESAggr;
|
|
double MESAdel;
|
|
double MESAxchi;
|
|
double MESAn;
|
|
double MESAtvto;
|
|
double MESAtlambda;
|
|
double MESAteta0;
|
|
double MESAteta1;
|
|
double MESAtmu;
|
|
double MESAxtm0;
|
|
double MESAxtm1;
|
|
double MESAxtm2;
|
|
double MESAks;
|
|
double MESAvsg;
|
|
double MESAlambdahf;
|
|
double MESAtf;
|
|
double MESAflo;
|
|
double MESAdelfo;
|
|
double MESAag;
|
|
double MESAtc1;
|
|
double MESAtc2;
|
|
double MESAzeta;
|
|
double MESAlevel;
|
|
double MESAnmax;
|
|
double MESAgamma;
|
|
double MESAepsi;
|
|
double MESAcbs;
|
|
double MESAcas;
|
|
double MESAvcrit;
|
|
|
|
double MESAsigma;
|
|
double MESAvpo;
|
|
double MESAvpou;
|
|
double MESAvpod;
|
|
double MESAdeltaSqr;
|
|
|
|
unsigned MESAthresholdGiven:1;
|
|
unsigned MESAlambdaGiven:1;
|
|
unsigned MESAbetaGiven:1;
|
|
unsigned MESAvsGiven:1;
|
|
unsigned MESAetaGiven:1;
|
|
unsigned MESAmGiven:1;
|
|
unsigned MESAmcGiven:1;
|
|
unsigned MESAalphaGiven:1;
|
|
unsigned MESAsigma0Given:1;
|
|
unsigned MESAvsigmatGiven:1;
|
|
unsigned MESAvsigmaGiven:1;
|
|
unsigned MESAmuGiven:1;
|
|
unsigned MESAthetaGiven:1;
|
|
unsigned MESAmu1Given:1;
|
|
unsigned MESAmu2Given:1;
|
|
unsigned MESAdGiven:1;
|
|
unsigned MESAndGiven:1;
|
|
unsigned MESAduGiven:1;
|
|
unsigned MESAnduGiven:1;
|
|
unsigned MESAthGiven:1;
|
|
unsigned MESAndeltaGiven:1;
|
|
unsigned MESAdeltaGiven:1;
|
|
unsigned MESAtcGiven:1;
|
|
unsigned MESArdiGiven:1;
|
|
unsigned MESArsiGiven:1;
|
|
unsigned MESAdrainResistGiven:1;
|
|
unsigned MESAsourceResistGiven:1;
|
|
unsigned MESAgateResistGiven:1;
|
|
unsigned MESAriGiven:1;
|
|
unsigned MESArfGiven:1;
|
|
unsigned MESAphibGiven:1;
|
|
unsigned MESAphib1Given:1;
|
|
unsigned MESAastarGiven:1;
|
|
unsigned MESAggrGiven:1;
|
|
unsigned MESAdelGiven:1;
|
|
unsigned MESAxchiGiven:1;
|
|
unsigned MESAnGiven:1;
|
|
unsigned MESAtvtoGiven:1;
|
|
unsigned MESAtlambdaGiven:1;
|
|
unsigned MESAteta0Given:1;
|
|
unsigned MESAteta1Given:1;
|
|
unsigned MESAtmuGiven:1;
|
|
unsigned MESAxtm0Given:1;
|
|
unsigned MESAxtm1Given:1;
|
|
unsigned MESAxtm2Given:1;
|
|
unsigned MESAksGiven:1;
|
|
unsigned MESAvsgGiven:1;
|
|
unsigned MESAlambdahfGiven:1;
|
|
unsigned MESAtfGiven:1;
|
|
unsigned MESAfloGiven:1;
|
|
unsigned MESAdelfoGiven:1;
|
|
unsigned MESAagGiven:1;
|
|
unsigned MESAtc1Given:1;
|
|
unsigned MESAtc2Given:1;
|
|
unsigned MESAzetaGiven:1;
|
|
unsigned MESAlevelGiven:1;
|
|
unsigned MESAnmaxGiven:1;
|
|
unsigned MESAgammaGiven:1;
|
|
unsigned MESAepsiGiven:1;
|
|
unsigned MESAcbsGiven:1;
|
|
unsigned MESAcasGiven:1;
|
|
|
|
} MESAmodel;
|
|
|
|
#ifndef NMF
|
|
|
|
#define NMF 1
|
|
#define PMF -1
|
|
#endif
|
|
|
|
/* device parameters */
|
|
#define MESA_LENGTH 1
|
|
#define MESA_WIDTH 2
|
|
#define MESA_IC_VDS 3
|
|
#define MESA_IC_VGS 4
|
|
#define MESA_TD 5
|
|
#define MESA_TS 6
|
|
#define MESA_IC 7
|
|
#define MESA_OFF 8
|
|
#define MESA_CS 9
|
|
#define MESA_POWER 10
|
|
#define MESA_DTEMP 11
|
|
#define MESA_M 12
|
|
|
|
/* model parameters */
|
|
#define MESA_MOD_VTO 101
|
|
#define MESA_MOD_VS 102
|
|
#define MESA_MOD_LAMBDA 103
|
|
#define MESA_MOD_RD 104
|
|
#define MESA_MOD_RS 105
|
|
#define MESA_MOD_RG 106
|
|
#define MESA_MOD_RI 107
|
|
#define MESA_MOD_RF 108
|
|
#define MESA_MOD_RDI 109
|
|
#define MESA_MOD_RSI 110
|
|
#define MESA_MOD_PHIB 111
|
|
#define MESA_MOD_PHIB1 112
|
|
#define MESA_MOD_ASTAR 113
|
|
#define MESA_MOD_GGR 114
|
|
#define MESA_MOD_DEL 115
|
|
#define MESA_MOD_XCHI 116
|
|
#define MESA_MOD_N 117
|
|
#define MESA_MOD_ETA 118
|
|
#define MESA_MOD_M 119
|
|
#define MESA_MOD_MC 120
|
|
#define MESA_MOD_SIGMA0 121
|
|
#define MESA_MOD_VSIGMAT 122
|
|
#define MESA_MOD_VSIGMA 123
|
|
#define MESA_MOD_MU 124
|
|
#define MESA_MOD_MU1 125
|
|
#define MESA_MOD_MU2 126
|
|
#define MESA_MOD_D 127
|
|
#define MESA_MOD_ND 128
|
|
#define MESA_MOD_DELTA 129
|
|
#define MESA_MOD_TC 130
|
|
#define MESA_MOD_NMF 131
|
|
#define MESA_MOD_TVTO 132
|
|
#define MESA_MOD_TLAMBDA 134
|
|
#define MESA_MOD_TETA0 135
|
|
#define MESA_MOD_TETA1 136
|
|
#define MESA_MOD_TMU 137
|
|
#define MESA_MOD_XTM0 138
|
|
#define MESA_MOD_XTM1 139
|
|
#define MESA_MOD_XTM2 140
|
|
#define MESA_MOD_KS 141
|
|
#define MESA_MOD_VSG 142
|
|
#define MESA_MOD_LAMBDAHF 143
|
|
#define MESA_MOD_TF 144
|
|
#define MESA_MOD_FLO 145
|
|
#define MESA_MOD_DELFO 146
|
|
#define MESA_MOD_AG 147
|
|
#define MESA_MOD_THETA 148
|
|
#define MESA_MOD_ALPHA 149
|
|
#define MESA_MOD_TC1 150
|
|
#define MESA_MOD_TC2 151
|
|
#define MESA_MOD_ZETA 152
|
|
#define MESA_MOD_BETA 153
|
|
#define MESA_MOD_DU 154
|
|
#define MESA_MOD_NDU 155
|
|
#define MESA_MOD_TH 156
|
|
#define MESA_MOD_NDELTA 157
|
|
#define MESA_MOD_LEVEL 158
|
|
#define MESA_MOD_NMAX 159
|
|
#define MESA_MOD_GAMMA 160
|
|
#define MESA_MOD_EPSI 161
|
|
#define MESA_MOD_CBS 162
|
|
#define MESA_MOD_CAS 163
|
|
#define MESA_MOD_PMF 164
|
|
#define MESA_MOD_TYPE 165
|
|
|
|
#define MESA_DRAINNODE 201
|
|
#define MESA_GATENODE 202
|
|
#define MESA_SOURCENODE 203
|
|
#define MESA_DRAINPRIMENODE 204
|
|
#define MESA_SOURCEPRIMENODE 205
|
|
#define MESA_GATEPRIMENODE 206
|
|
|
|
#define MESA_VGS 207
|
|
#define MESA_VGD 208
|
|
#define MESA_CG 209
|
|
#define MESA_CD 210
|
|
#define MESA_CGD 211
|
|
#define MESA_GM 212
|
|
#define MESA_GDS 213
|
|
#define MESA_GGS 214
|
|
#define MESA_GGD 215
|
|
#define MESA_QGS 216
|
|
#define MESA_CQGS 217
|
|
#define MESA_QGD 218
|
|
#define MESA_CQGD 219
|
|
|
|
#define MESA_MOD_DRAINCONDUCT 301
|
|
#define MESA_MOD_SOURCECONDUCT 302
|
|
#define MESA_MOD_GATECONDUCT 303
|
|
#define MESA_MOD_DEPLETIONCAP 304
|
|
#define MESA_MOD_VCRIT 305
|
|
|
|
#include "mesaext.h"
|
|
|
|
#endif /*MESA*/
|