xref: /plan9/sys/src/cmd/spin/spin.h (revision 00d970127b9d44d2b22f4f656717a212dec1f1d2)
1219b2ee8SDavid du Colombier /***** spin: spin.h *****/
2219b2ee8SDavid du Colombier 
3*00d97012SDavid du Colombier /* Copyright (c) 1989-2009 by Lucent Technologies, Bell Laboratories.     */
47dd7cddfSDavid du Colombier /* All Rights Reserved.  This software is for educational purposes only.  */
5312a1df1SDavid du Colombier /* No guarantee whatsoever is expressed or implied by the distribution of */
6312a1df1SDavid du Colombier /* this code.  Permission is given to distribute this code provided that  */
7312a1df1SDavid du Colombier /* this introductory message is not removed and no monies are exchanged.  */
8312a1df1SDavid du Colombier /* Software written by Gerard J. Holzmann.  For tool documentation see:   */
9312a1df1SDavid du Colombier /*             http://spinroot.com/                                       */
10312a1df1SDavid du Colombier /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
11312a1df1SDavid du Colombier 
12312a1df1SDavid du Colombier #ifndef SEEN_SPIN_H
13312a1df1SDavid du Colombier #define SEEN_SPIN_H
14219b2ee8SDavid du Colombier 
15219b2ee8SDavid du Colombier #include <stdio.h>
16219b2ee8SDavid du Colombier #include <string.h>
177dd7cddfSDavid du Colombier #include <ctype.h>
18219b2ee8SDavid du Colombier 
19*00d97012SDavid du Colombier enum	    { INIV, PUTV, LOGV };	/* for pangen[14].c */
20*00d97012SDavid du Colombier enum btypes { NONE, N_CLAIM, I_PROC, A_PROC, P_PROC, E_TRACE, N_TRACE };
21*00d97012SDavid 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 */
28*00d97012SDavid 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 */
61*00d97012SDavid du Colombier 	unsigned char	isarray; /* set if decl specifies array bound */
62*00d97012SDavid du Colombier 	unsigned char	*bscp;	/* block scope */
63312a1df1SDavid du Colombier 	int	nbits;		/* optional width specifier */
64219b2ee8SDavid du Colombier 	int	nel;		/* 1 if scalar, >1 if array   */
65219b2ee8SDavid du Colombier 	int	setat;		/* last depth value changed   */
66219b2ee8SDavid du Colombier 	int	*val;		/* runtime value(s), initl 0  */
67312a1df1SDavid du Colombier 	Lextok	**Sval;	/* values for structures */
68219b2ee8SDavid du Colombier 
69219b2ee8SDavid du Colombier 	int	xu;		/* exclusive r or w by 1 pid  */
70219b2ee8SDavid du Colombier 	struct Symbol	*xup[2];  /* xr or xs proctype  */
717dd7cddfSDavid du Colombier 	struct Access	*access;/* e.g., senders and receives of chan */
72312a1df1SDavid du Colombier 	Lextok	*ini;	/* initial value, or chan-def */
73312a1df1SDavid du Colombier 	Lextok	*Slst;	/* template for structure if struct */
74219b2ee8SDavid du Colombier 	struct Symbol	*Snm;	/* name of the defining struct */
75219b2ee8SDavid du Colombier 	struct Symbol	*owner;	/* set for names of subfields in typedefs */
76219b2ee8SDavid du Colombier 	struct Symbol	*context; /* 0 if global, or procname */
77219b2ee8SDavid du Colombier 	struct Symbol	*next;	/* linked list */
78219b2ee8SDavid du Colombier } Symbol;
79219b2ee8SDavid du Colombier 
807dd7cddfSDavid du Colombier typedef struct Ordered {	/* links all names in Symbol table */
817dd7cddfSDavid du Colombier 	struct Symbol	*entry;
827dd7cddfSDavid du Colombier 	struct Ordered	*next;
837dd7cddfSDavid du Colombier } Ordered;
847dd7cddfSDavid du Colombier 
85219b2ee8SDavid du Colombier typedef struct Queue {
86219b2ee8SDavid du Colombier 	short	qid;		/* runtime q index */
87312a1df1SDavid du Colombier 	int	qlen;		/* nr messages stored */
88312a1df1SDavid du Colombier 	int	nslots, nflds;	/* capacity, flds/slot */
89219b2ee8SDavid du Colombier 	int	setat;		/* last depth value changed */
90219b2ee8SDavid du Colombier 	int	*fld_width;	/* type of each field */
917dd7cddfSDavid du Colombier 	int	*contents;	/* the values stored */
927dd7cddfSDavid du Colombier 	int	*stepnr;	/* depth when each msg was sent */
93219b2ee8SDavid du Colombier 	struct Queue	*nxt;	/* linked list */
94219b2ee8SDavid du Colombier } Queue;
95219b2ee8SDavid du Colombier 
967dd7cddfSDavid du Colombier typedef struct FSM_state {	/* used in pangen5.c - dataflow */
977dd7cddfSDavid du Colombier 	int from;		/* state number */
987dd7cddfSDavid du Colombier 	int seen;		/* used for dfs */
997dd7cddfSDavid du Colombier 	int in;			/* nr of incoming edges */
100312a1df1SDavid du Colombier 	int cr;			/* has reachable 1-relevant successor */
101312a1df1SDavid du Colombier 	int scratch;
102312a1df1SDavid du Colombier 	unsigned long *dom, *mod; /* to mark dominant nodes */
103312a1df1SDavid du Colombier 	struct FSM_trans *t;	/* outgoing edges */
104312a1df1SDavid du Colombier 	struct FSM_trans *p;	/* incoming edges, predecessors */
1057dd7cddfSDavid du Colombier 	struct FSM_state *nxt;	/* linked list of all states */
1067dd7cddfSDavid du Colombier } FSM_state;
1077dd7cddfSDavid du Colombier 
108312a1df1SDavid du Colombier typedef struct FSM_trans {	/* used in pangen5.c - dataflow */
109312a1df1SDavid du Colombier 	int to;
110312a1df1SDavid du Colombier 	short	relevant;	/* when sliced */
111312a1df1SDavid du Colombier 	short	round;		/* ditto: iteration when marked */
112312a1df1SDavid du Colombier 	struct FSM_use *Val[2];	/* 0=reads, 1=writes */
113312a1df1SDavid du Colombier 	struct Element *step;
114312a1df1SDavid du Colombier 	struct FSM_trans *nxt;
115312a1df1SDavid du Colombier } FSM_trans;
116312a1df1SDavid du Colombier 
117312a1df1SDavid du Colombier typedef struct FSM_use {	/* used in pangen5.c - dataflow */
118312a1df1SDavid du Colombier 	Lextok *n;
119312a1df1SDavid du Colombier 	Symbol *var;
120312a1df1SDavid du Colombier 	int special;
121312a1df1SDavid du Colombier 	struct FSM_use *nxt;
122312a1df1SDavid du Colombier } FSM_use;
123312a1df1SDavid du Colombier 
124219b2ee8SDavid du Colombier typedef struct Element {
125219b2ee8SDavid du Colombier 	Lextok	*n;		/* defines the type & contents */
126219b2ee8SDavid du Colombier 	int	Seqno;		/* identifies this el within system */
127219b2ee8SDavid du Colombier 	int	seqno;		/* identifies this el within a proc */
1287dd7cddfSDavid du Colombier 	int	merge;		/* set by -O if step can be merged */
1297dd7cddfSDavid du Colombier 	int	merge_start;
1307dd7cddfSDavid du Colombier 	int	merge_single;
1317dd7cddfSDavid du Colombier 	short	merge_in;	/* nr of incoming edges */
1327dd7cddfSDavid du Colombier 	short	merge_mark;	/* state was generated in merge sequence */
133*00d97012SDavid du Colombier 	unsigned int	status;	/* used by analyzer generator  */
1347dd7cddfSDavid du Colombier 	struct FSM_use	*dead;	/* optional dead variable list */
135219b2ee8SDavid du Colombier 	struct SeqList	*sub;	/* subsequences, for compounds */
136219b2ee8SDavid du Colombier 	struct SeqList	*esc;	/* zero or more escape sequences */
137219b2ee8SDavid du Colombier 	struct Element	*Nxt;	/* linked list - for global lookup */
138219b2ee8SDavid du Colombier 	struct Element	*nxt;	/* linked list - program structure */
139219b2ee8SDavid du Colombier } Element;
140219b2ee8SDavid du Colombier 
141219b2ee8SDavid du Colombier typedef struct Sequence {
142219b2ee8SDavid du Colombier 	Element	*frst;
143219b2ee8SDavid du Colombier 	Element	*last;		/* links onto continuations */
144219b2ee8SDavid du Colombier 	Element *extent;	/* last element in original */
1457dd7cddfSDavid du Colombier 	int	maxel;		/* 1+largest id in sequence */
146219b2ee8SDavid du Colombier } Sequence;
147219b2ee8SDavid du Colombier 
148219b2ee8SDavid du Colombier typedef struct SeqList {
149219b2ee8SDavid du Colombier 	Sequence	*this;	/* one sequence */
150219b2ee8SDavid du Colombier 	struct SeqList	*nxt;	/* linked list  */
151219b2ee8SDavid du Colombier } SeqList;
152219b2ee8SDavid du Colombier 
153219b2ee8SDavid du Colombier typedef struct Label {
154219b2ee8SDavid du Colombier 	Symbol	*s;
155219b2ee8SDavid du Colombier 	Symbol	*c;
156219b2ee8SDavid du Colombier 	Element	*e;
157*00d97012SDavid du Colombier 	int	uiid;		/* non-zero if label appears in an inline */
158312a1df1SDavid du Colombier 	int	visible;	/* label referenced in claim (slice relevant) */
159219b2ee8SDavid du Colombier 	struct Label	*nxt;
160219b2ee8SDavid du Colombier } Label;
161219b2ee8SDavid du Colombier 
162219b2ee8SDavid du Colombier typedef struct Lbreak {
163219b2ee8SDavid du Colombier 	Symbol	*l;
164219b2ee8SDavid du Colombier 	struct Lbreak	*nxt;
165219b2ee8SDavid du Colombier } Lbreak;
166219b2ee8SDavid du Colombier 
167219b2ee8SDavid du Colombier typedef struct RunList {
168219b2ee8SDavid du Colombier 	Symbol	*n;		/* name            */
169219b2ee8SDavid du Colombier 	int	tn;		/* ordinal of type */
170219b2ee8SDavid du Colombier 	int	pid;		/* process id      */
1717dd7cddfSDavid du Colombier 	int	priority;	/* for simulations only */
172*00d97012SDavid du Colombier 	enum btypes b;		/* the type of process */
173219b2ee8SDavid du Colombier 	Element	*pc;		/* current stmnt   */
174219b2ee8SDavid du Colombier 	Sequence *ps;		/* used by analyzer generator */
1757dd7cddfSDavid du Colombier 	Lextok	*prov;		/* provided clause */
176219b2ee8SDavid du Colombier 	Symbol	*symtab;	/* local variables */
177219b2ee8SDavid du Colombier 	struct RunList	*nxt;	/* linked list */
178219b2ee8SDavid du Colombier } RunList;
179219b2ee8SDavid du Colombier 
180219b2ee8SDavid du Colombier typedef struct ProcList {
181219b2ee8SDavid du Colombier 	Symbol	*n;		/* name       */
182219b2ee8SDavid du Colombier 	Lextok	*p;		/* parameters */
183219b2ee8SDavid du Colombier 	Sequence *s;		/* body       */
1847dd7cddfSDavid du Colombier 	Lextok	*prov;		/* provided clause */
185*00d97012SDavid du Colombier 	enum btypes b;		/* e.g., claim, trace, proc */
1867dd7cddfSDavid du Colombier 	short	tn;		/* ordinal number */
187*00d97012SDavid du Colombier 	unsigned char	det;	/* deterministic */
188*00d97012SDavid du Colombier 	unsigned char   unsafe;	/* contains global var inits */
189219b2ee8SDavid du Colombier 	struct ProcList	*nxt;	/* linked list */
190219b2ee8SDavid du Colombier } ProcList;
191219b2ee8SDavid du Colombier 
192219b2ee8SDavid du Colombier typedef	Lextok *Lexptr;
193219b2ee8SDavid du Colombier 
194219b2ee8SDavid du Colombier #define YYSTYPE	Lexptr
195219b2ee8SDavid du Colombier 
196219b2ee8SDavid du Colombier #define ZN	(Lextok *)0
197219b2ee8SDavid du Colombier #define ZS	(Symbol *)0
198219b2ee8SDavid du Colombier #define ZE	(Element *)0
199219b2ee8SDavid du Colombier 
200219b2ee8SDavid du Colombier #define DONE	  1     	/* status bits of elements */
201219b2ee8SDavid du Colombier #define ATOM	  2     	/* part of an atomic chain */
202219b2ee8SDavid du Colombier #define L_ATOM	  4     	/* last element in a chain */
203219b2ee8SDavid du Colombier #define I_GLOB    8		/* inherited global ref    */
204219b2ee8SDavid du Colombier #define DONE2	 16		/* used in putcode and main*/
205219b2ee8SDavid du Colombier #define D_ATOM	 32		/* deterministic atomic    */
2067dd7cddfSDavid du Colombier #define ENDSTATE 64		/* normal endstate         */
207*00d97012SDavid du Colombier #define CHECK2	128		/* status bits for remote ref check */
208*00d97012SDavid du Colombier #define CHECK3	256		/* status bits for atomic jump check */
209219b2ee8SDavid du Colombier 
210219b2ee8SDavid du Colombier #define Nhash	255    		/* slots in symbol hash-table */
211219b2ee8SDavid du Colombier 
212219b2ee8SDavid du Colombier #define XR	  	1	/* non-shared receive-only */
213219b2ee8SDavid du Colombier #define XS	  	2	/* non-shared send-only    */
214219b2ee8SDavid du Colombier #define XX	  	4	/* overrides XR or XS tag  */
215219b2ee8SDavid du Colombier 
216312a1df1SDavid du Colombier #define CODE_FRAG	2	/* auto-numbered code-fragment */
217312a1df1SDavid du Colombier #define CODE_DECL	4	/* auto-numbered c_decl */
218312a1df1SDavid du Colombier #define PREDEF	  	3	/* predefined name: _p, _last */
219312a1df1SDavid du Colombier 
2207dd7cddfSDavid du Colombier #define UNSIGNED  5		/* val defines width in bits */
221219b2ee8SDavid du Colombier #define BIT	  1		/* also equal to width in bits */
222219b2ee8SDavid du Colombier #define BYTE	  8		/* ditto */
223219b2ee8SDavid du Colombier #define SHORT	 16		/* ditto */
224219b2ee8SDavid du Colombier #define INT	 32		/* ditto */
225219b2ee8SDavid du Colombier #define	CHAN	 64		/* not */
226219b2ee8SDavid du Colombier #define STRUCT	128		/* user defined structure name */
227219b2ee8SDavid du Colombier 
228312a1df1SDavid du Colombier #define SOMETHINGBIG	65536
229312a1df1SDavid du Colombier #define RATHERSMALL	512
230*00d97012SDavid du Colombier #define MAXSCOPESZ	1024
231312a1df1SDavid du Colombier 
2327dd7cddfSDavid du Colombier #ifndef max
233219b2ee8SDavid du Colombier #define max(a,b) (((a)<(b)) ? (b) : (a))
2347dd7cddfSDavid du Colombier #endif
235219b2ee8SDavid du Colombier 
236*00d97012SDavid du Colombier #ifdef PC
237*00d97012SDavid du Colombier 	#define MFLAGS	"wb"
238*00d97012SDavid du Colombier #else
239*00d97012SDavid du Colombier 	#define MFLAGS	"w"
240*00d97012SDavid du Colombier #endif
2417dd7cddfSDavid du Colombier 
2427dd7cddfSDavid du Colombier /***** prototype definitions *****/
243219b2ee8SDavid du Colombier Element	*eval_sub(Element *);
244219b2ee8SDavid du Colombier Element	*get_lab(Lextok *, int);
245312a1df1SDavid du Colombier Element	*huntele(Element *, int, int);
246219b2ee8SDavid du Colombier Element	*huntstart(Element *);
247219b2ee8SDavid du Colombier Element	*target(Element *);
248219b2ee8SDavid du Colombier 
249219b2ee8SDavid du Colombier Lextok	*do_unless(Lextok *, Lextok *);
250219b2ee8SDavid du Colombier Lextok	*expand(Lextok *, int);
251219b2ee8SDavid du Colombier Lextok	*getuname(Symbol *);
252219b2ee8SDavid du Colombier Lextok	*mk_explicit(Lextok *, int, int);
253219b2ee8SDavid du Colombier Lextok	*nn(Lextok *, int, Lextok *, Lextok *);
254219b2ee8SDavid du Colombier Lextok	*rem_lab(Symbol *, Lextok *, Symbol *);
255312a1df1SDavid du Colombier Lextok	*rem_var(Symbol *, Lextok *, Symbol *, Lextok *);
256219b2ee8SDavid du Colombier Lextok	*tail_add(Lextok *, Lextok *);
257219b2ee8SDavid du Colombier 
258*00d97012SDavid du Colombier ProcList *ready(Symbol *, Lextok *, Sequence *, int, Lextok *, enum btypes);
259219b2ee8SDavid du Colombier 
260219b2ee8SDavid du Colombier SeqList	*seqlist(Sequence *, SeqList *);
261219b2ee8SDavid du Colombier Sequence *close_seq(int);
262219b2ee8SDavid du Colombier 
263219b2ee8SDavid du Colombier Symbol	*break_dest(void);
264219b2ee8SDavid du Colombier Symbol	*findloc(Symbol *);
2657dd7cddfSDavid du Colombier Symbol	*has_lab(Element *, int);
266312a1df1SDavid du Colombier Symbol	*lookup(char *);
267312a1df1SDavid du Colombier Symbol	*prep_inline(Symbol *, Lextok *);
268219b2ee8SDavid du Colombier 
269*00d97012SDavid du Colombier char	*emalloc(size_t);
2707dd7cddfSDavid du Colombier long	Rand(void);
271219b2ee8SDavid du Colombier 
272219b2ee8SDavid du Colombier int	any_oper(Lextok *, int);
273219b2ee8SDavid du Colombier int	any_undo(Lextok *);
274312a1df1SDavid du Colombier int	c_add_sv(FILE *);
2757dd7cddfSDavid du Colombier int	cast_val(int, int, int);
276219b2ee8SDavid du Colombier int	checkvar(Symbol *, int);
277219b2ee8SDavid du Colombier int	Cnt_flds(Lextok *);
278219b2ee8SDavid du Colombier int	cnt_mpars(Lextok *);
279219b2ee8SDavid du Colombier int	complete_rendez(void);
2807dd7cddfSDavid du Colombier int	enable(Lextok *);
281219b2ee8SDavid du Colombier int	Enabled0(Element *);
282219b2ee8SDavid du Colombier int	eval(Lextok *);
2837dd7cddfSDavid du Colombier int	find_lab(Symbol *, Symbol *, int);
284219b2ee8SDavid du Colombier int	find_maxel(Symbol *);
2857dd7cddfSDavid du Colombier int	full_name(FILE *, Lextok *, Symbol *, int);
286219b2ee8SDavid du Colombier int	getlocal(Lextok *);
287219b2ee8SDavid du Colombier int	getval(Lextok *);
288312a1df1SDavid du Colombier int	glob_inline(char *);
289219b2ee8SDavid du Colombier int	has_typ(Lextok *, int);
290312a1df1SDavid du Colombier int	in_bound(Symbol *, int);
2917dd7cddfSDavid du Colombier int	interprint(FILE *, Lextok *);
292312a1df1SDavid du Colombier int	printm(FILE *, Lextok *);
293*00d97012SDavid du Colombier int	is_inline(void);
294219b2ee8SDavid du Colombier int	ismtype(char *);
295219b2ee8SDavid du Colombier int	isproctype(char *);
296219b2ee8SDavid du Colombier int	isutype(char *);
297219b2ee8SDavid du Colombier int	Lval_struct(Lextok *, Symbol *, int, int);
2987dd7cddfSDavid du Colombier int	main(int, char **);
299219b2ee8SDavid du Colombier int	pc_value(Lextok *);
300*00d97012SDavid du Colombier int	pid_is_claim(int);
3017dd7cddfSDavid du Colombier int	proper_enabler(Lextok *);
302312a1df1SDavid du Colombier int	putcode(FILE *, Sequence *, Element *, int, int, int);
303219b2ee8SDavid du Colombier int	q_is_sync(Lextok *);
304219b2ee8SDavid du Colombier int	qlen(Lextok *);
305219b2ee8SDavid du Colombier int	qfull(Lextok *);
306219b2ee8SDavid du Colombier int	qmake(Symbol *);
307219b2ee8SDavid du Colombier int	qrecv(Lextok *, int);
308219b2ee8SDavid du Colombier int	qsend(Lextok *);
309219b2ee8SDavid du Colombier int	remotelab(Lextok *);
310219b2ee8SDavid du Colombier int	remotevar(Lextok *);
3117dd7cddfSDavid du Colombier int	Rval_struct(Lextok *, Symbol *, int);
312219b2ee8SDavid du Colombier int	setlocal(Lextok *, int);
313219b2ee8SDavid du Colombier int	setval(Lextok *, int);
314219b2ee8SDavid du Colombier int	sputtype(char *, int);
315219b2ee8SDavid du Colombier int	Sym_typ(Lextok *);
3167dd7cddfSDavid du Colombier int	tl_main(int, char *[]);
317219b2ee8SDavid du Colombier int	Width_set(int *, int, Lextok *);
318219b2ee8SDavid du Colombier int	yyparse(void);
319219b2ee8SDavid du Colombier int	yywrap(void);
320219b2ee8SDavid du Colombier int	yylex(void);
321219b2ee8SDavid du Colombier 
322312a1df1SDavid du Colombier void	AST_track(Lextok *, int);
323219b2ee8SDavid du Colombier void	add_seq(Lextok *);
3247dd7cddfSDavid du Colombier void	alldone(int);
3257dd7cddfSDavid du Colombier void	announce(char *);
326312a1df1SDavid du Colombier void	c_state(Symbol *, Symbol *, Symbol *);
327312a1df1SDavid du Colombier void	c_add_def(FILE *);
328312a1df1SDavid du Colombier void	c_add_loc(FILE *, char *);
329312a1df1SDavid du Colombier void	c_add_locinit(FILE *, int, char *);
330312a1df1SDavid du Colombier void	c_add_use(FILE *);
331312a1df1SDavid du Colombier void	c_chandump(FILE *);
332312a1df1SDavid du Colombier void	c_preview(void);
333312a1df1SDavid du Colombier void	c_struct(FILE *, char *, Symbol *);
334312a1df1SDavid du Colombier void	c_track(Symbol *, Symbol *, Symbol *);
335312a1df1SDavid du Colombier void	c_var(FILE *, char *, Symbol *);
336312a1df1SDavid du Colombier void	c_wrapper(FILE *);
3377dd7cddfSDavid du Colombier void	chanaccess(void);
338f3793cddSDavid du Colombier void	check_param_count(int, Lextok *);
3397dd7cddfSDavid du Colombier void	checkrun(Symbol *, int);
340219b2ee8SDavid du Colombier void	comment(FILE *, Lextok *, int);
341219b2ee8SDavid du Colombier void	cross_dsteps(Lextok *, Lextok *);
342*00d97012SDavid du Colombier void	disambiguate(void);
343219b2ee8SDavid du Colombier void	doq(Symbol *, int, RunList *);
3447dd7cddfSDavid du Colombier void	dotag(FILE *, char *);
345312a1df1SDavid du Colombier void	do_locinits(FILE *);
3467dd7cddfSDavid du Colombier void	do_var(FILE *, int, char *, Symbol *, char *, char *, char *);
347219b2ee8SDavid du Colombier void	dump_struct(Symbol *, char *, RunList *);
348219b2ee8SDavid du Colombier void	dumpclaims(FILE *, int, char *);
349219b2ee8SDavid du Colombier void	dumpglobals(void);
350219b2ee8SDavid du Colombier void	dumplabels(void);
351219b2ee8SDavid du Colombier void	dumplocal(RunList *);
352219b2ee8SDavid du Colombier void	dumpsrc(int, int);
353219b2ee8SDavid du Colombier void	fatal(char *, char *);
354219b2ee8SDavid du Colombier void	fix_dest(Symbol *, Symbol *);
355219b2ee8SDavid du Colombier void	genaddproc(void);
356219b2ee8SDavid du Colombier void	genaddqueue(void);
357312a1df1SDavid du Colombier void	gencodetable(FILE *);
358219b2ee8SDavid du Colombier void	genheader(void);
359219b2ee8SDavid du Colombier void	genother(void);
360219b2ee8SDavid du Colombier void	gensrc(void);
3617dd7cddfSDavid du Colombier void	gensvmap(void);
362219b2ee8SDavid du Colombier void	genunio(void);
363219b2ee8SDavid du Colombier void	ini_struct(Symbol *);
364312a1df1SDavid du Colombier void	loose_ends(void);
365219b2ee8SDavid du Colombier void	make_atomic(Sequence *, int);
366219b2ee8SDavid du Colombier void	match_trail(void);
367312a1df1SDavid du Colombier void	no_side_effects(char *);
3687dd7cddfSDavid du Colombier void	nochan_manip(Lextok *, Lextok *, int);
369219b2ee8SDavid du Colombier void	non_fatal(char *, char *);
370219b2ee8SDavid du Colombier void	ntimes(FILE *, int, int, char *c[]);
371219b2ee8SDavid du Colombier void	open_seq(int);
372219b2ee8SDavid du Colombier void	p_talk(Element *, int);
3737dd7cddfSDavid du Colombier void	pickup_inline(Symbol *, Lextok *);
374312a1df1SDavid du Colombier void	plunk_c_decls(FILE *);
375312a1df1SDavid du Colombier void	plunk_c_fcts(FILE *);
376312a1df1SDavid du Colombier void	plunk_expr(FILE *, char *);
377*00d97012SDavid du Colombier void	plunk_inline(FILE *, char *, int, int);
3787dd7cddfSDavid du Colombier void	prehint(Symbol *);
379312a1df1SDavid du Colombier void	preruse(FILE *, Lextok *);
3807dd7cddfSDavid du Colombier void	prune_opts(Lextok *);
3817dd7cddfSDavid du Colombier void	pstext(int, char *);
382219b2ee8SDavid du Colombier void	pushbreak(void);
383219b2ee8SDavid du Colombier void	putname(FILE *, char *, Lextok *, int, char *);
384219b2ee8SDavid du Colombier void	putremote(FILE *, Lextok *, int);
385219b2ee8SDavid du Colombier void	putskip(int);
3867dd7cddfSDavid du Colombier void	putsrc(Element *);
387219b2ee8SDavid du Colombier void	putstmnt(FILE *, Lextok *, int);
388219b2ee8SDavid du Colombier void	putunames(FILE *);
389219b2ee8SDavid du Colombier void	rem_Seq(void);
3907dd7cddfSDavid du Colombier void	runnable(ProcList *, int, int);
391219b2ee8SDavid du Colombier void	sched(void);
3927dd7cddfSDavid du Colombier void	setaccess(Symbol *, Symbol *, int, int);
393219b2ee8SDavid du Colombier void	set_lab(Symbol *, Element *);
394219b2ee8SDavid du Colombier void	setmtype(Lextok *);
395219b2ee8SDavid du Colombier void	setpname(Lextok *);
3967dd7cddfSDavid du Colombier void	setptype(Lextok *, int, Lextok *);
3977dd7cddfSDavid du Colombier void	setuname(Lextok *);
398219b2ee8SDavid du Colombier void	setutype(Lextok *, Symbol *, Lextok *);
399219b2ee8SDavid du Colombier void	setxus(Lextok *, int);
400*00d97012SDavid du Colombier void	show_lab(void);
401219b2ee8SDavid du Colombier void	Srand(unsigned);
402219b2ee8SDavid du Colombier void	start_claim(int);
4037dd7cddfSDavid du Colombier void	struct_name(Lextok *, Symbol *, int, char *);
404219b2ee8SDavid du Colombier void	symdump(void);
405312a1df1SDavid du Colombier void	symvar(Symbol *);
406*00d97012SDavid du Colombier void	sync_product(void);
4077dd7cddfSDavid du Colombier void	trackchanuse(Lextok *, Lextok *, int);
4087dd7cddfSDavid du Colombier void	trackvar(Lextok *, Lextok *);
4097dd7cddfSDavid du Colombier void	trackrun(Lextok *);
410*00d97012SDavid du Colombier void	trapwonly(Lextok * /* , char * */);	/* spin.y and main.c */
411219b2ee8SDavid du Colombier void	typ2c(Symbol *);
4127dd7cddfSDavid du Colombier void	typ_ck(int, int, char *);
413219b2ee8SDavid du Colombier void	undostmnt(Lextok *, int);
414219b2ee8SDavid du Colombier void	unrem_Seq(void);
415219b2ee8SDavid du Colombier void	unskip(int);
416219b2ee8SDavid du Colombier void	varcheck(Element *, Element *);
417219b2ee8SDavid du Colombier void	whoruns(int);
418219b2ee8SDavid du Colombier void	wrapup(int);
419219b2ee8SDavid du Colombier void	yyerror(char *, ...);
420312a1df1SDavid du Colombier #endif
421