107 lines
4.4 KiB
C
107 lines
4.4 KiB
C
/**********
|
|
Copyright 1991 Regents of the University of California. All rights reserved.
|
|
Authors: 1987 Karti Mayaram, 1991 David Gates
|
|
**********/
|
|
|
|
/* Member of CIDER device simulator
|
|
* Version: 1b1
|
|
*/
|
|
|
|
/*
|
|
* Two-Dimensional Numerical Device Data Structures
|
|
*/
|
|
|
|
#ifndef TWODEV_H
|
|
#define TWODEV_H
|
|
|
|
#include "gendev.h"
|
|
|
|
typedef struct sTWOdevice
|
|
{
|
|
double *dcSolution; /* solution vector for device */
|
|
double *dcDeltaSolution; /* delta solution vector */
|
|
double *copiedSolution; /* copy of the solution vector */
|
|
double *rhs; /* rhs vector */
|
|
double *rhsImag; /* imaginary part of rhs vector */
|
|
char *matrix; /* matrix for device equations */
|
|
int solverType; /* what is matrix set up to do */
|
|
int dimEquil; /* dimension in equilibrium */
|
|
int numOrigEquil; /* orig number of nz's in equilibrium */
|
|
int numFillEquil; /* fill number of nz's in equilibrium */
|
|
int dimBias; /* dimension under bias */
|
|
int numOrigBias; /* orig number of nz's under bias */
|
|
int numFillBias; /* fill number of nz's under bias */
|
|
int numEqns; /* number of equations */
|
|
int poissonOnly; /* flag for Poisson eqn solution */
|
|
struct sTWOelem **elements; /* 1D list of elements */
|
|
struct sTWOelem ***elemArray; /* 2D list of elements for printing */
|
|
double **devStates; /* device states */
|
|
double *xScale; /* array of X node locations */
|
|
double *yScale; /* array of Y node locations */
|
|
int numXNodes; /* number of X nodes */
|
|
int numYNodes; /* number of Y nodes */
|
|
int numNodes; /* total number of nodes */
|
|
int numEdges; /* total number of edges */
|
|
int numElems; /* total number of elements */
|
|
struct sTWOcontact *pFirstContact; /* first contact */
|
|
struct sTWOcontact *pLastContact; /* last contact */
|
|
struct sTWOchannel *pChannel; /* surface mobility channel */
|
|
struct sMaterialInfo *pMaterials; /* temp-dep material information */
|
|
struct sStatInfo *pStats; /* run-time statistics */
|
|
int converged; /* flag for device convergence */
|
|
int iterationNumber; /* device iteration counter */
|
|
double width; /* device width in CM */
|
|
double rhsNorm; /* norm of rhs vector */
|
|
double abstol; /* absolute tolerance for device */
|
|
double reltol; /* relative tolerance for device */
|
|
char *name; /* name of device */
|
|
} TWOdevice;
|
|
|
|
#define devState0 devStates[0]
|
|
#define devState1 devStates[1]
|
|
#define devState2 devStates[2]
|
|
#define devState3 devStates[3]
|
|
#define devState4 devStates[4]
|
|
#define devState5 devStates[5]
|
|
#define devState6 devStates[6]
|
|
#define devState7 devStates[7]
|
|
|
|
typedef struct sTWOcontact
|
|
{
|
|
struct sTWOcontact *next; /* pointer to next contact */
|
|
struct sTWOnode **pNodes; /* pointer to the contact nodes */
|
|
int numNodes; /* number of nodes in contact */
|
|
int id; /* unique contact identifier */
|
|
double workf; /* metal work function */
|
|
} TWOcontact;
|
|
|
|
/* Structure for channels.
|
|
* A channel is divided into 'columns' that are perpendicular to the
|
|
* channel's insulator/semiconductor interface. Each column begins
|
|
* at its 'seed', the closest semiconductor element to the interface.
|
|
* It is assumed that the current flows parallel to the interface.
|
|
*/
|
|
typedef struct sTWOchannel
|
|
{
|
|
struct sTWOchannel *next; /* pointer to next channel */
|
|
struct sTWOelem *pSeed; /* pointer to the seed element */
|
|
struct sTWOelem *pNElem; /* pointer to the insulator element */
|
|
int id; /* unique channel identifier */
|
|
int type; /* ID of direction to interface */
|
|
} TWOchannel;
|
|
|
|
struct mosConductances
|
|
{
|
|
double dIdDVdb;
|
|
double dIdDVsb;
|
|
double dIdDVgb;
|
|
double dIsDVdb;
|
|
double dIsDVsb;
|
|
double dIsDVgb;
|
|
double dIgDVdb;
|
|
double dIgDVsb;
|
|
double dIgDVgb;
|
|
};
|
|
|
|
#endif /* TWODEV_H */
|