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