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