File: net.h

package info (click to toggle)
irsim 9.7.75-1
  • links: PTS
  • area: main
  • in suites: wheezy
  • size: 2,596 kB
  • sloc: ansic: 24,733; sh: 6,803; makefile: 411; csh: 269; tcl: 76
file content (352 lines) | stat: -rw-r--r-- 11,902 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
/* 
 *     ********************************************************************* 
 *     * Copyright (C) 1988, 1990 Stanford University.                     * 
 *     * Permission to use, copy, modify, and distribute this              * 
 *     * software and its documentation for any purpose and without        * 
 *     * fee is hereby granted, provided that the above copyright          * 
 *     * notice appear in all copies.  Stanford University                 * 
 *     * makes no representations about the suitability of this            * 
 *     * software for any purpose.  It is provided "as is" without         * 
 *     * express or implied warranty.  Export of this software outside     * 
 *     * of the United States of America may require an export license.    * 
 *     ********************************************************************* 
 */

#ifndef _NET_H
#define _NET_H


/* header for event driven mosfet simulator.  Chris Terman (6/84) */

typedef struct Event	*evptr;
typedef struct Node	*nptr;
typedef struct Trans	*tptr;
typedef struct Input	*iptr;
typedef struct Tlist	*lptr;
typedef struct HistEnt	*hptr;
typedef struct Bits     *bptr;
typedef struct thevenin	*Thev;

#ifndef _LOCTYPES_H
#include "loctypes.h"
#endif

#ifdef USER_SUBCKT
#include "../usersubckt/subckt.h"
#endif

struct Tlist
  {
    lptr    next;		/* next list element */
    tptr    xtor;		/* txtor connected to this node */
  };


struct Event
  {
    evptr    flink, blink;	/* doubly-linked event list */
    evptr    nlink;		/* link for list of events for this node */
    nptr     enode;		/* node this event is all about */
    union
      {
	nptr  cause;		/* node which caused this event to happen */
	hptr  hist;		/* ptr. to history entry that queued this */
	Ulong  oldt;		/* original time for delayed events */
      } p;
    Ulong    ntime;		/* time, in DELTAs, of this event */
    long     delay;		/* delay associated with this event */
    short    rtime;		/* rise/fall time, in DELTAs */
    Uchar    eval;		/* new value */
    Uchar    type;		/* type of event (for incremental only) */
  };

typedef struct
  {
    short    delay;		      /* delay from input */
    short    rtime;		      /* rise/fall time */
  } RegTimes;

typedef struct
  {
    Uint    delay : 12;		      /* delay from input */
    Uint    rtime : 10;		      /* rise/fall time */
    Uint    ptime : 10;		      /* punt time */
  } PuntTimes;

typedef struct HistEnt
  {
    hptr     next;			      /* next transition in history */
    Ulong    time  : sizeof(Ulong) * 8 - 4;   /* time of transition */
    Uint     inp   : 1;			      /* 1 if node became an input */
    Uint     punt  : 1;			      /* 1 if this event was punted */
    Uint     val   : 2;			      /* value: HIGH, LOW, or X */
    union
      {
	RegTimes    r;
	PuntTimes   p;
	int	   xx;
      } t;
  } HistEnt;


#define	MAX_TIME	( (~((Ulong) 0)) >> 4 )	/* a huge time */
#define	TIME_BOUND	(MAX_TIME + 1)		/* out-of-bounds time value */

typedef struct	_aw {
	nptr	node;	/* (assertion) which node we will check */
	char	val ;	/* (assertion) does the node have this value? */
	char	*proc ; /* (schedule) procedure to apply under this condition */
	int	tag;	/* (schedule) tag number */
	struct	_aw *nxt ;
} assertWhen ;

typedef assertWhen *awptr;

struct Node
  {
    nptr     nlink;	/* sundries list */
    evptr    events;	/* charge sharing event */
    lptr     ngate;	/* list of xtors w/ gates connected to this node */
    lptr     nterm;	/* list of xtors w/ src/drn connected to this node */
    nptr     hnext;	/* link in hash bucket */
    float    ncap;	/* capacitance of node in pf */
    float    vlow;	/* low logic threshold for node, normalized units */
    float    vhigh;	/* high logic threshold for node, normalized units */
    short    tplh;	/* low to high transition time in DELTA's */
    short    tphl;	/* high to low transition time in DELTA's */
    union
      {
	Ulong  time;	/* time, in DELTAs, of last transistion */
	float  cap;	/* incremental capacitance during net-changes */
	evptr  event;	/* non threaded events in incremental simulation */
      } c;
    union
     {
	nptr  cause;	/* node which caused last transition of this node */
	hptr  punts;	/* punted events during incremental simulation */
	tptr  tran;	/* transistor into which stacked xtors were merged */
     } t;
    short    npot;	/* current potential */
    short    oldpot;	/* old potential (for incremental simulation). */
    long     nflags;	/* flag word (see defs below) */
    char     *nname;	/* ascii name of node */
    union
      {
	Thev  thev;	/* used to temporarily store the thevenin structure */
	nptr  next;	/* used to build node lists during net changes */
	tptr  tran;	/* used to mark parallel transistors */
      } n;
    HistEnt  head;	/* first entry in transition history */
    hptr     curr;	/* ptr. to current history entry */
#ifdef POWER_EST
    int	     toggles; /* number of transitions */
#endif /* POWER_EST */
#ifdef FAULT_SIM
    HistEnt  hchange;	/* special entry to avoid changing the history */ 
#endif
    char     awmask ;	 /* mask of values to cause evaluation of awpending */
    awptr    awpending ; /* pending asswertWhen list */
  };


typedef struct		/* same as Res_1 but indexed dynamic resists */
  {
    float  dynres[ 2 ];		/* dynamic resistances [R_LOW - R_MAX] */
    float  rstatic;		/* static resistance of transistor */
    Uint   width, length;	/* transistor size in centimicrons */
  } Resists;

#define	R_LOW		0		/* dynamic low resistance index */
#define	R_HIGH		1		/* dynamic high resistance index */

#define	dynlow		dynres[ R_LOW ]	/* abbrevations for above */
#define	dynhigh		dynres[ R_HIGH ]


typedef union
  {
    Thev  r;
    tptr  t;
    int   i;
 } TCache;

typedef union
  {
    long  pos;
    tptr  ptr;
  } TPos;

struct Trans
  {
    nptr     gate, source, drain;    /* nodes to which trans is connected */
    TCache   scache, dcache;	     /* caches to remember src/drn values */
    Uchar    ttype;		     /* type of transistor */
    Uchar    state;		     /* cache to remember current state */
    Uchar    tflags; 		     /* transistor flags */
    Uchar    n_par;		     /* index into parallel list */
    Resists  *r;		     /* transistor resistances */
    tptr     tlink;		     /* next txtor in position hash table */
    TPos     x, y;		     /* position in the layout (optional) */
#ifdef  USER_SUBCKT
    char     *subptr;                /* pointer to subcircuit structure */
#endif
  };


typedef struct Bits
  {
    bptr    next;		/* next bit vector in chain */
    char    *name;		/* name of this vector of bits */
    int     traced;		/* <>0 if this vector is being traced */
    int     nbits;		/* number of bits in this vector */
    nptr    nodes[1];		/* pointers to the bits (nodes) */
  } Bits;


	/* linked list of inputs */
struct Input
  {
    iptr    next;		/* next element of list */
    nptr    inode;		/* pointer to this input node */
  };


	/* transistor types (ttype) */
#define	NCHAN		0	/* n-channel enhancement */
#define	PCHAN		1	/* p-channel enhancement */
#define	DEP		2	/* depletion */
#define	RESIST		3	/* simple two-terminal resistor */
#define	TYPERESERVED	4	/* reserved for future transistor types */
#define	SUBCKT		5	/* black box user code */

#define	ALWAYSON	0x02	/* transistors not affected by gate logic */

#define	GATELIST	0x08	/* set if gate of xistor is a node list */
#define	STACKED		0x10	/* transistor was stacked into gate list */
#define	ORED		0x20	/* result of or'ing parallel transistors */
#define	ORLIST		0x40	/* part of an or'ed transistor */
#define	TCAP		0x80	/* transistor capacitor (source == drain) */

#ifndef	USER_SUBCKT
#define	NTTYPES		4	/* number of transistor types defined */
#else
#define	NTTYPES		6	/* number of transistor types defined */
#endif

#define	BASETYPE( T )		( (T) & 0x07 )

	/* transistor states (state)*/
#define	OFF		0	/* non-conducting */
#define	ON		1	/* conducting */
#define	UNKNOWN		2	/* unknown */
#define	WEAK		3	/* weak */

	/* transistor temporary flags (tflags) */
#define	CROSSED		0x01	/* Mark for crossing a transistor */
#define BROKEN		0x02	/* Mark a broken transistor to avoid loop */
#define	PBROKEN		0x04	/* Mark as broken a parallel transistor */
#define	PARALLEL	0x08	/* Mark as being a parallel transistor */
#define	ACTIVE_T	0x10	/* incremental status of transistor */

	/* figure what's on the *other* terminal node of a transistor */
#define	other_node( T, N )	((T)->drain == (N) ? (T)->source : (T)->drain)

	/* node potentials */
#define	LOW		0	/* logic low */
#define	X		1	/* unknown, intermediate, ... value */
#define	HIGH_Z		2	/* high impedence (not driven) */
#define	HIGH		3	/* logic high */
#define	N_POTS		4	/* number of potentials [LOW-HIGH] */

#define	DECAY		4	/* waiting to decay to X (only in events) */

	/* mask of node potentials, used by awpending */
#define POT2MASK( p )		( 1 << (1 + p) )

	/* possible values for nflags */
#define	DEVIATED	0x000001	/* node's state differs from hist */
#define	POWER_RAIL	0x000002
#define	ALIAS		0x000004
#define	USERDELAY	0x000008
#define	INPUT		0x000010
#define	WATCHED		0x000020
#define	WATCHVECTOR	0x000040
#define	STOPONCHANGE	0x000080
#define	STOPVECCHANGE	0x000100
#define	VISITED		0x000200

#define	MERGED		0x000400	/* node is whithin a txtor stack */
#define	DELETED		0x000800	/* node was deleted */

#define	H_INPUT		0x001000	/* node is in high input list */
#define	L_INPUT		0x002000	/* node is in low input list */
#define	U_INPUT		0x003000	/* node is in U input list */
#define	X_INPUT		0x004000	/* node is in X input list */

#define	INPUT_MASK		( H_INPUT | L_INPUT | X_INPUT | U_INPUT )
#define	IsInList( flg )		( (flg) & INPUT_MASK )
#define	INPUT_NUM( flg )	( ((flg) & INPUT_MASK) >> 12 )

#define	CHANGED		0x008000	/* node is affected by a net change */
#define	STIM		0x010000	/* node is used as stimuli */
#define	ACTIVE_CL	0x020000	/* node is in an active cluster */
#define	WAS_ACTIVE	0x040000	/* set if node was ever active */

#ifdef POWER_EST
#define	POWWATCHED	0x080000	/* node's capacitance is being logged*/
#define	POWWATCHVECTOR	0x100000	/* vector version */
#endif /* POWER_EST */

#define	SIM_ABORT	0x200000	/* set if unrecoverable error occurred */

	/* resistance types */
#define	STATIC		0	/* static resistance */
#define	DYNHIGH 	1	/* dynamic-high resistance */
#define	DYNLOW  	2	/* dynamic-low resistance */
#define	POWER		3	/* resist. for power calculation (unused) */
#define	R_TYPES		3	/* number of resistance contexts */

	/* Define TRUE and FALSE values */
#define TRUE  1
#define FALSE 0

	/* Possible simulator status */
#define	NORM_SIM		0		/* normal mode */
#define	INCR_SIM		01		/* incremental mode */
#define	OUT_OF_MEM		02		/* out of memory flag */

	/* Event Types (for incremental simulation only) */

#define	IS_INPUT		0x1		/* event makes node input */
#define	IS_XINPUT		0x2		/* event terminates input */

#define	REVAL			0x0		/* result of re-evaluation */
#define	DECAY_EV		0x1		/* node is decaying to X */
#define	PUNTED			0x3		/* previously punted event */

	/* events > THREAD are NOT threaded into node structure */
#define	THREAD			0x3

#define	PENDING			0x4		/* pending from last run */ 
#define	STIMULI			0x8		/* self-scheduled stimuli */
#define	STIM_INP		( STIMULI | IS_INPUT )
#define	STIM_XINP		( STIMULI | IS_XINPUT )

#define	CHECK_PNT		0x10		/* next change in history */
#define	INP_EV			( CHECK_PNT | IS_INPUT )
#define	XINP_EV			( CHECK_PNT | IS_XINPUT )
#define	DELAY_CHK		0x20		/* delayed CHECK_PNT */
#define	DELAY_EV		0x40		/* last REVAL was delayed */

#define	CHNG_MODEL		0x80		/* change evaluation model */
#define TRIGGER_EV      	0x90		/* faultsim trigger event */
#define TIMED_EV      		0xa0		/* timed trigger event */


	/* Conversion macros between various time units */

#ifndef _UNITS_H
#include "units.h"
#endif

#endif /* _NET_H */