xref: /plan9/sys/src/cmd/spin/tl.h (revision 00d970127b9d44d2b22f4f656717a212dec1f1d2)
1 /***** tl_spin: tl.h *****/
2 
3 /* Copyright (c) 1995-2003 by Lucent Technologies, Bell Laboratories.     */
4 /* All Rights Reserved.  This software is for educational purposes only.  */
5 /* No guarantee whatsoever is expressed or implied by the distribution of */
6 /* this code.  Permission is given to distribute this code provided that  */
7 /* this introductory message is not removed and no monies are exchanged.  */
8 /* Software written by Gerard J. Holzmann.  For tool documentation see:   */
9 /*             http://spinroot.com/                                       */
10 /* Send all bug-reports and/or questions to: bugs@spinroot.com            */
11 
12 /* Based on the translation algorithm by Gerth, Peled, Vardi, and Wolper, */
13 /* presented at the PSTV Conference, held in 1995, Warsaw, Poland 1995.   */
14 
15 #include <stdio.h>
16 #include <string.h>
17 
18 typedef struct Symbol {
19 	char		*name;
20 	struct Symbol	*next;	/* linked list, symbol table */
21 } Symbol;
22 
23 typedef struct Node {
24 	short		ntyp;	/* node type */
25 	struct Symbol	*sym;
26 	struct Node	*lft;	/* tree */
27 	struct Node	*rgt;	/* tree */
28 	struct Node	*nxt;	/* if linked list */
29 } Node;
30 
31 typedef struct Graph {
32 	Symbol		*name;
33 	Symbol		*incoming;
34 	Symbol		*outgoing;
35 	Symbol		*oldstring;
36 	Symbol		*nxtstring;
37 	Node		*New;
38 	Node		*Old;
39 	Node		*Other;
40 	Node		*Next;
41 	unsigned char	isred[64], isgrn[64];
42 	unsigned char	redcnt, grncnt;
43 	unsigned char	reachable;
44 	struct Graph	*nxt;
45 } Graph;
46 
47 typedef struct Mapping {
48 	char	*from;
49 	Graph	*to;
50 	struct Mapping	*nxt;
51 } Mapping;
52 
53 enum {
54 	ALWAYS=257,
55 	AND,		/* 258 */
56 	EQUIV,		/* 259 */
57 	EVENTUALLY,	/* 260 */
58 	FALSE,		/* 261 */
59 	IMPLIES,	/* 262 */
60 	NOT,		/* 263 */
61 	OR,		/* 264 */
62 	PREDICATE,	/* 265 */
63 	TRUE,		/* 266 */
64 	U_OPER,		/* 267 */
65 	V_OPER		/* 268 */
66 #ifdef NXT
67 	, NEXT		/* 269 */
68 #endif
69 };
70 
71 Node	*Canonical(Node *);
72 Node	*canonical(Node *);
73 Node	*cached(Node *);
74 Node	*dupnode(Node *);
75 Node	*getnode(Node *);
76 Node	*in_cache(Node *);
77 Node	*push_negation(Node *);
78 Node	*right_linked(Node *);
79 Node	*tl_nn(int, Node *, Node *);
80 
81 Symbol	*tl_lookup(char *);
82 Symbol	*getsym(Symbol *);
83 Symbol	*DoDump(Node *);
84 
85 extern char	*emalloc(size_t);	/* in main.c */
86 
87 int	anywhere(int, Node *, Node *);
88 int	dump_cond(Node *, Node *, int);
89 int	hash(char *);	/* in sym.c */
90 int	isalnum_(int);	/* in spinlex.c */
91 int	isequal(Node *, Node *);
92 int	tl_Getchar(void);
93 
94 void	*tl_emalloc(int);
95 void	a_stats(void);
96 void	addtrans(Graph *, char *, Node *, char *);
97 void	cache_stats(void);
98 void	dump(Node *);
99 void	exit(int);
100 void	Fatal(char *, char *);
101 void	fatal(char *, char *);
102 void	fsm_print(void);
103 void	ini_buchi(void);
104 void	ini_cache(void);
105 void	ini_rewrt(void);
106 void	ini_trans(void);
107 void	releasenode(int, Node *);
108 void	tfree(void *);
109 void	tl_explain(int);
110 void	tl_UnGetchar(void);
111 void	tl_parse(void);
112 void	tl_yyerror(char *);
113 void	trans(Node *);
114 
115 #define ZN	(Node *)0
116 #define ZS	(Symbol *)0
117 #define Nhash	255    	/* must match size in spin.h */
118 #define True	tl_nn(TRUE,  ZN, ZN)
119 #define False	tl_nn(FALSE, ZN, ZN)
120 #define Not(a)	push_negation(tl_nn(NOT, a, ZN))
121 #define rewrite(n)	canonical(right_linked(n))
122 
123 typedef Node	*Nodeptr;
124 #define YYSTYPE	 Nodeptr
125 
126 #define Debug(x)	{ if (tl_verbose) printf(x); }
127 #define Debug2(x,y)	{ if (tl_verbose) printf(x,y); }
128 #define Dump(x)		{ if (tl_verbose) dump(x); }
129 #define Explain(x)	{ if (tl_verbose) tl_explain(x); }
130 
131 #define Assert(x, y)	{ if (!(x)) { tl_explain(y); \
132 			  Fatal(": assertion failed\n",(char *)0); } }
133