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.
361 lines
14 KiB
361 lines
14 KiB
/**********
|
|
Copyright 1990 Regents of the University of California. All rights reserved.
|
|
Author: 1985 Thomas L. Quarles
|
|
Modified by Paolo Nenzi 2003 and Dietmar Warning 2012
|
|
**********/
|
|
#ifndef DIO
|
|
#define DIO
|
|
|
|
#include "ngspice/ifsim.h"
|
|
#include "ngspice/gendefs.h"
|
|
#include "ngspice/cktdefs.h"
|
|
#include "ngspice/complex.h"
|
|
#include "ngspice/noisedef.h"
|
|
|
|
/* data structures used to describe diodes */
|
|
|
|
|
|
/* information needed per instance */
|
|
|
|
typedef struct sDIOinstance {
|
|
|
|
struct GENinstance gen;
|
|
|
|
#define DIOmodPtr(inst) ((struct sDIOmodel *)((inst)->gen.GENmodPtr))
|
|
#define DIOnextInstance(inst) ((struct sDIOinstance *)((inst)->gen.GENnextInstance))
|
|
#define DIOname gen.GENname
|
|
#define DIOstate gen.GENstate
|
|
|
|
const int DIOposNode; /* number of positive node of diode */
|
|
const int DIOnegNode; /* number of negative node of diode */
|
|
int DIOposPrimeNode; /* number of positive prime node of diode */
|
|
|
|
double *DIOposPosPrimePtr; /* pointer to sparse matrix at
|
|
* (positive,positive prime) */
|
|
double *DIOnegPosPrimePtr; /* pointer to sparse matrix at
|
|
* (negative,positive prime) */
|
|
double *DIOposPrimePosPtr; /* pointer to sparse matrix at
|
|
* (positive prime,positive) */
|
|
double *DIOposPrimeNegPtr; /* pointer to sparse matrix at
|
|
* (positive prime,negative) */
|
|
double *DIOposPosPtr; /* pointer to sparse matrix at
|
|
* (positive,positive) */
|
|
double *DIOnegNegPtr; /* pointer to sparse matrix at
|
|
* (negative,negative) */
|
|
double *DIOposPrimePosPrimePtr; /* pointer to sparse matrix at
|
|
* (positive prime,positive prime) */
|
|
|
|
double DIOcap; /* stores the diode capacitance */
|
|
|
|
double *DIOsens; /* stores the perturbed values of geq and ceq in ac
|
|
sensitivity analyis */
|
|
|
|
int DIOsenParmNo ; /* parameter # for sensitivity use;
|
|
* set equal to 0 if not a design parameter*/
|
|
|
|
unsigned DIOoff : 1; /* 'off' flag for diode */
|
|
unsigned DIOareaGiven : 1; /* flag to indicate area was specified */
|
|
unsigned DIOpjGiven : 1; /* flag to indicate perimeter was specified */
|
|
unsigned DIOwGiven : 1; /* flag to indicate width was specified */
|
|
unsigned DIOlGiven : 1; /* flag to indicate length was specified */
|
|
unsigned DIOmGiven : 1; /* flag to indicate multiplier was specified */
|
|
|
|
unsigned DIOinitCondGiven : 1; /* flag to indicate ic was specified */
|
|
unsigned DIOsenPertFlag :1; /* indictes whether the the parameter of
|
|
the particular instance is to be perturbed */
|
|
unsigned DIOtempGiven : 1; /* flag to indicate temperature was specified */
|
|
unsigned DIOdtempGiven : 1; /* flag to indicate dtemp given */
|
|
|
|
double DIOarea; /* area factor for the diode */
|
|
double DIOpj; /* perimeter for the diode */
|
|
double DIOw; /* width for the diode */
|
|
double DIOl; /* length for the diode */
|
|
double DIOm; /* multiplier for the diode */
|
|
|
|
double DIOinitCond; /* initial condition */
|
|
double DIOtemp; /* temperature of the instance */
|
|
double DIOdtemp; /* delta temperature of instance */
|
|
double DIOtJctPot; /* temperature adjusted junction potential */
|
|
double DIOtJctCap; /* temperature adjusted junction capacitance */
|
|
double DIOtJctSWPot; /* temperature adjusted sidewall junction potential */
|
|
double DIOtJctSWCap; /* temperature adjusted sidewall junction capacitance */
|
|
double DIOtTransitTime; /* temperature adjusted transit time */
|
|
double DIOtGradingCoeff; /* temperature adjusted grading coefficient (MJ) */
|
|
double DIOtConductance; /* temperature adjusted series conductance */
|
|
|
|
double DIOtDepCap; /* temperature adjusted transition point in */
|
|
/* the curve matching (Fc * Vj ) */
|
|
double DIOtDepSWCap; /* temperature adjusted transition point in */
|
|
/* the curve matching (Fcs * Vjs ) */
|
|
double DIOtSatCur; /* temperature adjusted saturation current */
|
|
double DIOtSatSWCur; /* temperature adjusted side wall saturation current */
|
|
double DIOtTunSatCur; /* tunneling saturation current */
|
|
double DIOtTunSatSWCur; /* sidewall tunneling saturation current */
|
|
|
|
double DIOtVcrit; /* temperature adjusted V crit */
|
|
double DIOtF1; /* temperature adjusted f1 */
|
|
double DIOtBrkdwnV; /* temperature adjusted breakdown voltage */
|
|
|
|
double DIOtF2; /* coeff. for capacitance equation precomputation */
|
|
double DIOtF3; /* coeff. for capacitance equation precomputation */
|
|
double DIOtF2SW; /* coeff. for capacitance equation precomputation */
|
|
double DIOtF3SW; /* coeff. for capacitance equation precomputation */
|
|
|
|
double DIOforwardKneeCurrent; /* Forward Knee current */
|
|
double DIOreverseKneeCurrent; /* Reverse Knee current */
|
|
double DIOjunctionCap; /* geometry adjusted junction capacitance */
|
|
double DIOjunctionSWCap; /* geometry adjusted junction sidewall capacitance */
|
|
|
|
/*
|
|
* naming convention:
|
|
* x = vdiode
|
|
*/
|
|
|
|
/* the following are relevant to s.s. sinusoidal distortion analysis */
|
|
|
|
#define DIONDCOEFFS 6
|
|
|
|
#ifndef NODISTO
|
|
double DIOdCoeffs[DIONDCOEFFS];
|
|
#else /* NODISTO */
|
|
double *DIOdCoeffs;
|
|
#endif /* NODISTO */
|
|
|
|
#ifndef CONFIG
|
|
|
|
#define id_x2 DIOdCoeffs[0]
|
|
#define id_x3 DIOdCoeffs[1]
|
|
#define cdif_x2 DIOdCoeffs[2]
|
|
#define cdif_x3 DIOdCoeffs[3]
|
|
#define cjnc_x2 DIOdCoeffs[4]
|
|
#define cjnc_x3 DIOdCoeffs[5]
|
|
|
|
#endif
|
|
|
|
/* indices to array of diode noise sources */
|
|
|
|
#define DIORSNOIZ 0
|
|
#define DIOIDNOIZ 1
|
|
#define DIOFLNOIZ 2
|
|
#define DIOTOTNOIZ 3
|
|
|
|
#define DIONSRCS 4
|
|
|
|
#ifndef NONOISE
|
|
double DIOnVar[NSTATVARS][DIONSRCS];
|
|
#else /* NONOISE */
|
|
double **DIOnVar;
|
|
#endif /* NONOISE */
|
|
|
|
} DIOinstance ;
|
|
|
|
#define DIOsenGeq DIOsens /* stores the perturbed values of geq */
|
|
#define DIOsenCeq DIOsens + 3 /* stores the perturbed values of ceq */
|
|
#define DIOdphidp DIOsens + 6
|
|
|
|
|
|
#define DIOvoltage DIOstate
|
|
#define DIOcurrent DIOstate+1
|
|
#define DIOconduct DIOstate+2
|
|
#define DIOcapCharge DIOstate+3
|
|
#define DIOcapCurrent DIOstate+4
|
|
#define DIOsensxp DIOstate+5 /* charge sensitivities and their derivatives.
|
|
* +6 for the derivatives - pointer to the
|
|
* beginning of the array */
|
|
|
|
|
|
/* per model data */
|
|
|
|
typedef struct sDIOmodel { /* model structure for a diode */
|
|
|
|
struct GENmodel gen;
|
|
|
|
#define DIOmodType gen.GENmodType
|
|
#define DIOnextModel(inst) ((struct sDIOmodel *)((inst)->gen.GENnextModel))
|
|
#define DIOinstances(inst) ((DIOinstance *)((inst)->gen.GENinstances))
|
|
#define DIOmodName gen.GENmodName
|
|
|
|
unsigned DIOlevelGiven : 1;
|
|
unsigned DIOsatCurGiven : 1;
|
|
unsigned DIOsatSWCurGiven : 1;
|
|
|
|
unsigned DIOresistGiven : 1;
|
|
unsigned DIOresistTemp1Given : 1;
|
|
unsigned DIOresistTemp2Given : 1;
|
|
unsigned DIOemissionCoeffGiven : 1;
|
|
unsigned DIOswEmissionCoeffGiven : 1;
|
|
unsigned DIObrkdEmissionCoeffGiven : 1;
|
|
unsigned DIOtransitTimeGiven : 1;
|
|
unsigned DIOtranTimeTemp1Given : 1;
|
|
unsigned DIOtranTimeTemp2Given : 1;
|
|
unsigned DIOjunctionCapGiven : 1;
|
|
unsigned DIOjunctionPotGiven : 1;
|
|
unsigned DIOgradingCoeffGiven : 1;
|
|
unsigned DIOgradCoeffTemp1Given : 1;
|
|
unsigned DIOgradCoeffTemp2Given : 1;
|
|
unsigned DIOjunctionSWCapGiven : 1;
|
|
unsigned DIOjunctionSWPotGiven : 1;
|
|
unsigned DIOgradingSWCoeffGiven : 1;
|
|
unsigned DIOforwardKneeCurrentGiven : 1;
|
|
unsigned DIOreverseKneeCurrentGiven : 1;
|
|
|
|
unsigned DIOtlevGiven : 1;
|
|
unsigned DIOtlevcGiven : 1;
|
|
unsigned DIOactivationEnergyGiven : 1;
|
|
unsigned DIOsaturationCurrentExpGiven : 1;
|
|
unsigned DIOctaGiven : 1;
|
|
unsigned DIOctpGiven : 1;
|
|
unsigned DIOtpbGiven : 1;
|
|
unsigned DIOtphpGiven : 1;
|
|
unsigned DIOdepletionCapCoeffGiven : 1;
|
|
unsigned DIOdepletionSWcapCoeffGiven :1;
|
|
unsigned DIObreakdownVoltageGiven : 1;
|
|
unsigned DIObreakdownCurrentGiven : 1;
|
|
unsigned DIOtcvGiven : 1;
|
|
unsigned DIOnomTempGiven : 1;
|
|
unsigned DIOfNcoefGiven : 1;
|
|
unsigned DIOfNexpGiven : 1;
|
|
unsigned DIOareaGiven : 1;
|
|
unsigned DIOpjGiven : 1;
|
|
|
|
unsigned DIOtunSatCurGiven : 1;
|
|
unsigned DIOtunSatSWCurGiven : 1;
|
|
unsigned DIOtunEmissionCoeffGiven : 1;
|
|
unsigned DIOtunSaturationCurrentExpGiven : 1;
|
|
unsigned DIOtunEGcorrectionFactorGiven : 1;
|
|
unsigned DIOfv_maxGiven : 1;
|
|
unsigned DIObv_maxGiven : 1;
|
|
|
|
int DIOlevel; /* level selector */
|
|
double DIOsatCur; /* saturation current */
|
|
double DIOsatSWCur; /* Sidewall saturation current */
|
|
|
|
double DIOresist; /* ohmic series resistance */
|
|
double DIOresistTemp1; /* series resistance 1st order temp. coeff. */
|
|
double DIOresistTemp2; /* series resistance 2nd order temp. coeff. */
|
|
double DIOconductance; /* conductance corresponding to ohmic R */
|
|
double DIOemissionCoeff; /* emission coefficient (N) */
|
|
double DIOswEmissionCoeff; /* Sidewall emission coefficient (NS) */
|
|
double DIObrkdEmissionCoeff; /* Breakdown emission coefficient (NBV) */
|
|
double DIOtransitTime; /* transit time (TT) */
|
|
double DIOtranTimeTemp1; /* transit time 1st order coefficient */
|
|
double DIOtranTimeTemp2; /* transit time 2nd order coefficient */
|
|
double DIOjunctionCap; /* Junction Capacitance (Cj0) */
|
|
double DIOjunctionPot; /* Junction Potential (Vj) or (PB) */
|
|
double DIOgradingCoeff; /* grading coefficient (m) or (mj) */
|
|
double DIOgradCoeffTemp1; /* grading coefficient 1st order temp. coeff.*/
|
|
double DIOgradCoeffTemp2; /* grading coefficient 2nd order temp. coeff.*/
|
|
double DIOjunctionSWCap; /* Sidewall Junction Capacitance (Cjsw) */
|
|
double DIOjunctionSWPot; /* Sidewall Junction Potential (Vjsw) or (PBSW) */
|
|
double DIOgradingSWCoeff; /* Sidewall grading coefficient (mjsw) */
|
|
double DIOforwardKneeCurrent; /* Forward Knee current (IKF) */
|
|
double DIOreverseKneeCurrent; /* Reverse Knee current (IKR) */
|
|
|
|
int DIOtlev; /* Diode temperature equation selector */
|
|
int DIOtlevc; /* Diode temperature equation selector */
|
|
double DIOactivationEnergy; /* activation energy (EG) */
|
|
double DIOsaturationCurrentExp; /* Saturation current exponential (XTI) */
|
|
double DIOcta; /* Area junction temperature coefficient */
|
|
double DIOctp; /* Perimeter junction temperature coefficient */
|
|
double DIOtpb; /* Area junction potential temperature coefficient */
|
|
double DIOtphp; /* Perimeter junction potential temperature coefficient */
|
|
double DIOdepletionCapCoeff; /* Depletion Cap fraction coefficient (FC)*/
|
|
double DIOdepletionSWcapCoeff; /* Depletion sw-Cap fraction coefficient (FCS)*/
|
|
double DIObreakdownVoltage; /* Voltage at reverse breakdown */
|
|
double DIObreakdownCurrent; /* Current at above voltage */
|
|
double DIOtcv; /* Reverse breakdown voltage temperature coefficient */
|
|
double DIOarea; /* area factor for the diode */
|
|
double DIOpj; /* perimeter for the diode */
|
|
|
|
double DIOnomTemp; /* nominal temperature at which parms measured */
|
|
double DIOfNcoef;
|
|
double DIOfNexp;
|
|
|
|
double DIOtunSatCur; /* tunneling saturation current (JTUN) */
|
|
double DIOtunSatSWCur; /* sidewall tunneling saturation current (JTUNSW) */
|
|
double DIOtunEmissionCoeff; /* tunneling emission coefficient (NTUN) */
|
|
double DIOtunSaturationCurrentExp; /* exponent for the tunneling current temperature (XTITUN) */
|
|
double DIOtunEGcorrectionFactor; /* EG correction factor for tunneling (KEG) */
|
|
double DIOfv_max; /* maximum voltage in forward direction */
|
|
double DIObv_max; /* maximum voltage in reverse direction */
|
|
|
|
} DIOmodel;
|
|
|
|
/* device parameters */
|
|
#define DIO_AREA 1
|
|
#define DIO_IC 2
|
|
#define DIO_OFF 3
|
|
#define DIO_CURRENT 4
|
|
#define DIO_VOLTAGE 5
|
|
#define DIO_CHARGE 6
|
|
#define DIO_CAPCUR 7
|
|
#define DIO_CONDUCT 8
|
|
#define DIO_AREA_SENS 9
|
|
#define DIO_POWER 10
|
|
#define DIO_TEMP 11
|
|
#define DIO_QUEST_SENS_REAL 12
|
|
#define DIO_QUEST_SENS_IMAG 13
|
|
#define DIO_QUEST_SENS_MAG 14
|
|
#define DIO_QUEST_SENS_PH 15
|
|
#define DIO_QUEST_SENS_CPLX 16
|
|
#define DIO_QUEST_SENS_DC 17
|
|
#define DIO_CAP 18
|
|
#define DIO_PJ 19
|
|
#define DIO_W 20
|
|
#define DIO_L 21
|
|
#define DIO_M 22
|
|
#define DIO_DTEMP 23
|
|
|
|
/* model parameters */
|
|
#define DIO_MOD_LEVEL 100
|
|
#define DIO_MOD_IS 101
|
|
#define DIO_MOD_RS 102
|
|
#define DIO_MOD_N 103
|
|
#define DIO_MOD_TT 104
|
|
#define DIO_MOD_CJO 105
|
|
#define DIO_MOD_VJ 106
|
|
#define DIO_MOD_M 107
|
|
#define DIO_MOD_EG 108
|
|
#define DIO_MOD_XTI 109
|
|
#define DIO_MOD_FC 110
|
|
#define DIO_MOD_BV 111
|
|
#define DIO_MOD_IBV 112
|
|
#define DIO_MOD_D 113
|
|
#define DIO_MOD_COND 114
|
|
#define DIO_MOD_TNOM 115
|
|
#define DIO_MOD_KF 116
|
|
#define DIO_MOD_AF 117
|
|
#define DIO_MOD_JSW 118
|
|
#define DIO_MOD_CJSW 119
|
|
#define DIO_MOD_VJSW 120
|
|
#define DIO_MOD_MJSW 121
|
|
#define DIO_MOD_IKF 122
|
|
#define DIO_MOD_IKR 123
|
|
#define DIO_MOD_FCS 124
|
|
#define DIO_MOD_TTT1 125
|
|
#define DIO_MOD_TTT2 126
|
|
#define DIO_MOD_TM1 127
|
|
#define DIO_MOD_TM2 128
|
|
#define DIO_MOD_TRS 129
|
|
#define DIO_MOD_TRS2 130
|
|
#define DIO_MOD_TLEV 131
|
|
#define DIO_MOD_TLEVC 132
|
|
#define DIO_MOD_CTA 133
|
|
#define DIO_MOD_CTP 134
|
|
#define DIO_MOD_TPB 135
|
|
#define DIO_MOD_TPHP 136
|
|
#define DIO_MOD_TCV 137
|
|
#define DIO_MOD_NBV 138
|
|
#define DIO_MOD_AREA 139
|
|
#define DIO_MOD_PJ 140
|
|
#define DIO_MOD_NS 141
|
|
#define DIO_MOD_JTUN 142
|
|
#define DIO_MOD_JTUNSW 143
|
|
#define DIO_MOD_NTUN 144
|
|
#define DIO_MOD_XTITUN 145
|
|
#define DIO_MOD_KEG 146
|
|
#define DIO_MOD_FV_MAX 147
|
|
#define DIO_MOD_BV_MAX 148
|
|
|
|
#include "dioext.h"
|
|
#endif /*DIO*/
|