--- /dev/null
+/***** spin: spin.h *****/
+
+/* Copyright (c) 1989-2007 by Lucent Technologies, Bell Laboratories. */
+/* All Rights Reserved. This software is for educational purposes only. */
+/* No guarantee whatsoever is expressed or implied by the distribution of */
+/* this code. Permission is given to distribute this code provided that */
+/* this introductory message is not removed and no monies are exchanged. */
+/* Software written by Gerard J. Holzmann. For tool documentation see: */
+/* http://spinroot.com/ */
+/* Send all bug-reports and/or questions to: bugs@spinroot.com */
+
+#ifndef SEEN_SPIN_H
+#define SEEN_SPIN_H
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#ifndef PC
+#include <memory.h>
+#endif
+
+typedef struct Lextok {
+ unsigned short ntyp; /* node type */
+ short ismtyp; /* CONST derived from MTYP */
+ int val; /* value attribute */
+ int ln; /* line number */
+ int indstep; /* part of d_step sequence */
+ struct Symbol *fn; /* file name */
+ struct Symbol *sym; /* symbol reference */
+ struct Sequence *sq; /* sequence */
+ struct SeqList *sl; /* sequence list */
+ struct Lextok *lft, *rgt; /* children in parse tree */
+} Lextok;
+
+typedef struct Slicer {
+ Lextok *n; /* global var, usable as slice criterion */
+ short code; /* type of use: DEREF_USE or normal USE */
+ short used; /* set when handled */
+ struct Slicer *nxt; /* linked list */
+} Slicer;
+
+typedef struct Access {
+ struct Symbol *who; /* proctype name of accessor */
+ struct Symbol *what; /* proctype name of accessed */
+ int cnt, typ; /* parameter nr and, e.g., 's' or 'r' */
+ struct Access *lnk; /* linked list */
+} Access;
+
+typedef struct Symbol {
+ char *name;
+ int Nid; /* unique number for the name */
+ unsigned short type; /* bit,short,.., chan,struct */
+ unsigned char hidden; /* bit-flags:
+ 1=hide, 2=show,
+ 4=bit-equiv, 8=byte-equiv,
+ 16=formal par, 32=inline par,
+ 64=treat as if local; 128=read at least once
+ */
+ unsigned char colnr; /* for use with xspin during simulation */
+ int nbits; /* optional width specifier */
+ int nel; /* 1 if scalar, >1 if array */
+ int setat; /* last depth value changed */
+ int *val; /* runtime value(s), initl 0 */
+ Lextok **Sval; /* values for structures */
+
+ int xu; /* exclusive r or w by 1 pid */
+ struct Symbol *xup[2]; /* xr or xs proctype */
+ struct Access *access;/* e.g., senders and receives of chan */
+ Lextok *ini; /* initial value, or chan-def */
+ Lextok *Slst; /* template for structure if struct */
+ struct Symbol *Snm; /* name of the defining struct */
+ struct Symbol *owner; /* set for names of subfields in typedefs */
+ struct Symbol *context; /* 0 if global, or procname */
+ struct Symbol *next; /* linked list */
+} Symbol;
+
+typedef struct Ordered { /* links all names in Symbol table */
+ struct Symbol *entry;
+ struct Ordered *next;
+} Ordered;
+
+typedef struct Queue {
+ short qid; /* runtime q index */
+ int qlen; /* nr messages stored */
+ int nslots, nflds; /* capacity, flds/slot */
+ int setat; /* last depth value changed */
+ int *fld_width; /* type of each field */
+ int *contents; /* the values stored */
+ int *stepnr; /* depth when each msg was sent */
+ struct Queue *nxt; /* linked list */
+} Queue;
+
+typedef struct FSM_state { /* used in pangen5.c - dataflow */
+ int from; /* state number */
+ int seen; /* used for dfs */
+ int in; /* nr of incoming edges */
+ int cr; /* has reachable 1-relevant successor */
+ int scratch;
+ unsigned long *dom, *mod; /* to mark dominant nodes */
+ struct FSM_trans *t; /* outgoing edges */
+ struct FSM_trans *p; /* incoming edges, predecessors */
+ struct FSM_state *nxt; /* linked list of all states */
+} FSM_state;
+
+typedef struct FSM_trans { /* used in pangen5.c - dataflow */
+ int to;
+ short relevant; /* when sliced */
+ short round; /* ditto: iteration when marked */
+ struct FSM_use *Val[2]; /* 0=reads, 1=writes */
+ struct Element *step;
+ struct FSM_trans *nxt;
+} FSM_trans;
+
+typedef struct FSM_use { /* used in pangen5.c - dataflow */
+ Lextok *n;
+ Symbol *var;
+ int special;
+ struct FSM_use *nxt;
+} FSM_use;
+
+typedef struct Element {
+ Lextok *n; /* defines the type & contents */
+ int Seqno; /* identifies this el within system */
+ int seqno; /* identifies this el within a proc */
+ int merge; /* set by -O if step can be merged */
+ int merge_start;
+ int merge_single;
+ short merge_in; /* nr of incoming edges */
+ short merge_mark; /* state was generated in merge sequence */
+ unsigned int status; /* used by analyzer generator */
+ struct FSM_use *dead; /* optional dead variable list */
+ struct SeqList *sub; /* subsequences, for compounds */
+ struct SeqList *esc; /* zero or more escape sequences */
+ struct Element *Nxt; /* linked list - for global lookup */
+ struct Element *nxt; /* linked list - program structure */
+} Element;
+
+typedef struct Sequence {
+ Element *frst;
+ Element *last; /* links onto continuations */
+ Element *extent; /* last element in original */
+ int maxel; /* 1+largest id in sequence */
+} Sequence;
+
+typedef struct SeqList {
+ Sequence *this; /* one sequence */
+ struct SeqList *nxt; /* linked list */
+} SeqList;
+
+typedef struct Label {
+ Symbol *s;
+ Symbol *c;
+ Element *e;
+ int visible; /* label referenced in claim (slice relevant) */
+ struct Label *nxt;
+} Label;
+
+typedef struct Lbreak {
+ Symbol *l;
+ struct Lbreak *nxt;
+} Lbreak;
+
+typedef struct RunList {
+ Symbol *n; /* name */
+ int tn; /* ordinal of type */
+ int pid; /* process id */
+ int priority; /* for simulations only */
+ Element *pc; /* current stmnt */
+ Sequence *ps; /* used by analyzer generator */
+ Lextok *prov; /* provided clause */
+ Symbol *symtab; /* local variables */
+ struct RunList *nxt; /* linked list */
+} RunList;
+
+typedef struct ProcList {
+ Symbol *n; /* name */
+ Lextok *p; /* parameters */
+ Sequence *s; /* body */
+ Lextok *prov; /* provided clause */
+ short tn; /* ordinal number */
+ unsigned char det; /* deterministic */
+ unsigned char unsafe; /* contains global var inits */
+ struct ProcList *nxt; /* linked list */
+} ProcList;
+
+typedef Lextok *Lexptr;
+
+#define YYSTYPE Lexptr
+
+#define ZN (Lextok *)0
+#define ZS (Symbol *)0
+#define ZE (Element *)0
+
+#define DONE 1 /* status bits of elements */
+#define ATOM 2 /* part of an atomic chain */
+#define L_ATOM 4 /* last element in a chain */
+#define I_GLOB 8 /* inherited global ref */
+#define DONE2 16 /* used in putcode and main*/
+#define D_ATOM 32 /* deterministic atomic */
+#define ENDSTATE 64 /* normal endstate */
+#define CHECK2 128 /* status bits for remote ref check */
+#define CHECK3 256 /* status bits for atomic jump check */
+
+#define Nhash 255 /* slots in symbol hash-table */
+
+#define XR 1 /* non-shared receive-only */
+#define XS 2 /* non-shared send-only */
+#define XX 4 /* overrides XR or XS tag */
+
+#define CODE_FRAG 2 /* auto-numbered code-fragment */
+#define CODE_DECL 4 /* auto-numbered c_decl */
+#define PREDEF 3 /* predefined name: _p, _last */
+
+#define UNSIGNED 5 /* val defines width in bits */
+#define BIT 1 /* also equal to width in bits */
+#define BYTE 8 /* ditto */
+#define SHORT 16 /* ditto */
+#define INT 32 /* ditto */
+#define CHAN 64 /* not */
+#define STRUCT 128 /* user defined structure name */
+
+#define SOMETHINGBIG 65536
+#define RATHERSMALL 512
+
+#ifndef max
+#define max(a,b) (((a)<(b)) ? (b) : (a))
+#endif
+
+enum { INIV, PUTV, LOGV }; /* for pangen[14].c */
+
+/***** prototype definitions *****/
+Element *eval_sub(Element *);
+Element *get_lab(Lextok *, int);
+Element *huntele(Element *, int, int);
+Element *huntstart(Element *);
+Element *target(Element *);
+
+Lextok *do_unless(Lextok *, Lextok *);
+Lextok *expand(Lextok *, int);
+Lextok *getuname(Symbol *);
+Lextok *mk_explicit(Lextok *, int, int);
+Lextok *nn(Lextok *, int, Lextok *, Lextok *);
+Lextok *rem_lab(Symbol *, Lextok *, Symbol *);
+Lextok *rem_var(Symbol *, Lextok *, Symbol *, Lextok *);
+Lextok *tail_add(Lextok *, Lextok *);
+
+ProcList *ready(Symbol *, Lextok *, Sequence *, int, Lextok *);
+
+SeqList *seqlist(Sequence *, SeqList *);
+Sequence *close_seq(int);
+
+Symbol *break_dest(void);
+Symbol *findloc(Symbol *);
+Symbol *has_lab(Element *, int);
+Symbol *lookup(char *);
+Symbol *prep_inline(Symbol *, Lextok *);
+
+char *emalloc(size_t);
+long Rand(void);
+
+int any_oper(Lextok *, int);
+int any_undo(Lextok *);
+int c_add_sv(FILE *);
+int cast_val(int, int, int);
+int checkvar(Symbol *, int);
+int Cnt_flds(Lextok *);
+int cnt_mpars(Lextok *);
+int complete_rendez(void);
+int enable(Lextok *);
+int Enabled0(Element *);
+int eval(Lextok *);
+int find_lab(Symbol *, Symbol *, int);
+int find_maxel(Symbol *);
+int full_name(FILE *, Lextok *, Symbol *, int);
+int getlocal(Lextok *);
+int getval(Lextok *);
+int glob_inline(char *);
+int has_typ(Lextok *, int);
+int in_bound(Symbol *, int);
+int interprint(FILE *, Lextok *);
+int printm(FILE *, Lextok *);
+int ismtype(char *);
+int isproctype(char *);
+int isutype(char *);
+int Lval_struct(Lextok *, Symbol *, int, int);
+int main(int, char **);
+int pc_value(Lextok *);
+int proper_enabler(Lextok *);
+int putcode(FILE *, Sequence *, Element *, int, int, int);
+int q_is_sync(Lextok *);
+int qlen(Lextok *);
+int qfull(Lextok *);
+int qmake(Symbol *);
+int qrecv(Lextok *, int);
+int qsend(Lextok *);
+int remotelab(Lextok *);
+int remotevar(Lextok *);
+int Rval_struct(Lextok *, Symbol *, int);
+int setlocal(Lextok *, int);
+int setval(Lextok *, int);
+int sputtype(char *, int);
+int Sym_typ(Lextok *);
+int tl_main(int, char *[]);
+int Width_set(int *, int, Lextok *);
+int yyparse(void);
+int yywrap(void);
+int yylex(void);
+
+void AST_track(Lextok *, int);
+void add_seq(Lextok *);
+void alldone(int);
+void announce(char *);
+void c_state(Symbol *, Symbol *, Symbol *);
+void c_add_def(FILE *);
+void c_add_loc(FILE *, char *);
+void c_add_locinit(FILE *, int, char *);
+void c_add_use(FILE *);
+void c_chandump(FILE *);
+void c_preview(void);
+void c_struct(FILE *, char *, Symbol *);
+void c_track(Symbol *, Symbol *, Symbol *);
+void c_var(FILE *, char *, Symbol *);
+void c_wrapper(FILE *);
+void chanaccess(void);
+void check_param_count(int, Lextok *);
+void checkrun(Symbol *, int);
+void comment(FILE *, Lextok *, int);
+void cross_dsteps(Lextok *, Lextok *);
+void doq(Symbol *, int, RunList *);
+void dotag(FILE *, char *);
+void do_locinits(FILE *);
+void do_var(FILE *, int, char *, Symbol *, char *, char *, char *);
+void dump_struct(Symbol *, char *, RunList *);
+void dumpclaims(FILE *, int, char *);
+void dumpglobals(void);
+void dumplabels(void);
+void dumplocal(RunList *);
+void dumpsrc(int, int);
+void fatal(char *, char *);
+void fix_dest(Symbol *, Symbol *);
+void genaddproc(void);
+void genaddqueue(void);
+void gencodetable(FILE *);
+void genheader(void);
+void genother(void);
+void gensrc(void);
+void gensvmap(void);
+void genunio(void);
+void ini_struct(Symbol *);
+void loose_ends(void);
+void make_atomic(Sequence *, int);
+void match_trail(void);
+void no_side_effects(char *);
+void nochan_manip(Lextok *, Lextok *, int);
+void non_fatal(char *, char *);
+void ntimes(FILE *, int, int, char *c[]);
+void open_seq(int);
+void p_talk(Element *, int);
+void pickup_inline(Symbol *, Lextok *);
+void plunk_c_decls(FILE *);
+void plunk_c_fcts(FILE *);
+void plunk_expr(FILE *, char *);
+void plunk_inline(FILE *, char *, int);
+void prehint(Symbol *);
+void preruse(FILE *, Lextok *);
+void prune_opts(Lextok *);
+void pstext(int, char *);
+void pushbreak(void);
+void putname(FILE *, char *, Lextok *, int, char *);
+void putremote(FILE *, Lextok *, int);
+void putskip(int);
+void putsrc(Element *);
+void putstmnt(FILE *, Lextok *, int);
+void putunames(FILE *);
+void rem_Seq(void);
+void runnable(ProcList *, int, int);
+void sched(void);
+void setaccess(Symbol *, Symbol *, int, int);
+void set_lab(Symbol *, Element *);
+void setmtype(Lextok *);
+void setpname(Lextok *);
+void setptype(Lextok *, int, Lextok *);
+void setuname(Lextok *);
+void setutype(Lextok *, Symbol *, Lextok *);
+void setxus(Lextok *, int);
+void Srand(unsigned);
+void start_claim(int);
+void struct_name(Lextok *, Symbol *, int, char *);
+void symdump(void);
+void symvar(Symbol *);
+void trackchanuse(Lextok *, Lextok *, int);
+void trackvar(Lextok *, Lextok *);
+void trackrun(Lextok *);
+void trapwonly(Lextok * /* , char * */); /* spin.y and main.c */
+void typ2c(Symbol *);
+void typ_ck(int, int, char *);
+void undostmnt(Lextok *, int);
+void unrem_Seq(void);
+void unskip(int);
+void varcheck(Element *, Element *);
+void whoruns(int);
+void wrapup(int);
+void yyerror(char *, ...);
+#endif