+++ /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