397 lines
12 KiB
C
397 lines
12 KiB
C
/*
|
|
* project.h
|
|
*
|
|
* Timing Simulator (ESWEC)
|
|
*
|
|
* Date: October 5, 1990
|
|
*
|
|
* Author: Shen Lin
|
|
*
|
|
* Copyright (C) University of California, Berkeley
|
|
*
|
|
*/
|
|
#ifndef ngspice_SWEC_H
|
|
#define ngspice_SWEC_H
|
|
|
|
/************************************************************
|
|
*
|
|
* Defines
|
|
*
|
|
************************************************************/
|
|
|
|
#define MainTitle " Timing Simulator\n"
|
|
#define MAXDEVICE 4
|
|
#define MAXMOS 31500 /* suggested value */
|
|
#define MAXDD 256 /* suggested value */
|
|
#define MAXVCCS 128 /* suggested value */
|
|
#define MAXTIME 1000000
|
|
#define MAXNODE 136
|
|
|
|
#define TAB_SIZE 8192 /* originally 2048 */
|
|
#define NUM_STEPS_PER_MICRON 10 /* 0.1 micron is the smallest step */
|
|
#define MAX_FET_SIZE 80 /* largest fet in microns */
|
|
#define Vol_Step 1.0e-3 /* voltage resolution */
|
|
#define SCL 1000.0 /* voltage scaler (1V/3mv) */
|
|
#define MAX_CP_TX_LINES 8 /* max number of coupled lines in
|
|
a multiconductor line system */
|
|
|
|
/************************************************************
|
|
*
|
|
* Macro
|
|
*
|
|
************************************************************/
|
|
#ifndef MAX
|
|
#define MAX(x, y) ((x) > (y) ? (x) : (y))
|
|
#endif
|
|
#ifndef MIN
|
|
#define MIN(x, y) ((x) < (y) ? (x) : (y))
|
|
#endif
|
|
#ifndef ABS
|
|
#define ABS(x) ((x) >= 0 ? (x) : (-(x)))
|
|
#endif
|
|
|
|
/************************************************************
|
|
*
|
|
* Data Structure Definitions
|
|
*
|
|
************************************************************/
|
|
|
|
typedef struct reglist REGLIST;
|
|
typedef struct node NODE;
|
|
typedef struct mosfet MOSFET;
|
|
typedef struct emosfet EMOSFET;
|
|
typedef struct diode DIODE;
|
|
typedef struct ediode EDIODE;
|
|
typedef struct vccs VCCS;
|
|
typedef struct evccs EVCCS;
|
|
typedef struct i_cap I_CAP;
|
|
typedef struct ei_cap EI_CAP;
|
|
typedef struct resistor RESISTOR;
|
|
typedef struct eresistor ERESISTOR;
|
|
typedef struct rline RLINE;
|
|
typedef struct erline ERLINE;
|
|
typedef struct txline TXLine;
|
|
typedef struct etxline ETXLine;
|
|
typedef struct cpline CPLine;
|
|
typedef struct ecpline ECPLine;
|
|
typedef struct bqueue BQUEUE;
|
|
typedef struct pqueue PQUEUE;
|
|
typedef struct ms_device MS_DEVICE;
|
|
typedef struct bp_device BP_DEVICE;
|
|
typedef struct dd_device DD_DEVICE;
|
|
|
|
struct mosfet{
|
|
int type; /* 1 : NMOS, 2 : PMOS */
|
|
MS_DEVICE *device; /* NULL if the nominal device model */
|
|
NODE *out_node;
|
|
NODE *in_node;
|
|
float Cs, Cd;
|
|
MOSFET *nx;
|
|
int time; /* instantaneous information */
|
|
float voltage, dvg; /* instantaneous information */
|
|
float vgN_1; /* gate voltage at previous event point */
|
|
float G; /* effective conductance at t(n) */
|
|
float effective; /* W over effective L */
|
|
int tabW; /* width in ns/um */
|
|
REGLIST *region; /* region associated with this mos */
|
|
/* NULL if driven by the node of the same region */
|
|
};
|
|
|
|
struct diode{
|
|
float Is; /* saturation current */
|
|
float Vj; /* junction potential */
|
|
double G;
|
|
NODE *in_node;
|
|
NODE *out_node;
|
|
DIODE *nx;
|
|
};
|
|
|
|
struct vccs{
|
|
float Is; /* saturation current */
|
|
NODE *in_node;
|
|
NODE *out_node;
|
|
NODE *pcv_node;
|
|
NODE *ncv_node;
|
|
DIODE *nx;
|
|
};
|
|
|
|
typedef struct {
|
|
char name[10]; /* device name */
|
|
int type; /* 1 : NMOS, 2 : PMOS */
|
|
int device_id; /* device id */
|
|
} DEVICENAME;
|
|
|
|
struct ms_device{
|
|
char name[10];
|
|
int used; /* device used in circuit flag */
|
|
float rho; /* device vsat denom param */
|
|
float alpha; /* device vsat denom vgg param */
|
|
float vt; /* device zero bias threshold voltage in mv*/
|
|
float gamma; /* device backgate bias vt param */
|
|
float fermi; /* device fermi potential in mv */
|
|
float theta; /* device backgate bias vt width param */
|
|
float mu; /* device vt width param */
|
|
float eta; /* device saturation slope */
|
|
float eta5; /* eta - 0.5 */
|
|
int pzld; /* positive lambda */
|
|
float lambda; /* channel-length modulation */
|
|
float kp; /* device conductance parameter */
|
|
float cgs0; /* gate-source overlap capacitance
|
|
per meter channel width */
|
|
float cgd0; /* gate-drain overlap capacitance
|
|
per meter channel width */
|
|
float cox; /* oxide-field capacitance
|
|
per square meter of gate area */
|
|
float cjsw; /* zero-biased junction sidewall capacitace
|
|
per meter of junction perimeter */
|
|
float cj0; /* zero-biased junction bottom capacitace
|
|
per square meter of junction area */
|
|
float keq; /* abrupt junction parameter */
|
|
|
|
float ld; /* lateral diffusion */
|
|
float *thresh;
|
|
float *sat;
|
|
float *dsat;
|
|
float *body;
|
|
float *gammod;
|
|
};
|
|
|
|
struct bp_device{
|
|
char name[10];
|
|
int type; /* 1 : NPN; 2 : PNP */
|
|
float rc; /* collector resistance */
|
|
float re; /* emitter resistance */
|
|
float rb; /* zero bias base resistance */
|
|
float Is; /* transport saturation current */
|
|
float Af; /* ideal maximum forward alpha */
|
|
float Ar; /* ideal maximum reverse alpha */
|
|
float Vje; /* B-E built-in potential */
|
|
float Vjc; /* B-C built-in potential */
|
|
};
|
|
|
|
struct dd_device{
|
|
char name[10];
|
|
float Is; /* saturation current */
|
|
float rs; /* ohmic resistance */
|
|
float Vj; /* junction potential */
|
|
};
|
|
|
|
typedef struct linked_lists_of_Bpoint{
|
|
struct linked_lists_of_Bpoint *next;
|
|
int time;
|
|
float voltage;
|
|
float slope;
|
|
} BPOINT, *BPOINTPTR;
|
|
|
|
typedef struct linked_lists_of_nodeName{
|
|
char id[256];
|
|
struct linked_lists_of_nodeName *left, *right;
|
|
NODE *nd;
|
|
} NDname, *NDnamePt;
|
|
|
|
struct node {
|
|
NDnamePt name;
|
|
EMOSFET *mptr; /* pointer to head of src/drn MOSFET list */
|
|
EMOSFET *gptr; /* pointer to head of gate MOSFET list */
|
|
EI_CAP *cptr; /* pointer to head of internodal cap list */
|
|
ERESISTOR *rptr; /* pointer to head of internodal resistor list */
|
|
ERLINE *rlptr; /* pointer to head of internodal TX line list */
|
|
ETXLine *tptr; /* pointer to head of transmission line list */
|
|
ECPLine *cplptr; /* pointer to head of coupled lines list */
|
|
EDIODE *ddptr; /* pointer to head of diode list */
|
|
EVCCS *vccsptr; /* pointer to head of VCCS list */
|
|
EVCCS *cvccsptr;/* pointer to head of controlled VCCS list */
|
|
NODE *next; /* pointer to next node */
|
|
REGLIST *region; /* region associated with this node */
|
|
NODE *base_ptr; /* group src/drn nodes into region */
|
|
/* charles 2,2 1/18/93
|
|
float V;
|
|
float dv; voltage at t(n-1) and slope at t(n)
|
|
*/
|
|
double V;
|
|
double dv;
|
|
double CL; /* grounded capacitance in F */
|
|
double gsum; /*^ sum of the equivalent conductance */
|
|
double cgsum; /*^ sum of the constant conductance */
|
|
double is; /*^ equivalent Is */
|
|
int tag; /* -2 : Vdd, -3 : Vss, -1 : initial value */
|
|
int flag; /*^ flag to show some features of the node */
|
|
PQUEUE *qptr; /*^ pointer to the entry in the queue or waiting list */
|
|
FILE *ofile; /* output file for the signal at this node */
|
|
/* NULL if not for print */
|
|
int dvtag;
|
|
};
|
|
|
|
struct reglist{
|
|
REGLIST *rnxt; /* pointer to next region */
|
|
NODE *nlist; /* node list */
|
|
MOSFET *mos;
|
|
I_CAP *cap;
|
|
RESISTOR *res;
|
|
TXLine *txl;
|
|
CPLine *cpl;
|
|
struct linked_lists_of_Bpoint *Bpoint; /* break points at primary inputs */
|
|
struct linked_lists_of_Bpoint *head; /* header of the break points at primary inputs */
|
|
int eTime; /* time when this region previously evaluated */
|
|
int DCvalue;
|
|
/* 1, 0, 2 : unknown, 3 : unchangeable 1, 4 : unchangeable 0 */
|
|
BQUEUE *prediction;
|
|
};
|
|
|
|
|
|
struct bqueue{
|
|
int key; /* time for the event to be fired, or DC weight */
|
|
BQUEUE *left;
|
|
BQUEUE *right;
|
|
BQUEUE *pred;
|
|
BQUEUE *pool;
|
|
REGLIST *region; /* region id */
|
|
};
|
|
|
|
struct pqueue {
|
|
NODE *node;
|
|
PQUEUE *next;
|
|
PQUEUE *prev;
|
|
};
|
|
|
|
struct i_cap {
|
|
NODE *in_node;
|
|
NODE *out_node;
|
|
float cap;
|
|
I_CAP *nx;
|
|
};
|
|
|
|
struct resistor {
|
|
NODE *in_node;
|
|
NODE *out_node;
|
|
float g; /* conductance */
|
|
int ifF; /* whether floating */
|
|
float g1; /* conductance for floating resistor */
|
|
RESISTOR *nx;
|
|
};
|
|
|
|
struct rline {
|
|
NODE *in_node;
|
|
NODE *out_node;
|
|
double g; /* conductance */
|
|
RLINE *nx;
|
|
};
|
|
|
|
typedef struct linked_lists_of_vi_txl{
|
|
struct linked_lists_of_vi_txl *next;
|
|
struct linked_lists_of_vi_txl *pool;
|
|
int time;
|
|
/* charles 2,2
|
|
float v_i, v_o;
|
|
float i_i, i_o;
|
|
*/
|
|
double v_i, v_o;
|
|
double i_i, i_o;
|
|
} VI_list_txl;
|
|
|
|
typedef struct linked_lists_of_vi{
|
|
struct linked_lists_of_vi *next;
|
|
struct linked_lists_of_vi *pool;
|
|
int time;
|
|
double v_i[MAX_CP_TX_LINES], v_o[MAX_CP_TX_LINES];
|
|
double i_i[MAX_CP_TX_LINES], i_o[MAX_CP_TX_LINES];
|
|
} VI_list;
|
|
|
|
typedef struct {
|
|
double c, x;
|
|
double cnv_i, cnv_o;
|
|
} TERM;
|
|
|
|
typedef struct {
|
|
int ifImg;
|
|
double aten;
|
|
TERM tm[3];
|
|
} TMS;
|
|
|
|
struct cpline {
|
|
int noL;
|
|
int ext;
|
|
double ratio[MAX_CP_TX_LINES];
|
|
double taul[MAX_CP_TX_LINES];
|
|
TMS *h1t[MAX_CP_TX_LINES][MAX_CP_TX_LINES];
|
|
TMS *h2t[MAX_CP_TX_LINES][MAX_CP_TX_LINES][MAX_CP_TX_LINES];
|
|
TMS *h3t[MAX_CP_TX_LINES][MAX_CP_TX_LINES][MAX_CP_TX_LINES];
|
|
double h1C[MAX_CP_TX_LINES][MAX_CP_TX_LINES];
|
|
double h2C[MAX_CP_TX_LINES][MAX_CP_TX_LINES][MAX_CP_TX_LINES];
|
|
double h3C[MAX_CP_TX_LINES][MAX_CP_TX_LINES][MAX_CP_TX_LINES];
|
|
double h1e[MAX_CP_TX_LINES][MAX_CP_TX_LINES][3];
|
|
NODE *in_node[MAX_CP_TX_LINES];
|
|
NODE *out_node[MAX_CP_TX_LINES];
|
|
int tag_i[MAX_CP_TX_LINES], tag_o[MAX_CP_TX_LINES];
|
|
CPLine *nx;
|
|
struct linked_lists_of_vi *vi_head;
|
|
struct linked_lists_of_vi *vi_tail;
|
|
double dc1[MAX_CP_TX_LINES], dc2[MAX_CP_TX_LINES];
|
|
};
|
|
|
|
struct txline {
|
|
int lsl; /* 1 if the line is lossless, otherwise 0 */
|
|
int ext; /* a flag, set if time step is greater than tau */
|
|
double ratio;
|
|
double taul;
|
|
double sqtCdL;
|
|
double h2_aten;
|
|
double h3_aten;
|
|
double h1C;
|
|
double h1e[3];
|
|
int ifImg;
|
|
NODE *in_node;
|
|
NODE *out_node;
|
|
int tag_i, tag_o;
|
|
TERM h1_term[3];
|
|
TERM h2_term[3];
|
|
TERM h3_term[6];
|
|
TXLine *nx;
|
|
struct linked_lists_of_vi_txl *vi_head;
|
|
struct linked_lists_of_vi_txl *vi_tail;
|
|
double dc1, dc2;
|
|
int newtp; /* flag indicating new time point */
|
|
};
|
|
|
|
struct evccs {
|
|
VCCS *vccs;
|
|
EVCCS *link;
|
|
};
|
|
|
|
struct ediode {
|
|
DIODE *dd;
|
|
EDIODE *link;
|
|
};
|
|
|
|
struct emosfet {
|
|
MOSFET *mos;
|
|
EMOSFET *link;
|
|
};
|
|
|
|
struct ei_cap {
|
|
I_CAP *cap;
|
|
EI_CAP *link;
|
|
};
|
|
|
|
struct eresistor {
|
|
RESISTOR *res;
|
|
ERESISTOR *link;
|
|
};
|
|
|
|
struct erline {
|
|
RLINE *rl;
|
|
ERLINE *link;
|
|
};
|
|
|
|
struct etxline {
|
|
TXLine *line;
|
|
ETXLine *link;
|
|
};
|
|
|
|
struct ecpline {
|
|
CPLine *line;
|
|
ECPLine *link;
|
|
};
|
|
|
|
#endif
|