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