xref: /plan9/sys/src/cmd/spin/tl.h (revision 00d970127b9d44d2b22f4f656717a212dec1f1d2)
17dd7cddfSDavid du Colombier /***** tl_spin: tl.h *****/
27dd7cddfSDavid du Colombier 
3312a1df1SDavid du Colombier /* Copyright (c) 1995-2003 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 
127dd7cddfSDavid du Colombier /* Based on the translation algorithm by Gerth, Peled, Vardi, and Wolper, */
137dd7cddfSDavid du Colombier /* presented at the PSTV Conference, held in 1995, Warsaw, Poland 1995.   */
147dd7cddfSDavid du Colombier 
157dd7cddfSDavid du Colombier #include <stdio.h>
167dd7cddfSDavid du Colombier #include <string.h>
177dd7cddfSDavid du Colombier 
187dd7cddfSDavid du Colombier typedef struct Symbol {
197dd7cddfSDavid du Colombier 	char		*name;
207dd7cddfSDavid du Colombier 	struct Symbol	*next;	/* linked list, symbol table */
217dd7cddfSDavid du Colombier } Symbol;
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier typedef struct Node {
247dd7cddfSDavid du Colombier 	short		ntyp;	/* node type */
257dd7cddfSDavid du Colombier 	struct Symbol	*sym;
267dd7cddfSDavid du Colombier 	struct Node	*lft;	/* tree */
277dd7cddfSDavid du Colombier 	struct Node	*rgt;	/* tree */
287dd7cddfSDavid du Colombier 	struct Node	*nxt;	/* if linked list */
297dd7cddfSDavid du Colombier } Node;
307dd7cddfSDavid du Colombier 
317dd7cddfSDavid du Colombier typedef struct Graph {
327dd7cddfSDavid du Colombier 	Symbol		*name;
337dd7cddfSDavid du Colombier 	Symbol		*incoming;
347dd7cddfSDavid du Colombier 	Symbol		*outgoing;
357dd7cddfSDavid du Colombier 	Symbol		*oldstring;
367dd7cddfSDavid du Colombier 	Symbol		*nxtstring;
377dd7cddfSDavid du Colombier 	Node		*New;
387dd7cddfSDavid du Colombier 	Node		*Old;
397dd7cddfSDavid du Colombier 	Node		*Other;
407dd7cddfSDavid du Colombier 	Node		*Next;
417dd7cddfSDavid du Colombier 	unsigned char	isred[64], isgrn[64];
427dd7cddfSDavid du Colombier 	unsigned char	redcnt, grncnt;
437dd7cddfSDavid du Colombier 	unsigned char	reachable;
447dd7cddfSDavid du Colombier 	struct Graph	*nxt;
457dd7cddfSDavid du Colombier } Graph;
467dd7cddfSDavid du Colombier 
477dd7cddfSDavid du Colombier typedef struct Mapping {
487dd7cddfSDavid du Colombier 	char	*from;
497dd7cddfSDavid du Colombier 	Graph	*to;
507dd7cddfSDavid du Colombier 	struct Mapping	*nxt;
517dd7cddfSDavid du Colombier } Mapping;
527dd7cddfSDavid du Colombier 
537dd7cddfSDavid du Colombier enum {
547dd7cddfSDavid du Colombier 	ALWAYS=257,
557dd7cddfSDavid du Colombier 	AND,		/* 258 */
567dd7cddfSDavid du Colombier 	EQUIV,		/* 259 */
577dd7cddfSDavid du Colombier 	EVENTUALLY,	/* 260 */
587dd7cddfSDavid du Colombier 	FALSE,		/* 261 */
597dd7cddfSDavid du Colombier 	IMPLIES,	/* 262 */
607dd7cddfSDavid du Colombier 	NOT,		/* 263 */
617dd7cddfSDavid du Colombier 	OR,		/* 264 */
627dd7cddfSDavid du Colombier 	PREDICATE,	/* 265 */
637dd7cddfSDavid du Colombier 	TRUE,		/* 266 */
647dd7cddfSDavid du Colombier 	U_OPER,		/* 267 */
657dd7cddfSDavid du Colombier 	V_OPER		/* 268 */
667dd7cddfSDavid du Colombier #ifdef NXT
677dd7cddfSDavid du Colombier 	, NEXT		/* 269 */
687dd7cddfSDavid du Colombier #endif
697dd7cddfSDavid du Colombier };
707dd7cddfSDavid du Colombier 
717dd7cddfSDavid du Colombier Node	*Canonical(Node *);
727dd7cddfSDavid du Colombier Node	*canonical(Node *);
737dd7cddfSDavid du Colombier Node	*cached(Node *);
747dd7cddfSDavid du Colombier Node	*dupnode(Node *);
757dd7cddfSDavid du Colombier Node	*getnode(Node *);
767dd7cddfSDavid du Colombier Node	*in_cache(Node *);
777dd7cddfSDavid du Colombier Node	*push_negation(Node *);
787dd7cddfSDavid du Colombier Node	*right_linked(Node *);
797dd7cddfSDavid du Colombier Node	*tl_nn(int, Node *, Node *);
807dd7cddfSDavid du Colombier 
817dd7cddfSDavid du Colombier Symbol	*tl_lookup(char *);
827dd7cddfSDavid du Colombier Symbol	*getsym(Symbol *);
837dd7cddfSDavid du Colombier Symbol	*DoDump(Node *);
847dd7cddfSDavid du Colombier 
85*00d97012SDavid du Colombier extern char	*emalloc(size_t);	/* in main.c */
867dd7cddfSDavid du Colombier 
877dd7cddfSDavid du Colombier int	anywhere(int, Node *, Node *);
887dd7cddfSDavid du Colombier int	dump_cond(Node *, Node *, int);
897dd7cddfSDavid du Colombier int	hash(char *);	/* in sym.c */
907dd7cddfSDavid du Colombier int	isalnum_(int);	/* in spinlex.c */
917dd7cddfSDavid du Colombier int	isequal(Node *, Node *);
927dd7cddfSDavid du Colombier int	tl_Getchar(void);
937dd7cddfSDavid du Colombier 
947dd7cddfSDavid du Colombier void	*tl_emalloc(int);
957dd7cddfSDavid du Colombier void	a_stats(void);
967dd7cddfSDavid du Colombier void	addtrans(Graph *, char *, Node *, char *);
977dd7cddfSDavid du Colombier void	cache_stats(void);
987dd7cddfSDavid du Colombier void	dump(Node *);
997dd7cddfSDavid du Colombier void	exit(int);
1007dd7cddfSDavid du Colombier void	Fatal(char *, char *);
1017dd7cddfSDavid du Colombier void	fatal(char *, char *);
1027dd7cddfSDavid du Colombier void	fsm_print(void);
103*00d97012SDavid du Colombier void	ini_buchi(void);
104*00d97012SDavid du Colombier void	ini_cache(void);
105*00d97012SDavid du Colombier void	ini_rewrt(void);
106*00d97012SDavid du Colombier void	ini_trans(void);
1077dd7cddfSDavid du Colombier void	releasenode(int, Node *);
1087dd7cddfSDavid du Colombier void	tfree(void *);
1097dd7cddfSDavid du Colombier void	tl_explain(int);
1107dd7cddfSDavid du Colombier void	tl_UnGetchar(void);
1117dd7cddfSDavid du Colombier void	tl_parse(void);
1127dd7cddfSDavid du Colombier void	tl_yyerror(char *);
1137dd7cddfSDavid du Colombier void	trans(Node *);
1147dd7cddfSDavid du Colombier 
1157dd7cddfSDavid du Colombier #define ZN	(Node *)0
1167dd7cddfSDavid du Colombier #define ZS	(Symbol *)0
1177dd7cddfSDavid du Colombier #define Nhash	255    	/* must match size in spin.h */
1187dd7cddfSDavid du Colombier #define True	tl_nn(TRUE,  ZN, ZN)
1197dd7cddfSDavid du Colombier #define False	tl_nn(FALSE, ZN, ZN)
1207dd7cddfSDavid du Colombier #define Not(a)	push_negation(tl_nn(NOT, a, ZN))
1217dd7cddfSDavid du Colombier #define rewrite(n)	canonical(right_linked(n))
1227dd7cddfSDavid du Colombier 
1237dd7cddfSDavid du Colombier typedef Node	*Nodeptr;
1247dd7cddfSDavid du Colombier #define YYSTYPE	 Nodeptr
1257dd7cddfSDavid du Colombier 
1267dd7cddfSDavid du Colombier #define Debug(x)	{ if (tl_verbose) printf(x); }
1277dd7cddfSDavid du Colombier #define Debug2(x,y)	{ if (tl_verbose) printf(x,y); }
1287dd7cddfSDavid du Colombier #define Dump(x)		{ if (tl_verbose) dump(x); }
1297dd7cddfSDavid du Colombier #define Explain(x)	{ if (tl_verbose) tl_explain(x); }
1307dd7cddfSDavid du Colombier 
1317dd7cddfSDavid du Colombier #define Assert(x, y)	{ if (!(x)) { tl_explain(y); \
1327dd7cddfSDavid du Colombier 			  Fatal(": assertion failed\n",(char *)0); } }
133