xref: /plan9-contrib/sys/src/cmd/spin/spin.h (revision de2caf28f9ba1a56e70be94a699435d36eb50311)
1219b2ee8SDavid du Colombier /***** spin: spin.h *****/
2219b2ee8SDavid du Colombier 
3*de2caf28SDavid du Colombier /*
4*de2caf28SDavid du Colombier  * This file is part of the public release of Spin. It is subject to the
5*de2caf28SDavid du Colombier  * terms in the LICENSE file that is included in this source directory.
6*de2caf28SDavid du Colombier  * Tool documentation is available at http://spinroot.com
7*de2caf28SDavid du Colombier  */
8312a1df1SDavid du Colombier 
9312a1df1SDavid du Colombier #ifndef SEEN_SPIN_H
10312a1df1SDavid du Colombier #define SEEN_SPIN_H
11219b2ee8SDavid du Colombier 
12219b2ee8SDavid du Colombier #include <stdio.h>
13219b2ee8SDavid du Colombier #include <string.h>
147dd7cddfSDavid du Colombier #include <ctype.h>
15*de2caf28SDavid du Colombier #if !defined(WIN32) && !defined(WIN64)
16*de2caf28SDavid du Colombier  #include <unistd.h>
17*de2caf28SDavid du Colombier #endif
18219b2ee8SDavid du Colombier 
19*de2caf28SDavid du Colombier enum	    { INIV, PUTV, LOGV }; /* used in pangen1.c */
2000d97012SDavid du Colombier enum btypes { NONE, N_CLAIM, I_PROC, A_PROC, P_PROC, E_TRACE, N_TRACE };
2100d97012SDavid du Colombier 
22219b2ee8SDavid du Colombier typedef struct Lextok {
23219b2ee8SDavid du Colombier 	unsigned short	ntyp;	/* node type */
24219b2ee8SDavid du Colombier 	short	ismtyp;		/* CONST derived from MTYP */
25219b2ee8SDavid du Colombier 	int	val;		/* value attribute */
26219b2ee8SDavid du Colombier 	int	ln;		/* line number */
27219b2ee8SDavid du Colombier 	int	indstep;	/* part of d_step sequence */
2800d97012SDavid du Colombier 	int	uiid;		/* inline id, if non-zero */
29219b2ee8SDavid du Colombier 	struct Symbol	*fn;	/* file name */
307dd7cddfSDavid du Colombier 	struct Symbol	*sym;	/* symbol reference */
31219b2ee8SDavid du Colombier         struct Sequence *sq;	/* sequence */
32219b2ee8SDavid du Colombier         struct SeqList	*sl;	/* sequence list */
33219b2ee8SDavid du Colombier 	struct Lextok	*lft, *rgt; /* children in parse tree */
34219b2ee8SDavid du Colombier } Lextok;
35219b2ee8SDavid du Colombier 
36312a1df1SDavid du Colombier typedef struct Slicer {
37312a1df1SDavid du Colombier 	Lextok	*n;		/* global var, usable as slice criterion */
38312a1df1SDavid du Colombier 	short	code;		/* type of use: DEREF_USE or normal USE */
39312a1df1SDavid du Colombier 	short	used;		/* set when handled */
40312a1df1SDavid du Colombier 	struct Slicer *nxt;	/* linked list */
41312a1df1SDavid du Colombier } Slicer;
42312a1df1SDavid du Colombier 
437dd7cddfSDavid du Colombier typedef struct Access {
447dd7cddfSDavid du Colombier 	struct Symbol	*who;	/* proctype name of accessor */
457dd7cddfSDavid du Colombier 	struct Symbol	*what;	/* proctype name of accessed */
467dd7cddfSDavid du Colombier 	int	cnt, typ;	/* parameter nr and, e.g., 's' or 'r' */
477dd7cddfSDavid du Colombier 	struct Access	*lnk;	/* linked list */
487dd7cddfSDavid du Colombier } Access;
497dd7cddfSDavid du Colombier 
50219b2ee8SDavid du Colombier typedef struct Symbol {
51219b2ee8SDavid du Colombier 	char	*name;
52219b2ee8SDavid du Colombier 	int	Nid;		/* unique number for the name */
537dd7cddfSDavid du Colombier 	unsigned short	type;	/* bit,short,.., chan,struct  */
547dd7cddfSDavid du Colombier 	unsigned char	hidden; /* bit-flags:
557dd7cddfSDavid du Colombier 				   1=hide, 2=show,
567dd7cddfSDavid du Colombier 				   4=bit-equiv,   8=byte-equiv,
577dd7cddfSDavid du Colombier 				  16=formal par, 32=inline par,
58f3793cddSDavid du Colombier 				  64=treat as if local; 128=read at least once
597dd7cddfSDavid du Colombier 				 */
60312a1df1SDavid du Colombier 	unsigned char	colnr;	/* for use with xspin during simulation */
6100d97012SDavid du Colombier 	unsigned char	isarray; /* set if decl specifies array bound */
6200d97012SDavid du Colombier 	unsigned char	*bscp;	/* block scope */
63*de2caf28SDavid du Colombier 	int	sc;		/* scope seq no -- set only for proctypes */
64312a1df1SDavid du Colombier 	int	nbits;		/* optional width specifier */
65219b2ee8SDavid du Colombier 	int	nel;		/* 1 if scalar, >1 if array   */
66219b2ee8SDavid du Colombier 	int	setat;		/* last depth value changed   */
67219b2ee8SDavid du Colombier 	int	*val;		/* runtime value(s), initl 0  */
68312a1df1SDavid du Colombier 	Lextok	**Sval;	/* values for structures */
69219b2ee8SDavid du Colombier 
70219b2ee8SDavid du Colombier 	int	xu;		/* exclusive r or w by 1 pid  */
71219b2ee8SDavid du Colombier 	struct Symbol	*xup[2];  /* xr or xs proctype  */
727dd7cddfSDavid du Colombier 	struct Access	*access;/* e.g., senders and receives of chan */
73312a1df1SDavid du Colombier 	Lextok	*ini;	/* initial value, or chan-def */
74312a1df1SDavid du Colombier 	Lextok	*Slst;	/* template for structure if struct */
75*de2caf28SDavid du Colombier 	struct Symbol	*mtype_name; /* if type == MTYPE else nil */
76219b2ee8SDavid du Colombier 	struct Symbol	*Snm;	/* name of the defining struct */
77219b2ee8SDavid du Colombier 	struct Symbol	*owner;	/* set for names of subfields in typedefs */
78219b2ee8SDavid du Colombier 	struct Symbol	*context; /* 0 if global, or procname */
79219b2ee8SDavid du Colombier 	struct Symbol	*next;	/* linked list */
80219b2ee8SDavid du Colombier } Symbol;
81219b2ee8SDavid du Colombier 
827dd7cddfSDavid du Colombier typedef struct Ordered {	/* links all names in Symbol table */
837dd7cddfSDavid du Colombier 	struct Symbol	*entry;
847dd7cddfSDavid du Colombier 	struct Ordered	*next;
857dd7cddfSDavid du Colombier } Ordered;
867dd7cddfSDavid du Colombier 
87*de2caf28SDavid du Colombier typedef struct Mtypes_t {
88*de2caf28SDavid du Colombier 	char	*nm;	/* name of mtype, or "_unnamed_" */
89*de2caf28SDavid du Colombier 	Lextok	*mt;	/* the linked list of names */
90*de2caf28SDavid du Colombier 	struct Mtypes_t *nxt;	/* linked list of mtypes */
91*de2caf28SDavid du Colombier } Mtypes_t;
92*de2caf28SDavid du Colombier 
93219b2ee8SDavid du Colombier typedef struct Queue {
94219b2ee8SDavid du Colombier 	short	qid;		/* runtime q index */
95312a1df1SDavid du Colombier 	int	qlen;		/* nr messages stored */
96312a1df1SDavid du Colombier 	int	nslots, nflds;	/* capacity, flds/slot */
97219b2ee8SDavid du Colombier 	int	setat;		/* last depth value changed */
98219b2ee8SDavid du Colombier 	int	*fld_width;	/* type of each field */
997dd7cddfSDavid du Colombier 	int	*contents;	/* the values stored */
1007dd7cddfSDavid du Colombier 	int	*stepnr;	/* depth when each msg was sent */
101*de2caf28SDavid du Colombier 	char	**mtp;		/* if mtype, name of list, else 0 */
102219b2ee8SDavid du Colombier 	struct Queue	*nxt;	/* linked list */
103219b2ee8SDavid du Colombier } Queue;
104219b2ee8SDavid du Colombier 
1057dd7cddfSDavid du Colombier typedef struct FSM_state {	/* used in pangen5.c - dataflow */
1067dd7cddfSDavid du Colombier 	int from;		/* state number */
1077dd7cddfSDavid du Colombier 	int seen;		/* used for dfs */
1087dd7cddfSDavid du Colombier 	int in;			/* nr of incoming edges */
109312a1df1SDavid du Colombier 	int cr;			/* has reachable 1-relevant successor */
110312a1df1SDavid du Colombier 	int scratch;
111312a1df1SDavid du Colombier 	unsigned long *dom, *mod; /* to mark dominant nodes */
112312a1df1SDavid du Colombier 	struct FSM_trans *t;	/* outgoing edges */
113312a1df1SDavid du Colombier 	struct FSM_trans *p;	/* incoming edges, predecessors */
1147dd7cddfSDavid du Colombier 	struct FSM_state *nxt;	/* linked list of all states */
1157dd7cddfSDavid du Colombier } FSM_state;
1167dd7cddfSDavid du Colombier 
117312a1df1SDavid du Colombier typedef struct FSM_trans {	/* used in pangen5.c - dataflow */
118312a1df1SDavid du Colombier 	int to;
119312a1df1SDavid du Colombier 	short	relevant;	/* when sliced */
120312a1df1SDavid du Colombier 	short	round;		/* ditto: iteration when marked */
121312a1df1SDavid du Colombier 	struct FSM_use *Val[2];	/* 0=reads, 1=writes */
122312a1df1SDavid du Colombier 	struct Element *step;
123312a1df1SDavid du Colombier 	struct FSM_trans *nxt;
124312a1df1SDavid du Colombier } FSM_trans;
125312a1df1SDavid du Colombier 
126312a1df1SDavid du Colombier typedef struct FSM_use {	/* used in pangen5.c - dataflow */
127312a1df1SDavid du Colombier 	Lextok *n;
128312a1df1SDavid du Colombier 	Symbol *var;
129312a1df1SDavid du Colombier 	int special;
130312a1df1SDavid du Colombier 	struct FSM_use *nxt;
131312a1df1SDavid du Colombier } FSM_use;
132312a1df1SDavid du Colombier 
133219b2ee8SDavid du Colombier typedef struct Element {
134219b2ee8SDavid du Colombier 	Lextok	*n;		/* defines the type & contents */
135219b2ee8SDavid du Colombier 	int	Seqno;		/* identifies this el within system */
136219b2ee8SDavid du Colombier 	int	seqno;		/* identifies this el within a proc */
1377dd7cddfSDavid du Colombier 	int	merge;		/* set by -O if step can be merged */
1387dd7cddfSDavid du Colombier 	int	merge_start;
1397dd7cddfSDavid du Colombier 	int	merge_single;
1407dd7cddfSDavid du Colombier 	short	merge_in;	/* nr of incoming edges */
1417dd7cddfSDavid du Colombier 	short	merge_mark;	/* state was generated in merge sequence */
14200d97012SDavid du Colombier 	unsigned int	status;	/* used by analyzer generator  */
1437dd7cddfSDavid du Colombier 	struct FSM_use	*dead;	/* optional dead variable list */
144219b2ee8SDavid du Colombier 	struct SeqList	*sub;	/* subsequences, for compounds */
145219b2ee8SDavid du Colombier 	struct SeqList	*esc;	/* zero or more escape sequences */
146219b2ee8SDavid du Colombier 	struct Element	*Nxt;	/* linked list - for global lookup */
147219b2ee8SDavid du Colombier 	struct Element	*nxt;	/* linked list - program structure */
148219b2ee8SDavid du Colombier } Element;
149219b2ee8SDavid du Colombier 
150219b2ee8SDavid du Colombier typedef struct Sequence {
151219b2ee8SDavid du Colombier 	Element	*frst;
152219b2ee8SDavid du Colombier 	Element	*last;		/* links onto continuations */
153219b2ee8SDavid du Colombier 	Element *extent;	/* last element in original */
154*de2caf28SDavid du Colombier 	int	minel;		/* minimum Seqno, set and used only in guided.c */
1557dd7cddfSDavid du Colombier 	int	maxel;		/* 1+largest id in sequence */
156219b2ee8SDavid du Colombier } Sequence;
157219b2ee8SDavid du Colombier 
158219b2ee8SDavid du Colombier typedef struct SeqList {
159219b2ee8SDavid du Colombier 	Sequence	*this;	/* one sequence */
160219b2ee8SDavid du Colombier 	struct SeqList	*nxt;	/* linked list  */
161219b2ee8SDavid du Colombier } SeqList;
162219b2ee8SDavid du Colombier 
163219b2ee8SDavid du Colombier typedef struct Label {
164219b2ee8SDavid du Colombier 	Symbol	*s;
165219b2ee8SDavid du Colombier 	Symbol	*c;
166219b2ee8SDavid du Colombier 	Element	*e;
16700d97012SDavid du Colombier 	int	uiid;		/* non-zero if label appears in an inline */
168312a1df1SDavid du Colombier 	int	visible;	/* label referenced in claim (slice relevant) */
169219b2ee8SDavid du Colombier 	struct Label	*nxt;
170219b2ee8SDavid du Colombier } Label;
171219b2ee8SDavid du Colombier 
172219b2ee8SDavid du Colombier typedef struct Lbreak {
173219b2ee8SDavid du Colombier 	Symbol	*l;
174219b2ee8SDavid du Colombier 	struct Lbreak	*nxt;
175219b2ee8SDavid du Colombier } Lbreak;
176219b2ee8SDavid du Colombier 
177*de2caf28SDavid du Colombier typedef struct L_List {
178*de2caf28SDavid du Colombier 	Lextok *n;
179*de2caf28SDavid du Colombier 	struct L_List	*nxt;
180*de2caf28SDavid du Colombier } L_List;
181*de2caf28SDavid du Colombier 
182219b2ee8SDavid du Colombier typedef struct RunList {
183219b2ee8SDavid du Colombier 	Symbol	*n;		/* name            */
184219b2ee8SDavid du Colombier 	int	tn;		/* ordinal of type */
185219b2ee8SDavid du Colombier 	int	pid;		/* process id      */
1867dd7cddfSDavid du Colombier 	int	priority;	/* for simulations only */
18700d97012SDavid du Colombier 	enum btypes b;		/* the type of process */
188219b2ee8SDavid du Colombier 	Element	*pc;		/* current stmnt   */
189219b2ee8SDavid du Colombier 	Sequence *ps;		/* used by analyzer generator */
1907dd7cddfSDavid du Colombier 	Lextok	*prov;		/* provided clause */
191219b2ee8SDavid du Colombier 	Symbol	*symtab;	/* local variables */
192219b2ee8SDavid du Colombier 	struct RunList	*nxt;	/* linked list */
193219b2ee8SDavid du Colombier } RunList;
194219b2ee8SDavid du Colombier 
195219b2ee8SDavid du Colombier typedef struct ProcList {
196219b2ee8SDavid du Colombier 	Symbol	*n;		/* name       */
197219b2ee8SDavid du Colombier 	Lextok	*p;		/* parameters */
198219b2ee8SDavid du Colombier 	Sequence *s;		/* body       */
1997dd7cddfSDavid du Colombier 	Lextok	*prov;		/* provided clause */
20000d97012SDavid du Colombier 	enum btypes b;		/* e.g., claim, trace, proc */
2017dd7cddfSDavid du Colombier 	short	tn;		/* ordinal number */
20200d97012SDavid du Colombier 	unsigned char	det;	/* deterministic */
20300d97012SDavid du Colombier 	unsigned char   unsafe;	/* contains global var inits */
204*de2caf28SDavid du Colombier 	unsigned char	priority; /* process priority, if any */
205219b2ee8SDavid du Colombier 	struct ProcList	*nxt;	/* linked list */
206219b2ee8SDavid du Colombier } ProcList;
207219b2ee8SDavid du Colombier 
208*de2caf28SDavid du Colombier typedef struct QH {
209*de2caf28SDavid du Colombier 	int	n;
210*de2caf28SDavid du Colombier 	struct	QH *nxt;
211*de2caf28SDavid du Colombier } QH;
212*de2caf28SDavid du Colombier 
213219b2ee8SDavid du Colombier typedef	Lextok *Lexptr;
214219b2ee8SDavid du Colombier 
215219b2ee8SDavid du Colombier #define YYSTYPE	Lexptr
216219b2ee8SDavid du Colombier 
217219b2ee8SDavid du Colombier #define ZN	(Lextok *)0
218219b2ee8SDavid du Colombier #define ZS	(Symbol *)0
219219b2ee8SDavid du Colombier #define ZE	(Element *)0
220219b2ee8SDavid du Colombier 
221219b2ee8SDavid du Colombier #define DONE	  1     	/* status bits of elements */
222219b2ee8SDavid du Colombier #define ATOM	  2     	/* part of an atomic chain */
223219b2ee8SDavid du Colombier #define L_ATOM	  4     	/* last element in a chain */
224219b2ee8SDavid du Colombier #define I_GLOB    8		/* inherited global ref    */
225219b2ee8SDavid du Colombier #define DONE2	 16		/* used in putcode and main*/
226219b2ee8SDavid du Colombier #define D_ATOM	 32		/* deterministic atomic    */
2277dd7cddfSDavid du Colombier #define ENDSTATE 64		/* normal endstate         */
22800d97012SDavid du Colombier #define CHECK2	128		/* status bits for remote ref check */
22900d97012SDavid du Colombier #define CHECK3	256		/* status bits for atomic jump check */
230219b2ee8SDavid du Colombier 
231219b2ee8SDavid du Colombier #define Nhash	255    		/* slots in symbol hash-table */
232219b2ee8SDavid du Colombier 
233219b2ee8SDavid du Colombier #define XR	  	1	/* non-shared receive-only */
234219b2ee8SDavid du Colombier #define XS	  	2	/* non-shared send-only    */
235219b2ee8SDavid du Colombier #define XX	  	4	/* overrides XR or XS tag  */
236219b2ee8SDavid du Colombier 
237312a1df1SDavid du Colombier #define CODE_FRAG	2	/* auto-numbered code-fragment */
238312a1df1SDavid du Colombier #define CODE_DECL	4	/* auto-numbered c_decl */
239312a1df1SDavid du Colombier #define PREDEF	  	3	/* predefined name: _p, _last */
240312a1df1SDavid du Colombier 
2417dd7cddfSDavid du Colombier #define UNSIGNED  5		/* val defines width in bits */
242219b2ee8SDavid du Colombier #define BIT	  1		/* also equal to width in bits */
243219b2ee8SDavid du Colombier #define BYTE	  8		/* ditto */
244219b2ee8SDavid du Colombier #define SHORT	 16		/* ditto */
245219b2ee8SDavid du Colombier #define INT	 32		/* ditto */
246219b2ee8SDavid du Colombier #define	CHAN	 64		/* not */
247219b2ee8SDavid du Colombier #define STRUCT	128		/* user defined structure name */
248219b2ee8SDavid du Colombier 
249312a1df1SDavid du Colombier #define SOMETHINGBIG	65536
250312a1df1SDavid du Colombier #define RATHERSMALL	512
25100d97012SDavid du Colombier #define MAXSCOPESZ	1024
252312a1df1SDavid du Colombier 
2537dd7cddfSDavid du Colombier #ifndef max
254219b2ee8SDavid du Colombier  #define max(a,b) (((a)<(b)) ? (b) : (a))
2557dd7cddfSDavid du Colombier #endif
256219b2ee8SDavid du Colombier 
25700d97012SDavid du Colombier #ifdef PC
25800d97012SDavid du Colombier  #define MFLAGS	"wb"
25900d97012SDavid du Colombier #else
26000d97012SDavid du Colombier  #define MFLAGS	"w"
26100d97012SDavid du Colombier #endif
2627dd7cddfSDavid du Colombier 
2637dd7cddfSDavid du Colombier /***** prototype definitions *****/
264219b2ee8SDavid du Colombier Element	*eval_sub(Element *);
265219b2ee8SDavid du Colombier Element	*get_lab(Lextok *, int);
266*de2caf28SDavid du Colombier Element	*huntele(Element *, unsigned int, int);
267219b2ee8SDavid du Colombier Element	*huntstart(Element *);
268*de2caf28SDavid du Colombier Element *mk_skip(void);
269219b2ee8SDavid du Colombier Element	*target(Element *);
270219b2ee8SDavid du Colombier 
271219b2ee8SDavid du Colombier Lextok	*do_unless(Lextok *, Lextok *);
272219b2ee8SDavid du Colombier Lextok	*expand(Lextok *, int);
273219b2ee8SDavid du Colombier Lextok	*getuname(Symbol *);
274219b2ee8SDavid du Colombier Lextok	*mk_explicit(Lextok *, int, int);
275219b2ee8SDavid du Colombier Lextok	*nn(Lextok *, int, Lextok *, Lextok *);
276219b2ee8SDavid du Colombier Lextok	*rem_lab(Symbol *, Lextok *, Symbol *);
277312a1df1SDavid du Colombier Lextok	*rem_var(Symbol *, Lextok *, Symbol *, Lextok *);
278219b2ee8SDavid du Colombier Lextok	*tail_add(Lextok *, Lextok *);
279*de2caf28SDavid du Colombier Lextok	*return_statement(Lextok *);
280219b2ee8SDavid du Colombier 
281*de2caf28SDavid du Colombier ProcList *mk_rdy(Symbol *, Lextok *, Sequence *, int, Lextok *, enum btypes);
282219b2ee8SDavid du Colombier 
283219b2ee8SDavid du Colombier SeqList	*seqlist(Sequence *, SeqList *);
284219b2ee8SDavid du Colombier Sequence *close_seq(int);
285219b2ee8SDavid du Colombier 
286219b2ee8SDavid du Colombier Symbol	*break_dest(void);
287219b2ee8SDavid du Colombier Symbol	*findloc(Symbol *);
2887dd7cddfSDavid du Colombier Symbol	*has_lab(Element *, int);
289312a1df1SDavid du Colombier Symbol	*lookup(char *);
290312a1df1SDavid du Colombier Symbol	*prep_inline(Symbol *, Lextok *);
291219b2ee8SDavid du Colombier 
292*de2caf28SDavid du Colombier char	*put_inline(FILE *, char *);
29300d97012SDavid du Colombier char	*emalloc(size_t);
294*de2caf28SDavid du Colombier char	*erealloc(void*, size_t, size_t);
2957dd7cddfSDavid du Colombier long	Rand(void);
296219b2ee8SDavid du Colombier 
297219b2ee8SDavid du Colombier int	any_oper(Lextok *, int);
298219b2ee8SDavid du Colombier int	any_undo(Lextok *);
299312a1df1SDavid du Colombier int	c_add_sv(FILE *);
3007dd7cddfSDavid du Colombier int	cast_val(int, int, int);
301219b2ee8SDavid du Colombier int	checkvar(Symbol *, int);
302*de2caf28SDavid du Colombier int	check_track(Lextok *);
303219b2ee8SDavid du Colombier int	Cnt_flds(Lextok *);
304219b2ee8SDavid du Colombier int	cnt_mpars(Lextok *);
305219b2ee8SDavid du Colombier int	complete_rendez(void);
3067dd7cddfSDavid du Colombier int	enable(Lextok *);
307219b2ee8SDavid du Colombier int	Enabled0(Element *);
308219b2ee8SDavid du Colombier int	eval(Lextok *);
3097dd7cddfSDavid du Colombier int	find_lab(Symbol *, Symbol *, int);
310219b2ee8SDavid du Colombier int	find_maxel(Symbol *);
3117dd7cddfSDavid du Colombier int	full_name(FILE *, Lextok *, Symbol *, int);
312219b2ee8SDavid du Colombier int	getlocal(Lextok *);
313219b2ee8SDavid du Colombier int	getval(Lextok *);
314312a1df1SDavid du Colombier int	glob_inline(char *);
315219b2ee8SDavid du Colombier int	has_typ(Lextok *, int);
316312a1df1SDavid du Colombier int	in_bound(Symbol *, int);
3177dd7cddfSDavid du Colombier int	interprint(FILE *, Lextok *);
318312a1df1SDavid du Colombier int	printm(FILE *, Lextok *);
31900d97012SDavid du Colombier int	is_inline(void);
320219b2ee8SDavid du Colombier int	ismtype(char *);
321219b2ee8SDavid du Colombier int	isproctype(char *);
322219b2ee8SDavid du Colombier int	isutype(char *);
323219b2ee8SDavid du Colombier int	Lval_struct(Lextok *, Symbol *, int, int);
3247dd7cddfSDavid du Colombier int	main(int, char **);
325219b2ee8SDavid du Colombier int	pc_value(Lextok *);
32600d97012SDavid du Colombier int	pid_is_claim(int);
3277dd7cddfSDavid du Colombier int	proper_enabler(Lextok *);
328312a1df1SDavid du Colombier int	putcode(FILE *, Sequence *, Element *, int, int, int);
329219b2ee8SDavid du Colombier int	q_is_sync(Lextok *);
330219b2ee8SDavid du Colombier int	qlen(Lextok *);
331219b2ee8SDavid du Colombier int	qfull(Lextok *);
332219b2ee8SDavid du Colombier int	qmake(Symbol *);
333219b2ee8SDavid du Colombier int	qrecv(Lextok *, int);
334219b2ee8SDavid du Colombier int	qsend(Lextok *);
335219b2ee8SDavid du Colombier int	remotelab(Lextok *);
336219b2ee8SDavid du Colombier int	remotevar(Lextok *);
3377dd7cddfSDavid du Colombier int	Rval_struct(Lextok *, Symbol *, int);
338219b2ee8SDavid du Colombier int	setlocal(Lextok *, int);
339219b2ee8SDavid du Colombier int	setval(Lextok *, int);
340219b2ee8SDavid du Colombier int	sputtype(char *, int);
341219b2ee8SDavid du Colombier int	Sym_typ(Lextok *);
3427dd7cddfSDavid du Colombier int	tl_main(int, char *[]);
343219b2ee8SDavid du Colombier int	Width_set(int *, int, Lextok *);
344219b2ee8SDavid du Colombier int	yyparse(void);
345219b2ee8SDavid du Colombier int	yylex(void);
346219b2ee8SDavid du Colombier 
347312a1df1SDavid du Colombier void	AST_track(Lextok *, int);
348219b2ee8SDavid du Colombier void	add_seq(Lextok *);
3497dd7cddfSDavid du Colombier void	alldone(int);
3507dd7cddfSDavid du Colombier void	announce(char *);
351312a1df1SDavid du Colombier void	c_state(Symbol *, Symbol *, Symbol *);
352312a1df1SDavid du Colombier void	c_add_def(FILE *);
353312a1df1SDavid du Colombier void	c_add_loc(FILE *, char *);
354312a1df1SDavid du Colombier void	c_add_locinit(FILE *, int, char *);
355312a1df1SDavid du Colombier void	c_chandump(FILE *);
356312a1df1SDavid du Colombier void	c_preview(void);
357312a1df1SDavid du Colombier void	c_struct(FILE *, char *, Symbol *);
358312a1df1SDavid du Colombier void	c_track(Symbol *, Symbol *, Symbol *);
359312a1df1SDavid du Colombier void	c_var(FILE *, char *, Symbol *);
360312a1df1SDavid du Colombier void	c_wrapper(FILE *);
3617dd7cddfSDavid du Colombier void	chanaccess(void);
362f3793cddSDavid du Colombier void	check_param_count(int, Lextok *);
3637dd7cddfSDavid du Colombier void	checkrun(Symbol *, int);
364219b2ee8SDavid du Colombier void	comment(FILE *, Lextok *, int);
365219b2ee8SDavid du Colombier void	cross_dsteps(Lextok *, Lextok *);
36600d97012SDavid du Colombier void	disambiguate(void);
367219b2ee8SDavid du Colombier void	doq(Symbol *, int, RunList *);
3687dd7cddfSDavid du Colombier void	dotag(FILE *, char *);
369312a1df1SDavid du Colombier void	do_locinits(FILE *);
3707dd7cddfSDavid du Colombier void	do_var(FILE *, int, char *, Symbol *, char *, char *, char *);
371219b2ee8SDavid du Colombier void	dump_struct(Symbol *, char *, RunList *);
372219b2ee8SDavid du Colombier void	dumpclaims(FILE *, int, char *);
373219b2ee8SDavid du Colombier void	dumpglobals(void);
374219b2ee8SDavid du Colombier void	dumplabels(void);
375*de2caf28SDavid du Colombier void	dumplocal(RunList *, int);
376219b2ee8SDavid du Colombier void	dumpsrc(int, int);
377219b2ee8SDavid du Colombier void	fatal(char *, char *);
378219b2ee8SDavid du Colombier void	fix_dest(Symbol *, Symbol *);
379219b2ee8SDavid du Colombier void	genaddproc(void);
380219b2ee8SDavid du Colombier void	genaddqueue(void);
381312a1df1SDavid du Colombier void	gencodetable(FILE *);
382219b2ee8SDavid du Colombier void	genheader(void);
383219b2ee8SDavid du Colombier void	genother(void);
384219b2ee8SDavid du Colombier void	gensrc(void);
3857dd7cddfSDavid du Colombier void	gensvmap(void);
386219b2ee8SDavid du Colombier void	genunio(void);
387219b2ee8SDavid du Colombier void	ini_struct(Symbol *);
388312a1df1SDavid du Colombier void	loose_ends(void);
389219b2ee8SDavid du Colombier void	make_atomic(Sequence *, int);
390*de2caf28SDavid du Colombier void	mark_last(void);
391219b2ee8SDavid du Colombier void	match_trail(void);
392312a1df1SDavid du Colombier void	no_side_effects(char *);
3937dd7cddfSDavid du Colombier void	nochan_manip(Lextok *, Lextok *, int);
394219b2ee8SDavid du Colombier void	non_fatal(char *, char *);
395*de2caf28SDavid du Colombier void	ntimes(FILE *, int, int, const char *c[]);
396219b2ee8SDavid du Colombier void	open_seq(int);
397219b2ee8SDavid du Colombier void	p_talk(Element *, int);
398*de2caf28SDavid du Colombier void	pickup_inline(Symbol *, Lextok *, Lextok *);
399312a1df1SDavid du Colombier void	plunk_c_decls(FILE *);
400312a1df1SDavid du Colombier void	plunk_c_fcts(FILE *);
401312a1df1SDavid du Colombier void	plunk_expr(FILE *, char *);
40200d97012SDavid du Colombier void	plunk_inline(FILE *, char *, int, int);
4037dd7cddfSDavid du Colombier void	prehint(Symbol *);
404312a1df1SDavid du Colombier void	preruse(FILE *, Lextok *);
405*de2caf28SDavid du Colombier void	pretty_print(void);
4067dd7cddfSDavid du Colombier void	prune_opts(Lextok *);
4077dd7cddfSDavid du Colombier void	pstext(int, char *);
408219b2ee8SDavid du Colombier void	pushbreak(void);
409219b2ee8SDavid du Colombier void	putname(FILE *, char *, Lextok *, int, char *);
410219b2ee8SDavid du Colombier void	putremote(FILE *, Lextok *, int);
411219b2ee8SDavid du Colombier void	putskip(int);
4127dd7cddfSDavid du Colombier void	putsrc(Element *);
413219b2ee8SDavid du Colombier void	putstmnt(FILE *, Lextok *, int);
414219b2ee8SDavid du Colombier void	putunames(FILE *);
415219b2ee8SDavid du Colombier void	rem_Seq(void);
4167dd7cddfSDavid du Colombier void	runnable(ProcList *, int, int);
417219b2ee8SDavid du Colombier void	sched(void);
4187dd7cddfSDavid du Colombier void	setaccess(Symbol *, Symbol *, int, int);
419219b2ee8SDavid du Colombier void	set_lab(Symbol *, Element *);
420*de2caf28SDavid du Colombier void	setmtype(Lextok *, Lextok *);
421219b2ee8SDavid du Colombier void	setpname(Lextok *);
422*de2caf28SDavid du Colombier void	setptype(Lextok *, Lextok *, int, Lextok *);
4237dd7cddfSDavid du Colombier void	setuname(Lextok *);
424219b2ee8SDavid du Colombier void	setutype(Lextok *, Symbol *, Lextok *);
425219b2ee8SDavid du Colombier void	setxus(Lextok *, int);
426219b2ee8SDavid du Colombier void	Srand(unsigned);
427219b2ee8SDavid du Colombier void	start_claim(int);
4287dd7cddfSDavid du Colombier void	struct_name(Lextok *, Symbol *, int, char *);
429219b2ee8SDavid du Colombier void	symdump(void);
430312a1df1SDavid du Colombier void	symvar(Symbol *);
43100d97012SDavid du Colombier void	sync_product(void);
4327dd7cddfSDavid du Colombier void	trackchanuse(Lextok *, Lextok *, int);
4337dd7cddfSDavid du Colombier void	trackvar(Lextok *, Lextok *);
4347dd7cddfSDavid du Colombier void	trackrun(Lextok *);
43500d97012SDavid du Colombier void	trapwonly(Lextok * /* , char * */);	/* spin.y and main.c */
436219b2ee8SDavid du Colombier void	typ2c(Symbol *);
4377dd7cddfSDavid du Colombier void	typ_ck(int, int, char *);
438219b2ee8SDavid du Colombier void	undostmnt(Lextok *, int);
439219b2ee8SDavid du Colombier void	unrem_Seq(void);
440219b2ee8SDavid du Colombier void	unskip(int);
441219b2ee8SDavid du Colombier void	whoruns(int);
442219b2ee8SDavid du Colombier void	wrapup(int);
443219b2ee8SDavid du Colombier void	yyerror(char *, ...);
444*de2caf28SDavid du Colombier 
445*de2caf28SDavid du Colombier extern	int unlink(const char *);
446*de2caf28SDavid du Colombier 
447*de2caf28SDavid du Colombier #define TMP_FILE1 "._s_p_i_n_"
448*de2caf28SDavid du Colombier #define TMP_FILE2 "._n_i_p_s_"
449*de2caf28SDavid du Colombier 
450312a1df1SDavid du Colombier #endif
451