xref: /plan9-contrib/sys/src/cmd/spin/pangen1.h (revision de2caf28f9ba1a56e70be94a699435d36eb50311)
1219b2ee8SDavid du Colombier /***** spin: pangen1.h *****/
2219b2ee8SDavid du Colombier 
3*de2caf28SDavid du Colombier /*
4*de2caf28SDavid du Colombier  * This file is part of the public release of Spin. It is subject to the
5*de2caf28SDavid du Colombier  * terms in the LICENSE file that is included in this source directory.
6*de2caf28SDavid du Colombier  * Tool documentation is available at http://spinroot.com
7*de2caf28SDavid du Colombier  */
8219b2ee8SDavid du Colombier 
9*de2caf28SDavid du Colombier static const char *Code2a[] = { /* the tail of procedure run() */
1000d97012SDavid du Colombier 	"	if (state_tables)",
1100d97012SDavid du Colombier 	"	{ if (dodot) exit(0);",
1200d97012SDavid du Colombier 	"	  printf(\"\\nTransition Type: \");",
1300d97012SDavid du Colombier 	"	  printf(\"A=atomic; D=d_step; L=local; G=global\\n\");",
1400d97012SDavid du Colombier 	"	  printf(\"Source-State Labels: \");",
1500d97012SDavid du Colombier 	"	  printf(\"p=progress; e=end; a=accept;\\n\");",
1600d97012SDavid du Colombier 	"#ifdef MERGED",
1700d97012SDavid du Colombier 	"	  printf(\"Note: statement merging was used. Only the first\\n\");",
1800d97012SDavid du Colombier 	"	  printf(\"      stmnt executed in each merge sequence is shown\\n\");",
1900d97012SDavid du Colombier 	"	  printf(\"      (use spin -a -o3 to disable statement merging)\\n\");",
2000d97012SDavid du Colombier 	"#endif",
2100d97012SDavid du Colombier 	"	  pan_exit(0);",
2200d97012SDavid du Colombier 	"	}",
2300d97012SDavid du Colombier 	"#if defined(BFS) && defined(TRIX)", /* before iniglobals */
2400d97012SDavid du Colombier 	"	{ int i;",
2500d97012SDavid du Colombier 	"	  for (i = 0; i < MAXPROC+1; i++)",
2600d97012SDavid du Colombier 	"	  {	processes[i] = (TRIX_v6 *) emalloc(sizeof(TRIX_v6));",
2700d97012SDavid du Colombier 	"		processes[i]->body = (uchar *) emalloc(Maxbody * sizeof(char));",
2800d97012SDavid du Colombier 	"	  }",
2900d97012SDavid du Colombier 	"	  for (i = 0; i < MAXQ+1; i++)",
3000d97012SDavid du Colombier 	"	  {	channels[i] = (TRIX_v6 *) emalloc(sizeof(TRIX_v6));",
3100d97012SDavid du Colombier 	"		channels[i]->body = (uchar *) emalloc(Maxbody * sizeof(char));",
3200d97012SDavid du Colombier 	"	} }",
3300d97012SDavid du Colombier 	"#endif",
34*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
35*de2caf28SDavid du Colombier 	"	bfs_setup_mem();",
36*de2caf28SDavid du Colombier 	"	#ifdef COLLAPSE",
37*de2caf28SDavid du Colombier 	"	/* this must be the very first allocation from the shared heap */",
38*de2caf28SDavid du Colombier 	"		#ifdef BFS_SEP_HASH",
39*de2caf28SDavid du Colombier 	"		ncomps = (ulong *) emalloc((ulong)((256+2) * sizeof(ulong)));",
40*de2caf28SDavid du Colombier 	"		#else",
41*de2caf28SDavid du Colombier 	"		ncomps = (ulong *) sh_pre_malloc((ulong)((256+2) * sizeof(ulong)));",
42*de2caf28SDavid du Colombier 	"		#endif",
43*de2caf28SDavid du Colombier 	"	#endif",
44*de2caf28SDavid du Colombier 	"#endif",
4500d97012SDavid du Colombier 	"	iniglobals(258); /* arg outside range of pids */",
46*de2caf28SDavid du Colombier 	"#if defined(VERI) && !defined(NOREDUCE) && !defined(NP) && !defined(BFS) && !defined(HAS_LTL)",
47312a1df1SDavid du Colombier 	"	if (!state_tables",
48312a1df1SDavid du Colombier 	"	#ifdef HAS_CODE",
49312a1df1SDavid du Colombier 	"	&& !readtrail",
50312a1df1SDavid du Colombier 	"	#endif",
5100d97012SDavid du Colombier 	"	#if NCORE>1",
5200d97012SDavid du Colombier 	"	&& core_id == 0",
5300d97012SDavid du Colombier 	"	#endif",
54312a1df1SDavid du Colombier 	"	)",
557dd7cddfSDavid du Colombier 	"	{ printf(\"warning: for p.o. reduction to be valid \");",
56312a1df1SDavid du Colombier 	"	  printf(\"the never claim must be stutter-invariant\\n\");",
577dd7cddfSDavid du Colombier 	"	  printf(\"(never claims generated from LTL \");",
58312a1df1SDavid du Colombier 	"	  printf(\"formulae are stutter-invariant)\\n\");",
59219b2ee8SDavid du Colombier 	"	}",
60219b2ee8SDavid du Colombier 	"#endif",
61219b2ee8SDavid du Colombier 	"	UnBlock;	/* disable rendez-vous */",
62219b2ee8SDavid du Colombier 	"#ifdef BITSTATE",
63*de2caf28SDavid du Colombier 	"	sinit();",
64219b2ee8SDavid du Colombier 	"#else",
65219b2ee8SDavid du Colombier 	"	hinit();",
66219b2ee8SDavid du Colombier 	"#endif",
67219b2ee8SDavid du Colombier 	"#if defined(FULLSTACK) && defined(BITSTATE)",
68219b2ee8SDavid du Colombier 	"	onstack_init();",
69219b2ee8SDavid du Colombier 	"#endif",
70312a1df1SDavid du Colombier 	"#if defined(CNTRSTACK) && !defined(BFS)",
7100d97012SDavid du Colombier 	"	LL = (uchar *) emalloc(ONE_L<<(ssize-3));",
72219b2ee8SDavid du Colombier 	"#endif",
7300d97012SDavid du Colombier 	"	stack	= (_Stack *) emalloc(sizeof(_Stack));",
74219b2ee8SDavid du Colombier 	"	svtack	= (Svtack *) emalloc(sizeof(Svtack));",
75219b2ee8SDavid du Colombier 	"	/* a place to point for Pptr of non-running procs: */",
7600d97012SDavid du Colombier 	"	noqptr = noptr	= (uchar *) emalloc(Maxbody * sizeof(char));",
7700d97012SDavid du Colombier 	"#if defined(SVDUMP) && defined(VERBOSE)",
787dd7cddfSDavid du Colombier 	"	if (vprefix > 0)",
7900d97012SDavid du Colombier 	"		(void) write(svfd, (uchar *) &vprefix, sizeof(int));",
807dd7cddfSDavid du Colombier 	"#endif",
81219b2ee8SDavid du Colombier 	"#ifdef VERI",
82*de2caf28SDavid du Colombier 	"	Addproc(VERI,1);	/* pid = 0, priority 1 */",
8300d97012SDavid du Colombier 	"	#if NCLAIMS>1",
8400d97012SDavid du Colombier 	"	if (claimname != NULL)",
8500d97012SDavid du Colombier 	"	{	whichclaim = find_claim(claimname);",
8600d97012SDavid du Colombier 	"		select_claim(whichclaim);",
8700d97012SDavid du Colombier 	"	}",
8800d97012SDavid du Colombier 	"	#endif",
89219b2ee8SDavid du Colombier 	"#endif",
90219b2ee8SDavid du Colombier 	"	active_procs();	/* started after never */",
917dd7cddfSDavid du Colombier 	"#ifdef EVENT_TRACE",
927dd7cddfSDavid du Colombier 	"	now._event = start_event;",
937dd7cddfSDavid du Colombier 	"	reached[EVENT_TRACE][start_event] = 1;",
947dd7cddfSDavid du Colombier 	"#endif",
95312a1df1SDavid du Colombier 
96312a1df1SDavid du Colombier 	"#ifdef HAS_CODE",
97312a1df1SDavid du Colombier 	"	globinit();",
98312a1df1SDavid du Colombier 	"#endif",
99312a1df1SDavid du Colombier 	"#ifdef BITSTATE",
100219b2ee8SDavid du Colombier 	"go_again:",
101312a1df1SDavid du Colombier 	"#endif",
1027dd7cddfSDavid du Colombier 	"	do_the_search();",
103312a1df1SDavid du Colombier 	"#ifdef BITSTATE",
104*de2caf28SDavid du Colombier 	"	if (--Nrun > 0 && HASH_CONST[++HASH_NR])", /* last entry is 0 */
105219b2ee8SDavid du Colombier 	"	{	printf(\"Run %%d:\\n\", HASH_NR);",
106219b2ee8SDavid du Colombier 	"		wrap_stats();",
107219b2ee8SDavid du Colombier 	"		printf(\"\\n\");",
10800d97012SDavid du Colombier 	"		if (udmem)	/* Dillinger 3/2/09 */",
10900d97012SDavid du Colombier 	"		{	memset(SS, 0, udmem);",
11000d97012SDavid du Colombier 	"		} else",
11100d97012SDavid du Colombier 	"		{	memset(SS, 0, ONE_L<<(ssize-3));",
11200d97012SDavid du Colombier 	"		}",
11300d97012SDavid du Colombier 		"#ifdef CNTRSTACK",
11400d97012SDavid du Colombier 	"		memset(LL, 0, ONE_L<<(ssize-3));",
115219b2ee8SDavid du Colombier 		"#endif",
11600d97012SDavid du Colombier 		"#ifdef FULLSTACK",
1177dd7cddfSDavid du Colombier 	"		memset((uchar *) S_Tab, 0, ",
118*de2caf28SDavid du Colombier 	"		maxdepth*sizeof(H_el *));",
1197dd7cddfSDavid du Colombier 		"#endif",
1207dd7cddfSDavid du Colombier 	"		nstates=nlinks=truncs=truncs2=ngrabs = 0;",
121219b2ee8SDavid du Colombier 	"		nlost=nShadow=hcmp = 0;",
122219b2ee8SDavid du Colombier 	"		Fa=Fh=Zh=Zn = 0;",
123219b2ee8SDavid du Colombier 	"		PUT=PROBE=ZAPS=Ccheck=Cholds = 0;",
124219b2ee8SDavid du Colombier 	"		goto go_again;",
125219b2ee8SDavid du Colombier 	"	}",
126219b2ee8SDavid du Colombier 	"#endif",
127219b2ee8SDavid du Colombier 	"}",
128*de2caf28SDavid du Colombier 	"#ifdef HAS_PRIORITY",
129*de2caf28SDavid du Colombier 	"extern int highest_priority(int, short, Trans *);",
130*de2caf28SDavid du Colombier 	"extern int get_priority(int);",
131*de2caf28SDavid du Colombier 	"extern int set_priority(int, int);",
132*de2caf28SDavid du Colombier 	"#endif",
133*de2caf28SDavid du Colombier 	"#ifdef SPIN_HEAP",
134*de2caf28SDavid du Colombier 	"void *",
135*de2caf28SDavid du Colombier 	"spin_malloc(int n)	/* reserved for use by Modex generated models */",
136*de2caf28SDavid du Colombier 	"{	char *spin_heap_ptr = &(now.spin_heap[now.spin_heap_n]);",
137*de2caf28SDavid du Colombier 	"	if (now.spin_heap_n + n >= sizeof(now.spin_heap))",
138*de2caf28SDavid du Colombier 	"	{	Uerror(\"spin_heap limit reached\");",
139*de2caf28SDavid du Colombier 	"	}",
140*de2caf28SDavid du Colombier 	"	now.spin_heap_n += n;",
141*de2caf28SDavid du Colombier 	"	return spin_heap_ptr;",
142*de2caf28SDavid du Colombier 	"}",
143*de2caf28SDavid du Colombier 	"void",
144*de2caf28SDavid du Colombier 	"spin_free(void *unused)",
145*de2caf28SDavid du Colombier 	"{	unused; /* ignore */",
146*de2caf28SDavid du Colombier 	"}",
147*de2caf28SDavid du Colombier 	"#endif",
148*de2caf28SDavid du Colombier 	"int",
149*de2caf28SDavid du Colombier 	"spin_join(int p, void **unused)",
150*de2caf28SDavid du Colombier 	"{	/* fprintf(stderr, \"join %%d when %%d\\n \", p, now._nr_pr); */",
151*de2caf28SDavid du Colombier 	"	return (now._nr_pr <= p);	/* process *p has stopped */",
152*de2caf28SDavid du Colombier 	"}",
153*de2caf28SDavid du Colombier 	"",
154*de2caf28SDavid du Colombier 	"int",
155*de2caf28SDavid du Colombier 	"spin_mutex_free(int *m)",
156*de2caf28SDavid du Colombier 	"{	return (*m == 0);",
157*de2caf28SDavid du Colombier 	"}",
158*de2caf28SDavid du Colombier 	"",
159*de2caf28SDavid du Colombier 	"int",
160*de2caf28SDavid du Colombier 	"spin_mutex_lock(int *m)",
161*de2caf28SDavid du Colombier 	"{	*m = 1;",
162*de2caf28SDavid du Colombier 	"	return 1;",
163*de2caf28SDavid du Colombier 	"}",
164*de2caf28SDavid du Colombier 	"void",
165*de2caf28SDavid du Colombier 	"spin_mutex_destroy(int *m)",
166*de2caf28SDavid du Colombier 	"{	*m = 0;",
167*de2caf28SDavid du Colombier 	"}",
168*de2caf28SDavid du Colombier 	"void",
169*de2caf28SDavid du Colombier 	"spin_mutex_unlock(int *m)",
170*de2caf28SDavid du Colombier 	"{	*m = 0;",
171*de2caf28SDavid du Colombier 	"}",
172*de2caf28SDavid du Colombier 	"void",
173*de2caf28SDavid du Colombier 	"spin_mutex_init(int *m, void *val)",
174*de2caf28SDavid du Colombier 	"{",
175*de2caf28SDavid du Colombier 	"	if (!val)", /* the 2nd arg must be NULL, for now */
176*de2caf28SDavid du Colombier 	"	{	*m = 0;",
177*de2caf28SDavid du Colombier 	"	} else",
178*de2caf28SDavid du Colombier 	"	{	Uerror(\"pthread_mutex_init: unsupported non-default init\");",
179*de2caf28SDavid du Colombier 	"	}",
180*de2caf28SDavid du Colombier 	"}",
181*de2caf28SDavid du Colombier 	"",
182*de2caf28SDavid du Colombier 	"int",
183*de2caf28SDavid du Colombier 	"spin_cond_wait(int *cond, int *lck)",	/*release and re-acquire lock *lck */
184*de2caf28SDavid du Colombier 	"{	/* this version does not scale very far alas */",
185*de2caf28SDavid du Colombier 	"	if (((P0 *)_this)->_pid + 1 >= WS*8)", /* 32 or 64 */
186*de2caf28SDavid du Colombier 	"	{	Uerror(\"pid exceeds range supported by pthread_cond_wait\");",
187*de2caf28SDavid du Colombier 	"	}",
188*de2caf28SDavid du Colombier 	"	if (((*cond)&1) == 0)",		/* repeatedly tested, so: */
189*de2caf28SDavid du Colombier 	"	{	spin_mutex_unlock(lck);", /* avoid double counting */
190*de2caf28SDavid du Colombier 	"		*cond |= (1<<(((P0 *)_this)->_pid + 1));",
191*de2caf28SDavid du Colombier 	"		return 0;",	/* blocked, must test again */
192*de2caf28SDavid du Colombier 	"	} else",
193*de2caf28SDavid du Colombier 	"	{	/* if other processes are already waiting */",
194*de2caf28SDavid du Colombier 	"		/* while our wait flag is 0, then they should go first */",
195*de2caf28SDavid du Colombier 	"		if (((*cond)&(~(1 | (1<<(((P0 *)_this)->_pid + 1))))) != 0)",
196*de2caf28SDavid du Colombier 	"		{	spin_mutex_unlock(lck);",
197*de2caf28SDavid du Colombier 	"			return 0;", /* wait for the others to go first */
198*de2caf28SDavid du Colombier 	"		}",
199*de2caf28SDavid du Colombier 	"		*cond &= ~1;",	/* clear the 'go' bit andy wait flag */
200*de2caf28SDavid du Colombier 	"		*cond &= ~(1<<(((P0 *)_this)->_pid + 1));",
201*de2caf28SDavid du Colombier 	"		return 1;",	/* okay to proceed */
202*de2caf28SDavid du Colombier 	"	}",
203*de2caf28SDavid du Colombier 	"}",
204*de2caf28SDavid du Colombier 	"void",
205*de2caf28SDavid du Colombier 	"spin_cond_signal(int *cond)",
206*de2caf28SDavid du Colombier 	"{",
207*de2caf28SDavid du Colombier 	"	if ( ((*cond)&(~1)) != 0 )", /* procs are waiting */
208*de2caf28SDavid du Colombier 	"	{	*cond |= 1;",	/* set the 'go' bit */
209*de2caf28SDavid du Colombier 	"	}",
210*de2caf28SDavid du Colombier 	"}",
211*de2caf28SDavid du Colombier 	"",
212312a1df1SDavid du Colombier 	"#ifdef HAS_PROVIDED",
213312a1df1SDavid du Colombier 	"	int provided(int, uchar, int, Trans *);",
214312a1df1SDavid du Colombier 	"#endif",
215*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
216*de2caf28SDavid du Colombier 	"	extern void bfs_shutdown(const char *);",
217*de2caf28SDavid du Colombier 	"#endif",
218*de2caf28SDavid du Colombier 	"",
21900d97012SDavid du Colombier 	"#if NCORE>1",
22000d97012SDavid du Colombier 	"	#define GLOBAL_LOCK	(0)",
22100d97012SDavid du Colombier 	"	#ifndef CS_N",
22200d97012SDavid du Colombier 	"		#define CS_N		(256*NCORE)", /* must be a power of 2 */
22300d97012SDavid du Colombier 	"	#endif",
22400d97012SDavid du Colombier 
22500d97012SDavid du Colombier 	"	#ifdef NGQ",	/* no global queue */
22600d97012SDavid du Colombier 	"		#define NR_QS		(NCORE)",
22700d97012SDavid du Colombier 	"		#define CS_NR		(CS_N+1)	/* 2^N + 1, nr critical sections */",
22800d97012SDavid du Colombier 	"		#define GQ_RD		GLOBAL_LOCK",	/* not really used in this mode */
22900d97012SDavid du Colombier 	"		#define GQ_WR		GLOBAL_LOCK",	/* but just in case... */
23000d97012SDavid du Colombier 	"		#define CS_ID		(1 + (int) (j1_spin & (CS_N-1))) /* mask: 2^N - 1, zero reserved */",
23100d97012SDavid du Colombier 	"		#define QLOCK(n)	(1+n)", /* overlaps first n zones of hashtable */
23200d97012SDavid du Colombier 	"	#else",
23300d97012SDavid du Colombier 	"		#define NR_QS		(NCORE+1)",	/* add a global queue */
23400d97012SDavid du Colombier 	"		#define CS_NR		(CS_N+3)",	/* 2 extra locks for global q */
23500d97012SDavid du Colombier 	"		#define GQ_RD		(1)",		/* read access to global q */
23600d97012SDavid du Colombier 	"		#define GQ_WR		(2)",		/* write access to global q */
23700d97012SDavid du Colombier 	"		#define CS_ID		(3 + (int) (j1_spin & (CS_N-1)))",
23800d97012SDavid du Colombier 	"		#define QLOCK(n)	(3+n)",/* overlaps first n zones of hashtable */
23900d97012SDavid du Colombier 	"	#endif",
24000d97012SDavid du Colombier 	"",
24100d97012SDavid du Colombier 	"	#ifndef SEP_STATE",
24200d97012SDavid du Colombier 	"		#define enter_critical(w)	e_critical(w)",
24300d97012SDavid du Colombier 	"		#define leave_critical(w)	x_critical(w)",
24400d97012SDavid du Colombier 	"	#else",
24500d97012SDavid du Colombier 	"		#ifdef NGQ",
24600d97012SDavid du Colombier 	"			#define enter_critical(w)	{ if (w < 1+NCORE) e_critical(w); }",
24700d97012SDavid du Colombier 	"			#define leave_critical(w)	{ if (w < 1+NCORE) x_critical(w); }",
24800d97012SDavid du Colombier 	"		#else",
24900d97012SDavid du Colombier 	"			#define enter_critical(w)	{ if (w < 3+NCORE) e_critical(w); }",
25000d97012SDavid du Colombier 	"			#define leave_critical(w)	{ if (w < 3+NCORE) x_critical(w); }",
25100d97012SDavid du Colombier 	"		#endif",
25200d97012SDavid du Colombier 	"	#endif",
25300d97012SDavid du Colombier 	"",
25400d97012SDavid du Colombier 	"	int",
25500d97012SDavid du Colombier 	"	cpu_printf(const char *fmt, ...)", /* only used with VERBOSE/CHECK/DEBUG */
25600d97012SDavid du Colombier 	"	{	va_list args;",
25700d97012SDavid du Colombier 	"		enter_critical(GLOBAL_LOCK);	/* printing */",
25800d97012SDavid du Colombier 	"		printf(\"cpu%%d: \", core_id);",
25900d97012SDavid du Colombier 	"		fflush(stdout);",
26000d97012SDavid du Colombier 	"		va_start(args, fmt);",
26100d97012SDavid du Colombier 	"		vprintf(fmt, args);",
26200d97012SDavid du Colombier 	"		va_end(args);",
26300d97012SDavid du Colombier 	"		fflush(stdout);",
26400d97012SDavid du Colombier 	"		leave_critical(GLOBAL_LOCK);",
26500d97012SDavid du Colombier 	"		return 1;",
26600d97012SDavid du Colombier 	"	}",
26700d97012SDavid du Colombier 	"#else",
268*de2caf28SDavid du Colombier 	"	#define enter_critical(w)	/* none */",
269*de2caf28SDavid du Colombier 	"	#define leave_critical(w)	/* none */",
270*de2caf28SDavid du Colombier 	"",
27100d97012SDavid du Colombier 	"	int",
27200d97012SDavid du Colombier 	"	cpu_printf(const char *fmt, ...)",
27300d97012SDavid du Colombier 	"	{	va_list args;",
27400d97012SDavid du Colombier 	"		va_start(args, fmt);",
27500d97012SDavid du Colombier 	"		vprintf(fmt, args);",
27600d97012SDavid du Colombier 	"		va_end(args);",
27700d97012SDavid du Colombier 	"		return 1;",
27800d97012SDavid du Colombier 	"	}",
27900d97012SDavid du Colombier 	"#endif",
28000d97012SDavid du Colombier 
2817dd7cddfSDavid du Colombier #ifndef PRINTF
282312a1df1SDavid du Colombier 	"int",
2837dd7cddfSDavid du Colombier 	"Printf(const char *fmt, ...)",
2847dd7cddfSDavid du Colombier 	"{	/* Make sure the args to Printf",
2857dd7cddfSDavid du Colombier 	"	 * are always evaluated (e.g., they",
2867dd7cddfSDavid du Colombier 	"	 * could contain a run stmnt)",
287312a1df1SDavid du Colombier 	"	 * but do not generate the output",
2887dd7cddfSDavid du Colombier 	"	 * during verification runs",
2897dd7cddfSDavid du Colombier 	"	 * unless explicitly wanted",
2907dd7cddfSDavid du Colombier 	"	 * If this fails on your system",
2917dd7cddfSDavid du Colombier 	"	 * compile SPIN itself -DPRINTF",
2927dd7cddfSDavid du Colombier 	"	 * and this code is not generated",
2937dd7cddfSDavid du Colombier 	"	 */",
294312a1df1SDavid du Colombier 	"#ifdef HAS_CODE",
295312a1df1SDavid du Colombier 	"	if (readtrail)",
296312a1df1SDavid du Colombier 	"	{	va_list args;",
297312a1df1SDavid du Colombier 	"		va_start(args, fmt);",
298312a1df1SDavid du Colombier 	"		vprintf(fmt, args);",
299312a1df1SDavid du Colombier 	"		va_end(args);",
300312a1df1SDavid du Colombier 	"		return 1;",
301312a1df1SDavid du Colombier 	"	}",
302312a1df1SDavid du Colombier 	"#endif",
3037dd7cddfSDavid du Colombier 	"#ifdef PRINTF",
3047dd7cddfSDavid du Colombier 	"	va_list args;",
3057dd7cddfSDavid du Colombier 	"	va_start(args, fmt);",
3067dd7cddfSDavid du Colombier 	"	vprintf(fmt, args);",
3077dd7cddfSDavid du Colombier 	"	va_end(args);",
3087dd7cddfSDavid du Colombier 	"#endif",
309312a1df1SDavid du Colombier 	"	return 1;",
3107dd7cddfSDavid du Colombier 	"}",
3117dd7cddfSDavid du Colombier #endif
312*de2caf28SDavid du Colombier 	"extern void printm(int, char *);",
3137dd7cddfSDavid du Colombier 
3147dd7cddfSDavid du Colombier 	"#ifndef SC",
3157dd7cddfSDavid du Colombier 	"#define getframe(i)	&trail[i];",
3167dd7cddfSDavid du Colombier 	"#else",
3177dd7cddfSDavid du Colombier 	"static long HHH, DDD, hiwater;",
3187dd7cddfSDavid du Colombier 	"static long CNT1, CNT2;",
3197dd7cddfSDavid du Colombier 	"static int stackwrite;",
3207dd7cddfSDavid du Colombier 	"static int stackread;",
3217dd7cddfSDavid du Colombier 	"static Trail frameptr;",
322312a1df1SDavid du Colombier 	"Trail *",
323*de2caf28SDavid du Colombier 	"getframe(long d)",
3247dd7cddfSDavid du Colombier 	"{",
3257dd7cddfSDavid du Colombier 	"	if (CNT1 == CNT2)",
3267dd7cddfSDavid du Colombier 	"		return &trail[d];",
3277dd7cddfSDavid du Colombier 	"",
3287dd7cddfSDavid du Colombier 	"	if (d >= (CNT1-CNT2)*DDD)",
3297dd7cddfSDavid du Colombier 	"		return &trail[d - (CNT1-CNT2)*DDD];",
3307dd7cddfSDavid du Colombier 	"",
3317dd7cddfSDavid du Colombier 	"	if (!stackread",
3327dd7cddfSDavid du Colombier 	"	&&  (stackread = open(stackfile, 0)) < 0)",
3337dd7cddfSDavid du Colombier 	"	{	printf(\"getframe: cannot open %%s\\n\", stackfile);",
3347dd7cddfSDavid du Colombier 	"		wrapup();",
3357dd7cddfSDavid du Colombier 	"	}",
336312a1df1SDavid du Colombier 	"	if (lseek(stackread, d* (off_t) sizeof(Trail), SEEK_SET) == -1",
3377dd7cddfSDavid du Colombier 	"	|| read(stackread, &frameptr, sizeof(Trail)) != sizeof(Trail))",
3387dd7cddfSDavid du Colombier 	"	{	printf(\"getframe: frame read error\\n\");",
3397dd7cddfSDavid du Colombier 	"		wrapup();",
3407dd7cddfSDavid du Colombier 	"	}",
3417dd7cddfSDavid du Colombier 	"	return &frameptr;",
3427dd7cddfSDavid du Colombier 	"}",
3437dd7cddfSDavid du Colombier 	"#endif",
34400d97012SDavid du Colombier 	"#if NCORE>1",
34500d97012SDavid du Colombier 	"extern void cleanup_shm(int);",
346*de2caf28SDavid du Colombier 	"volatile uint	*search_terminated; /* to signal early termination */",
34700d97012SDavid du Colombier 	/*
34800d97012SDavid du Colombier 	 *	Meaning of bitflags in search_terminated:
34900d97012SDavid du Colombier 	 *	  1	set by pan_exit
35000d97012SDavid du Colombier 	 *	  2	set by wrapup
35100d97012SDavid du Colombier 	 *	  4	set by uerror
35200d97012SDavid du Colombier 	 *	  8	set by sudden_stop -- called after someone_crashed and [Uu]error
35300d97012SDavid du Colombier 	 *	 16	set by cleanup_shm
35400d97012SDavid du Colombier 	 *	 32	set by give_up	-- called on signal
35500d97012SDavid du Colombier 	 *	 64	set by proxy_exit
35600d97012SDavid du Colombier 	 *	128	set by proxy on write port failure
35700d97012SDavid du Colombier 	 *	256	set by proxy on someone_crashed
35800d97012SDavid du Colombier 	 *
35900d97012SDavid du Colombier 	 *	Flags 8|32|128|256 indicate abnormal termination
36000d97012SDavid du Colombier 	 *
36100d97012SDavid du Colombier 	 *	The flags are checked in 4 functions in the code:
36200d97012SDavid du Colombier 	 *		sudden_stop()
36300d97012SDavid du Colombier 	 *		someone_crashed() (proxy and pan version)
36400d97012SDavid du Colombier 	 *		mem_hand_off()
36500d97012SDavid du Colombier 	 */
36600d97012SDavid du Colombier 	"#endif",
3677dd7cddfSDavid du Colombier 	"void",
368312a1df1SDavid du Colombier 	"pan_exit(int val)",
369*de2caf28SDavid du Colombier 	"{	void stop_timer(int);",
370*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
371*de2caf28SDavid du Colombier 	"	extern void bfs_mark_done(int);",
372*de2caf28SDavid du Colombier 	"	extern void bfs_drop_shared_memory(void);",
373*de2caf28SDavid du Colombier 	"#endif",
37400d97012SDavid du Colombier 	"	if (signoff)",
37500d97012SDavid du Colombier 	"	{	printf(\"--end of output--\\n\");",
37600d97012SDavid du Colombier 	"	}",
37700d97012SDavid du Colombier 	"#if NCORE>1",
37800d97012SDavid du Colombier 	"	if (search_terminated != NULL)",
37900d97012SDavid du Colombier 	"	{	*search_terminated |= 1;	/* pan_exit */",
38000d97012SDavid du Colombier 	"	}",
38100d97012SDavid du Colombier 		"#ifdef USE_DISK",
38200d97012SDavid du Colombier 	"	{ void	dsk_stats(void);",
38300d97012SDavid du Colombier 	"		dsk_stats();",
38400d97012SDavid du Colombier 	"	}",
38500d97012SDavid du Colombier 		"#endif",
38600d97012SDavid du Colombier 	"	if (!state_tables && !readtrail)",
38700d97012SDavid du Colombier 	"	{	cleanup_shm(1);",
38800d97012SDavid du Colombier 	"	}",
38900d97012SDavid du Colombier 	"#endif",
390*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
391*de2caf28SDavid du Colombier 	"	if (who_am_i != 0)",
392*de2caf28SDavid du Colombier 	"	{	bfs_mark_done(3); /* stopped */",
393*de2caf28SDavid du Colombier 	"	}",
394*de2caf28SDavid du Colombier 	"	bfs_drop_shared_memory();",
395*de2caf28SDavid du Colombier 	"#endif",
39600d97012SDavid du Colombier 	"	if (val == 2)",
39700d97012SDavid du Colombier 	"	{	val = 0;",
39800d97012SDavid du Colombier 	"	}",
399*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
400*de2caf28SDavid du Colombier 	"	if (who_am_i == 0)",
401*de2caf28SDavid du Colombier 	"#endif",
402*de2caf28SDavid du Colombier 	"	stop_timer(1);",
40300d97012SDavid du Colombier 	"",
40400d97012SDavid du Colombier 	"#ifdef C_EXIT",
40500d97012SDavid du Colombier 	"	C_EXIT; /* trust that it defines a fct */",
40600d97012SDavid du Colombier 	"#endif",
407312a1df1SDavid du Colombier 	"	exit(val);",
408312a1df1SDavid du Colombier 	"}",
409312a1df1SDavid du Colombier 	"#ifdef HAS_CODE",
41000d97012SDavid du Colombier 	"static char tbuf[2][2048];",
41100d97012SDavid du Colombier 	"",
412312a1df1SDavid du Colombier 	"char *",
413312a1df1SDavid du Colombier 	"transmognify(char *s)",
414312a1df1SDavid du Colombier 	"{	char *v, *w;",
415312a1df1SDavid du Colombier 	"	int i, toggle = 0;",
416f3793cddSDavid du Colombier 	"	if (!s || strlen(s) > 2047) return s;",
41700d97012SDavid du Colombier 	"	memset(tbuf[0], 0, 2048);",
41800d97012SDavid du Colombier 	"	memset(tbuf[1], 0, 2048);",
41900d97012SDavid du Colombier 	"	strcpy(tbuf[toggle], s);",
42000d97012SDavid du Colombier 	"	while ((v = strstr(tbuf[toggle], \"{c_code\")))",	/* assign v */
421312a1df1SDavid du Colombier 	"	{	*v = '\\0'; v++;",
42200d97012SDavid du Colombier 	"		strcpy(tbuf[1-toggle], tbuf[toggle]);",
423312a1df1SDavid du Colombier 	"		for (w = v; *w != '}' && *w != '\\0'; w++) /* skip */;",
424312a1df1SDavid du Colombier 	"		if (*w != '}') return s;",
425312a1df1SDavid du Colombier 	"		*w = '\\0'; w++;",
426312a1df1SDavid du Colombier 	"		for (i = 0; code_lookup[i].c; i++)",
427312a1df1SDavid du Colombier 	"			if (strcmp(v, code_lookup[i].c) == 0",
428312a1df1SDavid du Colombier 	"			&&  strlen(v) == strlen(code_lookup[i].c))",
42900d97012SDavid du Colombier 	"			{	if (strlen(tbuf[1-toggle])",
430312a1df1SDavid du Colombier 	"				 +  strlen(code_lookup[i].t)",
431312a1df1SDavid du Colombier 	"				 +  strlen(w) > 2047)",
432312a1df1SDavid du Colombier 	"					return s;",
43300d97012SDavid du Colombier 	"				strcat(tbuf[1-toggle], code_lookup[i].t);",
434312a1df1SDavid du Colombier 	"				break;",
435312a1df1SDavid du Colombier 	"			}",
43600d97012SDavid du Colombier 	"		strcat(tbuf[1-toggle], w);",
437312a1df1SDavid du Colombier 	"		toggle = 1 - toggle;",
438312a1df1SDavid du Colombier 	"	}",
43900d97012SDavid du Colombier 	"	tbuf[toggle][2047] = '\\0';",
44000d97012SDavid du Colombier 	"	return tbuf[toggle];",
441312a1df1SDavid du Colombier 	"}",
442312a1df1SDavid du Colombier 	"#else",
443312a1df1SDavid du Colombier 	"char * transmognify(char *s) { return s; }",
444312a1df1SDavid du Colombier 	"#endif",
445*de2caf28SDavid du Colombier 	""
446*de2caf28SDavid du Colombier 	"char	o_cmdline[512];",
447*de2caf28SDavid du Colombier 	"char	o_cmdname[128];",
448*de2caf28SDavid du Colombier 	""
449312a1df1SDavid du Colombier 	"#ifdef HAS_CODE",
450312a1df1SDavid du Colombier 	"void",
451312a1df1SDavid du Colombier 	"add_src_txt(int ot, int tt)",
452312a1df1SDavid du Colombier 	"{	Trans *t;",
453312a1df1SDavid du Colombier 	"	char *q;",
454312a1df1SDavid du Colombier 	"",
455312a1df1SDavid du Colombier 	"	for (t = trans[ot][tt]; t; t = t->nxt)",
456312a1df1SDavid du Colombier 	"	{	printf(\"\\t\\t\");",
457312a1df1SDavid du Colombier 	"		q = transmognify(t->tp);",
458f3793cddSDavid du Colombier 	"		for ( ; q && *q; q++)",
459312a1df1SDavid du Colombier 	"			if (*q == '\\n')",
460312a1df1SDavid du Colombier 	"				printf(\"\\\\n\");",
461312a1df1SDavid du Colombier 	"			else",
462312a1df1SDavid du Colombier 	"				putchar(*q);",
463312a1df1SDavid du Colombier 	"		printf(\"\\n\");",
464312a1df1SDavid du Colombier 	"	}",
465312a1df1SDavid du Colombier 	"}",
46600d97012SDavid du Colombier 	"",
46700d97012SDavid du Colombier 	"char *",
46800d97012SDavid du Colombier 	"find_source(int tp, int s)",
46900d97012SDavid du Colombier 	"{",
47000d97012SDavid du Colombier 	"	if (s >= flref[tp]->from",
47100d97012SDavid du Colombier 	"	&&  s <= flref[tp]->upto)",
47200d97012SDavid du Colombier 	"	{	return flref[tp]->fnm;",
47300d97012SDavid du Colombier 	"	}",
47400d97012SDavid du Colombier 	"	return PanSource; /* i.e., don't know */",
47500d97012SDavid du Colombier 	"}",
47600d97012SDavid du Colombier 	"",
477312a1df1SDavid du Colombier 	"void",
478312a1df1SDavid du Colombier 	"wrap_trail(void)",
479312a1df1SDavid du Colombier 	"{	static int wrap_in_progress = 0;",
480312a1df1SDavid du Colombier 	"	int i; short II;",
481312a1df1SDavid du Colombier 	"	P0 *z;",
482312a1df1SDavid du Colombier 	"",
483312a1df1SDavid du Colombier 	"	if (wrap_in_progress++) return;",
484312a1df1SDavid du Colombier 	"",
485f3793cddSDavid du Colombier 	"	printf(\"spin: trail ends after %%ld steps\\n\", depth);",
486312a1df1SDavid du Colombier 	"	if (onlyproc >= 0)",
48700d97012SDavid du Colombier 	"	{	if (onlyproc >= now._nr_pr) { pan_exit(0); }",
488312a1df1SDavid du Colombier 	"		II = onlyproc;",
489312a1df1SDavid du Colombier 	"		z = (P0 *)pptr(II);",
490f3793cddSDavid du Colombier 	"		printf(\"%%3ld:\tproc %%d (%%s) \",",
491312a1df1SDavid du Colombier 	"			depth, II, procname[z->_t]);",
492312a1df1SDavid du Colombier 	"		for (i = 0; src_all[i].src; i++)",
493312a1df1SDavid du Colombier 	"			if (src_all[i].tp == (int) z->_t)",
49400d97012SDavid du Colombier 	"			{	printf(\" %%s:%%d\",",
49500d97012SDavid du Colombier 	"					find_source((int) z->_t, (int) z->_p),",
496312a1df1SDavid du Colombier 	"					src_all[i].src[z->_p]);",
497312a1df1SDavid du Colombier 	"				break;",
498312a1df1SDavid du Colombier 	"			}",
499312a1df1SDavid du Colombier 	"		printf(\" (state %%2d)\", z->_p);",
500312a1df1SDavid du Colombier 	"		if (!stopstate[z->_t][z->_p])",
501312a1df1SDavid du Colombier 	"			printf(\" (invalid end state)\");",
502312a1df1SDavid du Colombier 	"		printf(\"\\n\");",
503312a1df1SDavid du Colombier 	"		add_src_txt(z->_t, z->_p);",
504312a1df1SDavid du Colombier 	"		pan_exit(0);",
505312a1df1SDavid du Colombier 	"	}",
506312a1df1SDavid du Colombier 	"	printf(\"#processes %%d:\\n\", now._nr_pr);",
507312a1df1SDavid du Colombier 	"	if (depth < 0) depth = 0;",
508312a1df1SDavid du Colombier 	"	for (II = 0; II < now._nr_pr; II++)",
509312a1df1SDavid du Colombier 	"	{	z = (P0 *)pptr(II);",
510f3793cddSDavid du Colombier 	"		printf(\"%%3ld:\tproc %%d (%%s) \",",
511312a1df1SDavid du Colombier 	"			depth, II, procname[z->_t]);",
512312a1df1SDavid du Colombier 	"		for (i = 0; src_all[i].src; i++)",
513312a1df1SDavid du Colombier 	"			if (src_all[i].tp == (int) z->_t)",
51400d97012SDavid du Colombier 	"			{	printf(\" %%s:%%d\",",
51500d97012SDavid du Colombier 	"					find_source((int) z->_t, (int) z->_p),",
516312a1df1SDavid du Colombier 	"					src_all[i].src[z->_p]);",
517312a1df1SDavid du Colombier 	"				break;",
518312a1df1SDavid du Colombier 	"			}",
519312a1df1SDavid du Colombier 	"		printf(\" (state %%2d)\", z->_p);",
520312a1df1SDavid du Colombier 	"		if (!stopstate[z->_t][z->_p])",
521312a1df1SDavid du Colombier 	"			printf(\" (invalid end state)\");",
522312a1df1SDavid du Colombier 	"		printf(\"\\n\");",
523312a1df1SDavid du Colombier 	"		add_src_txt(z->_t, z->_p);",
524312a1df1SDavid du Colombier 	"	}",
525312a1df1SDavid du Colombier 	"	c_globals();",
526312a1df1SDavid du Colombier 	"	for (II = 0; II < now._nr_pr; II++)",
527312a1df1SDavid du Colombier 	"	{	z = (P0 *)pptr(II);",
528312a1df1SDavid du Colombier 	"		c_locals(II, z->_t);",
529312a1df1SDavid du Colombier 	"	}",
530312a1df1SDavid du Colombier 	"#ifdef ON_EXIT",
531312a1df1SDavid du Colombier 	"	ON_EXIT;",
532312a1df1SDavid du Colombier 	"#endif",
533312a1df1SDavid du Colombier 	"	pan_exit(0);",
534312a1df1SDavid du Colombier 	"}",
535312a1df1SDavid du Colombier 	"FILE *",
536312a1df1SDavid du Colombier 	"findtrail(void)",
537312a1df1SDavid du Colombier 	"{	FILE *fd;",
538*de2caf28SDavid du Colombier 	"	char fnm[1024], *q;",
53900d97012SDavid du Colombier 	"	char MyFile[512];",	/* avoid using a non-writable string */
54000d97012SDavid du Colombier 	"	char MySuffix[16];",
54100d97012SDavid du Colombier 	"	int  try_core;",
54200d97012SDavid du Colombier 	"	int  candidate_files;",
543f3793cddSDavid du Colombier 	"",
54400d97012SDavid du Colombier 	"	if (trailfilename != NULL)",
54500d97012SDavid du Colombier 	"	{	fd = fopen(trailfilename, \"r\");",
54600d97012SDavid du Colombier 	"		if (fd == NULL)",
54700d97012SDavid du Colombier 	"		{	printf(\"pan: cannot find %%s\\n\", trailfilename);",
54800d97012SDavid du Colombier 	"			pan_exit(1);",
54900d97012SDavid du Colombier 	"		} /* else */",
55000d97012SDavid du Colombier 	"		goto success;",
55100d97012SDavid du Colombier 	"	}",
55200d97012SDavid du Colombier 	"talk:",
55300d97012SDavid du Colombier 	"	try_core = 1;",
55400d97012SDavid du Colombier 	"	candidate_files = 0;",
55500d97012SDavid du Colombier 	"	tprefix = \"trail\";",
55600d97012SDavid du Colombier 	"	strcpy(MyFile, TrailFile);",
55700d97012SDavid du Colombier 	"	do { /* see if there's more than one possible trailfile */",
55800d97012SDavid du Colombier 	"		if (whichtrail)",
55900d97012SDavid du Colombier 	"		{	sprintf(fnm, \"%%s%%d.%%s\",",
56000d97012SDavid du Colombier 	"				MyFile, whichtrail, tprefix);",
56100d97012SDavid du Colombier 	"			fd = fopen(fnm, \"r\");",
56200d97012SDavid du Colombier 	"			if (fd != NULL)",
56300d97012SDavid du Colombier 	"			{	candidate_files++;",
56400d97012SDavid du Colombier 	"				if (verbose==100)",
56500d97012SDavid du Colombier 	"					printf(\"trail%%d: %%s\\n\",",
56600d97012SDavid du Colombier 	"						candidate_files, fnm);",
56700d97012SDavid du Colombier 	"				fclose(fd);",
56800d97012SDavid du Colombier 	"			}",
56900d97012SDavid du Colombier 	"			if ((q = strchr(MyFile, \'.\')) != NULL)",
57000d97012SDavid du Colombier 	"			{	*q = \'\\0\';",	/* e.g., strip .pml */
57100d97012SDavid du Colombier 	"				sprintf(fnm, \"%%s%%d.%%s\",",
57200d97012SDavid du Colombier 	"					MyFile, whichtrail, tprefix);",
57300d97012SDavid du Colombier 	"				*q = \'.\';",
57400d97012SDavid du Colombier 	"				fd = fopen(fnm, \"r\");",
57500d97012SDavid du Colombier 	"				if (fd != NULL)",
57600d97012SDavid du Colombier 	"				{	candidate_files++;",
57700d97012SDavid du Colombier 	"					if (verbose==100)",
57800d97012SDavid du Colombier 	"						printf(\"trail%%d: %%s\\n\",",
57900d97012SDavid du Colombier 	"							candidate_files, fnm);",
58000d97012SDavid du Colombier 	"					fclose(fd);",
58100d97012SDavid du Colombier 	"			}	}",
58200d97012SDavid du Colombier 	"		} else",
58300d97012SDavid du Colombier 	"		{	sprintf(fnm, \"%%s.%%s\", MyFile, tprefix);",
58400d97012SDavid du Colombier 	"			fd = fopen(fnm, \"r\");",
58500d97012SDavid du Colombier 	"			if (fd != NULL)",
58600d97012SDavid du Colombier 	"			{	candidate_files++;",
58700d97012SDavid du Colombier 	"				if (verbose==100)",
58800d97012SDavid du Colombier 	"					printf(\"trail%%d: %%s\\n\",",
58900d97012SDavid du Colombier 	"						candidate_files, fnm);",
59000d97012SDavid du Colombier 	"				fclose(fd);",
59100d97012SDavid du Colombier 	"			}",
59200d97012SDavid du Colombier 	"			if ((q = strchr(MyFile, \'.\')) != NULL)",
59300d97012SDavid du Colombier 	"			{	*q = \'\\0\';",	/* e.g., strip .pml */
59400d97012SDavid du Colombier 	"				sprintf(fnm, \"%%s.%%s\", MyFile, tprefix);",
59500d97012SDavid du Colombier 	"				*q = \'.\';",
59600d97012SDavid du Colombier 	"				fd = fopen(fnm, \"r\");",
59700d97012SDavid du Colombier 	"				if (fd != NULL)",
59800d97012SDavid du Colombier 	"				{	candidate_files++;",
59900d97012SDavid du Colombier 	"					if (verbose==100)",
60000d97012SDavid du Colombier 	"						printf(\"trail%%d: %%s\\n\",",
60100d97012SDavid du Colombier 	"							candidate_files, fnm);",
60200d97012SDavid du Colombier 	"					fclose(fd);",
60300d97012SDavid du Colombier 	"		}	}	}",
60400d97012SDavid du Colombier 	"		tprefix = MySuffix;",
60500d97012SDavid du Colombier 	"		sprintf(tprefix, \"cpu%%d_trail\", try_core++);",
60600d97012SDavid du Colombier 	"	} while (try_core <= NCORE);",
607f3793cddSDavid du Colombier 	"",
60800d97012SDavid du Colombier 	"	if (candidate_files != 1)",
60900d97012SDavid du Colombier 	"	{	if (verbose != 100)",
61000d97012SDavid du Colombier 	"		{	printf(\"error: there are %%d trail files:\\n\",",
61100d97012SDavid du Colombier 	"				candidate_files);",
61200d97012SDavid du Colombier 	"			verbose = 100;",
61300d97012SDavid du Colombier 	"			goto talk;",
61400d97012SDavid du Colombier 	"		} else",
61500d97012SDavid du Colombier 	"		{	printf(\"pan: rm or mv all except one\\n\");",
61600d97012SDavid du Colombier 	"			exit(1);",
61700d97012SDavid du Colombier 	"	}	}",
61800d97012SDavid du Colombier 
61900d97012SDavid du Colombier 	"	try_core = 1;",
62000d97012SDavid du Colombier 	"	strcpy(MyFile, TrailFile); /* restore */",
62100d97012SDavid du Colombier 	"	tprefix = \"trail\";",
62200d97012SDavid du Colombier 	"try_again:",
623312a1df1SDavid du Colombier 	"	if (whichtrail)",
624f3793cddSDavid du Colombier 	"	{	sprintf(fnm, \"%%s%%d.%%s\", MyFile, whichtrail, tprefix);",
625312a1df1SDavid du Colombier 	"		fd = fopen(fnm, \"r\");",
626f3793cddSDavid du Colombier 	"		if (fd == NULL && (q = strchr(MyFile, \'.\')))",
627312a1df1SDavid du Colombier 	"		{	*q = \'\\0\';",	/* e.g., strip .pml on original file */
62800d97012SDavid du Colombier 	"			sprintf(fnm, \"%%s%%d.%%s\",",
62900d97012SDavid du Colombier 	"				MyFile, whichtrail, tprefix);",
630312a1df1SDavid du Colombier 	"			*q = \'.\';",
631312a1df1SDavid du Colombier 	"			fd = fopen(fnm, \"r\");",
63200d97012SDavid du Colombier 	"		}",
633312a1df1SDavid du Colombier 	"	} else",
634f3793cddSDavid du Colombier 	"	{	sprintf(fnm, \"%%s.%%s\", MyFile, tprefix);",
635312a1df1SDavid du Colombier 	"		fd = fopen(fnm, \"r\");",
636f3793cddSDavid du Colombier 	"		if (fd == NULL && (q = strchr(MyFile, \'.\')))",
637312a1df1SDavid du Colombier 	"		{	*q = \'\\0\';",	/* e.g., strip .pml on original file */
638f3793cddSDavid du Colombier 	"			sprintf(fnm, \"%%s.%%s\", MyFile, tprefix);",
639312a1df1SDavid du Colombier 	"			*q = \'.\';",
640312a1df1SDavid du Colombier 	"			fd = fopen(fnm, \"r\");",
64100d97012SDavid du Colombier 	"	}	}",
642312a1df1SDavid du Colombier 	"	if (fd == NULL)",
64300d97012SDavid du Colombier 	"	{	if (try_core < NCORE)",
64400d97012SDavid du Colombier 	"		{	tprefix = MySuffix;",
64500d97012SDavid du Colombier 	"			sprintf(tprefix, \"cpu%%d_trail\", try_core++);",
64600d97012SDavid du Colombier 	"			goto try_again;",
64700d97012SDavid du Colombier 	"		}",
64800d97012SDavid du Colombier 	"		printf(\"pan: cannot find trailfile %%s\\n\", fnm);",
649312a1df1SDavid du Colombier 	"		pan_exit(1);",
650312a1df1SDavid du Colombier 	"	}",
65100d97012SDavid du Colombier 	"success:",
65200d97012SDavid du Colombier 	"#if NCORE>1 && defined(SEP_STATE)",
65300d97012SDavid du Colombier 	"	{	void set_root(void); /* for partial traces from local root */",
65400d97012SDavid du Colombier 	"		set_root();",
65500d97012SDavid du Colombier 	"	}",
65600d97012SDavid du Colombier 	"#endif",
657312a1df1SDavid du Colombier 	"	return fd;",
658312a1df1SDavid du Colombier 	"}",
659312a1df1SDavid du Colombier 	"",
660312a1df1SDavid du Colombier 	"uchar do_transit(Trans *, short);",
661*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
662*de2caf28SDavid du Colombier 	"void set_permuted(int);",
663*de2caf28SDavid du Colombier 	"void set_reversed(int);",
664*de2caf28SDavid du Colombier 	"void set_rotated(int);",
665*de2caf28SDavid du Colombier 	"void set_randrot(int);",
666*de2caf28SDavid du Colombier 	"void (*p_reorder)(int) = set_permuted;",
667*de2caf28SDavid du Colombier 	"short p_rotate;",
668*de2caf28SDavid du Colombier 	"#endif",
669312a1df1SDavid du Colombier 	"",
670312a1df1SDavid du Colombier 	"void",
671312a1df1SDavid du Colombier 	"getrail(void)",
672312a1df1SDavid du Colombier 	"{	FILE *fd;",
673*de2caf28SDavid du Colombier 	"	char *q, *pnm;",
674312a1df1SDavid du Colombier 	"	int i, t_id, lastnever = -1; short II;",
675312a1df1SDavid du Colombier 	"	Trans *t;",
676312a1df1SDavid du Colombier 	"	P0 *z;",
677*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
678*de2caf28SDavid du Colombier 	"	char sbuf[128];",
679*de2caf28SDavid du Colombier 	"	memset(sbuf, 0, sizeof(sbuf));",
680*de2caf28SDavid du Colombier 	"#endif",
681312a1df1SDavid du Colombier 	"	fd = findtrail();	/* exits if unsuccessful */",
682f3793cddSDavid du Colombier 	"	while (fscanf(fd, \"%%ld:%%d:%%d\\n\", &depth, &i, &t_id) == 3)",
683312a1df1SDavid du Colombier 	"	{	if (depth == -1)",
684*de2caf28SDavid du Colombier 	"		{	printf(\"<<<<<START OF CYCLE>>>>>\\n\");",
685*de2caf28SDavid du Colombier 	"		}",
686*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
687312a1df1SDavid du Colombier 	"		if (depth < 0)",
688*de2caf28SDavid du Colombier 	"		{	switch (depth) {",
689*de2caf28SDavid du Colombier 	"			case -5:",
690*de2caf28SDavid du Colombier 	"				if (i && !t_reverse)",
691*de2caf28SDavid du Colombier 	"				{	strcat(sbuf, \"-t_reverse \");",
692*de2caf28SDavid du Colombier 	"				}",
693*de2caf28SDavid du Colombier 	"				break;",
694*de2caf28SDavid du Colombier 	"			case -6:",
695*de2caf28SDavid du Colombier 	"				if (i && p_reorder != set_permuted)",
696*de2caf28SDavid du Colombier 	"				{	strcat(sbuf, \"-p_permute \");",
697*de2caf28SDavid du Colombier 	"				} else",
698*de2caf28SDavid du Colombier 	"				if (t_id && p_reorder != set_reversed)",
699*de2caf28SDavid du Colombier 	"				{	strcat(sbuf, \"-p_reverse \");",
700*de2caf28SDavid du Colombier 	"				}",
701*de2caf28SDavid du Colombier 	"				break;",
702*de2caf28SDavid du Colombier 	"			case -7:",
703*de2caf28SDavid du Colombier 	"				if (i",
704*de2caf28SDavid du Colombier 	"				&& (p_reorder != set_rotated || p_rotate != t_id))",
705*de2caf28SDavid du Colombier 	"				{	char tmp[32];",
706*de2caf28SDavid du Colombier 	"					sprintf(tmp, \"-p_rotate%%d \", t_id);",
707*de2caf28SDavid du Colombier 	"					strcat(sbuf, tmp);",
708*de2caf28SDavid du Colombier 	"				}",
709*de2caf28SDavid du Colombier 	"				break;",
710*de2caf28SDavid du Colombier 	"			case -8:",
711*de2caf28SDavid du Colombier 	"				if (i && p_reorder != set_randrot)",
712*de2caf28SDavid du Colombier 	"				{	strcat(sbuf, \"-p_randrot \");",
713*de2caf28SDavid du Colombier 	"				}",
714*de2caf28SDavid du Colombier 	"				if (s_rand != t_id)", /* +1 if before -r */
715*de2caf28SDavid du Colombier 	"				{	char tmp[32];",
716*de2caf28SDavid du Colombier 	"					sprintf(tmp, \"-RS%%u \", (uint) t_id);",
717*de2caf28SDavid du Colombier 	"					strcat(sbuf, tmp);",
718*de2caf28SDavid du Colombier 	"				}",
719*de2caf28SDavid du Colombier 	"				break;",
720*de2caf28SDavid du Colombier 	"			default:",
721312a1df1SDavid du Colombier 	"				continue;",
722*de2caf28SDavid du Colombier 	"			}",
723*de2caf28SDavid du Colombier 	"		}",
724*de2caf28SDavid du Colombier 	"#endif",
725*de2caf28SDavid du Colombier 	"		if (depth < 0)",
726*de2caf28SDavid du Colombier 	"		{	continue;",
727*de2caf28SDavid du Colombier 	"		}",
728*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
729*de2caf28SDavid du Colombier 	"		if (strlen(sbuf) > 0)",
730*de2caf28SDavid du Colombier 	"		{	char *restart = emalloc(",
731*de2caf28SDavid du Colombier 	"				strlen(o_cmdname) + 1 +",
732*de2caf28SDavid du Colombier 	"				strlen(sbuf) + 1 + ",
733*de2caf28SDavid du Colombier 	"				strlen(o_cmdline) + 1);"
734*de2caf28SDavid du Colombier 	"			sprintf(restart, \"%%s %%s %%s\",",
735*de2caf28SDavid du Colombier 	"				o_cmdname, o_cmdline, sbuf);",
736*de2caf28SDavid du Colombier 	"			if (system(restart) < 0)"
737*de2caf28SDavid du Colombier 	"			{",
738*de2caf28SDavid du Colombier 	"			fprintf(efd, \"command failed: %%s\\n\", restart);",
739*de2caf28SDavid du Colombier 	"			}",
740*de2caf28SDavid du Colombier 	"			exit(1);",
741*de2caf28SDavid du Colombier 	"		}",
742*de2caf28SDavid du Colombier 	"#endif",
743f3793cddSDavid du Colombier 	"		if (i > now._nr_pr)",
744f3793cddSDavid du Colombier 	"		{	printf(\"pan: Error, proc %%d invalid pid \", i);",
745f3793cddSDavid du Colombier 	"			printf(\"transition %%d\\n\", t_id);",
746f3793cddSDavid du Colombier 	"			break;",
747f3793cddSDavid du Colombier 	"		}",
748312a1df1SDavid du Colombier 	"		II = i;",
749312a1df1SDavid du Colombier 	"		z = (P0 *)pptr(II);",
750312a1df1SDavid du Colombier 	"		for (t = trans[z->_t][z->_p]; t; t = t->nxt)",
75100d97012SDavid du Colombier 	"			if (t->t_id == (T_ID) t_id)",
752312a1df1SDavid du Colombier 	"				break;",
753312a1df1SDavid du Colombier 	"		if (!t)",
754312a1df1SDavid du Colombier 	"		{	for (i = 0; i < NrStates[z->_t]; i++)",
755312a1df1SDavid du Colombier 	"			{	t = trans[z->_t][i];",
75600d97012SDavid du Colombier 	"				if (t && t->t_id == (T_ID) t_id)",
75700d97012SDavid du Colombier 	"				{	printf(\"\\tRecovered at state %%d\\n\", i);",
758312a1df1SDavid du Colombier 	"					z->_p = i;",
759312a1df1SDavid du Colombier 	"					goto recovered;",
760312a1df1SDavid du Colombier 	"			}	}",
761312a1df1SDavid du Colombier 	"			printf(\"pan: Error, proc %%d type %%d state %%d: \",",
762312a1df1SDavid du Colombier 	"				II, z->_t, z->_p);",
763312a1df1SDavid du Colombier 	"			printf(\"transition %%d not found\\n\", t_id);",
76400d97012SDavid du Colombier 	"			printf(\"pan: list of possible transitions in this process:\\n\");",
76500d97012SDavid du Colombier 	"			if (z->_t >= 0 && z->_t <= _NP_)",
766312a1df1SDavid du Colombier 	"			for (t = trans[z->_t][z->_p]; t; t = t->nxt)",
767312a1df1SDavid du Colombier 	"				printf(\"	t_id %%d -- case %%d, [%%s]\\n\",",
768312a1df1SDavid du Colombier 	"					t->t_id, t->forw, t->tp);",
769312a1df1SDavid du Colombier 	"			break; /* pan_exit(1); */",
770312a1df1SDavid du Colombier 	"		}",
771312a1df1SDavid du Colombier 	"recovered:",
772312a1df1SDavid du Colombier 	"		q = transmognify(t->tp);",
773312a1df1SDavid du Colombier 	"		if (gui) simvals[0] = \'\\0\';",
774312a1df1SDavid du Colombier 
775*de2caf28SDavid du Colombier 	"		pnm = procname[z->_t];",
776*de2caf28SDavid du Colombier 	"		_this = pptr(II);",
777312a1df1SDavid du Colombier 	"		trpt->tau |= 1;",	/* timeout always possible */
778312a1df1SDavid du Colombier 	"		if (!do_transit(t, II))",
779312a1df1SDavid du Colombier 	"		{	if (onlyproc >= 0 && II != onlyproc)",
780312a1df1SDavid du Colombier 	"				goto moveon;",
781*de2caf28SDavid du Colombier 	"			if (!verbose) break;",
782312a1df1SDavid du Colombier 	"			printf(\"pan: error, next transition UNEXECUTABLE on replay\\n\");",
783312a1df1SDavid du Colombier 	"			printf(\"     most likely causes: missing c_track statements\\n\");",
784312a1df1SDavid du Colombier 	"			printf(\"       or illegal side-effects in c_expr statements\\n\");",
785312a1df1SDavid du Colombier 	"		}",
786312a1df1SDavid du Colombier 
787312a1df1SDavid du Colombier 	"		if (onlyproc >= 0 && II != onlyproc)",
788312a1df1SDavid du Colombier 	"			goto moveon;",
789312a1df1SDavid du Colombier 
790312a1df1SDavid du Colombier 	"		if (verbose)",
791*de2caf28SDavid du Colombier 	"		{	printf(\"%%3ld: proc %%2d (%%s) \", depth, II, pnm);",
79200d97012SDavid du Colombier 
79300d97012SDavid du Colombier 	"			for (i = 0; src_all[i].src; i++)",
79400d97012SDavid du Colombier 	"				if (src_all[i].tp == (int) z->_t)",
79500d97012SDavid du Colombier 	"				{	printf(\" %%s:%%d \",",
79600d97012SDavid du Colombier 	"						find_source((int) z->_t, (int) z->_p),",
79700d97012SDavid du Colombier 	"						src_all[i].src[z->_p]);",
79800d97012SDavid du Colombier 	"					break;",
79900d97012SDavid du Colombier 	"				}",
80000d97012SDavid du Colombier 
80100d97012SDavid du Colombier 	"			printf(\"(state %%d) trans {%%d,%%d} [%%s]\\n\",",
80200d97012SDavid du Colombier 	"				z->_p, t_id, t->forw, q?q:\"\");",
80300d97012SDavid du Colombier 
804312a1df1SDavid du Colombier 	"			c_globals();",
805312a1df1SDavid du Colombier 	"			for (i = 0; i < now._nr_pr; i++)",
806312a1df1SDavid du Colombier 	"			{	c_locals(i, ((P0 *)pptr(i))->_t);",
807312a1df1SDavid du Colombier 	"			}",
80800d97012SDavid du Colombier 	"		} else if (Btypes[z->_t] == N_CLAIM)",
809312a1df1SDavid du Colombier 	"		{	if (lastnever != (int) z->_p)",
810312a1df1SDavid du Colombier 	"			{	for (i = 0; src_all[i].src; i++)",
811312a1df1SDavid du Colombier 	"					if (src_all[i].tp == (int) z->_t)",
812312a1df1SDavid du Colombier 	"					{	printf(\"MSC: ~G %%d\\n\",",
813312a1df1SDavid du Colombier 	"							src_all[i].src[z->_p]);",
814312a1df1SDavid du Colombier 	"						break;",
815312a1df1SDavid du Colombier 	"					}",
816312a1df1SDavid du Colombier 	"				if (!src_all[i].src)",
817312a1df1SDavid du Colombier 	"					printf(\"MSC: ~R %%d\\n\", z->_p);",
818312a1df1SDavid du Colombier 	"			}",
819312a1df1SDavid du Colombier 	"			lastnever = z->_p;",
820312a1df1SDavid du Colombier 	"			goto sameas;",
82100d97012SDavid du Colombier 	"		} else if (Btypes[z->_t] != 0) /* not :np_: */",
822312a1df1SDavid du Colombier 	"		{",
823312a1df1SDavid du Colombier 	"sameas:		if (no_rck) goto moveon;",
824312a1df1SDavid du Colombier 	"			if (coltrace)",
825f3793cddSDavid du Colombier 	"			{	printf(\"%%ld: \", depth);",
826312a1df1SDavid du Colombier 	"				for (i = 0; i < II; i++)",
827312a1df1SDavid du Colombier 	"					printf(\"\\t\\t\");",
828*de2caf28SDavid du Colombier 	"				printf(\"%%s(%%d):\", pnm, II);",
829f3793cddSDavid du Colombier 	"				printf(\"[%%s]\\n\", q?q:\"\");",
830f3793cddSDavid du Colombier 	"			} else if (!silent)",
831*de2caf28SDavid du Colombier 	"			{",
832*de2caf28SDavid du Colombier 	"#ifdef MYSTEP",
833*de2caf28SDavid du Colombier 	"	#include \"mystep.c\"",
834*de2caf28SDavid du Colombier 	"#endif",
835*de2caf28SDavid du Colombier 	"				if (strlen(simvals) > 0) {",
836f3793cddSDavid du Colombier 	"				printf(\"%%3ld:	proc %%2d (%%s)\", ",
837*de2caf28SDavid du Colombier 	"					depth, II, pnm);",
838312a1df1SDavid du Colombier 	"				for (i = 0; src_all[i].src; i++)",
839312a1df1SDavid du Colombier 	"					if (src_all[i].tp == (int) z->_t)",
84000d97012SDavid du Colombier 	"					{	printf(\" %%s:%%d \",",
84100d97012SDavid du Colombier 	"							find_source((int) z->_t, (int) z->_p),",
842312a1df1SDavid du Colombier 	"							src_all[i].src[z->_p]);",
843312a1df1SDavid du Colombier 	"						break;",
844312a1df1SDavid du Colombier 	"					}",
845312a1df1SDavid du Colombier 	"				printf(\"(state %%d)\t[values: %%s]\\n\", z->_p, simvals);",
846312a1df1SDavid du Colombier 	"				}",
847f3793cddSDavid du Colombier 	"				printf(\"%%3ld:	proc %%2d (%%s)\", ",
848*de2caf28SDavid du Colombier 	"					depth, II, pnm);",
849312a1df1SDavid du Colombier 	"				for (i = 0; src_all[i].src; i++)",
850312a1df1SDavid du Colombier 	"					if (src_all[i].tp == (int) z->_t)",
85100d97012SDavid du Colombier 	"					{	printf(\" %%s:%%d \",",
85200d97012SDavid du Colombier 	"							find_source((int) z->_t, (int) z->_p),",
853312a1df1SDavid du Colombier 	"							src_all[i].src[z->_p]);",
854312a1df1SDavid du Colombier 	"						break;",
855312a1df1SDavid du Colombier 	"					}",
856f3793cddSDavid du Colombier 	"				printf(\"(state %%d)\t[%%s]\\n\", z->_p, q?q:\"\");",
85700d97012SDavid du Colombier 	"			/*	printf(\"\\n\");	*/",
858312a1df1SDavid du Colombier 	"		}	}",
859312a1df1SDavid du Colombier 	"moveon:	z->_p = t->st;",
860312a1df1SDavid du Colombier 	"	}",
861312a1df1SDavid du Colombier 	"	wrap_trail();",
862312a1df1SDavid du Colombier 	"}",
863312a1df1SDavid du Colombier 	"#endif",
864312a1df1SDavid du Colombier 	"int",
865312a1df1SDavid du Colombier 	"f_pid(int pt)",
866312a1df1SDavid du Colombier 	"{	int i;",
867312a1df1SDavid du Colombier 	"	P0 *z;",
868312a1df1SDavid du Colombier 	"	for (i = 0; i < now._nr_pr; i++)",
869312a1df1SDavid du Colombier 	"	{	z = (P0 *)pptr(i);",
870312a1df1SDavid du Colombier 	"		if (z->_t == (unsigned) pt)",
871312a1df1SDavid du Colombier 	"			return BASE+z->_pid;",
872312a1df1SDavid du Colombier 	"	}",
873312a1df1SDavid du Colombier 	"	return -1;",
874312a1df1SDavid du Colombier 	"}",
87500d97012SDavid du Colombier 	"",
87600d97012SDavid du Colombier 	"#if NCORE>1 && !defined(GLOB_HEAP)",
87700d97012SDavid du Colombier 	"	#define SEP_HEAP /* version 5.1.2 */",
878312a1df1SDavid du Colombier 	"#endif",
879312a1df1SDavid du Colombier 	"",
880312a1df1SDavid du Colombier 	"#ifdef BITSTATE",
881312a1df1SDavid du Colombier 	"int",
882312a1df1SDavid du Colombier 	"bstore_mod(char *v, int n)	/* hasharray size not a power of two */",
883*de2caf28SDavid du Colombier 	"{	ulong x, y;",
884*de2caf28SDavid du Colombier 	"	uint i = 1;",
885*de2caf28SDavid du Colombier 	"#if defined(MURMUR) && (WS==8)",
886*de2caf28SDavid du Colombier 	"	m_hash((uchar *) v, n); /* bstore_mod - sets j3_spin, j4_spin, K1, K2 */",
887*de2caf28SDavid du Colombier 	"#else",
888*de2caf28SDavid du Colombier 	"	d_hash((uchar *) v, n); /* bstore_mod - sets j3_spin, j4_spin, K1, K2 */",
889*de2caf28SDavid du Colombier 	"#endif",
890*de2caf28SDavid du Colombier 	"	x = K1; y = j3_spin;",	/* was K2 before 5.1.1 */
891312a1df1SDavid du Colombier 	"	for (;;)",
892312a1df1SDavid du Colombier 	"	{	if (!(SS[x%%udmem]&(1<<y))) break;",	/* take the hit in speed */
893312a1df1SDavid du Colombier 	"		if (i == hfns) {",
894312a1df1SDavid du Colombier 				"#ifdef DEBUG",
895312a1df1SDavid du Colombier 	"			printf(\"Old bitstate\\n\");",
896312a1df1SDavid du Colombier 				"#endif",
897312a1df1SDavid du Colombier 	"			return 1;",
898312a1df1SDavid du Colombier 	"		}",
89900d97012SDavid du Colombier 	"		x = (x + K2 + i);",	/* no mask, using mod - was K1 before 5.1.1 */
900*de2caf28SDavid du Colombier 	"		y = (y + j4_spin) & 7;",
901312a1df1SDavid du Colombier 	"		i++;",
902312a1df1SDavid du Colombier 	"	}",
903312a1df1SDavid du Colombier 		"#ifdef RANDSTOR",
904312a1df1SDavid du Colombier 	"	if (rand()%%100 > RANDSTOR) return 0;",
905312a1df1SDavid du Colombier 		"#endif",
906312a1df1SDavid du Colombier 	"	for (;;)",
907312a1df1SDavid du Colombier 	"	{	SS[x%%udmem] |= (1<<y);",
908312a1df1SDavid du Colombier 	"		if (i == hfns) break;",	/* done */
90900d97012SDavid du Colombier 	"		x = (x + K2 + i);",	/* no mask - was K1 before 5.1.1 */
910*de2caf28SDavid du Colombier 	"		y = (y + j4_spin) & 7;",
911312a1df1SDavid du Colombier 	"		i++;",
912312a1df1SDavid du Colombier 	"	}",
913312a1df1SDavid du Colombier 		"#ifdef DEBUG",
914312a1df1SDavid du Colombier 	"	printf(\"New bitstate\\n\");",
915312a1df1SDavid du Colombier 		"#endif",
916f3793cddSDavid du Colombier 	"	if (now._a_t&1)",
917f3793cddSDavid du Colombier 	"	{	nShadow++;",
918f3793cddSDavid du Colombier 	"	}",
919312a1df1SDavid du Colombier 	"	return 0;",
920312a1df1SDavid du Colombier 	"}",
921312a1df1SDavid du Colombier 	"int",
922312a1df1SDavid du Colombier 	"bstore_reg(char *v, int n)	/* extended hashing, Peter Dillinger, 2004 */",
923*de2caf28SDavid du Colombier 	"{	ulong x, y;",
924*de2caf28SDavid du Colombier 	"	uint i = 1;",
925*de2caf28SDavid du Colombier 	"#if defined(MURMUR) && (WS==8)",
926*de2caf28SDavid du Colombier 	"	m_hash((uchar *) v, n); /* bstore_reg - sets j1_spin-j4_spin */",
927*de2caf28SDavid du Colombier 	"#else",
928*de2caf28SDavid du Colombier 	"	d_hash((uchar *) v, n); /* bstore_reg - sets j1_spin-j4_spin */",
929*de2caf28SDavid du Colombier 	"#endif",
930*de2caf28SDavid du Colombier 	"	x = j2_spin; y = j3_spin;",
931312a1df1SDavid du Colombier 	"	for (;;)",
932312a1df1SDavid du Colombier 	"	{	if (!(SS[x]&(1<<y))) break;",	/* at least one bit not set */
933312a1df1SDavid du Colombier 	"		if (i == hfns) {",
934312a1df1SDavid du Colombier 				"#ifdef DEBUG",
935312a1df1SDavid du Colombier 	"			printf(\"Old bitstate\\n\");",
936312a1df1SDavid du Colombier 				"#endif",
937312a1df1SDavid du Colombier 	"			return 1;",
938312a1df1SDavid du Colombier 	"		}",
93900d97012SDavid du Colombier 	"		x = (x + j1_spin + i) & nmask;",
940*de2caf28SDavid du Colombier 	"		y = (y + j4_spin) & 7;",
941312a1df1SDavid du Colombier 	"		i++;",
942312a1df1SDavid du Colombier 	"	}",
943312a1df1SDavid du Colombier 		"#ifdef RANDSTOR",
944312a1df1SDavid du Colombier 	"	if (rand()%%100 > RANDSTOR) return 0;",
945312a1df1SDavid du Colombier 		"#endif",
946312a1df1SDavid du Colombier 	"	for (;;)",
947312a1df1SDavid du Colombier 	"	{	SS[x] |= (1<<y);",
948312a1df1SDavid du Colombier 	"		if (i == hfns) break;",		/* done */
94900d97012SDavid du Colombier 	"		x = (x + j1_spin + i) & nmask;",
950*de2caf28SDavid du Colombier 	"		y = (y + j4_spin) & 7;",
951312a1df1SDavid du Colombier 	"		i++;",
952312a1df1SDavid du Colombier 	"	}",
953312a1df1SDavid du Colombier 		"#ifdef DEBUG",
954312a1df1SDavid du Colombier 	"	printf(\"New bitstate\\n\");",
955312a1df1SDavid du Colombier 		"#endif",
956f3793cddSDavid du Colombier 	"	if (now._a_t&1)",
957f3793cddSDavid du Colombier 	"	{	nShadow++;",
958f3793cddSDavid du Colombier 	"	}",
959312a1df1SDavid du Colombier 	"	return 0;",
960312a1df1SDavid du Colombier 	"}",
96100d97012SDavid du Colombier 	"#endif", /* BITSTATE */
962*de2caf28SDavid du Colombier 	"ulong TMODE = 0666; /* file permission bits for trail files */",
963312a1df1SDavid du Colombier 	"",
964312a1df1SDavid du Colombier 	"int trcnt=1;",
965*de2caf28SDavid du Colombier 	"char snap[64], fnm[1024];",
966312a1df1SDavid du Colombier 	"",
967312a1df1SDavid du Colombier 	"int",
968312a1df1SDavid du Colombier 	"make_trail(void)",
969312a1df1SDavid du Colombier 	"{	int fd;",
970312a1df1SDavid du Colombier 	"	char *q;",
971f3793cddSDavid du Colombier 	"	char MyFile[512];",
97200d97012SDavid du Colombier 	"	int w_flags = O_CREAT|O_WRONLY|O_TRUNC;",
97300d97012SDavid du Colombier 	"",
97400d97012SDavid du Colombier 	"	if (exclusive == 1 && iterative == 0)",
97500d97012SDavid du Colombier 	"	{	w_flags |= O_EXCL;",
97600d97012SDavid du Colombier 	"	}",
977f3793cddSDavid du Colombier 	"",
978f3793cddSDavid du Colombier 	"	q = strrchr(TrailFile, \'/\');",
979f3793cddSDavid du Colombier 	"	if (q == NULL) q = TrailFile; else q++;",
980f3793cddSDavid du Colombier 	"	strcpy(MyFile, q); /* TrailFile is not a writable string */",
981312a1df1SDavid du Colombier 	"",
982312a1df1SDavid du Colombier 	"	if (iterative == 0 && Nr_Trails++ > 0)",
983*de2caf28SDavid du Colombier 	"	{",
984*de2caf28SDavid du Colombier 	"#ifdef PUTPID",
985*de2caf28SDavid du Colombier 	"		sprintf(fnm, \"%%s_%%s_%%d_%%d.%%s\",",
986*de2caf28SDavid du Colombier 	"			MyFile, progname, getpid(), Nr_Trails-1, tprefix);",
987*de2caf28SDavid du Colombier 	"#else",
988*de2caf28SDavid du Colombier 	"		sprintf(fnm, \"%%s%%d.%%s\",",
989f3793cddSDavid du Colombier 	"			MyFile, Nr_Trails-1, tprefix);",
990*de2caf28SDavid du Colombier 	"#endif",
99100d97012SDavid du Colombier 	"	} else",
99200d97012SDavid du Colombier 	"	{",
99300d97012SDavid du Colombier 	"#ifdef PUTPID",
99400d97012SDavid du Colombier 	"		sprintf(fnm, \"%%s_%%s_%%d.%%s\", MyFile, progname, getpid(), tprefix);",
99500d97012SDavid du Colombier 	"#else",
996f3793cddSDavid du Colombier 	"		sprintf(fnm, \"%%s.%%s\", MyFile, tprefix);",
99700d97012SDavid du Colombier 	"#endif",
99800d97012SDavid du Colombier 	"	}",
99900d97012SDavid du Colombier 	"	if ((fd = open(fnm, w_flags, TMODE)) < 0)",
1000f3793cddSDavid du Colombier 	"	{	if ((q = strchr(MyFile, \'.\')))",
1001312a1df1SDavid du Colombier 	"		{	*q = \'\\0\';",		/* strip .pml */
1002312a1df1SDavid du Colombier 	"			if (iterative == 0 && Nr_Trails-1 > 0)",
1003312a1df1SDavid du Colombier 	"				sprintf(fnm, \"%%s%%d.%%s\",",
1004f3793cddSDavid du Colombier 	"					MyFile, Nr_Trails-1, tprefix);",
1005312a1df1SDavid du Colombier 	"			else",
1006f3793cddSDavid du Colombier 	"				sprintf(fnm, \"%%s.%%s\", MyFile, tprefix);",
1007312a1df1SDavid du Colombier 	"			*q = \'.\';",
100800d97012SDavid du Colombier 	"			fd = open(fnm, w_flags, TMODE);",
1009312a1df1SDavid du Colombier 	"	}	}",
1010312a1df1SDavid du Colombier 	"	if (fd < 0)",
1011f3793cddSDavid du Colombier 	"	{	printf(\"pan: cannot create %%s\\n\", fnm);",
1012312a1df1SDavid du Colombier 	"		perror(\"cause\");",
1013312a1df1SDavid du Colombier 	"	} else",
101400d97012SDavid du Colombier 	"	{",
101500d97012SDavid du Colombier 	"#if NCORE>1 && (defined(SEP_STATE) || !defined(FULL_TRAIL))",
101600d97012SDavid du Colombier 	"	void write_root(void); ",
101700d97012SDavid du Colombier 	"	write_root();",
101800d97012SDavid du Colombier 	"#else",
101900d97012SDavid du Colombier 	"		printf(\"pan: wrote %%s\\n\", fnm);",
102000d97012SDavid du Colombier 	"#endif",
1021f3793cddSDavid du Colombier 	"	}",
1022312a1df1SDavid du Colombier 	"	return fd;",
1023312a1df1SDavid du Colombier 	"}",
102400d97012SDavid du Colombier 	"",
102500d97012SDavid du Colombier 	"#ifndef FREQ",
102600d97012SDavid du Colombier 	"#define FREQ	(1000000)",
102700d97012SDavid du Colombier 	"#endif",
102800d97012SDavid du Colombier 	"double freq = (double) FREQ;\n",
1029312a1df1SDavid du Colombier 
103000d97012SDavid du Colombier 	"#ifdef TRIX",
103100d97012SDavid du Colombier 	"void sv_populate(void);",
103200d97012SDavid du Colombier 	"",
103300d97012SDavid du Colombier 	"void",
103400d97012SDavid du Colombier 	"re_populate(void) /* restore procs and chans from now._ids_ */",
103500d97012SDavid du Colombier 	"{	int i, cnt = 0;",
103600d97012SDavid du Colombier 	"	char *b;",
103700d97012SDavid du Colombier 	"#ifdef V_TRIX",
103800d97012SDavid du Colombier 	"	printf(\"%%4d: re_populate\\n\", depth);",
103900d97012SDavid du Colombier 	"#endif",
104000d97012SDavid du Colombier 	"	for (i = 0; i < now._nr_pr; i++, cnt++)",
104100d97012SDavid du Colombier 	"	{	b = now._ids_[cnt];",
104200d97012SDavid du Colombier 	"		processes[i]->psize = what_p_size( ((P0 *)b)->_t );",
104300d97012SDavid du Colombier 	"		memcpy(processes[i]->body, b, processes[i]->psize);",
104400d97012SDavid du Colombier 	"#ifdef TRIX_RIX",
104500d97012SDavid du Colombier 	"		((P0 *)pptr(i))->_pid = i;",
1046*de2caf28SDavid du Colombier 	"		if (BASE > 0 && h > 0)",
1047*de2caf28SDavid du Colombier 	"		{	((P0 *)pptr(i))->_pid -= BASE;",
1048*de2caf28SDavid du Colombier 	"		}",
104900d97012SDavid du Colombier 	"#endif",
105000d97012SDavid du Colombier 	"#ifndef BFS",
105100d97012SDavid du Colombier 	"		processes[i]->modified = 1; /* re-populate */",
105200d97012SDavid du Colombier 	"#endif",
105300d97012SDavid du Colombier 	"	}",
105400d97012SDavid du Colombier 	"	for (i = 0; i < now._nr_qs; i++, cnt++)",
105500d97012SDavid du Colombier 	"	{	b = now._ids_[cnt];",
105600d97012SDavid du Colombier 	"		channels[i]->psize = what_q_size( ((Q0 *)b)->_t );",
105700d97012SDavid du Colombier 	"		memcpy(channels[i]->body, b, channels[i]->psize);",
105800d97012SDavid du Colombier 	"#ifndef BFS",
105900d97012SDavid du Colombier 	"		channels[i]->modified = 1; /* re-populate */",
106000d97012SDavid du Colombier 	"#endif",
106100d97012SDavid du Colombier 	"	}",
106200d97012SDavid du Colombier 	"}",
106300d97012SDavid du Colombier 	"#endif\n",
106400d97012SDavid du Colombier 
106500d97012SDavid du Colombier 	"#ifdef BFS",	/* breadth-first search */
1066*de2caf28SDavid du Colombier 	"	#ifndef BFS_PAR",
1067*de2caf28SDavid du Colombier 	"		BFS_State *bfs_trail, *bfs_bot, *bfs_free;",
1068*de2caf28SDavid du Colombier 	"		SV_Hold *svfree;",
1069*de2caf28SDavid du Colombier 	"	#else",
1070*de2caf28SDavid du Colombier 	"		static ulong	bfs_pre_allocated;",
1071312a1df1SDavid du Colombier 	"	#endif",
107200d97012SDavid du Colombier 	"	#ifdef BFS_DISK",
107300d97012SDavid du Colombier 	"		#ifndef BFS_LIMIT",
107400d97012SDavid du Colombier 	"			#define BFS_LIMIT	100000",
107500d97012SDavid du Colombier 	"		#endif",
107600d97012SDavid du Colombier 	"		#ifndef BFS_DSK_LIMIT",
107700d97012SDavid du Colombier 	"			#define BFS_DSK_LIMIT	1000000",
107800d97012SDavid du Colombier 	"		#endif",
107900d97012SDavid du Colombier 	"		#if defined(WIN32) || defined(WIN64)",
108000d97012SDavid du Colombier 	"			#define RFLAGS	(O_RDONLY|O_BINARY)",
108100d97012SDavid du Colombier 	"			#define WFLAGS	(O_CREAT|O_WRONLY|O_TRUNC|O_BINARY)",
1082*de2caf28SDavid du Colombier 	"			#define RWFLAGS	(O_RDWR|O_BINARY)",
108300d97012SDavid du Colombier 	"		#else",
108400d97012SDavid du Colombier 	"			#define RFLAGS	(O_RDONLY)",
108500d97012SDavid du Colombier 	"			#define WFLAGS	(O_CREAT|O_WRONLY|O_TRUNC)",
1086*de2caf28SDavid du Colombier 	"			#define RWFLAGS	(O_RDWR)",
108700d97012SDavid du Colombier 	"		#endif",
1088*de2caf28SDavid du Colombier 	"",
108900d97012SDavid du Colombier 	"		long bfs_size_limit;",
109000d97012SDavid du Colombier 	"		int bfs_dsk_write = -1;",
109100d97012SDavid du Colombier 	"		int bfs_dsk_read = -1;",
109200d97012SDavid du Colombier 	"		long bfs_dsk_writes, bfs_dsk_reads;",
109300d97012SDavid du Colombier 	"		int bfs_dsk_seqno_w, bfs_dsk_seqno_r;",
109400d97012SDavid du Colombier 	"	#endif",
109500d97012SDavid du Colombier 	"",
1096312a1df1SDavid du Colombier 	"uchar do_reverse(Trans *, short, uchar);",
1097312a1df1SDavid du Colombier 	"void snapshot(void);",
1098*de2caf28SDavid du Colombier 	"#if 0",
109900d97012SDavid du Colombier 	"void",
110000d97012SDavid du Colombier 	"select_claim(int x)	/* ignored in BFS mode */",
110100d97012SDavid du Colombier 	"{	if (verbose)",
110200d97012SDavid du Colombier 	"	{	printf(\"select %%d (ignored)\\n\", x);",
110300d97012SDavid du Colombier 	"	}",
110400d97012SDavid du Colombier 	"}",
1105*de2caf28SDavid du Colombier 	"#endif",
1106*de2caf28SDavid du Colombier 	"Trail *ntrpt;",
110700d97012SDavid du Colombier 	"",
1108*de2caf28SDavid du Colombier 	"#ifndef BFS_PAR",
1109312a1df1SDavid du Colombier 	"SV_Hold *",
1110312a1df1SDavid du Colombier 	"getsv(int n)",
1111*de2caf28SDavid du Colombier 	"{	SV_Hold *h;",
1112312a1df1SDavid du Colombier 	"",
1113*de2caf28SDavid du Colombier 	"	if (svfree && n <= svfree->sz)",
1114*de2caf28SDavid du Colombier 	"	{	h = svfree;",
1115312a1df1SDavid du Colombier 	"		svfree = h->nxt;",
1116312a1df1SDavid du Colombier 	"		h->nxt = (SV_Hold *) 0;",
1117*de2caf28SDavid du Colombier 	"	} else",
1118312a1df1SDavid du Colombier 	"	{	h = (SV_Hold *) emalloc(sizeof(SV_Hold));",
1119312a1df1SDavid du Colombier 	"		h->sz = n;",
112000d97012SDavid du Colombier 	"	#ifdef BFS_DISK",
112100d97012SDavid du Colombier 	"		if (bfs_size_limit >= BFS_LIMIT)",
112200d97012SDavid du Colombier 	"		{	h->sv = (State *) 0;	/* means: read disk */",
112300d97012SDavid du Colombier 	"			bfs_dsk_writes++;	/* count */",
112400d97012SDavid du Colombier 	"			if (bfs_dsk_write < 0	/* file descriptor */",
112500d97012SDavid du Colombier 	"			||  bfs_dsk_writes%%BFS_DSK_LIMIT == 0)",
112600d97012SDavid du Colombier 	"			{	char dsk_nm[32];",
112700d97012SDavid du Colombier 	"				if (bfs_dsk_write >= 0)",
112800d97012SDavid du Colombier 	"				{	(void) close(bfs_dsk_write);",
112900d97012SDavid du Colombier 	"				}",
113000d97012SDavid du Colombier 	"				sprintf(dsk_nm, \"pan_bfs_%%d.tmp\", bfs_dsk_seqno_w++);",
113100d97012SDavid du Colombier 	"				bfs_dsk_write = open(dsk_nm, WFLAGS, 0644);",
113200d97012SDavid du Colombier 	"				if (bfs_dsk_write < 0)",
113300d97012SDavid du Colombier 	"				{	Uerror(\"could not create tmp disk file\");",
113400d97012SDavid du Colombier 	"				}",
113500d97012SDavid du Colombier 	"				printf(\"pan: created disk file %%s\\n\", dsk_nm);",
113600d97012SDavid du Colombier 	"			}",
113700d97012SDavid du Colombier 	"			if (write(bfs_dsk_write, (char *) &now, n) != n)",
113800d97012SDavid du Colombier 	"			{	Uerror(\"aborting -- disk write failed (disk full?)\");",
113900d97012SDavid du Colombier 	"			}",
114000d97012SDavid du Colombier 	"			return h; /* no memcpy */",
114100d97012SDavid du Colombier 	"		}", /* else */
114200d97012SDavid du Colombier 	"		bfs_size_limit++;",
114300d97012SDavid du Colombier 	"	#endif",
1144312a1df1SDavid du Colombier 	"		h->sv = (State *) emalloc(sizeof(State) - VECTORSZ + n);",
1145312a1df1SDavid du Colombier 	"	}",
114600d97012SDavid du Colombier 	"",
114700d97012SDavid du Colombier 	"	memcpy((char *)h->sv, (char *)&now, n);",
1148312a1df1SDavid du Colombier 	"	return h;",
1149312a1df1SDavid du Colombier 	"}",
1150312a1df1SDavid du Colombier 	"",
1151312a1df1SDavid du Colombier 	"EV_Hold *",
1152312a1df1SDavid du Colombier 	"getsv_mask(int n)",
1153312a1df1SDavid du Colombier 	"{	EV_Hold *h;",
1154312a1df1SDavid du Colombier 	"	static EV_Hold *kept = (EV_Hold *) 0;",
1155312a1df1SDavid du Colombier 	"",
1156312a1df1SDavid du Colombier 	"	for (h = kept; h; h = h->nxt)",
1157312a1df1SDavid du Colombier 	"		if (n == h->sz",
1158*de2caf28SDavid du Colombier 	"#if !defined(NOCOMP) && !defined(HC)",
1159312a1df1SDavid du Colombier 	"		&&  (memcmp((char *) Mask, (char *) h->sv, n) == 0)",
1160*de2caf28SDavid du Colombier 	"#endif",
1161312a1df1SDavid du Colombier 	"		&&  (now._nr_pr == h->nrpr)",
1162312a1df1SDavid du Colombier 	"		&&  (now._nr_qs == h->nrqs)",
116300d97012SDavid du Colombier 	"	#ifdef TRIX",
116400d97012SDavid du Colombier 	"		)",
116500d97012SDavid du Colombier 	"	#else",
1166f3793cddSDavid du Colombier 	"		#if VECTORSZ>32000",
1167312a1df1SDavid du Colombier 	"		&&  (memcmp((char *) proc_offset, (char *) h->po, now._nr_pr * sizeof(int)) == 0)",
1168312a1df1SDavid du Colombier 	"		&&  (memcmp((char *) q_offset, (char *) h->qo, now._nr_qs * sizeof(int)) == 0)",
1169f3793cddSDavid du Colombier 	"		#else",
1170f3793cddSDavid du Colombier 	"		&&  (memcmp((char *) proc_offset, (char *) h->po, now._nr_pr * sizeof(short)) == 0)",
1171f3793cddSDavid du Colombier 	"		&&  (memcmp((char *) q_offset, (char *) h->qo, now._nr_qs * sizeof(short)) == 0)",
1172f3793cddSDavid du Colombier 	"		#endif",
1173f3793cddSDavid du Colombier 	"		&&  (memcmp((char *) proc_skip, (char *) h->ps, now._nr_pr * sizeof(uchar)) == 0)",
1174f3793cddSDavid du Colombier 	"		&&  (memcmp((char *) q_skip,    (char *) h->qs, now._nr_qs * sizeof(uchar)) == 0))",
117500d97012SDavid du Colombier 	"	#endif",
1176312a1df1SDavid du Colombier 	"			break;",
1177312a1df1SDavid du Colombier 	"	if (!h)",
1178312a1df1SDavid du Colombier 	"	{	h = (EV_Hold *) emalloc(sizeof(EV_Hold));",
1179312a1df1SDavid du Colombier 	"		h->sz = n;",
1180312a1df1SDavid du Colombier 	"		h->nrpr = now._nr_pr;",
1181312a1df1SDavid du Colombier 	"		h->nrqs = now._nr_qs;",
1182312a1df1SDavid du Colombier 	"",
1183312a1df1SDavid du Colombier 	"		h->sv = (char *) emalloc(n * sizeof(char));",
1184*de2caf28SDavid du Colombier 	"#if !defined(NOCOMP) && !defined(HC)",
1185312a1df1SDavid du Colombier 	"		memcpy((char *) h->sv, (char *) Mask, n);",
1186*de2caf28SDavid du Colombier 	"#endif",
118700d97012SDavid du Colombier 	"	#ifndef TRIX",
1188312a1df1SDavid du Colombier 	"		if (now._nr_pr > 0)",
118900d97012SDavid du Colombier 	"		{	h->ps = (char *) emalloc(now._nr_pr * sizeof(int));",
119000d97012SDavid du Colombier 	"			memcpy((char *) h->ps, (char *) proc_skip,   now._nr_pr * sizeof(uchar));",
1191f3793cddSDavid du Colombier 	"		#if VECTORSZ>32000",
119200d97012SDavid du Colombier 	"			h->po = (char *) emalloc(now._nr_pr * sizeof(int));",
1193312a1df1SDavid du Colombier 	"			memcpy((char *) h->po, (char *) proc_offset, now._nr_pr * sizeof(int));",
1194f3793cddSDavid du Colombier 	"		#else",
119500d97012SDavid du Colombier 	"			h->po = (char *) emalloc(now._nr_pr * sizeof(short));",
1196f3793cddSDavid du Colombier 	"			memcpy((char *) h->po, (char *) proc_offset, now._nr_pr * sizeof(short));",
1197f3793cddSDavid du Colombier 	"		#endif",
1198312a1df1SDavid du Colombier 	"		}",
1199312a1df1SDavid du Colombier 	"		if (now._nr_qs > 0)",
120000d97012SDavid du Colombier 	"		{	h->qs = (char *) emalloc(now._nr_qs * sizeof(int));",
120100d97012SDavid du Colombier 	"			memcpy((char *) h->qs, (char *) q_skip,   now._nr_qs * sizeof(uchar));",
1202f3793cddSDavid du Colombier 	"		#if VECTORSZ>32000",
120300d97012SDavid du Colombier 	"			h->qo = (char *) emalloc(now._nr_qs * sizeof(int));",
1204312a1df1SDavid du Colombier 	"			memcpy((char *) h->qo, (char *) q_offset, now._nr_qs * sizeof(int));",
1205f3793cddSDavid du Colombier 	"		#else",
120600d97012SDavid du Colombier 	"			h->qo = (char *) emalloc(now._nr_qs * sizeof(short));",
1207f3793cddSDavid du Colombier 	"			memcpy((char *) h->qo, (char *) q_offset, now._nr_qs * sizeof(short));",
1208f3793cddSDavid du Colombier 	"		#endif",
1209312a1df1SDavid du Colombier 	"		}",
121000d97012SDavid du Colombier 	"	#endif",
1211312a1df1SDavid du Colombier 	"		h->nxt = kept;",
1212312a1df1SDavid du Colombier 	"		kept = h;",
1213312a1df1SDavid du Colombier 	"	}",
1214312a1df1SDavid du Colombier 	"	return h;",
1215312a1df1SDavid du Colombier 	"}",
1216312a1df1SDavid du Colombier 	"",
1217312a1df1SDavid du Colombier 	"void",
1218312a1df1SDavid du Colombier 	"freesv(SV_Hold *p)",
1219312a1df1SDavid du Colombier 	"{	SV_Hold *h, *oh;",
1220312a1df1SDavid du Colombier 	"",
1221312a1df1SDavid du Colombier 	"	oh = (SV_Hold *) 0;",
1222312a1df1SDavid du Colombier 	"	for (h = svfree; h; oh = h, h = h->nxt)",
1223*de2caf28SDavid du Colombier 	"	{	if (p->sz >= h->sz)",
1224312a1df1SDavid du Colombier 	"			break;",
122500d97012SDavid du Colombier 	"	}",
1226312a1df1SDavid du Colombier 	"	if (!oh)",
1227312a1df1SDavid du Colombier 	"	{	p->nxt = svfree;",
1228312a1df1SDavid du Colombier 	"		svfree = p;",
1229312a1df1SDavid du Colombier 	"	} else",
1230312a1df1SDavid du Colombier 	"	{	p->nxt = h;",
1231312a1df1SDavid du Colombier 	"		oh->nxt = p;",
1232312a1df1SDavid du Colombier 	"	}",
1233312a1df1SDavid du Colombier 	"}",
1234312a1df1SDavid du Colombier 	"",
1235*de2caf28SDavid du Colombier 	"BFS_State *",
1236312a1df1SDavid du Colombier 	"get_bfs_frame(void)",
1237*de2caf28SDavid du Colombier 	"{	BFS_State *t;",
1238312a1df1SDavid du Colombier 	"",
1239312a1df1SDavid du Colombier 	"	if (bfs_free)",
1240312a1df1SDavid du Colombier 	"	{	t = bfs_free;",
1241312a1df1SDavid du Colombier 	"		bfs_free = bfs_free->nxt;",
1242*de2caf28SDavid du Colombier 	"		t->nxt = (BFS_State *) 0;",
1243312a1df1SDavid du Colombier 	"	} else",
1244*de2caf28SDavid du Colombier 	"	{	t = (BFS_State *) emalloc(sizeof(BFS_State));",
1245312a1df1SDavid du Colombier 	"	}",
1246312a1df1SDavid du Colombier 	"	t->frame = (Trail *) emalloc(sizeof(Trail));", /* always new */
124700d97012SDavid du Colombier 	"	/* new because we keep a ptr to the frame of parent states */",
124800d97012SDavid du Colombier 	"	/* used for reconstructing path and recovering failed rvs etc */",
1249312a1df1SDavid du Colombier 	"	return t;",
1250312a1df1SDavid du Colombier 	"}",
1251312a1df1SDavid du Colombier 	"",
1252312a1df1SDavid du Colombier 	"void",
1253312a1df1SDavid du Colombier 	"push_bfs(Trail *f, int d)",
1254*de2caf28SDavid du Colombier 	"{	BFS_State *t;",
1255312a1df1SDavid du Colombier 	"",
1256312a1df1SDavid du Colombier 	"	t = get_bfs_frame();",
1257312a1df1SDavid du Colombier 	"	memcpy((char *)t->frame, (char *)f, sizeof(Trail));",
1258312a1df1SDavid du Colombier 	"	t->frame->o_tt = d;	/* depth */",
1259312a1df1SDavid du Colombier 	"",
1260312a1df1SDavid du Colombier 	"	t->boq = boq;",
126100d97012SDavid du Colombier 	"	#ifdef TRIX",
126200d97012SDavid du Colombier 	"	sv_populate();",
126300d97012SDavid du Colombier 	"	#endif",
1264312a1df1SDavid du Colombier 	"	t->onow = getsv(vsize);",
1265312a1df1SDavid du Colombier 	"	t->omask = getsv_mask(vsize);",
1266f3793cddSDavid du Colombier 	"	#if defined(FULLSTACK) && defined(Q_PROVISO)",
1267*de2caf28SDavid du Colombier 	"	t->lstate = Lstate;	/* bfs */",
1268312a1df1SDavid du Colombier 	"	#endif",
1269312a1df1SDavid du Colombier 	"	if (!bfs_bot)",
1270312a1df1SDavid du Colombier 	"	{	bfs_bot = bfs_trail = t;",
1271312a1df1SDavid du Colombier 	"	} else",
1272312a1df1SDavid du Colombier 	"	{	bfs_bot->nxt = t;",
1273312a1df1SDavid du Colombier 	"		bfs_bot = t;",
1274312a1df1SDavid du Colombier 	"	}",
127500d97012SDavid du Colombier 	"	#ifdef VERBOSE",
127600d97012SDavid du Colombier 	"	t->nr = nstates;",
127700d97012SDavid du Colombier 	"	#endif",
1278312a1df1SDavid du Colombier 	"	#ifdef CHECK",
1279*de2caf28SDavid du Colombier 	"		#ifdef VERBOSE",
1280*de2caf28SDavid du Colombier 	"	printf(\"PUSH %%lu (depth %%d, nr %%lu)\\n\", (ulong) t->frame, d, t->nr);",
1281*de2caf28SDavid du Colombier 	"		#else",
1282*de2caf28SDavid du Colombier 	"	printf(\"PUSH %%lu (depth %%d)\\n\", (ulong) t->frame, d);",
1283*de2caf28SDavid du Colombier 	"		#endif",
1284312a1df1SDavid du Colombier 	"	#endif",
1285312a1df1SDavid du Colombier 	"}",
1286312a1df1SDavid du Colombier 	"",
1287312a1df1SDavid du Colombier 	"Trail *",
1288312a1df1SDavid du Colombier 	"pop_bfs(void)",
1289*de2caf28SDavid du Colombier 	"{	BFS_State *t;",
1290312a1df1SDavid du Colombier 	"",
1291312a1df1SDavid du Colombier 	"	if (!bfs_trail)",
129200d97012SDavid du Colombier 	"	{	return (Trail *) 0;",
129300d97012SDavid du Colombier 	"	}",
1294312a1df1SDavid du Colombier 	"	t = bfs_trail;",
1295312a1df1SDavid du Colombier 	"	bfs_trail = t->nxt;",
1296312a1df1SDavid du Colombier 	"	if (!bfs_trail)",
1297*de2caf28SDavid du Colombier 	"	{	bfs_bot = (BFS_State *) 0;",
129800d97012SDavid du Colombier 	"	}",
1299f3793cddSDavid du Colombier 	"	#if defined(Q_PROVISO) && !defined(BITSTATE) && !defined(NOREDUCE)",
1300*de2caf28SDavid du Colombier 	"	if (t->lstate)			/* bfs */",
1301*de2caf28SDavid du Colombier 	"	{	t->lstate->tagged = 0;	/* bfs */",
130200d97012SDavid du Colombier 	"	}",
1303312a1df1SDavid du Colombier 	"	#endif",
1304312a1df1SDavid du Colombier 	"	t->nxt = bfs_free;",
1305312a1df1SDavid du Colombier 	"	bfs_free = t;",
1306312a1df1SDavid du Colombier 	"",
1307312a1df1SDavid du Colombier 	"	vsize = t->onow->sz;",
1308312a1df1SDavid du Colombier 	"	boq = t->boq;",
130900d97012SDavid du Colombier 	"	#ifdef BFS_DISK",
131000d97012SDavid du Colombier 	"	if (t->onow->sv == (State *) 0)",
131100d97012SDavid du Colombier 	"	{	char dsk_nm[32];",
131200d97012SDavid du Colombier 	"		bfs_dsk_reads++;	/* count */",
131300d97012SDavid du Colombier 	"		if (bfs_dsk_read >= 0	/* file descriptor */",
131400d97012SDavid du Colombier 	"		&&  bfs_dsk_reads%%BFS_DSK_LIMIT == 0)",
131500d97012SDavid du Colombier 	"		{	(void) close(bfs_dsk_read);",
131600d97012SDavid du Colombier 	"			sprintf(dsk_nm, \"pan_bfs_%%d.tmp\", bfs_dsk_seqno_r-1);",
131700d97012SDavid du Colombier 	"			(void) unlink(dsk_nm);",
131800d97012SDavid du Colombier 	"			bfs_dsk_read = -1;",
131900d97012SDavid du Colombier 	"		}",
132000d97012SDavid du Colombier 	"		if (bfs_dsk_read < 0)",
132100d97012SDavid du Colombier 	"		{	sprintf(dsk_nm, \"pan_bfs_%%d.tmp\", bfs_dsk_seqno_r++);",
132200d97012SDavid du Colombier 	"			bfs_dsk_read = open(dsk_nm, RFLAGS);",
132300d97012SDavid du Colombier 	"			if (bfs_dsk_read < 0)",
132400d97012SDavid du Colombier 	"			{	Uerror(\"could not open temp disk file\");",
132500d97012SDavid du Colombier 	"		}	}",
132600d97012SDavid du Colombier 	"		if (read(bfs_dsk_read, (char *) &now, vsize) != vsize)",
132700d97012SDavid du Colombier 	"		{	Uerror(\"bad bfs disk file read\");",
132800d97012SDavid du Colombier 	"		}",
132900d97012SDavid du Colombier 	"		#ifndef NOVSZ",
133000d97012SDavid du Colombier 	"		if (now._vsz != vsize)",
133100d97012SDavid du Colombier 	"		{	Uerror(\"disk read vsz mismatch\");",
133200d97012SDavid du Colombier 	"		}",
133300d97012SDavid du Colombier 	"		#endif",
133400d97012SDavid du Colombier 	"	} else",
133500d97012SDavid du Colombier 	"	#endif",
133600d97012SDavid du Colombier 	"	{	memcpy((uchar *) &now, (uchar *) t->onow->sv, vsize);",
1337*de2caf28SDavid du Colombier 	"	#ifndef NOVSZ",
1338*de2caf28SDavid du Colombier 	"		vsize = now._vsz;",
1339*de2caf28SDavid du Colombier 	"	#endif",
134000d97012SDavid du Colombier 	"	}",
1341*de2caf28SDavid du Colombier 	"#if !defined(NOCOMP) && !defined(HC)",
1342312a1df1SDavid du Colombier 	"	memcpy((uchar *) Mask, (uchar *) t->omask->sv, vsize);",
1343*de2caf28SDavid du Colombier 	"#endif",
134400d97012SDavid du Colombier 	"	#ifdef TRIX",
134500d97012SDavid du Colombier 	"	re_populate();",
134600d97012SDavid du Colombier 	"	#else",
1347312a1df1SDavid du Colombier 	"	if (now._nr_pr > 0)",
1348f3793cddSDavid du Colombier 	"		#if VECTORSZ>32000",
1349312a1df1SDavid du Colombier 	"	{	memcpy((char *)proc_offset, (char *)t->omask->po, now._nr_pr * sizeof(int));",
1350f3793cddSDavid du Colombier 	"		#else",
1351f3793cddSDavid du Colombier 	"	{	memcpy((char *)proc_offset, (char *)t->omask->po, now._nr_pr * sizeof(short));",
1352f3793cddSDavid du Colombier 	"		#endif",
1353f3793cddSDavid du Colombier 	"		memcpy((char *)proc_skip,   (char *)t->omask->ps, now._nr_pr * sizeof(uchar));",
1354312a1df1SDavid du Colombier 	"	}",
1355312a1df1SDavid du Colombier 	"	if (now._nr_qs > 0)",
1356f3793cddSDavid du Colombier 	"		#if VECTORSZ>32000",
1357312a1df1SDavid du Colombier 	"	{	memcpy((uchar *)q_offset, (uchar *)t->omask->qo, now._nr_qs * sizeof(int));",
1358f3793cddSDavid du Colombier 	"		#else",
1359f3793cddSDavid du Colombier 	"	{	memcpy((uchar *)q_offset, (uchar *)t->omask->qo, now._nr_qs * sizeof(short));",
1360f3793cddSDavid du Colombier 	"		#endif",
1361f3793cddSDavid du Colombier 	"		memcpy((uchar *)q_skip,   (uchar *)t->omask->qs, now._nr_qs * sizeof(uchar));",
1362312a1df1SDavid du Colombier 	"	}",
136300d97012SDavid du Colombier 	"	#endif",
136400d97012SDavid du Colombier 	"	#ifdef BFS_DISK",
136500d97012SDavid du Colombier 	"	if (t->onow->sv != (State *) 0)",
136600d97012SDavid du Colombier 	"	#endif",
136700d97012SDavid du Colombier 	"	{	freesv(t->onow);	/* omask not freed */",
136800d97012SDavid du Colombier 	"	}",
1369312a1df1SDavid du Colombier 	"	#ifdef CHECK",
1370*de2caf28SDavid du Colombier 	"		#ifdef VERBOSE",
1371*de2caf28SDavid du Colombier 	"	printf(\"POP %%lu (depth %%d, nr %%lu)\\n\", (ulong) t->frame, t->frame->o_tt, t->nr);",
1372*de2caf28SDavid du Colombier 	"		#else",
1373*de2caf28SDavid du Colombier 	"	printf(\"POP %%lu (depth %%d)\\n\", (ulong) t->frame, t->frame->o_tt);",
1374*de2caf28SDavid du Colombier 	"		#endif",
1375312a1df1SDavid du Colombier 	"	#endif",
1376312a1df1SDavid du Colombier 	"	return t->frame;",
1377312a1df1SDavid du Colombier 	"}",
1378312a1df1SDavid du Colombier 	"",
1379312a1df1SDavid du Colombier 	"void",
1380312a1df1SDavid du Colombier 	"store_state(Trail *ntrpt, int shortcut, short oboq)",
1381312a1df1SDavid du Colombier 	"{",
1382312a1df1SDavid du Colombier 	"	#ifdef VERI",
1383312a1df1SDavid du Colombier 	"	Trans *t2 = (Trans *) 0;",
1384312a1df1SDavid du Colombier 	"	uchar ot; int tt, E_state;",
1385*de2caf28SDavid du Colombier 	"	uchar o_opm = trpt->o_pm, *othis = _this;",
1386312a1df1SDavid du Colombier 	"",
1387312a1df1SDavid du Colombier 	"	if (shortcut)",
1388312a1df1SDavid du Colombier 	"	{",
1389312a1df1SDavid du Colombier 	"		#ifdef VERBOSE",
1390312a1df1SDavid du Colombier 	"		printf(\"claim: shortcut\\n\");",
1391312a1df1SDavid du Colombier 	"		#endif",
1392312a1df1SDavid du Colombier 	"		goto store_it;	/* no claim move */",
1393312a1df1SDavid du Colombier 	"	}",
1394312a1df1SDavid du Colombier 	"",
1395*de2caf28SDavid du Colombier 	"	_this  = pptr(0);	/* 0 = never claim */",
1396312a1df1SDavid du Colombier 	"	trpt->o_pm = 0;",	/* to interpret else in never claim */
1397312a1df1SDavid du Colombier 	"",
1398*de2caf28SDavid du Colombier 	"	tt    = (int)   ((P0 *)_this)->_p;",
1399*de2caf28SDavid du Colombier 	"	ot    = (uchar) ((P0 *)_this)->_t;",
1400312a1df1SDavid du Colombier 	"",
1401312a1df1SDavid du Colombier 	"		#ifdef HAS_UNLESS",
1402312a1df1SDavid du Colombier 	"	E_state = 0;",
1403312a1df1SDavid du Colombier 	"		#endif",
1404312a1df1SDavid du Colombier 	"	for (t2 = trans[ot][tt]; t2; t2 = t2?t2->nxt:(Trans *)0)",
1405312a1df1SDavid du Colombier 	"	{",
1406312a1df1SDavid du Colombier 	"		#ifdef HAS_UNLESS",
140700d97012SDavid du Colombier 	"		if (E_state > 0 && E_state != t2->e_trans)",
140800d97012SDavid du Colombier 	"		{	break;",
140900d97012SDavid du Colombier 	"		}",
1410312a1df1SDavid du Colombier 	"		#endif",
1411312a1df1SDavid du Colombier 	"		if (do_transit(t2, 0))",
1412312a1df1SDavid du Colombier 	"		{",
1413312a1df1SDavid du Colombier 	"		#ifdef VERBOSE",
1414312a1df1SDavid du Colombier 	"			if (!reached[ot][t2->st])",
1415312a1df1SDavid du Colombier 	"			printf(\"depth: %%d -- claim move from %%d -> %%d\\n\",",
1416*de2caf28SDavid du Colombier 	"				trpt->o_tt, ((P0 *)_this)->_p, t2->st);",
1417312a1df1SDavid du Colombier 	"		#endif",
1418312a1df1SDavid du Colombier 	"		#ifdef HAS_UNLESS",
1419312a1df1SDavid du Colombier 	"			E_state = t2->e_trans;",
1420312a1df1SDavid du Colombier 	"		#endif",
1421312a1df1SDavid du Colombier 	"			if (t2->st > 0)",
1422*de2caf28SDavid du Colombier 	"			{	((P0 *)_this)->_p = t2->st;",
1423312a1df1SDavid du Colombier 	"				reached[ot][t2->st] = 1;",
1424312a1df1SDavid du Colombier 	"		#ifndef NOCLAIM",
142500d97012SDavid du Colombier 	"				if (stopstate[ot][t2->st])",
142600d97012SDavid du Colombier 	"				{	uerror(\"end state in claim reached\");",
142700d97012SDavid du Colombier 	"				}",
1428312a1df1SDavid du Colombier 	"		#endif",
1429312a1df1SDavid du Colombier 	"			}",
1430312a1df1SDavid du Colombier 	"			if (now._nr_pr == 0)	/* claim terminated */",
1431312a1df1SDavid du Colombier 	"				uerror(\"end state in claim reached\");",
1432312a1df1SDavid du Colombier 	"",
1433312a1df1SDavid du Colombier 	"		#ifdef PEG",
1434312a1df1SDavid du Colombier 	"			peg[t2->forw]++;",
1435312a1df1SDavid du Colombier 	"		#endif",
1436312a1df1SDavid du Colombier 	"			trpt->o_pm |= 1;",
143700d97012SDavid du Colombier 	"			if (t2->atom&2)",
143800d97012SDavid du Colombier 	"			{ Uerror(\"atomic in claim not supported in BFS\");",
143900d97012SDavid du Colombier 	"			}",
1440312a1df1SDavid du Colombier 	"store_it:",
1441312a1df1SDavid du Colombier 	"",
1442312a1df1SDavid du Colombier 	"	#endif",	/* VERI */
1443312a1df1SDavid du Colombier 	"",
144400d97012SDavid du Colombier 	"	#if defined(BITSTATE)",
1445*de2caf28SDavid du Colombier 	"			if (!b_store((char *)&now, vsize))",
144600d97012SDavid du Colombier 	"	#elif defined(MA)",
1447*de2caf28SDavid du Colombier 	"			if (!g_store((char *)&now, vsize, 0))",
1448312a1df1SDavid du Colombier 	"	#else",
1449*de2caf28SDavid du Colombier 	"			if (!h_store((char *)&now, vsize))",
1450312a1df1SDavid du Colombier 	"	#endif",
145100d97012SDavid du Colombier 	"			{	static long sdone = (long) 0; long ndone;",
145200d97012SDavid du Colombier 	"				nstates++;",
1453312a1df1SDavid du Colombier 	"	#ifndef NOREDUCE",
145400d97012SDavid du Colombier 	"				trpt->tau |= 64;", /* bfs: succ definitely outside stack */
1455312a1df1SDavid du Colombier 	"	#endif",
1456*de2caf28SDavid du Colombier 	"				ndone = (ulong) (nstates/(freq));",
145700d97012SDavid du Colombier 	"				if (ndone != sdone && mreached%%10 != 0)",
145800d97012SDavid du Colombier 	"				{	snapshot();",
145900d97012SDavid du Colombier 	"					sdone = ndone;",
146000d97012SDavid du Colombier 	"	#if defined(AUTO_RESIZE) && !defined(BITSTATE) && !defined(MA)",
146100d97012SDavid du Colombier 	"					if (nstates > ((double)(1<<(ssize+1))))",
146200d97012SDavid du Colombier 	"					{	void resize_hashtable(void);",
146300d97012SDavid du Colombier 	"						resize_hashtable();",
146400d97012SDavid du Colombier 	"					}",
146500d97012SDavid du Colombier 	"	#endif",
146600d97012SDavid du Colombier 	"				}",
1467312a1df1SDavid du Colombier 	"	#if SYNC",
1468312a1df1SDavid du Colombier 	"				if (boq != -1)",
1469312a1df1SDavid du Colombier 	"					midrv++;",
1470312a1df1SDavid du Colombier 	"				else if (oboq != -1)",
1471312a1df1SDavid du Colombier 	"				{	Trail *x;",
1472312a1df1SDavid du Colombier 	"					x = (Trail *) trpt->ostate; /* pre-rv state */",
1473312a1df1SDavid du Colombier 	"					if (x) x->o_pm |= 4; /* mark success */",
1474312a1df1SDavid du Colombier 	"				}",
1475312a1df1SDavid du Colombier 	"	#endif",
1476312a1df1SDavid du Colombier 	"				push_bfs(ntrpt, trpt->o_tt+1);",
1477312a1df1SDavid du Colombier 	"			} else",
1478312a1df1SDavid du Colombier 	"			{	truncs++;",
1479312a1df1SDavid du Colombier 
1480*de2caf28SDavid du Colombier 	"	#if defined(Q_PROVISO) && !defined(NOREDUCE) && defined(FULLSTACK)",
148100d97012SDavid du Colombier 	"		#if !defined(BITSTATE)",
148200d97012SDavid du Colombier 	"				if (Lstate && Lstate->tagged)",
148300d97012SDavid du Colombier 	"				{  trpt->tau |= 64;",
148400d97012SDavid du Colombier 	"				}",
1485312a1df1SDavid du Colombier 	"		#else",
1486312a1df1SDavid du Colombier 	"				if (trpt->tau&32)",
1487*de2caf28SDavid du Colombier 	"				{  BFS_State *tprov;",
1488312a1df1SDavid du Colombier 	"				   for (tprov = bfs_trail; tprov; tprov = tprov->nxt)",
148900d97012SDavid du Colombier 	"					if (tprov->onow->sv != (State *) 0",
149000d97012SDavid du Colombier 	"					&&  memcmp((uchar *)&now, (uchar *)tprov->onow->sv, vsize) == 0)",
1491312a1df1SDavid du Colombier 	"					{	trpt->tau |= 64;",
1492312a1df1SDavid du Colombier 	"						break;	/* state is in queue */",
1493312a1df1SDavid du Colombier 	"				}	}",
1494312a1df1SDavid du Colombier 	"		#endif",
1495312a1df1SDavid du Colombier 	"	#endif",
1496312a1df1SDavid du Colombier 	"			}",
1497312a1df1SDavid du Colombier 	"	#ifdef VERI",
1498*de2caf28SDavid du Colombier 	"			((P0 *)_this)->_p = tt;	/* reset claim */",
1499312a1df1SDavid du Colombier 	"			if (t2)",
1500312a1df1SDavid du Colombier 	"				do_reverse(t2, 0, 0);",
1501312a1df1SDavid du Colombier 	"			else",
1502312a1df1SDavid du Colombier 	"				break;",
1503312a1df1SDavid du Colombier 	"	}	}",
1504*de2caf28SDavid du Colombier 	"	_this = othis;",
1505312a1df1SDavid du Colombier 	"	trpt->o_pm = o_opm;",
1506312a1df1SDavid du Colombier 	"	#endif",
1507312a1df1SDavid du Colombier 	"}",
1508312a1df1SDavid du Colombier 	"",
1509312a1df1SDavid du Colombier 	"void",
1510312a1df1SDavid du Colombier 	"bfs(void)",
1511f3793cddSDavid du Colombier 	"{	Trans *t; Trail *otrpt, *x;",
1512312a1df1SDavid du Colombier 	"	uchar _n, _m, ot, nps = 0;",
1513312a1df1SDavid du Colombier 	"	int tt, E_state;",
1514312a1df1SDavid du Colombier 	"	short II, From = (short) (now._nr_pr-1), To = BASE;",
1515312a1df1SDavid du Colombier 	"	short oboq = boq;",
1516312a1df1SDavid du Colombier 	"",
1517312a1df1SDavid du Colombier 	"	ntrpt = (Trail *) emalloc(sizeof(Trail));",
1518*de2caf28SDavid du Colombier 	"	trpt->ostate = (H_el *) 0;",
1519312a1df1SDavid du Colombier 	"	trpt->tau = 0;",
1520312a1df1SDavid du Colombier 	"",
1521312a1df1SDavid du Colombier 	"	trpt->o_tt = -1;",
1522312a1df1SDavid du Colombier 	"	store_state(ntrpt, 0, oboq);	/* initial state */",
1523312a1df1SDavid du Colombier 	"",
1524312a1df1SDavid du Colombier 	"	while ((otrpt = pop_bfs()))	/* also restores now */",
1525312a1df1SDavid du Colombier 	"	{	memcpy((char *) trpt, (char *) otrpt, sizeof(Trail));",
1526312a1df1SDavid du Colombier 	"	#if defined(C_States) && (HAS_TRACK==1)",
1527312a1df1SDavid du Colombier 	"		c_revert((uchar *) &(now.c_state[0]));",
1528312a1df1SDavid du Colombier 	"	#endif",
1529312a1df1SDavid du Colombier 	"		if (trpt->o_pm & 4)",
1530312a1df1SDavid du Colombier 	"		{",
1531312a1df1SDavid du Colombier 	"	#ifdef VERBOSE",
1532312a1df1SDavid du Colombier 	"			printf(\"Revisit of atomic not needed (%%d)\\n\",",
1533312a1df1SDavid du Colombier 	"				trpt->o_pm);",	/* at least 1 rv succeeded */
1534312a1df1SDavid du Colombier 	"	#endif",
1535312a1df1SDavid du Colombier 	"			continue;",
1536312a1df1SDavid du Colombier 	"		}",
1537312a1df1SDavid du Colombier 	"	#ifndef NOREDUCE",
1538312a1df1SDavid du Colombier 	"		nps = 0;",
1539312a1df1SDavid du Colombier 	"	#endif",
1540312a1df1SDavid du Colombier 	"		if (trpt->o_pm == 8)",
1541312a1df1SDavid du Colombier 	"		{	revrv++;",
1542312a1df1SDavid du Colombier 	"			if (trpt->tau&8)",
1543312a1df1SDavid du Colombier 	"			{",
1544312a1df1SDavid du Colombier 	"	#ifdef VERBOSE",
1545312a1df1SDavid du Colombier 	"				printf(\"Break atomic (pm:%%d,tau:%%d)\\n\",",
1546312a1df1SDavid du Colombier 	"					trpt->o_pm, trpt->tau);",
1547312a1df1SDavid du Colombier 	"	#endif",
1548312a1df1SDavid du Colombier 	"				trpt->tau &= ~8;",
1549312a1df1SDavid du Colombier 	"			}",
1550312a1df1SDavid du Colombier 	"	#ifndef NOREDUCE",
1551312a1df1SDavid du Colombier 	"			else if (trpt->tau&32)",	/* was a preselected move */
1552312a1df1SDavid du Colombier 	"			{",
1553312a1df1SDavid du Colombier 	"		#ifdef VERBOSE",
1554312a1df1SDavid du Colombier 	"				printf(\"Void preselection (pm:%%d,tau:%%d)\\n\",",
1555312a1df1SDavid du Colombier 	"					trpt->o_pm, trpt->tau);",
1556312a1df1SDavid du Colombier 	"		#endif",
1557312a1df1SDavid du Colombier 	"				trpt->tau &= ~32;",
1558312a1df1SDavid du Colombier 	"				nps = 1; /* no preselection in repeat */",
1559312a1df1SDavid du Colombier 	"			}",
1560312a1df1SDavid du Colombier 	"	#endif",
1561312a1df1SDavid du Colombier 	"		}",
1562312a1df1SDavid du Colombier 	"		trpt->o_pm &= ~(4|8);",
1563312a1df1SDavid du Colombier 	"		if (trpt->o_tt > mreached)",
1564312a1df1SDavid du Colombier 	"		{	mreached = trpt->o_tt;",
1565312a1df1SDavid du Colombier 	"			if (mreached%%10 == 0)",
156600d97012SDavid du Colombier 	"			{	snapshot();",
1567312a1df1SDavid du Colombier 	"		}	}",
1568312a1df1SDavid du Colombier 	"		depth = trpt->o_tt;",
1569312a1df1SDavid du Colombier 
1570312a1df1SDavid du Colombier 	"		if (depth >= maxdepth)",
1571312a1df1SDavid du Colombier 	"		{",
1572312a1df1SDavid du Colombier 	"	#if SYNC",
1573312a1df1SDavid du Colombier 	"			Trail *x;",
1574312a1df1SDavid du Colombier 	"			if (boq != -1)",
1575312a1df1SDavid du Colombier 	"			{	x = (Trail *) trpt->ostate;",
1576312a1df1SDavid du Colombier 	"				if (x) x->o_pm |= 4; /* not failing */",
1577312a1df1SDavid du Colombier 	"			}",
1578312a1df1SDavid du Colombier 	"	#endif",
1579312a1df1SDavid du Colombier 	"			truncs++;",
1580312a1df1SDavid du Colombier 	"			if (!warned)",
1581312a1df1SDavid du Colombier 	"			{	warned = 1;",
1582312a1df1SDavid du Colombier 	"		  		printf(\"error: max search depth too small\\n\");",
1583312a1df1SDavid du Colombier 	"			}",
1584312a1df1SDavid du Colombier 	"			if (bounded)",
158500d97012SDavid du Colombier 	"			{	uerror(\"depth limit reached\");",
158600d97012SDavid du Colombier 	"			}",
1587312a1df1SDavid du Colombier 	"			continue;",
1588312a1df1SDavid du Colombier 	"		}",
1589312a1df1SDavid du Colombier 	"	#ifndef NOREDUCE",
1590312a1df1SDavid du Colombier 	"		if (boq == -1 && !(trpt->tau&8) && nps == 0)",
1591312a1df1SDavid du Colombier 	"		for (II = now._nr_pr-1; II >= BASE; II -= 1)",
1592312a1df1SDavid du Colombier 	"		{",
1593*de2caf28SDavid du Colombier 	"Pickup:		_this = pptr(II);",
1594*de2caf28SDavid du Colombier 	"			tt = (int) ((P0 *)_this)->_p;",
1595*de2caf28SDavid du Colombier 	"			ot = (uchar) ((P0 *)_this)->_t;",
1596312a1df1SDavid du Colombier 	"			if (trans[ot][tt]->atom & 8)",	/* safe */
1597312a1df1SDavid du Colombier 	"			{	t = trans[ot][tt];",
1598312a1df1SDavid du Colombier 	"				if (t->qu[0] != 0)",
1599312a1df1SDavid du Colombier 	"				{	Ccheck++;",
1600312a1df1SDavid du Colombier 	"					if (!q_cond(II, t))",
1601312a1df1SDavid du Colombier 	"						continue;",
1602312a1df1SDavid du Colombier 	"					Cholds++;",
1603312a1df1SDavid du Colombier 	"				}",
1604312a1df1SDavid du Colombier 	"				From = To = II;",
1605312a1df1SDavid du Colombier 	"				trpt->tau |= 32; /* preselect marker */",
1606312a1df1SDavid du Colombier 	"		#ifdef DEBUG",
160700d97012SDavid du Colombier 	"				printf(\"%%3ld: proc %%d PreSelected (tau=%%d)\\n\", ",
1608312a1df1SDavid du Colombier 	"					depth, II, trpt->tau);",
1609312a1df1SDavid du Colombier 	"		#endif",
1610312a1df1SDavid du Colombier 	"				goto MainLoop;",
1611312a1df1SDavid du Colombier 	"		}	}",
1612312a1df1SDavid du Colombier 	"		trpt->tau &= ~32;",	/* not preselected */
161300d97012SDavid du Colombier 	"	#endif",	/* if !NOREDUCE */
1614312a1df1SDavid du Colombier 	"Repeat:",
1615312a1df1SDavid du Colombier 	"		if (trpt->tau&8)		/* atomic */",
1616312a1df1SDavid du Colombier 	"		{	From = To = (short ) trpt->pr;",
1617312a1df1SDavid du Colombier 	"			nlinks++;",
1618312a1df1SDavid du Colombier 	"		} else",
1619312a1df1SDavid du Colombier 	"		{	From = now._nr_pr-1;",
1620312a1df1SDavid du Colombier 	"			To = BASE;",
1621312a1df1SDavid du Colombier 	"		}",
1622312a1df1SDavid du Colombier 	"MainLoop:",
1623312a1df1SDavid du Colombier 	"		_n = _m = 0;",
1624312a1df1SDavid du Colombier 	"		for (II = From; II >= To; II -= 1)",
1625312a1df1SDavid du Colombier 	"		{",
1626*de2caf28SDavid du Colombier 	"			_this = pptr(II);",
1627*de2caf28SDavid du Colombier 	"			tt = (int) ((P0 *)_this)->_p;",
1628*de2caf28SDavid du Colombier 	"			ot = (uchar) ((P0 *)_this)->_t;",
1629312a1df1SDavid du Colombier 	"	#if SYNC",
1630312a1df1SDavid du Colombier 	"			/* no rendezvous with same proc */",
163100d97012SDavid du Colombier 	"			if (boq != -1 && trpt->pr == II)",
163200d97012SDavid du Colombier 	"			{	continue;",
163300d97012SDavid du Colombier 	"			}",
1634312a1df1SDavid du Colombier 	"	#endif",
1635312a1df1SDavid du Colombier 	"			ntrpt->pr = (uchar) II;",
1636312a1df1SDavid du Colombier 	"			ntrpt->st = tt;	",
1637312a1df1SDavid du Colombier 	"			trpt->o_pm &= ~1; /* no move yet */",
1638312a1df1SDavid du Colombier 	"	#ifdef EVENT_TRACE",
1639312a1df1SDavid du Colombier 	"			trpt->o_event = now._event;",
1640312a1df1SDavid du Colombier 	"	#endif",
1641*de2caf28SDavid du Colombier 
1642*de2caf28SDavid du Colombier 	"	#ifdef HAS_PRIORITY",
1643*de2caf28SDavid du Colombier 	"			if (!highest_priority(((P0 *)_this)->_pid, II, t))",
1644*de2caf28SDavid du Colombier 	"			{	continue;",
1645*de2caf28SDavid du Colombier 	"			}",
1646*de2caf28SDavid du Colombier 	"	#else",
1647312a1df1SDavid du Colombier 	"		#ifdef HAS_PROVIDED",
164800d97012SDavid du Colombier 	"			if (!provided(II, ot, tt, t))",
164900d97012SDavid du Colombier 	"			{	continue;",
165000d97012SDavid du Colombier 	"			}",
1651312a1df1SDavid du Colombier 	"		#endif",
1652*de2caf28SDavid du Colombier 	"	#endif",
1653*de2caf28SDavid du Colombier 
1654312a1df1SDavid du Colombier 	"	#ifdef HAS_UNLESS",
1655312a1df1SDavid du Colombier 	"			E_state = 0;",
1656312a1df1SDavid du Colombier 	"	#endif",
1657312a1df1SDavid du Colombier 	"			for (t = trans[ot][tt]; t; t = t->nxt)",
1658312a1df1SDavid du Colombier 	"			{",
1659312a1df1SDavid du Colombier 	"	#ifdef HAS_UNLESS",
1660312a1df1SDavid du Colombier 	"				if (E_state > 0",
1661312a1df1SDavid du Colombier 	"				&&  E_state != t->e_trans)",
1662312a1df1SDavid du Colombier 	"					break;",
1663312a1df1SDavid du Colombier 	"	#endif",
1664312a1df1SDavid du Colombier 	"				ntrpt->o_t = t;",
1665312a1df1SDavid du Colombier 	"",
1666312a1df1SDavid du Colombier 	"				oboq = boq;",
1667312a1df1SDavid du Colombier 	"",
1668312a1df1SDavid du Colombier 	"				if (!(_m = do_transit(t, II)))",
1669312a1df1SDavid du Colombier 	"					continue;",
1670312a1df1SDavid du Colombier 	"",
1671312a1df1SDavid du Colombier 	"				trpt->o_pm |= 1;	/* we moved */",
1672312a1df1SDavid du Colombier 	"				(trpt+1)->o_m = _m;	/* for unsend */",
1673312a1df1SDavid du Colombier 	"	#ifdef PEG",
1674312a1df1SDavid du Colombier 	"				peg[t->forw]++;",
1675312a1df1SDavid du Colombier 	"	#endif",
1676312a1df1SDavid du Colombier 	"	#ifdef CHECK",
167700d97012SDavid du Colombier 	"				printf(\"%%3ld: proc %%d exec %%d, \",",
1678312a1df1SDavid du Colombier 	"					depth, II, t->forw);",
1679312a1df1SDavid du Colombier 	"				printf(\"%%d to %%d, %%s %%s %%s\",",
1680312a1df1SDavid du Colombier 	"					tt, t->st, t->tp,",
1681312a1df1SDavid du Colombier 	"					(t->atom&2)?\"atomic\":\"\",",
1682312a1df1SDavid du Colombier 	"					(boq != -1)?\"rendez-vous\":\"\");",
1683312a1df1SDavid du Colombier 	"		#ifdef HAS_UNLESS",
1684312a1df1SDavid du Colombier 	"				if (t->e_trans)",
1685312a1df1SDavid du Colombier 	"					printf(\" (escapes to state %%d)\", t->st);",
1686312a1df1SDavid du Colombier 	"		#endif",
1687312a1df1SDavid du Colombier 	"				printf(\" %%saccepting [tau=%%d]\\n\",",
1688312a1df1SDavid du Colombier 	"					(trpt->o_pm&2)?\"\":\"non-\", trpt->tau);",
1689312a1df1SDavid du Colombier 	"	#endif",
1690312a1df1SDavid du Colombier 	"	#ifdef HAS_UNLESS",
1691312a1df1SDavid du Colombier 	"				E_state = t->e_trans;",
1692312a1df1SDavid du Colombier 	"		#if SYNC>0",
1693312a1df1SDavid du Colombier 	"				if (t->e_trans > 0 && (boq != -1 /* || oboq != -1 */))",
169400d97012SDavid du Colombier 	"				{ fprintf(efd, \"error:\ta rendezvous stmnt in the escape clause\\n\");",
1695312a1df1SDavid du Colombier 	"				  fprintf(efd, \"\tof an unless stmnt is not compatible with -DBFS\\n\");",
1696312a1df1SDavid du Colombier 	"				  pan_exit(1);",
1697312a1df1SDavid du Colombier 	"				}",
1698312a1df1SDavid du Colombier 	"		#endif",
1699312a1df1SDavid du Colombier 	"	#endif",
170000d97012SDavid du Colombier 	"				if (t->st > 0)",
1701*de2caf28SDavid du Colombier 	"				{	((P0 *)_this)->_p = t->st;",
170200d97012SDavid du Colombier 	"				}",
1703312a1df1SDavid du Colombier 	"",
1704*de2caf28SDavid du Colombier 	"	/* ptr to pred: */	ntrpt->ostate = (H_el *) otrpt;",
1705312a1df1SDavid du Colombier 	"				ntrpt->st = tt;",
1706312a1df1SDavid du Colombier 	"				if (boq == -1 && (t->atom&2))	/* atomic */",
1707312a1df1SDavid du Colombier 	"					ntrpt->tau = 8;	/* record for next move */",
1708312a1df1SDavid du Colombier 	"				else",
1709312a1df1SDavid du Colombier 	"					ntrpt->tau = 0;",
1710312a1df1SDavid du Colombier 	"				store_state(ntrpt, (boq != -1 || (t->atom&2)), oboq);",
1711312a1df1SDavid du Colombier 	"	#ifdef EVENT_TRACE",
1712312a1df1SDavid du Colombier 	"				now._event = trpt->o_event;",
1713312a1df1SDavid du Colombier 	"	#endif",
1714312a1df1SDavid du Colombier 	"				/* undo move and continue */",
1715312a1df1SDavid du Colombier 	"				trpt++;	/* this is where ovals and ipt are set */",
1716312a1df1SDavid du Colombier 	"				do_reverse(t, II, _m);	/* restore now. */",
1717312a1df1SDavid du Colombier 	"				trpt--;",
1718312a1df1SDavid du Colombier 	"	#ifdef CHECK",
171900d97012SDavid du Colombier 	"				enter_critical(GLOBAL_LOCK);	/* verbose mode */",
1720*de2caf28SDavid du Colombier 	"		#if NCORE>1",
172100d97012SDavid du Colombier 	"				printf(\"cpu%%d: \", core_id);",
172200d97012SDavid du Colombier 	"		#endif",
1723*de2caf28SDavid du Colombier 	"				printf(\"%%3lu: proc %%d \", depth, II);",
1724312a1df1SDavid du Colombier 	"				printf(\"reverses %%d, %%d to %%d,\",",
1725312a1df1SDavid du Colombier 	"					t->forw, tt, t->st);",
1726*de2caf28SDavid du Colombier 	"				printf(\" %%s [abit=%%d,adepth=%%ld,\",",
1727312a1df1SDavid du Colombier 	"					t->tp, now._a_t, A_depth);",
1728312a1df1SDavid du Colombier 	"				printf(\"tau=%%d,%%d]\\n\",",
1729312a1df1SDavid du Colombier 	"					trpt->tau, (trpt-1)->tau);",
173000d97012SDavid du Colombier 	"				leave_critical(GLOBAL_LOCK);",
173100d97012SDavid du Colombier 	"	#endif",
1732312a1df1SDavid du Colombier 	"				reached[ot][t->st] = 1;",
1733312a1df1SDavid du Colombier 	"				reached[ot][tt]    = 1;",
1734312a1df1SDavid du Colombier 	"",
1735*de2caf28SDavid du Colombier 	"				((P0 *)_this)->_p = tt;",
1736312a1df1SDavid du Colombier 	"				_n |= _m;",
1737312a1df1SDavid du Colombier 	"		}	}",
173800d97012SDavid du Colombier 	"	#ifndef NOREDUCE",	/* with PO */
1739312a1df1SDavid du Colombier 	"		/* preselected - no succ definitely outside stack */",
1740312a1df1SDavid du Colombier 	"		if ((trpt->tau&32) && !(trpt->tau&64))",
1741312a1df1SDavid du Colombier 	"		{	From = now._nr_pr-1; To = BASE;",
1742312a1df1SDavid du Colombier 	"		#ifdef DEBUG",
174300d97012SDavid du Colombier 	"			cpu_printf(\"%%3ld: proc %%d UnSelected (_n=%%d, tau=%%d)\\n\", ",
1744312a1df1SDavid du Colombier 	"				depth, II+1, (int) _n, trpt->tau);",
1745312a1df1SDavid du Colombier 	"		#endif",
1746312a1df1SDavid du Colombier 	"			_n = 0; trpt->tau &= ~32;",
1747312a1df1SDavid du Colombier 	"			if (II >= BASE)",
174800d97012SDavid du Colombier 	"			{	goto Pickup;",
174900d97012SDavid du Colombier 	"			}",
1750312a1df1SDavid du Colombier 	"			goto MainLoop;",
1751312a1df1SDavid du Colombier 	"		}",
1752312a1df1SDavid du Colombier 	"		trpt->tau &= ~(32|64);",
175300d97012SDavid du Colombier 	"	#endif",	/* PO */
1754312a1df1SDavid du Colombier 	"		if (_n != 0)",
175500d97012SDavid du Colombier 	"		{	continue;",
175600d97012SDavid du Colombier 	"		}",
1757312a1df1SDavid du Colombier 	"	#ifdef DEBUG",
175800d97012SDavid du Colombier 	"		printf(\"%%3ld: no move [II=%%d, tau=%%d, boq=%%d, _nr_pr=%%d]\\n\",",
1759312a1df1SDavid du Colombier 	"			depth, II, trpt->tau, boq, now._nr_pr);",
1760312a1df1SDavid du Colombier 	"	#endif",
1761312a1df1SDavid du Colombier 	"		if (boq != -1)",
1762312a1df1SDavid du Colombier 	"		{	failedrv++;",
1763312a1df1SDavid du Colombier 	"			x = (Trail *) trpt->ostate;	/* pre-rv state */",
176400d97012SDavid du Colombier 	"			if (!x)",
176500d97012SDavid du Colombier 	"			{	continue;		/* root state */",
176600d97012SDavid du Colombier 	"			}",
1767312a1df1SDavid du Colombier 	"			if ((x->tau&8) || (x->tau&32)) /* break atomic or preselect at parent */",
1768312a1df1SDavid du Colombier 	"			{	x->o_pm |= 8; /* mark failure */",
1769*de2caf28SDavid du Colombier 	"				_this = pptr(otrpt->pr);",
1770312a1df1SDavid du Colombier 	"	#ifdef VERBOSE",
1771312a1df1SDavid du Colombier 	"				printf(\"\\treset state of %%d from %%d to %%d\\n\",",
1772*de2caf28SDavid du Colombier 	"					otrpt->pr, ((P0 *)_this)->_p, otrpt->st);",
1773312a1df1SDavid du Colombier 	"	#endif",
1774*de2caf28SDavid du Colombier 	"				((P0 *)_this)->_p = otrpt->st;",
1775312a1df1SDavid du Colombier 	"				unsend(boq);	/* retract rv offer */",
1776312a1df1SDavid du Colombier 	"				boq = -1;",
1777312a1df1SDavid du Colombier 
1778312a1df1SDavid du Colombier 	"				push_bfs(x, x->o_tt);",
1779312a1df1SDavid du Colombier 	"	#ifdef VERBOSE",
1780312a1df1SDavid du Colombier 	"				printf(\"failed rv, repush with %%d\\n\", x->o_pm);",
1781312a1df1SDavid du Colombier 	"	#endif",
1782312a1df1SDavid du Colombier 	"			}",
1783312a1df1SDavid du Colombier 	"	#ifdef VERBOSE",
178400d97012SDavid du Colombier 	"			else",
178500d97012SDavid du Colombier 	"			{	printf(\"failed rv, tau at parent: %%d\\n\", x->tau);",
178600d97012SDavid du Colombier 	"			}",
1787312a1df1SDavid du Colombier 	"	#endif",
1788312a1df1SDavid du Colombier 	"		} else if (now._nr_pr > 0)",
1789312a1df1SDavid du Colombier 	"		{",
1790312a1df1SDavid du Colombier 	"			if ((trpt->tau&8))		/* atomic */",
1791312a1df1SDavid du Colombier 	"			{	trpt->tau &= ~(1|8);	/* 1=timeout, 8=atomic */",
1792312a1df1SDavid du Colombier 	"	#ifdef DEBUG",
179300d97012SDavid du Colombier 	"				printf(\"%%3ld: atomic step proc %%d blocks\\n\",",
1794312a1df1SDavid du Colombier 	"					depth, II+1);",
1795312a1df1SDavid du Colombier 	"	#endif",
1796312a1df1SDavid du Colombier 	"				goto Repeat;",
1797312a1df1SDavid du Colombier 	"			}",
1798312a1df1SDavid du Colombier 	"",
1799312a1df1SDavid du Colombier 	"			if (!(trpt->tau&1)) /* didn't try timeout yet */",
1800312a1df1SDavid du Colombier 	"			{	trpt->tau |=  1;",
1801312a1df1SDavid du Colombier 	"	#ifdef DEBUG",
1802*de2caf28SDavid du Colombier 	"				printf(\"%%ld: timeout\\n\", depth);",
1803312a1df1SDavid du Colombier 	"	#endif",
1804312a1df1SDavid du Colombier 	"				goto MainLoop;",
1805312a1df1SDavid du Colombier 	"			}",
1806312a1df1SDavid du Colombier 	"	#ifndef VERI",
1807312a1df1SDavid du Colombier 	"			if (!noends && !a_cycles && !endstate())",
180800d97012SDavid du Colombier 	"			{	uerror(\"invalid end state\");",
180900d97012SDavid du Colombier 	"			}",
1810312a1df1SDavid du Colombier 	"	#endif",
1811312a1df1SDavid du Colombier 	"	}	}",
1812312a1df1SDavid du Colombier 	"}",
1813*de2caf28SDavid du Colombier 	"#endif",	/* !BFS_PAR */
1814312a1df1SDavid du Colombier 	"",
1815312a1df1SDavid du Colombier 	"void",
1816312a1df1SDavid du Colombier 	"putter(Trail *trpt, int fd)",
1817312a1df1SDavid du Colombier 	"{	long j;",
1818312a1df1SDavid du Colombier 	"",
1819312a1df1SDavid du Colombier 	"	if (!trpt) return;",
1820312a1df1SDavid du Colombier 	"",
1821312a1df1SDavid du Colombier 	"	if (trpt != (Trail *) trpt->ostate)",
1822312a1df1SDavid du Colombier 	"		putter((Trail *) trpt->ostate, fd);",
1823312a1df1SDavid du Colombier 	"",
1824312a1df1SDavid du Colombier 	"	if (trpt->o_t)",
1825312a1df1SDavid du Colombier 	"	{	sprintf(snap, \"%%d:%%d:%%d\\n\",",
1826312a1df1SDavid du Colombier 	"			trcnt++, trpt->pr, trpt->o_t->t_id);",
1827312a1df1SDavid du Colombier 	"		j = strlen(snap);",
1828312a1df1SDavid du Colombier 	"		if (write(fd, snap, j) != j)",
1829312a1df1SDavid du Colombier 	"		{       printf(\"pan: error writing %%s\\n\", fnm);",
1830f3793cddSDavid du Colombier 	"			pan_exit(1);",
1831312a1df1SDavid du Colombier 	"	}	}",
1832312a1df1SDavid du Colombier 	"}",
1833312a1df1SDavid du Colombier 	"",
1834312a1df1SDavid du Colombier 	"void",
1835*de2caf28SDavid du Colombier 	"n_ewrite(int fd, char *s, int n)",
1836*de2caf28SDavid du Colombier 	"{	if (write(fd, s, strlen(s)) != strlen(s))",
1837*de2caf28SDavid du Colombier 	"	{       printf(\"pan: error writing %%s\\n\", fnm);",
1838*de2caf28SDavid du Colombier 	"		pan_exit(1);",
1839*de2caf28SDavid du Colombier 	"	}",
1840*de2caf28SDavid du Colombier 	"}",
1841*de2caf28SDavid du Colombier 	"",
1842*de2caf28SDavid du Colombier 	"void",
1843*de2caf28SDavid du Colombier 	"nuerror(void)",
1844312a1df1SDavid du Colombier 	"{	int fd = make_trail();",
1845f3793cddSDavid du Colombier 	"	int j;",
1846f3793cddSDavid du Colombier 	"",
1847312a1df1SDavid du Colombier 	"	if (fd < 0) return;",
1848312a1df1SDavid du Colombier 	"	#ifdef VERI",
184900d97012SDavid du Colombier 	"		sprintf(snap, \"-2:%%d:-2\\n\", (uchar) ((P0 *)pptr(0))->_t);",
1850*de2caf28SDavid du Colombier 	"		n_ewrite(fd, snap, strlen(snap));",
1851312a1df1SDavid du Colombier 	"	#endif",
1852312a1df1SDavid du Colombier 	"	#ifdef MERGED",
1853312a1df1SDavid du Colombier 	"		sprintf(snap, \"-4:-4:-4\\n\");",
1854*de2caf28SDavid du Colombier 	"		n_ewrite(fd, snap, strlen(snap));",
1855312a1df1SDavid du Colombier 	"	#endif",
1856312a1df1SDavid du Colombier 	"	trcnt = 1;",
1857312a1df1SDavid du Colombier 	"	putter(trpt, fd);",
1858f3793cddSDavid du Colombier 	"	if (ntrpt->o_t)",	/* 4.2.8 -- Alex example, missing last transition */
1859f3793cddSDavid du Colombier 	"	{	sprintf(snap, \"%%d:%%d:%%d\\n\",",
1860f3793cddSDavid du Colombier 	"			trcnt++, ntrpt->pr, ntrpt->o_t->t_id);",
1861f3793cddSDavid du Colombier 	"		j = strlen(snap);",
1862*de2caf28SDavid du Colombier 	"		n_ewrite(fd, snap, j);",
1863*de2caf28SDavid du Colombier 	"	}",
1864312a1df1SDavid du Colombier 	"	close(fd);",
1865312a1df1SDavid du Colombier 	"	if (errors >= upto && upto != 0)",
186600d97012SDavid du Colombier 	"	{	wrapup();",
1867312a1df1SDavid du Colombier 	"	}",
1868f3793cddSDavid du Colombier 	"}",
1869312a1df1SDavid du Colombier 	"#endif",	/* BFS */
1870312a1df1SDavid du Colombier 	0,
1871312a1df1SDavid du Colombier };
1872312a1df1SDavid du Colombier 
1873*de2caf28SDavid du Colombier static const char *Code2d[] = {
187400d97012SDavid du Colombier 	"clock_t start_time;",
187500d97012SDavid du Colombier 	"#if NCORE>1",
187600d97012SDavid du Colombier 	"clock_t crash_stamp;",
187700d97012SDavid du Colombier 	"#endif",
187800d97012SDavid du Colombier 	"#if !defined(WIN32) && !defined(WIN64)",
187900d97012SDavid du Colombier 	"struct tms start_tm;",
188000d97012SDavid du Colombier 	"#endif",
188100d97012SDavid du Colombier 	"",
1882*de2caf28SDavid du Colombier 	"#if SYNC",
1883*de2caf28SDavid du Colombier 	"extern int q_zero(int);",
1884*de2caf28SDavid du Colombier 	"extern int not_RV(int);",
1885*de2caf28SDavid du Colombier 	"#endif",
1886*de2caf28SDavid du Colombier 	"",
188700d97012SDavid du Colombier 	"void",
188800d97012SDavid du Colombier 	"start_timer(void)",
188900d97012SDavid du Colombier 	"{",
189000d97012SDavid du Colombier 	"#if defined(WIN32) || defined(WIN64)",
189100d97012SDavid du Colombier 	"	start_time = clock();",
189200d97012SDavid du Colombier 	"#else",
189300d97012SDavid du Colombier 	"	start_time = times(&start_tm);",
189400d97012SDavid du Colombier 	"#endif",
189500d97012SDavid du Colombier 	"}",
189600d97012SDavid du Colombier 	"",
189700d97012SDavid du Colombier 	"double delta_time;",
1898*de2caf28SDavid du Colombier 	"",
1899*de2caf28SDavid du Colombier 	"void",
1900*de2caf28SDavid du Colombier 	"report_time(void)",
1901*de2caf28SDavid du Colombier 	"{",
1902*de2caf28SDavid du Colombier 	"	printf(\"\\npan: elapsed time %%.3g seconds\\n\", delta_time);",
1903*de2caf28SDavid du Colombier 	"	if (delta_time > 0.01)",
1904*de2caf28SDavid du Colombier 	"	{	printf(\"pan: rate %%9.8g states/second\\n\", nstates/delta_time);",
1905*de2caf28SDavid du Colombier 	"		if (verbose)",
1906*de2caf28SDavid du Colombier 	"		{	printf(\"pan: avg transition delay %%.5g usec\\n\",",
1907*de2caf28SDavid du Colombier 	"				delta_time/(nstates+truncs));",
1908*de2caf28SDavid du Colombier 	"	}	}",
1909*de2caf28SDavid du Colombier 	"}",
1910*de2caf28SDavid du Colombier 	"",
1911*de2caf28SDavid du Colombier 	"void",
1912*de2caf28SDavid du Colombier 	"stop_timer(int report)",
1913*de2caf28SDavid du Colombier 	"{	clock_t stop_time;",
191400d97012SDavid du Colombier 	"#if !defined(WIN32) && !defined(WIN64)",
191500d97012SDavid du Colombier 	"	struct tms stop_tm;",
191600d97012SDavid du Colombier 	"	stop_time = times(&stop_tm);",
191700d97012SDavid du Colombier 	"	delta_time = ((double) (stop_time - start_time)) / ((double) sysconf(_SC_CLK_TCK));",
191800d97012SDavid du Colombier 	"#else",
191900d97012SDavid du Colombier 	"	stop_time = clock();",
192000d97012SDavid du Colombier 	"	delta_time = ((double) (stop_time - start_time)) / ((double) CLOCKS_PER_SEC);",
192100d97012SDavid du Colombier 	"#endif",
192200d97012SDavid du Colombier 	"	if (readtrail || delta_time < 0.00) return;",
192300d97012SDavid du Colombier 	"#if NCORE>1",
192400d97012SDavid du Colombier 	"	if (core_id == 0 && nstates > (double) 0)",
192500d97012SDavid du Colombier 	"	{	printf(\"\\ncpu%%d: elapsed time %%.3g seconds (%%g states visited)\\n\",",
192600d97012SDavid du Colombier 	"			core_id, delta_time, nstates);",
192700d97012SDavid du Colombier 	"		if (delta_time > 0.01)",
192800d97012SDavid du Colombier 	"		{	printf(\"cpu%%d: rate %%g states/second\\n\", core_id, nstates/delta_time);",
192900d97012SDavid du Colombier 	"		}",
193000d97012SDavid du Colombier 	"		{ void check_overkill(void);",
193100d97012SDavid du Colombier 	"	 	  check_overkill();",
193200d97012SDavid du Colombier 	"	}	}",
193300d97012SDavid du Colombier 	"#else",
1934*de2caf28SDavid du Colombier 	"	if (report)",
1935*de2caf28SDavid du Colombier 	"	{	report_time();",
1936*de2caf28SDavid du Colombier 	"	}",
193700d97012SDavid du Colombier 	"#endif",
193800d97012SDavid du Colombier 	"}",
193900d97012SDavid du Colombier 	"",
194000d97012SDavid du Colombier 	"#if NCORE>1",
194100d97012SDavid du Colombier 	"#ifdef T_ALERT",
194200d97012SDavid du Colombier 	"double t_alerts[17];",
194300d97012SDavid du Colombier 	"",
194400d97012SDavid du Colombier 	"void",
194500d97012SDavid du Colombier 	"crash_report(void)",
194600d97012SDavid du Colombier 	"{	int i;",
194700d97012SDavid du Colombier 	"	printf(\"crash alert intervals:\\n\");",
194800d97012SDavid du Colombier 	"	for (i = 0; i < 17; i++)",
194900d97012SDavid du Colombier 	"	{	printf(\"%%d\\t%%g\\n\", i, t_alerts[i]);",
195000d97012SDavid du Colombier 	"}	}",
195100d97012SDavid du Colombier 	"#endif",
195200d97012SDavid du Colombier 	"",
195300d97012SDavid du Colombier 	"void",
195400d97012SDavid du Colombier 	"crash_reset(void)",
195500d97012SDavid du Colombier 	"{	/* false alarm */",
195600d97012SDavid du Colombier 	"	if (crash_stamp != (clock_t) 0)",
195700d97012SDavid du Colombier 	"	{",
195800d97012SDavid du Colombier 	"#ifdef T_ALERT",
195900d97012SDavid du Colombier 	"		double delta_time;",
196000d97012SDavid du Colombier 	"		int i;",
196100d97012SDavid du Colombier 		"#if defined(WIN32) || defined(WIN64)",
196200d97012SDavid du Colombier 	"		delta_time = ((double) (clock() - crash_stamp)) / ((double) CLOCKS_PER_SEC);",
196300d97012SDavid du Colombier 		"#else",
196400d97012SDavid du Colombier 	"		delta_time = ((double) (times(&start_tm) - crash_stamp)) / ((double) sysconf(_SC_CLK_TCK));",
196500d97012SDavid du Colombier 		"#endif",
196600d97012SDavid du Colombier 	"		for (i = 0; i < 16; i++)",
196700d97012SDavid du Colombier 	"		{	if (delta_time <= (i*30))",
196800d97012SDavid du Colombier 	"			{	t_alerts[i] = delta_time;",
196900d97012SDavid du Colombier 	"				break;",
197000d97012SDavid du Colombier 	"		}	}",
197100d97012SDavid du Colombier 	"		if (i == 16) t_alerts[i] = delta_time;",
197200d97012SDavid du Colombier 	"#endif",
197300d97012SDavid du Colombier 	"		if (verbose)",
197400d97012SDavid du Colombier 	"		printf(\"cpu%%d: crash alert off\\n\", core_id);",
197500d97012SDavid du Colombier 	"	}",
197600d97012SDavid du Colombier 	"	crash_stamp = (clock_t) 0;",
197700d97012SDavid du Colombier 	"}",
197800d97012SDavid du Colombier 	"",
197900d97012SDavid du Colombier 	"int",
198000d97012SDavid du Colombier 	"crash_test(double maxtime)",
198100d97012SDavid du Colombier 	"{	double delta_time;",
198200d97012SDavid du Colombier 	"	if (crash_stamp == (clock_t) 0)",
198300d97012SDavid du Colombier 	"	{	/* start timing */",
198400d97012SDavid du Colombier 	"#if defined(WIN32) || defined(WIN64)",
198500d97012SDavid du Colombier 	"		crash_stamp = clock();",
198600d97012SDavid du Colombier 	"#else",
198700d97012SDavid du Colombier 	"		crash_stamp = times(&start_tm);",
198800d97012SDavid du Colombier 	"#endif",
198900d97012SDavid du Colombier 	"		if (verbose)",
199000d97012SDavid du Colombier 	"		{	printf(\"cpu%%d: crash detection\\n\", core_id);",
199100d97012SDavid du Colombier 	"		}",
199200d97012SDavid du Colombier 	"		return 0;",
199300d97012SDavid du Colombier 	"	}",
199400d97012SDavid du Colombier 	"#if defined(WIN32) || defined(WIN64)",
199500d97012SDavid du Colombier 	"	delta_time = ((double) (clock() - crash_stamp)) / ((double) CLOCKS_PER_SEC);",
199600d97012SDavid du Colombier 	"#else",
199700d97012SDavid du Colombier 	"	delta_time = ((double) (times(&start_tm) - crash_stamp)) / ((double) sysconf(_SC_CLK_TCK));",
199800d97012SDavid du Colombier 	"#endif",
199900d97012SDavid du Colombier 	"	return (delta_time >= maxtime);",
200000d97012SDavid du Colombier 	"}",
200100d97012SDavid du Colombier 	"#endif",
200200d97012SDavid du Colombier 	"",
2003*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
2004*de2caf28SDavid du Colombier 	"int ncores = 0;",
2005*de2caf28SDavid du Colombier 	"#endif",
2006*de2caf28SDavid du Colombier 	"",
2007312a1df1SDavid du Colombier 	"void",
20087dd7cddfSDavid du Colombier 	"do_the_search(void)",
20097dd7cddfSDavid du Colombier 	"{	int i;",
20107dd7cddfSDavid du Colombier 	"	depth = mreached = 0;",
2011312a1df1SDavid du Colombier 	"	trpt = &trail[0];",
20127dd7cddfSDavid du Colombier 	"#ifdef VERI",
20137dd7cddfSDavid du Colombier 	"	trpt->tau |= 4;	/* the claim moves first */",
20147dd7cddfSDavid du Colombier 	"#endif",
20157dd7cddfSDavid du Colombier 	"	for (i = 0; i < (int) now._nr_pr; i++)",
20167dd7cddfSDavid du Colombier 	"	{	P0 *ptr = (P0 *) pptr(i);",
20177dd7cddfSDavid du Colombier 	"#ifndef NP",
20187dd7cddfSDavid du Colombier 	"		if (!(trpt->o_pm&2)",
20197dd7cddfSDavid du Colombier 	"		&&  accpstate[ptr->_t][ptr->_p])",
20207dd7cddfSDavid du Colombier 	"		{	trpt->o_pm |= 2;",
2021*de2caf28SDavid du Colombier 	"			break;",
20227dd7cddfSDavid du Colombier 	"		}",
20237dd7cddfSDavid du Colombier 	"#else",
20247dd7cddfSDavid du Colombier 	"		if (!(trpt->o_pm&4)",
20257dd7cddfSDavid du Colombier 	"		&&  progstate[ptr->_t][ptr->_p])",
20267dd7cddfSDavid du Colombier 	"		{	trpt->o_pm |= 4;",
2027*de2caf28SDavid du Colombier 	"			break;",
20287dd7cddfSDavid du Colombier 	"		}",
20297dd7cddfSDavid du Colombier 	"#endif",
20307dd7cddfSDavid du Colombier 	"	}",
20317dd7cddfSDavid du Colombier 	"#ifdef EVENT_TRACE",
20327dd7cddfSDavid du Colombier 	"#ifndef NP",
20337dd7cddfSDavid du Colombier 	"	if (accpstate[EVENT_TRACE][now._event])",
20347dd7cddfSDavid du Colombier 	"	{	trpt->o_pm |= 2;",
20357dd7cddfSDavid du Colombier 	"	}",
20367dd7cddfSDavid du Colombier 	"#else",
20377dd7cddfSDavid du Colombier 	"	if (progstate[EVENT_TRACE][now._event])",
20387dd7cddfSDavid du Colombier 	"	{	trpt->o_pm |= 4;",
20397dd7cddfSDavid du Colombier 	"	}",
20407dd7cddfSDavid du Colombier 	"#endif",
20417dd7cddfSDavid du Colombier 	"#endif",
2042*de2caf28SDavid du Colombier 	"#if !defined(NOCOMP) && !defined(HC)",
20437dd7cddfSDavid du Colombier 	"	Mask[0] = Mask[1] = 1;	/* _nr_pr, _nr_qs */",
20447dd7cddfSDavid du Colombier 	"	if (!a_cycles)",
20457dd7cddfSDavid du Colombier 	"	{	i = &(now._a_t) - (uchar *) &now;",
20467dd7cddfSDavid du Colombier 	"		Mask[i] = 1; /* _a_t */",
20477dd7cddfSDavid du Colombier 	"	}",
20487dd7cddfSDavid du Colombier 	"	#ifndef NOFAIR",
20497dd7cddfSDavid du Colombier 	"		if (!fairness)",
20507dd7cddfSDavid du Colombier 	"		{	int j = 0;",
20517dd7cddfSDavid du Colombier 	"			i = &(now._cnt[0]) - (uchar *) &now;",
20527dd7cddfSDavid du Colombier 	"			while (j++ < NFAIR)",
20537dd7cddfSDavid du Colombier 	"				Mask[i++] = 1; /* _cnt[] */",
20547dd7cddfSDavid du Colombier 	"		}",
20557dd7cddfSDavid du Colombier 	"	#endif",
20567dd7cddfSDavid du Colombier 	"#endif",
20577dd7cddfSDavid du Colombier 	"#ifndef NOFAIR",
20587dd7cddfSDavid du Colombier 	"	if (fairness",
20597dd7cddfSDavid du Colombier 	"	&&  (a_cycles && (trpt->o_pm&2)))",
20607dd7cddfSDavid du Colombier 	"	{	now._a_t = 2;	/* set the A-bit */",
20617dd7cddfSDavid du Colombier 	"		now._cnt[0] = now._nr_pr + 1;",	/* NEW: +1 */
20627dd7cddfSDavid du Colombier 		"#ifdef VERBOSE",
206300d97012SDavid du Colombier 	"	printf(\"%%3ld: fairness Rule 1, cnt=%%d, _a_t=%%d\\n\",",
20647dd7cddfSDavid du Colombier 	"		depth, now._cnt[now._a_t&1], now._a_t);",
20657dd7cddfSDavid du Colombier 		"#endif",
20667dd7cddfSDavid du Colombier 	"	}",
20677dd7cddfSDavid du Colombier 	"#endif",
2068312a1df1SDavid du Colombier 
206900d97012SDavid du Colombier 	"	c_stack_start = (char *) &i; /* meant to be read-only */",
207000d97012SDavid du Colombier 
207100d97012SDavid du Colombier 	"#if defined(HAS_CODE) && defined (C_INIT)",
207200d97012SDavid du Colombier 	"	C_INIT; /* initialization of data that must precede fork() */",
207300d97012SDavid du Colombier 	"	c_init_done++;",
207400d97012SDavid du Colombier 	"#endif",
207500d97012SDavid du Colombier 
2076312a1df1SDavid du Colombier 	"#if defined(C_States) && (HAS_TRACK==1)",
2077312a1df1SDavid du Colombier 	"	/* capture initial state of tracked C objects */",
2078312a1df1SDavid du Colombier 	"	c_update((uchar *) &(now.c_state[0]));",
2079312a1df1SDavid du Colombier 	"#endif",
2080312a1df1SDavid du Colombier 
2081312a1df1SDavid du Colombier 	"#ifdef HAS_CODE",
2082312a1df1SDavid du Colombier 	"	if (readtrail) getrail(); /* no return */",
2083312a1df1SDavid du Colombier 	"#endif",
2084*de2caf28SDavid du Colombier 	"#ifndef BFS_PAR",
208500d97012SDavid du Colombier 	"	start_timer();",
2086*de2caf28SDavid du Colombier 	"#endif",
2087312a1df1SDavid du Colombier 	"#ifdef BFS",
2088*de2caf28SDavid du Colombier 	"	#ifdef BFS_PAR",
2089*de2caf28SDavid du Colombier 	"		bfs_main(ncores,0);",
2090*de2caf28SDavid du Colombier 	"	#else",
2091312a1df1SDavid du Colombier 	"		bfs();",
2092*de2caf28SDavid du Colombier 	"	#endif",
2093312a1df1SDavid du Colombier 	"#else",
2094312a1df1SDavid du Colombier 	"	#if defined(C_States) && defined(HAS_STACK) && (HAS_TRACK==1)",
2095312a1df1SDavid du Colombier 	"		/* initial state of tracked & unmatched objects */",
2096312a1df1SDavid du Colombier 	"		c_stack((uchar *) &(svtack->c_stack[0]));",
2097312a1df1SDavid du Colombier 	"	#endif",
209800d97012SDavid du Colombier 
209900d97012SDavid du Colombier 	"	#if defined(P_RAND) || defined(T_RAND)",
2100*de2caf28SDavid du Colombier 	"		srand(s_rand+HASH_NR);", /* do_the_search */
2101312a1df1SDavid du Colombier 	"	#endif",
210200d97012SDavid du Colombier 
210300d97012SDavid du Colombier 	"	#if NCORE>1",
210400d97012SDavid du Colombier 	"		mem_get();",
210500d97012SDavid du Colombier 	"	#else",
21067dd7cddfSDavid du Colombier 	"		new_state();	/* start 1st DFS */",
2107312a1df1SDavid du Colombier 	"	#endif",
210800d97012SDavid du Colombier 	"#endif",
21097dd7cddfSDavid du Colombier 	"}",
21107dd7cddfSDavid du Colombier 
21117dd7cddfSDavid du Colombier 	"#ifdef INLINE_REV",
2112312a1df1SDavid du Colombier 	"uchar",
2113312a1df1SDavid du Colombier 	"do_reverse(Trans *t, short II, uchar M)",
2114312a1df1SDavid du Colombier 	"{	uchar _m = M;",
2115*de2caf28SDavid du Colombier 	"	int  tt = (int) ((P0 *)_this)->_p;",
2116*de2caf28SDavid du Colombier 	"#include BACKWARD_MOVES",
2117312a1df1SDavid du Colombier 	"R999:	return _m;",
21187dd7cddfSDavid du Colombier 	"}",
21197dd7cddfSDavid du Colombier 	"#endif",
21207dd7cddfSDavid du Colombier 
2121219b2ee8SDavid du Colombier 	"#ifndef INLINE",
21227dd7cddfSDavid du Colombier 	"	#ifdef EVENT_TRACE",
21237dd7cddfSDavid du Colombier 	"static char _tp = 'n'; static int _qid = 0;",
21247dd7cddfSDavid du Colombier 	"	#endif",
2125312a1df1SDavid du Colombier 	"uchar",
2126312a1df1SDavid du Colombier 	"do_transit(Trans *t, short II)",
2127312a1df1SDavid du Colombier 	"{	uchar _m = 0;",
2128*de2caf28SDavid du Colombier 	"	int  tt = (int) ((P0 *)_this)->_p;",
2129312a1df1SDavid du Colombier 	"	#ifdef M_LOSS",
2130312a1df1SDavid du Colombier 	"	uchar delta_m = 0;",
2131312a1df1SDavid du Colombier 	"	#endif",
21327dd7cddfSDavid du Colombier 	"	#ifdef EVENT_TRACE",
21337dd7cddfSDavid du Colombier 	"	short oboq = boq;",
2134*de2caf28SDavid du Colombier 	"	uchar ot = (uchar)  ((P0 *)_this)->_t;",
213500d97012SDavid du Colombier 	"	if (II == -EVENT_TRACE) boq = -1;",
21367dd7cddfSDavid du Colombier 		"#define continue	{ boq = oboq; return 0; }",
21377dd7cddfSDavid du Colombier 	"	#else",
2138219b2ee8SDavid du Colombier 		"#define continue	return 0",
2139312a1df1SDavid du Colombier 		"#ifdef SEPARATE",
2140*de2caf28SDavid du Colombier 	"	uchar ot = (uchar)  ((P0 *)_this)->_t;",
2141312a1df1SDavid du Colombier 		"#endif",
21427dd7cddfSDavid du Colombier 	"	#endif",
21437dd7cddfSDavid du Colombier 	"#include FORWARD_MOVES",
21447dd7cddfSDavid du Colombier 	"P999:",
21457dd7cddfSDavid du Colombier 	"	#ifdef EVENT_TRACE",
214600d97012SDavid du Colombier 	"	if (II == -EVENT_TRACE) boq = oboq;",
21477dd7cddfSDavid du Colombier 	"	#endif",
2148312a1df1SDavid du Colombier 	"	return _m;",
2149219b2ee8SDavid du Colombier 	"	#undef continue",
2150219b2ee8SDavid du Colombier 	"}",
21517dd7cddfSDavid du Colombier 	"#ifdef EVENT_TRACE",
21527dd7cddfSDavid du Colombier 	"void",
21537dd7cddfSDavid du Colombier 	"require(char tp, int qid)",
21547dd7cddfSDavid du Colombier 	"{	Trans *t;",
21557dd7cddfSDavid du Colombier 	"	_tp = tp; _qid = qid;",
2156312a1df1SDavid du Colombier 	"",
21577dd7cddfSDavid du Colombier 	"	if (now._event != endevent)",
21587dd7cddfSDavid du Colombier 	"	for (t = trans[EVENT_TRACE][now._event]; t; t = t->nxt)",
215900d97012SDavid du Colombier 	"	{	if (do_transit(t, -EVENT_TRACE))",
21607dd7cddfSDavid du Colombier 	"		{	now._event = t->st;",
21617dd7cddfSDavid du Colombier 	"			reached[EVENT_TRACE][t->st] = 1;",
21627dd7cddfSDavid du Colombier 	"	#ifdef VERBOSE",
21637dd7cddfSDavid du Colombier 	"	printf(\"	event_trace move to -> %%d\\n\", t->st);",
21647dd7cddfSDavid du Colombier 	"	#endif",
2165312a1df1SDavid du Colombier 	"	#ifndef BFS",
21667dd7cddfSDavid du Colombier 		"	#ifndef NP",
21677dd7cddfSDavid du Colombier 	"			if (accpstate[EVENT_TRACE][now._event])",
21687dd7cddfSDavid du Colombier 	"				(trpt+1)->o_pm |= 2;",
21697dd7cddfSDavid du Colombier 		"	#else",
21707dd7cddfSDavid du Colombier 	"			if (progstate[EVENT_TRACE][now._event])",
21717dd7cddfSDavid du Colombier 	"				(trpt+1)->o_pm |= 4;",
21727dd7cddfSDavid du Colombier 		"	#endif",
2173312a1df1SDavid du Colombier 	"	#endif",
2174312a1df1SDavid du Colombier 	"	#ifdef NEGATED_TRACE",
2175312a1df1SDavid du Colombier 	"			if (now._event == endevent)",
2176312a1df1SDavid du Colombier 	"			{",
2177312a1df1SDavid du Colombier 		"	#ifndef BFS",
2178312a1df1SDavid du Colombier 	"				depth++; trpt++;",
2179312a1df1SDavid du Colombier 		"	#endif",
2180312a1df1SDavid du Colombier 	"				uerror(\"event_trace error (all events matched)\");",
2181312a1df1SDavid du Colombier 		"	#ifndef BFS",
2182312a1df1SDavid du Colombier 	"				trpt--; depth--;",
2183312a1df1SDavid du Colombier 		"	#endif",
2184312a1df1SDavid du Colombier 	"				break;",
2185312a1df1SDavid du Colombier 	"			}",
2186312a1df1SDavid du Colombier 	"	#endif",
21877dd7cddfSDavid du Colombier 	"			for (t = t->nxt; t; t = t->nxt)",
218800d97012SDavid du Colombier 	"			{	if (do_transit(t, -EVENT_TRACE))",
2189312a1df1SDavid du Colombier 	"				 Uerror(\"non-determinism in event-trace\");",
21907dd7cddfSDavid du Colombier 	"			}",
21917dd7cddfSDavid du Colombier 	"			return;",
21927dd7cddfSDavid du Colombier 	"		}",
21937dd7cddfSDavid du Colombier 	"	#ifdef VERBOSE",
21947dd7cddfSDavid du Colombier 	"		 else",
21957dd7cddfSDavid du Colombier 	"	printf(\"	event_trace miss '%%c' -- %%d, %%d, %%d\\n\",",
21967dd7cddfSDavid du Colombier 	"			tp, qid, now._event, t->forw);",
21977dd7cddfSDavid du Colombier 	"	#endif",
21987dd7cddfSDavid du Colombier 	"	}",
21997dd7cddfSDavid du Colombier 	"	#ifdef NEGATED_TRACE",
2200f3793cddSDavid du Colombier 	"	now._event = endevent; /* only 1st try will count -- fixed 4.2.6 */",
22017dd7cddfSDavid du Colombier 	"	#else",
2202312a1df1SDavid du Colombier 	"		#ifndef BFS",
22037dd7cddfSDavid du Colombier 	"	depth++; trpt++;",
2204312a1df1SDavid du Colombier 	"		#endif",
22057dd7cddfSDavid du Colombier 	"	uerror(\"event_trace error (no matching event)\");",
2206312a1df1SDavid du Colombier 	"		#ifndef BFS",
22077dd7cddfSDavid du Colombier 	"	trpt--; depth--;",
22087dd7cddfSDavid du Colombier 	"		#endif",
2209312a1df1SDavid du Colombier 	"	#endif",
22107dd7cddfSDavid du Colombier 	"}",
22117dd7cddfSDavid du Colombier 	"#endif",
2212219b2ee8SDavid du Colombier 	"int",
2213219b2ee8SDavid du Colombier 	"enabled(int iam, int pid)",
2214*de2caf28SDavid du Colombier 	"{	Trans *t; uchar *othis = _this;",
2215312a1df1SDavid du Colombier 	"	int res = 0; int tt; uchar ot;",
2216*de2caf28SDavid du Colombier 	"",
2217*de2caf28SDavid du Colombier 	"	pid += BASE;",
2218219b2ee8SDavid du Colombier 	"	if (pid == iam)",
2219219b2ee8SDavid du Colombier 	"		Uerror(\"used: enabled(pid=thisproc)\");",
22207dd7cddfSDavid du Colombier 	"	if (pid < 0 || pid >= (int) now._nr_pr)",
2221219b2ee8SDavid du Colombier 	"		return 0;",
2222*de2caf28SDavid du Colombier 	"	_this = pptr(pid);",
2223219b2ee8SDavid du Colombier 	"	TstOnly = 1;",
2224*de2caf28SDavid du Colombier 	"	tt = (int) ((P0 *)_this)->_p;",
2225*de2caf28SDavid du Colombier 	"	ot = (uchar) ((P0 *)_this)->_t;",
2226219b2ee8SDavid du Colombier 	"	for (t = trans[ot][tt]; t; t = t->nxt)",
2227312a1df1SDavid du Colombier 	"		if (do_transit(t, (short) pid))",
2228219b2ee8SDavid du Colombier 	"		{	res = 1;",
2229219b2ee8SDavid du Colombier 	"			break;",
2230219b2ee8SDavid du Colombier 	"		}",
2231219b2ee8SDavid du Colombier 	"	TstOnly = 0;",
2232*de2caf28SDavid du Colombier 	"	_this = othis;",
2233219b2ee8SDavid du Colombier 	"	return res;",
2234219b2ee8SDavid du Colombier 	"}",
2235219b2ee8SDavid du Colombier 	"#endif",
2236*de2caf28SDavid du Colombier 	"",
2237*de2caf28SDavid du Colombier 	"#ifdef HAS_PRIORITY",
2238*de2caf28SDavid du Colombier 	"int",
2239*de2caf28SDavid du Colombier 	"highest_priority(int pid, short nII, Trans *t)",
2240*de2caf28SDavid du Colombier 	"{	int i = pid; uchar *othis = _this;",
2241*de2caf28SDavid du Colombier 	"",
2242*de2caf28SDavid du Colombier 	"#ifdef VERI",
2243*de2caf28SDavid du Colombier 	"	if (nII == 0)",
2244*de2caf28SDavid du Colombier 	"	{	return 1;", /* never claim */
2245*de2caf28SDavid du Colombier 	"	}",
2246*de2caf28SDavid du Colombier 	"#endif",
2247*de2caf28SDavid du Colombier 	"#ifdef HAS_PROVIDED",
2248*de2caf28SDavid du Colombier 	"	i = pid+BASE;",	 /* uncorrected process number */
2249*de2caf28SDavid du Colombier 	"#endif",
2250*de2caf28SDavid du Colombier 	"	if (i < 0",
2251*de2caf28SDavid du Colombier 	"	||  i >= (int) now._nr_pr",
2252*de2caf28SDavid du Colombier 	"#ifdef HAS_PROVIDED",
2253*de2caf28SDavid du Colombier 	"	|| !provided(i, (uchar) ((P0 *)_this)->_t, (int) ((P0 *)_this)->_p, t)",
2254*de2caf28SDavid du Colombier 	"#endif",
2255*de2caf28SDavid du Colombier 	"	)",
2256*de2caf28SDavid du Colombier 	"	{	return 0;",
2257*de2caf28SDavid du Colombier 	"	}",
2258*de2caf28SDavid du Colombier 	"",
2259*de2caf28SDavid du Colombier 	"	for (i = BASE; i < now._nr_pr; i++)",	/* all except never, if present */
2260*de2caf28SDavid du Colombier 	"	{	_this = pptr(i);",
2261*de2caf28SDavid du Colombier 	"		if (i != pid+BASE",
2262*de2caf28SDavid du Colombier 	"		&&  ((P0 *)_this)->_priority > ((P0 *)pptr(pid+BASE))->_priority",
2263*de2caf28SDavid du Colombier 	"#ifdef HAS_PROVIDED",
2264*de2caf28SDavid du Colombier 	"		&&  provided(i, (uchar) ((P0 *)_this)->_t, (int) ((P0 *)_this)->_p, 0)",
2265*de2caf28SDavid du Colombier 	"#endif",
2266*de2caf28SDavid du Colombier 	"		&&  enabled(i+1, i-BASE))", /* enabled adds back BASE in 2nd arg */
2267*de2caf28SDavid du Colombier 	"		{	_this = othis;",
2268*de2caf28SDavid du Colombier 	"			return 0;",
2269*de2caf28SDavid du Colombier 	"	}	}",
2270*de2caf28SDavid du Colombier 	"	_this = othis;",
2271*de2caf28SDavid du Colombier 	"	return 1;",
2272*de2caf28SDavid du Colombier 	"}",
2273*de2caf28SDavid du Colombier 	"int",
2274*de2caf28SDavid du Colombier 	"get_priority(int pid)",
2275*de2caf28SDavid du Colombier 	"{	pid += BASE;	/* 6.2.7 */",
2276*de2caf28SDavid du Colombier 	"	if (pid < 0 || pid >= (int) now._nr_pr)",
2277*de2caf28SDavid du Colombier 	"		return 0;",
2278*de2caf28SDavid du Colombier 	"	return ((P0 *)pptr(pid))->_priority;",
2279*de2caf28SDavid du Colombier 	"}",
2280*de2caf28SDavid du Colombier 	"int",
2281*de2caf28SDavid du Colombier 	"set_priority(int pid, int pr)",
2282*de2caf28SDavid du Colombier 	"{	pid += BASE;	/* 6.2.7 */",
2283*de2caf28SDavid du Colombier 	"	if (pid < 0 || pid >= (int) now._nr_pr)",
2284*de2caf28SDavid du Colombier 	"	{",
2285*de2caf28SDavid du Colombier 	"	#ifdef VERBOSE",
2286*de2caf28SDavid du Colombier 	"		printf(\"warning: bad pid %%d, no such process (set_priority)\\n\", pid);",
2287*de2caf28SDavid du Colombier 	"	#endif",
2288*de2caf28SDavid du Colombier 	"		return 1;",
2289*de2caf28SDavid du Colombier 	"	}",
2290*de2caf28SDavid du Colombier 	"	if (pr < 1 || pr > 255)",
2291*de2caf28SDavid du Colombier 	"	{	Uerror(\"priority is out of range\");",
2292*de2caf28SDavid du Colombier 	"	}",
2293*de2caf28SDavid du Colombier 
2294*de2caf28SDavid du Colombier 	"	if (!TstOnly)",
2295*de2caf28SDavid du Colombier 	"	{	(trpt+1)->o_priority = ",
2296*de2caf28SDavid du Colombier 	"		(((P0 *)pptr(pid))->_priority & 255) | (pid << 8);",
2297*de2caf28SDavid du Colombier 	"		((P0 *)pptr(pid))->_priority = pr;",
2298*de2caf28SDavid du Colombier 	"	}",
2299*de2caf28SDavid du Colombier 
2300*de2caf28SDavid du Colombier 	"	return 1;", /* always executable */
2301*de2caf28SDavid du Colombier 	"}",
2302*de2caf28SDavid du Colombier 	"#endif",
2303*de2caf28SDavid du Colombier 	"",
23047dd7cddfSDavid du Colombier 	"void",
230500d97012SDavid du Colombier 	"snap_time(void)",
230600d97012SDavid du Colombier 	"{	clock_t stop_time;",
230700d97012SDavid du Colombier 	"	double delta_time;",
230800d97012SDavid du Colombier 	"#if !defined(WIN32) && !defined(WIN64)",
230900d97012SDavid du Colombier 	"	struct tms stop_tm;",
231000d97012SDavid du Colombier 	"	stop_time  = times(&stop_tm);",
231100d97012SDavid du Colombier 	"	delta_time = ((double) (stop_time - start_time)) / ((double) sysconf(_SC_CLK_TCK));",
231200d97012SDavid du Colombier 	"#else",
231300d97012SDavid du Colombier 	"	stop_time  = clock();",
231400d97012SDavid du Colombier 	"	delta_time = ((double) (stop_time - start_time)) / ((double) CLOCKS_PER_SEC);",
231500d97012SDavid du Colombier 	"#endif",
231600d97012SDavid du Colombier 	"	if (delta_time > 0.01)",
231700d97012SDavid du Colombier 	"	{	printf(\"t= %%8.3g \", delta_time);",
231800d97012SDavid du Colombier 	"		printf(\"R= %%7.0g\", nstates/delta_time);",
231900d97012SDavid du Colombier 	"	}",
232000d97012SDavid du Colombier 	"	printf(\"\\n\");",
232100d97012SDavid du Colombier 	"	if (quota > 0.1 && delta_time > quota)",
232200d97012SDavid du Colombier 	"	{	printf(\"Time limit of %%6.3g minutes exceeded\\n\", quota/60.0);",
232300d97012SDavid du Colombier 	"#if NCORE>1",
232400d97012SDavid du Colombier 	"		fflush(stdout);",
232500d97012SDavid du Colombier 	"		leave_critical(GLOBAL_LOCK);",
232600d97012SDavid du Colombier 	"		sudden_stop(\"time-limit\");",
232700d97012SDavid du Colombier 	"		exit(1);",
232800d97012SDavid du Colombier 	"#endif",
232900d97012SDavid du Colombier 	"		wrapup();",
233000d97012SDavid du Colombier 	"	}",
233100d97012SDavid du Colombier 	"}",
233200d97012SDavid du Colombier 	"void",
23337dd7cddfSDavid du Colombier 	"snapshot(void)",
233400d97012SDavid du Colombier 	"{",
2335*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
2336*de2caf28SDavid du Colombier 	"	e_critical(BFS_GLOB);		/* bfs_par / snapshot */",
2337*de2caf28SDavid du Colombier 	"	printf(\"cpu%%d: \", who_am_i);",
2338*de2caf28SDavid du Colombier 	"#endif",
233900d97012SDavid du Colombier 	"#if NCORE>1",
2340*de2caf28SDavid du Colombier 	"	enter_critical(GLOBAL_LOCK);	/* ncore / snapshot */",
234100d97012SDavid du Colombier 	"	printf(\"cpu%%d: \", core_id);",
234200d97012SDavid du Colombier 	"#endif",
234300d97012SDavid du Colombier 	"	printf(\"Depth= %%7ld States= %%8.3g \",",
234400d97012SDavid du Colombier 	"#if NCORE>1",
234500d97012SDavid du Colombier 	"		(long) (nr_handoffs * z_handoff) +",
234600d97012SDavid du Colombier 	"#endif",
234700d97012SDavid du Colombier 	"		mreached, nstates);",
234800d97012SDavid du Colombier 	"	printf(\"Transitions= %%8.3g \", nstates+truncs);",
23497dd7cddfSDavid du Colombier 	"#ifdef MA",
2350*de2caf28SDavid du Colombier 	"	printf(\"Nodes= %%7lu \", nr_states);",
23517dd7cddfSDavid du Colombier 	"#endif",
235200d97012SDavid du Colombier 	"	printf(\"Memory= %%9.3f\\t\", memcnt/1048576.);",
235300d97012SDavid du Colombier 	"	snap_time();",
23547dd7cddfSDavid du Colombier 	"	fflush(stdout);",
235500d97012SDavid du Colombier 	"#if NCORE>1",
235600d97012SDavid du Colombier 	"	leave_critical(GLOBAL_LOCK);",
235700d97012SDavid du Colombier 	"#endif",
2358*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
2359*de2caf28SDavid du Colombier 	"	x_critical(BFS_GLOB);",
2360*de2caf28SDavid du Colombier 	"#endif",
23617dd7cddfSDavid du Colombier 	"}",
23627dd7cddfSDavid du Colombier 	"#ifdef SC",
23637dd7cddfSDavid du Colombier 	"void",
23647dd7cddfSDavid du Colombier 	"stack2disk(void)",
23657dd7cddfSDavid du Colombier 	"{",
23667dd7cddfSDavid du Colombier 	"	if (!stackwrite",
2367f3793cddSDavid du Colombier 	"	&&  (stackwrite = creat(stackfile, TMODE)) < 0)",
23687dd7cddfSDavid du Colombier 	"		Uerror(\"cannot create stackfile\");",
23697dd7cddfSDavid du Colombier 	"",
23707dd7cddfSDavid du Colombier 	"	if (write(stackwrite, trail, DDD*sizeof(Trail))",
23717dd7cddfSDavid du Colombier 	"	!=  DDD*sizeof(Trail))",
23727dd7cddfSDavid du Colombier 	"		Uerror(\"stackfile write error -- disk is full?\");",
23737dd7cddfSDavid du Colombier 	"",
23747dd7cddfSDavid du Colombier 	"	memmove(trail, &trail[DDD], (HHH-DDD+2)*sizeof(Trail));",
23757dd7cddfSDavid du Colombier 	"	memset(&trail[HHH-DDD+2], 0, (omaxdepth - HHH + DDD - 2)*sizeof(Trail));",
23767dd7cddfSDavid du Colombier 	"	CNT1++;",
23777dd7cddfSDavid du Colombier 	"}",
23787dd7cddfSDavid du Colombier 	"void",
23797dd7cddfSDavid du Colombier 	"disk2stack(void)",
23807dd7cddfSDavid du Colombier 	"{	long have;",
23817dd7cddfSDavid du Colombier 	"",
23827dd7cddfSDavid du Colombier 	"	CNT2++;",
23837dd7cddfSDavid du Colombier 	"	memmove(&trail[DDD], trail, (HHH-DDD+2)*sizeof(Trail));",
23847dd7cddfSDavid du Colombier 	"",
23857dd7cddfSDavid du Colombier 	"	if (!stackwrite",
2386312a1df1SDavid du Colombier 	"	||  lseek(stackwrite, -DDD* (off_t) sizeof(Trail), SEEK_CUR) == -1)",
23877dd7cddfSDavid du Colombier 	"		Uerror(\"disk2stack lseek error\");",
23887dd7cddfSDavid du Colombier 	"",
23897dd7cddfSDavid du Colombier 	"	if (!stackread",
23907dd7cddfSDavid du Colombier 	"	&&  (stackread = open(stackfile, 0)) < 0)",
23917dd7cddfSDavid du Colombier 	"		Uerror(\"cannot open stackfile\");",
23927dd7cddfSDavid du Colombier 	"",
2393312a1df1SDavid du Colombier 	"	if (lseek(stackread, (CNT1-CNT2)*DDD* (off_t) sizeof(Trail), SEEK_SET) == -1)",
2394312a1df1SDavid du Colombier 	"		Uerror(\"disk2stack lseek error\");",
23957dd7cddfSDavid du Colombier 	"",
23967dd7cddfSDavid du Colombier 	"	have = read(stackread, trail, DDD*sizeof(Trail));",
23977dd7cddfSDavid du Colombier 	"	if (have !=  DDD*sizeof(Trail))",
23987dd7cddfSDavid du Colombier 	"		Uerror(\"stackfile read error\");",
23997dd7cddfSDavid du Colombier 	"}",
24007dd7cddfSDavid du Colombier 	"#endif",
24017dd7cddfSDavid du Colombier 
24027dd7cddfSDavid du Colombier 	"uchar *",
240300d97012SDavid du Colombier 	"Pptr(int x)",
240400d97012SDavid du Colombier 	"{	if (x < 0 || x >= MAXPROC",	/* does not exist */
240500d97012SDavid du Colombier 	"#ifdef TRIX",
240600d97012SDavid du Colombier 	"	|| !processes[x])",
240700d97012SDavid du Colombier 	"#else",
240800d97012SDavid du Colombier 	"	|| !proc_offset[x])",
240900d97012SDavid du Colombier 	"#endif",
24107dd7cddfSDavid du Colombier 	"		return noptr;",
2411312a1df1SDavid du Colombier 	"	else",
2412312a1df1SDavid du Colombier 	"		return (uchar *) pptr(x);",
241300d97012SDavid du Colombier 	"}\n",
241400d97012SDavid du Colombier 	"uchar *",
241500d97012SDavid du Colombier 	"Qptr(int x)",
241600d97012SDavid du Colombier 	"{	if (x < 0 || x >= MAXQ",
241700d97012SDavid du Colombier 	"#ifdef TRIX",
241800d97012SDavid du Colombier 	"	|| !channels[x])",
241900d97012SDavid du Colombier 	"#else",
242000d97012SDavid du Colombier 	"	|| !q_offset[x])",
242100d97012SDavid du Colombier 	"#endif",
242200d97012SDavid du Colombier 	"		return noqptr;",
242300d97012SDavid du Colombier 	"	else",
242400d97012SDavid du Colombier 	"		return (uchar *) qptr(x);",
242500d97012SDavid du Colombier 	"}\n",
2426*de2caf28SDavid du Colombier 	"",
2427*de2caf28SDavid du Colombier 	"#if NCLAIMS>1",
2428*de2caf28SDavid du Colombier 	"void",
2429*de2caf28SDavid du Colombier 	"select_claim(int n)",
2430*de2caf28SDavid du Colombier 	"{	int m, i;",
2431*de2caf28SDavid du Colombier 	"	if (n < 0 || n >= NCLAIMS)",
2432*de2caf28SDavid du Colombier 	"	{	uerror(\"non-existing claim\");",
2433*de2caf28SDavid du Colombier 	"	} else",
2434*de2caf28SDavid du Colombier 	"	{	m = ((Pclaim *)pptr(0))->_n;",
2435*de2caf28SDavid du Colombier 	"		if (verbose)",
2436*de2caf28SDavid du Colombier 	"		{	printf(\"%%d: Claim %%s (%%d), from state %%d\\n\",",
2437*de2caf28SDavid du Colombier 	"				(int) depth, procname[spin_c_typ[n]],",
2438*de2caf28SDavid du Colombier 	"				n, ((Pclaim *)pptr(0))->c_cur[n]);",
2439*de2caf28SDavid du Colombier 	"		} else",
2440*de2caf28SDavid du Colombier 	"		{	printf(\"pan: ltl formula %%s\\n\",",
2441*de2caf28SDavid du Colombier 	"				procname[spin_c_typ[n]]);",
2442*de2caf28SDavid du Colombier 	"		}",
2443*de2caf28SDavid du Colombier 	"		((Pclaim *)pptr(0))->c_cur[m] = ((Pclaim *)pptr(0))->_p;",
2444*de2caf28SDavid du Colombier 	"		((Pclaim *)pptr(0))->_t = spin_c_typ[n];",
2445*de2caf28SDavid du Colombier 	"		((Pclaim *)pptr(0))->_p = ((Pclaim *)pptr(0))->c_cur[n];",
2446*de2caf28SDavid du Colombier 	"		((Pclaim *)pptr(0))->_n = n;",
2447*de2caf28SDavid du Colombier 	"		for (i = 0; src_all[i].src != (short *) 0; i++)",
2448*de2caf28SDavid du Colombier 	"		{	if (src_all[i].tp == spin_c_typ[n])",
2449*de2caf28SDavid du Colombier 	"			{	src_claim = src_all[i].src;",
2450*de2caf28SDavid du Colombier 	"				break;",
2451*de2caf28SDavid du Colombier 	"		}	}",
2452*de2caf28SDavid du Colombier 	"		if (src_all[i].src == (short *) 0)",
2453*de2caf28SDavid du Colombier 	"		{	uerror(\"cannot happen: src_ln ref\");",
2454*de2caf28SDavid du Colombier 	"	}	}",
2455*de2caf28SDavid du Colombier 	"}",
2456*de2caf28SDavid du Colombier 	"#else",
2457*de2caf28SDavid du Colombier 	"void",
2458*de2caf28SDavid du Colombier 	"select_claim(int n)",
2459*de2caf28SDavid du Colombier 	"{	if (n != 0) uerror(\"non-existing claim\");",
2460*de2caf28SDavid du Colombier 	"}",
2461*de2caf28SDavid du Colombier 	"#endif",
24627dd7cddfSDavid du Colombier 
246300d97012SDavid du Colombier 	"int qs_empty(void);",
246400d97012SDavid du Colombier 	"#if !defined(BFS) && (!defined(BITSTATE) || !defined(MA))",
246500d97012SDavid du Colombier 	"#ifdef NSUCC",
246600d97012SDavid du Colombier 	"int N_succ[512];",
246700d97012SDavid du Colombier 	"void",
246800d97012SDavid du Colombier 	"tally_succ(int cnt)",
246900d97012SDavid du Colombier 	"{	if (cnt < 512) N_succ[cnt]++;",
247000d97012SDavid du Colombier 	"	else printf(\"tally_succ: cnt %%d exceeds range\\n\", cnt);",
247100d97012SDavid du Colombier 	"}",
247200d97012SDavid du Colombier 	"",
247300d97012SDavid du Colombier 	"void",
247400d97012SDavid du Colombier 	"dump_succ(void)",
247500d97012SDavid du Colombier 	"{	int i; double sum = 0.0;",
247600d97012SDavid du Colombier 	"	double w_avg = 0.0;",
247700d97012SDavid du Colombier 	"	printf(\"Successor counts:\\n\");",
247800d97012SDavid du Colombier 	"	for (i = 0; i < 512; i++)",
247900d97012SDavid du Colombier 	"	{	sum += (double) N_succ[i];",
248000d97012SDavid du Colombier 	"	}",
248100d97012SDavid du Colombier 	"	for (i = 0; i < 512; i++)",
248200d97012SDavid du Colombier 	"	{	if (N_succ[i] > 0)",
248300d97012SDavid du Colombier 	"		{	printf(\"%%3d\t%%10d\t(%%.4g %%%% of total)\\n\",",
248400d97012SDavid du Colombier 	"				i, N_succ[i], (100.0 * (double) N_succ[i])/sum);",
248500d97012SDavid du Colombier 	"			w_avg += (double) i * (double) N_succ[i];",
248600d97012SDavid du Colombier 	"	}	}",
248700d97012SDavid du Colombier 	"	if (sum > N_succ[0])",
248800d97012SDavid du Colombier 	"	printf(\"mean %%.4g (without 0: %%.4g)\\n\", w_avg / sum, w_avg / (sum - (double) N_succ[0]));",
248900d97012SDavid du Colombier 	"}",
249000d97012SDavid du Colombier 	"#endif",
249100d97012SDavid du Colombier 	"",
2492*de2caf28SDavid du Colombier 	"#ifdef P_REVERSE",
249300d97012SDavid du Colombier 	"	#define FROM_P	(BASE)",
249400d97012SDavid du Colombier 	"	#define UPTO_P	(now._nr_pr-1)",
249500d97012SDavid du Colombier 	"	#define MORE_P	(II <= To)",		/* p.o. only */
249600d97012SDavid du Colombier 	"	#define INI_P	(From-1)",		/* fairness only */
2497*de2caf28SDavid du Colombier 	"	#define CNT_P	(1 + (To - From))",	/* P_RAND start */
2498*de2caf28SDavid du Colombier 	"	#define NDONE_P	(From <= To)",		/* P_RAND continue */
249900d97012SDavid du Colombier 	"	#define ALL_P	(II = From; II <= To; II++)",
250000d97012SDavid du Colombier 	"#else",
250100d97012SDavid du Colombier 	"	#define FROM_P	(now._nr_pr-1)",
250200d97012SDavid du Colombier 	"	#define UPTO_P	(BASE)",
250300d97012SDavid du Colombier 	"	#define MORE_P	(II >= BASE)",
250400d97012SDavid du Colombier 	"	#define INI_P	(From+1)",
2505*de2caf28SDavid du Colombier 	"	#define CNT_P	(1 + (From - To))",
2506*de2caf28SDavid du Colombier 	"	#define NDONE_P	(From >= To)",
250700d97012SDavid du Colombier 	"	#define ALL_P	(II = From; II >= To; II--)",
250800d97012SDavid du Colombier 	"#endif",
2509*de2caf28SDavid du Colombier 	"",
2510*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
2511*de2caf28SDavid du Colombier 	"	#define CONTINUE0 { if (reversing&2) { II = oII; } continue; }",
2512*de2caf28SDavid du Colombier 	"	#define CONTINUE  { if (reversing&2) { p_reorder(seed); II = oII; } continue; }",
2513*de2caf28SDavid du Colombier 	"#else",
2514*de2caf28SDavid du Colombier 	"	#define CONTINUE0 { continue; }",
2515*de2caf28SDavid du Colombier 	"	#define CONTINUE  { continue; }",
2516*de2caf28SDavid du Colombier 	"#endif",
2517*de2caf28SDavid du Colombier 
2518*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
2519*de2caf28SDavid du Colombier 	"uchar _permutation_[256];",
2520*de2caf28SDavid du Colombier 	"void",
2521*de2caf28SDavid du Colombier 	"set_reversed(int unused)",
2522*de2caf28SDavid du Colombier 	"{	int i, n = now._nr_pr;",
2523*de2caf28SDavid du Colombier 	"  #ifdef VERBOSE",
2524*de2caf28SDavid du Colombier 	"	printf(\"%%ld: Set_reversed\\n\", depth);",
2525*de2caf28SDavid du Colombier 	"  #endif",
2526*de2caf28SDavid du Colombier 	"  #if defined(VERI) && !defined(NOCLAIM)",
2527*de2caf28SDavid du Colombier 	"	for (i = 1; i < n; i++)",
2528*de2caf28SDavid du Colombier 	"	{	_permutation_[i] = n-i;",
2529*de2caf28SDavid du Colombier 	"	}",
2530*de2caf28SDavid du Colombier 	"  #else",
2531*de2caf28SDavid du Colombier 	"	for (i = 0; i < n; i++)",
2532*de2caf28SDavid du Colombier 	"	{	_permutation_[i] = n-1-i;",
2533*de2caf28SDavid du Colombier 	"	}",
2534*de2caf28SDavid du Colombier 	"  #endif",
2535*de2caf28SDavid du Colombier 	"}",
2536*de2caf28SDavid du Colombier 	"void",
2537*de2caf28SDavid du Colombier 	"set_rotated(int unused)",
2538*de2caf28SDavid du Colombier 	"{	int i, n = now._nr_pr;",
2539*de2caf28SDavid du Colombier 	"  #ifdef VERBOSE",
2540*de2caf28SDavid du Colombier 	"	printf(\"%%ld: Set_rotated %%d\\n\", depth, p_rotate);",
2541*de2caf28SDavid du Colombier 	"  #endif",
2542*de2caf28SDavid du Colombier 	"  #if defined(VERI) && !defined(NOCLAIM)",
2543*de2caf28SDavid du Colombier 	"	for (i = 1; i < n; i++)",
2544*de2caf28SDavid du Colombier 	"	{	_permutation_[i] = 1+(i-1+p_rotate)%%(n-1);",
2545*de2caf28SDavid du Colombier 	"	}",
2546*de2caf28SDavid du Colombier 	"  #else",
2547*de2caf28SDavid du Colombier 	"	for (i = 0; i < n; i++)",
2548*de2caf28SDavid du Colombier 	"	{	_permutation_[i] = (i+p_rotate)%%n;",
2549*de2caf28SDavid du Colombier 	"	}",
2550*de2caf28SDavid du Colombier 	"  #endif",
2551*de2caf28SDavid du Colombier 	"}",
2552*de2caf28SDavid du Colombier 	"void",
2553*de2caf28SDavid du Colombier 	"set_randrot(int unused)",
2554*de2caf28SDavid du Colombier 	"{",
2555*de2caf28SDavid du Colombier 	"	if (now._nr_pr > 1)",
2556*de2caf28SDavid du Colombier 	"	{	p_rotate = 1+rand()%%(now._nr_pr-1);",
2557*de2caf28SDavid du Colombier 	"	} else",
2558*de2caf28SDavid du Colombier 	"	{	p_rotate = 0;",
2559*de2caf28SDavid du Colombier 	"	}",
2560*de2caf28SDavid du Colombier 	"	set_rotated(0);",
2561*de2caf28SDavid du Colombier 	"}",
2562*de2caf28SDavid du Colombier 	"void",
2563*de2caf28SDavid du Colombier 	"set_permuted(int T)",
2564*de2caf28SDavid du Colombier 	"{	/* permute nrs 1..n-1, leave 0 in place */",
2565*de2caf28SDavid du Colombier 	"	int i, j, k, n = now._nr_pr;",
2566*de2caf28SDavid du Colombier 	"	char tmp, *in = &(_permutation_[0]);",
2567*de2caf28SDavid du Colombier 	"  #ifdef VERBOSE",
2568*de2caf28SDavid du Colombier 	"	printf(\"%%ld: Set_permuted %%d\\n\", depth, T);",
2569*de2caf28SDavid du Colombier 	"  #endif",
2570*de2caf28SDavid du Colombier 	"	srand(T);",	/* set_permuted */
2571*de2caf28SDavid du Colombier 	"	for (i = 0; i < n; i++)",
2572*de2caf28SDavid du Colombier 	"	{	in[i] = i;",
2573*de2caf28SDavid du Colombier 	"	}",
2574*de2caf28SDavid du Colombier 	"	if (n > 1)",
2575*de2caf28SDavid du Colombier 	"	{  for (i = 0; i < n; i++)",
2576*de2caf28SDavid du Colombier 	"	   {",
2577*de2caf28SDavid du Colombier 	"  #if defined(VERI) && !defined(NOCLAIM)",
2578*de2caf28SDavid du Colombier 	"		j = 1 + rand()%%(n-1);",
2579*de2caf28SDavid du Colombier 	"		k = 1 + rand()%%(n-1);",
2580*de2caf28SDavid du Colombier 	"  #else",
2581*de2caf28SDavid du Colombier 	"		j = rand()%%(n);",
2582*de2caf28SDavid du Colombier 	"		k = rand()%%(n);",
2583*de2caf28SDavid du Colombier 	"  #endif",
2584*de2caf28SDavid du Colombier 	"		tmp   = in[j];",
2585*de2caf28SDavid du Colombier 	"		in[j] = in[k];",
2586*de2caf28SDavid du Colombier 	"		in[k] = tmp;",
2587*de2caf28SDavid du Colombier 	"	}  }",
2588*de2caf28SDavid du Colombier 	"}",
2589*de2caf28SDavid du Colombier 	"",
2590*de2caf28SDavid du Colombier 	"  #ifdef VERBOSE",
2591*de2caf28SDavid du Colombier 	"	short",
2592*de2caf28SDavid du Colombier 	"	get_permuted(int x)",
2593*de2caf28SDavid du Colombier 	"	{	printf(\"%%ld: Get_permuted %%d -> %%d\\n\",",
2594*de2caf28SDavid du Colombier 	"			depth, x, _permutation_[x]);",
2595*de2caf28SDavid du Colombier 	"		return (short) _permutation_[x];",
2596*de2caf28SDavid du Colombier 	"	}",
2597*de2caf28SDavid du Colombier 	"  #else",
2598*de2caf28SDavid du Colombier 	"	#define get_permuted(x)  (short) _permutation_[x]",
2599*de2caf28SDavid du Colombier 	"  #endif",
2600*de2caf28SDavid du Colombier 	"",
2601*de2caf28SDavid du Colombier 	"#endif",
2602312a1df1SDavid du Colombier 	"/*",
2603312a1df1SDavid du Colombier 	" * new_state() is the main DFS search routine in the verifier",
26047dd7cddfSDavid du Colombier 	" * it has a lot of code ifdef-ed together to support",
2605312a1df1SDavid du Colombier 	" * different search modes, which makes it quite unreadable.",
260600d97012SDavid du Colombier 	" * if you are studying the code, use the C preprocessor",
2607312a1df1SDavid du Colombier 	" * to generate a specific version from the pan.c source,",
2608312a1df1SDavid du Colombier 	" * e.g. by saying:",
2609312a1df1SDavid du Colombier 	" *	gcc -E -DNOREDUCE -DBITSTATE pan.c > ppan.c",
261000d97012SDavid du Colombier 	" * and then study the resulting file, instead of this version",
26117dd7cddfSDavid du Colombier 	" */",
261200d97012SDavid du Colombier 	"",
2613219b2ee8SDavid du Colombier 	"void",
2614219b2ee8SDavid du Colombier 	"new_state(void)",
26157dd7cddfSDavid du Colombier 	"{	Trans *t;",
2616312a1df1SDavid du Colombier 	"	uchar _n, _m, ot;",
261700d97012SDavid du Colombier 	"#ifdef T_RAND",
2618312a1df1SDavid du Colombier 	"	short ooi, eoi;",
2619312a1df1SDavid du Colombier 	"#endif",
2620*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
2621*de2caf28SDavid du Colombier 	"	short oII; uint seed;",
2622*de2caf28SDavid du Colombier 	"#endif",
2623312a1df1SDavid du Colombier 	"#ifdef M_LOSS",
2624312a1df1SDavid du Colombier 	"	uchar delta_m = 0;",
2625312a1df1SDavid du Colombier 	"#endif",
2626312a1df1SDavid du Colombier 	"	short II, JJ = 0, kk;",
2627312a1df1SDavid du Colombier 	"	int tt;",
262800d97012SDavid du Colombier 	"	short From = FROM_P, To = UPTO_P;",
262900d97012SDavid du Colombier 	"#ifdef BCS",
263000d97012SDavid du Colombier 	"	trpt->sched_limit = 0; /* at depth=0 only */",
263100d97012SDavid du Colombier 	"#endif",
2632219b2ee8SDavid du Colombier 	"Down:",
2633219b2ee8SDavid du Colombier 	"#ifdef CHECK",
263400d97012SDavid du Colombier 	"	cpu_printf(\"%%d: Down - %%s %%saccepting [pids %%d-%%d]\\n\",",
263500d97012SDavid du Colombier 	"		depth, (trpt->tau&4)?\"claim\":\"program\",",
2636219b2ee8SDavid du Colombier 	"		(trpt->o_pm&2)?\"\":\"non-\", From, To);",
2637219b2ee8SDavid du Colombier 	"#endif",
26387dd7cddfSDavid du Colombier 
263900d97012SDavid du Colombier 	"#ifdef P_RAND",
264000d97012SDavid du Colombier 	"	trpt->p_skip = -1;",
264100d97012SDavid du Colombier 	"#endif",
264200d97012SDavid du Colombier 
26437dd7cddfSDavid du Colombier 	"#ifdef SC",
26447dd7cddfSDavid du Colombier 	"	if (depth > hiwater)",
26457dd7cddfSDavid du Colombier 	"	{	stack2disk();",
26467dd7cddfSDavid du Colombier 	"		maxdepth += DDD;",
26477dd7cddfSDavid du Colombier 	"		hiwater += DDD;",
26487dd7cddfSDavid du Colombier 	"		trpt -= DDD;",
26497dd7cddfSDavid du Colombier 	"		if(verbose)",
2650*de2caf28SDavid du Colombier 	"		printf(\"zap %%ld: %%ld (maxdepth now %%ld)\\n\",",
2651312a1df1SDavid du Colombier 	"			CNT1, hiwater, maxdepth);",
2652219b2ee8SDavid du Colombier 	"	}",
2653219b2ee8SDavid du Colombier 	"#endif",
26547dd7cddfSDavid du Colombier 
26557dd7cddfSDavid du Colombier 	"	trpt->tau &= ~(16|32|64); /* make sure these are off */",
26567dd7cddfSDavid du Colombier 	"#if defined(FULLSTACK) && defined(MA)",
26577dd7cddfSDavid du Colombier 	"	trpt->proviso = 0;",
26587dd7cddfSDavid du Colombier 	"#endif",
265900d97012SDavid du Colombier 	"#ifdef NSUCC",
266000d97012SDavid du Colombier 	"	trpt->n_succ = 0;",
2661219b2ee8SDavid du Colombier 	"#endif",
266200d97012SDavid du Colombier 	"#if NCORE>1",
266300d97012SDavid du Colombier 	"	if (mem_hand_off())",
266400d97012SDavid du Colombier 	"	{",
266500d97012SDavid du Colombier 	"#if SYNC",
266600d97012SDavid du Colombier 	"		(trpt+1)->o_n = 1;	/* not a deadlock: as below  */",
266700d97012SDavid du Colombier 	"#endif",
266800d97012SDavid du Colombier 	"#ifndef LOOPSTATE",
266900d97012SDavid du Colombier 	"		(trpt-1)->tau |= 16;	/* worstcase guess: as below */",
267000d97012SDavid du Colombier 	"#endif",
267100d97012SDavid du Colombier 	"#if NCORE>1 && defined(FULL_TRAIL)",
267200d97012SDavid du Colombier 	"		if (upto > 0)",
267300d97012SDavid du Colombier 	"		{	Pop_Stack_Tree();",
267400d97012SDavid du Colombier 	"		}",
267500d97012SDavid du Colombier 	"#endif",
267600d97012SDavid du Colombier 	"		goto Up;",
267700d97012SDavid du Colombier 	"	}",
267800d97012SDavid du Colombier 	"#endif",
267900d97012SDavid du Colombier 
268000d97012SDavid du Colombier 	"	if (depth >= maxdepth)",
268100d97012SDavid du Colombier 	"	{	if (!warned)",
2682219b2ee8SDavid du Colombier 	"		{ warned = 1;",
2683219b2ee8SDavid du Colombier 	"		  printf(\"error: max search depth too small\\n\");",
2684219b2ee8SDavid du Colombier 	"		}",
268500d97012SDavid du Colombier 	"		if (bounded)",
268600d97012SDavid du Colombier 	"		{	uerror(\"depth limit reached\");",
268700d97012SDavid du Colombier 	"		}",
268800d97012SDavid du Colombier 	"		truncs++;",
268900d97012SDavid du Colombier 	"#if SYNC",
269000d97012SDavid du Colombier 	"		(trpt+1)->o_n = 1; /* not a deadlock */",
269100d97012SDavid du Colombier 	"#endif",
269200d97012SDavid du Colombier 	"#ifndef LOOPSTATE",
2693219b2ee8SDavid du Colombier 	"		(trpt-1)->tau |= 16;	/* worstcase guess */",
269400d97012SDavid du Colombier 	"#endif",
269500d97012SDavid du Colombier 
269600d97012SDavid du Colombier 	"#if NCORE>1 && defined(FULL_TRAIL)",
269700d97012SDavid du Colombier 	"		if (upto > 0)",
269800d97012SDavid du Colombier 	"		{	Pop_Stack_Tree();",
269900d97012SDavid du Colombier 	"		}",
270000d97012SDavid du Colombier 	"#endif",
2701219b2ee8SDavid du Colombier 	"		goto Up;",
2702219b2ee8SDavid du Colombier 	"	}",
27037dd7cddfSDavid du Colombier 	"AllOver:",
270400d97012SDavid du Colombier 	"#if (defined(FULLSTACK) && !defined(MA)) || NCORE>1",
2705f3793cddSDavid du Colombier 	"	/* if atomic or rv move, carry forward previous state */",
270600d97012SDavid du Colombier 	"	trpt->ostate = (trpt-1)->ostate;",
2707219b2ee8SDavid du Colombier 	"#endif",
2708219b2ee8SDavid du Colombier 	"#ifdef VERI",
2709219b2ee8SDavid du Colombier 	"	if ((trpt->tau&4) || ((trpt-1)->tau&128))",
2710219b2ee8SDavid du Colombier 	"#endif",
27117dd7cddfSDavid du Colombier 	"	if (boq == -1) {	/* if not mid-rv */",
27127dd7cddfSDavid du Colombier 	"#ifndef SAFETY",
2713*de2caf28SDavid du Colombier #if 0
2714*de2caf28SDavid du Colombier 	we want to skip nrpr, nrqs, _a_t and cnt[NFAIR] (in the case of fairness)
2715*de2caf28SDavid du Colombier 	this is calculated in S_A, but S_A subtracts 2 bytes,
2716*de2caf28SDavid du Colombier 	because nrpr and nrqs are masked in the default state comparisons
2717*de2caf28SDavid du Colombier 	so we add those two bytes back here
2718*de2caf28SDavid du Colombier 	-- in default comparisons (h_store) we skip _a_t and cnt in the
2719*de2caf28SDavid du Colombier 	-- first comparison to find a match on the base-state
2720*de2caf28SDavid du Colombier 	-- the _a_t and cnt fields are then separately updated if there was
2721*de2caf28SDavid du Colombier 	-- a match on the base state
2722*de2caf28SDavid du Colombier #endif
2723219b2ee8SDavid du Colombier 	"		if ((now._a_t&1) && depth > A_depth)",
2724*de2caf28SDavid du Colombier 	"		{	int delta = S_A + 2;",
2725*de2caf28SDavid du Colombier 	"			if (!memcmp((char *)&A_Root + delta, ",
2726*de2caf28SDavid du Colombier 	"				(char *)&now + delta, vsize - delta))",
2727219b2ee8SDavid du Colombier 	"			{",
2728*de2caf28SDavid du Colombier 	"#ifndef NOFAIR",
2729*de2caf28SDavid du Colombier 	"			   if (fairness && now._cnt[1] != 1) /* was > 1 */",
2730*de2caf28SDavid du Colombier 	"			   {",
2731*de2caf28SDavid du Colombier 	"	#ifdef CHECK",
2732*de2caf28SDavid du Colombier 	"				printf(\"\tfairness count non-zero\\n\");",
2733*de2caf28SDavid du Colombier 	"	#endif",
2734*de2caf28SDavid du Colombier 	"				/* treat as new state */",
2735*de2caf28SDavid du Colombier 	"			   } else",
2736*de2caf28SDavid du Colombier 	"#endif",
2737*de2caf28SDavid du Colombier 	"			   {	depthfound = A_depth;",
2738219b2ee8SDavid du Colombier 	"	#ifdef CHECK",
2739219b2ee8SDavid du Colombier 	"				printf(\"matches seed\\n\");",
2740219b2ee8SDavid du Colombier 	"	#endif",
27417dd7cddfSDavid du Colombier 	"	#ifdef NP",
2742219b2ee8SDavid du Colombier 	"				uerror(\"non-progress cycle\");",
27437dd7cddfSDavid du Colombier 	"	#else",
27447dd7cddfSDavid du Colombier 	"				uerror(\"acceptance cycle\");",
27457dd7cddfSDavid du Colombier 	"	#endif",
274600d97012SDavid du Colombier 	"	#if NCORE>1 && defined(FULL_TRAIL)",
274700d97012SDavid du Colombier 	"				if (upto > 0)",
274800d97012SDavid du Colombier 	"				{	Pop_Stack_Tree();",
274900d97012SDavid du Colombier 	"				}",
275000d97012SDavid du Colombier 	"	#endif",
2751219b2ee8SDavid du Colombier 	"				goto Up;",
2752*de2caf28SDavid du Colombier 	"			}  }",
2753219b2ee8SDavid du Colombier 	"	#ifdef CHECK",
2754*de2caf28SDavid du Colombier 	"			else",
2755*de2caf28SDavid du Colombier 	"			{",
2756219b2ee8SDavid du Colombier 	"			   printf(\"not seed\\n\");",
2757*de2caf28SDavid du Colombier 	"			}",
2758219b2ee8SDavid du Colombier 	"	#endif",
2759219b2ee8SDavid du Colombier 	"		}",
27607dd7cddfSDavid du Colombier 	"#endif",
2761219b2ee8SDavid du Colombier 	"		if (!(trpt->tau&8)) /* if no atomic move */",
2762219b2ee8SDavid du Colombier 	"		{",
276300d97012SDavid du Colombier 	"#if defined(BCS) && defined(NO_LAST) && defined(HAS_LAST)",
276400d97012SDavid du Colombier 	"			uchar was_last = now._last;",
276500d97012SDavid du Colombier 	"			now._last = 0;	/* value not stored */",
276600d97012SDavid du Colombier 	"#endif",
2767312a1df1SDavid du Colombier 	"#ifdef BITSTATE",
27687dd7cddfSDavid du Colombier 		"#ifdef CNTRSTACK",	/* -> bitstate, reduced, safety */
276900d97012SDavid du Colombier 	"		#if defined(BCS) && defined(STORE_CTX)",
277000d97012SDavid du Colombier 	"		{ int xj;",
277100d97012SDavid du Colombier 	"			for (xj = trpt->sched_limit; xj <= sched_max; xj++)",
277200d97012SDavid du Colombier 	"			{	now._ctx = xj;",
2773*de2caf28SDavid du Colombier 	"				II = b_store((char *)&now, vsize);",
2774*de2caf28SDavid du Colombier 	"				trpt->j6 = j1_spin; trpt->j7 = j2_spin;",
2775*de2caf28SDavid du Colombier 	"				JJ = LL[j1_spin] && LL[j2_spin];",
277600d97012SDavid du Colombier 	"				if (II != 0) { break; }",
277700d97012SDavid du Colombier 	"			}",
277800d97012SDavid du Colombier 	"			now._ctx = 0; /* just in case */",
277900d97012SDavid du Colombier 	"		}",
2780312a1df1SDavid du Colombier 	"		#else",
2781*de2caf28SDavid du Colombier 	"			II = b_store((char *)&now, vsize);",
2782*de2caf28SDavid du Colombier 	"			trpt->j6 = j1_spin; trpt->j7 = j2_spin;",
2783*de2caf28SDavid du Colombier 	"			JJ = LL[j1_spin] && LL[j2_spin];",
278400d97012SDavid du Colombier 	"		#endif",
2785312a1df1SDavid du Colombier 		"#else",
2786*de2caf28SDavid du Colombier 	"		#ifdef FULLSTACK", /* b_store after onstack_now, to preserve j1-j4 */
278700d97012SDavid du Colombier 	"		   #if defined(BCS) && defined(STORE_CTX)",
278800d97012SDavid du Colombier 	"		   { int xj;",
278900d97012SDavid du Colombier 	"			now._ctx = 0;",
279000d97012SDavid du Colombier 	"			JJ = onstack_now();",		    /* mangles j1 */
279100d97012SDavid du Colombier 	"			for (xj = trpt->sched_limit; xj <= sched_max; xj++)",
279200d97012SDavid du Colombier 	"			{	now._ctx = xj;",
2793*de2caf28SDavid du Colombier 	"				II = b_store((char *)&now, vsize);", /* sets j1-j4 */
279400d97012SDavid du Colombier 	"				if (II != 0) { break; }",
279500d97012SDavid du Colombier 	"			}",
279600d97012SDavid du Colombier 	"			now._ctx = 0;",
279700d97012SDavid du Colombier 	"		   }",
279800d97012SDavid du Colombier 	"		   #else",
279900d97012SDavid du Colombier 	"			JJ = onstack_now();",		    /* mangles j1 */
2800*de2caf28SDavid du Colombier 	"			II = b_store((char *)&now, vsize);", /* sets j1-j4 */
280100d97012SDavid du Colombier 	"		   #endif",
280200d97012SDavid du Colombier 	"		#else",
280300d97012SDavid du Colombier 	"		   #if defined(BCS) && defined(STORE_CTX)",
280400d97012SDavid du Colombier 	"		   { int xj;",
280500d97012SDavid du Colombier 	"			for (xj = trpt->sched_limit; xj <= sched_max; xj++)",
280600d97012SDavid du Colombier 	"			{	now._ctx = xj;",
2807*de2caf28SDavid du Colombier 	"				II = b_store((char *)&now, vsize);", /* sets j1-j4 */
280800d97012SDavid du Colombier 	"				JJ = II; /* worstcase guess for p.o. - order corrected in 5.2.1 */",
280900d97012SDavid du Colombier 	"				if (II != 0) { break; }",
281000d97012SDavid du Colombier 	"			}",
281100d97012SDavid du Colombier 	"			now._ctx = 0;",
281200d97012SDavid du Colombier 	"		   }",
281300d97012SDavid du Colombier 	"		   #else",
2814*de2caf28SDavid du Colombier 	"			II = b_store((char *)&now, vsize);", /* sets j1-j4 */
281500d97012SDavid du Colombier 	"			JJ = II; /* worstcase guess for p.o. - order corrected in 5.2.1 */",
281600d97012SDavid du Colombier 	"		   #endif",
281700d97012SDavid du Colombier 	"		#endif",
2818312a1df1SDavid du Colombier 		"#endif",
2819219b2ee8SDavid du Colombier 	"#else",
28207dd7cddfSDavid du Colombier 		"#ifdef MA",
2821*de2caf28SDavid du Colombier 	"			II = g_store((char *)&now, vsize, 0);",
2822312a1df1SDavid du Colombier 			"#ifndef FULLSTACK",
2823312a1df1SDavid du Colombier 	"			JJ = II;",
28247dd7cddfSDavid du Colombier 			"#else",
2825312a1df1SDavid du Colombier 	"			JJ = (II == 2)?1:0;",
28267dd7cddfSDavid du Colombier 			"#endif",
2827312a1df1SDavid du Colombier 		"#else",
2828*de2caf28SDavid du Colombier 	"			II = h_store((char *)&now, vsize);",
282900d97012SDavid du Colombier 	"			/* @hash j1_spin II */",
2830312a1df1SDavid du Colombier 			"#ifdef FULLSTACK",
2831219b2ee8SDavid du Colombier 	"			JJ = (II == 2)?1:0;",
2832219b2ee8SDavid du Colombier 			"#endif",
2833219b2ee8SDavid du Colombier 		"#endif",
2834219b2ee8SDavid du Colombier 	"#endif",
28357dd7cddfSDavid du Colombier 	"			kk = (II == 1 || II == 2);",
283600d97012SDavid du Colombier 	/* actually, BCS implies HAS_LAST */
283700d97012SDavid du Colombier 	"#if defined(BCS) && defined(NO_LAST) && defined(HAS_LAST)",
283800d97012SDavid du Colombier 	"			now._last = was_last;	/* restore value */",
283900d97012SDavid du Colombier 	"#endif",
284000d97012SDavid du Colombier 
2841f3793cddSDavid du Colombier 				/* II==0 new state */
2842f3793cddSDavid du Colombier 				/* II==1 old state */
2843f3793cddSDavid du Colombier 				/* II==2 on current dfs stack */
2844f3793cddSDavid du Colombier 				/* II==3 on 1st dfs stack */
28457dd7cddfSDavid du Colombier 	"#ifndef SAFETY",
2846*de2caf28SDavid du Colombier 		/* with multicore we don't know which stack its on */
2847*de2caf28SDavid du Colombier 		/* with HC there's a small chance of a false match - example fifoq 2012 */
2848*de2caf28SDavid du Colombier 		"#if !defined(HC) && (NCORE==1 || defined (SEP_STATE))",
2849f3793cddSDavid du Colombier 	"			if (II == 2 && ((trpt->o_pm&2) || ((trpt-1)->o_pm&2)))",
285000d97012SDavid du Colombier 	"		#ifndef NOFAIR",
285100d97012SDavid du Colombier 	"			if (a_cycles && !fairness) /* 5.1.6 -- example by Hirofumi Watanabe */",
285200d97012SDavid du Colombier 	"		#endif",
2853*de2caf28SDavid du Colombier 	"			if (depth > A_depth) /* forum example by adl */",
285400d97012SDavid du Colombier 	"			{",
285500d97012SDavid du Colombier 	"				II = 3; /* Schwoon & Esparza 2005, Gastin&Moro 2004 */",
2856f3793cddSDavid du Colombier 			"#ifdef VERBOSE",
2857f3793cddSDavid du Colombier 	"				printf(\"state match on dfs stack\\n\");",
2858f3793cddSDavid du Colombier 			"#endif",
2859f3793cddSDavid du Colombier 	"				goto same_case;",
2860f3793cddSDavid du Colombier 	"			}",
286100d97012SDavid du Colombier 		"#endif",
2862f3793cddSDavid du Colombier 
28637dd7cddfSDavid du Colombier 		"#if defined(FULLSTACK) && defined(BITSTATE)",
28647dd7cddfSDavid du Colombier 	"			if (!JJ && (now._a_t&1) && depth > A_depth)",
286500d97012SDavid du Colombier 	"			{	int oj1 = j1_spin;",
28667dd7cddfSDavid du Colombier 	"				uchar o_a_t = now._a_t;",
2867312a1df1SDavid du Colombier 	"				now._a_t &= ~(1|16|32);", /* 1st stack  */
286800d97012SDavid du Colombier 	"				if (onstack_now())",	  /* changes j1_spin */
28697dd7cddfSDavid du Colombier 	"				{	II = 3;",
28707dd7cddfSDavid du Colombier 		"#ifdef VERBOSE",
28717dd7cddfSDavid du Colombier 	"					printf(\"state match on 1st dfs stack\\n\");",
28727dd7cddfSDavid du Colombier 		"#endif",
28737dd7cddfSDavid du Colombier 	"				}",
2874312a1df1SDavid du Colombier 	"				now._a_t = o_a_t;",	/* restore */
287500d97012SDavid du Colombier 	"				j1_spin = oj1;",
28767dd7cddfSDavid du Colombier 	"			}",
28777dd7cddfSDavid du Colombier 		"#endif",
28787dd7cddfSDavid du Colombier 	"			if (II == 3 && a_cycles && (now._a_t&1))",
28797dd7cddfSDavid du Colombier 	"			{",
28807dd7cddfSDavid du Colombier 		"#ifndef NOFAIR",
2881*de2caf28SDavid du Colombier 	"			   if (fairness && now._cnt[1] != 1)	/* was > 1 */",
28827dd7cddfSDavid du Colombier 	"			   {",
2883*de2caf28SDavid du Colombier 		"	#ifdef CHECK",
2884312a1df1SDavid du Colombier 	"				printf(\"\tfairness count non-zero\\n\");",
28857dd7cddfSDavid du Colombier 		"	#endif",
2886312a1df1SDavid du Colombier 	"				II = 0;", /* treat as new state */
28877dd7cddfSDavid du Colombier 	"			   } else",
28887dd7cddfSDavid du Colombier 		"#endif",
28897dd7cddfSDavid du Colombier 	"			   {",
2890f3793cddSDavid du Colombier 		"#ifndef BITSTATE",
2891312a1df1SDavid du Colombier 	"				nShadow--;",
2892312a1df1SDavid du Colombier 		"#endif",
2893f3793cddSDavid du Colombier 	"same_case:			if (Lstate) depthfound = Lstate->D;",
28947dd7cddfSDavid du Colombier 		"#ifdef NP",
28957dd7cddfSDavid du Colombier 	"				uerror(\"non-progress cycle\");",
28967dd7cddfSDavid du Colombier 		"#else",
28977dd7cddfSDavid du Colombier 	"				uerror(\"acceptance cycle\");",
28987dd7cddfSDavid du Colombier 		"#endif",
289900d97012SDavid du Colombier 	"#if NCORE>1 && defined(FULL_TRAIL)",
290000d97012SDavid du Colombier 	"				if (upto > 0)",
290100d97012SDavid du Colombier 	"				{	Pop_Stack_Tree();",
290200d97012SDavid du Colombier 	"				}",
290300d97012SDavid du Colombier 	"#endif",
29047dd7cddfSDavid du Colombier 	"				goto Up;",
29057dd7cddfSDavid du Colombier 	"			   }",
29067dd7cddfSDavid du Colombier 	"			}",
29077dd7cddfSDavid du Colombier 	"#endif",
29087dd7cddfSDavid du Colombier 
29097dd7cddfSDavid du Colombier 	"#ifndef NOREDUCE",
29107dd7cddfSDavid du Colombier 	"	#ifndef SAFETY",
291100d97012SDavid du Colombier 	"		#if NCORE>1 && !defined(SEP_STATE) && defined(V_PROVISO)",
291200d97012SDavid du Colombier 	"			if (II != 0 && (!Lstate || Lstate->cpu_id < core_id))",
291300d97012SDavid du Colombier 	"			{	(trpt-1)->tau |= 16;",	/* treat as a stack state */
291400d97012SDavid du Colombier 	"			}",
291500d97012SDavid du Colombier 	"		#endif",
29167dd7cddfSDavid du Colombier 	"			if ((II && JJ) || (II == 3))",
29177dd7cddfSDavid du Colombier 	"			{	/* marker for liveness proviso */",
291800d97012SDavid du Colombier 	"		#ifndef LOOPSTATE",
291900d97012SDavid du Colombier 	"				(trpt-1)->tau |= 16;",	/* truncated on stack */
292000d97012SDavid du Colombier 	"		#endif",
2921312a1df1SDavid du Colombier 	"				truncs2++;",
2922219b2ee8SDavid du Colombier 	"			}",
29237dd7cddfSDavid du Colombier 		"#else",
292400d97012SDavid du Colombier 	"		#if NCORE>1 && !defined(SEP_STATE) && defined(V_PROVISO)",
292500d97012SDavid du Colombier 	"			if (!(II != 0 && (!Lstate || Lstate->cpu_id < core_id)))",
292600d97012SDavid du Colombier 	"			{	/* treat as stack state */",
292700d97012SDavid du Colombier 	"				(trpt-1)->tau |= 16;",
292800d97012SDavid du Colombier 	"			} else",
292900d97012SDavid du Colombier 	"			{	/* treat as non-stack state */",
293000d97012SDavid du Colombier 	"				(trpt-1)->tau |= 64;",
293100d97012SDavid du Colombier 	"			}",
293200d97012SDavid du Colombier 	"		#endif",
29337dd7cddfSDavid du Colombier 	"			if (!II || !JJ)",
2934312a1df1SDavid du Colombier 	"			{	/* successor outside stack */",
2935219b2ee8SDavid du Colombier 	"				(trpt-1)->tau |= 64;",
29367dd7cddfSDavid du Colombier 	"			}",
2937219b2ee8SDavid du Colombier 	"	#endif",
29387dd7cddfSDavid du Colombier 	"#endif",
293900d97012SDavid du Colombier 	"#if defined(BCS) && (defined(NOREDUCE) || !defined(SAFETY))",
294000d97012SDavid du Colombier 	/* needed for BCS - cover cases where it would not otherwise be set */
294100d97012SDavid du Colombier 	"			if (!II || !JJ)",
294200d97012SDavid du Colombier 	"			{	(trpt-1)->tau |= 64;",
294300d97012SDavid du Colombier 	"			}",
294400d97012SDavid du Colombier 	"#endif",
29457dd7cddfSDavid du Colombier 	"			if (II)",
2946219b2ee8SDavid du Colombier 	"			{	truncs++;",
294700d97012SDavid du Colombier 	"#if NCORE>1 && defined(FULL_TRAIL)",
294800d97012SDavid du Colombier 	"				if (upto > 0)",
294900d97012SDavid du Colombier 	"				{	Pop_Stack_Tree();",
295000d97012SDavid du Colombier 	"					if (depth == 0)",
295100d97012SDavid du Colombier 	"					{	return;",
295200d97012SDavid du Colombier 	"				}	}",
295300d97012SDavid du Colombier 	"#endif",
2954219b2ee8SDavid du Colombier 	"				goto Up;",
2955219b2ee8SDavid du Colombier 	"			}",
29567dd7cddfSDavid du Colombier 	"			if (!kk)",
295700d97012SDavid du Colombier 	"			{	static long sdone = (long) 0; long ndone;",
295800d97012SDavid du Colombier 	"				nstates++;",
295900d97012SDavid du Colombier 	"#if defined(ZAPH) && defined(BITSTATE)",
296000d97012SDavid du Colombier 	"				zstates += (double) hfns;",
296100d97012SDavid du Colombier 	"#endif",
2962*de2caf28SDavid du Colombier 	"				ndone = (ulong) (nstates/(freq));",
296300d97012SDavid du Colombier 	"				if (ndone != sdone)",
296400d97012SDavid du Colombier 	"				{	snapshot();",
296500d97012SDavid du Colombier 	"					sdone = ndone;",
296600d97012SDavid du Colombier 	"#if defined(AUTO_RESIZE) && !defined(BITSTATE) && !defined(MA)",
296700d97012SDavid du Colombier 	"					if (nstates > ((double)(ONE_L<<(ssize+1))))",
296800d97012SDavid du Colombier 	"					{	void resize_hashtable(void);",
296900d97012SDavid du Colombier 	"						resize_hashtable();",
297000d97012SDavid du Colombier 	"					}",
297100d97012SDavid du Colombier 	"#endif",
297200d97012SDavid du Colombier 	"#if defined(ZAPH) && defined(BITSTATE)",
297300d97012SDavid du Colombier 	"					if (zstates > ((double)(ONE_L<<(ssize-2))))",
297400d97012SDavid du Colombier 	"					{	/* more than half the bits set */",
297500d97012SDavid du Colombier 	"						void zap_hashtable(void);",
297600d97012SDavid du Colombier 	"						zap_hashtable();",
297700d97012SDavid du Colombier 	"						zstates = 0;",
297800d97012SDavid du Colombier 	"					}",
297900d97012SDavid du Colombier 	"#endif",
298000d97012SDavid du Colombier 	"				}",
29817dd7cddfSDavid du Colombier 	"#ifdef SVDUMP",
29827dd7cddfSDavid du Colombier 	"				if (vprefix > 0)",
298300d97012SDavid du Colombier 	"	#ifdef SHO",	/* Store Hash Only */
298400d97012SDavid du Colombier 	"			/* always use the same hashfunction, for consistency across runs */",
298500d97012SDavid du Colombier 	"				if (HASH_NR != 0)",
298600d97012SDavid du Colombier 	"				{	int oh = HASH_NR;",
298700d97012SDavid du Colombier 	"					HASH_NR = 0;",
2988*de2caf28SDavid du Colombier 	"					d_hash((uchar *) &now, vsize); /* SHO - set K1 */",
298900d97012SDavid du Colombier 	"					HASH_NR = oh;",
299000d97012SDavid du Colombier 	"				}",
2991*de2caf28SDavid du Colombier 	"				if (write(svfd, (uchar *) &K1, sizeof(ulong)) != sizeof(ulong))",
299200d97012SDavid du Colombier 	"	#else",
29937dd7cddfSDavid du Colombier 	"				if (write(svfd, (uchar *) &now, vprefix) != vprefix)",
299400d97012SDavid du Colombier 	"	#endif",
299500d97012SDavid du Colombier 	"				{	fprintf(efd, \"writing %%s.svd failed\\n\", PanSource);",
29967dd7cddfSDavid du Colombier 	"					wrapup();",
29977dd7cddfSDavid du Colombier 	"				}",
29987dd7cddfSDavid du Colombier 	"#endif",
2999312a1df1SDavid du Colombier 	"#if defined(MA) && defined(W_XPT)",
3000*de2caf28SDavid du Colombier 	"				if ((ulong) nstates%%W_XPT == 0)",
30017dd7cddfSDavid du Colombier 	"				{	void w_xpoint(void);",
30027dd7cddfSDavid du Colombier 	"					w_xpoint();",
30037dd7cddfSDavid du Colombier 	"				}",
30047dd7cddfSDavid du Colombier 	"#endif",
30057dd7cddfSDavid du Colombier 	"			}",
300600d97012SDavid du Colombier 
3007219b2ee8SDavid du Colombier 	"#if defined(FULLSTACK) || defined(CNTRSTACK)",
3008219b2ee8SDavid du Colombier 	"			onstack_put();",
30097dd7cddfSDavid du Colombier 		"#ifdef DEBUG2",
30107dd7cddfSDavid du Colombier 		"#if defined(FULLSTACK) && !defined(MA)",
3011219b2ee8SDavid du Colombier 	"			printf(\"%%d: putting %%u (%%d)\\n\", depth,",
30127dd7cddfSDavid du Colombier 	"				trpt->ostate, ",
30137dd7cddfSDavid du Colombier 	"				(trpt->ostate)?trpt->ostate->tagged:0);",
3014219b2ee8SDavid du Colombier 		"#else",
3015219b2ee8SDavid du Colombier 	"			printf(\"%%d: putting\\n\", depth);",
3016219b2ee8SDavid du Colombier 		"#endif",
3017219b2ee8SDavid du Colombier 		"#endif",
301800d97012SDavid du Colombier 	"#else",
301900d97012SDavid du Colombier 	"	#if NCORE>1",
302000d97012SDavid du Colombier 	"			trpt->ostate = Lstate;",
302100d97012SDavid du Colombier 	"	#endif",
3022219b2ee8SDavid du Colombier 	"#endif",
3023219b2ee8SDavid du Colombier 	"	}	}",
3024312a1df1SDavid du Colombier 
3025219b2ee8SDavid du Colombier 	"	if (depth > mreached)",
3026219b2ee8SDavid du Colombier 	"		mreached = depth;",
3027219b2ee8SDavid du Colombier 	"#ifdef VERI",
3028219b2ee8SDavid du Colombier 	"	if (trpt->tau&4)",
3029219b2ee8SDavid du Colombier 	"#endif",
30307dd7cddfSDavid du Colombier 	"	trpt->tau &= ~(1|2);	/* timeout and -request off */",
3031312a1df1SDavid du Colombier 	"	_n = 0;",
3032219b2ee8SDavid du Colombier 	"#if SYNC",
3033219b2ee8SDavid du Colombier 	"	(trpt+1)->o_n = 0;",
3034219b2ee8SDavid du Colombier 	"#endif",
3035219b2ee8SDavid du Colombier 	"#ifdef VERI",
30367dd7cddfSDavid du Colombier 	"	if (now._nr_pr == 0)	/* claim terminated */",
3037*de2caf28SDavid du Colombier 	"	{	uerror(\"end state in claim reached\");",
3038*de2caf28SDavid du Colombier 	"	}",
303900d97012SDavid du Colombier 	"	if (stopstate[((Pclaim *)pptr(0))->_t][((Pclaim *)pptr(0))->_p])",
304000d97012SDavid du Colombier 	"	{	uerror(\"end state in claim reached\");",
304100d97012SDavid du Colombier 	"	}",
3042219b2ee8SDavid du Colombier 	"Stutter:",
3043219b2ee8SDavid du Colombier 	"	if (trpt->tau&4)	/* must make a claimmove */",
3044312a1df1SDavid du Colombier 	"	{",
3045312a1df1SDavid du Colombier 	"	#ifndef NOFAIR",
3046312a1df1SDavid du Colombier 	"		if ((now._a_t&2)	/* A-bit set */",
3047312a1df1SDavid du Colombier 	"		&&   now._cnt[now._a_t&1] == 1)",
3048312a1df1SDavid du Colombier 	"		{	now._a_t &= ~2;",
3049312a1df1SDavid du Colombier 	"			now._cnt[now._a_t&1] = 0;",
3050312a1df1SDavid du Colombier 	"			trpt->o_pm |= 16;",
3051312a1df1SDavid du Colombier 			"#ifdef DEBUG",
3052*de2caf28SDavid du Colombier 	"	printf(\"%%3ld: fairness Rule 3.: _a_t = %%d\\n\", depth, now._a_t);",
3053312a1df1SDavid du Colombier 			"#endif",
3054312a1df1SDavid du Colombier 	"		}",
3055312a1df1SDavid du Colombier 	"	#endif",
3056312a1df1SDavid du Colombier 	"		II = 0;		/* never */",
3057219b2ee8SDavid du Colombier 	"		goto Veri0;",
3058219b2ee8SDavid du Colombier 	"	}",
3059219b2ee8SDavid du Colombier 	"#endif",
3060*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
3061*de2caf28SDavid du Colombier 	"	if (reversing&2)",
3062*de2caf28SDavid du Colombier 	"	{	seed = rand();",
3063*de2caf28SDavid du Colombier 	"		p_reorder(seed);",
3064*de2caf28SDavid du Colombier 	"	}",
3065*de2caf28SDavid du Colombier 	"#endif",
30667dd7cddfSDavid du Colombier 	"#ifndef NOREDUCE",
30677dd7cddfSDavid du Colombier 	"	/* Look for a process with only safe transitions */",
30687dd7cddfSDavid du Colombier 	"	/* (special rules apply in the 2nd dfs) */",
30697dd7cddfSDavid du Colombier 	"	if (boq == -1 && From != To",
307000d97012SDavid du Colombier 	"",
307100d97012SDavid du Colombier 	"#ifdef SAFETY",
307200d97012SDavid du Colombier 	" #if NCORE>1",
307300d97012SDavid du Colombier 	"	&& (depth < z_handoff)", /* not for border states */
307400d97012SDavid du Colombier 	" #endif",
307500d97012SDavid du Colombier 	"	)",
307600d97012SDavid du Colombier 	"#else",
307700d97012SDavid du Colombier 	" #if NCORE>1",
307800d97012SDavid du Colombier 	"	&& ((a_cycles) || (!a_cycles && depth < z_handoff))",
307900d97012SDavid du Colombier 	" #endif",
308000d97012SDavid du Colombier 	" #ifdef BCS",
308100d97012SDavid du Colombier 	"	&& (sched_max > 0 || depth > BASE)", /* no po in initial state if -L0 */
308200d97012SDavid du Colombier 	" #endif",
30837dd7cddfSDavid du Colombier 	"	&&  (!(now._a_t&1)",
30847dd7cddfSDavid du Colombier 	"	    ||	(a_cycles &&",
30857dd7cddfSDavid du Colombier 	" #ifndef BITSTATE",
30867dd7cddfSDavid du Colombier 		"#ifdef MA",
30877dd7cddfSDavid du Colombier 			"#ifdef VERI",
30887dd7cddfSDavid du Colombier 	"		 !((trpt-1)->proviso))",
30897dd7cddfSDavid du Colombier 			"#else",
30907dd7cddfSDavid du Colombier 	"		!(trpt->proviso))",
30917dd7cddfSDavid du Colombier 			"#endif",
30927dd7cddfSDavid du Colombier 		"#else",
30937dd7cddfSDavid du Colombier 			"#ifdef VERI",
30947dd7cddfSDavid du Colombier 	"		 (trpt-1)->ostate &&",
309500d97012SDavid du Colombier 	"		!(((char *)&((trpt-1)->ostate->state))[0] & 128))", /* proviso bit in _a_t */
30967dd7cddfSDavid du Colombier 			"#else",
30977dd7cddfSDavid du Colombier 	"		!(((char *)&(trpt->ostate->state))[0] & 128))",
30987dd7cddfSDavid du Colombier 			"#endif",
30997dd7cddfSDavid du Colombier 		"#endif",
31007dd7cddfSDavid du Colombier 	" #else",
31017dd7cddfSDavid du Colombier 		"#ifdef VERI",
31027dd7cddfSDavid du Colombier 	"		(trpt-1)->ostate &&",
31037dd7cddfSDavid du Colombier 	"		(trpt-1)->ostate->proviso == 0)",
31047dd7cddfSDavid du Colombier 		"#else",
31057dd7cddfSDavid du Colombier 	"		trpt->ostate->proviso == 0)",
31067dd7cddfSDavid du Colombier 		"#endif",
31077dd7cddfSDavid du Colombier 	" #endif",
31087dd7cddfSDavid du Colombier 	"	   ))",
310900d97012SDavid du Colombier 	"#endif", /* SAFETY */
311000d97012SDavid du Colombier 	"	/* attempt Partial Order Reduction as preselect moves */",
311100d97012SDavid du Colombier 	"#ifdef BCS",
311200d97012SDavid du Colombier 	"	if (trpt->sched_limit < sched_max)",	/* po only if we can switch */
31137dd7cddfSDavid du Colombier 	"#endif",
3114*de2caf28SDavid du Colombier 	"	{	for ALL_P {",	/* PO preselect */
31157dd7cddfSDavid du Colombier 	"Resume:		/* pick up here if preselect fails */",
3116*de2caf28SDavid du Colombier 	"			_this = pptr(II);",
3117*de2caf28SDavid du Colombier 	"			tt = (int) ((P0 *)_this)->_p;",
3118*de2caf28SDavid du Colombier 	"			ot = (uchar) ((P0 *)_this)->_t;",
3119219b2ee8SDavid du Colombier 	"			if (trans[ot][tt]->atom & 8)",
31207dd7cddfSDavid du Colombier 	"			{	t = trans[ot][tt];",
3121219b2ee8SDavid du Colombier 	"				if (t->qu[0] != 0)",
3122219b2ee8SDavid du Colombier 	"				{	Ccheck++;",
31237dd7cddfSDavid du Colombier 	"					if (!q_cond(II, t))",
3124*de2caf28SDavid du Colombier 	"					{	continue;",
3125*de2caf28SDavid du Colombier 	"					}",
3126219b2ee8SDavid du Colombier 	"					Cholds++;",
3127219b2ee8SDavid du Colombier 	"				}",
3128*de2caf28SDavid du Colombier 	"				From = To = II; /* preselect process */",
3129219b2ee8SDavid du Colombier 	"#ifdef NIBIS",
3130219b2ee8SDavid du Colombier 	"				t->om = 0;",
3131219b2ee8SDavid du Colombier 	"#endif",
3132219b2ee8SDavid du Colombier 	"				trpt->tau |= 32; /* preselect marker */",
3133219b2ee8SDavid du Colombier 	"#ifdef DEBUG",
313400d97012SDavid du Colombier 	"				printf(\"%%3ld: proc %%d PreSelected (tau=%%d)\\n\", ",
3135219b2ee8SDavid du Colombier 	"					depth, II, trpt->tau);",
3136219b2ee8SDavid du Colombier 	"#endif",
3137219b2ee8SDavid du Colombier 	"				goto Again;",
3138*de2caf28SDavid du Colombier 	"			} else",
3139*de2caf28SDavid du Colombier 	"			{	continue;",
314000d97012SDavid du Colombier 	"	}	}	}",
3141219b2ee8SDavid du Colombier 	"	trpt->tau &= ~32;",
3142219b2ee8SDavid du Colombier 	"#endif",
3143312a1df1SDavid du Colombier 	"#if !defined(NOREDUCE) || (defined(ETIM) && !defined(VERI))",
3144219b2ee8SDavid du Colombier 	"Again:",
3145312a1df1SDavid du Colombier 	"#endif",
314600d97012SDavid du Colombier 	"	trpt->o_pm &= ~(8|16|32|64); /* clear fairness-marks */",
31477dd7cddfSDavid du Colombier 	"#ifndef NOFAIR",
3148219b2ee8SDavid du Colombier 	"	if (fairness && boq == -1",
3149219b2ee8SDavid du Colombier 		"#ifdef VERI",
3150219b2ee8SDavid du Colombier 	"	&& (!(trpt->tau&4) && !((trpt-1)->tau&128))",
3151219b2ee8SDavid du Colombier 		"#endif",
3152219b2ee8SDavid du Colombier 	"	&& !(trpt->tau&8))",
3153219b2ee8SDavid du Colombier 	"	{	/* A_bit = 1; Cnt = N in acc states with A_bit 0 */",
3154219b2ee8SDavid du Colombier 	"		if (!(now._a_t&2))",	/* A-bit not set */
315500d97012SDavid du Colombier 	"		{	if (a_cycles && (trpt->o_pm&2))",
3156219b2ee8SDavid du Colombier 	"			{	/* Accepting state */",
3157219b2ee8SDavid du Colombier 	"				now._a_t |= 2;",
315800d97012SDavid du Colombier 	"				now._cnt[now._a_t&1] = now._nr_pr + 1;",
3159219b2ee8SDavid du Colombier 	"				trpt->o_pm |= 8;",
3160219b2ee8SDavid du Colombier 		"#ifdef DEBUG",
316100d97012SDavid du Colombier 	"	printf(\"%%3ld: fairness Rule 1: cnt=%%d, _a_t=%%d\\n\",",
3162219b2ee8SDavid du Colombier 	"			depth, now._cnt[now._a_t&1], now._a_t);",
3163219b2ee8SDavid du Colombier 		"#endif",
3164219b2ee8SDavid du Colombier 	"			}",
3165219b2ee8SDavid du Colombier 	"		} else",		/* A-bit set */
3166219b2ee8SDavid du Colombier 	"		{	/* A_bit = 0 when Cnt 0 */",
316700d97012SDavid du Colombier 	"			if (now._cnt[now._a_t&1] == 1)",
31687dd7cddfSDavid du Colombier 	"			{	now._a_t &= ~2;",	/* reset a-bit */
316900d97012SDavid du Colombier 	"				now._cnt[now._a_t&1] = 0;",
3170219b2ee8SDavid du Colombier 	"				trpt->o_pm |= 16;",
3171219b2ee8SDavid du Colombier 		"#ifdef DEBUG",
317200d97012SDavid du Colombier 	"	printf(\"%%3ld: fairness Rule 3: _a_t = %%d\\n\",",
3173219b2ee8SDavid du Colombier 	"		depth, now._a_t);",
3174219b2ee8SDavid du Colombier 		"#endif",
3175219b2ee8SDavid du Colombier 	"	}	}	}",
31767dd7cddfSDavid du Colombier 	"#endif",
3177219b2ee8SDavid du Colombier 
317800d97012SDavid du Colombier 	"#ifdef BCS",	/* bounded context switching */
317900d97012SDavid du Colombier 	"	trpt->bcs = trpt->b_pno = 0;	/* initial */",
318000d97012SDavid du Colombier 	"	if (From != To		/* not a PO or atomic move */",
318100d97012SDavid du Colombier 	"	&&  depth > BASE)	/* there is a prior move */",
318200d97012SDavid du Colombier 	"	{	trpt->b_pno = now._last + BASE;",
318300d97012SDavid du Colombier 	"		trpt->bcs = B_PHASE1;",
318400d97012SDavid du Colombier 	"	#ifdef VERBOSE",
318500d97012SDavid du Colombier 	"		printf(\"%%3ld: BCS phase 1 proc %%d limit %%d\\n\",",
318600d97012SDavid du Colombier 	"			depth, trpt->b_pno, trpt->sched_limit);",
318700d97012SDavid du Colombier 	"	#endif",
318800d97012SDavid du Colombier 	"		/* allow only process b_pno to move in this phase */",
318900d97012SDavid du Colombier 	"	}",
319000d97012SDavid du Colombier 	"c_switch:	/* jumps here with bcs == B_PHASE2 with or wo B_FORCED added */",
319100d97012SDavid du Colombier 	"	#ifdef VERBOSE",
319200d97012SDavid du Colombier 	"		printf(\"%%3ld: BCS c_switch phase=%%d pno=%%d [forced %%d]\\n\",",
319300d97012SDavid du Colombier 	"			depth, trpt->bcs, trpt->b_pno, (trpt->bcs&B_FORCED)?1:0);",
319400d97012SDavid du Colombier 	"	#endif",
319500d97012SDavid du Colombier 	"#endif",
319600d97012SDavid du Colombier 
319700d97012SDavid du Colombier 	"#ifdef P_RAND",
3198*de2caf28SDavid du Colombier 	"	trpt->p_left = CNT_P;",
319900d97012SDavid du Colombier 	"	if (trpt->p_left > 1)",
320000d97012SDavid du Colombier 	"	{	trpt->p_skip = rand() %% (trpt->p_left);",
320100d97012SDavid du Colombier 	"	} else",
320200d97012SDavid du Colombier 	"	{	trpt->p_skip = -1;",
320300d97012SDavid du Colombier 	"	}",
320400d97012SDavid du Colombier 	"r_switch:",
320500d97012SDavid du Colombier 	"	#ifdef VERBOSE",
320600d97012SDavid du Colombier 	"		printf(\"%%3ld: P_RAND r_switch p_skip=%%d p_left=%%d\\n\",",
320700d97012SDavid du Colombier 	"			depth, trpt->p_skip, trpt->p_left);",
320800d97012SDavid du Colombier 	"	#endif",
320900d97012SDavid du Colombier 	"#endif",
321000d97012SDavid du Colombier 
3211*de2caf28SDavid du Colombier 	"	for ALL_P {",	/* Main Loop */
3212*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
3213*de2caf28SDavid du Colombier 	"		if (reversing&2)",
3214*de2caf28SDavid du Colombier 	"		{	oII = II;",
3215*de2caf28SDavid du Colombier 	"			if (From != To)", /* not atomic or preselected */
3216*de2caf28SDavid du Colombier 	"			{	II = get_permuted(II);",
3217*de2caf28SDavid du Colombier 	"		}	}",
3218*de2caf28SDavid du Colombier 	"#endif",
321900d97012SDavid du Colombier 	"#ifdef P_RAND",
322000d97012SDavid du Colombier 	"		if (trpt->p_skip >= 0)",
322100d97012SDavid du Colombier 	"		{	trpt->p_skip--; /* skip random nr of procs */",
322200d97012SDavid du Colombier 	"	#ifdef VERBOSE",
322300d97012SDavid du Colombier 	"		printf(\"%%3ld: P_RAND skipping %%d [new p_skip=%%d p_left=%%d]\\n\",",
322400d97012SDavid du Colombier 	"			depth, II, trpt->p_skip, trpt->p_left);",
322500d97012SDavid du Colombier 	"	#endif",
3226*de2caf28SDavid du Colombier 	"			CONTINUE0;",
322700d97012SDavid du Colombier 	"		}",
322800d97012SDavid du Colombier 	"		if (trpt->p_left == 0)",
322900d97012SDavid du Colombier 	"		{",
323000d97012SDavid du Colombier 	"	#ifdef VERBOSE",
323100d97012SDavid du Colombier 	"		printf(\"%%3ld: P_RAND done at %%d\\n\", depth, II);",
323200d97012SDavid du Colombier 	"	#endif",
323300d97012SDavid du Colombier 	"			break;	/* done */",
323400d97012SDavid du Colombier 	"		}",
323500d97012SDavid du Colombier 	"	#ifdef VERBOSE",
323600d97012SDavid du Colombier 	"		printf(\"%%3ld: P_RAND explore %%d [p_left=%%d]\\n\",",
323700d97012SDavid du Colombier 	"			depth, II, trpt->p_left);",
323800d97012SDavid du Colombier 	"	#endif",
323900d97012SDavid du Colombier 	"		trpt->p_left--;",
324000d97012SDavid du Colombier 	"#endif",
324100d97012SDavid du Colombier 
3242219b2ee8SDavid du Colombier 	"#if SYNC",
3243219b2ee8SDavid du Colombier 	"		/* no rendezvous with same proc */",
3244*de2caf28SDavid du Colombier 	"		if (boq != -1 && trpt->pr == II)",
3245*de2caf28SDavid du Colombier 	"		{	CONTINUE0;",
3246*de2caf28SDavid du Colombier 	"		}",
3247219b2ee8SDavid du Colombier 	"#endif",
324800d97012SDavid du Colombier 
324900d97012SDavid du Colombier 	"#ifdef BCS",	/* never claim with II==0 cannot get here */
325000d97012SDavid du Colombier 	"		if ((trpt->bcs & B_PHASE1)",
325100d97012SDavid du Colombier 	"		&&  trpt->b_pno != II)",
325200d97012SDavid du Colombier 	"		{",
325300d97012SDavid du Colombier 	"	#ifdef VERBOSE",
325400d97012SDavid du Colombier 	"		printf(\"%%3ld: BCS NotPre II=%%d bcs=%%d pno=%%d [forced %%d]\\n\",",
325500d97012SDavid du Colombier 	"			depth, II, trpt->bcs, trpt->b_pno, (trpt->bcs&B_FORCED)?1:0);",
325600d97012SDavid du Colombier 	"	#endif",
3257*de2caf28SDavid du Colombier 	"			CONTINUE0;",	/* avoid context switch */
325800d97012SDavid du Colombier 	"		}",
325900d97012SDavid du Colombier 	"	#ifdef VERBOSE",
326000d97012SDavid du Colombier 	"		else if ((trpt->bcs & B_PHASE1) && trpt->b_pno == II)",
326100d97012SDavid du Colombier 	"		printf(\"%%3ld: BCS IsPre II=%%d bcs=%%d pno=%%d [forced %%d]\\n\",",
326200d97012SDavid du Colombier 	"			depth, II, trpt->bcs, trpt->b_pno, (trpt->bcs&B_FORCED)?1:0);",
326300d97012SDavid du Colombier 	"	#endif",
326400d97012SDavid du Colombier 
326500d97012SDavid du Colombier 	"		if (trpt->bcs & B_PHASE2)	/* 2nd phase */",
326600d97012SDavid du Colombier 	"		{	if (trpt->b_pno == II)	/* was already done in phase 1 */",
326700d97012SDavid du Colombier 	"			{",
326800d97012SDavid du Colombier 	"	#ifdef VERBOSE",
326900d97012SDavid du Colombier 	"		printf(\"%%3ld: BCS NoRepeat II=%%d bcs=%%d pno=%%d [forced %%d]\\n\",",
327000d97012SDavid du Colombier 	"			depth, II, trpt->bcs, trpt->b_pno, (trpt->bcs&B_FORCED)?1:0);",
327100d97012SDavid du Colombier 	"	#endif",
3272*de2caf28SDavid du Colombier 	"				CONTINUE0;",
327300d97012SDavid du Colombier 	"			}",
327400d97012SDavid du Colombier 	"			if (!(trpt->bcs & B_FORCED)	/* unless forced */",
327500d97012SDavid du Colombier 	"			&&  trpt->sched_limit >= sched_max)",
327600d97012SDavid du Colombier 	"			{",
327700d97012SDavid du Colombier 	"	#ifdef VERBOSE",
327800d97012SDavid du Colombier 	"		printf(\"%%3ld: BCS Bound II=%%d bcs=%%d pno=%%d [forced %%d]\\n\",",
327900d97012SDavid du Colombier 	"			depth, II, trpt->bcs, trpt->b_pno, (trpt->bcs&B_FORCED)?1:0);",
328000d97012SDavid du Colombier 	"	#endif",
3281*de2caf28SDavid du Colombier 	"				CONTINUE0;	/* enforce bound */",
328200d97012SDavid du Colombier 	"		}	}",
328300d97012SDavid du Colombier 	"#endif",
328400d97012SDavid du Colombier 
3285312a1df1SDavid du Colombier 	"#ifdef VERI",
3286312a1df1SDavid du Colombier 	"Veri0:",
3287312a1df1SDavid du Colombier 	"#endif",
3288*de2caf28SDavid du Colombier 	"		_this = pptr(II);",
3289*de2caf28SDavid du Colombier 	"		tt = (int) ((P0 *)_this)->_p;",
3290*de2caf28SDavid du Colombier 	"		ot = (uchar) ((P0 *)_this)->_t;",
3291219b2ee8SDavid du Colombier 
3292219b2ee8SDavid du Colombier 	"#ifdef NIBIS",
3293219b2ee8SDavid du Colombier 	"		/* don't repeat a previous preselected expansion */",
3294219b2ee8SDavid du Colombier 	"		/* could hit this if reduction proviso was false */",
3295219b2ee8SDavid du Colombier 	"		t = trans[ot][tt];",
3296219b2ee8SDavid du Colombier 	"		if (!(trpt->tau&4)",	/* not claim */
3297219b2ee8SDavid du Colombier 	"		&& !(trpt->tau&1)",	/* not timeout */
3298219b2ee8SDavid du Colombier 	"		&& !(trpt->tau&32)",	/* not preselected */
3299219b2ee8SDavid du Colombier 	"		&& (t->atom & 8)",	/* local */
3300219b2ee8SDavid du Colombier 	"		&& boq == -1",		/* not inside rendezvous */
3301219b2ee8SDavid du Colombier 	"		&& From != To)",	/* not inside atomic seq */
3302219b2ee8SDavid du Colombier 	"		{	if (t->qu[0] == 0",	/* unconditional */
33037dd7cddfSDavid du Colombier 	"			||  q_cond(II, t))",	/* true condition */
3304312a1df1SDavid du Colombier 	"			{	_m = t->om;",
3305*de2caf28SDavid du Colombier 	"				if (_m>_n||(_n>3&&_m!=0))",
3306*de2caf28SDavid du Colombier 	"				{	_n=_m;",
3307*de2caf28SDavid du Colombier 	"				}",
3308*de2caf28SDavid du Colombier 	"				CONTINUE0; /* did it before */",
3309219b2ee8SDavid du Colombier 	"		}	}",
3310219b2ee8SDavid du Colombier 	"#endif",
3311219b2ee8SDavid du Colombier 	"		trpt->o_pm &=  ~1; /* no move in this pid yet */",
33127dd7cddfSDavid du Colombier 	"#ifdef EVENT_TRACE",
33137dd7cddfSDavid du Colombier 	"		(trpt+1)->o_event = now._event;",
33147dd7cddfSDavid du Colombier 	"#endif",
33157dd7cddfSDavid du Colombier 	"		/* Fairness: Cnt++ when Cnt == II */",
33167dd7cddfSDavid du Colombier 	"#ifndef NOFAIR",
3317219b2ee8SDavid du Colombier 	"		trpt->o_pm &= ~64; /* didn't apply rule 2 */",
3318219b2ee8SDavid du Colombier 	"		if (fairness",
33197dd7cddfSDavid du Colombier 	"		&& boq == -1",	/* not mid rv - except rcv - NEW 3.0.8 */
33207dd7cddfSDavid du Colombier 	"		&& !(trpt->o_pm&32)",	/* Rule 2 not in effect */
3321219b2ee8SDavid du Colombier 	"		&& (now._a_t&2)",	/* A-bit is set */
33227dd7cddfSDavid du Colombier 	"		&&  now._cnt[now._a_t&1] == II+2)",
3323219b2ee8SDavid du Colombier 	"		{	now._cnt[now._a_t&1] -= 1;",
3324219b2ee8SDavid du Colombier 		"#ifdef VERI",
3325219b2ee8SDavid du Colombier 	"			/* claim need not participate */",
33267dd7cddfSDavid du Colombier 	"			if (II == 1)",
33277dd7cddfSDavid du Colombier 	"				now._cnt[now._a_t&1] = 1;",
3328219b2ee8SDavid du Colombier 		"#endif",
3329219b2ee8SDavid du Colombier 		"#ifdef DEBUG",
333000d97012SDavid du Colombier 	"		printf(\"%%3ld: proc %%d fairness \", depth, II);",
33317dd7cddfSDavid du Colombier 	"		printf(\"Rule 2: --cnt to %%d (%%d)\\n\",",
33327dd7cddfSDavid du Colombier 	"			now._cnt[now._a_t&1], now._a_t);",
3333219b2ee8SDavid du Colombier 		"#endif",
3334219b2ee8SDavid du Colombier 	"			trpt->o_pm |= (32|64);",
3335219b2ee8SDavid du Colombier 	"		}",
33367dd7cddfSDavid du Colombier 	"#endif",
3337*de2caf28SDavid du Colombier 
3338*de2caf28SDavid du Colombier 	"#ifdef HAS_PRIORITY",
3339*de2caf28SDavid du Colombier 	"		if (!highest_priority(((P0 *)_this)->_pid, II, t))",
3340*de2caf28SDavid du Colombier 	"		{	CONTINUE0;",
3341*de2caf28SDavid du Colombier 	"		}",
3342*de2caf28SDavid du Colombier 	"#else",
33437dd7cddfSDavid du Colombier 	"	#ifdef HAS_PROVIDED",
3344*de2caf28SDavid du Colombier 	"		if (!provided(II, ot, tt, t))",
3345*de2caf28SDavid du Colombier 	"		{	CONTINUE0;",
3346*de2caf28SDavid du Colombier 	"		}",
33477dd7cddfSDavid du Colombier 	"	#endif",
3348*de2caf28SDavid du Colombier 	"#endif",
3349*de2caf28SDavid du Colombier 
33507dd7cddfSDavid du Colombier 	"		/* check all trans of proc II - escapes first */",
3351219b2ee8SDavid du Colombier 	"#ifdef HAS_UNLESS",
3352219b2ee8SDavid du Colombier 	"		trpt->e_state = 0;",
3353219b2ee8SDavid du Colombier 	"#endif",
3354312a1df1SDavid du Colombier 	"		(trpt+1)->pr = (uchar) II;",	/* for uerror */
3355312a1df1SDavid du Colombier 	"		(trpt+1)->st = tt;",
3356312a1df1SDavid du Colombier 
335700d97012SDavid du Colombier 	"#ifdef T_RAND",
3358312a1df1SDavid du Colombier 	"		for (ooi = eoi = 0, t = trans[ot][tt]; t; t = t->nxt, ooi++)",
335900d97012SDavid du Colombier 	"		{	if (strcmp(t->tp, \"else\") == 0",
336000d97012SDavid du Colombier 	"	#ifdef HAS_UNLESS",
336100d97012SDavid du Colombier 	"			||  t->e_trans != 0",
336200d97012SDavid du Colombier 	"	#endif",
336300d97012SDavid du Colombier 	"			)",
336400d97012SDavid du Colombier 	"			{	eoi++;", /* no break, must count ooi */
336500d97012SDavid du Colombier 	"		}	}",
336600d97012SDavid du Colombier 	"		if (eoi > 0)",
3367312a1df1SDavid du Colombier 	"		{	t = trans[ot][tt];",
3368312a1df1SDavid du Colombier 	"	#ifdef VERBOSE",
336900d97012SDavid du Colombier 	"			printf(\"randomizer: suppressed, saw else or escape\\n\");",
3370312a1df1SDavid du Colombier 	"	#endif",
3371*de2caf28SDavid du Colombier 	"		} else if (ooi > 0)",
3372312a1df1SDavid du Colombier 	"		{	eoi = rand()%%ooi;",
3373312a1df1SDavid du Colombier 	"	#ifdef VERBOSE",
3374312a1df1SDavid du Colombier 	"			printf(\"randomizer: skip %%d in %%d\\n\", eoi, ooi);",
33757dd7cddfSDavid du Colombier 	"	#endif",
3376219b2ee8SDavid du Colombier 	"			for (t = trans[ot][tt]; t; t = t->nxt)",
3377312a1df1SDavid du Colombier 	"				if (eoi-- <= 0) break;",
3378312a1df1SDavid du Colombier 	"		}",
337900d97012SDavid du Colombier 	"domore:",
3380312a1df1SDavid du Colombier 	"		for ( ; t && ooi > 0; t = t->nxt, ooi--)",
338100d97012SDavid du Colombier 	"#else", /* ie dont randomize */
3382312a1df1SDavid du Colombier 	"		for (t = trans[ot][tt]; t; t = t->nxt)",
3383312a1df1SDavid du Colombier 	"#endif",
3384219b2ee8SDavid du Colombier 	"		{",
3385219b2ee8SDavid du Colombier 	"#ifdef HAS_UNLESS",
3386219b2ee8SDavid du Colombier 	"			/* exploring all transitions from",
3387219b2ee8SDavid du Colombier 	"			 * a single escape state suffices",
3388219b2ee8SDavid du Colombier 	"			 */",
3389219b2ee8SDavid du Colombier 	"			if (trpt->e_state > 0",
3390219b2ee8SDavid du Colombier 	"			&&  trpt->e_state != t->e_trans)",
3391219b2ee8SDavid du Colombier 	"			{",
3392219b2ee8SDavid du Colombier 		"#ifdef DEBUG",
33937dd7cddfSDavid du Colombier 	"		printf(\"skip 2nd escape %%d (did %%d before)\\n\",",
3394219b2ee8SDavid du Colombier 	"			t->e_trans, trpt->e_state);",
3395219b2ee8SDavid du Colombier 		"#endif",
3396219b2ee8SDavid du Colombier 	"				break;",
3397219b2ee8SDavid du Colombier 	"			}",
3398219b2ee8SDavid du Colombier 	"#endif",
339900d97012SDavid du Colombier 	"	#if defined(TRIX) && !defined(TRIX_ORIG) && !defined(BFS)",
340000d97012SDavid du Colombier 	"			(trpt+1)->p_bup = now._ids_[II];",
340100d97012SDavid du Colombier 	"	#endif",
3402312a1df1SDavid du Colombier 	"			(trpt+1)->o_t = t;",	/* for uerror */
3403219b2ee8SDavid du Colombier 	"#ifdef INLINE",
34047dd7cddfSDavid du Colombier 	"#include FORWARD_MOVES",
3405219b2ee8SDavid du Colombier 	"P999:			/* jumps here when move succeeds */",
3406312a1df1SDavid du Colombier 	"#else",
3407*de2caf28SDavid du Colombier 	"			if (!(_m = do_transit(t, II)))",
3408*de2caf28SDavid du Colombier 	"			{	continue;",
3409*de2caf28SDavid du Colombier 	"			}",
3410312a1df1SDavid du Colombier 	"#endif",
341100d97012SDavid du Colombier 	"#ifdef BCS",
341200d97012SDavid du Colombier 	"			if (depth > BASE",	/* has prior move */
341300d97012SDavid du Colombier 	"			&& II >= BASE",		/* not claim */
341400d97012SDavid du Colombier 	"			&& From != To",		/* not atomic or po */
341500d97012SDavid du Colombier 	"	#ifndef BCS_NOFIX",
341600d97012SDavid du Colombier 	"			/* added 5.2.5: prior move was not po */",
341700d97012SDavid du Colombier 	"			&& !((trpt-(BASE+1))->tau & 32)",
341800d97012SDavid du Colombier 	"	#endif",
341900d97012SDavid du Colombier 	"			&& boq == -1",		/* not rv */
342000d97012SDavid du Colombier 	"			&& (trpt->bcs & B_PHASE2)",
342100d97012SDavid du Colombier 	"			&&  trpt->b_pno != II	/* context switch */", /* redundant */
342200d97012SDavid du Colombier 	"			&& !(trpt->bcs & B_FORCED))	/* unless forced */",
342300d97012SDavid du Colombier 	"			{	(trpt+1)->sched_limit = 1 + trpt->sched_limit;",
342400d97012SDavid du Colombier 	"	#ifdef VERBOSE",
342500d97012SDavid du Colombier 	"		printf(\"%%3ld: up sched count to %%d\\n\", depth, (trpt+1)->sched_limit);",
342600d97012SDavid du Colombier 	"	#endif",
342700d97012SDavid du Colombier 	"			} else",
342800d97012SDavid du Colombier 	"			{	(trpt+1)->sched_limit = trpt->sched_limit;",
342900d97012SDavid du Colombier 	"	#ifdef VERBOSE",
343000d97012SDavid du Colombier 	"		printf(\"%%3ld: keep sched count at %%d\\n\", depth, (trpt+1)->sched_limit);",
343100d97012SDavid du Colombier 	"	#endif",
343200d97012SDavid du Colombier 	"			}",
343300d97012SDavid du Colombier 	"#endif",
3434219b2ee8SDavid du Colombier 	"			if (boq == -1)",
34357dd7cddfSDavid du Colombier 		"#ifdef CTL",
34367dd7cddfSDavid du Colombier 	"	/* for branching-time, can accept reduction only if */",
34377dd7cddfSDavid du Colombier 	"	/* the persistent set contains just 1 transition */",
34387dd7cddfSDavid du Colombier 	"			{	if ((trpt->tau&32) && (trpt->o_pm&1))",
343900d97012SDavid du Colombier 	"					trpt->tau |= 16;",	/* CTL */
3440219b2ee8SDavid du Colombier 	"				trpt->o_pm |= 1; /* we moved */",
34417dd7cddfSDavid du Colombier 	"			}",
34427dd7cddfSDavid du Colombier 		"#else",
34437dd7cddfSDavid du Colombier 	"				trpt->o_pm |= 1; /* we moved */",
34447dd7cddfSDavid du Colombier 		"#endif",
344500d97012SDavid du Colombier 
344600d97012SDavid du Colombier 	"#ifdef LOOPSTATE",
344700d97012SDavid du Colombier 	"			if (loopstate[ot][tt])",
344800d97012SDavid du Colombier 	"			{",
344900d97012SDavid du Colombier 		"#ifdef VERBOSE",
345000d97012SDavid du Colombier 	"				printf(\"exiting from loopstate:\\n\");",
345100d97012SDavid du Colombier 		"#endif",
345200d97012SDavid du Colombier 	"				trpt->tau |= 16;",	/* exiting loopstate */
345300d97012SDavid du Colombier 	"				cnt_loops++;",
345400d97012SDavid du Colombier 	"			}",
345500d97012SDavid du Colombier 	"#endif",
345600d97012SDavid du Colombier 
3457219b2ee8SDavid du Colombier 	"#ifdef PEG",
3458219b2ee8SDavid du Colombier 	"			peg[t->forw]++;",
3459219b2ee8SDavid du Colombier 	"#endif",
3460219b2ee8SDavid du Colombier 	"#if defined(VERBOSE) || defined(CHECK)",
34617dd7cddfSDavid du Colombier 		"#if defined(SVDUMP)",
346200d97012SDavid du Colombier 	"	cpu_printf(\"%%3ld: proc %%d exec %%d \\n\", depth, II, t->t_id);",
34637dd7cddfSDavid du Colombier 		"#else",
346400d97012SDavid du Colombier 	"	cpu_printf(\"%%3ld: proc %%d exec %%d, %%d to %%d, %%s %%s %%s %%saccepting [tau=%%d]\\n\", ",
346500d97012SDavid du Colombier 	"				depth, II, t->forw, tt, t->st, t->tp,",
3466219b2ee8SDavid du Colombier 	"				(t->atom&2)?\"atomic\":\"\",",
346700d97012SDavid du Colombier 	"				(boq != -1)?\"rendez-vous\":\"\",",
346800d97012SDavid du Colombier 	"				(trpt->o_pm&2)?\"\":\"non-\", trpt->tau);",
3469219b2ee8SDavid du Colombier 		"#ifdef HAS_UNLESS",
34707dd7cddfSDavid du Colombier 	"			if (t->e_trans)",
347100d97012SDavid du Colombier 	"			cpu_printf(\"\\t(escape to state %%d)\\n\", t->st);",
3472219b2ee8SDavid du Colombier 		"#endif",
3473219b2ee8SDavid du Colombier 		"#endif",
347400d97012SDavid du Colombier 		"#ifdef T_RAND",
347500d97012SDavid du Colombier 	"			cpu_printf(\"\\t(randomizer %%d)\\n\", ooi);",
3476312a1df1SDavid du Colombier 		"#endif",
34777dd7cddfSDavid du Colombier 	"#endif",
3478219b2ee8SDavid du Colombier 
3479219b2ee8SDavid du Colombier 	"#ifdef HAS_LAST",
3480219b2ee8SDavid du Colombier 	"#ifdef VERI",
34817dd7cddfSDavid du Colombier 	"			if (II != 0)",
3482219b2ee8SDavid du Colombier 	"#endif",
34837dd7cddfSDavid du Colombier 	"				now._last = II - BASE;",
3484219b2ee8SDavid du Colombier 	"#endif",
3485219b2ee8SDavid du Colombier 	"#ifdef HAS_UNLESS",
3486219b2ee8SDavid du Colombier 	"			trpt->e_state = t->e_trans;",
3487219b2ee8SDavid du Colombier 	"#endif",
3488219b2ee8SDavid du Colombier 
3489219b2ee8SDavid du Colombier 	"			depth++; trpt++;",
3490312a1df1SDavid du Colombier 	"			trpt->pr = (uchar) II;",
3491219b2ee8SDavid du Colombier 	"			trpt->st = tt;",
3492219b2ee8SDavid du Colombier 	"			trpt->o_pm &= ~(2|4);",
3493219b2ee8SDavid du Colombier 	"			if (t->st > 0)",
3494*de2caf28SDavid du Colombier 	"			{	((P0 *)_this)->_p = t->st;",
34957dd7cddfSDavid du Colombier 	"/*	moved down		reached[ot][t->st] = 1; */",
3496219b2ee8SDavid du Colombier 	"			}",
34977dd7cddfSDavid du Colombier 	"#ifndef SAFETY",
34987dd7cddfSDavid du Colombier 	"			if (a_cycles)",
3499312a1df1SDavid du Colombier 	"			{",
3500312a1df1SDavid du Colombier 		"#if (ACCEPT_LAB>0 && !defined(NP)) || (PROG_LAB>0 && defined(HAS_NP))",
3501312a1df1SDavid du Colombier 	"				int ii;",
3502312a1df1SDavid du Colombier 		"#endif",
3503312a1df1SDavid du Colombier 		"#define P__Q	((P0 *)pptr(ii))",
3504219b2ee8SDavid du Colombier 		"#if ACCEPT_LAB>0",
35057dd7cddfSDavid du Colombier 			"#ifdef NP",
35067dd7cddfSDavid du Colombier 	"				/* state 1 of np_ claim is accepting */",
35077dd7cddfSDavid du Colombier 	"				if (((P0 *)pptr(0))->_p == 1)",
35087dd7cddfSDavid du Colombier 	"					trpt->o_pm |= 2;",
35097dd7cddfSDavid du Colombier 			"#else",
35107dd7cddfSDavid du Colombier 	"				for (ii = 0; ii < (int) now._nr_pr; ii++)",
3511312a1df1SDavid du Colombier 	"				{ if (accpstate[P__Q->_t][P__Q->_p])",
3512219b2ee8SDavid du Colombier 	"				  {	trpt->o_pm |= 2;",
3513219b2ee8SDavid du Colombier 	"					break;",
3514219b2ee8SDavid du Colombier 	"			   	} }",
3515219b2ee8SDavid du Colombier 			"#endif",
35167dd7cddfSDavid du Colombier 		"#endif",
35177dd7cddfSDavid du Colombier 		"#if defined(HAS_NP) && PROG_LAB>0",
35187dd7cddfSDavid du Colombier 	"				for (ii = 0; ii < (int) now._nr_pr; ii++)",
3519312a1df1SDavid du Colombier 	"				{ if (progstate[P__Q->_t][P__Q->_p])",
3520219b2ee8SDavid du Colombier 	"				  {	trpt->o_pm |= 4;",
3521219b2ee8SDavid du Colombier 	"					break;",
3522219b2ee8SDavid du Colombier 	"			   	} }",
3523219b2ee8SDavid du Colombier 		"#endif",
3524312a1df1SDavid du Colombier 		"#undef P__Q",
3525219b2ee8SDavid du Colombier 	"			}",
35267dd7cddfSDavid du Colombier 	"#endif",
3527312a1df1SDavid du Colombier 	"			trpt->o_t  =  t; trpt->o_n  = _n;",
3528219b2ee8SDavid du Colombier 	"			trpt->o_ot = ot; trpt->o_tt = tt;",
3529312a1df1SDavid du Colombier 	"			trpt->o_To = To; trpt->o_m  = _m;",
3530219b2ee8SDavid du Colombier 	"			trpt->tau = 0;",
3531*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
3532*de2caf28SDavid du Colombier 	"			if (reversing&2)",
3533*de2caf28SDavid du Colombier 	"			{	trpt->seed = seed;",
3534*de2caf28SDavid du Colombier 	"				trpt->oII  = oII;",
3535*de2caf28SDavid du Colombier 	"			}",
3536*de2caf28SDavid du Colombier 	"#endif",
353700d97012SDavid du Colombier 
3538*de2caf28SDavid du Colombier 	"#if defined(T_RAND) && !defined(BFS)",
3539312a1df1SDavid du Colombier 	"			trpt->oo_i = ooi;",
3540312a1df1SDavid du Colombier 	"#endif",
3541219b2ee8SDavid du Colombier 	"			if (boq != -1 || (t->atom&2))",
3542219b2ee8SDavid du Colombier 	"			{	trpt->tau |= 8;",
3543219b2ee8SDavid du Colombier 	"#ifdef VERI",
3544219b2ee8SDavid du Colombier 	"				/* atomic sequence in claim */",
3545219b2ee8SDavid du Colombier 	"				if((trpt-1)->tau&4)",
3546219b2ee8SDavid du Colombier 	"					trpt->tau |= 4;",
3547219b2ee8SDavid du Colombier 	"				else",
3548219b2ee8SDavid du Colombier 	"					trpt->tau &= ~4;",
3549219b2ee8SDavid du Colombier 	"			} else",
3550219b2ee8SDavid du Colombier 	"			{	if ((trpt-1)->tau&4)",
3551219b2ee8SDavid du Colombier 	"					trpt->tau &= ~4;",
3552219b2ee8SDavid du Colombier 	"				else",
3553219b2ee8SDavid du Colombier 	"					trpt->tau |= 4;",
3554219b2ee8SDavid du Colombier 	"			}",
35557dd7cddfSDavid du Colombier 	"			/* if claim allowed timeout, so */",
3556219b2ee8SDavid du Colombier 	"			/* does the next program-step: */",
3557219b2ee8SDavid du Colombier 	"			if (((trpt-1)->tau&1) && !(trpt->tau&4))",
3558219b2ee8SDavid du Colombier 	"				trpt->tau |= 1;",
3559219b2ee8SDavid du Colombier 	"#else",
3560219b2ee8SDavid du Colombier 	"			} else",
3561219b2ee8SDavid du Colombier 	"				trpt->tau &= ~8;",
3562219b2ee8SDavid du Colombier 	"#endif",
3563219b2ee8SDavid du Colombier 	"			if (boq == -1 && (t->atom&2))",
3564219b2ee8SDavid du Colombier 	"			{	From = To = II; nlinks++;",
3565219b2ee8SDavid du Colombier 	"			} else",
356600d97012SDavid du Colombier 	"			{	From = FROM_P; To = UPTO_P;",
3567219b2ee8SDavid du Colombier 	"			}",
356800d97012SDavid du Colombier 	"#if NCORE>1 && defined(FULL_TRAIL)",
356900d97012SDavid du Colombier 	"			if (upto > 0)",
357000d97012SDavid du Colombier 	"			{	Push_Stack_Tree(II, t->t_id);",
357100d97012SDavid du Colombier 	"			}",
357200d97012SDavid du Colombier 	"#endif",
357300d97012SDavid du Colombier 	"#ifdef TRIX",
357400d97012SDavid du Colombier 	"			if (processes[II])", /* last move could have been a delproc */
357500d97012SDavid du Colombier 	"			{	processes[II]->modified = 1; /* transition in II */",
357600d97012SDavid du Colombier 	"	#ifdef V_TRIX",
357700d97012SDavid du Colombier 	"				printf(\"%%4d: process %%d modified\\n\", depth, II);",
357800d97012SDavid du Colombier 	"			} else",
357900d97012SDavid du Colombier 	"			{	printf(\"%%4d: process %%d modified but gone (%%p)\\n\",",
358000d97012SDavid du Colombier 	"					depth, II, trpt);",
358100d97012SDavid du Colombier 	"	#endif",
358200d97012SDavid du Colombier 	"			}",
358300d97012SDavid du Colombier 	"#endif",
3584219b2ee8SDavid du Colombier 	"			goto Down;	/* pseudo-recursion */",
3585219b2ee8SDavid du Colombier 	"Up:",
358600d97012SDavid du Colombier 	"#ifdef TRIX",
358700d97012SDavid du Colombier 	"	#ifndef TRIX_ORIG",
358800d97012SDavid du Colombier 	"		#ifndef BFS",
358900d97012SDavid du Colombier 	"			now._ids_[trpt->pr] = trpt->p_bup;",
359000d97012SDavid du Colombier 	"		#endif",
359100d97012SDavid du Colombier 	"	#else",
359200d97012SDavid du Colombier 	"			if (processes[trpt->pr])",
359300d97012SDavid du Colombier 	"			{",
359400d97012SDavid du Colombier 	"				processes[trpt->pr]->modified = 1; /* reverse move */",
359500d97012SDavid du Colombier 	"		#ifdef V_TRIX",
359600d97012SDavid du Colombier 	"				printf(\"%%4d: unmodify pr %%d (%%p)\\n\",",
359700d97012SDavid du Colombier 	"					depth, trpt->pr, trpt);",
359800d97012SDavid du Colombier 	"			} else",
359900d97012SDavid du Colombier 	"			{	printf(\"%%4d: unmodify pr %%d (gone) (%%p)\\n\",",
360000d97012SDavid du Colombier 	"					depth, trpt->pr, trpt);",
360100d97012SDavid du Colombier 	"		#endif",
360200d97012SDavid du Colombier 	"			}",
360300d97012SDavid du Colombier 	"	#endif",
360400d97012SDavid du Colombier 	"#endif",
3605219b2ee8SDavid du Colombier 	"#ifdef CHECK",
360600d97012SDavid du Colombier 	"			cpu_printf(\"%%d: Up - %%s\\n\", depth,",
3607219b2ee8SDavid du Colombier 	"				(trpt->tau&4)?\"claim\":\"program\");",
3608219b2ee8SDavid du Colombier 	"#endif",
360900d97012SDavid du Colombier 	"#if NCORE>1",
361000d97012SDavid du Colombier 	"			iam_alive();",
361100d97012SDavid du Colombier 	"	#ifdef USE_DISK",
361200d97012SDavid du Colombier 	"			mem_drain();",
361300d97012SDavid du Colombier 	"	#endif",
361400d97012SDavid du Colombier 	"#endif",
361500d97012SDavid du Colombier 	"#if defined(MA) || NCORE>1",
36167dd7cddfSDavid du Colombier 	"			if (depth <= 0) return;",
36177dd7cddfSDavid du Colombier 	"			/* e.g., if first state is old, after a restart */",
36187dd7cddfSDavid du Colombier 	"#endif",
3619219b2ee8SDavid du Colombier 
36207dd7cddfSDavid du Colombier 	"#ifdef SC",
36217dd7cddfSDavid du Colombier 	"			if (CNT1 > CNT2",
362200d97012SDavid du Colombier 	"			&& depth < hiwater - (HHH-DDD) - 2)",	/* 5.1.6: was + 2 */
36237dd7cddfSDavid du Colombier 	"			{",
36247dd7cddfSDavid du Colombier 	" 				trpt += DDD;",
36257dd7cddfSDavid du Colombier 	"				disk2stack();",
36267dd7cddfSDavid du Colombier 	"				maxdepth -= DDD;",
36277dd7cddfSDavid du Colombier 	"				hiwater -= DDD;",
36287dd7cddfSDavid du Colombier 	"				if(verbose)",
3629*de2caf28SDavid du Colombier 	"				printf(\"unzap %%ld: %%ld\\n\", CNT2, hiwater);",
36307dd7cddfSDavid du Colombier 	"			}",
36317dd7cddfSDavid du Colombier 	"#endif",
36327dd7cddfSDavid du Colombier 
363300d97012SDavid du Colombier 	"#ifndef SAFETY",	/* moved earlier in version 5.2.5 */
363400d97012SDavid du Colombier 	"			if ((now._a_t&1) && depth <= A_depth)",
363500d97012SDavid du Colombier 	"				return;	/* to checkcycles() */",
363600d97012SDavid du Colombier 	"#endif",
363700d97012SDavid du Colombier 
36387dd7cddfSDavid du Colombier 	"#ifndef NOFAIR",
3639219b2ee8SDavid du Colombier 	"			if (trpt->o_pm&128)	/* fairness alg */",
36407dd7cddfSDavid du Colombier 	"			{	now._cnt[now._a_t&1] = trpt->bup.oval;",
3641312a1df1SDavid du Colombier 	"				_n = 1; trpt->o_pm &= ~128;",
3642219b2ee8SDavid du Colombier 	"				depth--; trpt--;",
3643219b2ee8SDavid du Colombier 		"#if defined(VERBOSE) || defined(CHECK)",
364400d97012SDavid du Colombier 	"	printf(\"%%3ld: reversed fairness default move\\n\", depth);",
3645219b2ee8SDavid du Colombier 		"#endif",
3646219b2ee8SDavid du Colombier 	"				goto Q999;",
3647219b2ee8SDavid du Colombier 	"			}",
36487dd7cddfSDavid du Colombier 	"#endif",
3649219b2ee8SDavid du Colombier 
3650219b2ee8SDavid du Colombier 	"#ifdef HAS_LAST",
3651219b2ee8SDavid du Colombier 	"#ifdef VERI",
3652*de2caf28SDavid du Colombier 	"			{ long d; Trail *trl;",
3653219b2ee8SDavid du Colombier 	"			  now._last = 0;",
36547dd7cddfSDavid du Colombier 	"			  for (d = 1; d < depth; d++)",
36557dd7cddfSDavid du Colombier 	"			  {	trl = getframe(depth-d); /* was (trpt-d) */",
36567dd7cddfSDavid du Colombier 	"				if (trl->pr != 0)",
36577dd7cddfSDavid du Colombier 	"				{ now._last = trl->pr - BASE;",
36587dd7cddfSDavid du Colombier 	"				  break;",
36597dd7cddfSDavid du Colombier 	"			} }	}",
3660219b2ee8SDavid du Colombier 	"#else",
36617dd7cddfSDavid du Colombier 	"			now._last = (depth<1)?0:(trpt-1)->pr;",
3662219b2ee8SDavid du Colombier 	"#endif",
3663219b2ee8SDavid du Colombier 	"#endif",
36647dd7cddfSDavid du Colombier 	"#ifdef EVENT_TRACE",
36657dd7cddfSDavid du Colombier 	"			now._event = trpt->o_event;",
36667dd7cddfSDavid du Colombier 	"#endif",
3667312a1df1SDavid du Colombier 	"			t  = trpt->o_t;  _n = trpt->o_n;",
3668219b2ee8SDavid du Colombier 	"			ot = trpt->o_ot; II = trpt->pr;",
3669*de2caf28SDavid du Colombier 	"			tt = trpt->o_tt; _this = Pptr(II);",
3670312a1df1SDavid du Colombier 	"			To = trpt->o_To; _m  = trpt->o_m;",
3671*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
3672*de2caf28SDavid du Colombier 	"			if (reversing&2)",
3673*de2caf28SDavid du Colombier 	"			{	seed = trpt->seed;",
3674*de2caf28SDavid du Colombier 	"				oII  = trpt->oII;",
3675*de2caf28SDavid du Colombier 	"			}",
3676*de2caf28SDavid du Colombier 	"#endif",
3677*de2caf28SDavid du Colombier 	"#if defined(T_RAND) && !defined(BFS)",
3678312a1df1SDavid du Colombier 	"			ooi = trpt->oo_i;",
3679312a1df1SDavid du Colombier 	"#endif",
36807dd7cddfSDavid du Colombier 	"#ifdef INLINE_REV",
3681312a1df1SDavid du Colombier 	"			_m = do_reverse(t, II, _m);",
36827dd7cddfSDavid du Colombier 	"#else",
3683*de2caf28SDavid du Colombier 	"#include BACKWARD_MOVES",
3684219b2ee8SDavid du Colombier 	"R999:			/* jumps here when done */",
36857dd7cddfSDavid du Colombier 	"#endif",
3686219b2ee8SDavid du Colombier 
3687219b2ee8SDavid du Colombier 	"#ifdef VERBOSE",
368800d97012SDavid du Colombier 	"			cpu_printf(\"%%3ld: proc %%d reverses %%d, %%d to %%d\\n\",",
368900d97012SDavid du Colombier 	"				depth, II, t->forw, tt, t->st);",
3690*de2caf28SDavid du Colombier 	"			cpu_printf(\"\\t%%s [abit=%%d,adepth=%%ld,tau=%%d,%%d]\\n\", ",
369100d97012SDavid du Colombier 	"				t->tp, now._a_t, A_depth, trpt->tau, (trpt-1)->tau);",
3692219b2ee8SDavid du Colombier 	"#endif",
36937dd7cddfSDavid du Colombier 	"#ifndef NOREDUCE",
3694219b2ee8SDavid du Colombier 	"			/* pass the proviso tags */",
3695219b2ee8SDavid du Colombier 	"			if ((trpt->tau&8)	/* rv or atomic */",
3696219b2ee8SDavid du Colombier 	"			&&  (trpt->tau&16))",
369700d97012SDavid du Colombier 	"				(trpt-1)->tau |= 16;",	/* pass upward */
36987dd7cddfSDavid du Colombier 	"	#ifdef SAFETY",
3699219b2ee8SDavid du Colombier 	"			if ((trpt->tau&8)	/* rv or atomic */",
3700219b2ee8SDavid du Colombier 	"			&&  (trpt->tau&64))",
3701219b2ee8SDavid du Colombier 	"				(trpt-1)->tau |= 64;",
3702219b2ee8SDavid du Colombier 	"	#endif",
3703219b2ee8SDavid du Colombier 	"#endif",
370400d97012SDavid du Colombier 
370500d97012SDavid du Colombier 	"#if defined(BCS) && (defined(NOREDUCE) || !defined(SAFETY))",
370600d97012SDavid du Colombier 	/* for BCS, cover cases where 64 is otherwise not handled */
370700d97012SDavid du Colombier 	"			if ((trpt->tau&8)",
370800d97012SDavid du Colombier 	"			&&  (trpt->tau&64))",
370900d97012SDavid du Colombier 	"				(trpt-1)->tau |= 64;",
371000d97012SDavid du Colombier 	"#endif",
371100d97012SDavid du Colombier 
3712219b2ee8SDavid du Colombier 	"			depth--; trpt--;",
371300d97012SDavid du Colombier 	"",
371400d97012SDavid du Colombier 	"#ifdef NSUCC",
371500d97012SDavid du Colombier 	"			trpt->n_succ++;",
371600d97012SDavid du Colombier 	"#endif",
3717219b2ee8SDavid du Colombier 	"#ifdef NIBIS",
3718312a1df1SDavid du Colombier 	"			(trans[ot][tt])->om = _m; /* head of list */",
3719219b2ee8SDavid du Colombier 	"#endif",
37207dd7cddfSDavid du Colombier 
37217dd7cddfSDavid du Colombier 	"			/* i.e., not set if rv fails */",
3722312a1df1SDavid du Colombier 	"			if (_m)",
372300d97012SDavid du Colombier 	"			{	reached[ot][t->st] = 1;",
3724312a1df1SDavid du Colombier 	"				reached[ot][tt] = 1;",
37257dd7cddfSDavid du Colombier 	"			}",
37267dd7cddfSDavid du Colombier 	"#ifdef HAS_UNLESS",
37277dd7cddfSDavid du Colombier 	"			else trpt->e_state = 0; /* undo */",
37287dd7cddfSDavid du Colombier 	"#endif",
37297dd7cddfSDavid du Colombier 
3730312a1df1SDavid du Colombier 	"			if (_m>_n||(_n>3&&_m!=0)) _n=_m;",
3731*de2caf28SDavid du Colombier 	"			((P0 *)_this)->_p = tt;",
3732219b2ee8SDavid du Colombier 	"		} /* all options */",
3733219b2ee8SDavid du Colombier 
373400d97012SDavid du Colombier 	"#ifdef T_RAND",
3735312a1df1SDavid du Colombier 	"		if (!t && ooi > 0)",	/* means we skipped some initial options */
3736312a1df1SDavid du Colombier 	"		{	t = trans[ot][tt];",
3737312a1df1SDavid du Colombier 	"	#ifdef VERBOSE",
3738312a1df1SDavid du Colombier 	"			printf(\"randomizer: continue for %%d more\\n\", ooi);",
3739312a1df1SDavid du Colombier 	"	#endif",
374000d97012SDavid du Colombier 	"			goto domore;",
3741312a1df1SDavid du Colombier 	"		}",
3742312a1df1SDavid du Colombier 	"	#ifdef VERBOSE",
3743312a1df1SDavid du Colombier 	"		  else",
3744312a1df1SDavid du Colombier 	"			printf(\"randomizer: done\\n\");",
3745312a1df1SDavid du Colombier 	"	#endif",
3746312a1df1SDavid du Colombier 	"#endif",
3747312a1df1SDavid du Colombier 
37487dd7cddfSDavid du Colombier 	"#ifndef NOFAIR",
3749219b2ee8SDavid du Colombier 	"		/* Fairness: undo Rule 2 */",
3750219b2ee8SDavid du Colombier 	"		if ((trpt->o_pm&32)",/* rule 2 was applied */
3751219b2ee8SDavid du Colombier 	"		&&  (trpt->o_pm&64))",/* by this process II */
3752219b2ee8SDavid du Colombier 	"		{	if (trpt->o_pm&1)",/* it didn't block */
3753219b2ee8SDavid du Colombier 	"			{",
3754219b2ee8SDavid du Colombier 		"#ifdef VERI",
375500d97012SDavid du Colombier 	"				if (now._cnt[now._a_t&1] == 1)",
375600d97012SDavid du Colombier 	"					now._cnt[now._a_t&1] = 2;",
3757219b2ee8SDavid du Colombier 		"#endif",
3758219b2ee8SDavid du Colombier 	"				now._cnt[now._a_t&1] += 1;",
3759219b2ee8SDavid du Colombier 		"#ifdef VERBOSE",
376000d97012SDavid du Colombier 	"		printf(\"%%3ld: proc %%d fairness \", depth, II);",
37617dd7cddfSDavid du Colombier 	"		printf(\"undo Rule 2, cnt=%%d, _a_t=%%d\\n\",",
37627dd7cddfSDavid du Colombier 	"			now._cnt[now._a_t&1], now._a_t);",
3763219b2ee8SDavid du Colombier 		"#endif",
3764219b2ee8SDavid du Colombier 	"				trpt->o_pm &= ~(32|64);",
37657dd7cddfSDavid du Colombier 	"			} else",	/* process blocked  */
3766312a1df1SDavid du Colombier 	"			{	if (_n > 0)", /* a prev proc didn't */
3767219b2ee8SDavid du Colombier 	"				{",	/* start over */
3768219b2ee8SDavid du Colombier 	"					trpt->o_pm &= ~64;",
376900d97012SDavid du Colombier 	"					II = INI_P;", /* after loop incr II == From */
3770219b2ee8SDavid du Colombier 	"		}	}	}",
37717dd7cddfSDavid du Colombier 	"#endif",
3772219b2ee8SDavid du Colombier 	"#ifdef VERI",
3773*de2caf28SDavid du Colombier 	"		if (II == 0)",
3774*de2caf28SDavid du Colombier 	"		{	break;	/* never claim */",
3775*de2caf28SDavid du Colombier 	"		}",
3776219b2ee8SDavid du Colombier 	"#endif",
3777*de2caf28SDavid du Colombier 	"		CONTINUE;",
3778*de2caf28SDavid du Colombier 	"	} /* ALL_P */",
3779219b2ee8SDavid du Colombier 
378000d97012SDavid du Colombier 	"#ifdef NSUCC",
378100d97012SDavid du Colombier 	"	tally_succ(trpt->n_succ);",
378200d97012SDavid du Colombier 	"#endif",
378300d97012SDavid du Colombier 
378400d97012SDavid du Colombier 	"#ifdef P_RAND",
3785*de2caf28SDavid du Colombier 	"	if (trpt->p_left > 0 && NDONE_P)",
378600d97012SDavid du Colombier 	"	{	trpt->p_skip = -1; /* probably rendundant */",
378700d97012SDavid du Colombier 	"	#ifdef VERBOSE",
378800d97012SDavid du Colombier 	"		printf(\"%%3ld: P_RAND -- explore remainder\\n\", depth);",
378900d97012SDavid du Colombier 	"	#endif",
379000d97012SDavid du Colombier 	"		goto r_switch; /* explore the remaining procs */",
379100d97012SDavid du Colombier 	"	} else",
379200d97012SDavid du Colombier 	"	{",
379300d97012SDavid du Colombier 	"	#ifdef VERBOSE",
379400d97012SDavid du Colombier 	"		printf(\"%%3ld: P_RAND -- none left\\n\", depth);",
379500d97012SDavid du Colombier 	"	#endif",
379600d97012SDavid du Colombier 	"	}",
379700d97012SDavid du Colombier 	"#endif",
379800d97012SDavid du Colombier 
379900d97012SDavid du Colombier 	"#ifdef BCS",
380000d97012SDavid du Colombier 	"	if (trpt->bcs & B_PHASE1)",
380100d97012SDavid du Colombier 	"	{	trpt->bcs = B_PHASE2;	/* start 2nd phase */",
380200d97012SDavid du Colombier 	"		if (_n == 0 || !(trpt->tau&64))	/* pre-move unexecutable or led to stackstate */",
380300d97012SDavid du Colombier 	"		{	trpt->bcs |= B_FORCED; /* forced switch */",
380400d97012SDavid du Colombier 	"		}",
380500d97012SDavid du Colombier 	"	#ifdef VERBOSE",
380600d97012SDavid du Colombier 	"		printf(\"%%3ld: BCS move to phase 2, _n=%%d %%s\\n\", depth, _n,",
380700d97012SDavid du Colombier 	"			(trpt->bcs & B_FORCED)?\"forced\":\"free\");",
380800d97012SDavid du Colombier 	"	#endif",
380900d97012SDavid du Colombier 	"		From = FROM_P; To = UPTO_P;",
381000d97012SDavid du Colombier 	"		goto c_switch;",
381100d97012SDavid du Colombier 	"	}",
381200d97012SDavid du Colombier 	"",
381300d97012SDavid du Colombier 	"	if (_n == 0	/* no process could move */",
381400d97012SDavid du Colombier 	"	&&  II >= BASE	/* not the never claim */",
381500d97012SDavid du Colombier 	"	&&  trpt->sched_limit >= sched_max)",
381600d97012SDavid du Colombier 	"	{	_n = 1;",
381700d97012SDavid du Colombier 	"	#ifdef VERBOSE",
381800d97012SDavid du Colombier 	"		printf(\"%%3ld: BCS not a deadlock\\n\", depth);",
381900d97012SDavid du Colombier 	"	#endif",
382000d97012SDavid du Colombier 	"	}",
382100d97012SDavid du Colombier 	"#endif",
382200d97012SDavid du Colombier 
38237dd7cddfSDavid du Colombier 	"#ifndef NOFAIR",
3824219b2ee8SDavid du Colombier 	"	/* Fairness: undo Rule 2 */",
3825219b2ee8SDavid du Colombier 	"	if (trpt->o_pm&32)	/* remains if proc blocked */",
3826219b2ee8SDavid du Colombier 	"	{",
3827219b2ee8SDavid du Colombier 		"#ifdef VERI",
382800d97012SDavid du Colombier 	"		if (now._cnt[now._a_t&1] == 1)",
382900d97012SDavid du Colombier 	"			now._cnt[now._a_t&1] = 2;",
3830219b2ee8SDavid du Colombier 		"#endif",
3831219b2ee8SDavid du Colombier 	"		now._cnt[now._a_t&1] += 1;",
3832219b2ee8SDavid du Colombier 		"#ifdef VERBOSE",
383300d97012SDavid du Colombier 	"		printf(\"%%3ld: proc -- fairness \", depth);",
38347dd7cddfSDavid du Colombier 	"		printf(\"undo Rule 2, cnt=%%d, _a_t=%%d\\n\",",
38357dd7cddfSDavid du Colombier 	"			now._cnt[now._a_t&1], now._a_t);",
3836219b2ee8SDavid du Colombier 		"#endif",
3837219b2ee8SDavid du Colombier 	"		trpt->o_pm &= ~32;",
3838219b2ee8SDavid du Colombier 	"	}",
38397dd7cddfSDavid du Colombier 	"#ifndef NP",
38407dd7cddfSDavid du Colombier 	/* 12/97 non-progress cycles cannot be created
38417dd7cddfSDavid du Colombier 	 * by stuttering extension, here or elsewhere
38427dd7cddfSDavid du Colombier 	 */
3843219b2ee8SDavid du Colombier 	"	if (fairness",
3844312a1df1SDavid du Colombier 	"	&&  _n == 0		/* nobody moved */",
3845219b2ee8SDavid du Colombier 		"#ifdef VERI",
3846219b2ee8SDavid du Colombier 		"	&& !(trpt->tau&4)	/* in program move */",
3847219b2ee8SDavid du Colombier 		"#endif",
3848219b2ee8SDavid du Colombier 	"	&& !(trpt->tau&8)	/* not an atomic one */",
3849219b2ee8SDavid du Colombier 		"#ifdef ETIM",
38507dd7cddfSDavid du Colombier 		"	&&  (trpt->tau&1)	/* already tried timeout */",
3851219b2ee8SDavid du Colombier 		"#endif",
38527dd7cddfSDavid du Colombier 		"#ifndef NOREDUCE",
38537dd7cddfSDavid du Colombier 		"	/* see below  */",
3854312a1df1SDavid du Colombier 		"	&& !((trpt->tau&32) && (_n == 0 || (trpt->tau&16)))",
3855219b2ee8SDavid du Colombier 		"#endif",
38567dd7cddfSDavid du Colombier 	"	&& now._cnt[now._a_t&1] > 0)	/* needed more procs */",
3857219b2ee8SDavid du Colombier 	"	{	depth++; trpt++;",
3858219b2ee8SDavid du Colombier 	"		trpt->o_pm |= 128 | ((trpt-1)->o_pm&(2|4));",
38597dd7cddfSDavid du Colombier 	"		trpt->bup.oval = now._cnt[now._a_t&1];",
3860312a1df1SDavid du Colombier 	"		now._cnt[now._a_t&1] = 1;",
3861219b2ee8SDavid du Colombier 		"#ifdef VERI",
3862219b2ee8SDavid du Colombier 	"		trpt->tau = 4;",
3863219b2ee8SDavid du Colombier 		"#else",
3864219b2ee8SDavid du Colombier 	"		trpt->tau = 0;",
3865219b2ee8SDavid du Colombier 		"#endif",
386600d97012SDavid du Colombier 	"		From = FROM_P; To = UPTO_P;",
3867219b2ee8SDavid du Colombier 		"#if defined(VERBOSE) || defined(CHECK)",
386800d97012SDavid du Colombier 	"		printf(\"%%3ld: fairness default move \", depth);",
38697dd7cddfSDavid du Colombier 	"		printf(\"(all procs block)\\n\");",
3870219b2ee8SDavid du Colombier 		"#endif",
3871219b2ee8SDavid du Colombier 	"		goto Down;",
3872219b2ee8SDavid du Colombier 	"	}",
38737dd7cddfSDavid du Colombier 	"#endif",
3874312a1df1SDavid du Colombier 	"Q999:	/* returns here with _n>0 when done */;",
3875219b2ee8SDavid du Colombier 
3876219b2ee8SDavid du Colombier 	"	if (trpt->o_pm&8)",
3877219b2ee8SDavid du Colombier 	"	{	now._a_t &= ~2;",
3878219b2ee8SDavid du Colombier 	"		now._cnt[now._a_t&1] = 0;",
3879219b2ee8SDavid du Colombier 	"		trpt->o_pm &= ~8;",
3880219b2ee8SDavid du Colombier 		"#ifdef VERBOSE",
388100d97012SDavid du Colombier 	"		printf(\"%%3ld: fairness undo Rule 1, _a_t=%%d\\n\",",
3882219b2ee8SDavid du Colombier 	"			depth, now._a_t);",
3883219b2ee8SDavid du Colombier 		"#endif",
3884219b2ee8SDavid du Colombier 	"	}",
3885219b2ee8SDavid du Colombier 	"	if (trpt->o_pm&16)",
38867dd7cddfSDavid du Colombier 	"	{	now._a_t |= 2;",		/* restore a-bit */
38877dd7cddfSDavid du Colombier 	"		now._cnt[now._a_t&1] = 1;",	/* NEW: restore cnt */
3888219b2ee8SDavid du Colombier 	"		trpt->o_pm &= ~16;",
3889219b2ee8SDavid du Colombier 		"#ifdef VERBOSE",
389000d97012SDavid du Colombier 	"		printf(\"%%3ld: fairness undo Rule 3, _a_t=%%d\\n\",",
3891219b2ee8SDavid du Colombier 	"			depth, now._a_t);",
3892219b2ee8SDavid du Colombier 		"#endif",
3893219b2ee8SDavid du Colombier 	"	}",
3894219b2ee8SDavid du Colombier 	"#endif",
38957dd7cddfSDavid du Colombier 
38967dd7cddfSDavid du Colombier 	"#ifndef NOREDUCE",
38977dd7cddfSDavid du Colombier "#ifdef SAFETY",
389800d97012SDavid du Colombier 	"	#ifdef LOOPSTATE",
389900d97012SDavid du Colombier 	"	  /* at least one move that was preselected at this */",
390000d97012SDavid du Colombier 	"	  /* level, blocked or was a loop control flow point */",
390100d97012SDavid du Colombier 	"	  if ((trpt->tau&32) && (_n == 0 || (trpt->tau&16)))",
390200d97012SDavid du Colombier 	"	#else",
39037dd7cddfSDavid du Colombier 	"	  /* preselected move - no successors outside stack */",
39047dd7cddfSDavid du Colombier 	"	  if ((trpt->tau&32) && !(trpt->tau&64))",
390500d97012SDavid du Colombier 	"	#endif",
3906*de2caf28SDavid du Colombier 	"	  {	From = FROM_P; To = UPTO_P; /* undo From == To */",
3907219b2ee8SDavid du Colombier 	"	#ifdef DEBUG",
390800d97012SDavid du Colombier 	"		printf(\"%%3ld: proc %%d UnSelected (_n=%%d, tau=%%d)\\n\", ",
3909312a1df1SDavid du Colombier 	"			depth, II+1, _n, trpt->tau);",
3910219b2ee8SDavid du Colombier 	"	#endif",
3911312a1df1SDavid du Colombier 	"		_n = 0; trpt->tau &= ~(16|32|64);",
391200d97012SDavid du Colombier 
3913*de2caf28SDavid du Colombier 	"		if (MORE_P)	/* II already restored and updated */",
3914*de2caf28SDavid du Colombier 	"		{	goto Resume;",
3915*de2caf28SDavid du Colombier 	"		} else",
3916*de2caf28SDavid du Colombier 	"		{	goto Again;",
3917*de2caf28SDavid du Colombier 	"	  }	}",
39187dd7cddfSDavid du Colombier "#else",
39197dd7cddfSDavid du Colombier 	"	/* at least one move that was preselected at this */",
39207dd7cddfSDavid du Colombier 	"	/* level, blocked or truncated at the next level  */",
3921312a1df1SDavid du Colombier 	"	if ((trpt->tau&32) && (_n == 0 || (trpt->tau&16)))",
39227dd7cddfSDavid du Colombier 	"	{",
39237dd7cddfSDavid du Colombier 	"	#ifdef DEBUG",
392400d97012SDavid du Colombier 	"		printf(\"%%3ld: proc %%d UnSelected (_n=%%d, tau=%%d)\\n\", ",
3925312a1df1SDavid du Colombier 	"		depth, II+1, (int) _n, trpt->tau);",
39267dd7cddfSDavid du Colombier 	"	#endif",
39277dd7cddfSDavid du Colombier 	"		if (a_cycles && (trpt->tau&16))",
39287dd7cddfSDavid du Colombier 	"		{	if (!(now._a_t&1))",
39297dd7cddfSDavid du Colombier 	"			{",
39307dd7cddfSDavid du Colombier 	"	#ifdef DEBUG",
393100d97012SDavid du Colombier 	"			printf(\"%%3ld: setting proviso bit\\n\", depth);",
39327dd7cddfSDavid du Colombier 	"	#endif",
39337dd7cddfSDavid du Colombier 	"#ifndef BITSTATE",
39347dd7cddfSDavid du Colombier 		"#ifdef MA",
39357dd7cddfSDavid du Colombier 			"#ifdef VERI",
39367dd7cddfSDavid du Colombier 	"			(trpt-1)->proviso = 1;",
39377dd7cddfSDavid du Colombier 			"#else",
39387dd7cddfSDavid du Colombier 	"			trpt->proviso = 1;",
39397dd7cddfSDavid du Colombier 			"#endif",
39407dd7cddfSDavid du Colombier 		"#else",
39417dd7cddfSDavid du Colombier 			"#ifdef VERI",
39427dd7cddfSDavid du Colombier 	"			if ((trpt-1)->ostate)",
39437dd7cddfSDavid du Colombier 	"			((char *)&((trpt-1)->ostate->state))[0] |= 128;",
39447dd7cddfSDavid du Colombier 			"#else",
39457dd7cddfSDavid du Colombier 	"			((char *)&(trpt->ostate->state))[0] |= 128;",
39467dd7cddfSDavid du Colombier 			"#endif",
39477dd7cddfSDavid du Colombier 		"#endif",
39487dd7cddfSDavid du Colombier 	"#else",
39497dd7cddfSDavid du Colombier 		"#ifdef VERI",
39507dd7cddfSDavid du Colombier 	"			if ((trpt-1)->ostate)",
39517dd7cddfSDavid du Colombier 	"			(trpt-1)->ostate->proviso = 1;",
39527dd7cddfSDavid du Colombier 		"#else",
39537dd7cddfSDavid du Colombier 	"			trpt->ostate->proviso = 1;",
39547dd7cddfSDavid du Colombier 		"#endif",
39557dd7cddfSDavid du Colombier 	"#endif",
395600d97012SDavid du Colombier 	"				From = FROM_P; To = UPTO_P;",
3957312a1df1SDavid du Colombier 	"				_n = 0; trpt->tau &= ~(16|32|64);",
39587dd7cddfSDavid du Colombier 	"				goto Again; /* do full search */",
39597dd7cddfSDavid du Colombier 	"			} /* else accept reduction */",
39607dd7cddfSDavid du Colombier 	"		} else",
396100d97012SDavid du Colombier 	"		{	From = FROM_P; To = UPTO_P;",
3962312a1df1SDavid du Colombier 	"			_n = 0; trpt->tau &= ~(16|32|64);",
3963*de2caf28SDavid du Colombier 	"			if (MORE_P)	/* II already updated */",
3964*de2caf28SDavid du Colombier 	"			{	goto Resume;",
3965*de2caf28SDavid du Colombier 	"			} else",
3966*de2caf28SDavid du Colombier 	"			{	goto Again;",
3967*de2caf28SDavid du Colombier 	"	}	}	}",
39687dd7cddfSDavid du Colombier "#endif",
3969219b2ee8SDavid du Colombier 	"#endif",
3970219b2ee8SDavid du Colombier 
3971312a1df1SDavid du Colombier 	"	if (_n == 0 || ((trpt->tau&4) && (trpt->tau&2)))",
3972219b2ee8SDavid du Colombier 	"	{",
3973219b2ee8SDavid du Colombier 		"#ifdef DEBUG",
397400d97012SDavid du Colombier 	"		cpu_printf(\"%%3ld: no move [II=%%d, tau=%%d, boq=%%d]\\n\",",
3975219b2ee8SDavid du Colombier 	"			depth, II, trpt->tau, boq);",
3976219b2ee8SDavid du Colombier 		"#endif",
3977219b2ee8SDavid du Colombier 	"#if SYNC",
39787dd7cddfSDavid du Colombier 	"		/* ok if a rendez-vous fails: */",
3979219b2ee8SDavid du Colombier 	"		if (boq != -1) goto Done;",
3980219b2ee8SDavid du Colombier 	"#endif",
39817dd7cddfSDavid du Colombier 	"		/* ok if no procs or we're at maxdepth */",
3982312a1df1SDavid du Colombier 	"		if ((now._nr_pr == 0 && (!strict || qs_empty()))",
398300d97012SDavid du Colombier 	"		||  depth >= maxdepth-1) goto Done;	/* undo change from 5.2.3 */",
3984219b2ee8SDavid du Colombier 
39857dd7cddfSDavid du Colombier 	"		if ((trpt->tau&8) && !(trpt->tau&4))",
39867dd7cddfSDavid du Colombier 	"		{	trpt->tau &= ~(1|8);",
39877dd7cddfSDavid du Colombier 	"			/* 1=timeout, 8=atomic */",
398800d97012SDavid du Colombier 	"			From = FROM_P; To = UPTO_P;",
39897dd7cddfSDavid du Colombier 		"#ifdef DEBUG",
399000d97012SDavid du Colombier 	"		cpu_printf(\"%%3ld: atomic step proc %%d unexecutable\\n\", depth, II+1);",
39917dd7cddfSDavid du Colombier 		"#endif",
39927dd7cddfSDavid du Colombier 	"#ifdef VERI",
39937dd7cddfSDavid du Colombier 	"			trpt->tau |= 4;	/* switch to claim */",
39947dd7cddfSDavid du Colombier 	"#endif",
39957dd7cddfSDavid du Colombier 	"			goto AllOver;",
39967dd7cddfSDavid du Colombier 	"		}",
39977dd7cddfSDavid du Colombier 
3998219b2ee8SDavid du Colombier 	"#ifdef ETIM",
39997dd7cddfSDavid du Colombier 	"		if (!(trpt->tau&1)) /* didn't try timeout yet */",
4000219b2ee8SDavid du Colombier 	"		{",
4001219b2ee8SDavid du Colombier 	"#ifdef VERI",
4002219b2ee8SDavid du Colombier 	"			if (trpt->tau&4)",
4003219b2ee8SDavid du Colombier 	"			{",
4004219b2ee8SDavid du Colombier 		"#ifndef NTIM",
40057dd7cddfSDavid du Colombier 	"				if (trpt->tau&2) /* requested */",
4006219b2ee8SDavid du Colombier 		"#endif",
4007219b2ee8SDavid du Colombier 	"				{	trpt->tau |=  1;",
4008219b2ee8SDavid du Colombier 	"					trpt->tau &= ~2;",
4009219b2ee8SDavid du Colombier 	"	#ifdef DEBUG",
401000d97012SDavid du Colombier 	"				cpu_printf(\"%%d: timeout\\n\", depth);",
4011219b2ee8SDavid du Colombier 	"	#endif",
4012219b2ee8SDavid du Colombier 	"					goto Stutter;",
4013219b2ee8SDavid du Colombier 	"			}	}",
4014219b2ee8SDavid du Colombier 	"			else",
40157dd7cddfSDavid du Colombier 	"			{	/* only claim can enable timeout */",
40167dd7cddfSDavid du Colombier 	"				if ((trpt->tau&8)",
40177dd7cddfSDavid du Colombier 	"				&&  !((trpt-1)->tau&4))",
40187dd7cddfSDavid du Colombier 	"/* blocks inside an atomic */		goto BreakOut;",
4019219b2ee8SDavid du Colombier 	"	#ifdef DEBUG",
402000d97012SDavid du Colombier 	"				cpu_printf(\"%%d: req timeout\\n\",",
40217dd7cddfSDavid du Colombier 	"					depth);",
4022219b2ee8SDavid du Colombier 	"	#endif",
40237dd7cddfSDavid du Colombier 	"				(trpt-1)->tau |= 2; /* request */",
402400d97012SDavid du Colombier 	"	#if NCORE>1 && defined(FULL_TRAIL)",
402500d97012SDavid du Colombier 	"				if (upto > 0)",
402600d97012SDavid du Colombier 	"				{	Pop_Stack_Tree();",
402700d97012SDavid du Colombier 	"				}",
402800d97012SDavid du Colombier 	"	#endif",
4029219b2ee8SDavid du Colombier 	"				goto Up;",
4030219b2ee8SDavid du Colombier 	"			}",
4031219b2ee8SDavid du Colombier 	"#else",
4032219b2ee8SDavid du Colombier 	"	#ifdef DEBUG",
403300d97012SDavid du Colombier 	"			cpu_printf(\"%%d: timeout\\n\", depth);",
4034219b2ee8SDavid du Colombier 	"	#endif",
4035219b2ee8SDavid du Colombier 	"			trpt->tau |=  1;",
4036219b2ee8SDavid du Colombier 	"			goto Again;",
4037219b2ee8SDavid du Colombier 	"#endif",
4038219b2ee8SDavid du Colombier 	"		}",
4039219b2ee8SDavid du Colombier 	"#endif",
4040219b2ee8SDavid du Colombier 
40417dd7cddfSDavid du Colombier 	/* old location of atomic block code */
4042219b2ee8SDavid du Colombier 	"#ifdef VERI",
4043312a1df1SDavid du Colombier 	"BreakOut:",
4044219b2ee8SDavid du Colombier 		"#ifndef NOSTUTTER",
40457dd7cddfSDavid du Colombier 	"		if (!(trpt->tau&4))",
40467dd7cddfSDavid du Colombier 	"		{	trpt->tau |= 4;   /* claim stuttering */",
4047219b2ee8SDavid du Colombier 	"			trpt->tau |= 128; /* stutter mark */",
4048219b2ee8SDavid du Colombier 				"#ifdef DEBUG",
404900d97012SDavid du Colombier 	"			cpu_printf(\"%%d: claim stutter\\n\", depth);",
4050219b2ee8SDavid du Colombier 				"#endif",
4051219b2ee8SDavid du Colombier 	"			goto Stutter;",
4052219b2ee8SDavid du Colombier 	"		}",
4053312a1df1SDavid du Colombier 		"#else",
4054312a1df1SDavid du Colombier 	"		;",
4055219b2ee8SDavid du Colombier 		"#endif",
4056219b2ee8SDavid du Colombier 	"#else",
40577dd7cddfSDavid du Colombier 	"		if (!noends && !a_cycles && !endstate())",
4058312a1df1SDavid du Colombier 	"		{	depth--; trpt--;	/* new 4.2.3 */",
4059219b2ee8SDavid du Colombier 	"			uerror(\"invalid end state\");",
4060312a1df1SDavid du Colombier 	"			depth++; trpt++;",
4061312a1df1SDavid du Colombier 	"		}",
4062312a1df1SDavid du Colombier 		"#ifndef NOSTUTTER",
4063312a1df1SDavid du Colombier 	"		else if (a_cycles && (trpt->o_pm&2)) /* new 4.2.4 */",
4064312a1df1SDavid du Colombier 	"		{	depth--; trpt--;",
4065312a1df1SDavid du Colombier 	"			uerror(\"accept stutter\");",
4066312a1df1SDavid du Colombier 	"			depth++; trpt++;",
4067312a1df1SDavid du Colombier 	"		}",
4068312a1df1SDavid du Colombier 		"#endif",
4069219b2ee8SDavid du Colombier 	"#endif",
4070219b2ee8SDavid du Colombier 	"	}",
4071219b2ee8SDavid du Colombier 	"Done:",
4072219b2ee8SDavid du Colombier 	"	if (!(trpt->tau&8))	/* not in atomic seqs */",
4073219b2ee8SDavid du Colombier 	"	{",
407400d97012SDavid du Colombier 
40757dd7cddfSDavid du Colombier "#ifndef MA",
4076219b2ee8SDavid du Colombier 	"#if defined(FULLSTACK) || defined(CNTRSTACK)",
4077219b2ee8SDavid du Colombier 	"#ifdef VERI",
4078219b2ee8SDavid du Colombier 	"		if (boq == -1",
4079219b2ee8SDavid du Colombier 	"		&&  (((trpt->tau&4) && !(trpt->tau&128))",
40807dd7cddfSDavid du Colombier 	"		||  ( (trpt-1)->tau&128)))",
40817dd7cddfSDavid du Colombier 	"#else",
40827dd7cddfSDavid du Colombier 	"		if (boq == -1)",
40837dd7cddfSDavid du Colombier 	"#endif",
40847dd7cddfSDavid du Colombier 	"		{",
40857dd7cddfSDavid du Colombier 		"#ifdef DEBUG2",
40867dd7cddfSDavid du Colombier 		"#if defined(FULLSTACK)",
4087*de2caf28SDavid du Colombier 	"			printf(\"%%ld: zapping %%u (%%d)\\n\",",
40887dd7cddfSDavid du Colombier 	"				depth, trpt->ostate,",
40897dd7cddfSDavid du Colombier 	"			(trpt->ostate)?trpt->ostate->tagged:0);",
40907dd7cddfSDavid du Colombier 		"#endif",
40917dd7cddfSDavid du Colombier 		"#endif",
40927dd7cddfSDavid du Colombier 	"			onstack_zap();",
40937dd7cddfSDavid du Colombier 	"		}",
40947dd7cddfSDavid du Colombier 	"#endif",
40957dd7cddfSDavid du Colombier "#else",
40967dd7cddfSDavid du Colombier 	"#ifdef VERI",
40977dd7cddfSDavid du Colombier 	"		if (boq == -1",
40987dd7cddfSDavid du Colombier 	"		&&  (((trpt->tau&4) && !(trpt->tau&128))",
40997dd7cddfSDavid du Colombier 	"		||  ( (trpt-1)->tau&128)))",
4100219b2ee8SDavid du Colombier 	"#else",
4101219b2ee8SDavid du Colombier 	"		if (boq == -1)",
4102219b2ee8SDavid du Colombier 	"#endif",
4103219b2ee8SDavid du Colombier 	"		{",
4104219b2ee8SDavid du Colombier 		"#ifdef DEBUG",
4105*de2caf28SDavid du Colombier 	"			printf(\"%%ld: zapping\\n\", depth);",
4106219b2ee8SDavid du Colombier 		"#endif",
4107219b2ee8SDavid du Colombier 	"			onstack_zap();",
41087dd7cddfSDavid du Colombier 		"#ifndef NOREDUCE",
41097dd7cddfSDavid du Colombier 	"			if (trpt->proviso)",
4110*de2caf28SDavid du Colombier 	"			g_store((char *) &now, vsize, 1);",
41117dd7cddfSDavid du Colombier 		"#endif",
4112219b2ee8SDavid du Colombier 	"		}",
4113219b2ee8SDavid du Colombier "#endif",
411400d97012SDavid du Colombier 
411500d97012SDavid du Colombier 	"#ifndef SAFETY",
411600d97012SDavid du Colombier 	"		if (_n != 0",		/* we made a move */
411700d97012SDavid du Colombier 		"#ifdef VERI",
411800d97012SDavid du Colombier 	"		/* --after-- a program-step, i.e., */",
411900d97012SDavid du Colombier 	"		/* after backtracking a claim-step */",
412000d97012SDavid du Colombier 	"		&& (trpt->tau&4)",
412100d97012SDavid du Colombier 	"		/* with at least one running process */",
412200d97012SDavid du Colombier 	"		/* unless in a stuttered accept state */",
412300d97012SDavid du Colombier 	"		&& ((now._nr_pr > 1) || (trpt->o_pm&2))",
412400d97012SDavid du Colombier 		"#endif",
412500d97012SDavid du Colombier 	"		&& !(now._a_t&1))",	/* not in 2nd DFS */
412600d97012SDavid du Colombier 	"		{",
412700d97012SDavid du Colombier 		"#ifndef NOFAIR",
412800d97012SDavid du Colombier 	"			if (fairness)",	/* implies a_cycles */
412900d97012SDavid du Colombier 	"			{",
413000d97012SDavid du Colombier 			"#ifdef VERBOSE",
413100d97012SDavid du Colombier 	"			cpu_printf(\"Consider check %%d %%d...\\n\",",
413200d97012SDavid du Colombier 	"				now._a_t, now._cnt[0]);",
413300d97012SDavid du Colombier 			"#endif",
413400d97012SDavid du Colombier #if 0
413500d97012SDavid du Colombier 		the a-bit is set, which means that the fairness
413600d97012SDavid du Colombier 		counter is running -- it was started in an accepting state.
413700d97012SDavid du Colombier 		we check that the counter reached 1, which means that all
413800d97012SDavid du Colombier 		processes moved least once.
413900d97012SDavid du Colombier 		this means we can start the search for cycles -
414000d97012SDavid du Colombier 		to be able to return to this state, we should be able to
414100d97012SDavid du Colombier 		run down the counter to 1 again -- which implies a visit to
414200d97012SDavid du Colombier 		the accepting state -- even though the Seed state for this
414300d97012SDavid du Colombier 		search is itself not necessarily accepting
414400d97012SDavid du Colombier #endif
414500d97012SDavid du Colombier 	"				if ((now._a_t&2) /* A-bit */",
414600d97012SDavid du Colombier 	"				&&  (now._cnt[0] == 1))",
414700d97012SDavid du Colombier 	"					checkcycles();",
414800d97012SDavid du Colombier 	"			} else",
414900d97012SDavid du Colombier 		"#endif",
415000d97012SDavid du Colombier 	"			if (a_cycles && (trpt->o_pm&2))",
415100d97012SDavid du Colombier 	"				checkcycles();",
4152219b2ee8SDavid du Colombier 	"		}",
415300d97012SDavid du Colombier 	"#endif",
415400d97012SDavid du Colombier 	"	}",
415500d97012SDavid du Colombier 	"	if (depth > 0)",
415600d97012SDavid du Colombier 	"	{",
415700d97012SDavid du Colombier 	"#if NCORE>1 && defined(FULL_TRAIL)",
415800d97012SDavid du Colombier 	"		if (upto > 0)",
415900d97012SDavid du Colombier 	"		{	Pop_Stack_Tree();",
416000d97012SDavid du Colombier 	"		}",
416100d97012SDavid du Colombier 	"#endif",
416200d97012SDavid du Colombier 	"		goto Up;",
416300d97012SDavid du Colombier 	"	}",
4164219b2ee8SDavid du Colombier 	"}\n",
4165312a1df1SDavid du Colombier 	"#else",
4166312a1df1SDavid du Colombier 	"void new_state(void) { /* place holder */ }",
4167312a1df1SDavid du Colombier 	"#endif",	/* BFS */
4168312a1df1SDavid du Colombier 	"",
4169219b2ee8SDavid du Colombier 	"void",
417000d97012SDavid du Colombier 	"spin_assert(int a, char *s, int ii, int tt, Trans *t)",
4171219b2ee8SDavid du Colombier 	"{",
41727dd7cddfSDavid du Colombier 	"	if (!a && !noasserts)",
41737dd7cddfSDavid du Colombier 	"	{	char bad[1024];",
4174312a1df1SDavid du Colombier 	"		strcpy(bad, \"assertion violated \");",
4175312a1df1SDavid du Colombier 	"		if (strlen(s) > 1000)",
4176312a1df1SDavid du Colombier 	"		{	strncpy(&bad[19], (const char *) s, 1000);",
4177312a1df1SDavid du Colombier 	"			bad[1019] = '\\0';",
4178312a1df1SDavid du Colombier 	"		} else",
4179312a1df1SDavid du Colombier 	"			strcpy(&bad[19], s);",
4180219b2ee8SDavid du Colombier 	"		uerror(bad);",
4181219b2ee8SDavid du Colombier 	"	}",
4182219b2ee8SDavid du Colombier 	"}",
4183219b2ee8SDavid du Colombier 	"#ifndef NOBOUNDCHECK",
4184219b2ee8SDavid du Colombier 	"int",
4185219b2ee8SDavid du Colombier 	"Boundcheck(int x, int y, int a1, int a2, Trans *a3)",
4186219b2ee8SDavid du Colombier 	"{",
418700d97012SDavid du Colombier 	"	spin_assert((x >= 0 && x < y), \"- invalid array index\",",
41887dd7cddfSDavid du Colombier 	"		a1, a2, a3);",
4189219b2ee8SDavid du Colombier 	"	return x;",
4190219b2ee8SDavid du Colombier 	"}",
4191219b2ee8SDavid du Colombier 	"#endif",
4192*de2caf28SDavid du Colombier 	"int do_hashgen = 0;",
4193219b2ee8SDavid du Colombier 	"void",
4194219b2ee8SDavid du Colombier 	"wrap_stats(void)",
4195312a1df1SDavid du Colombier 	"{",
4196219b2ee8SDavid du Colombier 	"	if (nShadow>0)",
419700d97012SDavid du Colombier 	"	  printf(\"%%9.8g states, stored (%%g visited)\\n\",",
4198219b2ee8SDavid du Colombier 	"			nstates - nShadow, nstates);",
4199219b2ee8SDavid du Colombier 	"	else",
420000d97012SDavid du Colombier 	"	  printf(\"%%9.8g states, stored\\n\", nstates);",
4201*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
4202*de2caf28SDavid du Colombier 	"	if (bfs_punt > 0)",
4203*de2caf28SDavid du Colombier 	"	printf(\"%%9.8g states lost (lack of queue memory)\\n\", (double) bfs_punt);",
4204*de2caf28SDavid du Colombier 	"#endif",
4205312a1df1SDavid du Colombier 	"#ifdef BFS",
4206312a1df1SDavid du Colombier 	"	#if SYNC",
4207312a1df1SDavid du Colombier 	"	printf(\"	%%8g nominal states (- rv and atomic)\\n\", nstates-midrv-nlinks+revrv);",
4208312a1df1SDavid du Colombier 	"	printf(\"	%%8g rvs succeeded\\n\", midrv-failedrv);",
4209312a1df1SDavid du Colombier 	"	#else",
4210312a1df1SDavid du Colombier 	"	printf(\"	%%8g nominal states (stored-atomic)\\n\", nstates-nlinks);",
4211312a1df1SDavid du Colombier 	"	#endif",
4212312a1df1SDavid du Colombier 	"	#ifdef DEBUG",
4213312a1df1SDavid du Colombier 	"	printf(\"	%%8g midrv\\n\", midrv);",
4214312a1df1SDavid du Colombier 	"	printf(\"	%%8g failedrv\\n\", failedrv);",
4215312a1df1SDavid du Colombier 	"	printf(\"	%%8g revrv\\n\", revrv);",
4216312a1df1SDavid du Colombier 	"	#endif",
4217312a1df1SDavid du Colombier 	"#endif",
421800d97012SDavid du Colombier 	"	printf(\"%%9.8g states, matched\\n\", truncs);",
42197dd7cddfSDavid du Colombier 	"#ifdef CHECK",
422000d97012SDavid du Colombier 	"	printf(\"%%9.8g matches within stack\\n\",truncs2);",
42217dd7cddfSDavid du Colombier 	"#endif",
4222219b2ee8SDavid du Colombier 	"	if (nShadow>0)",
422300d97012SDavid du Colombier 	"	printf(\"%%9.8g transitions (= visited+matched)\\n\",",
4224219b2ee8SDavid du Colombier 	"		nstates+truncs);",
4225219b2ee8SDavid du Colombier 	"	else",
422600d97012SDavid du Colombier 	"	printf(\"%%9.8g transitions (= stored+matched)\\n\",",
4227219b2ee8SDavid du Colombier 	"		nstates+truncs);",
422800d97012SDavid du Colombier 	"	printf(\"%%9.8g atomic steps\\n\", nlinks);",
4229219b2ee8SDavid du Colombier 	"	if (nlost) printf(\"%%g lost messages\\n\", (double) nlost);",
4230312a1df1SDavid du Colombier 	"",
4231312a1df1SDavid du Colombier 	"#ifndef BITSTATE",
423200d97012SDavid du Colombier 	"	#ifndef MA",
423300d97012SDavid du Colombier 	"	printf(\"hash conflicts: %%9.8g (resolved)\\n\", hcmp);",
4234*de2caf28SDavid du Colombier 	"		#if !defined(AUTO_RESIZE) && !defined(BFS_PAR)",
423500d97012SDavid du Colombier 	"	if (hcmp > (double) (1<<ssize))",
423600d97012SDavid du Colombier 	"	{  printf(\"hint: increase hashtable-size (-w) to reduce runtime\\n\");",
4237*de2caf28SDavid du Colombier 	"	}",
4238*de2caf28SDavid du Colombier 	"		#endif",
4239*de2caf28SDavid du Colombier 	"		#if defined(BFS_PAR) && defined(HC)",
4240*de2caf28SDavid du Colombier 	"	{ double fp = (100. * (double) nstates)/((double) ((ulong) (1<<ssize)));",
4241*de2caf28SDavid du Colombier 	"	  int fi = 0;",
4242*de2caf28SDavid du Colombier 	"		printf(\"the hash table is %%3.3g %%%% filled\", fp);",
4243*de2caf28SDavid du Colombier 	"		if (fp > 1.0)",
4244*de2caf28SDavid du Colombier 	"		{	fp = 100. / fp;",
4245*de2caf28SDavid du Colombier 	"			while (fp > 2.) { fi++; fp /= 2.; }",
4246*de2caf28SDavid du Colombier 	"			if (fi > 0)",
4247*de2caf28SDavid du Colombier 	"			{	printf(\" (hint: rerun with -w%%d to reduce runtime)\",",
4248*de2caf28SDavid du Colombier 	"				ssize-fi);",
4249*de2caf28SDavid du Colombier 	"		}	}",
4250*de2caf28SDavid du Colombier 	"		printf(\"\\n\");",
4251*de2caf28SDavid du Colombier 	"	}",
425200d97012SDavid du Colombier 	"		#endif",
425300d97012SDavid du Colombier 	"	#endif",
4254312a1df1SDavid du Colombier 	"#else",
42557dd7cddfSDavid du Colombier 		"#ifdef CHECK",
42567dd7cddfSDavid du Colombier 		"	printf(\"%%8g states allocated for dfs stack\\n\", ngrabs);",
42577dd7cddfSDavid du Colombier 		"#endif",
425800d97012SDavid du Colombier 	"	if (udmem)",
425900d97012SDavid du Colombier 	"	printf(\"\\nhash factor: %%4g (best if > 100.)\\n\\n\",",
426000d97012SDavid du Colombier 	"		(double)(((double) udmem) * 8.0) / (double) nstates);",
426100d97012SDavid du Colombier 	"	else",
4262312a1df1SDavid du Colombier 	"	printf(\"\\nhash factor: %%4g (best if > 100.)\\n\\n\",",
4263*de2caf28SDavid du Colombier 	"		((double)(((ulong)1)<<(ssize-10)) / (double) nstates) * 1024.0);",
4264*de2caf28SDavid du Colombier 			/* the -10 and *1024 stuff is to avoid overflow */
4265312a1df1SDavid du Colombier 	"       printf(\"bits set per state: %%u (-k%%u)\\n\", hfns, hfns);",
4266*de2caf28SDavid du Colombier 	"	if (do_hashgen)",
4267*de2caf28SDavid du Colombier 	"	printf(\"hash polynomial used: 0x%%.8x\\n\", HASH_CONST[HASH_NR]);",
4268*de2caf28SDavid du Colombier 	"	if (s_rand != 12345)",
4269*de2caf28SDavid du Colombier 	"	printf(\"random seed used: %%u\\n\", (uint) (s_rand-1));",
4270312a1df1SDavid du Colombier 	"#endif",
4271*de2caf28SDavid du Colombier 	"#if defined(BFS_DISK) && !defined(BFS_PAR)",
427200d97012SDavid du Colombier 	"	printf(\"bfs disk reads: %%ld writes %%ld -- diff %%ld\\n\",",
427300d97012SDavid du Colombier 	"		bfs_dsk_reads, bfs_dsk_writes, bfs_dsk_writes-bfs_dsk_reads);",
427400d97012SDavid du Colombier 	"	if (bfs_dsk_read  >= 0) (void) close(bfs_dsk_read);",
427500d97012SDavid du Colombier 	"	if (bfs_dsk_write >= 0) (void) close(bfs_dsk_write);",
427600d97012SDavid du Colombier 	"	(void) unlink(\"pan_bfs_dsk.tmp\");",
427700d97012SDavid du Colombier 	"#endif",
4278219b2ee8SDavid du Colombier 	"}",
427900d97012SDavid du Colombier 	"",
4280219b2ee8SDavid du Colombier 	"void",
42817dd7cddfSDavid du Colombier 	"wrapup(void)",
428200d97012SDavid du Colombier 	"{	double nr1, nr2, nr3 = 0.0, nr4, nr5 = 0.0;",
4283*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
4284*de2caf28SDavid du Colombier 	"	if (who_am_i != 0)",
4285*de2caf28SDavid du Colombier 	"	{	pan_exit(0);",
4286*de2caf28SDavid du Colombier 	"	}",
42877dd7cddfSDavid du Colombier 	"#endif",
428800d97012SDavid du Colombier 	"#if NCORE>1",
4289*de2caf28SDavid du Colombier 	"	if (verbose) cpu_printf(\"wrapup -- %%lu error(s)\\n\", errors);",
429000d97012SDavid du Colombier 	"	if (core_id != 0)",
429100d97012SDavid du Colombier 	"	{",
429200d97012SDavid du Colombier 	"	#ifdef USE_DISK",
429300d97012SDavid du Colombier 	"		void	dsk_stats(void);",
429400d97012SDavid du Colombier 	"		dsk_stats();",
4295312a1df1SDavid du Colombier 	"	#endif",
429600d97012SDavid du Colombier 	"		if (search_terminated != NULL)",
429700d97012SDavid du Colombier 	"		{	*search_terminated |= 2;	/* wrapup */",
429800d97012SDavid du Colombier 	"		}",
429900d97012SDavid du Colombier 	"		exit(0); /* normal termination, not an error */",
430000d97012SDavid du Colombier 	"	}",
430100d97012SDavid du Colombier 	"#endif",
430200d97012SDavid du Colombier 	"#if !defined(WIN32) && !defined(WIN64)",
43037dd7cddfSDavid du Colombier 	"	signal(SIGINT, SIG_DFL);",
430400d97012SDavid du Colombier 	"#endif",
430500d97012SDavid du Colombier 	"	printf(\"\\n(%%s)\\n\", SpinVersion);",
43067dd7cddfSDavid du Colombier 	"	if (!done) printf(\"Warning: Search not completed\\n\");",
4307*de2caf28SDavid du Colombier 	"#if defined(BFS_PAR) && !defined(BITSTATE)",
4308*de2caf28SDavid du Colombier 	"	if (bfs_punt > 0) printf(\"Warning: Search incomplete\\n\");",
4309*de2caf28SDavid du Colombier 	"#endif",
43107dd7cddfSDavid du Colombier 	"#ifdef SC",
43117dd7cddfSDavid du Colombier 	"	(void) unlink((const char *)stackfile);",
43127dd7cddfSDavid du Colombier 	"#endif",
4313*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
4314*de2caf28SDavid du Colombier 	"	printf(\"	+ Multi-Core (using %%d cores)\\n\", Cores);",
4315*de2caf28SDavid du Colombier 	"	#ifdef BFS_SEP_HASH",
4316*de2caf28SDavid du Colombier 	"	printf(\"	+ Separate Hash Tables\\n\");",
4317*de2caf28SDavid du Colombier 	"	#endif",
4318*de2caf28SDavid du Colombier 	"	#ifdef BFS_DISK",
4319*de2caf28SDavid du Colombier 	"	printf(\"	+ Disk storage\\n\");",
4320*de2caf28SDavid du Colombier 	"	#endif",
4321*de2caf28SDavid du Colombier 	"#endif",
432200d97012SDavid du Colombier 	"#if NCORE>1",
432300d97012SDavid du Colombier 	"	if (a_cycles)",
432400d97012SDavid du Colombier 	"	{	printf(\"	+ Multi-Core (NCORE=%%d)\\n\", NCORE);",
432500d97012SDavid du Colombier 	"	} else",
432600d97012SDavid du Colombier 	"	{	printf(\"	+ Multi-Core (NCORE=%%d -z%%ld)\\n\", NCORE, z_handoff);",
432700d97012SDavid du Colombier 	"	}",
432800d97012SDavid du Colombier 	"#endif",
4329312a1df1SDavid du Colombier 	"#ifdef BFS",
4330*de2caf28SDavid du Colombier 	"	printf(\"	+ Breadth-First Search\\n\");",
4331312a1df1SDavid du Colombier 	"#endif",
43327dd7cddfSDavid du Colombier 	"#ifndef NOREDUCE",
4333219b2ee8SDavid du Colombier 	"	printf(\"	+ Partial Order Reduction\\n\");",
4334219b2ee8SDavid du Colombier 	"#endif",
4335*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
4336*de2caf28SDavid du Colombier 	"	printf(\"	+ Process Scheduling Permutation\\n\");",
4337*de2caf28SDavid du Colombier 	"#endif",
4338*de2caf28SDavid du Colombier 	"#ifdef P_REVERSE",
433900d97012SDavid du Colombier 	"	printf(\"	+ Reverse Depth-First Search Order\\n\");",
4340312a1df1SDavid du Colombier 	"#endif",
4341*de2caf28SDavid du Colombier 	"	if (t_reverse)",
434200d97012SDavid du Colombier 	"	printf(\"	+ Reverse Transition Ordering\\n\");",
434300d97012SDavid du Colombier 	"#ifdef T_RAND",
434400d97012SDavid du Colombier 	"	printf(\"	+ Randomized Transition Ordering\\n\");",
434500d97012SDavid du Colombier 	"#endif",
434600d97012SDavid du Colombier 	"#ifdef P_RAND",
434700d97012SDavid du Colombier 	"	printf(\"	+ Randomized Process Ordering\\n\");",
434800d97012SDavid du Colombier 	"#endif",
434900d97012SDavid du Colombier 	"#ifdef BCS",
435000d97012SDavid du Colombier 	"	printf(\"	+ Scheduling Restriction (-L%%d)\\n\", sched_max);",
435100d97012SDavid du Colombier 	"#endif",
435200d97012SDavid du Colombier 	"#ifdef TRIX",
435300d97012SDavid du Colombier 	"	printf(\"	+ Tree Index Compression\\n\");",
435400d97012SDavid du Colombier 	"#endif",
43557dd7cddfSDavid du Colombier 	"#ifdef COLLAPSE",
43567dd7cddfSDavid du Colombier 	"	printf(\"	+ Compression\\n\");",
43577dd7cddfSDavid du Colombier 	"#endif",
43587dd7cddfSDavid du Colombier 	"#ifdef MA",
43597dd7cddfSDavid du Colombier 	"	printf(\"	+ Graph Encoding (-DMA=%%d)\\n\", MA);",
43607dd7cddfSDavid du Colombier 	"  #ifdef R_XPT",
436100d97012SDavid du Colombier 	"	printf(\"	  Restarted from checkpoint %%s.xpt\\n\", PanSource);",
43627dd7cddfSDavid du Colombier 	"  #endif",
43637dd7cddfSDavid du Colombier 	"#endif",
43647dd7cddfSDavid du Colombier 	"#ifdef CHECK",
4365219b2ee8SDavid du Colombier 	"  #ifdef FULLSTACK",
4366219b2ee8SDavid du Colombier 	"	printf(\"	+ FullStack Matching\\n\");",
4367219b2ee8SDavid du Colombier 	"  #endif",
4368219b2ee8SDavid du Colombier 	"  #ifdef CNTRSTACK",
4369219b2ee8SDavid du Colombier 	"	printf(\"	+ CntrStack Matching\\n\");",
4370219b2ee8SDavid du Colombier 	"  #endif",
43717dd7cddfSDavid du Colombier 	"#endif",
4372*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
4373*de2caf28SDavid du Colombier 	"	if (reversing & 2)",
4374*de2caf28SDavid du Colombier 	"	{	if (p_reorder == set_permuted)",
4375*de2caf28SDavid du Colombier 	"		{	printf(\"	+ Permuted\\n\");",
4376*de2caf28SDavid du Colombier 	"		}",
4377*de2caf28SDavid du Colombier 	"		if (p_reorder == set_reversed)",
4378*de2caf28SDavid du Colombier 	"		{	printf(\"	+ Reversed\\n\");",
4379*de2caf28SDavid du Colombier 	"		}",
4380*de2caf28SDavid du Colombier 	"		if (p_reorder == set_rotated)",
4381*de2caf28SDavid du Colombier 	"		{	printf(\"	+ Rotated %%d\\n\", p_rotate);",
4382*de2caf28SDavid du Colombier 	"		}",
4383*de2caf28SDavid du Colombier 	"		if (p_reorder == set_randrot)",
4384*de2caf28SDavid du Colombier 	"		{	printf(\"	+ RandRotated\\n\");",
4385*de2caf28SDavid du Colombier 	"	}	}",
4386*de2caf28SDavid du Colombier 	"#endif",
4387219b2ee8SDavid du Colombier 	"#ifdef BITSTATE",
4388219b2ee8SDavid du Colombier 	"	printf(\"\\nBit statespace search for:\\n\");",
4389219b2ee8SDavid du Colombier 	"#else",
43907dd7cddfSDavid du Colombier 	"  #ifdef HC",
43917dd7cddfSDavid du Colombier 	"	printf(\"\\nHash-Compact %%d search for:\\n\", HC);",
43927dd7cddfSDavid du Colombier 	"  #else",
4393219b2ee8SDavid du Colombier 	"	printf(\"\\nFull statespace search for:\\n\");",
4394219b2ee8SDavid du Colombier 	"  #endif",
43957dd7cddfSDavid du Colombier 	"#endif",
43967dd7cddfSDavid du Colombier 	"#ifdef EVENT_TRACE",
43977dd7cddfSDavid du Colombier 	"#ifdef NEGATED_TRACE",
43987dd7cddfSDavid du Colombier 	"	printf(\"\tnotrace assertion  \t+\\n\");",
43997dd7cddfSDavid du Colombier 	"#else",
44007dd7cddfSDavid du Colombier 	"	printf(\"\ttrace assertion    \t+\\n\");",
44017dd7cddfSDavid du Colombier 	"#endif",
44027dd7cddfSDavid du Colombier 	"#endif",
4403219b2ee8SDavid du Colombier 	"#ifdef VERI",
440400d97012SDavid du Colombier 	"	printf(\"\tnever claim         \t+\");",
440500d97012SDavid du Colombier 	"	printf(\" (%%s)\\n\", procname[((Pclaim *)pptr(0))->_t]);",
44067dd7cddfSDavid du Colombier 	"	printf(\"\tassertion violations\t\");",
44077dd7cddfSDavid du Colombier 	"	if (noasserts)",
44087dd7cddfSDavid du Colombier 	"		printf(\"- (disabled by -A flag)\\n\");",
44097dd7cddfSDavid du Colombier 	"	else",
44107dd7cddfSDavid du Colombier 	"		printf(\"+ (if within scope of claim)\\n\");",
4411219b2ee8SDavid du Colombier 	"#else",
4412219b2ee8SDavid du Colombier 		"#ifdef NOCLAIM",
4413312a1df1SDavid du Colombier 	"	printf(\"\tnever claim         \t- (not selected)\\n\");",
4414219b2ee8SDavid du Colombier 		"#else",
4415312a1df1SDavid du Colombier 	"	printf(\"\tnever claim         \t- (none specified)\\n\");",
4416219b2ee8SDavid du Colombier 		"#endif",
44177dd7cddfSDavid du Colombier 	"	printf(\"\tassertion violations\t\");",
44187dd7cddfSDavid du Colombier 	"	if (noasserts)",
44197dd7cddfSDavid du Colombier 	"		printf(\"- (disabled by -A flag)\\n\");",
44207dd7cddfSDavid du Colombier 	"	else",
44217dd7cddfSDavid du Colombier 	"		printf(\"+\\n\");",
4422219b2ee8SDavid du Colombier 	"#endif",
44237dd7cddfSDavid du Colombier 	"#ifndef SAFETY",
44247dd7cddfSDavid du Colombier 		"#ifdef NP",
4425219b2ee8SDavid du Colombier 	"	printf(\"\tnon-progress cycles \t\");",
44267dd7cddfSDavid du Colombier 		"#else",
4427219b2ee8SDavid du Colombier 	"	printf(\"\tacceptance   cycles \t\");",
44287dd7cddfSDavid du Colombier 		"#endif",
4429219b2ee8SDavid du Colombier 	"	if (a_cycles)",
4430219b2ee8SDavid du Colombier 	"		printf(\"+ (fairness %%sabled)\\n\",",
4431219b2ee8SDavid du Colombier 	"			fairness?\"en\":\"dis\");",
4432219b2ee8SDavid du Colombier 	"	else printf(\"- (not selected)\\n\");",
4433219b2ee8SDavid du Colombier 	"#else",
4434*de2caf28SDavid du Colombier 	"	#if !defined(BFS_PAR) || !defined(L_BOUND)",
44357dd7cddfSDavid du Colombier 	"	printf(\"\tcycle checks       \t- (disabled by -DSAFETY)\\n\");",
4436*de2caf28SDavid du Colombier 	"	#else",
4437*de2caf28SDavid du Colombier 	"	printf(\"\tcycle checks       \t+ (bound %%d)\\n\", L_bound);",
4438*de2caf28SDavid du Colombier 	"	#endif",
4439219b2ee8SDavid du Colombier 	"#endif",
44407dd7cddfSDavid du Colombier 	"#ifdef VERI",
44417dd7cddfSDavid du Colombier 	"	printf(\"\tinvalid end states\t- \");",
44427dd7cddfSDavid du Colombier 	"	printf(\"(disabled by \");",
44437dd7cddfSDavid du Colombier 	"	if (noends)",
44447dd7cddfSDavid du Colombier 	"		printf(\"-E flag)\\n\\n\");",
44457dd7cddfSDavid du Colombier 	"	else",
4446312a1df1SDavid du Colombier 	"		printf(\"never claim)\\n\\n\");",
44477dd7cddfSDavid du Colombier 	"#else",
44487dd7cddfSDavid du Colombier 	"	printf(\"\tinvalid end states\t\");",
44497dd7cddfSDavid du Colombier 	"	if (noends)",
44507dd7cddfSDavid du Colombier 	"		printf(\"- (disabled by -E flag)\\n\\n\");",
44517dd7cddfSDavid du Colombier 	"	else",
44527dd7cddfSDavid du Colombier 	"		printf(\"+\\n\\n\");",
44537dd7cddfSDavid du Colombier 	"#endif",
445400d97012SDavid du Colombier 	"	printf(\"State-vector %%d byte, depth reached %%ld\", hmax,",
445500d97012SDavid du Colombier 	"#if NCORE>1",
445600d97012SDavid du Colombier 	"					(nr_handoffs * z_handoff) +",
445700d97012SDavid du Colombier 	"#endif",
445800d97012SDavid du Colombier 	"					mreached);",
4459*de2caf28SDavid du Colombier 	"	printf(\", errors: %%lu\\n\", errors);",
446000d97012SDavid du Colombier 	"	fflush(stdout);",
44617dd7cddfSDavid du Colombier 	"#ifdef MA",
44627dd7cddfSDavid du Colombier 	"	if (done)",
44637dd7cddfSDavid du Colombier 	"	{	extern void dfa_stats(void);",
44647dd7cddfSDavid du Colombier 	"		if (maxgs+a_cycles+2 < MA)",
44657dd7cddfSDavid du Colombier 	"		printf(\"MA stats: -DMA=%%d is sufficient\\n\",",
44667dd7cddfSDavid du Colombier 	"			maxgs+a_cycles+2);",
44677dd7cddfSDavid du Colombier 	"		dfa_stats();",
44687dd7cddfSDavid du Colombier 	"	}",
44697dd7cddfSDavid du Colombier 	"#endif",
4470219b2ee8SDavid du Colombier 	"	wrap_stats();",
44717dd7cddfSDavid du Colombier 	"#ifdef CHECK",
4472312a1df1SDavid du Colombier 	"	printf(\"stackframes: %%d/%%d\\n\\n\", smax, svmax);",
447300d97012SDavid du Colombier 	"	printf(\"stats: fa %%ld, fh %%ld, zh %%ld, zn %%ld - \",",
44747dd7cddfSDavid du Colombier 	"		Fa, Fh, Zh, Zn);",
447500d97012SDavid du Colombier 	"	printf(\"check %%ld holds %%ld\\n\", Ccheck, Cholds);",
447600d97012SDavid du Colombier 	"	printf(\"stack stats: puts %%ld, probes %%ld, zaps %%ld\\n\",",
4477219b2ee8SDavid du Colombier 	"		PUT, PROBE, ZAPS);",
44787dd7cddfSDavid du Colombier 	"#else",
4479312a1df1SDavid du Colombier 	"	printf(\"\\n\");",
44807dd7cddfSDavid du Colombier 	"#endif",
4481312a1df1SDavid du Colombier 	"",
448200d97012SDavid du Colombier 	"#if !defined(BITSTATE) && defined(NOCOMP)",
448300d97012SDavid du Colombier 	"	if (!verbose) { goto jump_here; }",	/* added 5.2.0 */
448400d97012SDavid du Colombier 	"#endif",
448500d97012SDavid du Colombier 	"",
448600d97012SDavid du Colombier 	"#if 1",	/* omitted 5.2.0:  defined(BITSTATE) || !defined(NOCOMP) */
44877dd7cddfSDavid du Colombier 	"	nr1 = (nstates-nShadow)*",
4488*de2caf28SDavid du Colombier 	"	      (double)(hmax+sizeof(H_el)-sizeof(unsigned));",
4489312a1df1SDavid du Colombier 	"	#ifdef BFS",
4490312a1df1SDavid du Colombier 	"	nr2 = 0.0;",
4491312a1df1SDavid du Colombier 	"	#else",
44927dd7cddfSDavid du Colombier 	"	nr2 = (double) ((maxdepth+3)*sizeof(Trail));",
4493312a1df1SDavid du Colombier 	"	#endif",
4494312a1df1SDavid du Colombier 
44957dd7cddfSDavid du Colombier 	"	#ifndef BITSTATE",
44967dd7cddfSDavid du Colombier 			"#if !defined(MA) || defined(COLLAPSE)",
4497*de2caf28SDavid du Colombier 	"	nr3 = (double) (ONE_L<<ssize)*sizeof(H_el *);",
44987dd7cddfSDavid du Colombier 			"#endif",
44997dd7cddfSDavid du Colombier 	"	#else",
4500312a1df1SDavid du Colombier 	"	if (udmem)",
4501312a1df1SDavid du Colombier 	"		nr3 = (double) (udmem);",
4502312a1df1SDavid du Colombier 	"	else",
450300d97012SDavid du Colombier 	"		nr3 = (double) (ONE_L<<(ssize-3));",
45047dd7cddfSDavid du Colombier 			"#ifdef CNTRSTACK",
450500d97012SDavid du Colombier 	"	nr5 = (double) (ONE_L<<(ssize-3));",
45067dd7cddfSDavid du Colombier 			"#endif",
45077dd7cddfSDavid du Colombier 			"#ifdef FULLSTACK",
4508*de2caf28SDavid du Colombier 	"	nr5 = (double) (maxdepth*sizeof(H_el *));",
45097dd7cddfSDavid du Colombier 			"#endif",
45107dd7cddfSDavid du Colombier 	"	#endif",
451100d97012SDavid du Colombier 
45127dd7cddfSDavid du Colombier 	"	nr4 = (double) (svmax * (sizeof(Svtack) + hmax))",
451300d97012SDavid du Colombier 	"	    + (double) (smax  * (sizeof(_Stack) + Maxbody * sizeof(char)));",
45147dd7cddfSDavid du Colombier 		"#ifndef MA",
4515*de2caf28SDavid du Colombier 	"	if (1 /* verbose || memcnt < nr1+nr2+nr3+nr4+nr5 */)",
45167dd7cddfSDavid du Colombier 		"#endif",
4517312a1df1SDavid du Colombier 	"	{ double remainder = memcnt;",
4518312a1df1SDavid du Colombier 	"	  double tmp_nr = memcnt-nr3-nr4-(nr2-fragment)-nr5;",
451900d97012SDavid du Colombier 	"",
452000d97012SDavid du Colombier 	"	#if NCORE>1 && !defined(SEP_STATE)",
452100d97012SDavid du Colombier 	"		tmp_nr -= ((double) NCORE * LWQ_SIZE) + GWQ_SIZE;",
452200d97012SDavid du Colombier 	"	#endif",
4523312a1df1SDavid du Colombier 	"		if (tmp_nr < 0.0) tmp_nr = 0.;",
4524312a1df1SDavid du Colombier 	"		printf(\"Stats on memory usage (in Megabytes):\\n\");",
452500d97012SDavid du Colombier 	"		printf(\"%%9.3f\tequivalent memory usage for states\",",
452600d97012SDavid du Colombier 	"			nr1/1048576.); /* 1024*1024=1048576 */",
45277dd7cddfSDavid du Colombier 	"		printf(\" (stored*(State-vector + overhead))\\n\");",
452800d97012SDavid du Colombier 	"	#if NCORE>1 && !defined(WIN32) && !defined(WIN64)",
452900d97012SDavid du Colombier 	"		printf(\"%%9.3f\tshared memory reserved for state storage\\n\",",
453000d97012SDavid du Colombier 	"			mem_reserved/1048576.);",
453100d97012SDavid du Colombier 	"		#ifdef SEP_HEAP",
453200d97012SDavid du Colombier 	"		printf(\"\t\tin %%d local heaps of %%7.3f MB each\\n\",",
453300d97012SDavid du Colombier 	"			NCORE, mem_reserved/(NCORE*1048576.));",
453400d97012SDavid du Colombier 	"		#endif",
453500d97012SDavid du Colombier 	"		printf(\"\\n\");",
453600d97012SDavid du Colombier 	"	#endif",
4537219b2ee8SDavid du Colombier 	"	#ifdef BITSTATE",
4538312a1df1SDavid du Colombier 	"		if (udmem)",
453900d97012SDavid du Colombier 	"			printf(\"%%9.3f\tmemory used for hash array (-M%%ld)\\n\",",
454000d97012SDavid du Colombier 	"			nr3/1048576., udmem/(1024L*1024L));",
4541312a1df1SDavid du Colombier 	"		else",
454200d97012SDavid du Colombier 	"			printf(\"%%9.3f\tmemory used for hash array (-w%%d)\\n\",",
454300d97012SDavid du Colombier 	"			nr3/1048576., ssize);",
4544312a1df1SDavid du Colombier 	"		if (nr5 > 0.0)",
454500d97012SDavid du Colombier 	"		printf(\"%%9.3f\tmemory used for bit stack\\n\",",
454600d97012SDavid du Colombier 	"			nr5/1048576.);",
4547312a1df1SDavid du Colombier 	"		remainder = remainder - nr3 - nr5;",
45487dd7cddfSDavid du Colombier 	"	#else",
4549*de2caf28SDavid du Colombier 	"		#ifndef USE_TDH",
455000d97012SDavid du Colombier 	"			printf(\"%%9.3f\tactual memory usage for states\",",
455100d97012SDavid du Colombier 	"				tmp_nr/1048576.);",
455200d97012SDavid du Colombier 	"			remainder -= tmp_nr;",
45537dd7cddfSDavid du Colombier 	"			if (tmp_nr > 0.)",
4554*de2caf28SDavid du Colombier 	"			{	if (tmp_nr < nr1) ",
4555*de2caf28SDavid du Colombier 	"				{	printf(\" (compression: %%.2f%%%%)\\n\",",
45567dd7cddfSDavid du Colombier 	"						(100.0*tmp_nr)/nr1);",
45577dd7cddfSDavid du Colombier 	"				} else",
4558*de2caf28SDavid du Colombier 	"				{	printf(\"\\n\");",
4559*de2caf28SDavid du Colombier 	"				}",
4560*de2caf28SDavid du Colombier 	"			} else",
4561*de2caf28SDavid du Colombier 	"			{	printf(\" (less than 1k)\\n\");",
4562*de2caf28SDavid du Colombier 	"			}",
45637dd7cddfSDavid du Colombier 	"			#ifndef MA",
4564*de2caf28SDavid du Colombier 	"			if (tmp_nr > 0. && tmp_nr < nr1)",
456500d97012SDavid du Colombier 	"			{	printf(\"         \tstate-vector as stored = %%.0f byte\",",
45667dd7cddfSDavid du Colombier 	"				(tmp_nr)/(nstates-nShadow) -",
4567*de2caf28SDavid du Colombier 	"				(double) (sizeof(H_el) - sizeof(unsigned)));",
4568f3793cddSDavid du Colombier 	"				printf(\" + %%ld byte overhead\\n\",",
4569*de2caf28SDavid du Colombier 	"				(long int) sizeof(H_el)-sizeof(unsigned));",
45707dd7cddfSDavid du Colombier 	"			}",
45717dd7cddfSDavid du Colombier 	"			#endif",
4572*de2caf28SDavid du Colombier 	"		#endif",
45737dd7cddfSDavid du Colombier 	"		#if !defined(MA) || defined(COLLAPSE)",
4574*de2caf28SDavid du Colombier 	"			#ifdef BFS_PAR",
4575*de2caf28SDavid du Colombier 	"				printf(\"%%9.3f\tshared memory used for hash table (-w%%d)\\n\",",
4576*de2caf28SDavid du Colombier 	"				((double) bfs_pre_allocated)/1048576., ssize);",
4577*de2caf28SDavid du Colombier 	"			#else",
457800d97012SDavid du Colombier 	"				printf(\"%%9.3f\tmemory used for hash table (-w%%d)\\n\",",
457900d97012SDavid du Colombier 	"					nr3/1048576., ssize);",
458000d97012SDavid du Colombier 	"				remainder -= nr3;",
45817dd7cddfSDavid du Colombier 	"			#endif",
45827dd7cddfSDavid du Colombier 	"		#endif",
4583*de2caf28SDavid du Colombier 	"	#endif",
4584312a1df1SDavid du Colombier 	"	#ifndef BFS",
458500d97012SDavid du Colombier 	"		printf(\"%%9.3f\tmemory used for DFS stack (-m%%ld)\\n\",",
458600d97012SDavid du Colombier 	"			nr2/1048576., maxdepth);",
458700d97012SDavid du Colombier 	"		remainder -= nr2;",
4588312a1df1SDavid du Colombier 	"	#endif",
458900d97012SDavid du Colombier 	"	#if NCORE>1",
459000d97012SDavid du Colombier 	"		remainder -= ((double) NCORE * LWQ_SIZE) + GWQ_SIZE;",
459100d97012SDavid du Colombier 	"		printf(\"%%9.3f\tshared memory used for work-queues\\n\",",
459200d97012SDavid du Colombier 	"			(GWQ_SIZE + (double) NCORE * LWQ_SIZE) /1048576.);",
459300d97012SDavid du Colombier 	"		printf(\"\t\tin %%d queues of %%7.3f MB each\",",
459400d97012SDavid du Colombier 	"			NCORE, (double) LWQ_SIZE /1048576.);",
459500d97012SDavid du Colombier 	"		#ifndef NGQ",
459600d97012SDavid du Colombier 	"		printf(\" + a global q of %%7.3f MB\\n\",",
459700d97012SDavid du Colombier 	"			(double) GWQ_SIZE / 1048576.);",
459800d97012SDavid du Colombier 	"		#else",
459900d97012SDavid du Colombier 	"		printf(\"\\n\");",
460000d97012SDavid du Colombier 	"		#endif",
460100d97012SDavid du Colombier 	"	#endif",
460200d97012SDavid du Colombier 	"		if (remainder - fragment > 1048576.)",
4603*de2caf28SDavid du Colombier 	"		{	printf(\"%%9.3f\tother (proc and chan stacks)\\n\",",
460400d97012SDavid du Colombier 	"			(remainder-fragment)/1048576.);",
4605*de2caf28SDavid du Colombier 	"		}",
460600d97012SDavid du Colombier 	"		if (fragment > 1048576.)",
4607*de2caf28SDavid du Colombier 	"		{	printf(\"%%9.3f\tmemory lost to fragmentation\\n\",",
460800d97012SDavid du Colombier 	"			fragment/1048576.);",
4609*de2caf28SDavid du Colombier 	"		}",
4610*de2caf28SDavid du Colombier 	"	#ifdef BFS_PAR",
4611*de2caf28SDavid du Colombier 	"		printf(\"%%9.3f\ttotal non-shared memory usage\\n\\n\",",
4612*de2caf28SDavid du Colombier 	"			memcnt/1048576.);",
4613*de2caf28SDavid du Colombier 	"	#else",
461400d97012SDavid du Colombier 	"		printf(\"%%9.3f\ttotal actual memory usage\\n\\n\",",
461500d97012SDavid du Colombier 	"			memcnt/1048576.);",
4616*de2caf28SDavid du Colombier 	"	#endif",
4617312a1df1SDavid du Colombier 	"	}",
4618312a1df1SDavid du Colombier 	"	#ifndef MA",
4619312a1df1SDavid du Colombier 	"	else",
4620219b2ee8SDavid du Colombier 	"	#endif",
4621312a1df1SDavid du Colombier 	"#endif",
462200d97012SDavid du Colombier 
462300d97012SDavid du Colombier 	"#if !defined(BITSTATE) && defined(NOCOMP)",
462400d97012SDavid du Colombier 	"jump_here:",
462500d97012SDavid du Colombier 	"#endif",
4626312a1df1SDavid du Colombier 	"#ifndef MA",
4627*de2caf28SDavid du Colombier 	"	printf(\"%%9.3f\tmemory usage (Mbyte)\\n\",",
462800d97012SDavid du Colombier 	"		memcnt/1048576.);",
4629219b2ee8SDavid du Colombier 	"#endif",
4630*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
4631*de2caf28SDavid du Colombier 	"	bfs_report_mem();",
4632*de2caf28SDavid du Colombier 	"#else",
4633*de2caf28SDavid du Colombier 	"	printf(\"\\n\");",
4634*de2caf28SDavid du Colombier 	"#endif",
46357dd7cddfSDavid du Colombier 	"#ifdef COLLAPSE",
4636*de2caf28SDavid du Colombier 	"	printf(\"nr of templates: [ 0:globals 1:chans 2:procs ]\\n\");",
46377dd7cddfSDavid du Colombier 	"	printf(\"collapse counts: [ \");",
46387dd7cddfSDavid du Colombier 	"	{ int i; for (i = 0; i < 256+2; i++)",
46397dd7cddfSDavid du Colombier 	"		if (ncomps[i] != 0)",
4640*de2caf28SDavid du Colombier 	"			printf(\"%%d:%%lu \", i, ncomps[i]);",
46417dd7cddfSDavid du Colombier 	"		printf(\"]\\n\");",
46427dd7cddfSDavid du Colombier 	"	}",
46437dd7cddfSDavid du Colombier 	"#endif",
464400d97012SDavid du Colombier 	"	#ifdef TRIX",
4645*de2caf28SDavid du Colombier 	"	if (verbose)",
464600d97012SDavid du Colombier 	"	{	int i;",
464700d97012SDavid du Colombier 	"		printf(\"TRIX counts:\\n\");",
464800d97012SDavid du Colombier 	"		printf(\"  processes: \");",
464900d97012SDavid du Colombier 	"		for (i = 0; i < MAXPROC; i++)",
465000d97012SDavid du Colombier 	"			if (_p_count[i] != 0)",
465100d97012SDavid du Colombier 	"			{	printf(\"%%3d:%%ld \",",
465200d97012SDavid du Colombier 	"					i, _p_count[i]);",
465300d97012SDavid du Colombier 	"			}",
465400d97012SDavid du Colombier 	"		printf(\"\\n  channels : \");",
465500d97012SDavid du Colombier 	"		for (i = 0; i < MAXQ; i++)",
465600d97012SDavid du Colombier 	"			if (_c_count[i] != 0)",
465700d97012SDavid du Colombier 	"			{	printf(\"%%3d:%%ld \",",
465800d97012SDavid du Colombier 	"					i, _c_count[i]);",
465900d97012SDavid du Colombier 	"			}",
466000d97012SDavid du Colombier 	"		printf(\"\\n\\n\");",
466100d97012SDavid du Colombier 	"	}",
466200d97012SDavid du Colombier 	"	#endif",
46637dd7cddfSDavid du Colombier 
46647dd7cddfSDavid du Colombier 	"	if ((done || verbose) && !no_rck) do_reach();",
4665219b2ee8SDavid du Colombier 	"#ifdef PEG",
4666219b2ee8SDavid du Colombier 	"	{ int i;",
4667219b2ee8SDavid du Colombier 	"	  printf(\"\\nPeg Counts (transitions executed):\\n\");",
4668219b2ee8SDavid du Colombier 	"	  for (i = 1; i < NTRANS; i++)",
4669219b2ee8SDavid du Colombier 	"	  {	if (peg[i]) putpeg(i, peg[i]);",
4670219b2ee8SDavid du Colombier 	"	} }",
4671219b2ee8SDavid du Colombier 	"#endif",
46727dd7cddfSDavid du Colombier 	"#ifdef VAR_RANGES",
46737dd7cddfSDavid du Colombier 	"	dumpranges();",
46747dd7cddfSDavid du Colombier 	"#endif",
46757dd7cddfSDavid du Colombier 	"#ifdef SVDUMP",
46767dd7cddfSDavid du Colombier 	"	if (vprefix > 0) close(svfd);",
46777dd7cddfSDavid du Colombier 	"#endif",
467800d97012SDavid du Colombier 	"#ifdef LOOPSTATE",
467900d97012SDavid du Colombier 	"	printf(\"%%g loopstates hit\\n\", cnt_loops);",
468000d97012SDavid du Colombier 	"#endif",
468100d97012SDavid du Colombier 	"#ifdef NSUCC",
468200d97012SDavid du Colombier 	"	dump_succ();",
468300d97012SDavid du Colombier 	"#endif",
468400d97012SDavid du Colombier 	"#if NCORE>1 && defined(T_ALERT)",
468500d97012SDavid du Colombier 	"	crash_report();",
468600d97012SDavid du Colombier 	"#endif",
4687*de2caf28SDavid du Colombier 	"#ifndef BFS_PAR",
4688312a1df1SDavid du Colombier 	"	pan_exit(0);",
4689*de2caf28SDavid du Colombier 	"#endif",
4690219b2ee8SDavid du Colombier 	"}\n",
4691219b2ee8SDavid du Colombier 	"void",
46927dd7cddfSDavid du Colombier 	"stopped(int arg)",
4693*de2caf28SDavid du Colombier 	"{",
4694*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
4695*de2caf28SDavid du Colombier 	"	bfs_shutdown(\"interrupted\");",
4696*de2caf28SDavid du Colombier 	"#endif",
4697*de2caf28SDavid du Colombier 	"	printf(\"Interrupted\\n\");",
469800d97012SDavid du Colombier 	"#if NCORE>1",
469900d97012SDavid du Colombier 	"	was_interrupted = 1;",
470000d97012SDavid du Colombier 	"#endif",
47017dd7cddfSDavid du Colombier 	"	wrapup();",
4702f3793cddSDavid du Colombier 	"	pan_exit(0);",
47037dd7cddfSDavid du Colombier 	"}",
4704312a1df1SDavid du Colombier 	"",
470500d97012SDavid du Colombier 	"/*",
470600d97012SDavid du Colombier 	" * super fast hash, based on Paul Hsieh's function",
470700d97012SDavid du Colombier 	" * http://www.azillionmonkeys.com/qed/hash.html",
470800d97012SDavid du Colombier 	" */",
470900d97012SDavid du Colombier 	"#include <stdint.h>",	/* for uint32_t etc */
471000d97012SDavid du Colombier 	" #undef get16bits",
4711*de2caf28SDavid du Colombier 	" #if defined(__GNUC__) && defined(__i386__)",
471200d97012SDavid du Colombier 	"	#define get16bits(d) (*((const uint16_t *) (d)))",
4713*de2caf28SDavid du Colombier 	" #else",
471400d97012SDavid du Colombier 	"	#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\\",
471500d97012SDavid du Colombier 	"                              +(uint32_t)(((const uint8_t *)(d))[0]) )",
471600d97012SDavid du Colombier 	" #endif",
471700d97012SDavid du Colombier 	"",
471800d97012SDavid du Colombier 	"void",
4719*de2caf28SDavid du Colombier 	"d_sfh(uchar *s, int len)",	/* sets one 32-bit number, in K1 */
472000d97012SDavid du Colombier 	"{	uint32_t h = len, tmp;",
472100d97012SDavid du Colombier 	"	int rem;",
472200d97012SDavid du Colombier 	"",
472300d97012SDavid du Colombier 	"	rem = len & 3;",
472400d97012SDavid du Colombier 	"	len >>= 2;",
472500d97012SDavid du Colombier 	"",
472600d97012SDavid du Colombier 	"	for ( ; len > 0; len--)",
472700d97012SDavid du Colombier 	"	{	h  += get16bits(s);",
472800d97012SDavid du Colombier 	"        	tmp = (get16bits(s+2) << 11) ^ h;",
472900d97012SDavid du Colombier 	"        	h   = (h << 16) ^ tmp;",
473000d97012SDavid du Colombier 	"        	s  += 2*sizeof(uint16_t);",
473100d97012SDavid du Colombier 	"		h  += h >> 11;",
473200d97012SDavid du Colombier 	"	}",
473300d97012SDavid du Colombier 	"	switch (rem) {",
473400d97012SDavid du Colombier 	"	case 3: h += get16bits(s);",
473500d97012SDavid du Colombier 	"		h ^= h << 16;",
473600d97012SDavid du Colombier 	"		h ^= s[sizeof(uint16_t)] << 18;",
473700d97012SDavid du Colombier 	"		h += h >> 11;",
473800d97012SDavid du Colombier 	"		break;",
473900d97012SDavid du Colombier 	"	case 2: h += get16bits(s);",
474000d97012SDavid du Colombier 	"		h ^= h << 11;",
474100d97012SDavid du Colombier 	"		h += h >> 17;",
474200d97012SDavid du Colombier 	"		break;",
474300d97012SDavid du Colombier 	"	case 1: h += *s;",
474400d97012SDavid du Colombier 	"		h ^= h << 10;",
474500d97012SDavid du Colombier 	"		h += h >> 1;",
474600d97012SDavid du Colombier 	"		break;",
474700d97012SDavid du Colombier 	"	}",
474800d97012SDavid du Colombier 	"	h ^= h << 3;",
474900d97012SDavid du Colombier 	"	h += h >> 5;",
475000d97012SDavid du Colombier 	"	h ^= h << 4;",
475100d97012SDavid du Colombier 	"	h += h >> 17;",
475200d97012SDavid du Colombier 	"	h ^= h << 25;",
475300d97012SDavid du Colombier 	"	h += h >> 6;",
475400d97012SDavid du Colombier 	"",
475500d97012SDavid du Colombier 	"	K1 = h;",
475600d97012SDavid du Colombier 	"}",
475700d97012SDavid du Colombier 	"",
4758*de2caf28SDavid du Colombier 	"#if WS>4",
475900d97012SDavid du Colombier 	"/* 64-bit Jenkins hash, 1997",
476000d97012SDavid du Colombier 	" * http://burtleburtle.net/bob/c/lookup8.c",
476100d97012SDavid du Colombier 	" */",
4762312a1df1SDavid du Colombier 	"#define mix(a,b,c) \\",
4763312a1df1SDavid du Colombier 	"{ a -= b; a -= c; a ^= (c>>43); \\",
4764312a1df1SDavid du Colombier 	"  b -= c; b -= a; b ^= (a<<9);  \\",
4765312a1df1SDavid du Colombier 	"  c -= a; c -= b; c ^= (b>>8);  \\",
4766312a1df1SDavid du Colombier 	"  a -= b; a -= c; a ^= (c>>38); \\",
4767312a1df1SDavid du Colombier 	"  b -= c; b -= a; b ^= (a<<23); \\",
4768312a1df1SDavid du Colombier 	"  c -= a; c -= b; c ^= (b>>5);  \\",
4769312a1df1SDavid du Colombier 	"  a -= b; a -= c; a ^= (c>>35); \\",
4770312a1df1SDavid du Colombier 	"  b -= c; b -= a; b ^= (a<<49); \\",
4771312a1df1SDavid du Colombier 	"  c -= a; c -= b; c ^= (b>>11); \\",
4772312a1df1SDavid du Colombier 	"  a -= b; a -= c; a ^= (c>>12); \\",
4773312a1df1SDavid du Colombier 	"  b -= c; b -= a; b ^= (a<<18); \\",
4774312a1df1SDavid du Colombier 	"  c -= a; c -= b; c ^= (b>>22); \\",
47757dd7cddfSDavid du Colombier 	"}",
47767dd7cddfSDavid du Colombier 	"#else",
477700d97012SDavid du Colombier 	"/* 32-bit Jenkins hash, 2006",
477800d97012SDavid du Colombier 	" * http://burtleburtle.net/bob/c/lookup3.c",
477900d97012SDavid du Colombier 	" */",
478000d97012SDavid du Colombier 	"#define rot(x,k)	(((x)<<(k))|((x)>>(32-(k))))",
478100d97012SDavid du Colombier 	"",
4782312a1df1SDavid du Colombier 	"#define mix(a,b,c) \\",
478300d97012SDavid du Colombier 	"{ a -= c;  a ^= rot(c, 4);  c += b; \\",
478400d97012SDavid du Colombier 	"  b -= a;  b ^= rot(a, 6);  a += c; \\",
478500d97012SDavid du Colombier 	"  c -= b;  c ^= rot(b, 8);  b += a; \\",
478600d97012SDavid du Colombier 	"  a -= c;  a ^= rot(c,16);  c += b; \\",
478700d97012SDavid du Colombier 	"  b -= a;  b ^= rot(a,19);  a += c; \\",
478800d97012SDavid du Colombier 	"  c -= b;  c ^= rot(b, 4);  b += a; \\",
478900d97012SDavid du Colombier 	"}",
479000d97012SDavid du Colombier 	"",
479100d97012SDavid du Colombier 	"#define final(a,b,c) \\",
479200d97012SDavid du Colombier 	"{ c ^= b; c -= rot(b,14); \\",
479300d97012SDavid du Colombier 	"  a ^= c; a -= rot(c,11); \\",
479400d97012SDavid du Colombier 	"  b ^= a; b -= rot(a,25); \\",
479500d97012SDavid du Colombier 	"  c ^= b; c -= rot(b,16); \\",
479600d97012SDavid du Colombier 	"  a ^= c; a -= rot(c,4);  \\",
479700d97012SDavid du Colombier 	"  b ^= a; b -= rot(a,14); \\",
479800d97012SDavid du Colombier 	"  c ^= b; c -= rot(b,24); \\",
4799312a1df1SDavid du Colombier 	"}",
48007dd7cddfSDavid du Colombier 	"#endif",
480100d97012SDavid du Colombier 	"",
4802312a1df1SDavid du Colombier 	"void",
4803*de2caf28SDavid du Colombier 	"d_hash(uchar *kb, int nbytes)", /* sets two 64-bit or 32-bit nrs, depending on WS */
480400d97012SDavid du Colombier 	"{	uint8_t  *bp;",
4805*de2caf28SDavid du Colombier 	"#if WS>4",
480600d97012SDavid du Colombier 	"	uint64_t a = 0, b, c, n;",
4807*de2caf28SDavid du Colombier 	"	const uint64_t *k = (uint64_t *) kb;",
480800d97012SDavid du Colombier 	"#else",
480900d97012SDavid du Colombier 	"	uint32_t a = 0, b, c, n;",
4810*de2caf28SDavid du Colombier 	"	const uint32_t *k = (uint32_t *) kb;",
481100d97012SDavid du Colombier 	"#endif",
481200d97012SDavid du Colombier 	"	n = nbytes/WS;	/* nr of words */",
481300d97012SDavid du Colombier 	"	/* extend to multiple of words, if needed */",
481400d97012SDavid du Colombier 	"	a = WS - (nbytes %% WS);",
481500d97012SDavid du Colombier 	"	if (a > 0 && a < WS)",
481600d97012SDavid du Colombier 	"	{	n++;",
481700d97012SDavid du Colombier 	"		bp = kb + nbytes;",
481800d97012SDavid du Colombier 	"		switch (a) {",
4819*de2caf28SDavid du Colombier 	"#if WS>4",
482000d97012SDavid du Colombier 	"		case 7: *bp++ = 0; /* fall thru */",
482100d97012SDavid du Colombier 	"		case 6: *bp++ = 0; /* fall thru */",
482200d97012SDavid du Colombier 	"		case 5: *bp++ = 0; /* fall thru */",
482300d97012SDavid du Colombier 	"		case 4: *bp++ = 0; /* fall thru */",
482400d97012SDavid du Colombier 	"#endif",
482500d97012SDavid du Colombier 	"		case 3: *bp++ = 0; /* fall thru */",
482600d97012SDavid du Colombier 	"		case 2: *bp++ = 0; /* fall thru */",
482700d97012SDavid du Colombier 	"		case 1: *bp   = 0;",
482800d97012SDavid du Colombier 	"		case 0: break;",
482900d97012SDavid du Colombier 	"	}	}",
4830*de2caf28SDavid du Colombier 	"#if WS>4",
4831312a1df1SDavid du Colombier 	"	b = HASH_CONST[HASH_NR];",
483200d97012SDavid du Colombier 	"	c = 0x9e3779b97f4a7c13LL; /* arbitrary value */",
483300d97012SDavid du Colombier 	"	while (n >= 3)",
4834312a1df1SDavid du Colombier 	"	{	a += k[0];",
4835312a1df1SDavid du Colombier 	"		b += k[1];",
4836312a1df1SDavid du Colombier 	"		c += k[2];",
4837312a1df1SDavid du Colombier 	"		mix(a,b,c);",
483800d97012SDavid du Colombier 	"		n -= 3;",
483900d97012SDavid du Colombier 	"		k += 3;",
4840312a1df1SDavid du Colombier 	"	}",
484100d97012SDavid du Colombier 	"	c += (((uint64_t) nbytes)<<3);",
484200d97012SDavid du Colombier 	"	switch (n) {",
4843312a1df1SDavid du Colombier 	"	case 2: b += k[1];",
4844312a1df1SDavid du Colombier 	"	case 1: a += k[0];",
484500d97012SDavid du Colombier 	"	case 0: break;",
4846312a1df1SDavid du Colombier 	"	}",
4847312a1df1SDavid du Colombier 	"	mix(a,b,c);",
484800d97012SDavid du Colombier 	"#else", /* 32 bit version: */
484900d97012SDavid du Colombier 	"	a = c = 0xdeadbeef + (n<<2);",
485000d97012SDavid du Colombier 	"	b = HASH_CONST[HASH_NR];",
485100d97012SDavid du Colombier 	"	while (n > 3)",
485200d97012SDavid du Colombier 	"	{	a += k[0];",
485300d97012SDavid du Colombier 	"		b += k[1];",
485400d97012SDavid du Colombier 	"		c += k[2];",
485500d97012SDavid du Colombier 	"		mix(a,b,c);",
485600d97012SDavid du Colombier 	"		n -= 3;",
485700d97012SDavid du Colombier 	"		k += 3;",
4858312a1df1SDavid du Colombier 	"	}",
485900d97012SDavid du Colombier 	"	switch (n) { ",
486000d97012SDavid du Colombier 	"	case 3: c += k[2];",
486100d97012SDavid du Colombier 	"	case 2: b += k[1];",
486200d97012SDavid du Colombier 	"	case 1: a += k[0];",
486300d97012SDavid du Colombier 	"		final(a,b,c);",
486400d97012SDavid du Colombier 	"	case 0: break;",
486500d97012SDavid du Colombier 	"	}",
486600d97012SDavid du Colombier 	"#endif",
4867*de2caf28SDavid du Colombier 	"	j1_spin = c&nmask; j3_spin = a&7; /* 1st bit */",
4868*de2caf28SDavid du Colombier 	"	j2_spin = b&nmask; j4_spin = (a>>3)&7; /* 2nd bit */",
486900d97012SDavid du Colombier 	"	K1 = c; K2 = b;",
487000d97012SDavid du Colombier 	"}",
487100d97012SDavid du Colombier 	"",
4872*de2caf28SDavid du Colombier 	"#if defined(MURMUR) && (WS==8)",
4873*de2caf28SDavid du Colombier 	"/* public-domain, 64-bit MurmurHash3, by Austin Appleby */",
4874*de2caf28SDavid du Colombier 	"/*  https://code.google.com/p/smhasher/wiki/MurmurHash3 */",
4875312a1df1SDavid du Colombier 	"void",
4876*de2caf28SDavid du Colombier 	"m_hash(uchar *v, int len)",
4877*de2caf28SDavid du Colombier 	"{	uint8_t *bp, *data = (uint8_t*) v;",
4878*de2caf28SDavid du Colombier 	"	int i, nblocks = len / 16;",
4879*de2caf28SDavid du Colombier 	"",
4880*de2caf28SDavid du Colombier 	"	uint64_t h1 = HASH_CONST[HASH_NR];",
4881*de2caf28SDavid du Colombier 	"	uint64_t h2 = 0x9e3779b97f4a7c13LL;",
4882*de2caf28SDavid du Colombier 	"",
4883*de2caf28SDavid du Colombier 	"	uint64_t c1 = 0x87c37b91114253d5;",
4884*de2caf28SDavid du Colombier 	"	uint64_t c2 = 0x4cf5ad432745937f;",
4885*de2caf28SDavid du Colombier 	"",
4886*de2caf28SDavid du Colombier 	"	uint64_t *blocks = (uint64_t *)(data);",
4887*de2caf28SDavid du Colombier 	"",
4888*de2caf28SDavid du Colombier 	"	/* guarantee a multiple of 16 bytes */",
4889*de2caf28SDavid du Colombier 	"	i = 16 - (len %% 16);",
4890*de2caf28SDavid du Colombier 	"	if (i > 0 && i < 16)",
4891*de2caf28SDavid du Colombier 	"	{	nblocks++;",
4892*de2caf28SDavid du Colombier 	"		bp = v + len;",
4893*de2caf28SDavid du Colombier 	"		switch (i) {",
4894*de2caf28SDavid du Colombier 	"		case 15: *bp++ = 0; /* fall thru */",
4895*de2caf28SDavid du Colombier 	"		case 14: *bp++ = 0;",
4896*de2caf28SDavid du Colombier 	"		case 13: *bp++ = 0;",
4897*de2caf28SDavid du Colombier 	"		case 12: *bp++ = 0;",
4898*de2caf28SDavid du Colombier 	"		case 11: *bp++ = 0;",
4899*de2caf28SDavid du Colombier 	"		case 10: *bp++ = 0;",
4900*de2caf28SDavid du Colombier 	"		case  9: *bp++ = 0;",
4901*de2caf28SDavid du Colombier 	"		case  8: *bp++ = 0;",
4902*de2caf28SDavid du Colombier 	"		case  7: *bp++ = 0;",
4903*de2caf28SDavid du Colombier 	"		case  6: *bp++ = 0;",
4904*de2caf28SDavid du Colombier 	"		case  5: *bp++ = 0;",
4905*de2caf28SDavid du Colombier 	"		case  4: *bp++ = 0;",
4906*de2caf28SDavid du Colombier 	"		case  3: *bp++ = 0;",
4907*de2caf28SDavid du Colombier 	"		case  2: *bp++ = 0;",
4908*de2caf28SDavid du Colombier 	"		case  1: *bp   = 0;",
4909*de2caf28SDavid du Colombier 	"		case  0: break;",
4910*de2caf28SDavid du Colombier 	"       }       }",
4911*de2caf28SDavid du Colombier 	"",
4912*de2caf28SDavid du Colombier 	"	for (i = 0; i < nblocks; i++)",
4913*de2caf28SDavid du Colombier 	"	{	uint64_t k1 = blocks[i*2];",
4914*de2caf28SDavid du Colombier 	"		uint64_t k2 = blocks[i*2+1];",
4915*de2caf28SDavid du Colombier 	"",
4916*de2caf28SDavid du Colombier 	"		k1 *= c1;",
4917*de2caf28SDavid du Colombier 	"		k1 = (k1 << 31) | (k1 >> 33);",
4918*de2caf28SDavid du Colombier 	"		k1 *= c2;",
4919*de2caf28SDavid du Colombier 	"		h1 ^= k1;",
4920*de2caf28SDavid du Colombier 	"",
4921*de2caf28SDavid du Colombier 	"		h1 = (h1 << 27) | (h1 >> 37);",
4922*de2caf28SDavid du Colombier 	"		h1 += h2;",
4923*de2caf28SDavid du Colombier 	"		h1 = h1 * 5 + 0x52dce729;",
4924*de2caf28SDavid du Colombier 	"",
4925*de2caf28SDavid du Colombier 	"		k2 *= c2;",
4926*de2caf28SDavid du Colombier 	"		k2 = (k2 << 33) | (k2 >> 31);",
4927*de2caf28SDavid du Colombier 	"		k2 *= c1;",
4928*de2caf28SDavid du Colombier 	"		h2 ^= k2;",
4929*de2caf28SDavid du Colombier 	"",
4930*de2caf28SDavid du Colombier 	"		h2 = (h2 << 31) | (h2 >> 33);",
4931*de2caf28SDavid du Colombier 	"		h2 += h1;",
4932*de2caf28SDavid du Colombier 	"		h2 = h2 * 5 + 0x38495ab5;",
4933*de2caf28SDavid du Colombier 	"	}",
4934*de2caf28SDavid du Colombier 	"",
4935*de2caf28SDavid du Colombier 	"	uint8_t *tail = (uint8_t*)(data + (nblocks * 16));",
4936*de2caf28SDavid du Colombier 	"",
4937*de2caf28SDavid du Colombier 	"	uint64_t k1 = 0;",
4938*de2caf28SDavid du Colombier 	"	uint64_t k2 = 0;",
4939*de2caf28SDavid du Colombier 	"",
4940*de2caf28SDavid du Colombier 	"	switch(len & 15) {",
4941*de2caf28SDavid du Colombier 	"	case 15: k2 ^= ((uint64_t) tail[14]) << 48; break;",
4942*de2caf28SDavid du Colombier 	"	case 14: k2 ^= ((uint64_t) tail[13]) << 40; break;",
4943*de2caf28SDavid du Colombier 	"	case 13: k2 ^= ((uint64_t) tail[12]) << 32; break;",
4944*de2caf28SDavid du Colombier 	"	case 12: k2 ^= ((uint64_t) tail[11]) << 24; break;",
4945*de2caf28SDavid du Colombier 	"	case 11: k2 ^= ((uint64_t) tail[10]) << 16; break;",
4946*de2caf28SDavid du Colombier 	"	case 10: k2 ^= ((uint64_t) tail[ 9]) << 8; break;",
4947*de2caf28SDavid du Colombier 	"	case  9: k2 ^= ((uint64_t) tail[ 8]) << 0; break;",
4948*de2caf28SDavid du Colombier 	"		 k2 *= c2;",
4949*de2caf28SDavid du Colombier 	"		 k2 = (k2 << 33) | (k2 >> 31);",
4950*de2caf28SDavid du Colombier 	"		 k2 *= c1;",
4951*de2caf28SDavid du Colombier 	"		 h2 ^= k2; break;",
4952*de2caf28SDavid du Colombier 	"	case  8: k1 ^= ((uint64_t) tail[7]) << 56; break;",
4953*de2caf28SDavid du Colombier 	"	case  7: k1 ^= ((uint64_t) tail[6]) << 48; break;",
4954*de2caf28SDavid du Colombier 	"	case  6: k1 ^= ((uint64_t) tail[5]) << 40; break;",
4955*de2caf28SDavid du Colombier 	"	case  5: k1 ^= ((uint64_t) tail[4]) << 32; break;",
4956*de2caf28SDavid du Colombier 	"	case  4: k1 ^= ((uint64_t) tail[3]) << 24; break;",
4957*de2caf28SDavid du Colombier 	"	case  3: k1 ^= ((uint64_t) tail[2]) << 16; break;",
4958*de2caf28SDavid du Colombier 	"	case  2: k1 ^= ((uint64_t) tail[1]) << 8; break;",
4959*de2caf28SDavid du Colombier 	"	case  1: k1 ^= ((uint64_t) tail[0]) << 0; break;",
4960*de2caf28SDavid du Colombier 	"		 k1 *= c1;",
4961*de2caf28SDavid du Colombier 	"		 k1 = (k1 << 31) | (k1 >> 33);",
4962*de2caf28SDavid du Colombier 	"		 k1 *= c2;",
4963*de2caf28SDavid du Colombier 	"		 h1 ^= k1;",
4964*de2caf28SDavid du Colombier 	"	};",
4965*de2caf28SDavid du Colombier 	"",
4966*de2caf28SDavid du Colombier 	"	h1 ^= len; h2 ^= len;",
4967*de2caf28SDavid du Colombier 	"	h1 += h2;",
4968*de2caf28SDavid du Colombier 	"	h2 += h1;",
4969*de2caf28SDavid du Colombier 	"	h1 ^= h1 >> 33;",
4970*de2caf28SDavid du Colombier 	"	h1 *= 0xff51afd7ed558ccd;",
4971*de2caf28SDavid du Colombier 	"	h1 ^= h1 >> 33;",
4972*de2caf28SDavid du Colombier 	"	h1 *= 0xc4ceb9fe1a85ec53;",
4973*de2caf28SDavid du Colombier 	"	h1 ^= h1 >> 33;",
4974*de2caf28SDavid du Colombier 	"	h2 ^= h2 >> 33;",
4975*de2caf28SDavid du Colombier 	"	h2 *= 0xff51afd7ed558ccd;",
4976*de2caf28SDavid du Colombier 	"	h2 ^= h2 >> 33;",
4977*de2caf28SDavid du Colombier 	"	h2 *= 0xc4ceb9fe1a85ec53;",
4978*de2caf28SDavid du Colombier 	"	h2 ^= h2 >> 33;",
4979*de2caf28SDavid du Colombier 	"	h1 += h2;",
4980*de2caf28SDavid du Colombier 	"	h2 += h1;",
4981*de2caf28SDavid du Colombier 	"",
4982*de2caf28SDavid du Colombier 	"	j1_spin = h1&nmask; j3_spin = (h1>>48)&7;",
4983*de2caf28SDavid du Colombier 	"	j2_spin = h2&nmask; j4_spin = (h2>>48)&7;",
4984*de2caf28SDavid du Colombier 	"	K1 = h1; K2 = h2;",
4985*de2caf28SDavid du Colombier 	"}",
498600d97012SDavid du Colombier 	"#endif",
4987*de2caf28SDavid du Colombier 	"",
4988*de2caf28SDavid du Colombier 	"void",
4989*de2caf28SDavid du Colombier 	"s_hash(uchar *cp, int om)",	/* uses either d_sfh (1x32bit), or d_hash (2x64bit) */
4990*de2caf28SDavid du Colombier 	"{",				/* depending on ssize ie the -w parameter */
4991*de2caf28SDavid du Colombier 	"	hasher(cp, om);		/* sets K1 */",
4992219b2ee8SDavid du Colombier 	"#ifdef BITSTATE",
4993312a1df1SDavid du Colombier 	"	if (S_Tab == H_tab)",	/* state stack in bitstate search */
499400d97012SDavid du Colombier 	"		j1_spin = K1 %% omaxdepth;",
4995219b2ee8SDavid du Colombier 	"	else",
4996*de2caf28SDavid du Colombier 	"#endif",
4997312a1df1SDavid du Colombier 	"	if (ssize < 8*WS)",
499800d97012SDavid du Colombier 	"		j1_spin = K1&mask;",
4999312a1df1SDavid du Colombier 	"	else",
500000d97012SDavid du Colombier 	"		j1_spin = K1;",
50017dd7cddfSDavid du Colombier 	"}",
5002312a1df1SDavid du Colombier 	"#ifndef RANDSTOR",
5003312a1df1SDavid du Colombier 	"int *prerand;",
5004219b2ee8SDavid du Colombier 	"void",
5005312a1df1SDavid du Colombier 	"inirand(void)",
5006312a1df1SDavid du Colombier 	"{	int i;",
5007*de2caf28SDavid du Colombier 	"	srand(s_rand+HASH_NR);",	/* inirand */
5008312a1df1SDavid du Colombier 	"	prerand = (int *) emalloc((omaxdepth+3)*sizeof(int));",
5009312a1df1SDavid du Colombier 	"	for (i = 0; i < omaxdepth+3; i++)",
5010*de2caf28SDavid du Colombier 	"	{	prerand[i] = rand();",
5011*de2caf28SDavid du Colombier 	"	}",
5012312a1df1SDavid du Colombier 	"}",
5013312a1df1SDavid du Colombier 	"int",
5014312a1df1SDavid du Colombier 	"pan_rand(void)",
5015312a1df1SDavid du Colombier 	"{	if (!prerand) inirand();",
5016312a1df1SDavid du Colombier 	"	return prerand[depth];",
50177dd7cddfSDavid du Colombier 	"}",
50187dd7cddfSDavid du Colombier 	"#endif",
5019312a1df1SDavid du Colombier 	"",
502000d97012SDavid du Colombier 	"void",
5021*de2caf28SDavid du Colombier 	"set_masks(void)",
502200d97012SDavid du Colombier 	"{",
502300d97012SDavid du Colombier 	"	if (WS == 4 && ssize >= 32)",
502400d97012SDavid du Colombier 	"	{	mask = 0xffffffff;",
502500d97012SDavid du Colombier 	"#ifdef BITSTATE",
502600d97012SDavid du Colombier 	"		switch (ssize) {",
502700d97012SDavid du Colombier 	"		case 34: nmask = (mask>>1); break;",
502800d97012SDavid du Colombier 	"		case 33: nmask = (mask>>2); break;",
502900d97012SDavid du Colombier 	"		default: nmask = (mask>>3); break;",
503000d97012SDavid du Colombier 	"		}",
503100d97012SDavid du Colombier 	"#else",
503200d97012SDavid du Colombier 	"		nmask = mask;",
503300d97012SDavid du Colombier 	"#endif",
503400d97012SDavid du Colombier 	"	} else if (WS == 8)",
503500d97012SDavid du Colombier 	"	{	mask = ((ONE_L<<ssize)-1);	/* hash init */",
503600d97012SDavid du Colombier 	"#ifdef BITSTATE",
503700d97012SDavid du Colombier 	"		nmask = mask>>3;",
503800d97012SDavid du Colombier 	"#else",
503900d97012SDavid du Colombier 	"		nmask = mask;",
504000d97012SDavid du Colombier 	"#endif",
504100d97012SDavid du Colombier 	"	} else if (WS != 4)",
504200d97012SDavid du Colombier 	"	{	fprintf(stderr, \"pan: wordsize %%ld not supported\\n\", (long int) WS);",
504300d97012SDavid du Colombier 	"		exit(1);",
504400d97012SDavid du Colombier 	"	} else	/* WS == 4 and ssize < 32 */",
504500d97012SDavid du Colombier 	"	{	mask = ((ONE_L<<ssize)-1);	/* hash init */",
504600d97012SDavid du Colombier 	"		nmask = (mask>>3);",
504700d97012SDavid du Colombier 	"	}",
504800d97012SDavid du Colombier 	"}",
504900d97012SDavid du Colombier 	"",
505000d97012SDavid du Colombier 	"#if defined(AUTO_RESIZE) && !defined(BITSTATE) && !defined(MA)",
505100d97012SDavid du Colombier 	"#if NCORE>1",
5052*de2caf28SDavid du Colombier 	"	#error cannot combine AUTO_RESIZE with NCORE>1",
505300d97012SDavid du Colombier 	"#endif",
5054*de2caf28SDavid du Colombier 	"static long reclaim_size;",
5055*de2caf28SDavid du Colombier 	"static char *reclaim_mem;",
5056*de2caf28SDavid du Colombier 	"static H_el **N_tab;",
505700d97012SDavid du Colombier 	"void",
5058*de2caf28SDavid du Colombier 	"reverse_capture(H_el *p)",
505900d97012SDavid du Colombier 	"{	if (!p) return;",
506000d97012SDavid du Colombier 	"	reverse_capture(p->nxt);",
506100d97012SDavid du Colombier 	"	/* last element of list moves first */",
506200d97012SDavid du Colombier 	"	/* to preserve list-order */",
5063*de2caf28SDavid du Colombier 	"	j2_spin = p->m_K1;",
506400d97012SDavid du Colombier 	"	if (ssize < 8*WS) /* probably always true */",
5065*de2caf28SDavid du Colombier 	"	{	j2_spin &= mask;",
506600d97012SDavid du Colombier 	"	}",
5067*de2caf28SDavid du Colombier 	"	p->nxt = N_tab[j2_spin];",
5068*de2caf28SDavid du Colombier 	"	N_tab[j2_spin] = p;",
506900d97012SDavid du Colombier 	"}",
507000d97012SDavid du Colombier 	"void",
507100d97012SDavid du Colombier 	"resize_hashtable(void)",
507200d97012SDavid du Colombier 	"{",
5073*de2caf28SDavid du Colombier 	"#ifndef BFS_PAR",	/* ssize and mask/nmask are not in shared mem */
507400d97012SDavid du Colombier 	"	if (WS == 4 && ssize >= 27 - 1)",
5075*de2caf28SDavid du Colombier 	"#endif",
507600d97012SDavid du Colombier 	"	{	return;	/* cannot increase further */",
507700d97012SDavid du Colombier 	"	}",
507800d97012SDavid du Colombier 	"",
507900d97012SDavid du Colombier 	"	ssize += 2; /* 4x size @htable ssize */",
508000d97012SDavid du Colombier 	"",
508100d97012SDavid du Colombier 	"	printf(\"pan: resizing hashtable to -w%%d.. \", ssize);",
508200d97012SDavid du Colombier 	"",
5083*de2caf28SDavid du Colombier 	"	N_tab = (H_el **) emalloc((ONE_L<<ssize)*sizeof(H_el *));",
508400d97012SDavid du Colombier 	"	set_masks();	/* they changed */",
508500d97012SDavid du Colombier 	"",
508600d97012SDavid du Colombier 	"	for (j1_spin = 0; j1_spin < (ONE_L << (ssize - 2)); j1_spin++)",
508700d97012SDavid du Colombier 	"	{	reverse_capture(H_tab[j1_spin]);",
508800d97012SDavid du Colombier 	"	}",
508900d97012SDavid du Colombier 	"	reclaim_mem = (char *) H_tab;",
509000d97012SDavid du Colombier 	"	reclaim_size = (ONE_L << (ssize - 2));",
509100d97012SDavid du Colombier 	"	H_tab = N_tab;",
509200d97012SDavid du Colombier 	"",
509300d97012SDavid du Colombier 	"	printf(\" done\\n\");",
509400d97012SDavid du Colombier 	"}",
509500d97012SDavid du Colombier 	"#endif",
509600d97012SDavid du Colombier 	"#if defined(ZAPH) && defined(BITSTATE)",
509700d97012SDavid du Colombier 	"void",
509800d97012SDavid du Colombier 	"zap_hashtable(void)",
509900d97012SDavid du Colombier 	"{	cpu_printf(\"pan: resetting hashtable\\n\");",
510000d97012SDavid du Colombier 	"	if (udmem)",
510100d97012SDavid du Colombier 	"	{	memset(SS, 0, udmem);",
510200d97012SDavid du Colombier 	"	} else",
510300d97012SDavid du Colombier 	"	{	memset(SS, 0, ONE_L<<(ssize-3));",
510400d97012SDavid du Colombier 	"	}",
510500d97012SDavid du Colombier 	"}",
510600d97012SDavid du Colombier 	"#endif",
510700d97012SDavid du Colombier 	"",
510800d97012SDavid du Colombier 	"#if NCLAIMS>1",
510900d97012SDavid du Colombier 	"int",
511000d97012SDavid du Colombier 	"find_claim(char *s)",
511100d97012SDavid du Colombier 	"{	int i, j;",
5112*de2caf28SDavid du Colombier 	"	for (i = 0; strncmp(procname[i], \":np_:\", 5) != 0; i++)",
511300d97012SDavid du Colombier 	"	{	if (strcmp(s, procname[i]) == 0)",
511400d97012SDavid du Colombier 	"		{	for (j = 0; j < NCLAIMS; j++)",
511500d97012SDavid du Colombier 	"			{	if (spin_c_typ[j] == i)",
511600d97012SDavid du Colombier 	"				{	return j;",
511700d97012SDavid du Colombier 	"			}	}",
511800d97012SDavid du Colombier 	"			break;",
511900d97012SDavid du Colombier 	"	}	}",
512000d97012SDavid du Colombier 	"	printf(\"pan: error: cannot find claim '%%s'\\n\", s);",
512100d97012SDavid du Colombier 	"	exit(1);",
512200d97012SDavid du Colombier 	"	return -1; /* unreachable */",
512300d97012SDavid du Colombier 	"}",
512400d97012SDavid du Colombier 	"#endif",
512500d97012SDavid du Colombier 	"",
5126*de2caf28SDavid du Colombier 	"#if defined(BFS_PAR) && defined(BFS_SEP_HASH)",
5127*de2caf28SDavid du Colombier 	"int	/* to avoid having to include <math.h> and compile with -lm */",
5128*de2caf28SDavid du Colombier 	"blog2(int n)	/* n >= 1 */",
5129*de2caf28SDavid du Colombier 	"{	int m=1, r=2;",
5130*de2caf28SDavid du Colombier 	"	if (n == 1) { return 0; }",
5131*de2caf28SDavid du Colombier 	"	if (n == 2) { return 1; }",
5132*de2caf28SDavid du Colombier 	"	while (n > r) { m++; r *= 2; }",
5133*de2caf28SDavid du Colombier 	"	return m;",
5134*de2caf28SDavid du Colombier 	"}",
5135*de2caf28SDavid du Colombier 	"#endif",
5136*de2caf28SDavid du Colombier 	"",
5137*de2caf28SDavid du Colombier 	"uint pp[33];",
5138*de2caf28SDavid du Colombier 	"",
5139*de2caf28SDavid du Colombier 	"uint ",
5140*de2caf28SDavid du Colombier 	"mul(uint a, uint b, uint p)",
5141*de2caf28SDavid du Colombier 	"{	int c = 0;",
5142*de2caf28SDavid du Colombier 	"	while (a)",
5143*de2caf28SDavid du Colombier 	"	{	if (a&1)",
5144*de2caf28SDavid du Colombier 	"		{	a ^= 1;",
5145*de2caf28SDavid du Colombier 	"			c ^= b;",
5146*de2caf28SDavid du Colombier 	"		}",
5147*de2caf28SDavid du Colombier 	"		a = (a>>1);",
5148*de2caf28SDavid du Colombier 	"		if (b & 0x80000000)",
5149*de2caf28SDavid du Colombier 	"		{	b += b;",
5150*de2caf28SDavid du Colombier 	"			b ^= p;",
5151*de2caf28SDavid du Colombier 	"		} else",
5152*de2caf28SDavid du Colombier 	"		{	b += b;",
5153*de2caf28SDavid du Colombier 	"	}	}",
5154*de2caf28SDavid du Colombier 	"	return c;",
5155*de2caf28SDavid du Colombier 	"}",
5156*de2caf28SDavid du Colombier 	"",
5157*de2caf28SDavid du Colombier 	"uint",
5158*de2caf28SDavid du Colombier 	"ppow(int n, uint p)",
5159*de2caf28SDavid du Colombier 	"{	uint t = 1; int i;",
5160*de2caf28SDavid du Colombier 	"	for (i = 0; i < 32; i++)",
5161*de2caf28SDavid du Colombier 	"	{	if (n & (1<<i))",
5162*de2caf28SDavid du Colombier 	"		{	t = mul(t, pp[i], p);",
5163*de2caf28SDavid du Colombier 	"	}	}",
5164*de2caf28SDavid du Colombier 	"	return t;",
5165*de2caf28SDavid du Colombier 	"}",
5166*de2caf28SDavid du Colombier 	"",
5167*de2caf28SDavid du Colombier 	"void",
5168*de2caf28SDavid du Colombier 	"hashgen(void)	/* courtesy Jim Reeds, 1995 */",
5169*de2caf28SDavid du Colombier 	"{	uint x, y, p; int i, cnt;",
5170*de2caf28SDavid du Colombier 	"	int ff[5] = { 3, 5, 17, 257, 65537 };",
5171*de2caf28SDavid du Colombier 	"	int nn[5];",
5172*de2caf28SDavid du Colombier 	"",
5173*de2caf28SDavid du Colombier 	"	srand(s_rand);	/* was: srandom(s_rand) */",
5174*de2caf28SDavid du Colombier 	"	nn[0] = ff[1]*ff[2]*ff[3]*ff[4];",
5175*de2caf28SDavid du Colombier 	"	nn[1] = ff[0]*ff[2]*ff[3]*ff[4];",
5176*de2caf28SDavid du Colombier 	"	nn[2] = ff[0]*ff[1]*ff[3]*ff[4];",
5177*de2caf28SDavid du Colombier 	"	nn[3] = ff[0]*ff[1]*ff[2]*ff[4];",
5178*de2caf28SDavid du Colombier 	"	nn[4] = ff[0]*ff[1]*ff[2]*ff[3];",
5179*de2caf28SDavid du Colombier 	"	for (cnt = 0; cnt < 5000; cnt++)",
5180*de2caf28SDavid du Colombier 	"	{	x = 2;",
5181*de2caf28SDavid du Colombier 	"		p = ((rand()<<13)^rand()) | 1; /* used random() before */",
5182*de2caf28SDavid du Colombier 	"		pp[0] = x;",
5183*de2caf28SDavid du Colombier 	"		for (i = 0; i < 32; i++)",
5184*de2caf28SDavid du Colombier 	"		{	pp[i+1] = mul(pp[i], pp[i], p);",
5185*de2caf28SDavid du Colombier 	"		}",
5186*de2caf28SDavid du Colombier 	"		if (pp[32] == x)",
5187*de2caf28SDavid du Colombier 	"		{	for (i = 0; i < 5; i++)",
5188*de2caf28SDavid du Colombier 	"			{	y = ppow(nn[i], p);",
5189*de2caf28SDavid du Colombier 	"				if (y == 1)",
5190*de2caf28SDavid du Colombier 	"				{	break;",
5191*de2caf28SDavid du Colombier 	"			}	}",
5192*de2caf28SDavid du Colombier 	"			if (y != 1)",
5193*de2caf28SDavid du Colombier 	"			{	HASH_CONST[0] = p;", /* 32 bit */
5194*de2caf28SDavid du Colombier 	"				if (verbose)",
5195*de2caf28SDavid du Colombier 	"				{	printf(\"polynomial: 0x%%.8x (%%d tries)\\n\",",
5196*de2caf28SDavid du Colombier 	"						p, cnt);",
5197*de2caf28SDavid du Colombier 	"				}",
5198*de2caf28SDavid du Colombier 	"				return;", /* success */
5199*de2caf28SDavid du Colombier 	"	}	}	}",
5200*de2caf28SDavid du Colombier 	"	fprintf(efd, \"pan: could not find a polynomial in %%d tries\\n\", cnt);",
5201*de2caf28SDavid du Colombier 	"	fprintf(efd, \"pan: try a different seed with -RSn\\n\");",
5202*de2caf28SDavid du Colombier 	"	exit(1);",
5203*de2caf28SDavid du Colombier 	"}",
5204*de2caf28SDavid du Colombier 	"",
52057dd7cddfSDavid du Colombier 	"int",
5206219b2ee8SDavid du Colombier 	"main(int argc, char *argv[])",
52077dd7cddfSDavid du Colombier 	"{	void to_compile(void);\n",
52087dd7cddfSDavid du Colombier 	"	efd = stderr;	/* default */",
5209*de2caf28SDavid du Colombier 	"#if defined(BFS_PAR) && defined(BFS_SEP_HASH)",
5210*de2caf28SDavid du Colombier 	"	uchar used_w = 0;",
5211*de2caf28SDavid du Colombier 	"#endif",
521200d97012SDavid du Colombier 	"	if (G_long != sizeof(long)",
521300d97012SDavid du Colombier 	"	||  G_int  != sizeof(int))",
521400d97012SDavid du Colombier 	"	{	printf(\"spin: error, the version of spin \");",
521500d97012SDavid du Colombier 	"		printf(\"that generated this pan.c assumed a different \");",
521600d97012SDavid du Colombier 	"		printf(\"wordsize (%%d iso %%d)\\n\", G_long, (int) sizeof(long));",
521700d97012SDavid du Colombier 	"		exit(1);",
521800d97012SDavid du Colombier 	"	}",
521900d97012SDavid du Colombier 	"",
522000d97012SDavid du Colombier 	"#if defined(T_RAND) && (T_RAND>0)",
522100d97012SDavid du Colombier 	"	s_rand = T_RAND;", /* so that -RS can override */
522200d97012SDavid du Colombier 	"#elif defined(P_RAND) && (P_RAND>0)",
522300d97012SDavid du Colombier 	"	s_rand = P_RAND;",
5224*de2caf28SDavid du Colombier 	"#endif",
522500d97012SDavid du Colombier 	"",
522600d97012SDavid du Colombier 	"#ifdef PUTPID",
522700d97012SDavid du Colombier 	"	{	char *ptr = strrchr(argv[0], '/');",
522800d97012SDavid du Colombier 	"		if (ptr == NULL)",
522900d97012SDavid du Colombier 	"		{	ptr = argv[0];",
523000d97012SDavid du Colombier 	"		} else",
523100d97012SDavid du Colombier 	"		{	ptr++;",
523200d97012SDavid du Colombier 	"		}",
523300d97012SDavid du Colombier 	"		progname = emalloc(strlen(ptr));",
523400d97012SDavid du Colombier 	"		strcpy(progname, ptr);",
523500d97012SDavid du Colombier 	"		/* printf(\"progname: %%s\\n\", progname); */",
523600d97012SDavid du Colombier 	"	}",
523700d97012SDavid du Colombier 	"#endif",
523800d97012SDavid du Colombier 	"",
5239312a1df1SDavid du Colombier 	"#ifdef BITSTATE",
5240*de2caf28SDavid du Colombier 	"	b_store = bstore_reg; /* default */",
5241312a1df1SDavid du Colombier 	"#endif",
5242*de2caf28SDavid du Colombier 
5243*de2caf28SDavid du Colombier 	"	{	int j;",
524400d97012SDavid du Colombier 	"		strcpy(o_cmdline, \"\");",
5245*de2caf28SDavid du Colombier 	"		if (strlen(argv[0]) < sizeof(o_cmdname))",
5246*de2caf28SDavid du Colombier 	"		{	strcpy(o_cmdname, argv[0]);",
5247*de2caf28SDavid du Colombier 	"		}",
524800d97012SDavid du Colombier 	"		for (j = 1; j < argc; j++)",
524900d97012SDavid du Colombier 	"		{	strcat(o_cmdline, argv[j]);",
525000d97012SDavid du Colombier 	"			strcat(o_cmdline, \" \");",
525100d97012SDavid du Colombier 	"		}",
525200d97012SDavid du Colombier 	"		/* printf(\"Command Line: %%s\\n\", o_cmdline); */",
525300d97012SDavid du Colombier 	"		if (strlen(o_cmdline) >= sizeof(o_cmdline))",
525400d97012SDavid du Colombier 	"		{	Uerror(\"option list too long\");",
525500d97012SDavid du Colombier 	"	}	}",
5256*de2caf28SDavid du Colombier 
5257219b2ee8SDavid du Colombier 	"	while (argc > 1 && argv[1][0] == '-')",
5258219b2ee8SDavid du Colombier 	"	{	switch (argv[1][1]) {",
52597dd7cddfSDavid du Colombier 	"#ifndef SAFETY",
52607dd7cddfSDavid du Colombier 	"	#ifdef NP",
5261*de2caf28SDavid du Colombier 	"		case 'a': fprintf(efd, \"warning: -a is disabled by -DNP, ignored\\n\");",
5262*de2caf28SDavid du Colombier 	"			  break;",
52637dd7cddfSDavid du Colombier 	"	#else",
5264219b2ee8SDavid du Colombier 	"		case 'a': a_cycles = 1; break;",
52657dd7cddfSDavid du Colombier 	"	#endif",
5266*de2caf28SDavid du Colombier 	"#else",
5267*de2caf28SDavid du Colombier 	"	#if defined(BFS_PAR) && defined(L_BOUND)",
5268*de2caf28SDavid du Colombier 	"		case 'a': if (isdigit(argv[1][2]))",
5269*de2caf28SDavid du Colombier 	"			  {	L_bound = atoi(&argv[1][2]);",
5270*de2caf28SDavid du Colombier 	"				if (L_bound < 1 || L_bound > 255)",
5271*de2caf28SDavid du Colombier 	"				{	printf(\"usage: -aN with 0<N<256\\n\");",
5272*de2caf28SDavid du Colombier 	"					exit(1);",
5273*de2caf28SDavid du Colombier 	"			  }	}",
5274*de2caf28SDavid du Colombier 	"			  break;",
5275*de2caf28SDavid du Colombier 	"	#endif",
52767dd7cddfSDavid du Colombier 	"#endif",
52777dd7cddfSDavid du Colombier 	"		case 'A': noasserts = 1; break;",
5278312a1df1SDavid du Colombier 	"		case 'b': bounded = 1; break;",
527900d97012SDavid du Colombier 	"#ifdef HAS_CODE",
5280*de2caf28SDavid du Colombier 	"	#if HAS_CODE>0",
528100d97012SDavid du Colombier 	"		case 'C': coltrace = 1; goto samething;",
528200d97012SDavid du Colombier 	"	#endif",
5283*de2caf28SDavid du Colombier 	"#endif",
5284219b2ee8SDavid du Colombier 	"		case 'c': upto = atoi(&argv[1][2]); break;",
528500d97012SDavid du Colombier 	"		case 'D': dodot++; state_tables++; break;",
5286219b2ee8SDavid du Colombier 	"		case 'd': state_tables++; break;",
528700d97012SDavid du Colombier 	"		case 'e': every_error = 1; upto = 0; Nr_Trails = 1; break;",
52887dd7cddfSDavid du Colombier 	"		case 'E': noends = 1; break;",
52897dd7cddfSDavid du Colombier 	"#ifdef SC",
52907dd7cddfSDavid du Colombier 	"		case 'F': if (strlen(argv[1]) > 2)",
52917dd7cddfSDavid du Colombier 	"				stackfile = &argv[1][2];",
52927dd7cddfSDavid du Colombier 	"			  break;",
52937dd7cddfSDavid du Colombier 	"#endif",
52947dd7cddfSDavid du Colombier 	"#if !defined(SAFETY) && !defined(NOFAIR)",
5295219b2ee8SDavid du Colombier 	"		case 'f': fairness = 1; break;",
52967dd7cddfSDavid du Colombier 	"#endif",
529700d97012SDavid du Colombier 	"#ifdef HAS_CODE",
5298*de2caf28SDavid du Colombier 	"	#if HAS_CODE>0",
529900d97012SDavid du Colombier 	"		case 'g': gui = 1; goto samething;",
530000d97012SDavid du Colombier 	"	#endif",
5301*de2caf28SDavid du Colombier 	"#endif",
5302*de2caf28SDavid du Colombier 	"		case 'h':",
5303*de2caf28SDavid du Colombier 	"			  if (strncmp(&argv[1][1], \"hash\", strlen(\"hash\")) == 0)",
5304*de2caf28SDavid du Colombier 	"			  {	do_hashgen = 1;",
5305*de2caf28SDavid du Colombier 	"				break;",
5306*de2caf28SDavid du Colombier 	"			  }",
5307*de2caf28SDavid du Colombier 	"			  if (!argv[1][2] || !isdigit((int) argv[1][2]))",
5308*de2caf28SDavid du Colombier 	"			  {	usage(efd);	/* exits */",
5309*de2caf28SDavid du Colombier 	"			  }",
5310*de2caf28SDavid du Colombier 	"			  HASH_NR = atoi(&argv[1][2])%%(sizeof(HASH_CONST)/sizeof(uint));",
5311*de2caf28SDavid du Colombier 	"			  break;",
53127dd7cddfSDavid du Colombier 	"		case 'I': iterative = 2; every_error = 1; break;",
5313*de2caf28SDavid du Colombier 	"		case 'i':",
5314*de2caf28SDavid du Colombier 	"			  if (strncmp(&argv[1][1], \"i_reverse\", strlen(\"i_reverse\")) == 0)",
5315*de2caf28SDavid du Colombier 	"			  {	reversing |= 1;",
5316*de2caf28SDavid du Colombier 	"			  } else",
5317*de2caf28SDavid du Colombier 	"			  {	iterative   = 1;",
5318*de2caf28SDavid du Colombier 	"			  	every_error = 1;",
5319*de2caf28SDavid du Colombier 	"			  }",
5320*de2caf28SDavid du Colombier 	"			  break;",
53217dd7cddfSDavid du Colombier 	"		case 'J': like_java = 1; break; /* Klaus Havelund */",
5322312a1df1SDavid du Colombier 	"#ifdef BITSTATE",
5323312a1df1SDavid du Colombier 	"		case 'k': hfns = atoi(&argv[1][2]); break;",
5324312a1df1SDavid du Colombier 	"#endif",
532500d97012SDavid du Colombier 	"#ifdef BCS",
532600d97012SDavid du Colombier 	"		case 'L':",
532700d97012SDavid du Colombier 	"			sched_max = atoi(&argv[1][2]);",
532800d97012SDavid du Colombier 	"			if (sched_max > 255)	/* stored as one byte */",
532900d97012SDavid du Colombier 	"			{	fprintf(efd, \"warning: using max bound (255)\\n\");",
533000d97012SDavid du Colombier 	"				sched_max = 255;",
533100d97012SDavid du Colombier 	"			}",
533200d97012SDavid du Colombier 	"	#ifndef NOREDUCE",
533300d97012SDavid du Colombier 	"			if (sched_max == 0)",
533400d97012SDavid du Colombier 	"			{	fprintf(efd, \"warning: with (default) bound -L0, \");",
533500d97012SDavid du Colombier 	"				fprintf(efd, \"using -DNOREDUCE performs better\\n\");",
533600d97012SDavid du Colombier 	"			}",
533700d97012SDavid du Colombier 	"	#endif",
533800d97012SDavid du Colombier 	"			break;",
533900d97012SDavid du Colombier 	"#endif",
53407dd7cddfSDavid du Colombier 	"#ifndef SAFETY",
53417dd7cddfSDavid du Colombier 		"#ifdef NP",
53427dd7cddfSDavid du Colombier 	"		case 'l': a_cycles = 1; break;",
53437dd7cddfSDavid du Colombier 		"#else",
5344*de2caf28SDavid du Colombier 	"		case 'l': fprintf(efd, \"error: -l not available (compile with -DNP)\");",
53457dd7cddfSDavid du Colombier 	"			  usage(efd); break;",
53467dd7cddfSDavid du Colombier 		"#endif",
53477dd7cddfSDavid du Colombier 	"#endif",
5348312a1df1SDavid du Colombier 	"#ifdef BITSTATE",
5349312a1df1SDavid du Colombier 	"		case 'M': udmem = atoi(&argv[1][2]); break;",
5350312a1df1SDavid du Colombier 	"		case 'G': udmem = atoi(&argv[1][2]); udmem *= 1024; break;",
5351312a1df1SDavid du Colombier 	"#else",
5352312a1df1SDavid du Colombier 	"		case 'M': case 'G':",
5353312a1df1SDavid du Colombier 	"			  fprintf(stderr, \"-M and -G affect only -DBITSTATE\\n\");",
5354312a1df1SDavid du Colombier 	"			  break;",
5355312a1df1SDavid du Colombier 	"#endif",
5356219b2ee8SDavid du Colombier 	"		case 'm': maxdepth = atoi(&argv[1][2]); break;",
535700d97012SDavid du Colombier 	"#ifndef NOCLAIM",
535800d97012SDavid du Colombier 	"		case 'N':",
535900d97012SDavid du Colombier 	"	#if NCLAIMS>1",
5360*de2caf28SDavid du Colombier 	"			  if (isdigit((int)argv[1][2]))",
5361*de2caf28SDavid du Colombier 	"			  {	whichclaim = atoi(&argv[1][2]);",
5362*de2caf28SDavid du Colombier 	"			  } else if (isalpha((int)argv[1][2]))",
536300d97012SDavid du Colombier 	"			  {     claimname = &argv[1][2];",
536400d97012SDavid du Colombier 	"			  } else if (argc > 2 && argv[2][0] != '-') /* check next arg */",
536500d97012SDavid du Colombier 	"			  {	claimname = argv[2];",
536600d97012SDavid du Colombier 	"				argc--; argv++; /* skip next arg */",
536700d97012SDavid du Colombier 	"			  }",
536800d97012SDavid du Colombier 	"	#else",
536900d97012SDavid du Colombier 	"		#if NCLAIMS==1",
537000d97012SDavid du Colombier 	"			  fprintf(stderr, \"warning: only one claim defined, -N ignored\\n\");",
537100d97012SDavid du Colombier 	"		#else",
537200d97012SDavid du Colombier 	"			  fprintf(stderr, \"warning: no claims defined, -N ignored\\n\");",
537300d97012SDavid du Colombier 	"		#endif",
5374*de2caf28SDavid du Colombier 	"			  if (!isdigit((int)argv[1][2]) && argc > 2 && argv[2][0] != '-')",
537500d97012SDavid du Colombier 	"			  {	argc--; argv++;",
537600d97012SDavid du Colombier 	"			  }",
537700d97012SDavid du Colombier 	"	#endif",
537800d97012SDavid du Colombier 	"#endif",
537900d97012SDavid du Colombier 	"			  break;\n",
5380219b2ee8SDavid du Colombier 	"		case 'n': no_rck = 1; break;",
5381*de2caf28SDavid du Colombier 	"",
5382*de2caf28SDavid du Colombier 	"		case 'P':",
5383*de2caf28SDavid du Colombier 	"			  if (!readtrail",
5384*de2caf28SDavid du Colombier 	"			  &&  isdigit((int) argv[1][2]))", /* was argv[1][2] == '_' */
5385*de2caf28SDavid du Colombier 	"			  {	int x = atoi(&argv[1][2]);",
5386*de2caf28SDavid du Colombier 	"				if (x != 0 && x != 1)",
5387*de2caf28SDavid du Colombier 	"				{	fprintf(efd, \"pan: bad option -P[01], ignored\\n\");",
5388*de2caf28SDavid du Colombier 	"				}",
5389*de2caf28SDavid du Colombier 	"				if (x == 0)",
5390*de2caf28SDavid du Colombier 	"				{	reversing &= ~1;",
5391*de2caf28SDavid du Colombier 	"					break;",
5392*de2caf28SDavid du Colombier 	"				}",
5393*de2caf28SDavid du Colombier 	"				if (x == 1)",
5394*de2caf28SDavid du Colombier 	"				{	reversing |= 1;",
5395*de2caf28SDavid du Colombier 	"					break;",
5396*de2caf28SDavid du Colombier 	"				}",
5397*de2caf28SDavid du Colombier 	"				if (verbose)",
5398*de2caf28SDavid du Colombier 	"				fprintf(efd, \"pan: reversed *active* process creation %%s\\n\",",
5399*de2caf28SDavid du Colombier 	"					reversing&1?\"on\":\"off\");",
5400*de2caf28SDavid du Colombier 	"				break;",
5401*de2caf28SDavid du Colombier 	"			  } /* else */",
5402*de2caf28SDavid du Colombier 	"#ifdef HAS_CODE",
5403*de2caf28SDavid du Colombier 	"	#if HAS_CODE>0",
5404*de2caf28SDavid du Colombier 	"			  readtrail = 1; onlyproc = atoi(&argv[1][2]);",
5405*de2caf28SDavid du Colombier 	"			  if (argc > 2 && argv[2][0] != '-') /* check next arg */",
540600d97012SDavid du Colombier 	"			  {	trailfilename = argv[2];",
540700d97012SDavid du Colombier 	"				argc--; argv++; /* skip next arg */",
540800d97012SDavid du Colombier 	"			  }",
5409*de2caf28SDavid du Colombier 	"	#else",
5410*de2caf28SDavid du Colombier 	"			  fprintf(efd, \"pan: option -P not recognized, ignored\\n\");",
54117dd7cddfSDavid du Colombier 	"	#endif",
5412*de2caf28SDavid du Colombier 	"#else",
5413*de2caf28SDavid du Colombier 	"			  fprintf(efd, \"pan: option -P not recognized, ignored\\n\");",
5414*de2caf28SDavid du Colombier 	"#endif",
5415*de2caf28SDavid du Colombier 	"			  break;",
5416*de2caf28SDavid du Colombier 	"",
5417*de2caf28SDavid du Colombier 	"		case 'p':",
5418*de2caf28SDavid du Colombier 	"	#if !defined(BFS) && !defined(BFS_PAR)",
5419*de2caf28SDavid du Colombier 	"	#ifdef PERMUTED",
5420*de2caf28SDavid du Colombier 	"			  if (strncmp(&argv[1][1], \"p_normal\", strlen(\"p_normal\")) == 0)",
5421*de2caf28SDavid du Colombier 	"			  {	reversing &= ~2;",
5422*de2caf28SDavid du Colombier 	"				break;",
5423*de2caf28SDavid du Colombier 	"			  }",
5424*de2caf28SDavid du Colombier 	"			  reversing |=2;",
5425*de2caf28SDavid du Colombier 	"			  if (strncmp(&argv[1][1], \"p_permute\", strlen(\"p_permute\")) == 0)",
5426*de2caf28SDavid du Colombier 	"			  {	p_reorder = set_permuted;",
5427*de2caf28SDavid du Colombier 	"				break;",
5428*de2caf28SDavid du Colombier 	"			  }",
5429*de2caf28SDavid du Colombier 	"			  if (strncmp(&argv[1][1], \"p_rotate\", strlen(\"p_rotate\")) == 0)",
5430*de2caf28SDavid du Colombier 	"			  {	p_reorder = set_rotated;",
5431*de2caf28SDavid du Colombier 	"				if (isdigit((int) argv[1][9]))",
5432*de2caf28SDavid du Colombier 	"				{	p_rotate = atoi(&argv[1][9]);",
5433*de2caf28SDavid du Colombier 	"				} else",
5434*de2caf28SDavid du Colombier 	"				{	p_rotate = 1;",
5435*de2caf28SDavid du Colombier 	"				}",
5436*de2caf28SDavid du Colombier 	"				break;",
5437*de2caf28SDavid du Colombier 	"			  }",
5438*de2caf28SDavid du Colombier 	"			  if (strncmp(&argv[1][1], \"p_randrot\", strlen(\"p_randrot\")) == 0)",
5439*de2caf28SDavid du Colombier 	"			  {	p_reorder = set_randrot;",
5440*de2caf28SDavid du Colombier 	"				break;",
5441*de2caf28SDavid du Colombier 	"			  }",
5442*de2caf28SDavid du Colombier 	"			  if (strncmp(&argv[1][1], \"p_reverse\", strlen(\"p_reverse\")) == 0)",
5443*de2caf28SDavid du Colombier 	"			  {	p_reorder = set_reversed;",
5444*de2caf28SDavid du Colombier 	"				break;",
5445*de2caf28SDavid du Colombier 	"			  }",
5446*de2caf28SDavid du Colombier 	"	#else",
5447*de2caf28SDavid du Colombier 	"			  if (strncmp(&argv[1][1], \"p_permute\", strlen(\"p_permute\")) == 0",
5448*de2caf28SDavid du Colombier 	"			  ||  strncmp(&argv[1][1], \"p_rotate\",  strlen(\"p_rotate\")) == 0",
5449*de2caf28SDavid du Colombier 	"			  ||  strncmp(&argv[1][1], \"p_randrot\",  strlen(\"p_randrot\")) == 0",
5450*de2caf28SDavid du Colombier 	"			  ||  strncmp(&argv[1][1], \"p_reverse\", strlen(\"p_reverse\")) == 0)",
5451*de2caf28SDavid du Colombier 	"			  {	fprintf(efd, \"option %%s required compilation with -DPERMUTED\\n\",",
5452*de2caf28SDavid du Colombier 	"					argv[1]);",
5453*de2caf28SDavid du Colombier 	"				exit(1);",
5454*de2caf28SDavid du Colombier 	"			  }",
5455*de2caf28SDavid du Colombier 	"	#endif",
5456*de2caf28SDavid du Colombier 	"	#endif",
5457*de2caf28SDavid du Colombier 	"#ifdef SVDUMP",
5458*de2caf28SDavid du Colombier 	"			  vprefix = atoi(&argv[1][2]);",
5459*de2caf28SDavid du Colombier 	"#else",
5460*de2caf28SDavid du Colombier 	"			  fprintf(efd, \"invalid option '%%s' -- ignored\\n\", argv[1]);",
5461*de2caf28SDavid du Colombier 	"#endif",
5462*de2caf28SDavid du Colombier 	"			  break;",
546300d97012SDavid du Colombier 	"#if NCORE==1",
546400d97012SDavid du Colombier 	"		case 'Q': quota = (double) 60.0 * (double) atoi(&argv[1][2]);",
546500d97012SDavid du Colombier 	"	#ifndef FREQ",
546600d97012SDavid du Colombier 	"			  freq /= 10.; /* for better resolution */",
546700d97012SDavid du Colombier 	"	#endif",
546800d97012SDavid du Colombier 	"			  break;",
546900d97012SDavid du Colombier 	"#endif",
54707dd7cddfSDavid du Colombier 	"		case 'q': strict = 1; break;",
547100d97012SDavid du Colombier 	"		case 'R':",
547200d97012SDavid du Colombier 	"			if (argv[1][2] == 'S') /* e.g., -RS76842 */",
5473*de2caf28SDavid du Colombier 	"			{	s_rand = atoi(&argv[1][3]);", /* RS */
5474*de2caf28SDavid du Colombier 	"				break;",
5475*de2caf28SDavid du Colombier 	"			}",
5476*de2caf28SDavid du Colombier 	"#ifdef BITSTATE",
5477*de2caf28SDavid du Colombier 	"			Nrun = atoi(&argv[1][2]);",
5478*de2caf28SDavid du Colombier 	"			if (Nrun > 100)",
5479*de2caf28SDavid du Colombier 	"			{	Nrun = 100;",
5480*de2caf28SDavid du Colombier 	"			} else if (Nrun < 1)",
5481*de2caf28SDavid du Colombier 	"			{	Nrun = 1;",
5482*de2caf28SDavid du Colombier 	"			}",
5483*de2caf28SDavid du Colombier 	"#else",
5484*de2caf28SDavid du Colombier 	"			usage(efd);",
5485*de2caf28SDavid du Colombier 	"			break;",
548600d97012SDavid du Colombier 	"#endif",
5487*de2caf28SDavid du Colombier 	"		case 'r':",
5488*de2caf28SDavid du Colombier 	"			  if (strncmp(&argv[1][1], \"rhash\", strlen(\"rhash\")) == 0)",
5489*de2caf28SDavid du Colombier 	"			  {	if (s_rand == 12345)	/* default seed */",
5490*de2caf28SDavid du Colombier 	"				{",
5491*de2caf28SDavid du Colombier 	"#if defined(WIN32) || defined(WIN64)",
5492*de2caf28SDavid du Colombier 	"					s_rand = (uint) clock();",
5493*de2caf28SDavid du Colombier 	"#else",
5494*de2caf28SDavid du Colombier 	"					struct tms dummy_tm;",
5495*de2caf28SDavid du Colombier 	"					s_rand = (uint) times(&dummy_tm);",
5496*de2caf28SDavid du Colombier 	"#endif",
5497*de2caf28SDavid du Colombier 	"				}",
5498*de2caf28SDavid du Colombier 	"				srand(s_rand++);",
5499*de2caf28SDavid du Colombier 	"	#ifdef PERMUTED",
5500*de2caf28SDavid du Colombier 	"			  	do_hashgen = 1;",	/* + randomize p_rotate, p_reverse, p_permute */
5501*de2caf28SDavid du Colombier 	"			  	switch (rand()%%5) {",
5502*de2caf28SDavid du Colombier 	"				case 0:	p_reorder = set_permuted;",
5503*de2caf28SDavid du Colombier 	"					reversing |=2;",
5504*de2caf28SDavid du Colombier 	"					break;",
5505*de2caf28SDavid du Colombier 	"			  	case 1:	p_reorder = set_reversed;",
5506*de2caf28SDavid du Colombier 	"					reversing |=2;",
5507*de2caf28SDavid du Colombier 	"					break;",
5508*de2caf28SDavid du Colombier 	"					/* fully randomize p_rotate: */",
5509*de2caf28SDavid du Colombier 	"				case 2:	p_reorder = set_randrot;",
5510*de2caf28SDavid du Colombier 	"					reversing |=2;",
5511*de2caf28SDavid du Colombier 	"					break;",
5512*de2caf28SDavid du Colombier 	"					/* choose once, then keep p_rotate fixed: */",
5513*de2caf28SDavid du Colombier 	"				case 3: p_reorder = set_rotated;",
5514*de2caf28SDavid du Colombier 	"					p_rotate = rand()%%3;",
5515*de2caf28SDavid du Colombier 	"					reversing |=2;",
5516*de2caf28SDavid du Colombier 	"					break;",
5517*de2caf28SDavid du Colombier 	"				default: /* standard search */ break;",
5518*de2caf28SDavid du Colombier 	"				}",
5519*de2caf28SDavid du Colombier 	"				if (rand()%%2 == 0)",
5520*de2caf28SDavid du Colombier 	"			 	{	t_reverse = 1;",
552100d97012SDavid du Colombier 	"				}",
552200d97012SDavid du Colombier 	"				break;",
5523*de2caf28SDavid du Colombier 	"	#else",
5524*de2caf28SDavid du Colombier 	"				fprintf(efd, \"option -rhash requires compilation with -DPERMUTED\\n\");",
5525*de2caf28SDavid du Colombier 	"				exit(1);",
5526*de2caf28SDavid du Colombier 	"	#endif",
5527*de2caf28SDavid du Colombier 	"			  }",
5528*de2caf28SDavid du Colombier 	"#if defined(HAS_CODE) && HAS_CODE>0",
5529312a1df1SDavid du Colombier 	"samething:		  readtrail = 1;",
5530*de2caf28SDavid du Colombier 	"			  if (isdigit((int)argv[1][2]))",
5531312a1df1SDavid du Colombier 	"				whichtrail = atoi(&argv[1][2]);",
553200d97012SDavid du Colombier 	"			  else if (argc > 2 && argv[2][0] != '-') /* check next arg */",
553300d97012SDavid du Colombier 	"			  {	trailfilename = argv[2];",
553400d97012SDavid du Colombier 	"				argc--; argv++; /* skip next arg */",
553500d97012SDavid du Colombier 	"			  }",
5536312a1df1SDavid du Colombier 	"			  break;",
553700d97012SDavid du Colombier 	"		case 'S': silent = 1; goto samething;",
5538*de2caf28SDavid du Colombier 	"#else",
5539*de2caf28SDavid du Colombier 	"			  fprintf(efd, \"options -r is for models with embedded C code\\n\");",
5540*de2caf28SDavid du Colombier 	"			  break;",
5541312a1df1SDavid du Colombier 	"#endif",
5542*de2caf28SDavid du Colombier 	"		case 'T':",
5543*de2caf28SDavid du Colombier 	"			  if (isdigit((int) argv[1][2]))", /* was argv[1][2] == '_' */
5544*de2caf28SDavid du Colombier 	"			  {	t_reverse = atoi(&argv[1][2]);",
5545*de2caf28SDavid du Colombier 	"				if (verbose)",
5546*de2caf28SDavid du Colombier 	"				printf(\"pan: reverse transition ordering %%s\\n\",",
5547*de2caf28SDavid du Colombier 	"					t_reverse?\"on\":\"off\");",
5548*de2caf28SDavid du Colombier 	"				break;",
5549*de2caf28SDavid du Colombier 	"			  }",
5550*de2caf28SDavid du Colombier 	"			  TMODE = 0444;",
5551*de2caf28SDavid du Colombier 	"			  break;",
5552*de2caf28SDavid du Colombier 	"		case 't':",
5553*de2caf28SDavid du Colombier 	"			  if (strncmp(&argv[1][1], \"t_reverse\", strlen(\"t_reverse\")) == 0)",
5554*de2caf28SDavid du Colombier 	"			  {	t_reverse = 1;",
5555*de2caf28SDavid du Colombier 	"				break;",
5556*de2caf28SDavid du Colombier 	"			  }", /* i.e., a trail prefix cannot be '_reverse' */
5557*de2caf28SDavid du Colombier 	"			  if (argv[1][2])",
5558*de2caf28SDavid du Colombier 	"			  {	tprefix = &argv[1][2];",
5559*de2caf28SDavid du Colombier 	"			  }",
5560*de2caf28SDavid du Colombier 	"			  break;",
5561*de2caf28SDavid du Colombier 	"		case 'u':",
5562*de2caf28SDavid du Colombier 	"	#ifdef BFS_PAR",
5563*de2caf28SDavid du Colombier 	"			  ncores = atoi(&argv[1][2]);",
5564312a1df1SDavid du Colombier 	"	#endif",
5565*de2caf28SDavid du Colombier 	"			  break;",
556600d97012SDavid du Colombier 	"		case 'V': start_timer(); printf(\"Generated by %%s\\n\", SpinVersion);",
556700d97012SDavid du Colombier 	"			  to_compile(); pan_exit(2); break;",
556800d97012SDavid du Colombier 	"		case 'v': verbose++; break;",
5569*de2caf28SDavid du Colombier 	"		case 'w': ssize = atoi(&argv[1][2]);",
5570*de2caf28SDavid du Colombier 	"	#if defined(BFS_PAR) && defined(BFS_SEP_HASH)",
5571*de2caf28SDavid du Colombier 	"			  used_w = 1;",
5572*de2caf28SDavid du Colombier 	"	#endif",
5573*de2caf28SDavid du Colombier 	"			  break;",
5574312a1df1SDavid du Colombier 	"		case 'Y': signoff = 1; break;",
55757dd7cddfSDavid du Colombier 	"		case 'X': efd = stdout; break;",
557600d97012SDavid du Colombier 	"		case 'x': exclusive = 1; break;",
557700d97012SDavid du Colombier 	"	#if NCORE>1",
557800d97012SDavid du Colombier 	"		/* -B ip is passthru to proxy of remote ip address: */",
557900d97012SDavid du Colombier 	"		case 'B': argc--; argv++; break;",
558000d97012SDavid du Colombier 	"		case 'Q': worker_pids[0] = atoi(&argv[1][2]); break;",
558100d97012SDavid du Colombier 	"		/* -Un means that the nth worker should be instantiated as a proxy */",
558200d97012SDavid du Colombier 	"		case 'U': proxy_pid = atoi(&argv[1][2]); break;",
5583*de2caf28SDavid du Colombier 	"		/* -W means this copy is started by a cluster-server as a remote */",
558400d97012SDavid du Colombier 	"		/* this flag is passed to ./pan_proxy, which interprets it */",
558500d97012SDavid du Colombier 	"		case 'W': remote_party++; break;",
558600d97012SDavid du Colombier 	"		case 'Z': core_id = atoi(&argv[1][2]);",
558700d97012SDavid du Colombier 	"			  if (verbose)",
558800d97012SDavid du Colombier 	"			  { printf(\"cpu%%d: pid %%d parent %%d\\n\",",
558900d97012SDavid du Colombier 	"				core_id, getpid(), worker_pids[0]);",
559000d97012SDavid du Colombier 	"			  }",
559100d97012SDavid du Colombier 	"			  break;",
559200d97012SDavid du Colombier 	"		case 'z': z_handoff = atoi(&argv[1][2]); break;",
559300d97012SDavid du Colombier 	"	#else",
559400d97012SDavid du Colombier 	"		case 'z': break; /* ignored for single-core */",
559500d97012SDavid du Colombier 	"	#endif",
5596*de2caf28SDavid du Colombier 	"		default : fprintf(efd, \"saw option -%%c\\n\",",
5597*de2caf28SDavid du Colombier 	"				argv[1][1]); usage(efd); break;",
5598219b2ee8SDavid du Colombier 	"		}",
5599219b2ee8SDavid du Colombier 	"		argc--; argv++;",
5600219b2ee8SDavid du Colombier 	"	}",
5601*de2caf28SDavid du Colombier 	"#if defined(BFS_PAR) && defined(BFS_SEP_HASH)",
5602*de2caf28SDavid du Colombier 	"	if (used_w == 0)",
5603*de2caf28SDavid du Colombier 	"	{	if (ncores == 0) /* all cores used, by default */",
5604*de2caf28SDavid du Colombier 	"		{	ssize -= blog2(BFS_MAXPROCS - 1);",
5605*de2caf28SDavid du Colombier 	"		} else",
5606*de2caf28SDavid du Colombier 	"		{	ssize -= blog2(ncores);",
5607*de2caf28SDavid du Colombier 	"	}	}",
5608*de2caf28SDavid du Colombier 	"#endif",
5609*de2caf28SDavid du Colombier 	"	if (do_hashgen)",
5610*de2caf28SDavid du Colombier 	"	{	hashgen();", /* placed here so that -RSn can appear after -hash */
5611*de2caf28SDavid du Colombier 	"	}",
5612*de2caf28SDavid du Colombier 	"#ifndef SAFETY",
5613*de2caf28SDavid du Colombier 	"	if (fairness && !a_cycles)",
5614*de2caf28SDavid du Colombier 	"	{	fprintf(efd, \"error: -f requires the use of -a or -l\\n\");",
5615*de2caf28SDavid du Colombier 	"		usage(efd);",
5616*de2caf28SDavid du Colombier 	"	}",
5617*de2caf28SDavid du Colombier 	"	#if ACCEPT_LAB==0",
5618*de2caf28SDavid du Colombier 	"	if (a_cycles)",
5619*de2caf28SDavid du Colombier 	"	{	fprintf(efd, \"warning: no accept labels are defined, \");",
5620*de2caf28SDavid du Colombier 	"		fprintf(efd, \"so option -a has no effect (ignored)\\n\");",
5621*de2caf28SDavid du Colombier 	"		a_cycles = 0;",
5622*de2caf28SDavid du Colombier 	"	}",
5623*de2caf28SDavid du Colombier 	"	#endif",
5624*de2caf28SDavid du Colombier 	"#endif",
5625*de2caf28SDavid du Colombier 	"",
5626*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
5627*de2caf28SDavid du Colombier 	"	uerror = bfs_uerror;",
5628*de2caf28SDavid du Colombier 	"	Uerror = bfs_Uerror;",
5629*de2caf28SDavid du Colombier 	"#else",
5630*de2caf28SDavid du Colombier 	"	uerror = dfs_uerror;",
5631*de2caf28SDavid du Colombier 	"	Uerror = dfs_Uerror;",
5632*de2caf28SDavid du Colombier 	"#endif",
5633*de2caf28SDavid du Colombier 	"	if (ssize <= 32)	/* 6.2.0 */",
5634*de2caf28SDavid du Colombier 	"	{	hasher = d_sfh;",
5635*de2caf28SDavid du Colombier 	"#if !defined(BITSTATE) && defined(USE_TDH)",
5636*de2caf28SDavid du Colombier 	"		o_hash = o_hash32;",
5637*de2caf28SDavid du Colombier 	"#endif",
5638*de2caf28SDavid du Colombier 	"	} else",
5639*de2caf28SDavid du Colombier 	"	{	hasher = d_hash;",
5640*de2caf28SDavid du Colombier 	"#if !defined(BITSTATE) && defined(USE_TDH)",
5641*de2caf28SDavid du Colombier 	"		o_hash = o_hash64;",
5642*de2caf28SDavid du Colombier 	"#endif",
5643*de2caf28SDavid du Colombier 	"	}",
5644f3793cddSDavid du Colombier 	"	if (iterative && TMODE != 0666)",
5645f3793cddSDavid du Colombier 	"	{	TMODE = 0666;",
5646f3793cddSDavid du Colombier 	"		fprintf(efd, \"warning: -T ignored when -i or -I is used\\n\");",
5647f3793cddSDavid du Colombier 	"	}",
5648f3793cddSDavid du Colombier 	"#if defined(WIN32) || defined(WIN64)",
5649*de2caf28SDavid du Colombier 	"	#ifndef _S_IWRITE",
5650*de2caf28SDavid du Colombier 	"		#define	S_IWRITE 0000200  /* write permission, owner */",
5651*de2caf28SDavid du Colombier 	"	#endif",
5652*de2caf28SDavid du Colombier 	"	#ifndef _S_IREAD",
5653*de2caf28SDavid du Colombier 	"		#define	S_IREAD  0000400  /* read permission, owner */",
5654*de2caf28SDavid du Colombier 	"	#endif",
5655f3793cddSDavid du Colombier 	"	if (TMODE == 0666)",
5656*de2caf28SDavid du Colombier 	"		TMODE = S_IWRITE | S_IREAD;",
5657f3793cddSDavid du Colombier 	"	else",
5658*de2caf28SDavid du Colombier 	"		TMODE = S_IREAD;",
5659f3793cddSDavid du Colombier 	"#endif",
566000d97012SDavid du Colombier 	"#if NCORE>1",
566100d97012SDavid du Colombier 	"	store_proxy_pid = proxy_pid; /* for checks in mem_file() and someone_crashed() */",
566200d97012SDavid du Colombier 	"	if (core_id != 0) { proxy_pid = 0; }",
566300d97012SDavid du Colombier 	"	#ifndef SEP_STATE",
566400d97012SDavid du Colombier 	"	if (core_id == 0 && a_cycles)",
566500d97012SDavid du Colombier 	"	{	fprintf(efd, \"hint: this search may be more efficient \");",
566600d97012SDavid du Colombier 	"		fprintf(efd, \"if pan.c is compiled -DSEP_STATE\\n\");",
566700d97012SDavid du Colombier 	"	}",
5668312a1df1SDavid du Colombier 	"	#endif",
566900d97012SDavid du Colombier 	"	if (z_handoff < 0)",
567000d97012SDavid du Colombier 	"	{	z_handoff =  20; /* conservative default - for non-liveness checks */",
567100d97012SDavid du Colombier 	"	}",
567200d97012SDavid du Colombier 	"#if defined(NGQ) || defined(LWQ_FIXED)",
567300d97012SDavid du Colombier 	"	LWQ_SIZE = (double) (128.*1048576.);",
567400d97012SDavid du Colombier 	"#else",
567500d97012SDavid du Colombier 	"	LWQ_SIZE = (double) ( z_handoff + 2.) * (double) sizeof(SM_frame);",
567600d97012SDavid du Colombier 		/* the added margin of +2 is not really necessary */
5677312a1df1SDavid du Colombier 	"#endif",
567800d97012SDavid du Colombier 	"	#if NCORE>2",
567900d97012SDavid du Colombier 	"	if (a_cycles)",
568000d97012SDavid du Colombier 	"	{	fprintf(efd, \"warning: the intended nr of cores to be used in liveness mode is 2\\n\");",
568100d97012SDavid du Colombier 	"		#ifndef SEP_STATE",
568200d97012SDavid du Colombier 	"		fprintf(efd, \"warning: without -DSEP_STATE there is no guarantee that all liveness violations are found\\n\");",
5683312a1df1SDavid du Colombier 	"		#endif",
568400d97012SDavid du Colombier 	"	}",	/* it still works though, the later cores get states from the global q */
568500d97012SDavid du Colombier 	"	#endif",
568600d97012SDavid du Colombier 	"	#ifdef HAS_HIDDEN",
568700d97012SDavid du Colombier 	"	#error cannot use hidden variables when compiling multi-core",
568800d97012SDavid du Colombier 	"	#endif",
5689312a1df1SDavid du Colombier 	"#endif",
5690*de2caf28SDavid du Colombier 	"#if defined(T_RAND) && defined(ELSE_IN_GUARD)",
5691*de2caf28SDavid du Colombier 	"	#error cannot hide 'else' as guard in d_step, when using -DT_RAND",
5692*de2caf28SDavid du Colombier 	"#endif",
5693312a1df1SDavid du Colombier 	"#ifdef BITSTATE",
5694312a1df1SDavid du Colombier 	"	if (hfns <= 0)",
5695312a1df1SDavid du Colombier 	"	{	hfns = 1;",
5696312a1df1SDavid du Colombier 	"		fprintf(efd, \"warning: using -k%%d as minimal usable value\\n\", hfns);",
5697312a1df1SDavid du Colombier 	"	}",
5698312a1df1SDavid du Colombier 	"#endif",
5699312a1df1SDavid du Colombier 	"	omaxdepth = maxdepth;",
5700312a1df1SDavid du Colombier 	"#ifdef BITSTATE",
5701312a1df1SDavid du Colombier 	"	if (WS == 4 && ssize > 34)",	/* 32-bit word size */
5702312a1df1SDavid du Colombier 	"	{	ssize = 34;",
5703312a1df1SDavid du Colombier 	"		fprintf(efd, \"warning: using -w%%d as max usable value\\n\", ssize);",
5704312a1df1SDavid du Colombier 	"/*",
5705312a1df1SDavid du Colombier 	" *	-w35 would not work: 35-3 = 32 but 1^31 is the largest",
5706*de2caf28SDavid du Colombier 	" *	power of 2 that can be represented in an ulong",
5707312a1df1SDavid du Colombier 	" */",
5708312a1df1SDavid du Colombier 	"	}",
5709312a1df1SDavid du Colombier 	"#else",
5710312a1df1SDavid du Colombier 	"	if (WS == 4 && ssize > 27)",
5711312a1df1SDavid du Colombier 	"	{	ssize = 27;",
5712312a1df1SDavid du Colombier 	"		fprintf(efd, \"warning: using -w%%d as max usable value\\n\", ssize);",
5713312a1df1SDavid du Colombier 	"/*",
5714312a1df1SDavid du Colombier 	" *	for emalloc, the lookup table size multiplies by 4 for the pointers",
5715312a1df1SDavid du Colombier 	" *	the largest power of 2 that can be represented in a ulong is 1^31",
5716312a1df1SDavid du Colombier 	" *	hence the largest number of lookup table slots is 31-4 = 27",
5717312a1df1SDavid du Colombier 	" */",
5718312a1df1SDavid du Colombier 	"	}",
5719312a1df1SDavid du Colombier 
5720312a1df1SDavid du Colombier 	"#endif",
57217dd7cddfSDavid du Colombier 	"#ifdef SC",
57227dd7cddfSDavid du Colombier 	"	hiwater = HHH = maxdepth-10;",
57237dd7cddfSDavid du Colombier 	"	DDD = HHH/2;",
57247dd7cddfSDavid du Colombier 	"	if (!stackfile)",
572500d97012SDavid du Colombier 	"	{	stackfile = (char *) emalloc(strlen(PanSource)+4+1);",
572600d97012SDavid du Colombier 	"		sprintf(stackfile, \"%%s._s_\", PanSource);",
57277dd7cddfSDavid du Colombier 	"	}",
57287dd7cddfSDavid du Colombier 	"	if (iterative)",
57297dd7cddfSDavid du Colombier 	"	{	fprintf(efd, \"error: cannot use -i or -I with -DSC\\n\");",
5730312a1df1SDavid du Colombier 	"		pan_exit(1);",
57317dd7cddfSDavid du Colombier 	"	}",
57327dd7cddfSDavid du Colombier 	"#endif",
57337dd7cddfSDavid du Colombier 
5734312a1df1SDavid du Colombier 	"#if (defined(R_XPT) || defined(W_XPT)) && !defined(MA)",
573500d97012SDavid du Colombier 	"	#warning -DR_XPT and -DW_XPT assume -DMA (ignored)",
5736312a1df1SDavid du Colombier 	"#endif",
5737312a1df1SDavid du Colombier 
5738312a1df1SDavid du Colombier 	"	if (iterative && a_cycles)",
5739312a1df1SDavid du Colombier 	"	fprintf(efd, \"warning: -i or -I work for safety properties only\\n\");",
5740312a1df1SDavid du Colombier 
5741312a1df1SDavid du Colombier 	"#ifdef BFS",
574200d97012SDavid du Colombier 	"	#ifdef SC",
574300d97012SDavid du Colombier 	"		#error -DBFS not compatible with -DSC",
5744312a1df1SDavid du Colombier 	"	#endif",
574500d97012SDavid du Colombier 	"	#ifdef HAS_LAST",
574600d97012SDavid du Colombier 	"		#error -DBFS not compatible with _last",
5747312a1df1SDavid du Colombier 	"	#endif",
574800d97012SDavid du Colombier 	"	#ifdef HAS_STACK",
574900d97012SDavid du Colombier 	"		#error cannot use c_track UnMatched with BFS",
5750312a1df1SDavid du Colombier 	"	#endif",
575100d97012SDavid du Colombier 	"	#ifdef BCS",
575200d97012SDavid du Colombier 	"		#error -DBFS not compatible with -DBCS",
575300d97012SDavid du Colombier 	"	#endif",
575400d97012SDavid du Colombier 	"	#ifdef REACH",
575500d97012SDavid du Colombier 	"		#warning -DREACH is redundant when -DBFS is used",
575600d97012SDavid du Colombier 	"	#endif",
575700d97012SDavid du Colombier 	"#endif",
575800d97012SDavid du Colombier 
575900d97012SDavid du Colombier 	"#ifdef TRIX",
576000d97012SDavid du Colombier 	"	#ifdef BITSTATE",
576100d97012SDavid du Colombier 	"		#error cannot combine -DTRIX and -DBITSTATE",
576200d97012SDavid du Colombier 	"	#endif",
576300d97012SDavid du Colombier 	"	#ifdef COLLAPSE",
576400d97012SDavid du Colombier 	"		#error cannot combine -DTRIX and -DCOLLAPSE",
576500d97012SDavid du Colombier 	"	#endif",
576600d97012SDavid du Colombier 	"	#ifdef MA",
576700d97012SDavid du Colombier 	"		#error cannot combine -DTRIX and -DMA",
576800d97012SDavid du Colombier 	"	#endif",
5769*de2caf28SDavid du Colombier 	"	#if defined(BFS_PAR) && defined(BFS_SEP_HEAP)",
5770*de2caf28SDavid du Colombier 	"		#error cannot combined -DBFS_SEP_HEAP with -DTRIX",
5771*de2caf28SDavid du Colombier 	"	#endif",
5772*de2caf28SDavid du Colombier 	"#endif",
5773*de2caf28SDavid du Colombier 
5774*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
5775*de2caf28SDavid du Colombier 	"	#ifdef NP",
5776*de2caf28SDavid du Colombier 	"	#error cannot combine -DBFS_PAR and -DNP",
5777*de2caf28SDavid du Colombier 	"	#undef NP",
5778*de2caf28SDavid du Colombier 	"	#endif",
5779*de2caf28SDavid du Colombier 	"#endif",
5780*de2caf28SDavid du Colombier 
5781*de2caf28SDavid du Colombier 	"#ifdef NOCLAIM",
5782*de2caf28SDavid du Colombier 	"	#ifdef NP",
5783*de2caf28SDavid du Colombier 	"	#warning using -DNP overrides -DNOCLAIM",
5784*de2caf28SDavid du Colombier 	"	#undef NOCLAIM",
5785*de2caf28SDavid du Colombier 	"	#endif",
578600d97012SDavid du Colombier 	"#endif",
578700d97012SDavid du Colombier 
578800d97012SDavid du Colombier 	"#ifdef BCS",
578900d97012SDavid du Colombier 	"	#ifdef P_RAND",
579000d97012SDavid du Colombier 	"		#error cannot combine -DBCS and -DP_RAND",
579100d97012SDavid du Colombier 	"	#endif",
579200d97012SDavid du Colombier 	"	#ifdef BFS",
579300d97012SDavid du Colombier 	"		#error cannot combine -DBCS and -DBFS",
5794312a1df1SDavid du Colombier 	"	#endif",
5795312a1df1SDavid du Colombier 	"#endif",
5796312a1df1SDavid du Colombier 
57977dd7cddfSDavid du Colombier 	"#if defined(MERGED) && defined(PEG)",
579800d97012SDavid du Colombier 	"	#error to use -DPEG use: spin -o3 -a",
57997dd7cddfSDavid du Colombier 	"#endif",
5800*de2caf28SDavid du Colombier 	"#if defined(HC) && !defined(BFS_PAR)",
58017dd7cddfSDavid du Colombier 	"	#ifdef NOCOMP",
580200d97012SDavid du Colombier 	"		#error cannot combine -DHC and -DNOCOMP",
580300d97012SDavid du Colombier 	"	#endif",
58047dd7cddfSDavid du Colombier 	"	#ifdef BITSTATE",
580500d97012SDavid du Colombier 	"		#error cannot combine -DHC and -DBITSTATE",
58067dd7cddfSDavid du Colombier 	"	#endif",
58077dd7cddfSDavid du Colombier 	"#endif",
58087dd7cddfSDavid du Colombier 	"#if defined(SAFETY) && defined(NP)",
580900d97012SDavid du Colombier 	"	#error cannot combine -DNP and -DBFS or -DSAFETY",
58107dd7cddfSDavid du Colombier 	"#endif",
58117dd7cddfSDavid du Colombier 	"#ifdef MA",
58127dd7cddfSDavid du Colombier 	"	#ifdef BITSTATE",
581300d97012SDavid du Colombier 	"		#error cannot combine -DMA and -DBITSTATE",
58147dd7cddfSDavid du Colombier 	"	#endif",
581500d97012SDavid du Colombier 	"	#if MA <= 0",
581600d97012SDavid du Colombier 	"		#error usage: -DMA=N with N > 0 and N < VECTORSZ",
581700d97012SDavid du Colombier 	"	#endif",
5818*de2caf28SDavid du Colombier 	"	#ifndef NOREDUCE",
5819*de2caf28SDavid du Colombier 	"		if (a_cycles)",
5820*de2caf28SDavid du Colombier 	"		{	fprintf(stderr, \"warning: liveness checking with -DMA \");",
5821*de2caf28SDavid du Colombier 	"			fprintf(stderr, \"but without -DNOREDUCE may be incomplete\\n\");",
5822*de2caf28SDavid du Colombier 	"		}",
5823*de2caf28SDavid du Colombier 	"	#endif",
58247dd7cddfSDavid du Colombier 	"#endif",
58257dd7cddfSDavid du Colombier 	"#ifdef COLLAPSE",
582600d97012SDavid du Colombier 	"	#ifdef BITSTATE",
582700d97012SDavid du Colombier 	"		#error cannot combine -DBITSTATE and -DCOLLAPSE",
58287dd7cddfSDavid du Colombier 	"	#endif",
582900d97012SDavid du Colombier 	"	#ifdef NOCOMP",
583000d97012SDavid du Colombier 	"		#error cannot combine -DCOLLAPSE and -DNOCOMP",
583100d97012SDavid du Colombier 	"	#endif",
58327dd7cddfSDavid du Colombier 	"#endif",
5833312a1df1SDavid du Colombier 	"	if (maxdepth <= 0 || ssize <= 1) usage(efd);",
58347dd7cddfSDavid du Colombier 	"#if SYNC>0 && !defined(NOREDUCE)",
58357dd7cddfSDavid du Colombier 	"	if (a_cycles && fairness)",
58367dd7cddfSDavid du Colombier 	"	{ fprintf(efd, \"error: p.o. reduction not compatible with \");",
58377dd7cddfSDavid du Colombier 	"	  fprintf(efd, \"fairness (-f) in models\\n\");",
58387dd7cddfSDavid du Colombier 	"	  fprintf(efd, \"       with rendezvous operations: \");",
58397dd7cddfSDavid du Colombier 	"	  fprintf(efd, \"recompile with -DNOREDUCE\\n\");",
5840312a1df1SDavid du Colombier 	"	  pan_exit(1);",
5841312a1df1SDavid du Colombier 	"	}",
5842312a1df1SDavid du Colombier 	"#endif",
5843312a1df1SDavid du Colombier 	"#if defined(REM_VARS) && !defined(NOREDUCE)",
584400d97012SDavid du Colombier 	"	#warning p.o. reduction not compatible with remote varrefs (use -DNOREDUCE)",
58457dd7cddfSDavid du Colombier 	"#endif",
58467dd7cddfSDavid du Colombier 	"#if defined(NOCOMP) && !defined(BITSTATE)",
58477dd7cddfSDavid du Colombier 	"	if (a_cycles)",
584800d97012SDavid du Colombier 	"	{ fprintf(efd, \"error: use of -DNOCOMP voids -l and -a\\n\");",
5849312a1df1SDavid du Colombier 	"	  pan_exit(1);",
58507dd7cddfSDavid du Colombier 	"	}",
58517dd7cddfSDavid du Colombier 	"#endif",
585200d97012SDavid du Colombier 	"#ifdef MEMLIM",
585300d97012SDavid du Colombier 	"	memlim = ((double) MEMLIM) * (double) (1<<20);	/* size in Mbyte */",
58547dd7cddfSDavid du Colombier 	"#endif",
5855*de2caf28SDavid du Colombier 	"#if SYNC>0",
5856*de2caf28SDavid du Colombier 	"	#ifdef HAS_PRIORITY",
5857*de2caf28SDavid du Colombier 	"		#error use of priorities cannot be combined with rendezvous",
5858*de2caf28SDavid du Colombier 	"	#elif HAS_ENABLED",
5859*de2caf28SDavid du Colombier 	"		#error use of enabled() cannot be combined with rendezvous",
5860219b2ee8SDavid du Colombier 	"	#endif",
5861219b2ee8SDavid du Colombier 	"#endif",
586200d97012SDavid du Colombier 	"#ifndef NOREDUCE",
5863*de2caf28SDavid du Colombier 	"	#ifdef HAS_PRIORITY",
5864*de2caf28SDavid du Colombier 	"		#warning use of priorities requires -DNOREDUCE",
5865*de2caf28SDavid du Colombier 	"	#elif HAS_ENABLED",
586600d97012SDavid du Colombier 	"		#error use of enabled() requires -DNOREDUCE",
58677dd7cddfSDavid du Colombier 	"	#endif",
586800d97012SDavid du Colombier 	"	#ifdef HAS_PCVALUE",
586900d97012SDavid du Colombier 	"		#error use of pcvalue() requires -DNOREDUCE",
58707dd7cddfSDavid du Colombier 	"	#endif",
587100d97012SDavid du Colombier 	"	#ifdef HAS_BADELSE",
587200d97012SDavid du Colombier 	"		#error use of 'else' combined with i/o stmnts requires -DNOREDUCE",
58737dd7cddfSDavid du Colombier 	"	#endif",
587400d97012SDavid du Colombier 	"	#if defined(HAS_LAST) && !defined(BCS)",
587500d97012SDavid du Colombier 	"		#error use of _last requires -DNOREDUCE",
5876219b2ee8SDavid du Colombier 	"	#endif",
5877219b2ee8SDavid du Colombier 	"#endif",
5878219b2ee8SDavid du Colombier 
58797dd7cddfSDavid du Colombier 	"#if SYNC>0 && !defined(NOREDUCE)",
58807dd7cddfSDavid du Colombier 	"	#ifdef HAS_UNLESS",
58817dd7cddfSDavid du Colombier 	"	fprintf(efd, \"warning: use of a rendezvous stmnts in the escape\\n\");",
5882312a1df1SDavid du Colombier 	"	fprintf(efd, \"\tof an unless clause, if present, could make p.o. reduction\\n\");",
58837dd7cddfSDavid du Colombier 	"	fprintf(efd, \"\tinvalid (use -DNOREDUCE to avoid this)\\n\");",
5884312a1df1SDavid du Colombier 	"		#ifdef BFS",
5885312a1df1SDavid du Colombier 	"		fprintf(efd, \"\t(this type of rv is also not compatible with -DBFS)\\n\");",
5886312a1df1SDavid du Colombier 	"		#endif",
58877dd7cddfSDavid du Colombier 	"	#endif",
58887dd7cddfSDavid du Colombier 	"#endif",
5889f3793cddSDavid du Colombier 	"#if SYNC>0 && defined(BFS)",
5890*de2caf28SDavid du Colombier 	"	if (!noends)",
5891*de2caf28SDavid du Colombier 	"	fprintf(efd, \"warning: use of rendezvous with BFS does not preserve all invalid endstates\\n\");",
5892f3793cddSDavid du Colombier 	"#endif",
58937dd7cddfSDavid du Colombier 	"#if !defined(REACH) && !defined(BITSTATE)",
5894312a1df1SDavid du Colombier 	"	if (iterative != 0 && a_cycles == 0)",
589500d97012SDavid du Colombier 	"	{	fprintf(efd, \"warning: -i and -I need -DREACH to work accurately\\n\");",
589600d97012SDavid du Colombier 	"	}",
58977dd7cddfSDavid du Colombier 	"#endif",
5898219b2ee8SDavid du Colombier 	"#if defined(BITSTATE) && defined(REACH)",
589900d97012SDavid du Colombier 	"	#warning -DREACH is voided by -DBITSTATE",
5900219b2ee8SDavid du Colombier 	"#endif",
5901312a1df1SDavid du Colombier 	"#if defined(MA) && defined(REACH)",
590200d97012SDavid du Colombier 	"	#warning -DREACH is voided by -DMA",
5903312a1df1SDavid du Colombier 	"#endif",
5904219b2ee8SDavid du Colombier 	"#if defined(FULLSTACK) && defined(CNTRSTACK)",
590500d97012SDavid du Colombier 	"	#error cannot combine -DFULLSTACK and -DCNTRSTACK",
5906219b2ee8SDavid du Colombier 	"#endif",
5907312a1df1SDavid du Colombier 	"#if defined(VERI)",
5908219b2ee8SDavid du Colombier 	"	#if ACCEPT_LAB>0",
5909312a1df1SDavid du Colombier 	"		#ifndef BFS",
5910312a1df1SDavid du Colombier 	"			if (!a_cycles",
5911312a1df1SDavid du Colombier 	"			#ifdef HAS_CODE",
5912312a1df1SDavid du Colombier 	"			&& !readtrail",
5913312a1df1SDavid du Colombier 	"			#endif",
591400d97012SDavid du Colombier 	"			#if NCORE>1",
591500d97012SDavid du Colombier 	"			&& core_id == 0",
591600d97012SDavid du Colombier 	"			#endif",
5917312a1df1SDavid du Colombier 	"			&& !state_tables)",
5918*de2caf28SDavid du Colombier 	"#ifdef NP",
5919*de2caf28SDavid du Colombier 	"			{ fprintf(efd, \"warning: non-progress claim \");",
5920*de2caf28SDavid du Colombier 	"			  fprintf(efd, \"requires -l flag to fully verify\\n\");",
5921*de2caf28SDavid du Colombier 	"#else",
5922312a1df1SDavid du Colombier 	"			{ fprintf(efd, \"warning: never claim + accept labels \");",
5923219b2ee8SDavid du Colombier 	"			  fprintf(efd, \"requires -a flag to fully verify\\n\");",
5924*de2caf28SDavid du Colombier 	"#endif",
5925219b2ee8SDavid du Colombier 	"			}",
5926312a1df1SDavid du Colombier 	"		#else",
5927*de2caf28SDavid du Colombier 	"			if (verbose && !state_tables",
5928312a1df1SDavid du Colombier 	"			#ifdef HAS_CODE",
592900d97012SDavid du Colombier 	"			&& !readtrail",
5930312a1df1SDavid du Colombier 	"			#endif",
593100d97012SDavid du Colombier 	"			)",
5932312a1df1SDavid du Colombier 	"			{ fprintf(efd, \"warning: verification in BFS mode \");",
5933312a1df1SDavid du Colombier 	"			  fprintf(efd, \"is restricted to safety properties\\n\");",
5934312a1df1SDavid du Colombier 	"			}",
5935219b2ee8SDavid du Colombier 	"		#endif",
5936219b2ee8SDavid du Colombier 	"	#endif",
5937312a1df1SDavid du Colombier 	"#endif",
59387dd7cddfSDavid du Colombier 	"#ifndef SAFETY",
5939*de2caf28SDavid du Colombier 	"  #if 0",
5940312a1df1SDavid du Colombier 	"	if (!a_cycles",
5941312a1df1SDavid du Colombier 	"	#ifdef HAS_CODE",
5942312a1df1SDavid du Colombier 	"	&& !readtrail",
5943312a1df1SDavid du Colombier 	"	#endif",
594400d97012SDavid du Colombier 	"	#if NCORE>1",
594500d97012SDavid du Colombier 	"	&& core_id == 0",
594600d97012SDavid du Colombier 	"	#endif",
5947312a1df1SDavid du Colombier 	"	&& !state_tables)",
59487dd7cddfSDavid du Colombier 	"	{ fprintf(efd, \"hint: this search is more efficient \");",
59497dd7cddfSDavid du Colombier 	"	  fprintf(efd, \"if pan.c is compiled -DSAFETY\\n\");",
59507dd7cddfSDavid du Colombier 	"	}",
5951*de2caf28SDavid du Colombier 	"  #endif",
5952219b2ee8SDavid du Colombier 	"	#ifndef NOCOMP",
59537dd7cddfSDavid du Colombier 	"	if (!a_cycles)",
595400d97012SDavid du Colombier 	"	{	S_A = 0;",
595500d97012SDavid du Colombier 	"	} else",
5956219b2ee8SDavid du Colombier 	"	{	if (!fairness)",
595700d97012SDavid du Colombier 	"		{	S_A = 1; /* _a_t */",
59587dd7cddfSDavid du Colombier 	"		#ifndef NOFAIR",
595900d97012SDavid du Colombier 	"		} else /* _a_t and _cnt[NFAIR] */",
596000d97012SDavid du Colombier 	"		{  S_A = (&(now._cnt[0]) - (uchar *) &now) + NFAIR - 2;",
59617dd7cddfSDavid du Colombier 	"		/* -2 because first two uchars in now are masked */",
59627dd7cddfSDavid du Colombier 	"		#endif",
596300d97012SDavid du Colombier 	"	}	}",
5964219b2ee8SDavid du Colombier 	"	#endif",
59657dd7cddfSDavid du Colombier 	"#endif",
59667dd7cddfSDavid du Colombier 	"	signal(SIGINT, stopped);",
596700d97012SDavid du Colombier 	"	set_masks();",
5968*de2caf28SDavid du Colombier 	"#if defined(BFS) || defined(BFS_PAR)",
5969312a1df1SDavid du Colombier 	"	trail = (Trail *) emalloc(6*sizeof(Trail));",
5970312a1df1SDavid du Colombier 	"	trail += 3;",
5971312a1df1SDavid du Colombier 	"#else",
59727dd7cddfSDavid du Colombier 	"	trail = (Trail *) emalloc((maxdepth+3)*sizeof(Trail));",
59737dd7cddfSDavid du Colombier 	"	trail++;	/* protect trpt-1 refs at depth 0 */",
5974312a1df1SDavid du Colombier 	"#endif",
5975*de2caf28SDavid du Colombier 	"	trpt = &trail[0]; /* precaution -- in case uerror is called early */",
5976*de2caf28SDavid du Colombier 	"#ifdef BFS",
5977*de2caf28SDavid du Colombier 	"	ntrpt = trpt;",
5978*de2caf28SDavid du Colombier 	"#endif",
59797dd7cddfSDavid du Colombier 	"#ifdef SVDUMP",
59807dd7cddfSDavid du Colombier 	"	if (vprefix > 0)",
59817dd7cddfSDavid du Colombier 	"	{	char nm[64];",
598200d97012SDavid du Colombier 	"		sprintf(nm, \"%%s.svd\", PanSource);",
598300d97012SDavid du Colombier 	"		if ((svfd = creat(nm, TMODE)) < 0)",
59847dd7cddfSDavid du Colombier 	"		{	fprintf(efd, \"couldn't create %%s\\n\", nm);",
59857dd7cddfSDavid du Colombier 	"			vprefix = 0;",
59867dd7cddfSDavid du Colombier 	"	}	}",
59877dd7cddfSDavid du Colombier 	"#endif",
59887dd7cddfSDavid du Colombier 	"#ifdef RANDSTOR",
5989*de2caf28SDavid du Colombier 	"	srand(s_rand+HASH_NR);", /* main - RANDSTOR */
59907dd7cddfSDavid du Colombier 	"#endif",
59917dd7cddfSDavid du Colombier 	"#if SYNC>0 && ASYNC==0",
59927dd7cddfSDavid du Colombier 	"	set_recvs();",
59937dd7cddfSDavid du Colombier 	"#endif",
5994219b2ee8SDavid du Colombier 	"	run();",
5995219b2ee8SDavid du Colombier 	"	done = 1;",
59967dd7cddfSDavid du Colombier 	"	wrapup();",
59977dd7cddfSDavid du Colombier 	"	return 0;",
5998312a1df1SDavid du Colombier 	"}",	/* end of main() */
5999312a1df1SDavid du Colombier 	"",
6000219b2ee8SDavid du Colombier 	"void",
6001219b2ee8SDavid du Colombier 	"usage(FILE *fd)",
6002219b2ee8SDavid du Colombier 	"{",
600300d97012SDavid du Colombier 	"	fprintf(fd, \"%%s\\n\", SpinVersion);",
60047dd7cddfSDavid du Colombier 	"	fprintf(fd, \"Valid Options are:\\n\");",
60057dd7cddfSDavid du Colombier 	"#ifndef SAFETY",
60067dd7cddfSDavid du Colombier 		"#ifdef NP",
60077dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-a  -> is disabled by -DNP \");",
60087dd7cddfSDavid du Colombier 	"	fprintf(fd, \"(-DNP compiles for -l only)\\n\");",
60097dd7cddfSDavid du Colombier 		"#else",
6010219b2ee8SDavid du Colombier 	"	fprintf(fd, \"\t-a  find acceptance cycles\\n\");",
60117dd7cddfSDavid du Colombier 		"#endif",
60127dd7cddfSDavid du Colombier 	"#else",
60137dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-a,-l,-f  -> are disabled by -DSAFETY\\n\");",
60147dd7cddfSDavid du Colombier 	"#endif",
60157dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-A  ignore assert() violations\\n\");",
6016312a1df1SDavid du Colombier 	"	fprintf(fd, \"\t-b  consider it an error to exceed the depth-limit\\n\");",
6017219b2ee8SDavid du Colombier 	"	fprintf(fd, \"\t-cN stop at Nth error \");",
60187dd7cddfSDavid du Colombier 	"	fprintf(fd, \"(defaults to -c1)\\n\");",
601900d97012SDavid du Colombier 	"	fprintf(fd, \"\t-D  print state tables in dot-format and stop\\n\");",
6020219b2ee8SDavid du Colombier 	"	fprintf(fd, \"\t-d  print state tables and stop\\n\");",
60217dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-e  create trails for all errors\\n\");",
60227dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-E  ignore invalid end states\\n\");",
60237dd7cddfSDavid du Colombier 	"#ifdef SC",
60247dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-Ffile  use 'file' to store disk-stack\\n\");",
60257dd7cddfSDavid du Colombier 	"#endif",
60267dd7cddfSDavid du Colombier 	"#ifndef NOFAIR",
60277dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-f  add weak fairness (to -a or -l)\\n\");",
60287dd7cddfSDavid du Colombier 	"#endif",
6029*de2caf28SDavid du Colombier 	"	fprintf(fd, \"\t-hN use different hash-seed N:0..499 (defaults to -h0)\\n\");",
6030*de2caf28SDavid du Colombier 	"	fprintf(fd, \"\t-hash generate a random hash-polynomial for -h0 (see also -rhash)\\n\");",
6031*de2caf28SDavid du Colombier 	"	fprintf(fd, \"\t      using a seed set with -RSn (default %%u)\\n\", s_rand);",
60327dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-i  search for shortest path to error\\n\");",
60337dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-I  like -i, but approximate and faster\\n\");",
60347dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-J  reverse eval order of nested unlesses\\n\");",
6035312a1df1SDavid du Colombier 	"#ifdef BITSTATE",
6036312a1df1SDavid du Colombier 	"	fprintf(fd, \"\t-kN set N bits per state (defaults to 3)\\n\");",
6037312a1df1SDavid du Colombier 	"#endif",
603800d97012SDavid du Colombier 	"#ifdef BCS",
603900d97012SDavid du Colombier 	"	fprintf(fd, \"\t-LN set scheduling restriction to N (default 0)\\n\");",
604000d97012SDavid du Colombier 	"#endif",
60417dd7cddfSDavid du Colombier 	"#ifndef SAFETY",
60427dd7cddfSDavid du Colombier 		"#ifdef NP",
6043219b2ee8SDavid du Colombier 	"	fprintf(fd, \"\t-l  find non-progress cycles\\n\");",
60447dd7cddfSDavid du Colombier 		"#else",
60457dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-l  find non-progress cycles -> \");",
60467dd7cddfSDavid du Colombier 	"	fprintf(fd, \"disabled, requires \");",
60477dd7cddfSDavid du Colombier 	"	fprintf(fd, \"compilation with -DNP\\n\");",
60487dd7cddfSDavid du Colombier 		"#endif",
60497dd7cddfSDavid du Colombier 	"#endif",
6050312a1df1SDavid du Colombier 	"#ifdef BITSTATE",
6051312a1df1SDavid du Colombier 	"	fprintf(fd, \"\t-MN use N Megabytes for bitstate hash array\\n\");",
6052312a1df1SDavid du Colombier 	"	fprintf(fd, \"\t-GN use N Gigabytes for bitstate hash array\\n\");",
6053312a1df1SDavid du Colombier 	"#endif",
60547dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-mN max depth N steps (default=10k)\\n\");",
605500d97012SDavid du Colombier 	"#if NCLAIMS>1",
605600d97012SDavid du Colombier 	"	fprintf(fd, \"\t-N cn -- use the claim named cn\\n\");",
605700d97012SDavid du Colombier 	"	fprintf(fd, \"\t-Nn   -- use claim number n\\n\");",
605800d97012SDavid du Colombier 	"#endif",
6059219b2ee8SDavid du Colombier 	"	fprintf(fd, \"\t-n  no listing of unreached states\\n\");",
6060*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
6061*de2caf28SDavid du Colombier 	"	fprintf(fd, \"\t-p_permute randomize order in which processes are scheduled (see also -rhash)\\n\");",
6062*de2caf28SDavid du Colombier 	"	fprintf(fd, \"\t-p_reverse reverse order in which processes are scheduled (see also -rhash)\\n\");",
6063*de2caf28SDavid du Colombier 	"	fprintf(fd, \"\t-p_rotateN rotate by N the process scheduling order (see also -rhash)\\n\");",
6064*de2caf28SDavid du Colombier 	"#endif",
60657dd7cddfSDavid du Colombier 	"#ifdef SVDUMP",
60667dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-pN create svfile (save N bytes per state)\\n\");",
60677dd7cddfSDavid du Colombier 	"#endif",
606800d97012SDavid du Colombier 	"	fprintf(fd, \"\t-QN set time-limit on execution of N minutes\\n\");",
60697dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-q  require empty chans in valid end states\\n\");",
6070312a1df1SDavid du Colombier 	"#ifdef HAS_CODE",
6071312a1df1SDavid du Colombier 	"	fprintf(fd, \"\t-r  read and execute trail - can add -v,-n,-PN,-g,-C\\n\");",
6072*de2caf28SDavid du Colombier 	"	fprintf(fd, \"\t-r trailfilename  read and execute trail in file\\n\");",
6073312a1df1SDavid du Colombier 	"	fprintf(fd, \"\t-rN read and execute N-th error trail\\n\");",
6074312a1df1SDavid du Colombier 	"	fprintf(fd, \"\t-C  read and execute trail - columnated output (can add -v,-n)\\n\");",
6075*de2caf28SDavid du Colombier 	"	fprintf(fd, \"\t-r -PN read and execute trail - restrict trail output to proc N\\n\");",
6076312a1df1SDavid du Colombier 	"	fprintf(fd, \"\t-g  read and execute trail + msc gui support\\n\");",
6077f3793cddSDavid du Colombier 	"	fprintf(fd, \"\t-S  silent replay: only user defined printfs show\\n\");",
6078312a1df1SDavid du Colombier 	"#endif",
6079*de2caf28SDavid du Colombier 	"	fprintf(fd, \"\t-RSn use randomization seed n\\n\");",
6080*de2caf28SDavid du Colombier 	"	fprintf(fd, \"\t-rhash use random hash-polynomial and randomly choose -p_rotateN, -p_permute, or p_reverse\\n\");",
6081219b2ee8SDavid du Colombier 	"#ifdef BITSTATE",
6082*de2caf28SDavid du Colombier 	"	fprintf(fd, \"\t-Rn run n times n: [1..100] using n \");",
6083*de2caf28SDavid du Colombier 	"	fprintf(fd, \" different hash functions\\n\");",
6084219b2ee8SDavid du Colombier 	"#endif",
60857dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-T  create trail files in read-only mode\\n\");",
6086*de2caf28SDavid du Colombier 	"	fprintf(fd, \"\t-t_reverse  reverse order in which transitions are explored\\n\");",
60877dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-tsuf replace .trail with .suf on trailfiles\\n\");",
60887dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-V  print SPIN version number\\n\");",
60897dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-v  verbose -- filenames in unreached state listing\\n\");",
60907dd7cddfSDavid du Colombier 	"	fprintf(fd, \"\t-wN hashtable of 2^N entries \");",
60917dd7cddfSDavid du Colombier 	"	fprintf(fd, \"(defaults to -w%%d)\\n\", ssize);",
609200d97012SDavid du Colombier 	"	fprintf(fd, \"\t-x  do not overwrite an existing trail file\\n\");",
609300d97012SDavid du Colombier 	"#if NCORE>1",
609400d97012SDavid du Colombier 	"	fprintf(fd, \"\t-zN handoff states below depth N to 2nd cpu (multi_core)\\n\");",
609500d97012SDavid du Colombier 	"#endif",
609600d97012SDavid du Colombier 	"#ifdef HAS_CODE",
609700d97012SDavid du Colombier 	"	fprintf(fd, \"\\n\toptions -r, -C, -PN, -g, and -S can optionally be followed by\\n\");",
609800d97012SDavid du Colombier 	"	fprintf(fd, \"\ta filename argument, as in \'-r filename\', naming the trailfile\\n\");",
609900d97012SDavid du Colombier 	"#endif",
610000d97012SDavid du Colombier 	"#if NCORE>1",
610100d97012SDavid du Colombier 	"	multi_usage(fd);",
610200d97012SDavid du Colombier 	"#endif",
6103f3793cddSDavid du Colombier 	"	exit(1);",
6104219b2ee8SDavid du Colombier 	"}",
6105219b2ee8SDavid du Colombier 	"",
6106219b2ee8SDavid du Colombier 	"char *",
6107*de2caf28SDavid du Colombier 	"Malloc(ulong n)",
6108219b2ee8SDavid du Colombier 	"{	char *tmp;",
610900d97012SDavid du Colombier 	"#ifdef MEMLIM",
611000d97012SDavid du Colombier 	"	if (memcnt + (double) n > memlim)",
611100d97012SDavid du Colombier 	"	{	printf(\"pan: reached -DMEMLIM bound\\n\");",
611200d97012SDavid du Colombier 	"		goto err;",
611300d97012SDavid du Colombier 	"	}",
6114219b2ee8SDavid du Colombier 	"#endif",
61157dd7cddfSDavid du Colombier 	"	tmp = (char *) malloc(n);",
6116312a1df1SDavid du Colombier 	"	if (!tmp)",
6117*de2caf28SDavid du Colombier 	"	{",
6118*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
6119*de2caf28SDavid du Colombier 	"		Uerror(\"out of non-shared memory\");",
6120*de2caf28SDavid du Colombier 	"#endif",
6121*de2caf28SDavid du Colombier 	"		printf(\"pan: out of memory\\n\");",
612200d97012SDavid du Colombier 	"#ifdef MEMLIM",
61237dd7cddfSDavid du Colombier 	"err:",
61247dd7cddfSDavid du Colombier 	"		printf(\"\t%%g bytes used\\n\", memcnt);",
61257dd7cddfSDavid du Colombier 	"		printf(\"\t%%g bytes more needed\\n\", (double) n);",
612600d97012SDavid du Colombier 	"		printf(\"\t%%g bytes limit\\n\", memlim);",
61277dd7cddfSDavid du Colombier 	"#endif",
61287dd7cddfSDavid du Colombier 	"#ifdef COLLAPSE",
61297dd7cddfSDavid du Colombier 	"		printf(\"hint: to reduce memory, recompile with\\n\");",
61307dd7cddfSDavid du Colombier 		"#ifndef MA",
61317dd7cddfSDavid du Colombier 	"		printf(\"  -DMA=%%d   # better/slower compression, or\\n\", hmax);",
61327dd7cddfSDavid du Colombier 		"#endif",
61337dd7cddfSDavid du Colombier 	"		printf(\"  -DBITSTATE # supertrace, approximation\\n\");",
61347dd7cddfSDavid du Colombier 	"#else",
61357dd7cddfSDavid du Colombier 	"#ifndef BITSTATE",
61367dd7cddfSDavid du Colombier 	"		printf(\"hint: to reduce memory, recompile with\\n\");",
61377dd7cddfSDavid du Colombier 		"#ifndef HC",
61387dd7cddfSDavid du Colombier 	"		printf(\"  -DCOLLAPSE # good, fast compression, or\\n\");",
61397dd7cddfSDavid du Colombier 			"#ifndef MA",
61407dd7cddfSDavid du Colombier 	"		printf(\"  -DMA=%%d   # better/slower compression, or\\n\", hmax);",
61417dd7cddfSDavid du Colombier 			"#endif",
61427dd7cddfSDavid du Colombier 	"		printf(\"  -DHC # hash-compaction, approximation\\n\");",
61437dd7cddfSDavid du Colombier 		"#endif",
61447dd7cddfSDavid du Colombier 	"		printf(\"  -DBITSTATE # supertrace, approximation\\n\");",
61457dd7cddfSDavid du Colombier 	"#endif",
61467dd7cddfSDavid du Colombier 	"#endif",
614700d97012SDavid du Colombier 	"#if NCORE>1",
614800d97012SDavid du Colombier 	"	#ifdef FULL_TRAIL",
614900d97012SDavid du Colombier 	"		printf(\"  omit -DFULL_TRAIL or use pan -c0 to reduce memory\\n\");",
615000d97012SDavid du Colombier 	"	#endif",
615100d97012SDavid du Colombier 	"	#ifdef SEP_STATE",
615200d97012SDavid du Colombier 	"		printf(\"hint: to reduce memory, recompile without\\n\");",
615300d97012SDavid du Colombier 	"		printf(\"  -DSEP_STATE # may be faster, but uses more memory\\n\");",
615400d97012SDavid du Colombier 	"	#endif",
615500d97012SDavid du Colombier 	"#endif",
61567dd7cddfSDavid du Colombier 	"		wrapup();",
6157219b2ee8SDavid du Colombier 	"	}",
6158312a1df1SDavid du Colombier 	"	memcnt += (double) n;",
6159219b2ee8SDavid du Colombier 	"	return tmp;",
6160219b2ee8SDavid du Colombier 	"}",
6161219b2ee8SDavid du Colombier 	"",
61627dd7cddfSDavid du Colombier 	"#define CHUNK	(100*VECTORSZ)",
6163219b2ee8SDavid du Colombier 	"",
6164219b2ee8SDavid du Colombier 	"char *",
6165*de2caf28SDavid du Colombier 	"emalloc(ulong n) /* never released or reallocated */",
6166219b2ee8SDavid du Colombier 	"{	char *tmp;",
6167219b2ee8SDavid du Colombier 	"	if (n == 0)",
6168219b2ee8SDavid du Colombier 	"	        return (char *) NULL;",
6169219b2ee8SDavid du Colombier 	"	if (n&(sizeof(void *)-1)) /* for proper alignment */",
6170219b2ee8SDavid du Colombier 	"	        n += sizeof(void *)-(n&(sizeof(void *)-1));",
6171*de2caf28SDavid du Colombier 	"	if ((ulong) left < n)",	/* was: (left < (long)n) */
61727dd7cddfSDavid du Colombier 	"	{       grow = (n < CHUNK) ? CHUNK : n;",
6173312a1df1SDavid du Colombier #if 1
61747dd7cddfSDavid du Colombier 	"	        have = Malloc(grow);",
6175312a1df1SDavid du Colombier #else
61767dd7cddfSDavid du Colombier 	"		/* gcc's sbrk can give non-aligned result */",
61777dd7cddfSDavid du Colombier 	"		grow += sizeof(void *);	/* allow realignment */",
61787dd7cddfSDavid du Colombier 	"	        have = Malloc(grow);",
61797dd7cddfSDavid du Colombier 	"		if (((unsigned) have)&(sizeof(void *)-1))",
61807dd7cddfSDavid du Colombier 	"		{	have += (long) (sizeof(void *) ",
61817dd7cddfSDavid du Colombier 	"				- (((unsigned) have)&(sizeof(void *)-1)));",
61827dd7cddfSDavid du Colombier 	"			grow -= sizeof(void *);",
61837dd7cddfSDavid du Colombier 	"		}",
6184312a1df1SDavid du Colombier #endif
61857dd7cddfSDavid du Colombier 	"	        fragment += (double) left;",
6186219b2ee8SDavid du Colombier 	"	        left = grow;",
6187219b2ee8SDavid du Colombier 	"	}",
6188219b2ee8SDavid du Colombier 	"	tmp = have;",
6189219b2ee8SDavid du Colombier 	"	have += (long) n;",
6190219b2ee8SDavid du Colombier 	"	left -= (long) n;",
6191219b2ee8SDavid du Colombier 	"	memset(tmp, 0, n);",
6192219b2ee8SDavid du Colombier 	"	return tmp;",
6193219b2ee8SDavid du Colombier 	"}",
61947dd7cddfSDavid du Colombier 
6195219b2ee8SDavid du Colombier 	"void",
6196*de2caf28SDavid du Colombier 	"dfs_Uerror(char *str)",
6197219b2ee8SDavid du Colombier 	"{	/* always fatal */",
6198219b2ee8SDavid du Colombier 	"	uerror(str);",
619900d97012SDavid du Colombier 	"#if NCORE>1",
620000d97012SDavid du Colombier 	"	sudden_stop(\"Uerror\");",
620100d97012SDavid du Colombier 	"#endif",
6202*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
6203*de2caf28SDavid du Colombier 	"	bfs_shutdown(\"Uerror\");",
6204*de2caf28SDavid du Colombier 	"#endif",
62057dd7cddfSDavid du Colombier 	"	wrapup();",
6206219b2ee8SDavid du Colombier 	"}\n",
62077dd7cddfSDavid du Colombier 	"#if defined(MA) && !defined(SAFETY)",
62087dd7cddfSDavid du Colombier 	"int",
62097dd7cddfSDavid du Colombier 	"Unwind(void)",
6210312a1df1SDavid du Colombier 	"{	Trans *t; uchar ot, _m; int tt; short II;",
6211312a1df1SDavid du Colombier 	"#ifdef VERBOSE",
6212312a1df1SDavid du Colombier 	"	int i;",
6213312a1df1SDavid du Colombier 	"#endif",
62147dd7cddfSDavid du Colombier 	"	uchar oat = now._a_t;",
62157dd7cddfSDavid du Colombier 	"	now._a_t &= ~(1|16|32);",
62167dd7cddfSDavid du Colombier 	"	memcpy((char *) &comp_now, (char *) &now, vsize);",
62177dd7cddfSDavid du Colombier 	"	now._a_t = oat;",
62187dd7cddfSDavid du Colombier 	"Up:",
62197dd7cddfSDavid du Colombier 	"#ifdef SC",
62207dd7cddfSDavid du Colombier 	"	trpt = getframe(depth);",
62217dd7cddfSDavid du Colombier 	"#endif",
62227dd7cddfSDavid du Colombier 	"#ifdef VERBOSE",
6223*de2caf28SDavid du Colombier 	"	printf(\"%%ld	 State: \", depth);",
6224*de2caf28SDavid du Colombier 	"#if !defined(NOCOMP) && !defined(HC)",
62257dd7cddfSDavid du Colombier 	"	for (i = 0; i < vsize; i++) printf(\"%%d%%s,\",",
62267dd7cddfSDavid du Colombier 	"		((char *)&now)[i], Mask[i]?\"*\":\"\");",
6227*de2caf28SDavid du Colombier 	"#else",
6228*de2caf28SDavid du Colombier 	"	for (i = 0; i < vsize; i++)",
6229*de2caf28SDavid du Colombier 	"		printf(\"%%d,\", ((char *)&now)[i]);",
6230*de2caf28SDavid du Colombier 	"#endif",
62317dd7cddfSDavid du Colombier 	"	printf(\"\\n\");",
62327dd7cddfSDavid du Colombier 	"#endif",
62337dd7cddfSDavid du Colombier 	"#ifndef NOFAIR",
62347dd7cddfSDavid du Colombier 	"	if (trpt->o_pm&128)	/* fairness alg */",
62357dd7cddfSDavid du Colombier 	"	{	now._cnt[now._a_t&1] = trpt->bup.oval;",
62367dd7cddfSDavid du Colombier 	"		depth--;",
62377dd7cddfSDavid du Colombier 	"#ifdef SC",
62387dd7cddfSDavid du Colombier 	"		trpt = getframe(depth);",
62397dd7cddfSDavid du Colombier 	"#else",
62407dd7cddfSDavid du Colombier 	"		trpt--;",
62417dd7cddfSDavid du Colombier 	"#endif",
62427dd7cddfSDavid du Colombier 	"		goto Q999;",
62437dd7cddfSDavid du Colombier 	"	}",
62447dd7cddfSDavid du Colombier 	"#endif",
62457dd7cddfSDavid du Colombier 	"#ifdef HAS_LAST",
62467dd7cddfSDavid du Colombier 	"#ifdef VERI",
6247*de2caf28SDavid du Colombier 	"	{ long d; Trail *trl;",
62487dd7cddfSDavid du Colombier 	"	  now._last = 0;",
62497dd7cddfSDavid du Colombier 	"	  for (d = 1; d < depth; d++)",
62507dd7cddfSDavid du Colombier 	"	  {	trl = getframe(depth-d); /* was trl = (trpt-d); */",
62517dd7cddfSDavid du Colombier 	"		if (trl->pr != 0)",
62527dd7cddfSDavid du Colombier 	"		{ now._last = trl->pr - BASE;",
62537dd7cddfSDavid du Colombier 	"		  break;",
62547dd7cddfSDavid du Colombier 	"	} }	}",
62557dd7cddfSDavid du Colombier 	"#else",
62567dd7cddfSDavid du Colombier 	"	now._last = (depth<1)?0:(trpt-1)->pr;",
62577dd7cddfSDavid du Colombier 	"#endif",
62587dd7cddfSDavid du Colombier 	"#endif",
62597dd7cddfSDavid du Colombier 	"#ifdef EVENT_TRACE",
62607dd7cddfSDavid du Colombier 	"	now._event = trpt->o_event;",
62617dd7cddfSDavid du Colombier 	"#endif",
62627dd7cddfSDavid du Colombier 	"	if ((now._a_t&1) && depth <= A_depth)",
62637dd7cddfSDavid du Colombier 	"	{	now._a_t &= ~(1|16|32);",
62647dd7cddfSDavid du Colombier 	"		if (fairness) now._a_t |= 2;	/* ? */",
62657dd7cddfSDavid du Colombier 	"		A_depth = 0;",
62667dd7cddfSDavid du Colombier 	"		goto CameFromHere;	/* checkcycles() */",
62677dd7cddfSDavid du Colombier 	"	}",
62687dd7cddfSDavid du Colombier 	"	t  = trpt->o_t;",
62697dd7cddfSDavid du Colombier 	"	ot = trpt->o_ot; II = trpt->pr;",
6270*de2caf28SDavid du Colombier 	"	tt = trpt->o_tt; _this = pptr(II);",
6271312a1df1SDavid du Colombier 	"	_m = do_reverse(t, II, trpt->o_m);",
62727dd7cddfSDavid du Colombier 	"#ifdef VERBOSE",
627300d97012SDavid du Colombier 	"	printf(\"%%3ld: proc %%d \", depth, II);",
62747dd7cddfSDavid du Colombier 	"	printf(\"reverses %%d, %%d to %%d,\",",
62757dd7cddfSDavid du Colombier 	"		t->forw, tt, t->st);",
6276*de2caf28SDavid du Colombier 	"	printf(\" %%s [abit=%%d,adepth=%%ld,\", ",
62777dd7cddfSDavid du Colombier 	"		t->tp, now._a_t, A_depth);",
62787dd7cddfSDavid du Colombier 	"	printf(\"tau=%%d,%%d] <unwind>\\n\", ",
62797dd7cddfSDavid du Colombier 	"		trpt->tau, (trpt-1)->tau);",
62807dd7cddfSDavid du Colombier 	"#endif",
62817dd7cddfSDavid du Colombier 	"	depth--;",
62827dd7cddfSDavid du Colombier 	"#ifdef SC",
62837dd7cddfSDavid du Colombier 	"	trpt = getframe(depth);",
62847dd7cddfSDavid du Colombier 	"#else",
62857dd7cddfSDavid du Colombier 	"	trpt--;",
62867dd7cddfSDavid du Colombier 	"#endif",
6287312a1df1SDavid du Colombier 	"	/* reached[ot][t->st] = 1;	3.4.13 */",
6288*de2caf28SDavid du Colombier 	"	((P0 *)_this)->_p = tt;",
62897dd7cddfSDavid du Colombier 	"#ifndef NOFAIR",
62907dd7cddfSDavid du Colombier 	"	if ((trpt->o_pm&32))",
62917dd7cddfSDavid du Colombier 	"	{",
62927dd7cddfSDavid du Colombier 		"#ifdef VERI",
62937dd7cddfSDavid du Colombier 	"		if (now._cnt[now._a_t&1] == 0)",
62947dd7cddfSDavid du Colombier 	"			now._cnt[now._a_t&1] = 1;",
62957dd7cddfSDavid du Colombier 		"#endif",
62967dd7cddfSDavid du Colombier 	"		now._cnt[now._a_t&1] += 1;",
62977dd7cddfSDavid du Colombier 	"	}",
62987dd7cddfSDavid du Colombier 	"Q999:",
62997dd7cddfSDavid du Colombier 	"	if (trpt->o_pm&8)",
63007dd7cddfSDavid du Colombier 	"	{	now._a_t &= ~2;",
63017dd7cddfSDavid du Colombier 	"		now._cnt[now._a_t&1] = 0;",
63027dd7cddfSDavid du Colombier 	"	}",
63037dd7cddfSDavid du Colombier 	"	if (trpt->o_pm&16)",
63047dd7cddfSDavid du Colombier 	"		now._a_t |= 2;",
63057dd7cddfSDavid du Colombier 	"#endif",
63067dd7cddfSDavid du Colombier 	"CameFromHere:",
63077dd7cddfSDavid du Colombier 	"	if (memcmp((char *) &now, (char *) &comp_now, vsize) == 0)",
63087dd7cddfSDavid du Colombier 	"		return depth;",
63097dd7cddfSDavid du Colombier 	"	if (depth > 0) goto Up;",
63107dd7cddfSDavid du Colombier 	"	return 0;",
63117dd7cddfSDavid du Colombier 	"}",
63127dd7cddfSDavid du Colombier 	"#endif",
6313312a1df1SDavid du Colombier 	"static char unwinding;",
6314219b2ee8SDavid du Colombier 	"void",
6315*de2caf28SDavid du Colombier 	"dfs_uerror(char *str)",
6316312a1df1SDavid du Colombier 	"{	static char laststr[256];",
6317312a1df1SDavid du Colombier 	"	int is_cycle;",
6318312a1df1SDavid du Colombier 	"",
6319312a1df1SDavid du Colombier 	"	if (unwinding) return; /* 1.4.2 */",
6320312a1df1SDavid du Colombier 	"	if (strncmp(str, laststr, 254))",
632100d97012SDavid du Colombier 	"#if NCORE>1",
6322*de2caf28SDavid du Colombier 	"	cpu_printf(\"pan:%%lu: %%s (at depth %%ld)\\n\", errors+1, str,",
632300d97012SDavid du Colombier 	"#else",
6324*de2caf28SDavid du Colombier 	"	printf(\"pan:%%lu: %%s (at depth %%ld)\\n\", errors+1, str,",
632500d97012SDavid du Colombier 	"#endif",
632600d97012SDavid du Colombier 	"#if NCORE>1",
632700d97012SDavid du Colombier 	"		(nr_handoffs * z_handoff) + ",
632800d97012SDavid du Colombier 	"#endif",
632900d97012SDavid du Colombier 	"		((depthfound == -1)?depth:depthfound));",
6330312a1df1SDavid du Colombier 	"	strncpy(laststr, str, 254);",
63317dd7cddfSDavid du Colombier 	"	errors++;",
6332312a1df1SDavid du Colombier 	"#ifdef HAS_CODE",
6333312a1df1SDavid du Colombier 	"	if (readtrail) { wrap_trail(); return; }",
6334312a1df1SDavid du Colombier 	"#endif",
6335312a1df1SDavid du Colombier 	"	is_cycle = (strstr(str, \" cycle\") != (char *) 0);",
6336312a1df1SDavid du Colombier 	"	if (!is_cycle)",
6337312a1df1SDavid du Colombier 	"	{	depth++; trpt++;",	/* include failed step */
6338312a1df1SDavid du Colombier 	"	}",
6339312a1df1SDavid du Colombier 	"	if ((every_error != 0)",
63407dd7cddfSDavid du Colombier 	"	||  errors == upto)",
63417dd7cddfSDavid du Colombier 	"	{",
63427dd7cddfSDavid du Colombier 	"#if defined(MA) && !defined(SAFETY)",
6343312a1df1SDavid du Colombier 	"		if (is_cycle)",
63447dd7cddfSDavid du Colombier 	"		{	int od = depth;",
6345312a1df1SDavid du Colombier 	"			unwinding = 1;",
63467dd7cddfSDavid du Colombier 	"			depthfound = Unwind();",
6347312a1df1SDavid du Colombier 	"			unwinding = 0;",
63487dd7cddfSDavid du Colombier 	"			depth = od;",
63497dd7cddfSDavid du Colombier 	"		}",
63507dd7cddfSDavid du Colombier 	"#endif",
635100d97012SDavid du Colombier 	"#if NCORE>1",
635200d97012SDavid du Colombier 	"		writing_trail = 1;",
635300d97012SDavid du Colombier 	"#endif",
6354312a1df1SDavid du Colombier 	"#ifdef BFS",
6355312a1df1SDavid du Colombier 	"		if (depth > 1) trpt--;",
6356*de2caf28SDavid du Colombier 	"		nuerror();",
6357312a1df1SDavid du Colombier 	"		if (depth > 1) trpt++;",
6358312a1df1SDavid du Colombier 	"#else",
63597dd7cddfSDavid du Colombier 	"		putrail();",
6360312a1df1SDavid du Colombier 	"#endif",
63617dd7cddfSDavid du Colombier 	"#if defined(MA) && !defined(SAFETY)",
63627dd7cddfSDavid du Colombier 	"		if (strstr(str, \" cycle\"))",
63637dd7cddfSDavid du Colombier 	"		{	if (every_error)",
63647dd7cddfSDavid du Colombier 	"			printf(\"sorry: MA writes 1 trail max\\n\");",
63657dd7cddfSDavid du Colombier 	"			wrapup(); /* no recovery from unwind */",
63667dd7cddfSDavid du Colombier 	"		}",
63677dd7cddfSDavid du Colombier 	"#endif",
636800d97012SDavid du Colombier 	"#if NCORE>1",
636900d97012SDavid du Colombier 	"		if (search_terminated != NULL)",
637000d97012SDavid du Colombier 	"		{	*search_terminated |= 4; /* uerror */",
637100d97012SDavid du Colombier 	"		}",
637200d97012SDavid du Colombier 	"		writing_trail = 0;",
637300d97012SDavid du Colombier 	"#endif",
63747dd7cddfSDavid du Colombier 	"	}",
6375312a1df1SDavid du Colombier 	"	if (!is_cycle)",
6376312a1df1SDavid du Colombier 	"	{	depth--; trpt--;	/* undo */",
6377312a1df1SDavid du Colombier 	"	}",
6378312a1df1SDavid du Colombier 	"#ifndef BFS",
63797dd7cddfSDavid du Colombier 	"	if (iterative != 0 && maxdepth > 0)",
638000d97012SDavid du Colombier 	"	{	if (maxdepth > depth)",
638100d97012SDavid du Colombier 	"		{	maxdepth = (iterative == 1)?(depth+1):(depth/2);",
638200d97012SDavid du Colombier 	"		}",
63837dd7cddfSDavid du Colombier 	"		warned = 1;",
6384f3793cddSDavid du Colombier 	"		printf(\"pan: reducing search depth to %%ld\\n\",",
63857dd7cddfSDavid du Colombier 	"			maxdepth);",
6386312a1df1SDavid du Colombier 	"	} else",
6387312a1df1SDavid du Colombier 	"#endif",
6388312a1df1SDavid du Colombier 	"	if (errors >= upto && upto != 0)",
638900d97012SDavid du Colombier 	"	{",
6390*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
6391*de2caf28SDavid du Colombier 	"		bfs_shutdown(\"uerror\"); /* no return */",
6392*de2caf28SDavid du Colombier 	"#endif",
639300d97012SDavid du Colombier 	"#if NCORE>1",
639400d97012SDavid du Colombier 	"		sudden_stop(\"uerror\");",
639500d97012SDavid du Colombier 	"#endif",
63967dd7cddfSDavid du Colombier 	"		wrapup();",
639700d97012SDavid du Colombier 	"	}",
6398312a1df1SDavid du Colombier 	"	depthfound = -1;",
6399312a1df1SDavid du Colombier 	"}\n",
6400312a1df1SDavid du Colombier 	"int",
6401312a1df1SDavid du Colombier 	"xrefsrc(int lno, S_F_MAP *mp, int M, int i)",
6402f3793cddSDavid du Colombier 	"{	Trans *T; int j, retval=1;",
6403312a1df1SDavid du Colombier 	"	for (T = trans[M][i]; T; T = T->nxt)",
6404312a1df1SDavid du Colombier 	"	if (T && T->tp)",
6405312a1df1SDavid du Colombier 	"	{	if (strcmp(T->tp, \".(goto)\") == 0",
6406312a1df1SDavid du Colombier 	"		||  strncmp(T->tp, \"goto :\", 6) == 0)",
6407312a1df1SDavid du Colombier 	"			return 1; /* not reported */",
6408312a1df1SDavid du Colombier 	"",
6409312a1df1SDavid du Colombier 	"		for (j = 0; j < sizeof(mp); j++)",
6410312a1df1SDavid du Colombier 	"			if (i >= mp[j].from && i <= mp[j].upto)",
641100d97012SDavid du Colombier 	"			{	printf(\"\\t%%s:%%d\", mp[j].fnm, lno);",
6412312a1df1SDavid du Colombier 	"				break;",
6413312a1df1SDavid du Colombier 	"			}",
641400d97012SDavid du Colombier 	"		if (j >= sizeof(mp))	/* fnm not found in list */",
641500d97012SDavid du Colombier 	"		{	printf(\"\\t%%s:%%d\", PanSource, lno); /* use default */",
641600d97012SDavid du Colombier 	"		}",
6417312a1df1SDavid du Colombier 	"		printf(\", state %%d\", i);",
6418312a1df1SDavid du Colombier 	"		if (strcmp(T->tp, \"\") != 0)",
6419312a1df1SDavid du Colombier 	"		{	char *q;",
6420312a1df1SDavid du Colombier 	"			q = transmognify(T->tp);",
6421f3793cddSDavid du Colombier 	"			printf(\", \\\"%%s\\\"\", q?q:\"\");",
6422312a1df1SDavid du Colombier 	"		} else if (stopstate[M][i])",
6423312a1df1SDavid du Colombier 	"			printf(\", -end state-\");",
6424312a1df1SDavid du Colombier 	"		printf(\"\\n\");",
6425f3793cddSDavid du Colombier 	"		retval = 0; /* reported */",
6426312a1df1SDavid du Colombier 	"	}",
6427f3793cddSDavid du Colombier 	"	return retval;",
6428219b2ee8SDavid du Colombier 	"}\n",
6429219b2ee8SDavid du Colombier 	"void",
64307dd7cddfSDavid du Colombier 	"r_ck(uchar *which, int N, int M, short *src, S_F_MAP *mp)",
643100d97012SDavid du Colombier 	"{	int i, m=0;",
643200d97012SDavid du Colombier 	"",
643300d97012SDavid du Colombier 	"	if ((enum btypes) Btypes[M] == N_CLAIM",
643400d97012SDavid du Colombier 	"	&& claimname != NULL && strcmp(claimname, procname[M]) != 0)",
643500d97012SDavid du Colombier 	"	{	return;",
643600d97012SDavid du Colombier 	"	}",
643700d97012SDavid du Colombier 	"",
643800d97012SDavid du Colombier 	"	switch ((enum btypes) Btypes[M]) {",
643900d97012SDavid du Colombier 	"	case P_PROC:",
644000d97012SDavid du Colombier 	"	case A_PROC:",
6441219b2ee8SDavid du Colombier 	"		printf(\"unreached in proctype %%s\\n\", procname[M]);",
644200d97012SDavid du Colombier 	"		break;",
644300d97012SDavid du Colombier 	"	case I_PROC:",
644400d97012SDavid du Colombier 	"		printf(\"unreached in init\\n\");",
644500d97012SDavid du Colombier 	"		break;",
644600d97012SDavid du Colombier 	"	case E_TRACE:",
644700d97012SDavid du Colombier 	"	case N_TRACE:",
644800d97012SDavid du Colombier 	"	case N_CLAIM:",
644900d97012SDavid du Colombier 	"	default:",
645000d97012SDavid du Colombier 	"		printf(\"unreached in claim %%s\\n\", procname[M]);",
645100d97012SDavid du Colombier 	"		break;",
645200d97012SDavid du Colombier 	"	}",
6453219b2ee8SDavid du Colombier 	"	for (i = 1; i < N; i++)",
645400d97012SDavid du Colombier 	"	{	if (which[i] == 0",
6455312a1df1SDavid du Colombier 	"		&&  (mapstate[M][i] == 0",
6456312a1df1SDavid du Colombier 	"		||   which[mapstate[M][i]] == 0))",
645700d97012SDavid du Colombier 	"		{	m += xrefsrc((int) src[i], mp, M, i);",
645800d97012SDavid du Colombier 	"		} else",
645900d97012SDavid du Colombier 	"		{	m++;",
646000d97012SDavid du Colombier 	"	}	}",
6461219b2ee8SDavid du Colombier 	"	printf(\"\t(%%d of %%d states)\\n\", N-1-m, N-1);",
646200d97012SDavid du Colombier 	"}",
646300d97012SDavid du Colombier 	"#if NCORE>1 && !defined(SEP_STATE)",
646400d97012SDavid du Colombier 	"static long rev_trail_cnt;",
646500d97012SDavid du Colombier 	"",
646600d97012SDavid du Colombier 	"#ifdef FULL_TRAIL",
646700d97012SDavid du Colombier 	"void",
646800d97012SDavid du Colombier 	"rev_trail(int fd, volatile Stack_Tree *st_tr)",
646900d97012SDavid du Colombier 	"{	long j; char snap[64];",
647000d97012SDavid du Colombier 	"",
647100d97012SDavid du Colombier 	"	if (!st_tr)",
647200d97012SDavid du Colombier 	"	{	return;",
647300d97012SDavid du Colombier 	"	}",
647400d97012SDavid du Colombier 	"	rev_trail(fd, st_tr->prv);",
647500d97012SDavid du Colombier 	"#ifdef VERBOSE",
647600d97012SDavid du Colombier 	"	printf(\"%%d (%%d) LRT [%%d,%%d] -- %%9u (root %%9u)\\n\",",
647700d97012SDavid du Colombier 	"		depth, rev_trail_cnt, st_tr->pr, st_tr->t_id, st_tr, stack_last[core_id]);",
647800d97012SDavid du Colombier 	"#endif",
647900d97012SDavid du Colombier 	"	if (st_tr->pr != 255)", /* still needed? */
648000d97012SDavid du Colombier 	"	{	sprintf(snap, \"%%ld:%%d:%%d\\n\", ",
648100d97012SDavid du Colombier 	"			rev_trail_cnt++, st_tr->pr, st_tr->t_id);",
648200d97012SDavid du Colombier 	"		j = strlen(snap);",
648300d97012SDavid du Colombier 	"		if (write(fd, snap, j) != j)",
648400d97012SDavid du Colombier 	"		{	printf(\"pan: error writing trailfile\\n\");",
648500d97012SDavid du Colombier 	"			close(fd);",
648600d97012SDavid du Colombier 	"			wrapup();",
648700d97012SDavid du Colombier 	"			return;",
648800d97012SDavid du Colombier 	"		}",
648900d97012SDavid du Colombier 	"	} else  /* handoff point */",
649000d97012SDavid du Colombier 	"	{	if (a_cycles)",
649100d97012SDavid du Colombier 	"		{	(void) write(fd, \"-1:-1:-1\\n\", 9);",
649200d97012SDavid du Colombier 	"	}	}",
649300d97012SDavid du Colombier 	"}",
649400d97012SDavid du Colombier 	"#endif", /* FULL_TRAIL */
649500d97012SDavid du Colombier 	"#endif", /* NCORE>1 */
649600d97012SDavid du Colombier 	"",
6497219b2ee8SDavid du Colombier 	"void",
6498219b2ee8SDavid du Colombier 	"putrail(void)",
649900d97012SDavid du Colombier 	"{	int fd;",
6500f3793cddSDavid du Colombier 	"#if defined VERI || defined(MERGED)",
6501312a1df1SDavid du Colombier 	"	char snap[64];",
6502f3793cddSDavid du Colombier 	"#endif",
650300d97012SDavid du Colombier 	"#if NCORE==1 || defined(SEP_STATE) || !defined(FULL_TRAIL)",
650400d97012SDavid du Colombier 	"	long i, j;",
650500d97012SDavid du Colombier 	"	Trail *trl;",
650600d97012SDavid du Colombier 	"#endif",
6507312a1df1SDavid du Colombier 	"	fd = make_trail();",
6508312a1df1SDavid du Colombier 	"	if (fd < 0) return;",
6509219b2ee8SDavid du Colombier 	"#ifdef VERI",
651000d97012SDavid du Colombier 	"	sprintf(snap, \"-2:%%d:-2\\n\", (uchar) ((P0 *)pptr(0))->_t);",
651100d97012SDavid du Colombier 	"	if (write(fd, snap, strlen(snap)) < 0) return;",
6512219b2ee8SDavid du Colombier 	"#endif",
65137dd7cddfSDavid du Colombier 	"#ifdef MERGED",
65147dd7cddfSDavid du Colombier 	"	sprintf(snap, \"-4:-4:-4\\n\");",
651500d97012SDavid du Colombier 	"	if (write(fd, snap, strlen(snap)) < 0) return;",
65167dd7cddfSDavid du Colombier 	"#endif",
6517*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
6518*de2caf28SDavid du Colombier 	"	sprintf(snap, \"-5:%%d:%%d\\n\", t_reverse, reversing&2);",
6519*de2caf28SDavid du Colombier 	"	if (write(fd, snap, strlen(snap)) < 0) return;",
6520*de2caf28SDavid du Colombier 	"",
6521*de2caf28SDavid du Colombier 	"	sprintf(snap, \"-6:%%d:%%d\\n\", p_reorder==set_permuted, p_reorder==set_reversed);",
6522*de2caf28SDavid du Colombier 	"	if (write(fd, snap, strlen(snap)) < 0) return;",
6523*de2caf28SDavid du Colombier 	"",
6524*de2caf28SDavid du Colombier 	"	sprintf(snap, \"-7:%%d:%%d\\n\", p_reorder==set_rotated, p_rotate);",
6525*de2caf28SDavid du Colombier 	"	if (write(fd, snap, strlen(snap)) < 0) return;",
6526*de2caf28SDavid du Colombier 	"",
6527*de2caf28SDavid du Colombier 	"	sprintf(snap, \"-8:%%d:%%d\\n\", p_reorder==set_randrot, --s_rand);",
6528*de2caf28SDavid du Colombier 	"	if (write(fd, snap, strlen(snap)) < 0) return;",
6529*de2caf28SDavid du Colombier 	"#endif",
653000d97012SDavid du Colombier 	"#if NCORE>1 && !defined(SEP_STATE) && defined(FULL_TRAIL)",
653100d97012SDavid du Colombier 	"	rev_trail_cnt = 1;",
653200d97012SDavid du Colombier 	"	enter_critical(GLOBAL_LOCK);",
653300d97012SDavid du Colombier 	"	 rev_trail(fd, stack_last[core_id]);",
653400d97012SDavid du Colombier 	"	leave_critical(GLOBAL_LOCK);",
653500d97012SDavid du Colombier 	"#else",
653600d97012SDavid du Colombier 	"	i = 1; /* trail starts at position 1 */",
653700d97012SDavid du Colombier 	"	#if NCORE>1 && defined(SEP_STATE)",
653800d97012SDavid du Colombier 	"	if (cur_Root.m_vsize > 0) { i++; depth++; }",
653900d97012SDavid du Colombier 	"	#endif",
654000d97012SDavid du Colombier 	"	for ( ; i <= depth; i++)",
65417dd7cddfSDavid du Colombier 	"	{	if (i == depthfound+1)",
654200d97012SDavid du Colombier 	"		{	if (write(fd, \"-1:-1:-1\\n\", 9) != 9)",
654300d97012SDavid du Colombier 	"			{	goto notgood;",
654400d97012SDavid du Colombier 	"		}	}",
65457dd7cddfSDavid du Colombier 	"		trl = getframe(i);",
6546312a1df1SDavid du Colombier 	"		if (!trl->o_t) continue;",
65477dd7cddfSDavid du Colombier 	"		if (trl->o_pm&128) continue;",
6548f3793cddSDavid du Colombier 	"		sprintf(snap, \"%%ld:%%d:%%d\\n\", ",
65497dd7cddfSDavid du Colombier 	"			i, trl->pr, trl->o_t->t_id);",
65507dd7cddfSDavid du Colombier 	"		j = strlen(snap);",
65517dd7cddfSDavid du Colombier 	"		if (write(fd, snap, j) != j)",
655200d97012SDavid du Colombier 	"		{",
655300d97012SDavid du Colombier 	"notgood:		printf(\"pan: error writing trailfile\\n\");",
65547dd7cddfSDavid du Colombier 	"			close(fd);",
65557dd7cddfSDavid du Colombier 	"			wrapup();",
655600d97012SDavid du Colombier 	"	}	}",
655700d97012SDavid du Colombier 	"#endif",
6558219b2ee8SDavid du Colombier 	"	close(fd);",
655900d97012SDavid du Colombier 	"#if NCORE>1",
656000d97012SDavid du Colombier 	"	cpu_printf(\"pan: wrote trailfile\\n\");",
656100d97012SDavid du Colombier 	"#endif",
6562219b2ee8SDavid du Colombier 	"}\n",
6563219b2ee8SDavid du Colombier 	"void",
6564312a1df1SDavid du Colombier 	"sv_save(void)	/* push state vector onto save stack */",
6565312a1df1SDavid du Colombier 	"{	if (!svtack->nxt)",
6566219b2ee8SDavid du Colombier 	"	{  svtack->nxt = (Svtack *) emalloc(sizeof(Svtack));",
6567219b2ee8SDavid du Colombier 	"	   svtack->nxt->body = emalloc(vsize*sizeof(char));",
6568219b2ee8SDavid du Colombier 	"	   svtack->nxt->lst = svtack;",
6569219b2ee8SDavid du Colombier 	"	   svtack->nxt->m_delta = vsize;",
6570219b2ee8SDavid du Colombier 	"	   svmax++;",
6571219b2ee8SDavid du Colombier 	"	} else if (vsize > svtack->nxt->m_delta)",
6572219b2ee8SDavid du Colombier 	"	{  svtack->nxt->body = emalloc(vsize*sizeof(char));",
6573219b2ee8SDavid du Colombier 	"	   svtack->nxt->lst = svtack;",
6574219b2ee8SDavid du Colombier 	"	   svtack->nxt->m_delta = vsize;",
6575219b2ee8SDavid du Colombier 	"	   svmax++;",
6576219b2ee8SDavid du Colombier 	"	}",
6577219b2ee8SDavid du Colombier 	"	svtack = svtack->nxt;",
6578219b2ee8SDavid du Colombier 	"#if SYNC",
6579219b2ee8SDavid du Colombier 	"	svtack->o_boq = boq;",
6580219b2ee8SDavid du Colombier 	"#endif",
658100d97012SDavid du Colombier 	"#ifdef TRIX",
658200d97012SDavid du Colombier 	"	sv_populate();",
658300d97012SDavid du Colombier 	"#endif",
6584219b2ee8SDavid du Colombier 	"	svtack->o_delta = vsize; /* don't compress */",
6585312a1df1SDavid du Colombier 	"	memcpy((char *)(svtack->body), (char *) &now, vsize);",
6586312a1df1SDavid du Colombier 	"#if defined(C_States) && defined(HAS_STACK) && (HAS_TRACK==1)",
6587312a1df1SDavid du Colombier 	"	c_stack((uchar *) &(svtack->c_stack[0]));",
6588312a1df1SDavid du Colombier 	"#endif",
6589219b2ee8SDavid du Colombier 	"#ifdef DEBUG",
659000d97012SDavid du Colombier 	"	cpu_printf(\"%%d:	sv_save\\n\", depth);",
6591219b2ee8SDavid du Colombier 	"#endif",
6592219b2ee8SDavid du Colombier 	"}\n",
6593219b2ee8SDavid du Colombier 	"void",
65947dd7cddfSDavid du Colombier 	"sv_restor(void)	/* pop state vector from save stack */",
6595219b2ee8SDavid du Colombier 	"{",
65967dd7cddfSDavid du Colombier 	"	memcpy((char *)&now, svtack->body, svtack->o_delta);",
6597219b2ee8SDavid du Colombier 	"#if SYNC",
6598219b2ee8SDavid du Colombier 	"	boq = svtack->o_boq;",
6599219b2ee8SDavid du Colombier 	"#endif",
660000d97012SDavid du Colombier 	"#ifdef TRIX",
660100d97012SDavid du Colombier 	"	re_populate();",
660200d97012SDavid du Colombier 	"#endif",
6603312a1df1SDavid du Colombier 	"#if defined(C_States) && (HAS_TRACK==1)",
6604312a1df1SDavid du Colombier 	"#ifdef HAS_STACK",
6605312a1df1SDavid du Colombier 	"	c_unstack((uchar *) &(svtack->c_stack[0]));",
6606312a1df1SDavid du Colombier 	"#endif",
6607312a1df1SDavid du Colombier 	"	c_revert((uchar *) &(now.c_state[0]));",
6608312a1df1SDavid du Colombier 	"#endif",
6609312a1df1SDavid du Colombier 
6610219b2ee8SDavid du Colombier 	"	if (vsize != svtack->o_delta)",
6611219b2ee8SDavid du Colombier 	"		Uerror(\"sv_restor\");",
6612219b2ee8SDavid du Colombier 	"	if (!svtack->lst)",
661300d97012SDavid du Colombier 	"		Uerror(\"error: sv_restor\");",
6614219b2ee8SDavid du Colombier 	"	svtack  = svtack->lst;",
6615219b2ee8SDavid du Colombier 	"#ifdef DEBUG",
661600d97012SDavid du Colombier 	"	cpu_printf(\"	sv_restor\\n\");",
6617219b2ee8SDavid du Colombier 	"#endif",
6618*de2caf28SDavid du Colombier 	"}",
6619*de2caf28SDavid du Colombier 	"",
6620219b2ee8SDavid du Colombier 	"void",
6621219b2ee8SDavid du Colombier 	"p_restor(int h)",
662200d97012SDavid du Colombier 	"{	int i;",
662300d97012SDavid du Colombier 	"	char *z = (char *) &now;\n",
6624*de2caf28SDavid du Colombier 	"",
6625*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
6626*de2caf28SDavid du Colombier 	"	bfs_prepmask(1);	/* p_restor */",
6627*de2caf28SDavid du Colombier 	"#endif",
662800d97012SDavid du Colombier 	"#ifndef TRIX",
6629219b2ee8SDavid du Colombier 	"	proc_offset[h] = stack->o_offset;",
6630f3793cddSDavid du Colombier 	"	proc_skip[h]   = (uchar) stack->o_skip;",
663100d97012SDavid du Colombier 	"#else",
663200d97012SDavid du Colombier 	"	char *oi;",
663300d97012SDavid du Colombier 	"	#ifdef V_TRIX",
663400d97012SDavid du Colombier 	"		printf(\"%%4d: p_restor %%d\\n\", depth, h);",
663500d97012SDavid du Colombier 	"	#endif",
663600d97012SDavid du Colombier 	"#endif",
6637219b2ee8SDavid du Colombier 	"#ifndef XUSAFE",
6638219b2ee8SDavid du Colombier 	"	p_name[h] = stack->o_name;",
6639219b2ee8SDavid du Colombier 	"#endif",
664000d97012SDavid du Colombier 	"#ifdef TRIX",
664100d97012SDavid du Colombier 	"	vsize += sizeof(char *);",
664200d97012SDavid du Colombier 	"	#ifndef BFS",
664300d97012SDavid du Colombier 	"		if (processes[h] != NULL || freebodies == NULL)",
664400d97012SDavid du Colombier 	"		{	Uerror(\"processes error\");",
664500d97012SDavid du Colombier 	"		}",
664600d97012SDavid du Colombier 	"		processes[h] = freebodies;",
664700d97012SDavid du Colombier 	"		freebodies = freebodies->nxt;",
664800d97012SDavid du Colombier 	"		processes[h]->nxt = (TRIX_v6 *) 0;",
664900d97012SDavid du Colombier 	"		processes[h]->modified = 1;	/* p_restor */",
665000d97012SDavid du Colombier 	"	#endif",
665100d97012SDavid du Colombier 	"	processes[h]->parent_pid = stack->parent;",
665200d97012SDavid du Colombier 	"	processes[h]->psize = stack->o_delta;",
665300d97012SDavid du Colombier 	"	memcpy((char *)pptr(h), stack->b_ptr, stack->o_delta);",
665400d97012SDavid du Colombier 	"	oi = stack->b_ptr;",
665500d97012SDavid du Colombier 	"#else",
6656*de2caf28SDavid du Colombier 	"	#if !defined(NOCOMP) && !defined(HC)",
6657219b2ee8SDavid du Colombier 	"	for (i = vsize + stack->o_skip; i > vsize; i--)",
66587dd7cddfSDavid du Colombier 	"		Mask[i-1] = 1; /* align */",
6659219b2ee8SDavid du Colombier 	"	#endif",
6660219b2ee8SDavid du Colombier 	"	vsize += stack->o_skip;",
6661219b2ee8SDavid du Colombier 	"	memcpy(z+vsize, stack->body, stack->o_delta);",
6662219b2ee8SDavid du Colombier 	"	vsize += stack->o_delta;",
6663*de2caf28SDavid du Colombier 	"	#if !defined(NOCOMP) && !defined(HC)",
6664219b2ee8SDavid du Colombier 	"		for (i = 1; i <= Air[((P0 *)pptr(h))->_t]; i++)",
66657dd7cddfSDavid du Colombier 	"			Mask[vsize - i] = 1;	/* pad */",
6666219b2ee8SDavid du Colombier 	"		Mask[proc_offset[h]] = 1;	/* _pid */",
6667219b2ee8SDavid du Colombier 	"	#endif",
6668219b2ee8SDavid du Colombier 	"	if (BASE > 0 && h > 0)",
6669219b2ee8SDavid du Colombier 	"		((P0 *)pptr(h))->_pid = h-BASE;",
6670219b2ee8SDavid du Colombier 	"	else",
6671219b2ee8SDavid du Colombier 	"		((P0 *)pptr(h))->_pid = h;",
6672*de2caf28SDavid du Colombier 	"	#ifdef BFS_PAR",
6673*de2caf28SDavid du Colombier 	"		bfs_fixmask(1);	/* p_restor */",
6674*de2caf28SDavid du Colombier 	"	#endif",
667500d97012SDavid du Colombier 	"#endif",
6676219b2ee8SDavid du Colombier 	"	now._nr_pr += 1;",
667700d97012SDavid du Colombier 	"#ifndef NOVSZ",
667800d97012SDavid du Colombier 	"	now._vsz = vsize;",
667900d97012SDavid du Colombier 	"#endif",
668000d97012SDavid du Colombier 	"	i = stack->o_delqs;",
668100d97012SDavid du Colombier 	"	if (!stack->lst)",
6682219b2ee8SDavid du Colombier 	"		Uerror(\"error: p_restor\");",
6683219b2ee8SDavid du Colombier 	"	stack = stack->lst;",
6684*de2caf28SDavid du Colombier 	"	_this = pptr(h);",
6685219b2ee8SDavid du Colombier 	"	while (i-- > 0)",
6686219b2ee8SDavid du Colombier 	"		q_restor();",
668700d97012SDavid du Colombier 	"#ifdef TRIX",
668800d97012SDavid du Colombier 	"	re_mark_all(1);	/* p_restor - all chans move up in _ids_ */",
668900d97012SDavid du Colombier 	"	now._ids_[h] = oi; /* restor the original contents */",
669000d97012SDavid du Colombier 	"#endif",
6691219b2ee8SDavid du Colombier 	"}\n",
6692219b2ee8SDavid du Colombier 	"void",
6693219b2ee8SDavid du Colombier 	"q_restor(void)",
669400d97012SDavid du Colombier 	"{	int h = now._nr_qs;",
669500d97012SDavid du Colombier 	"#ifdef TRIX",
669600d97012SDavid du Colombier 	"	#ifdef V_TRIX",
669700d97012SDavid du Colombier 	"		printf(\"%%4d: q_restor %%d\\n\", depth, h);",
669800d97012SDavid du Colombier 	"	#endif",
669900d97012SDavid du Colombier 	"	vsize += sizeof(char *);",
670000d97012SDavid du Colombier 	"	#ifndef BFS",
670100d97012SDavid du Colombier 	"		if (channels[h] != NULL || freebodies == NULL)",
670200d97012SDavid du Colombier 	"		{	Uerror(\"channels error\");",
670300d97012SDavid du Colombier 	"		}",
670400d97012SDavid du Colombier 	"		channels[h] = freebodies;",
670500d97012SDavid du Colombier 	"		freebodies = freebodies->nxt;",
670600d97012SDavid du Colombier 	"		channels[h]->nxt = (TRIX_v6 *) 0;",
670700d97012SDavid du Colombier 	"		channels[h]->modified = 1;	/* q_restor */",
670800d97012SDavid du Colombier 	"	#endif",
670900d97012SDavid du Colombier 	"	channels[h]->parent_pid = stack->parent;",
671000d97012SDavid du Colombier 	"	channels[h]->psize = stack->o_delta;",
671100d97012SDavid du Colombier 	"	memcpy((char *)qptr(h), stack->b_ptr, stack->o_delta);",
671200d97012SDavid du Colombier 	"	now._ids_[now._nr_pr + h] = stack->b_ptr;",
671300d97012SDavid du Colombier 	"#else",
671400d97012SDavid du Colombier 	"	char *z = (char *) &now;",
6715312a1df1SDavid du Colombier 	"	#ifndef NOCOMP",
6716312a1df1SDavid du Colombier 	"		int k, k_end;",
6717312a1df1SDavid du Colombier 	"	#endif",
6718*de2caf28SDavid du Colombier 	"	#ifdef BFS_PAR",
6719*de2caf28SDavid du Colombier 	"		bfs_prepmask(2);	/* q_restor */",
6720*de2caf28SDavid du Colombier 	"	#endif",
672100d97012SDavid du Colombier 	"	q_offset[h] = stack->o_offset;",
672200d97012SDavid du Colombier 	"	q_skip[h]   = (uchar) stack->o_skip;",
6723219b2ee8SDavid du Colombier 	"	vsize += stack->o_skip;",
6724219b2ee8SDavid du Colombier 	"	memcpy(z+vsize, stack->body, stack->o_delta);",
6725219b2ee8SDavid du Colombier 	"	vsize += stack->o_delta;",
672600d97012SDavid du Colombier 	"#endif",
672700d97012SDavid du Colombier 	"#ifndef XUSAFE",
672800d97012SDavid du Colombier 	"	q_name[h] = stack->o_name;",
672900d97012SDavid du Colombier 	"#endif",
67307dd7cddfSDavid du Colombier 	"#ifndef NOVSZ",
67317dd7cddfSDavid du Colombier 	"	now._vsz = vsize;",
67327dd7cddfSDavid du Colombier 	"#endif",
6733219b2ee8SDavid du Colombier 	"	now._nr_qs += 1;",
673400d97012SDavid du Colombier 	"#ifndef TRIX",
6735*de2caf28SDavid du Colombier 	"	#if !defined(NOCOMP) && !defined(HC)",
6736312a1df1SDavid du Colombier 	"		k_end = stack->o_offset;",
6737312a1df1SDavid du Colombier 	"		k = k_end - stack->o_skip;",
6738219b2ee8SDavid du Colombier 	"		#if SYNC",
6739312a1df1SDavid du Colombier 	"			#ifndef BFS",
6740312a1df1SDavid du Colombier 	"			if (q_zero(now._nr_qs)) k_end += stack->o_delta;",
6741219b2ee8SDavid du Colombier 	"			#endif",
6742312a1df1SDavid du Colombier 	"		#endif",
6743312a1df1SDavid du Colombier 	"		for ( ; k < k_end; k++)",
6744312a1df1SDavid du Colombier 	"			Mask[k] = 1;",
6745219b2ee8SDavid du Colombier 	"	#endif",
6746*de2caf28SDavid du Colombier 	"	#ifdef BFS_PAR",
6747*de2caf28SDavid du Colombier 	"		bfs_fixmask(2);	/* q_restor */",
6748*de2caf28SDavid du Colombier 	"	#endif",
674900d97012SDavid du Colombier 	"#endif",
675000d97012SDavid du Colombier 	"	if (!stack->lst)",
6751219b2ee8SDavid du Colombier 	"		Uerror(\"error: q_restor\");",
6752219b2ee8SDavid du Colombier 	"	stack = stack->lst;",
67537dd7cddfSDavid du Colombier 	"}",
67547dd7cddfSDavid du Colombier 
67557dd7cddfSDavid du Colombier 	"typedef struct IntChunks {",
67567dd7cddfSDavid du Colombier 	"	int	*ptr;",
67577dd7cddfSDavid du Colombier 	"	struct	IntChunks *nxt;",
67587dd7cddfSDavid du Colombier 	"} IntChunks;",
6759312a1df1SDavid du Colombier 	"IntChunks *filled_chunks[512];",
6760312a1df1SDavid du Colombier 	"IntChunks *empty_chunks[512];",
67617dd7cddfSDavid du Colombier 
67627dd7cddfSDavid du Colombier 	"int *",
67637dd7cddfSDavid du Colombier 	"grab_ints(int nr)",
67647dd7cddfSDavid du Colombier 	"{	IntChunks *z;",
6765312a1df1SDavid du Colombier 	"	if (nr >= 512) Uerror(\"cannot happen grab_int\");",
67667dd7cddfSDavid du Colombier 	"	if (filled_chunks[nr])",
67677dd7cddfSDavid du Colombier 	"	{	z = filled_chunks[nr];",
67687dd7cddfSDavid du Colombier 	"		filled_chunks[nr] = filled_chunks[nr]->nxt;",
67697dd7cddfSDavid du Colombier 	"	} else ",
67707dd7cddfSDavid du Colombier 	"	{	z = (IntChunks *) emalloc(sizeof(IntChunks));",
67717dd7cddfSDavid du Colombier 	"		z->ptr = (int *) emalloc(nr * sizeof(int));",
67727dd7cddfSDavid du Colombier 	"	}",
67737dd7cddfSDavid du Colombier 	"	z->nxt = empty_chunks[nr];",
67747dd7cddfSDavid du Colombier 	"	empty_chunks[nr] = z;",
67757dd7cddfSDavid du Colombier 	"	return z->ptr;",
67767dd7cddfSDavid du Colombier 	"}",
67777dd7cddfSDavid du Colombier 	"void",
67787dd7cddfSDavid du Colombier 	"ungrab_ints(int *p, int nr)",
67797dd7cddfSDavid du Colombier 	"{	IntChunks *z;",
67807dd7cddfSDavid du Colombier 	"	if (!empty_chunks[nr]) Uerror(\"cannot happen ungrab_int\");",
67817dd7cddfSDavid du Colombier 	"	z = empty_chunks[nr];",
67827dd7cddfSDavid du Colombier 	"	empty_chunks[nr] = empty_chunks[nr]->nxt;",
67837dd7cddfSDavid du Colombier 	"	z->ptr = p;",
67847dd7cddfSDavid du Colombier 	"	z->nxt = filled_chunks[nr];",
67857dd7cddfSDavid du Colombier 	"	filled_chunks[nr] = z;",
67867dd7cddfSDavid du Colombier 	"}",
6787219b2ee8SDavid du Colombier 	"int",
6788219b2ee8SDavid du Colombier 	"delproc(int sav, int h)",
6789312a1df1SDavid du Colombier 	"{	int d, i=0;",
6790312a1df1SDavid du Colombier 	"#ifndef NOCOMP",
6791312a1df1SDavid du Colombier 	"	int o_vsize = vsize;",
6792312a1df1SDavid du Colombier 	"#endif",
679300d97012SDavid du Colombier 	"	if (h+1 != (int) now._nr_pr)",
679400d97012SDavid du Colombier 	"	{	return 0;",
679500d97012SDavid du Colombier 	"	}",
679600d97012SDavid du Colombier 	"#ifdef TRIX",
679700d97012SDavid du Colombier 	"	#ifdef V_TRIX",
679800d97012SDavid du Colombier 	"		printf(\"%%4d: delproc %%d -- parent %%d\\n\", depth, h, processes[h]->parent_pid);",
679900d97012SDavid du Colombier 	"		if (now._nr_qs > 0)",
680000d97012SDavid du Colombier 	"		printf(\"	top channel: %%d -- parent %%d\\n\", now._nr_qs-1, channels[now._nr_qs-1]->parent_pid);",
680100d97012SDavid du Colombier 	"	#endif",
680200d97012SDavid du Colombier 	"	while (now._nr_qs > 0",
680300d97012SDavid du Colombier 	"	&&     channels[now._nr_qs-1]->parent_pid == processes[h]->parent_pid)",
680400d97012SDavid du Colombier 	"	{	delq(sav);",
680500d97012SDavid du Colombier 	"		i++;",
680600d97012SDavid du Colombier 	"	}",
680700d97012SDavid du Colombier 	"	d = processes[h]->psize;",
680800d97012SDavid du Colombier 	"	if (sav)",
680900d97012SDavid du Colombier 	"	{	if (!stack->nxt)",
681000d97012SDavid du Colombier 	"		{	stack->nxt = (_Stack *) emalloc(sizeof(_Stack));",
681100d97012SDavid du Colombier 	"			stack->nxt->lst = stack;",
681200d97012SDavid du Colombier 	"			smax++;",
681300d97012SDavid du Colombier 	"		}",
681400d97012SDavid du Colombier 	"		stack = stack->nxt;",
681500d97012SDavid du Colombier 	"	#ifndef XUSAFE",
681600d97012SDavid du Colombier 	"		stack->o_name   = p_name[h];",
681700d97012SDavid du Colombier 	"	#endif",
681800d97012SDavid du Colombier 	"		stack->parent   = processes[h]->parent_pid;",
681900d97012SDavid du Colombier 	"		stack->o_delta  = d;",
682000d97012SDavid du Colombier 	"		stack->o_delqs  = i;",
682100d97012SDavid du Colombier 	"		stack->b_ptr = now._ids_[h];", /* new 6.1 */
682200d97012SDavid du Colombier 	"	}",
682300d97012SDavid du Colombier 	"	memset((char *)pptr(h), 0, d);",
682400d97012SDavid du Colombier 	"	#ifndef BFS",
682500d97012SDavid du Colombier 	"		processes[h]->nxt = freebodies;",
682600d97012SDavid du Colombier 	"		freebodies = processes[h];",
682700d97012SDavid du Colombier 	"		processes[h] = (TRIX_v6 *) 0;",
682800d97012SDavid du Colombier 	"	#endif",
682900d97012SDavid du Colombier 	"	vsize -= sizeof(char *);",
683000d97012SDavid du Colombier 	"	now._nr_pr -= 1;",
683100d97012SDavid du Colombier 	"	re_mark_all(-1); /* delproc - all chans move down in _ids_ */",
683200d97012SDavid du Colombier 	"#else",
6833219b2ee8SDavid du Colombier 	"	while (now._nr_qs",
6834219b2ee8SDavid du Colombier 	"	&&     q_offset[now._nr_qs-1] > proc_offset[h])",
6835219b2ee8SDavid du Colombier 	"	{	delq(sav);",
6836219b2ee8SDavid du Colombier 	"		i++;",
6837219b2ee8SDavid du Colombier 	"	}",
6838219b2ee8SDavid du Colombier 	"	d = vsize - proc_offset[h];",
6839219b2ee8SDavid du Colombier 	"	if (sav)",
6840219b2ee8SDavid du Colombier 	"	{	if (!stack->nxt)",
684100d97012SDavid du Colombier 	"		{	stack->nxt = (_Stack *) emalloc(sizeof(_Stack));",
684200d97012SDavid du Colombier 	"			stack->nxt->body = emalloc(Maxbody * sizeof(char));",
6843219b2ee8SDavid du Colombier 	"			stack->nxt->lst = stack;",
6844219b2ee8SDavid du Colombier 	"			smax++;",
6845219b2ee8SDavid du Colombier 	"		}",
6846219b2ee8SDavid du Colombier 	"		stack = stack->nxt;",
6847219b2ee8SDavid du Colombier 	"		stack->o_offset = proc_offset[h];",
6848f3793cddSDavid du Colombier 	"	#if VECTORSZ>32000",
6849f3793cddSDavid du Colombier 	"		stack->o_skip   = (int) proc_skip[h];",
6850f3793cddSDavid du Colombier 	"	#else",
6851f3793cddSDavid du Colombier 	"		stack->o_skip   = (short) proc_skip[h];",
6852f3793cddSDavid du Colombier 	"	#endif",
6853219b2ee8SDavid du Colombier 	"	#ifndef XUSAFE",
6854219b2ee8SDavid du Colombier 	"		stack->o_name   = p_name[h];",
6855219b2ee8SDavid du Colombier 	"	#endif",
6856219b2ee8SDavid du Colombier 	"		stack->o_delta  = d;",
6857219b2ee8SDavid du Colombier 	"		stack->o_delqs  = i;",
6858219b2ee8SDavid du Colombier 	"		memcpy(stack->body, (char *)pptr(h), d);",
6859219b2ee8SDavid du Colombier 	"	}",
6860219b2ee8SDavid du Colombier 	"	vsize = proc_offset[h];",
686100d97012SDavid du Colombier 	"	now._nr_pr -= 1;",
6862219b2ee8SDavid du Colombier 	"	memset((char *)pptr(h), 0, d);",
6863f3793cddSDavid du Colombier 	"	vsize -= (int) proc_skip[h];",
6864*de2caf28SDavid du Colombier 	"	#if !defined(NOCOMP) && !defined(HC)",
6865*de2caf28SDavid du Colombier 	"		#ifdef BFS_PAR",
6866*de2caf28SDavid du Colombier 	"			bfs_prepmask(3); /* delproc - no chance in proc_offset or proc_skip */",
6867*de2caf28SDavid du Colombier 	"		#endif",
6868219b2ee8SDavid du Colombier 	"		for (i = vsize; i < o_vsize; i++)",
68697dd7cddfSDavid du Colombier 	"			Mask[i] = 0; /* reset */",
6870*de2caf28SDavid du Colombier 	"		#ifdef BFS_PAR",
6871*de2caf28SDavid du Colombier 	"			bfs_fixmask(3);	/* delproc */",
6872*de2caf28SDavid du Colombier 	"		#endif",
6873219b2ee8SDavid du Colombier 	"	#endif",
687400d97012SDavid du Colombier 	"#endif",
687500d97012SDavid du Colombier 	"#ifndef NOVSZ",
687600d97012SDavid du Colombier 	"	now._vsz = vsize;",
687700d97012SDavid du Colombier 	"#endif",
6878219b2ee8SDavid du Colombier 	"	return 1;",
6879219b2ee8SDavid du Colombier 	"}\n",
6880219b2ee8SDavid du Colombier 	"void",
6881219b2ee8SDavid du Colombier 	"delq(int sav)",
6882219b2ee8SDavid du Colombier 	"{	int h = now._nr_qs - 1;",
688300d97012SDavid du Colombier 	"#ifdef TRIX",
688400d97012SDavid du Colombier 	"	int d = channels[now._nr_qs - 1]->psize;",
688500d97012SDavid du Colombier 	"#else",
6886219b2ee8SDavid du Colombier 	"	int d = vsize - q_offset[now._nr_qs - 1];",
688700d97012SDavid du Colombier 	"#endif",
6888219b2ee8SDavid du Colombier 	"#ifndef NOCOMP",
6889219b2ee8SDavid du Colombier 	"	int k, o_vsize = vsize;",
6890219b2ee8SDavid du Colombier 	"#endif",
6891219b2ee8SDavid du Colombier 	"	if (sav)",
6892219b2ee8SDavid du Colombier 	"	{	if (!stack->nxt)",
689300d97012SDavid du Colombier 	"		{	stack->nxt = (_Stack *) emalloc(sizeof(_Stack));",
689400d97012SDavid du Colombier 	"#ifndef TRIX",
689500d97012SDavid du Colombier 	"			stack->nxt->body = emalloc(Maxbody * sizeof(char));",
689600d97012SDavid du Colombier 	"#endif",
6897219b2ee8SDavid du Colombier 	"			stack->nxt->lst = stack;",
6898219b2ee8SDavid du Colombier 	"			smax++;",
6899219b2ee8SDavid du Colombier 	"		}",
6900219b2ee8SDavid du Colombier 	"		stack = stack->nxt;",
690100d97012SDavid du Colombier 	"#ifdef TRIX",
690200d97012SDavid du Colombier 	"		stack->parent = channels[h]->parent_pid;",
690300d97012SDavid du Colombier 	"		stack->b_ptr = now._ids_[h];", /* new 6.1 */
690400d97012SDavid du Colombier 	"#else",
6905219b2ee8SDavid du Colombier 	"		stack->o_offset = q_offset[h];",
6906f3793cddSDavid du Colombier 	"	#if VECTORSZ>32000",
6907f3793cddSDavid du Colombier 	"		stack->o_skip   = (int) q_skip[h];",
6908f3793cddSDavid du Colombier 	"	#else",
6909f3793cddSDavid du Colombier 	"		stack->o_skip   = (short) q_skip[h];",
6910f3793cddSDavid du Colombier 	"	#endif",
691100d97012SDavid du Colombier 	"#endif",
6912219b2ee8SDavid du Colombier 	"	#ifndef XUSAFE",
6913219b2ee8SDavid du Colombier 	"		stack->o_name   = q_name[h];",
6914219b2ee8SDavid du Colombier 	"	#endif",
6915219b2ee8SDavid du Colombier 	"		stack->o_delta  = d;",
691600d97012SDavid du Colombier 	"#ifndef TRIX",
6917219b2ee8SDavid du Colombier 	"		memcpy(stack->body, (char *)qptr(h), d);",
69187dd7cddfSDavid du Colombier 	"#endif",
691900d97012SDavid du Colombier 	"	}",
692000d97012SDavid du Colombier 	"#ifdef TRIX",
692100d97012SDavid du Colombier 	"	vsize -= sizeof(char *);",
692200d97012SDavid du Colombier 	"	#ifdef V_TRIX",
692300d97012SDavid du Colombier 	"		printf(\"%%4d: delq %%d parent %%d\\n\", depth, h, channels[h]->parent_pid);",
692400d97012SDavid du Colombier 	"	#endif",
692500d97012SDavid du Colombier 	"#else",
692600d97012SDavid du Colombier 	"	vsize = q_offset[h];",
692700d97012SDavid du Colombier 	"	vsize -= (int) q_skip[h];",
6928*de2caf28SDavid du Colombier 	"	#if !defined(NOCOMP) && !defined(HC)",
6929*de2caf28SDavid du Colombier 	"		#ifdef BFS_PAR",
6930*de2caf28SDavid du Colombier 	"			bfs_prepmask(3); /* delq - no change in q_offset or q_skip */",
6931*de2caf28SDavid du Colombier 	"		#endif",
6932219b2ee8SDavid du Colombier 	"		for (k = vsize; k < o_vsize; k++)",
69337dd7cddfSDavid du Colombier 	"			Mask[k] = 0; /* reset */",
6934*de2caf28SDavid du Colombier 	"		#ifdef BFS_PAR",
6935*de2caf28SDavid du Colombier 	"			bfs_fixmask(3);	/* delq */",
6936*de2caf28SDavid du Colombier 	"		#endif",
6937219b2ee8SDavid du Colombier 	"	#endif",
693800d97012SDavid du Colombier 	"#endif",
693900d97012SDavid du Colombier 	"	now._nr_qs -= 1;",
694000d97012SDavid du Colombier 	"	memset((char *)qptr(h), 0, d);",
694100d97012SDavid du Colombier 	"#ifdef TRIX",
694200d97012SDavid du Colombier 	"	#ifndef BFS",
694300d97012SDavid du Colombier 	"		channels[h]->nxt = freebodies;",
694400d97012SDavid du Colombier 	"		freebodies = channels[h];",
694500d97012SDavid du Colombier 	"		channels[h] = (TRIX_v6 *) 0;",
694600d97012SDavid du Colombier 	"	#endif",
694700d97012SDavid du Colombier 	"#endif",
694800d97012SDavid du Colombier 	"#ifndef NOVSZ",
694900d97012SDavid du Colombier 	"	now._vsz = vsize;",
695000d97012SDavid du Colombier 	"#endif",
6951219b2ee8SDavid du Colombier 	"}\n",
6952219b2ee8SDavid du Colombier 	"int",
69537dd7cddfSDavid du Colombier 	"qs_empty(void)",
69547dd7cddfSDavid du Colombier 	"{	int i;",
69557dd7cddfSDavid du Colombier 	"	for (i = 0; i < (int) now._nr_qs; i++)",
69567dd7cddfSDavid du Colombier 	"	{	if (q_sz(i) > 0)",
6957219b2ee8SDavid du Colombier 	"			return 0;",
6958219b2ee8SDavid du Colombier 	"	}",
6959219b2ee8SDavid du Colombier 	"	return 1;",
6960219b2ee8SDavid du Colombier 	"}\n",
69617dd7cddfSDavid du Colombier 	"int",
69627dd7cddfSDavid du Colombier 	"endstate(void)",
69637dd7cddfSDavid du Colombier 	"{	int i; P0 *ptr;",
69647dd7cddfSDavid du Colombier 	"	for (i = BASE; i < (int) now._nr_pr; i++)",
69657dd7cddfSDavid du Colombier 	"	{	ptr = (P0 *) pptr(i);",
69667dd7cddfSDavid du Colombier 	"		if (!stopstate[ptr->_t][ptr->_p])",
69677dd7cddfSDavid du Colombier 	"			return 0;",
69687dd7cddfSDavid du Colombier 	"	}",
69697dd7cddfSDavid du Colombier 	"	if (strict) return qs_empty();",
6970*de2caf28SDavid du Colombier 	"#if defined(EVENT_TRACE)",
69717dd7cddfSDavid du Colombier 	"	if (!stopstate[EVENT_TRACE][now._event] && !a_cycles)",
69727dd7cddfSDavid du Colombier 	"	{	printf(\"pan: event_trace not completed\\n\");",
69737dd7cddfSDavid du Colombier 	"		return 0;",
69747dd7cddfSDavid du Colombier 	"	}",
69757dd7cddfSDavid du Colombier 	"#endif",
69767dd7cddfSDavid du Colombier 	"	return 1;",
69777dd7cddfSDavid du Colombier 	"}\n",
6978*de2caf28SDavid du Colombier 	"#if !defined(SAFETY) && !defined(BFS)",
6979219b2ee8SDavid du Colombier 	"void",
6980219b2ee8SDavid du Colombier 	"checkcycles(void)",
69817dd7cddfSDavid du Colombier 	"{	uchar o_a_t = now._a_t;",
69827dd7cddfSDavid du Colombier 	"	#ifndef NOFAIR",
69837dd7cddfSDavid du Colombier 	"		uchar o_cnt = now._cnt[1];",
69847dd7cddfSDavid du Colombier 	"	#endif",
69857dd7cddfSDavid du Colombier 	"	#ifdef FULLSTACK",
69867dd7cddfSDavid du Colombier 	"		#ifndef MA",
6987*de2caf28SDavid du Colombier 	"			H_el *sv = trpt->ostate; /* save */",
69887dd7cddfSDavid du Colombier 	"		#else",
69897dd7cddfSDavid du Colombier 	"			uchar prov = trpt->proviso; /* save */",
69907dd7cddfSDavid du Colombier 	"		#endif",
69917dd7cddfSDavid du Colombier 	"	#endif",
6992219b2ee8SDavid du Colombier 	"	#ifdef DEBUG",
6993219b2ee8SDavid du Colombier 	"	 {	int i; uchar *v = (uchar *) &now;",
6994219b2ee8SDavid du Colombier 	"		printf(\"	set Seed state \");",
69957dd7cddfSDavid du Colombier 	"		#ifndef NOFAIR",
6996*de2caf28SDavid du Colombier 	"	  		if (fairness)",
6997*de2caf28SDavid du Colombier 	"				printf(\"(cnt = %%d:%%d, nrpr=%%d) \",",
69987dd7cddfSDavid du Colombier 	"				now._cnt[0], now._cnt[1], now._nr_pr);",
69997dd7cddfSDavid du Colombier 	"		#endif",
7000219b2ee8SDavid du Colombier 	"		/* for (i = 0; i < n; i++) printf(\"%%d,\", v[i]); */",
7001219b2ee8SDavid du Colombier 	"		printf(\"\\n\");",
7002219b2ee8SDavid du Colombier 	"	 }",
700300d97012SDavid du Colombier 	"	 printf(\"%%ld: cycle check starts\\n\", depth);",
7004219b2ee8SDavid du Colombier 	"	#endif",
70057dd7cddfSDavid du Colombier 	"	now._a_t |= (1|16|32);",
7006*de2caf28SDavid du Colombier 	"	/* 1 = 2nd DFS; (16|32) to improve hashing */",
70077dd7cddfSDavid du Colombier 	"	#ifndef NOFAIR",
70087dd7cddfSDavid du Colombier 	"		now._cnt[1] = now._cnt[0];",
70097dd7cddfSDavid du Colombier 	"	#endif",
7010219b2ee8SDavid du Colombier 	"	memcpy((char *)&A_Root, (char *)&now, vsize);",
7011219b2ee8SDavid du Colombier 	"	A_depth = depthfound = depth;",
701200d97012SDavid du Colombier 
701300d97012SDavid du Colombier 	"	#if NCORE>1",
701400d97012SDavid du Colombier 	"		mem_put_acc();", /* handoff accept states */
701500d97012SDavid du Colombier 	"	#else",
7016219b2ee8SDavid du Colombier 	"		new_state();	/* start 2nd DFS */",
701700d97012SDavid du Colombier 	"	#endif",
701800d97012SDavid du Colombier 
70197dd7cddfSDavid du Colombier 	"	now._a_t = o_a_t;",
70207dd7cddfSDavid du Colombier 	"	#ifndef NOFAIR",
70217dd7cddfSDavid du Colombier 	"		now._cnt[1] = o_cnt;",
70227dd7cddfSDavid du Colombier 	"	#endif",
7023219b2ee8SDavid du Colombier 	"	A_depth = 0; depthfound = -1;",
7024219b2ee8SDavid du Colombier 		"#ifdef DEBUG",
702500d97012SDavid du Colombier 	"	printf(\"%%ld: cycle check returns\\n\", depth);",
7026219b2ee8SDavid du Colombier 		"#endif",
70277dd7cddfSDavid du Colombier 		"#ifdef FULLSTACK",
70287dd7cddfSDavid du Colombier 		"#ifndef MA",
70297dd7cddfSDavid du Colombier 	"	trpt->ostate = sv;	/* restore */",
70307dd7cddfSDavid du Colombier 		"#else",
70317dd7cddfSDavid du Colombier 	"	trpt->proviso = prov;",
70327dd7cddfSDavid du Colombier 		"#endif",
70337dd7cddfSDavid du Colombier 		"#endif",
70347dd7cddfSDavid du Colombier 	"}",
7035*de2caf28SDavid du Colombier 	"#endif",
7036*de2caf28SDavid du Colombier 	"",
7037219b2ee8SDavid du Colombier 	"#if defined(FULLSTACK) && defined(BITSTATE)",
7038*de2caf28SDavid du Colombier 	"H_el *Free_list = (H_el *) 0;",
7039219b2ee8SDavid du Colombier 	"void",
7040312a1df1SDavid du Colombier 	"onstack_init(void)	/* to store stack states in a bitstate search */",
7041*de2caf28SDavid du Colombier 	"{	S_Tab = (H_el **) emalloc(maxdepth*sizeof(H_el *));",
7042219b2ee8SDavid du Colombier 	"}",
7043*de2caf28SDavid du Colombier 	"#endif",
7044*de2caf28SDavid du Colombier 
7045*de2caf28SDavid du Colombier 	"#if !defined(BFS_PAR)",
7046*de2caf28SDavid du Colombier 	" #if defined(FULLSTACK) && defined(BITSTATE)",
7047*de2caf28SDavid du Colombier 		"H_el *",
7048219b2ee8SDavid du Colombier 		"grab_state(int n)",
7049*de2caf28SDavid du Colombier 		"{	H_el *v, *last = 0;",
70507dd7cddfSDavid du Colombier 		"	if (H_tab == S_Tab)",
7051312a1df1SDavid du Colombier 		"	{	for (v = Free_list; v && ((int) v->tagged >= n); v=v->nxt)",
7052312a1df1SDavid du Colombier 		"		{	if ((int) v->tagged == n)",
7053219b2ee8SDavid du Colombier 		"			{	if (last)",
7054219b2ee8SDavid du Colombier 		"					last->nxt = v->nxt;",
7055219b2ee8SDavid du Colombier 		"				else",
70567dd7cddfSDavid du Colombier 		"gotcha:				Free_list = v->nxt;",
7057219b2ee8SDavid du Colombier 		"				v->tagged = 0;",
7058219b2ee8SDavid du Colombier 		"				v->nxt = 0;",
70597dd7cddfSDavid du Colombier 		"	#ifdef COLLAPSE",
70607dd7cddfSDavid du Colombier 		"				v->ln = 0;",
70617dd7cddfSDavid du Colombier 		"	#endif",
7062219b2ee8SDavid du Colombier 		"				return v;",
7063219b2ee8SDavid du Colombier 		"			}",
70647dd7cddfSDavid du Colombier 		"			Fh++; last=v;",
70657dd7cddfSDavid du Colombier 		"		}",
70667dd7cddfSDavid du Colombier 		"		/* new: second try */",
70677dd7cddfSDavid du Colombier 		"		v = Free_list;", /* try to avoid emalloc */
7068312a1df1SDavid du Colombier 		"		if (v && ((int) v->tagged >= n))",
70697dd7cddfSDavid du Colombier 		"			goto gotcha;",
70707dd7cddfSDavid du Colombier 		"		ngrabs++;",
70717dd7cddfSDavid du Colombier 		"	}",
7072*de2caf28SDavid du Colombier 		"	return (H_el *) emalloc(sizeof(H_el)+n-sizeof(unsigned));",
707300d97012SDavid du Colombier 		"}",
7074*de2caf28SDavid du Colombier 	" #else",		/* !FULLSTACK || !BITSTATE */
7075*de2caf28SDavid du Colombier 		"#if NCORE>1",
7076*de2caf28SDavid du Colombier 			"H_el *",
707700d97012SDavid du Colombier 			"grab_state(int n)",
7078*de2caf28SDavid du Colombier 			"{	H_el *grab_shared(int);",
7079*de2caf28SDavid du Colombier 			"	return grab_shared(sizeof(H_el)+n-sizeof(unsigned));",
7080*de2caf28SDavid du Colombier 			"}",
7081*de2caf28SDavid du Colombier 		"#else", /* ! NCORE>1 */
7082*de2caf28SDavid du Colombier 			"#ifndef AUTO_RESIZE",
7083*de2caf28SDavid du Colombier 			"	#define grab_state(n) (H_el *) \\",
7084*de2caf28SDavid du Colombier 			"		emalloc(sizeof(H_el)+n-sizeof(ulong));",
7085*de2caf28SDavid du Colombier 			"#else",	/* AUTO_RESIZE */
7086*de2caf28SDavid du Colombier 			"H_el *",
7087*de2caf28SDavid du Colombier 			"grab_state(int n)",
7088*de2caf28SDavid du Colombier 			"{	H_el *p;",
7089*de2caf28SDavid du Colombier 			"	int cnt = sizeof(H_el)+n-sizeof(ulong);",
7090*de2caf28SDavid du Colombier 			"#ifndef MA",
709100d97012SDavid du Colombier 			"	if (reclaim_size >= cnt+WS)",
709200d97012SDavid du Colombier 			"	{	if ((cnt & (WS-1)) != 0) /* alignment */",
709300d97012SDavid du Colombier 			"		{	cnt += WS - (cnt & (WS-1));",
709400d97012SDavid du Colombier 			"		}",
7095*de2caf28SDavid du Colombier 			"		p = (H_el *) reclaim_mem;",
709600d97012SDavid du Colombier 			"		reclaim_mem  += cnt;",
709700d97012SDavid du Colombier 			"		reclaim_size -= cnt;",
709800d97012SDavid du Colombier 			"		memset(p, 0, cnt);",
709900d97012SDavid du Colombier 			"	} else",
7100*de2caf28SDavid du Colombier 			"#endif",
7101*de2caf28SDavid du Colombier 			"	{	p = (H_el *) emalloc(cnt);",
710200d97012SDavid du Colombier 			"	}",
710300d97012SDavid du Colombier 			"	return p;",
710400d97012SDavid du Colombier 			"}",
7105*de2caf28SDavid du Colombier 			"#endif",	/* AUTO_RESIZE */
7106*de2caf28SDavid du Colombier 		"#endif", 		/* NCORE>1 */
7107*de2caf28SDavid du Colombier 	" #endif",			/* FULLSTACK && !BITSTATE */
7108*de2caf28SDavid du Colombier 	"#else", /* BFS_PAR */
7109*de2caf28SDavid du Colombier 	"	extern volatile uchar *sh_pre_malloc(ulong);",
7110*de2caf28SDavid du Colombier 	"	extern volatile uchar *sh_malloc(ulong);",
7111*de2caf28SDavid du Colombier 	"	H_el *",
7112*de2caf28SDavid du Colombier 	"	grab_state(int n)	/* bfs_par */",
7113*de2caf28SDavid du Colombier 	"	{	volatile uchar *rval = NULL;",
7114*de2caf28SDavid du Colombier 	"		int m = sizeof(H_el) + n - sizeof(unsigned);",
7115*de2caf28SDavid du Colombier 	"",
7116*de2caf28SDavid du Colombier 	"		if (n == 0) m = m/n;",
7117*de2caf28SDavid du Colombier 	"	#ifdef BFS_SEP_HASH",
7118*de2caf28SDavid du Colombier 	"		rval = emalloc((ulong) m);",
7119*de2caf28SDavid du Colombier 	"	#else",
7120*de2caf28SDavid du Colombier 	"		rval = sh_malloc((ulong) m);",
712100d97012SDavid du Colombier 	"	#endif",
7122*de2caf28SDavid du Colombier 	"		memset((void *) rval, 0, (size_t) m);",
7123*de2caf28SDavid du Colombier 	"",
7124*de2caf28SDavid du Colombier 	"		return (H_el *) rval;",
7125*de2caf28SDavid du Colombier 	"	}",
7126*de2caf28SDavid du Colombier 	"#endif", /* BFS_PAR */
712700d97012SDavid du Colombier 
71287dd7cddfSDavid du Colombier "#ifdef COLLAPSE",
7129*de2caf28SDavid du Colombier 	"ulong",
71307dd7cddfSDavid du Colombier 	"ordinal(char *v, long n, short tp)",
7131*de2caf28SDavid du Colombier 	"{	H_el *tmp, *ntmp; long m;",
7132*de2caf28SDavid du Colombier 	"	H_el *olst = (H_el *) 0;",
71337dd7cddfSDavid du Colombier 	"	s_hash((uchar *)v, n);",
713400d97012SDavid du Colombier 
7135*de2caf28SDavid du Colombier 	"#if defined(BFS_PAR) && !defined(BFS_SEP_HASH)",
7136*de2caf28SDavid du Colombier 	"	e_critical(BFS_ID);	/* bfs_par / collapse */",
7137*de2caf28SDavid du Colombier 	"#endif",
713800d97012SDavid du Colombier 	"#if NCORE>1 && !defined(SEP_STATE)",
713900d97012SDavid du Colombier 	"	enter_critical(CS_ID);	/* uses spinlock - 1..128 */",
714000d97012SDavid du Colombier 	"#endif",
714100d97012SDavid du Colombier 	"	tmp = H_tab[j1_spin];",
71427dd7cddfSDavid du Colombier 	"	if (!tmp)",
71437dd7cddfSDavid du Colombier 	"	{	tmp = grab_state(n);",
714400d97012SDavid du Colombier 	"		H_tab[j1_spin] = tmp;",
71457dd7cddfSDavid du Colombier 	"	} else",
71467dd7cddfSDavid du Colombier 	"	for ( ;; olst = tmp, tmp = tmp->nxt)",
714700d97012SDavid du Colombier 	"	{	if (n == tmp->ln)",
71487dd7cddfSDavid du Colombier 	"		{	m = memcmp(((char *)&(tmp->state)), v, n);",
71497dd7cddfSDavid du Colombier 	"			if (m == 0)",
71507dd7cddfSDavid du Colombier 	"				goto done;",
71517dd7cddfSDavid du Colombier 	"			if (m < 0)",
71527dd7cddfSDavid du Colombier 	"			{",
71537dd7cddfSDavid du Colombier 	"Insert:			ntmp = grab_state(n);",
71547dd7cddfSDavid du Colombier 	"				ntmp->nxt = tmp;",
71557dd7cddfSDavid du Colombier 	"				if (!olst)",
715600d97012SDavid du Colombier 	"					H_tab[j1_spin] = ntmp;",
71577dd7cddfSDavid du Colombier 	"				else",
71587dd7cddfSDavid du Colombier 	"					olst->nxt = ntmp;",
71597dd7cddfSDavid du Colombier 	"				tmp = ntmp;",
71607dd7cddfSDavid du Colombier 	"				break;",
71617dd7cddfSDavid du Colombier 	"			} else if (!tmp->nxt)",
71627dd7cddfSDavid du Colombier 	"			{",
71637dd7cddfSDavid du Colombier 	"Append:			tmp->nxt = grab_state(n);",
71647dd7cddfSDavid du Colombier 	"				tmp = tmp->nxt;",
71657dd7cddfSDavid du Colombier 	"				break;",
71667dd7cddfSDavid du Colombier 	"			}",
71677dd7cddfSDavid du Colombier 	"			continue;",
71687dd7cddfSDavid du Colombier 	"		}",
71697dd7cddfSDavid du Colombier 	"		if (n < tmp->ln)",
71707dd7cddfSDavid du Colombier 	"			goto Insert;",
71717dd7cddfSDavid du Colombier 	"		else if (!tmp->nxt)",
71727dd7cddfSDavid du Colombier 	"			goto Append;",
71737dd7cddfSDavid du Colombier 	"	}",
717400d97012SDavid du Colombier 	"#if NCORE>1 && !defined(SEP_STATE)",
717500d97012SDavid du Colombier 	"	enter_critical(GLOBAL_LOCK);",
717600d97012SDavid du Colombier 	"#endif",
7177*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
7178*de2caf28SDavid du Colombier 	"	e_critical(BFS_ORD);	/* bfs_par */",
7179*de2caf28SDavid du Colombier 	"#endif",
71807dd7cddfSDavid du Colombier 	"	m = ++ncomps[tp];",
7181*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
7182*de2caf28SDavid du Colombier 	"	x_critical(BFS_ORD);",
7183*de2caf28SDavid du Colombier 	"#endif",
718400d97012SDavid du Colombier 	"#if NCORE>1 && !defined(SEP_STATE)",
718500d97012SDavid du Colombier 	"	leave_critical(GLOBAL_LOCK);",
718600d97012SDavid du Colombier 	"#endif",
71877dd7cddfSDavid du Colombier 	"#ifdef FULLSTACK",
71887dd7cddfSDavid du Colombier 	"	tmp->tagged = m;",
71897dd7cddfSDavid du Colombier 	"#else",
71907dd7cddfSDavid du Colombier 	"	tmp->st_id  = m;",
71917dd7cddfSDavid du Colombier 	"#endif",
719200d97012SDavid du Colombier 	"#if defined(AUTO_RESIZE) && !defined(BITSTATE)",
719300d97012SDavid du Colombier 	"	tmp->m_K1 = K1;",
719400d97012SDavid du Colombier 	"#endif",
71957dd7cddfSDavid du Colombier 	"	memcpy(((char *)&(tmp->state)), v, n);",
71967dd7cddfSDavid du Colombier 	"	tmp->ln = n;",
71977dd7cddfSDavid du Colombier 	"done:",
719800d97012SDavid du Colombier 
719900d97012SDavid du Colombier 	"#if NCORE>1 && !defined(SEP_STATE)",
7200*de2caf28SDavid du Colombier 	"	leave_critical(CS_ID);",
7201*de2caf28SDavid du Colombier 	"#endif",
7202*de2caf28SDavid du Colombier 	"#if defined(BFS_PAR) && !defined(BFS_SEP_HASH)",
7203*de2caf28SDavid du Colombier 	"	x_critical(BFS_ID);",
720400d97012SDavid du Colombier 	"#endif",
720500d97012SDavid du Colombier 
72067dd7cddfSDavid du Colombier 	"#ifdef FULLSTACK",
72077dd7cddfSDavid du Colombier 	"	return tmp->tagged;",
72087dd7cddfSDavid du Colombier 	"#else",
72097dd7cddfSDavid du Colombier 	"	return tmp->st_id;",
72107dd7cddfSDavid du Colombier 	"#endif",
72117dd7cddfSDavid du Colombier 	"}",
72127dd7cddfSDavid du Colombier 	"",
72137dd7cddfSDavid du Colombier 	"int",
72147dd7cddfSDavid du Colombier 	"compress(char *vin, int nin)	/* collapse compression */",
72157dd7cddfSDavid du Colombier 	"{	char	*w, *v = (char *) &comp_now;",
72167dd7cddfSDavid du Colombier 	"	int	i, j;",
7217*de2caf28SDavid du Colombier 	"	ulong	n;",
72187dd7cddfSDavid du Colombier 	"	static char	*x;",
72197dd7cddfSDavid du Colombier 	"	static uchar	nbytes[513]; /* 1 + 256 + 256 */",
72207dd7cddfSDavid du Colombier 	"	static unsigned	short nbytelen;",
72217dd7cddfSDavid du Colombier 	"	long col_q(int, char *);",
72227dd7cddfSDavid du Colombier 	"	long col_p(int, char *);",
72237dd7cddfSDavid du Colombier 	"#ifndef SAFETY",
72247dd7cddfSDavid du Colombier 	"	if (a_cycles)",
72257dd7cddfSDavid du Colombier 	"		*v++ = now._a_t;",
72267dd7cddfSDavid du Colombier 		"#ifndef NOFAIR",
72277dd7cddfSDavid du Colombier 	"	if (fairness)",
72287dd7cddfSDavid du Colombier 	"	for (i = 0; i < NFAIR; i++)",
72297dd7cddfSDavid du Colombier 	"		*v++ = now._cnt[i];",
72307dd7cddfSDavid du Colombier 		"#endif",
72317dd7cddfSDavid du Colombier 	"#endif",
72327dd7cddfSDavid du Colombier 	"	nbytelen = 0;",
72337dd7cddfSDavid du Colombier 
72347dd7cddfSDavid du Colombier 	"#ifndef JOINPROCS",
72357dd7cddfSDavid du Colombier 	"	for (i = 0; i < (int) now._nr_pr; i++)",
72367dd7cddfSDavid du Colombier 	"	{	n = col_p(i, (char *) 0);",
7237312a1df1SDavid du Colombier 	"#ifdef NOFIX",
72387dd7cddfSDavid du Colombier 	"		nbytes[nbytelen] = 0;",
7239312a1df1SDavid du Colombier 	"#else",
7240312a1df1SDavid du Colombier 	"		nbytes[nbytelen] = 1;",
7241312a1df1SDavid du Colombier 	"		*v++ = ((P0 *) pptr(i))->_t;",
7242312a1df1SDavid du Colombier 	"#endif",
72437dd7cddfSDavid du Colombier 	"		*v++ = n&255;",
72447dd7cddfSDavid du Colombier 	"		if (n >= (1<<8))",
72457dd7cddfSDavid du Colombier 	"		{	nbytes[nbytelen]++;",
72467dd7cddfSDavid du Colombier 	"			*v++ = (n>>8)&255;",
72477dd7cddfSDavid du Colombier 	"		}",
72487dd7cddfSDavid du Colombier 	"		if (n >= (1<<16))",
72497dd7cddfSDavid du Colombier 	"		{	nbytes[nbytelen]++;",
72507dd7cddfSDavid du Colombier 	"			*v++ = (n>>16)&255;",
72517dd7cddfSDavid du Colombier 	"		}",
72527dd7cddfSDavid du Colombier 	"		if (n >= (1<<24))",
72537dd7cddfSDavid du Colombier 	"		{	nbytes[nbytelen]++;",
72547dd7cddfSDavid du Colombier 	"			*v++ = (n>>24)&255;",
72557dd7cddfSDavid du Colombier 	"		}",
72567dd7cddfSDavid du Colombier 	"		nbytelen++;",
72577dd7cddfSDavid du Colombier 	"	}",
72587dd7cddfSDavid du Colombier 	"#else",
72597dd7cddfSDavid du Colombier 	"	x = scratch;",
72607dd7cddfSDavid du Colombier 	"	for (i = 0; i < (int) now._nr_pr; i++)",
72617dd7cddfSDavid du Colombier 	"		x += col_p(i, x);",
72627dd7cddfSDavid du Colombier 	"	n = ordinal(scratch, x-scratch, 2); /* procs */",
72637dd7cddfSDavid du Colombier 	"	*v++ = n&255;",
72647dd7cddfSDavid du Colombier 	"	nbytes[nbytelen] = 0;",
72657dd7cddfSDavid du Colombier 	"	if (n >= (1<<8))",
72667dd7cddfSDavid du Colombier 	"	{	nbytes[nbytelen]++;",
72677dd7cddfSDavid du Colombier 	"		*v++ = (n>>8)&255;",
72687dd7cddfSDavid du Colombier 	"	}",
72697dd7cddfSDavid du Colombier 	"	if (n >= (1<<16))",
72707dd7cddfSDavid du Colombier 	"	{	nbytes[nbytelen]++;",
72717dd7cddfSDavid du Colombier 	"		*v++ = (n>>16)&255;",
72727dd7cddfSDavid du Colombier 	"	}",
72737dd7cddfSDavid du Colombier 	"	if (n >= (1<<24))",
72747dd7cddfSDavid du Colombier 	"	{	nbytes[nbytelen]++;",
72757dd7cddfSDavid du Colombier 	"		*v++ = (n>>24)&255;",
72767dd7cddfSDavid du Colombier 	"	}",
72777dd7cddfSDavid du Colombier 	"	nbytelen++;",
72787dd7cddfSDavid du Colombier 	"#endif",
72797dd7cddfSDavid du Colombier 	"#ifdef SEPQS",
72807dd7cddfSDavid du Colombier 	"	for (i = 0; i < (int) now._nr_qs; i++)",
72817dd7cddfSDavid du Colombier 	"	{	n = col_q(i, (char *) 0);",
72827dd7cddfSDavid du Colombier 	"		nbytes[nbytelen] = 0;",
72837dd7cddfSDavid du Colombier 	"		*v++ = n&255;",
72847dd7cddfSDavid du Colombier 	"		if (n >= (1<<8))",
72857dd7cddfSDavid du Colombier 	"		{	nbytes[nbytelen]++;",
72867dd7cddfSDavid du Colombier 	"			*v++ = (n>>8)&255;",
72877dd7cddfSDavid du Colombier 	"		}",
72887dd7cddfSDavid du Colombier 	"		if (n >= (1<<16))",
72897dd7cddfSDavid du Colombier 	"		{	nbytes[nbytelen]++;",
72907dd7cddfSDavid du Colombier 	"			*v++ = (n>>16)&255;",
72917dd7cddfSDavid du Colombier 	"		}",
72927dd7cddfSDavid du Colombier 	"		if (n >= (1<<24))",
72937dd7cddfSDavid du Colombier 	"		{	nbytes[nbytelen]++;",
72947dd7cddfSDavid du Colombier 	"			*v++ = (n>>24)&255;",
72957dd7cddfSDavid du Colombier 	"		}",
72967dd7cddfSDavid du Colombier 	"		nbytelen++;",
72977dd7cddfSDavid du Colombier 	"	}",
72987dd7cddfSDavid du Colombier 	"#endif",
72997dd7cddfSDavid du Colombier 
73007dd7cddfSDavid du Colombier 	"#ifdef NOVSZ",
73017dd7cddfSDavid du Colombier 	"	/* 3 = _a_t, _nr_pr, _nr_qs */",
73027dd7cddfSDavid du Colombier 	"	w = (char *) &now + 3 * sizeof(uchar);",
73037dd7cddfSDavid du Colombier 		"#ifndef NOFAIR",
73047dd7cddfSDavid du Colombier 		"	w += NFAIR;",
73057dd7cddfSDavid du Colombier 		"#endif",
73067dd7cddfSDavid du Colombier 	"#else",
73077dd7cddfSDavid du Colombier 		"#if VECTORSZ<65536",
73087dd7cddfSDavid du Colombier 		"	w = (char *) &(now._vsz) + sizeof(unsigned short);",
73097dd7cddfSDavid du Colombier 		"#else",
7310*de2caf28SDavid du Colombier 		"	w = (char *) &(now._vsz) + sizeof(ulong);",
73117dd7cddfSDavid du Colombier 		"#endif",
73127dd7cddfSDavid du Colombier 	"#endif",
73137dd7cddfSDavid du Colombier 	"	x = scratch;",
73147dd7cddfSDavid du Colombier 	"	*x++ = now._nr_pr;",
73157dd7cddfSDavid du Colombier 	"	*x++ = now._nr_qs;",
73167dd7cddfSDavid du Colombier 
73177dd7cddfSDavid du Colombier 	"	if (now._nr_qs > 0 && qptr(0) < pptr(0))",
73187dd7cddfSDavid du Colombier 	"		n = qptr(0) - (uchar *) w;",
73197dd7cddfSDavid du Colombier 	"	else",
73207dd7cddfSDavid du Colombier 	"		n = pptr(0) - (uchar *) w;",
73217dd7cddfSDavid du Colombier 	"	j = w - (char *) &now;",
7322*de2caf28SDavid du Colombier 	"",
7323*de2caf28SDavid du Colombier 	"#if !defined(NOCOMP) && !defined(HC)",
7324312a1df1SDavid du Colombier 	"	for (i = 0; i < (int) n; i++, w++)",
73257dd7cddfSDavid du Colombier 	"		if (!Mask[j++]) *x++ = *w;",
7326*de2caf28SDavid du Colombier 	"#else",
7327*de2caf28SDavid du Colombier 	"	memcpy(x, w, n); x += n;",
7328*de2caf28SDavid du Colombier 	"#endif",
7329*de2caf28SDavid du Colombier 	"",
73307dd7cddfSDavid du Colombier 	"#ifndef SEPQS",
73317dd7cddfSDavid du Colombier 	"	for (i = 0; i < (int) now._nr_qs; i++)",
73327dd7cddfSDavid du Colombier 	"		x += col_q(i, x);",
73337dd7cddfSDavid du Colombier 	"#endif",
73347dd7cddfSDavid du Colombier 
73357dd7cddfSDavid du Colombier 	"	x--;",
73367dd7cddfSDavid du Colombier 	"	for (i = 0, j = 6; i < nbytelen; i++)",
73377dd7cddfSDavid du Colombier 	"	{	if (j == 6)",
73387dd7cddfSDavid du Colombier 	"		{	j = 0;",
73397dd7cddfSDavid du Colombier 	"			*(++x) = 0;",
73407dd7cddfSDavid du Colombier 	"		} else",
73417dd7cddfSDavid du Colombier 	"			j += 2;",
73427dd7cddfSDavid du Colombier 	"		*x |= (nbytes[i] << j);",
73437dd7cddfSDavid du Colombier 	"	}",
73447dd7cddfSDavid du Colombier 	"	x++;",
73457dd7cddfSDavid du Colombier 	"	for (j = 0; j < WS-1; j++)",
73467dd7cddfSDavid du Colombier 	"		*x++ = 0;",
73477dd7cddfSDavid du Colombier 	"	x -= j; j = 0;",
73487dd7cddfSDavid du Colombier 	"	n = ordinal(scratch, x-scratch, 0); /* globals */",
73497dd7cddfSDavid du Colombier 	"	*v++ = n&255;",
73507dd7cddfSDavid du Colombier 	"	if (n >= (1<< 8)) { *v++ = (n>> 8)&255; j++; }",
73517dd7cddfSDavid du Colombier 	"	if (n >= (1<<16)) { *v++ = (n>>16)&255; j++; }",
73527dd7cddfSDavid du Colombier 	"	if (n >= (1<<24)) { *v++ = (n>>24)&255; j++; }",
73537dd7cddfSDavid du Colombier 	"	*v++ = j;	/* add last count as a byte */",
73547dd7cddfSDavid du Colombier 
73557dd7cddfSDavid du Colombier 	"	for (i = 0; i < WS-1; i++)",
73567dd7cddfSDavid du Colombier 	"		*v++ = 0;",
73577dd7cddfSDavid du Colombier 	"	v -= i;",
73587dd7cddfSDavid du Colombier 	"#if 0",
73597dd7cddfSDavid du Colombier 	"	printf(\"collapse %%d -> %%d\\n\",",
73607dd7cddfSDavid du Colombier 	"		vsize, v - (char *)&comp_now);",
73617dd7cddfSDavid du Colombier 	"#endif",
73627dd7cddfSDavid du Colombier 	"	return v - (char *)&comp_now;",
73637dd7cddfSDavid du Colombier 	"}",
73647dd7cddfSDavid du Colombier 
7365*de2caf28SDavid du Colombier "#else",	/* !COLLAPSE */
73667dd7cddfSDavid du Colombier "#if !defined(NOCOMP)",
73677dd7cddfSDavid du Colombier 	"int",
73687dd7cddfSDavid du Colombier 	"compress(char *vin, int n)	/* default compression */",
73697dd7cddfSDavid du Colombier 	"{",
73707dd7cddfSDavid du Colombier 	"#ifdef HC",
73717dd7cddfSDavid du Colombier 	"	int delta = 0;",
7372312a1df1SDavid du Colombier 	"	s_hash((uchar *)vin, n); /* sets K1 and K2 */",
73737dd7cddfSDavid du Colombier 		"#ifndef SAFETY",
73747dd7cddfSDavid du Colombier 	"	if (S_A)",
73757dd7cddfSDavid du Colombier 	"	{	delta++;	/* _a_t  */",
73767dd7cddfSDavid du Colombier 			"#ifndef NOFAIR",
73777dd7cddfSDavid du Colombier 	"		if (S_A > NFAIR)",
73787dd7cddfSDavid du Colombier 	"			delta += NFAIR;	/* _cnt[] */",
73797dd7cddfSDavid du Colombier 			"#endif",
73807dd7cddfSDavid du Colombier 	"	}",
73817dd7cddfSDavid du Colombier 		"#endif",
7382312a1df1SDavid du Colombier 	"	memcpy((char *) &comp_now + delta, (char *) &K1, WS);",
7383312a1df1SDavid du Colombier 	"	delta += WS;",
73847dd7cddfSDavid du Colombier 		"#if HC>0",
7385312a1df1SDavid du Colombier 	"	memcpy((char *) &comp_now + delta, (char *) &K2, HC);",
73867dd7cddfSDavid du Colombier 	"	delta += HC;",
73877dd7cddfSDavid du Colombier 		"#endif",
73887dd7cddfSDavid du Colombier 	"	return delta;",
73897dd7cddfSDavid du Colombier 	"#else",
73907dd7cddfSDavid du Colombier 	"	char *vv = vin;",
73917dd7cddfSDavid du Colombier 	"	char *v = (char *) &comp_now;",
73927dd7cddfSDavid du Colombier 	"	int i;",
739300d97012SDavid du Colombier 	"  #ifndef NO_FAST_C", /* disable faster compress */
739400d97012SDavid du Colombier 	"	int r = 0, unroll = n/8;", /* most sv are much longer */
739500d97012SDavid du Colombier 	"	if (unroll > 0)",
739600d97012SDavid du Colombier 	"	{	i = 0;",
739700d97012SDavid du Colombier 	"		while (r++ < unroll)",
739800d97012SDavid du Colombier 	"		{	/* unroll 8 times, avoid ifs */",
739900d97012SDavid du Colombier 	"	/* 1 */		*v = *vv++; v += 1 - Mask[i++];",
740000d97012SDavid du Colombier 	"	/* 2 */		*v = *vv++; v += 1 - Mask[i++];",
740100d97012SDavid du Colombier 	"	/* 3 */		*v = *vv++; v += 1 - Mask[i++];",
740200d97012SDavid du Colombier 	"	/* 4 */		*v = *vv++; v += 1 - Mask[i++];",
740300d97012SDavid du Colombier 	"	/* 5 */		*v = *vv++; v += 1 - Mask[i++];",
740400d97012SDavid du Colombier 	"	/* 6 */		*v = *vv++; v += 1 - Mask[i++];",
740500d97012SDavid du Colombier 	"	/* 7 */		*v = *vv++; v += 1 - Mask[i++];",
740600d97012SDavid du Colombier 	"	/* 8 */		*v = *vv++; v += 1 - Mask[i++];",
740700d97012SDavid du Colombier 	"		}",
740800d97012SDavid du Colombier 	"		r = n - i; /* the rest, at most 7 */",
740900d97012SDavid du Colombier 	"		switch (r) {",
741000d97012SDavid du Colombier 	"		case 7: *v = *vv++; v += 1 - Mask[i++];",
741100d97012SDavid du Colombier 	"		case 6: *v = *vv++; v += 1 - Mask[i++];",
741200d97012SDavid du Colombier 	"		case 5: *v = *vv++; v += 1 - Mask[i++];",
741300d97012SDavid du Colombier 	"		case 4: *v = *vv++; v += 1 - Mask[i++];",
741400d97012SDavid du Colombier 	"		case 3: *v = *vv++; v += 1 - Mask[i++];",
741500d97012SDavid du Colombier 	"		case 2: *v = *vv++; v += 1 - Mask[i++];",
741600d97012SDavid du Colombier 	"		case 1: *v = *vv++; v += 1 - Mask[i++];",
741700d97012SDavid du Colombier 	"		case 0: break;",
741800d97012SDavid du Colombier 	"		}",
741900d97012SDavid du Colombier 	"		n = i = v - (char *)&comp_now; /* bytes written so far */",
742000d97012SDavid du Colombier 	"		r = (n+WS-1)/WS; /* in words, rounded up */",
742100d97012SDavid du Colombier 	"		r *= WS;	 /* total bytes to fill  */",
742200d97012SDavid du Colombier 	"		i = r - i;	 /* remaining bytes      */",
742300d97012SDavid du Colombier 	"		switch (i) {",   /* fill word */
742400d97012SDavid du Colombier 	"		case 7: *v++ = 0;    /* fall thru */",
742500d97012SDavid du Colombier 	"		case 6: *v++ = 0;",
742600d97012SDavid du Colombier 	"		case 5: *v++ = 0;",
742700d97012SDavid du Colombier 	"		case 4: *v++ = 0;",
742800d97012SDavid du Colombier 	"		case 3: *v++ = 0;",
742900d97012SDavid du Colombier 	"		case 2: *v++ = 0;",
743000d97012SDavid du Colombier 	"		case 1: *v++ = 0;",
743100d97012SDavid du Colombier 	"		case 0: break;",
743200d97012SDavid du Colombier 	"		default: Uerror(\"unexpected wordsize\");",
743300d97012SDavid du Colombier 	"		}",
743400d97012SDavid du Colombier 	"		v -= i;",
743500d97012SDavid du Colombier 	"	} else",
743600d97012SDavid du Colombier 	"  #endif",
743700d97012SDavid du Colombier 	"	{	for (i = 0; i < n; i++, vv++)",
7438219b2ee8SDavid du Colombier 	"			if (!Mask[i]) *v++ = *vv;",
7439219b2ee8SDavid du Colombier 	"		for (i = 0; i < WS-1; i++)",
7440219b2ee8SDavid du Colombier 	"			*v++ = 0;",
7441219b2ee8SDavid du Colombier 	"		v -= i;",
744200d97012SDavid du Colombier 	"	}",
7443219b2ee8SDavid du Colombier 		"#if 0",
7444219b2ee8SDavid du Colombier 	"	printf(\"compress %%d -> %%d\\n\",",
7445219b2ee8SDavid du Colombier 	"		n, v - (char *)&comp_now);",
7446219b2ee8SDavid du Colombier 		"#endif",
7447219b2ee8SDavid du Colombier 	"	return v - (char *)&comp_now;",
74487dd7cddfSDavid du Colombier 	"#endif",
7449219b2ee8SDavid du Colombier 	"}",
7450219b2ee8SDavid du Colombier "#endif",
7451*de2caf28SDavid du Colombier "#endif",	/* COLLAPSE */
7452219b2ee8SDavid du Colombier 	"#if defined(FULLSTACK) && defined(BITSTATE)",
7453312a1df1SDavid du Colombier "#if defined(MA)",
7454312a1df1SDavid du Colombier 	"#if !defined(onstack_now)",
7455312a1df1SDavid du Colombier 	"int  onstack_now(void) {}", /* to suppress compiler errors */
7456312a1df1SDavid du Colombier 	"#endif",
7457312a1df1SDavid du Colombier 	"#if !defined(onstack_put)",
7458312a1df1SDavid du Colombier 	"void onstack_put(void) {}", /* for this invalid combination */
7459312a1df1SDavid du Colombier 	"#endif",
7460312a1df1SDavid du Colombier 	"#if !defined(onstack_zap)",
7461312a1df1SDavid du Colombier 	"void onstack_zap(void) {}", /* of directives */
7462312a1df1SDavid du Colombier 	"#endif",
7463312a1df1SDavid du Colombier "#else",
7464*de2caf28SDavid du Colombier 	"int compact_stack(char *, int);",
7465*de2caf28SDavid du Colombier 	""
7466219b2ee8SDavid du Colombier 	"void",
7467219b2ee8SDavid du Colombier 	"onstack_zap(void)",
7468*de2caf28SDavid du Colombier 	"{	H_el *v, *w, *last = 0;",
7469*de2caf28SDavid du Colombier 	"	H_el **tmp = H_tab;",
747000d97012SDavid du Colombier 	"	char *nv; int n, m;",
747100d97012SDavid du Colombier 	"	static char warned = 0;",
747200d97012SDavid du Colombier 	"#if defined(BCS) && defined(NO_LAST) && defined(HAS_LAST)",
747300d97012SDavid du Colombier 	"	uchar was_last = now._last;",
747400d97012SDavid du Colombier 	"	now._last = 0;",
747500d97012SDavid du Colombier 	"#endif",
747600d97012SDavid du Colombier 	"",
74777dd7cddfSDavid du Colombier 	"	H_tab = S_Tab;",
7478219b2ee8SDavid du Colombier 	"#ifndef NOCOMP",
74797dd7cddfSDavid du Colombier 	"	nv = (char *) &comp_now;",
74807dd7cddfSDavid du Colombier 	"	n = compress((char *)&now, vsize);",
7481219b2ee8SDavid du Colombier 	"#else",
74827dd7cddfSDavid du Colombier 		"#if defined(BITSTATE) && defined(LC)",
74837dd7cddfSDavid du Colombier 	"	nv = (char *) &comp_now;",
74847dd7cddfSDavid du Colombier 	"	n = compact_stack((char *)&now, vsize);",
74857dd7cddfSDavid du Colombier 		"#else",
74867dd7cddfSDavid du Colombier 	"	nv = (char *) &now;",
74877dd7cddfSDavid du Colombier 	"	n = vsize;",
7488219b2ee8SDavid du Colombier 		"#endif",
74897dd7cddfSDavid du Colombier 	"#endif",
74907dd7cddfSDavid du Colombier 	"#if !defined(HC) && !(defined(BITSTATE) && defined(LC))",
7491219b2ee8SDavid du Colombier 	"	s_hash((uchar *)nv, n);",
74927dd7cddfSDavid du Colombier 	"#endif",
7493219b2ee8SDavid du Colombier 	"	H_tab = tmp;",
749400d97012SDavid du Colombier 	"	for (v = S_Tab[j1_spin]; v; Zh++, last=v, v=v->nxt)",
7495219b2ee8SDavid du Colombier 	"	{	m = memcmp(&(v->state), nv, n);",
7496219b2ee8SDavid du Colombier 	"		if (m == 0)",
7497219b2ee8SDavid du Colombier 	"			goto Found;",
7498219b2ee8SDavid du Colombier 	"		if (m < 0)",
7499219b2ee8SDavid du Colombier 	"			break;",
7500219b2ee8SDavid du Colombier 	"	}",
7501312a1df1SDavid du Colombier 	"/* NotFound: */",
750200d97012SDavid du Colombier 	"#ifndef ZAPH",
750300d97012SDavid du Colombier 	"	/* seen this happen, likely harmless in multicore */",
750400d97012SDavid du Colombier 	"	if (warned == 0)",
750500d97012SDavid du Colombier 	"	{	/* Uerror(\"stack out of wack - zap\"); */",
750600d97012SDavid du Colombier 	"		cpu_printf(\"pan: warning, stack incomplete\\n\");",
750700d97012SDavid du Colombier 	"		warned = 1;",
750800d97012SDavid du Colombier 	"	}",
750900d97012SDavid du Colombier 	"#endif",
751000d97012SDavid du Colombier 	"	goto done;",
7511219b2ee8SDavid du Colombier 	"Found:",
7512219b2ee8SDavid du Colombier 	"	ZAPS++;",
7513219b2ee8SDavid du Colombier 	"	if (last)",
7514219b2ee8SDavid du Colombier 	"		last->nxt = v->nxt;",
7515219b2ee8SDavid du Colombier 	"	else",
751600d97012SDavid du Colombier 	"		S_Tab[j1_spin] = v->nxt;",
7517312a1df1SDavid du Colombier 	"	v->tagged = (unsigned) n;",
75187dd7cddfSDavid du Colombier 	"#if !defined(NOREDUCE) && !defined(SAFETY)",
75197dd7cddfSDavid du Colombier 	"	v->proviso = 0;",
75207dd7cddfSDavid du Colombier 	"#endif",
7521*de2caf28SDavid du Colombier 	"	v->nxt = last = (H_el *) 0;",
7522219b2ee8SDavid du Colombier 	"	for (w = Free_list; w; Fa++, last=w, w = w->nxt)",
7523312a1df1SDavid du Colombier 	"	{	if ((int) w->tagged <= n)",
7524219b2ee8SDavid du Colombier 	"		{	if (last)",
752500d97012SDavid du Colombier 	"			{	v->nxt = w;",
7526219b2ee8SDavid du Colombier 	"				last->nxt = v;",
7527219b2ee8SDavid du Colombier 	"			} else",
7528219b2ee8SDavid du Colombier 	"			{	v->nxt = Free_list;",
7529219b2ee8SDavid du Colombier 	"				Free_list = v;",
7530219b2ee8SDavid du Colombier 	"			}",
753100d97012SDavid du Colombier 	"			goto done;",
7532219b2ee8SDavid du Colombier 	"		}",
7533219b2ee8SDavid du Colombier 	"		if (!w->nxt)",
7534219b2ee8SDavid du Colombier 	"		{	w->nxt = v;",
753500d97012SDavid du Colombier 	"			goto done;",
7536219b2ee8SDavid du Colombier 	"	}	}",
7537219b2ee8SDavid du Colombier 	"	Free_list = v;",
753800d97012SDavid du Colombier 	"done:",
753900d97012SDavid du Colombier 	"#if defined(BCS) && defined(NO_LAST) && defined(HAS_LAST)",
754000d97012SDavid du Colombier 	"	now._last = was_last;",
754100d97012SDavid du Colombier 	"#endif",
754200d97012SDavid du Colombier 	"	return;",
7543219b2ee8SDavid du Colombier 	"}",
7544*de2caf28SDavid du Colombier 	"",
7545*de2caf28SDavid du Colombier 	"#ifndef BFS_PAR",
7546219b2ee8SDavid du Colombier 	"	void",
7547219b2ee8SDavid du Colombier 	"	onstack_put(void)",
7548*de2caf28SDavid du Colombier 	"	{	H_el **tmp = H_tab;",
754900d97012SDavid du Colombier 	"	#if defined(BCS) && defined(NO_LAST) && defined(HAS_LAST)",
755000d97012SDavid du Colombier 	"		uchar was_last = now._last;",
755100d97012SDavid du Colombier 	"		now._last = 0;",
755200d97012SDavid du Colombier 	"	#endif",
75537dd7cddfSDavid du Colombier 	"		H_tab = S_Tab;",
7554*de2caf28SDavid du Colombier 	"		if (h_store((char *)&now, vsize) != 0)",
75557dd7cddfSDavid du Colombier 	"	#if defined(BITSTATE) && defined(LC)",
75567dd7cddfSDavid du Colombier 	"			printf(\"pan: warning, double stack entry\\n\");",
75577dd7cddfSDavid du Colombier 	"	#else",
755800d97012SDavid du Colombier 	"		#ifndef ZAPH",
75597dd7cddfSDavid du Colombier 	"			Uerror(\"cannot happen - unstack_put\");",
75607dd7cddfSDavid du Colombier 	"		#endif",
756100d97012SDavid du Colombier 	"	#endif",
7562219b2ee8SDavid du Colombier 	"		H_tab = tmp;",
75637dd7cddfSDavid du Colombier 	"		trpt->ostate = Lstate;",
7564219b2ee8SDavid du Colombier 	"		PUT++;",
756500d97012SDavid du Colombier 	"	#if defined(BCS) && defined(NO_LAST) && defined(HAS_LAST)",
756600d97012SDavid du Colombier 	"		now._last = was_last;",
756700d97012SDavid du Colombier 	"	#endif",
7568219b2ee8SDavid du Colombier 	"	}",
7569219b2ee8SDavid du Colombier 	"	int",
7570219b2ee8SDavid du Colombier 	"	onstack_now(void)",
7571*de2caf28SDavid du Colombier 	"	{	H_el *tmp;",
7572*de2caf28SDavid du Colombier 	"		H_el **tmp2 = H_tab;",
75737dd7cddfSDavid du Colombier 	"		char *v; int n, m = 1;\n",
757400d97012SDavid du Colombier 	"	#if defined(BCS) && defined(NO_LAST) && defined(HAS_LAST)",
757500d97012SDavid du Colombier 	"		uchar was_last = now._last;",
757600d97012SDavid du Colombier 	"		now._last = 0;",
757700d97012SDavid du Colombier 	"	#endif",
75787dd7cddfSDavid du Colombier 	"		H_tab = S_Tab;",
75797dd7cddfSDavid du Colombier 	"	#ifdef NOCOMP",
75807dd7cddfSDavid du Colombier 	"		#if defined(BITSTATE) && defined(LC)",
75817dd7cddfSDavid du Colombier 	"			v = (char *) &comp_now;",
75827dd7cddfSDavid du Colombier 	"			n = compact_stack((char *)&now, vsize);",
7583219b2ee8SDavid du Colombier 	"		#else",
75847dd7cddfSDavid du Colombier 	"			v = (char *) &now;",
75857dd7cddfSDavid du Colombier 	"			n = vsize;",
7586219b2ee8SDavid du Colombier 	"		#endif",
75877dd7cddfSDavid du Colombier 	"	#else",
75887dd7cddfSDavid du Colombier 	"		v = (char *) &comp_now;",
75897dd7cddfSDavid du Colombier 	"		n = compress((char *)&now, vsize);",
75907dd7cddfSDavid du Colombier 	"	#endif",
75917dd7cddfSDavid du Colombier 	"	#if !defined(HC) && !(defined(BITSTATE) && defined(LC))",
7592219b2ee8SDavid du Colombier 	"		s_hash((uchar *)v, n);",
75937dd7cddfSDavid du Colombier 	"	#endif",
7594219b2ee8SDavid du Colombier 	"		H_tab = tmp2;",
759500d97012SDavid du Colombier 	"		for (tmp = S_Tab[j1_spin]; tmp; Zn++, tmp = tmp->nxt)",
75967dd7cddfSDavid du Colombier 	"		{	m = memcmp(((char *)&(tmp->state)),v,n);",
75977dd7cddfSDavid du Colombier 	"			if (m <= 0)",
7598*de2caf28SDavid du Colombier 	"			{	Lstate = (H_el *) tmp;	/* onstack_now */",
75997dd7cddfSDavid du Colombier 	"				break;",
76007dd7cddfSDavid du Colombier 	"		}	}",
7601219b2ee8SDavid du Colombier 	"		PROBE++;",
760200d97012SDavid du Colombier 	"	#if defined(BCS) && defined(NO_LAST) && defined(HAS_LAST)",
760300d97012SDavid du Colombier 	"		now._last = was_last;",
760400d97012SDavid du Colombier 	"	#endif",
7605219b2ee8SDavid du Colombier 	"		return (m == 0);",
7606219b2ee8SDavid du Colombier 	"	}",
7607*de2caf28SDavid du Colombier 	"#endif",	/* !BFS_PAR */
7608*de2caf28SDavid du Colombier "#endif",		/* !MA */
7609*de2caf28SDavid du Colombier 	"#endif",	/* FULLSTACK && BITSTATE */
7610219b2ee8SDavid du Colombier 
7611*de2caf28SDavid du Colombier 	"#ifdef BITSTATE",
7612*de2caf28SDavid du Colombier 	"void init_SS(ulong);",
7613*de2caf28SDavid du Colombier 	"",
7614*de2caf28SDavid du Colombier 	"void",
7615*de2caf28SDavid du Colombier 	"sinit(void)",
7616*de2caf28SDavid du Colombier 	"{",
7617*de2caf28SDavid du Colombier 	"	if (udmem)",
7618*de2caf28SDavid du Colombier 	"	{	udmem *= 1024L*1024L;",
7619*de2caf28SDavid du Colombier 	"	#if NCORE>1",
7620*de2caf28SDavid du Colombier 	"		if (!readtrail)",
7621*de2caf28SDavid du Colombier 	"		{	init_SS((ulong) udmem);",
7622*de2caf28SDavid du Colombier 	"		} else",
7623*de2caf28SDavid du Colombier 	"	#endif",
7624*de2caf28SDavid du Colombier 	"	#if defined(BFS_PAR) && !defined(BFS_SEP_HASH)",
7625*de2caf28SDavid du Colombier 	"		SS = (uchar *) sh_pre_malloc((ulong) udmem);",
7626*de2caf28SDavid du Colombier 	"	#else",
7627*de2caf28SDavid du Colombier 	"		SS = (uchar *) emalloc(udmem);",
7628*de2caf28SDavid du Colombier 	"	#endif",
7629*de2caf28SDavid du Colombier 	"		b_store = bstore_mod;",
7630*de2caf28SDavid du Colombier 	"	} else",
7631*de2caf28SDavid du Colombier 	"	{",
7632*de2caf28SDavid du Colombier 	"	#if NCORE>1",
7633*de2caf28SDavid du Colombier 	"		init_SS(ONE_L<<(ssize-3));",
7634*de2caf28SDavid du Colombier 	"	#else",
7635*de2caf28SDavid du Colombier 	"		#if defined(BFS_PAR) && !defined(BFS_SEP_HASH)",
7636*de2caf28SDavid du Colombier 	"			SS = (uchar *) sh_pre_malloc((ulong)(ONE_L<<(ssize-3)));",
7637*de2caf28SDavid du Colombier 	"		#else",
7638*de2caf28SDavid du Colombier 	"			SS = (uchar *) emalloc(ONE_L<<(ssize-3));",
7639*de2caf28SDavid du Colombier 	"		#endif",
7640*de2caf28SDavid du Colombier 	"	#endif",
7641*de2caf28SDavid du Colombier 	"	}",
7642*de2caf28SDavid du Colombier 	"}",
7643*de2caf28SDavid du Colombier 	"#else",
7644*de2caf28SDavid du Colombier 	" #if !defined(MA) || defined(COLLAPSE)",
7645*de2caf28SDavid du Colombier 	" void",
7646*de2caf28SDavid du Colombier 	" set_H_tab(void)",
7647*de2caf28SDavid du Colombier 	" {",
7648*de2caf28SDavid du Colombier 	"  #if defined(BFS_PAR) && !defined(BFS_SEP_HASH)",
7649*de2caf28SDavid du Colombier 	"	H_tab = (H_el **) sh_pre_malloc((ulong)((ONE_L<<ssize)*sizeof(H_el *)));",
7650*de2caf28SDavid du Colombier 	"  #else",
7651*de2caf28SDavid du Colombier 	"	H_tab = (H_el **) emalloc((ONE_L<<ssize)*sizeof(H_el *));",
7652*de2caf28SDavid du Colombier 	"  #endif",
7653*de2caf28SDavid du Colombier 	" }",
7654*de2caf28SDavid du Colombier 	" #endif",
7655219b2ee8SDavid du Colombier 	"void",
7656219b2ee8SDavid du Colombier 	"hinit(void)",
76577dd7cddfSDavid du Colombier 	"{",
76587dd7cddfSDavid du Colombier 	"	#ifdef MA",
76597dd7cddfSDavid du Colombier 	"		#ifdef R_XPT",
76607dd7cddfSDavid du Colombier 	"			{	void r_xpoint(void);",
76617dd7cddfSDavid du Colombier 	"				r_xpoint();",
76627dd7cddfSDavid du Colombier 	"			}",
76637dd7cddfSDavid du Colombier 	"		#else",
7664312a1df1SDavid du Colombier 	"			dfa_init((unsigned short) (MA+a_cycles));",
766500d97012SDavid du Colombier 	"			#if NCORE>1 && !defined(COLLAPSE)",
766600d97012SDavid du Colombier 	"			if (!readtrail)",
7667*de2caf28SDavid du Colombier 	"			{	void init_HT(ulong);",
766800d97012SDavid du Colombier 	"				init_HT(0L);",
766900d97012SDavid du Colombier 	"			}",
767000d97012SDavid du Colombier 	"			#endif",
76717dd7cddfSDavid du Colombier 	"		#endif",
76727dd7cddfSDavid du Colombier 	"	#endif",
76737dd7cddfSDavid du Colombier 	"	#if !defined(MA) || defined(COLLAPSE)",
7674*de2caf28SDavid du Colombier 	"		#if NCORE>1 || (defined(BFS_PAR) && defined(USE_TDH) && !defined(WIN32) && !defined(WIN64))",
767500d97012SDavid du Colombier 	"			if (!readtrail)",
7676*de2caf28SDavid du Colombier 	"			{	void init_HT(ulong);",
7677*de2caf28SDavid du Colombier 	"				init_HT((ulong) (ONE_L<<ssize)*sizeof(H_el *));",
7678*de2caf28SDavid du Colombier 	"			#if defined(TRIX) || (defined(BFS_PAR) && defined(COLLAPSE))",
7679*de2caf28SDavid du Colombier 	"				set_H_tab(); /* need both */",
7680*de2caf28SDavid du Colombier 	"			#endif",
768100d97012SDavid du Colombier 	"			} else",
768200d97012SDavid du Colombier 	"		#endif",
7683*de2caf28SDavid du Colombier 	"			{	set_H_tab(); /* @htable ssize */",
7684*de2caf28SDavid du Colombier 	"			}",
7685*de2caf28SDavid du Colombier 	"	#endif", /* !defined(MA) || defined(COLLAPSE) */
7686219b2ee8SDavid du Colombier 	"}",
7687219b2ee8SDavid du Colombier 	"#endif\n",
7688219b2ee8SDavid du Colombier 
7689219b2ee8SDavid du Colombier 	"#if !defined(BITSTATE) || defined(FULLSTACK)",
7690219b2ee8SDavid du Colombier 
7691219b2ee8SDavid du Colombier 	"#ifdef DEBUG",
7692219b2ee8SDavid du Colombier 	"void",
7693219b2ee8SDavid du Colombier 	"dumpstate(int wasnew, char *v, int n, int tag)",
7694219b2ee8SDavid du Colombier 	"{	int i;",
76957dd7cddfSDavid du Colombier 	"#ifndef SAFETY",
7696219b2ee8SDavid du Colombier 	"	if (S_A)",
76977dd7cddfSDavid du Colombier 	"	{	printf(\"\tstate tags %%d (%%d::%%d): \",",
76987dd7cddfSDavid du Colombier 	"			V_A, wasnew, v[0]);",
7699219b2ee8SDavid du Colombier 		"#ifdef FULLSTACK",
7700219b2ee8SDavid du Colombier 	"		printf(\" %%d \", tag);",
7701219b2ee8SDavid du Colombier 		"#endif",
7702219b2ee8SDavid du Colombier 	"		printf(\"\\n\");",
7703219b2ee8SDavid du Colombier 	"	}",
77047dd7cddfSDavid du Colombier 	"#endif",
7705219b2ee8SDavid du Colombier 	"#ifdef SDUMP",
7706219b2ee8SDavid du Colombier 	"	printf(\"\t State: \");",
7707*de2caf28SDavid du Colombier 	"#if !defined(NOCOMP) && !defined(HC)",
7708219b2ee8SDavid du Colombier 	"	for (i = 0; i < vsize; i++) printf(\"%%d%%s,\",",
7709219b2ee8SDavid du Colombier 	"		((char *)&now)[i], Mask[i]?\"*\":\"\");",
7710*de2caf28SDavid du Colombier 	"#else",
7711*de2caf28SDavid du Colombier 	"	for (i = 0; i < vsize; i++)",
7712*de2caf28SDavid du Colombier 	"		printf(\"%%d,\", ((char *)&now)[i]);",
77137dd7cddfSDavid du Colombier 	"#endif",
7714219b2ee8SDavid du Colombier 	"	printf(\"\\n\tVector: \");",
7715*de2caf28SDavid du Colombier 	"	for (i = 0; i < n; i++)",
7716*de2caf28SDavid du Colombier 	"		printf(\"%%d,\", v[i]);",
7717219b2ee8SDavid du Colombier 	"	printf(\"\\n\");",
7718219b2ee8SDavid du Colombier 	"#endif",
7719219b2ee8SDavid du Colombier 	"}",
7720219b2ee8SDavid du Colombier 	"#endif",
7721219b2ee8SDavid du Colombier 
77227dd7cddfSDavid du Colombier "#ifdef MA",
7723219b2ee8SDavid du Colombier 	"int",
7724*de2caf28SDavid du Colombier 	"g_store(char *vin, int nin, uchar pbit)",
7725312a1df1SDavid du Colombier 	"{	int n, i;",
772600d97012SDavid du Colombier 	"	int ret_val = 1;",
7727312a1df1SDavid du Colombier 	"	uchar *v;",
77287dd7cddfSDavid du Colombier 	"	static uchar Info[MA+1];",
7729312a1df1SDavid du Colombier 	"#ifndef NOCOMP",
7730312a1df1SDavid du Colombier 	"	n = compress(vin, nin);",
7731312a1df1SDavid du Colombier 	"	v = (uchar *) &comp_now;",
7732312a1df1SDavid du Colombier 	"#else",
7733312a1df1SDavid du Colombier 	"	n = nin;",
773400d97012SDavid du Colombier 	"	v = (uchar *) vin;",
7735312a1df1SDavid du Colombier 	"#endif",
77367dd7cddfSDavid du Colombier 	"	if (n >= MA)",
77377dd7cddfSDavid du Colombier 	"	{	printf(\"pan: error, MA too small, recompile pan.c\");",
77387dd7cddfSDavid du Colombier 	"		printf(\" with -DMA=N with N>%%d\\n\", n);",
77397dd7cddfSDavid du Colombier 	"		Uerror(\"aborting\");",
77407dd7cddfSDavid du Colombier 	"	}",
774100d97012SDavid du Colombier 	"	if (n > (int) maxgs)",
7742*de2caf28SDavid du Colombier 	"	{	maxgs = (uint) n;",
774300d97012SDavid du Colombier 	"	}",
77447dd7cddfSDavid du Colombier 	"	for (i = 0; i < n; i++)",
774500d97012SDavid du Colombier 	"	{	Info[i] = v[i];",
774600d97012SDavid du Colombier 	"	}",
77477dd7cddfSDavid du Colombier 	"	for ( ; i < MA-1; i++)",
774800d97012SDavid du Colombier 	"	{	Info[i] = 0;",
774900d97012SDavid du Colombier 	"	}",
77507dd7cddfSDavid du Colombier 	"	Info[MA-1] = pbit;",
77517dd7cddfSDavid du Colombier 	"	if (a_cycles)	/* place _a_t at the end */",
775200d97012SDavid du Colombier 	"	{	Info[MA] = Info[0];",
775300d97012SDavid du Colombier 	"		Info[0]  = 0;",
775400d97012SDavid du Colombier 	"	}",
775500d97012SDavid du Colombier 	"",
7756*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
7757*de2caf28SDavid du Colombier 	"	e_critical(BFS_STATE);	/* bfs_par / g_store */",
7758*de2caf28SDavid du Colombier 	"#endif",
775900d97012SDavid du Colombier 	"#if NCORE>1 && !defined(SEP_STATE)",
776000d97012SDavid du Colombier 	"	enter_critical(GLOBAL_LOCK); /* crude, but necessary */",
776100d97012SDavid du Colombier 	"	/* to make this mode work, also replace emalloc with grab_shared inside store MA routines */",
776200d97012SDavid du Colombier 	"#endif",
776300d97012SDavid du Colombier 	"",
77647dd7cddfSDavid du Colombier 	"	if (!dfa_store(Info))",
77657dd7cddfSDavid du Colombier 	"	{	if (pbit == 0",
77667dd7cddfSDavid du Colombier 	"		&& (now._a_t&1)",
77677dd7cddfSDavid du Colombier 	"		&&  depth > A_depth)",
77687dd7cddfSDavid du Colombier 	"		{	Info[MA] &= ~(1|16|32);	/* _a_t */",
77697dd7cddfSDavid du Colombier 	"			if (dfa_member(MA))",	/* was !dfa_member(MA) */
77707dd7cddfSDavid du Colombier 	"			{	Info[MA-1] = 4; /* off-stack bit */",
77717dd7cddfSDavid du Colombier 	"				nShadow++;",
77727dd7cddfSDavid du Colombier 	"				if (!dfa_member(MA-1))",
777300d97012SDavid du Colombier 	"				{	ret_val = 3;",
77747dd7cddfSDavid du Colombier 	"			#ifdef VERBOSE",
77757dd7cddfSDavid du Colombier 	"					printf(\"intersected 1st dfs stack\\n\");",
77767dd7cddfSDavid du Colombier 	"			#endif",
777700d97012SDavid du Colombier 	"					goto done;",
77787dd7cddfSDavid du Colombier 	"		}	}	}",
777900d97012SDavid du Colombier 	"		ret_val = 0;",
77807dd7cddfSDavid du Colombier 	"	#ifdef VERBOSE",
77817dd7cddfSDavid du Colombier 	"		printf(\"new state\\n\");",
77827dd7cddfSDavid du Colombier 	"	#endif",
778300d97012SDavid du Colombier 	"		goto done;",
77847dd7cddfSDavid du Colombier 	"	}",
77857dd7cddfSDavid du Colombier 	"#ifdef FULLSTACK",
77867dd7cddfSDavid du Colombier 	"	if (pbit == 0)",
77877dd7cddfSDavid du Colombier 	"	{	Info[MA-1] = 1;	/* proviso bit */",
7788312a1df1SDavid du Colombier 	"#ifndef BFS",
77897dd7cddfSDavid du Colombier 	"		trpt->proviso = dfa_member(MA-1);",
7790312a1df1SDavid du Colombier 	"#endif",
77917dd7cddfSDavid du Colombier 	"		Info[MA-1] = 4;	/* off-stack bit */",
779200d97012SDavid du Colombier 	"		if (dfa_member(MA-1))",
779300d97012SDavid du Colombier 	"		{	ret_val = 1; /* off-stack */",
77947dd7cddfSDavid du Colombier 	"	#ifdef VERBOSE",
77957dd7cddfSDavid du Colombier 	"			printf(\"old state\\n\");",
77967dd7cddfSDavid du Colombier 	"	#endif",
779700d97012SDavid du Colombier 	"		} else",
779800d97012SDavid du Colombier 	"		{	ret_val = 2; /* on-stack */",
77997dd7cddfSDavid du Colombier 	"	#ifdef VERBOSE",
78007dd7cddfSDavid du Colombier 	"			printf(\"on-stack\\n\");",
78017dd7cddfSDavid du Colombier 	"	#endif",
78027dd7cddfSDavid du Colombier 	"		}",
780300d97012SDavid du Colombier 	"		goto done;",
78047dd7cddfSDavid du Colombier 	"	}",
78057dd7cddfSDavid du Colombier 	"#endif",
780600d97012SDavid du Colombier 	"	ret_val = 1;",
78077dd7cddfSDavid du Colombier 	"#ifdef VERBOSE",
78087dd7cddfSDavid du Colombier 	"	printf(\"old state\\n\");",
78097dd7cddfSDavid du Colombier 	"#endif",
781000d97012SDavid du Colombier 	"done:",
7811*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
7812*de2caf28SDavid du Colombier 	"	x_critical(BFS_STATE);",
7813*de2caf28SDavid du Colombier 	"#endif",
781400d97012SDavid du Colombier 	"#if NCORE>1 && !defined(SEP_STATE)",
781500d97012SDavid du Colombier 	"	leave_critical(GLOBAL_LOCK);",
781600d97012SDavid du Colombier 	"#endif",
781700d97012SDavid du Colombier 	"	return ret_val;	/* old state */",
78187dd7cddfSDavid du Colombier 	"}",
78197dd7cddfSDavid du Colombier "#endif",
78207dd7cddfSDavid du Colombier 
78217dd7cddfSDavid du Colombier 	"#if defined(BITSTATE) && defined(LC)",
78227dd7cddfSDavid du Colombier 	"int",
78237dd7cddfSDavid du Colombier 	"compact_stack(char *vin, int n)",	/* special case of HC4 */
78247dd7cddfSDavid du Colombier 	"{	int delta = 0;",
7825312a1df1SDavid du Colombier 	"	s_hash((uchar *)vin, n); /* sets K1 and K2 */",
78267dd7cddfSDavid du Colombier 		"#ifndef SAFETY",
78277dd7cddfSDavid du Colombier 	"	delta++;	/* room for state[0] |= 128 */",
78287dd7cddfSDavid du Colombier 		"#endif",
7829312a1df1SDavid du Colombier 	"	memcpy((char *) &comp_now + delta, (char *) &K1, WS);",
7830312a1df1SDavid du Colombier 	"	delta += WS;",
7831312a1df1SDavid du Colombier 	"	memcpy((char *) &comp_now + delta, (char *) &K2, WS);",
7832312a1df1SDavid du Colombier 	"	delta += WS; /* use all available bits */",
78337dd7cddfSDavid du Colombier 	"	return delta;",
78347dd7cddfSDavid du Colombier 	"}",
78357dd7cddfSDavid du Colombier 	"#endif",
78367dd7cddfSDavid du Colombier 
783700d97012SDavid du Colombier 	"#ifdef TRIX",
783800d97012SDavid du Colombier 	"void",
783900d97012SDavid du Colombier 	"sv_populate(void)",
784000d97012SDavid du Colombier 	"{	int i, cnt = 0;",
784100d97012SDavid du Colombier 	"	TRIX_v6 **base = processes;",
784200d97012SDavid du Colombier 	"	int bound = now._nr_pr; /* MAXPROC+1; */",
784300d97012SDavid du Colombier 	"#ifdef V_TRIX",
784400d97012SDavid du Colombier 	"	printf(\"%%4d: sv_populate\\n\", depth);",
784500d97012SDavid du Colombier 	"#endif",
784600d97012SDavid du Colombier 	"again:",
784700d97012SDavid du Colombier 	"	for (i = 0; i < bound; i++)",
784800d97012SDavid du Colombier 	"	{	if (base[i] != NULL)",
7849*de2caf28SDavid du Colombier 	"		{	H_el *tmp;",
785000d97012SDavid du Colombier 	"			int m, n; uchar *v;",
785100d97012SDavid du Colombier 	"#ifndef BFS",
785200d97012SDavid du Colombier 	"			if (base[i]->modified == 0)",
785300d97012SDavid du Colombier 	"			{	cnt++;",
785400d97012SDavid du Colombier 	"	#ifdef V_TRIX",
785500d97012SDavid du Colombier 	"				printf(\"%%4d: %%s %%d not modified\\n\",",
785600d97012SDavid du Colombier 	"				depth, (base == processes)?\"proc\":\"chan\", i);",
785700d97012SDavid du Colombier 	"	#endif",
785800d97012SDavid du Colombier 	"				continue;",
785900d97012SDavid du Colombier 	"			}",
786000d97012SDavid du Colombier 	"	#ifndef V_MOD",
786100d97012SDavid du Colombier 	"			base[i]->modified = 0;",
786200d97012SDavid du Colombier 	"	#endif",
786300d97012SDavid du Colombier 	"#endif",
786400d97012SDavid du Colombier 	"#ifdef TRIX_RIX",
786500d97012SDavid du Colombier 	"			if (base == processes)",
786600d97012SDavid du Colombier 	"			{	((P0 *)pptr(i))->_pid = 0;",
786700d97012SDavid du Colombier 	"			}",
786800d97012SDavid du Colombier 	"#endif",
786900d97012SDavid du Colombier 	"			n = base[i]->psize;",
787000d97012SDavid du Colombier 	"			v = base[i]->body;",
787100d97012SDavid du Colombier 	"			s_hash(v, n); /* sets j1_spin */",
787200d97012SDavid du Colombier 	"			tmp = H_tab[j1_spin];",
787300d97012SDavid du Colombier 	"			if (!tmp)	/* new */",
787400d97012SDavid du Colombier 	"			{	tmp = grab_state(n);",
787500d97012SDavid du Colombier 	"				H_tab[j1_spin] = tmp;",
787600d97012SDavid du Colombier 	"				m = 1; /* non-zero */",
787700d97012SDavid du Colombier 	"			} else",
7878*de2caf28SDavid du Colombier 	"			{  H_el *ntmp, *olst = (H_el *) 0;",
787900d97012SDavid du Colombier 	"			   for (;; hcmp++, olst = tmp, tmp = tmp->nxt)",
788000d97012SDavid du Colombier 	"			   { 	m = memcmp(((char *)&(tmp->state)), v, n);",
788100d97012SDavid du Colombier 	"				if (m == 0)	/* match */",
788200d97012SDavid du Colombier 	"				{	break;",
788300d97012SDavid du Colombier 	"				} else if (m < 0) /* insert */",
788400d97012SDavid du Colombier 	"				{	ntmp = grab_state(n);",
788500d97012SDavid du Colombier 	"					ntmp->nxt = tmp;",
788600d97012SDavid du Colombier 	"					if (!olst)",
788700d97012SDavid du Colombier 	"						H_tab[j1_spin] = ntmp;",
788800d97012SDavid du Colombier 	"					else",
788900d97012SDavid du Colombier 	"						olst->nxt = ntmp;",
789000d97012SDavid du Colombier 	"					tmp = ntmp;",
789100d97012SDavid du Colombier 	"					break;",
789200d97012SDavid du Colombier 	"				} else if (!tmp->nxt)	/* append */",
789300d97012SDavid du Colombier 	"				{	tmp->nxt = grab_state(n);",
789400d97012SDavid du Colombier 	"					tmp = tmp->nxt;",
789500d97012SDavid du Colombier 	"					break;",
789600d97012SDavid du Colombier 	"			}  }	}",
789700d97012SDavid du Colombier 	"			if (m != 0)",
789800d97012SDavid du Colombier 	"			{	memcpy((char *)&(tmp->state), v, n);",
789900d97012SDavid du Colombier 	"#if defined(AUTO_RESIZE) && !defined(BITSTATE)",
790000d97012SDavid du Colombier 	"				tmp->m_K1 = K1; /* set via s_hash */",
790100d97012SDavid du Colombier 	"#endif",
7902*de2caf28SDavid du Colombier 	"				if (verbose)",
7903*de2caf28SDavid du Colombier 	"				{	if (base == processes)",
790400d97012SDavid du Colombier 	"					{	_p_count[i]++;",
790500d97012SDavid du Colombier 	"					} else",
790600d97012SDavid du Colombier 	"					{	_c_count[i]++;",
7907*de2caf28SDavid du Colombier 	"			}	}	}",
790800d97012SDavid du Colombier 	"			now._ids_[cnt++] = (char *)&(tmp->state);",
790900d97012SDavid du Colombier 	"#ifdef TRIX_RIX",
791000d97012SDavid du Colombier 	"			if (base == processes)",
791100d97012SDavid du Colombier 	"			{	((P0 *)pptr(i))->_pid = i;",
7912*de2caf28SDavid du Colombier 	"				if (BASE > 0 && i > 0)",
7913*de2caf28SDavid du Colombier 	"				{	((P0 *)pptr(i))->_pid -= BASE;",
7914*de2caf28SDavid du Colombier 	"			}	}",
791500d97012SDavid du Colombier 	"#endif",
791600d97012SDavid du Colombier 	"	}	}",
791700d97012SDavid du Colombier #if 0
791800d97012SDavid du Colombier 	if a process appears or disappears: always secure a full sv_populate
791900d97012SDavid du Colombier 	(channels come and go only with a process)
792000d97012SDavid du Colombier 
792100d97012SDavid du Colombier 	only one process can disappear per step
792200d97012SDavid du Colombier 	but any nr of channels can be removed at the same time
792300d97012SDavid du Colombier 		if a process disappears, all subsequent entries
792400d97012SDavid du Colombier 		are then in the wrong place in the _ids_ list
792500d97012SDavid du Colombier 		and need to be recomputed
792600d97012SDavid du Colombier 	but we do not need to fill out with zeros
792700d97012SDavid du Colombier 		because vsize prevents them being used
792800d97012SDavid du Colombier #endif
792900d97012SDavid du Colombier 	"	/* do the same for all channels */",
793000d97012SDavid du Colombier 	"	if (base == processes)",
793100d97012SDavid du Colombier 	"	{	base = channels;",
793200d97012SDavid du Colombier 	"		bound = now._nr_qs; /* MAXQ+1; */",
793300d97012SDavid du Colombier 	"		goto again;",
793400d97012SDavid du Colombier 	"	}",
793500d97012SDavid du Colombier 	"}",
793600d97012SDavid du Colombier 	"#endif\n",
7937*de2caf28SDavid du Colombier 	"#if !defined(BFS_PAR) || (!defined(BITSTATE) && !defined(USE_TDH))",
79387dd7cddfSDavid du Colombier 	"int",
7939*de2caf28SDavid du Colombier 	"h_store(char *vin, int nin)	/* hash table storage */",
7940*de2caf28SDavid du Colombier 	"{	H_el *ntmp;",
7941*de2caf28SDavid du Colombier 	"	H_el *tmp, *olst = (H_el *) 0;",
79427dd7cddfSDavid du Colombier 	"	char *v; int n, m=0;",
7943f3793cddSDavid du Colombier 	" #ifdef HC",
7944f3793cddSDavid du Colombier 	"	uchar rem_a;",
7945f3793cddSDavid du Colombier 	" #endif",
794600d97012SDavid du Colombier 	" #ifdef TRIX",
794700d97012SDavid du Colombier 	"	sv_populate();	/* update proc and chan ids */",
794800d97012SDavid du Colombier 	" #endif",
7949312a1df1SDavid du Colombier 	" #ifdef NOCOMP",	/* defined by BITSTATE */
79507dd7cddfSDavid du Colombier 	"	#if defined(BITSTATE) && defined(LC)",
79517dd7cddfSDavid du Colombier 	"	if (S_Tab == H_tab)",
79527dd7cddfSDavid du Colombier 	"	{	v = (char *) &comp_now;",
79537dd7cddfSDavid du Colombier 	"		n = compact_stack(vin, nin);",
79547dd7cddfSDavid du Colombier 	"	} else",
79557dd7cddfSDavid du Colombier 	"	{	v = vin; n = nin;",
7956219b2ee8SDavid du Colombier 	"	}",
7957219b2ee8SDavid du Colombier 	"	#else",
79587dd7cddfSDavid du Colombier 	"	v = vin; n = nin;",
79597dd7cddfSDavid du Colombier 	"	#endif",
79607dd7cddfSDavid du Colombier 	" #else",
79617dd7cddfSDavid du Colombier 	"	v = (char *) &comp_now;",
7962f3793cddSDavid du Colombier 	"	#ifdef HC",
796300d97012SDavid du Colombier 	"	rem_a = now._a_t;",	/* new 5.0 */
7964f3793cddSDavid du Colombier 	"	now._a_t = 0;",	/* for hashing/state matching to work right */
7965f3793cddSDavid du Colombier 	"	#endif",
796600d97012SDavid du Colombier 	"	n = compress(vin, nin);", /* with HC, this calls s_hash -- but on vin, not on v... */
7967f3793cddSDavid du Colombier 	"	#ifdef HC",
796800d97012SDavid du Colombier 	"	now._a_t = rem_a;",	/* new 5.0 */
7969f3793cddSDavid du Colombier 	"	#endif",
797000d97012SDavid du Colombier 		/* with HC4 -a, compress copies K1 and K2 into v[], leaving v[0] free for the a-bit */
79717dd7cddfSDavid du Colombier 		"#ifndef SAFETY",
79727dd7cddfSDavid du Colombier 	"	if (S_A)",
79737dd7cddfSDavid du Colombier 	"	{	v[0] = 0;	/* _a_t  */",
79747dd7cddfSDavid du Colombier 			"#ifndef NOFAIR",
79757dd7cddfSDavid du Colombier 	"		if (S_A > NFAIR)",
79767dd7cddfSDavid du Colombier 	"		for (m = 0; m < NFAIR; m++)",
79777dd7cddfSDavid du Colombier 	"			v[m+1] = 0;	/* _cnt[] */",
79787dd7cddfSDavid du Colombier 			"#endif",
79797dd7cddfSDavid du Colombier 	"		m = 0;",
79807dd7cddfSDavid du Colombier 	"	}",
79817dd7cddfSDavid du Colombier 	"	#endif",
79827dd7cddfSDavid du Colombier 	" #endif",
79837dd7cddfSDavid du Colombier 	" #if !defined(HC) && !(defined(BITSTATE) && defined(LC))",
7984219b2ee8SDavid du Colombier 	"	s_hash((uchar *)v, n);",
79857dd7cddfSDavid du Colombier 	" #endif",
7986*de2caf28SDavid du Colombier 	"	/* for BFS_PAR we can only get here in BITSTATE mode */",
7987*de2caf28SDavid du Colombier 	"	/* and in that case we don't use locks */",
7988*de2caf28SDavid du Colombier 	" #if defined(BFS_PAR) && !defined(BFS_SEP_HASH)",
7989*de2caf28SDavid du Colombier 	"	e_critical(BFS_ID);	/* bfs_par / h_store */",
799000d97012SDavid du Colombier 	" #endif",
7991*de2caf28SDavid du Colombier 	" #if NCORE>1 && !defined(SEP_STATE) && !defined(BITSTATE)",
7992*de2caf28SDavid du Colombier 	"	enter_critical(CS_ID);",
7993*de2caf28SDavid du Colombier 	" #endif",
799400d97012SDavid du Colombier 	"	tmp = H_tab[j1_spin];",
7995219b2ee8SDavid du Colombier 	"	if (!tmp)",
7996*de2caf28SDavid du Colombier 	"	{  tmp = grab_state(n);", /* no zero-returns with bfs_par */
799700d97012SDavid du Colombier 	" #if NCORE>1",
799800d97012SDavid du Colombier 	"	   if (!tmp)",
799900d97012SDavid du Colombier 	"	   {	/* if we get here -- we've already issued a warning */",
800000d97012SDavid du Colombier 	"		/* but we want to allow the normal distributed termination */",
800100d97012SDavid du Colombier 	"		/* to collect the stats on all cpus in the wrapup */",
800200d97012SDavid du Colombier 	"	#if !defined(SEP_STATE) && !defined(BITSTATE)",
800300d97012SDavid du Colombier 	"		leave_critical(CS_ID);",
800400d97012SDavid du Colombier 	"	#endif",
800500d97012SDavid du Colombier 	"		return 1; /* allow normal termination */",
800600d97012SDavid du Colombier 	"	   }",
800700d97012SDavid du Colombier 	" #endif",
800800d97012SDavid du Colombier 	"	   H_tab[j1_spin] = tmp;",
8009219b2ee8SDavid du Colombier 	"	} else",
8010219b2ee8SDavid du Colombier 	"	{  for (;; hcmp++, olst = tmp, tmp = tmp->nxt)",
8011219b2ee8SDavid du Colombier 	"	   {   /* skip the _a_t and the _cnt bytes */",
80127dd7cddfSDavid du Colombier 	" #ifdef COLLAPSE",
80137dd7cddfSDavid du Colombier 	"		if (tmp->ln != 0)",
80147dd7cddfSDavid du Colombier 	"		{	if (!tmp->nxt) goto Append;",
80157dd7cddfSDavid du Colombier 	"			continue;",
80167dd7cddfSDavid du Colombier 	"		}",
80177dd7cddfSDavid du Colombier 	" #endif",
80187dd7cddfSDavid du Colombier 	"		m = memcmp(((char *)&(tmp->state)) + S_A, ",
80197dd7cddfSDavid du Colombier 	"			v + S_A, n - S_A);",
80207dd7cddfSDavid du Colombier 	"		if (m == 0) {",
80217dd7cddfSDavid du Colombier 	" #ifdef SAFETY",
80227dd7cddfSDavid du Colombier 			"#define wasnew	0",
80237dd7cddfSDavid du Colombier 	" #else",
80247dd7cddfSDavid du Colombier 	"		int wasnew = 0;",
80257dd7cddfSDavid du Colombier 	" #endif",
80267dd7cddfSDavid du Colombier 
8027*de2caf28SDavid du Colombier 	" #if !defined(SAFETY) && !defined(NOCOMP)",
8028219b2ee8SDavid du Colombier 	"		if (S_A)",
8029219b2ee8SDavid du Colombier 	"		{ if ((((char *)&(tmp->state))[0] & V_A) != V_A)",
8030219b2ee8SDavid du Colombier 	"		  {	wasnew = 1; nShadow++;",
8031219b2ee8SDavid du Colombier 	"			((char *)&(tmp->state))[0] |= V_A;",
8032219b2ee8SDavid du Colombier 	"		  }",
80337dd7cddfSDavid du Colombier 		"#ifndef NOFAIR",
8034219b2ee8SDavid du Colombier 	"		  if (S_A > NFAIR)",
8035219b2ee8SDavid du Colombier 	"		  {	/* 0 <= now._cnt[now._a_t&1] < MAXPROC */",
8036*de2caf28SDavid du Colombier 	"			uint ci, bp; /* index, bit pos */",
8037219b2ee8SDavid du Colombier 	"			ci = (now._cnt[now._a_t&1] / 8);",
8038219b2ee8SDavid du Colombier 	"			bp = (now._cnt[now._a_t&1] - 8*ci);",
8039219b2ee8SDavid du Colombier 	"			if (now._a_t&1)	/* use tail-bits in _cnt */",
8040219b2ee8SDavid du Colombier 	"			{	ci = (NFAIR - 1) - ci;",
8041219b2ee8SDavid du Colombier 	"				bp = 7 - bp; /* bp = 0..7 */",
8042219b2ee8SDavid du Colombier 	"			}",
8043219b2ee8SDavid du Colombier 	"			ci++;	/* skip over _a_t */",
8044219b2ee8SDavid du Colombier 	"			bp = 1 << bp;	/* the bit mask */",
8045219b2ee8SDavid du Colombier 	"			if ((((char *)&(tmp->state))[ci] & bp)==0)",
80467dd7cddfSDavid du Colombier 	"			{	if (!wasnew)",
80477dd7cddfSDavid du Colombier 	"				{	wasnew = 1;",
80487dd7cddfSDavid du Colombier 	"					nShadow++;",
80497dd7cddfSDavid du Colombier 	"				}",
8050219b2ee8SDavid du Colombier 	"				((char *)&(tmp->state))[ci] |= bp;",
8051219b2ee8SDavid du Colombier 	"			}",
80527dd7cddfSDavid du Colombier 	"		   }",
80537dd7cddfSDavid du Colombier 	"		   /* else: wasnew == 0, i.e., old state */",
80547dd7cddfSDavid du Colombier 		"#endif",
8055219b2ee8SDavid du Colombier 	"		}",
8056219b2ee8SDavid du Colombier 	" #endif",
80577dd7cddfSDavid du Colombier 
805800d97012SDavid du Colombier 	" #if NCORE>1",
8059*de2caf28SDavid du Colombier 	"		Lstate = (H_el *) tmp;	/* h_store */",
806000d97012SDavid du Colombier 	" #endif",
806100d97012SDavid du Colombier 
8062219b2ee8SDavid du Colombier 	"#ifdef FULLSTACK",
80637dd7cddfSDavid du Colombier 		"#ifndef SAFETY",	/* or else wasnew == 0 */
8064219b2ee8SDavid du Colombier 	"		if (wasnew)",
8065*de2caf28SDavid du Colombier 	"		{	Lstate = (H_el *) tmp;	/* h_store */",
80667dd7cddfSDavid du Colombier 	"			tmp->tagged |= V_A;",
80677dd7cddfSDavid du Colombier 	"			if ((now._a_t&1)",
80687dd7cddfSDavid du Colombier 	"			&& (tmp->tagged&A_V)",
80697dd7cddfSDavid du Colombier 	"			&& depth > A_depth)",
80707dd7cddfSDavid du Colombier 	"			{",
80717dd7cddfSDavid du Colombier 	"intersect:",
80727dd7cddfSDavid du Colombier 		"#ifdef CHECK",
807300d97012SDavid du Colombier 	" #if NCORE>1",
807400d97012SDavid du Colombier 	"	printf(\"cpu%%d: \", core_id);",
807500d97012SDavid du Colombier 	" #endif",
80767dd7cddfSDavid du Colombier 	"	printf(\"1st dfs-stack intersected on state %%d+\\n\",",
80777dd7cddfSDavid du Colombier 	"		(int) tmp->st_id);",
80787dd7cddfSDavid du Colombier 		"#endif",
807900d97012SDavid du Colombier 
8080*de2caf28SDavid du Colombier 	" #if defined(BFS_PAR) && !defined(BFS_SEP_HASH)",
8081*de2caf28SDavid du Colombier 	"				x_critical(BFS_ID);",
8082*de2caf28SDavid du Colombier 	" #endif",
808300d97012SDavid du Colombier 	" #if NCORE>1 && !defined(SEP_STATE) && !defined(BITSTATE)",
808400d97012SDavid du Colombier 	"				leave_critical(CS_ID);",
808500d97012SDavid du Colombier 	" #endif",
808600d97012SDavid du Colombier 
80877dd7cddfSDavid du Colombier 	"				return 3;",
80887dd7cddfSDavid du Colombier 	"			}",
8089219b2ee8SDavid du Colombier 		"#ifdef CHECK",
809000d97012SDavid du Colombier 	" #if NCORE>1",
809100d97012SDavid du Colombier 	"	printf(\"cpu%%d: \", core_id);",
809200d97012SDavid du Colombier 	" #endif",
8093219b2ee8SDavid du Colombier 	"	printf(\"\tNew state %%d+\\n\", (int) tmp->st_id);",
8094219b2ee8SDavid du Colombier 		"#endif",
8095219b2ee8SDavid du Colombier 		"#ifdef DEBUG",
80967dd7cddfSDavid du Colombier 	"	dumpstate(1, (char *)&(tmp->state),n,tmp->tagged);",
8097219b2ee8SDavid du Colombier 		"#endif",
8098*de2caf28SDavid du Colombier 	" #if defined(BFS_PAR) && !defined(BFS_SEP_HASH)",
8099*de2caf28SDavid du Colombier 	"			x_critical(BFS_ID);",
8100*de2caf28SDavid du Colombier 	" #endif",
810100d97012SDavid du Colombier 	" #if NCORE>1 && !defined(SEP_STATE) && !defined(BITSTATE)",
810200d97012SDavid du Colombier 	"			leave_critical(CS_ID);",
810300d97012SDavid du Colombier 	" #endif",
8104219b2ee8SDavid du Colombier 	"			return 0;",
81057dd7cddfSDavid du Colombier 	"		} else",
81067dd7cddfSDavid du Colombier 		"#endif",
81077dd7cddfSDavid du Colombier 	"		if ((S_A)?(tmp->tagged&V_A):tmp->tagged)",
8108*de2caf28SDavid du Colombier 	"		{	Lstate = (H_el *) tmp;	/* h_store */",
81097dd7cddfSDavid du Colombier 		"#ifndef SAFETY",
81107dd7cddfSDavid du Colombier 	"			/* already on current dfs stack */",
81117dd7cddfSDavid du Colombier 	"			/* but may also be on 1st dfs stack */",
81127dd7cddfSDavid du Colombier 	"			if ((now._a_t&1)",
81137dd7cddfSDavid du Colombier 	"			&& (tmp->tagged&A_V)",
81147dd7cddfSDavid du Colombier 
81157dd7cddfSDavid du Colombier 	"			&& depth > A_depth",
81167dd7cddfSDavid du Colombier 		/* new (Zhang's example) */
81177dd7cddfSDavid du Colombier 		"#ifndef NOFAIR",
81187dd7cddfSDavid du Colombier 	"			&& (!fairness || now._cnt[1] <= 1)",
81197dd7cddfSDavid du Colombier 		"#endif",
81207dd7cddfSDavid du Colombier 	"			)",
81217dd7cddfSDavid du Colombier 
81227dd7cddfSDavid du Colombier 	"				goto intersect;",
81237dd7cddfSDavid du Colombier 		"#endif",
8124219b2ee8SDavid du Colombier 		"#ifdef CHECK",
812500d97012SDavid du Colombier 	" #if NCORE>1",
812600d97012SDavid du Colombier 	"	printf(\"cpu%%d: \", core_id);",
812700d97012SDavid du Colombier 	" #endif",
81287dd7cddfSDavid du Colombier 	"	printf(\"\tStack state %%d\\n\", (int) tmp->st_id);",
8129219b2ee8SDavid du Colombier 		"#endif",
8130219b2ee8SDavid du Colombier 		"#ifdef DEBUG",
81317dd7cddfSDavid du Colombier 	"	dumpstate(0, (char *)&(tmp->state),n,tmp->tagged);",
8132219b2ee8SDavid du Colombier 		"#endif",
8133*de2caf28SDavid du Colombier 	" #if defined(BFS_PAR) && !defined(BFS_SEP_HASH)",
8134*de2caf28SDavid du Colombier 	"			x_critical(BFS_ID);",
8135*de2caf28SDavid du Colombier 	" #endif",
813600d97012SDavid du Colombier 	" #if NCORE>1 && !defined(SEP_STATE) && !defined(BITSTATE)",
813700d97012SDavid du Colombier 	"			leave_critical(CS_ID);",
813800d97012SDavid du Colombier 	" #endif",
81397dd7cddfSDavid du Colombier 	"			return 2; /* match on stack */",
8140219b2ee8SDavid du Colombier 	"		}",
8141219b2ee8SDavid du Colombier 	"#else",
8142219b2ee8SDavid du Colombier 	"		if (wasnew)",
8143219b2ee8SDavid du Colombier 	"		{",
8144219b2ee8SDavid du Colombier 		"#ifdef CHECK",
814500d97012SDavid du Colombier 	" #if NCORE>1",
814600d97012SDavid du Colombier 	"	printf(\"cpu%%d: \", core_id);",
814700d97012SDavid du Colombier 	" #endif",
8148219b2ee8SDavid du Colombier 	"	printf(\"\tNew state %%d+\\n\", (int) tmp->st_id);",
8149219b2ee8SDavid du Colombier 		"#endif",
8150219b2ee8SDavid du Colombier 		"#ifdef DEBUG",
8151219b2ee8SDavid du Colombier 	"	dumpstate(1, (char *)&(tmp->state), n, 0);",
8152219b2ee8SDavid du Colombier 		"#endif",
8153*de2caf28SDavid du Colombier 	" #if defined(BFS_PAR) && !defined(BFS_SEP_HASH)",
8154*de2caf28SDavid du Colombier 	"			x_critical(BFS_ID);",
8155*de2caf28SDavid du Colombier 	" #endif",
815600d97012SDavid du Colombier 	" #if NCORE>1 && !defined(SEP_STATE) && !defined(BITSTATE)",
815700d97012SDavid du Colombier 	"			leave_critical(CS_ID);",
815800d97012SDavid du Colombier 	" #endif",
8159219b2ee8SDavid du Colombier 	"			return 0;",
8160219b2ee8SDavid du Colombier 	"		}",
81617dd7cddfSDavid du Colombier 	"#endif",
8162219b2ee8SDavid du Colombier 		"#ifdef CHECK",
816300d97012SDavid du Colombier 	"#if NCORE>1",
816400d97012SDavid du Colombier 	"	printf(\"cpu%%d: \", core_id);",
816500d97012SDavid du Colombier 	"#endif",
8166219b2ee8SDavid du Colombier 	"	printf(\"\tOld state %%d\\n\", (int) tmp->st_id);",
8167219b2ee8SDavid du Colombier 		"#endif",
8168219b2ee8SDavid du Colombier 		"#ifdef DEBUG",
8169219b2ee8SDavid du Colombier 	"	dumpstate(0, (char *)&(tmp->state), n, 0);",
8170219b2ee8SDavid du Colombier 		"#endif",
817100d97012SDavid du Colombier 	"#if defined(BCS)",
817200d97012SDavid du Colombier 	"  #ifdef CONSERVATIVE",
817300d97012SDavid du Colombier 	"	if (tmp->ctx_low > trpt->sched_limit)",
817400d97012SDavid du Colombier 	"	{	tmp->ctx_low = trpt->sched_limit;",
8175*de2caf28SDavid du Colombier 	"		tmp->ctx_pid[(now._last)/8] = 1 << ((now._last)%%8); /* new */",
817600d97012SDavid du Colombier 	"	#ifdef CHECK",
817700d97012SDavid du Colombier 	"		#if NCORE>1",
817800d97012SDavid du Colombier 	"		printf(\"cpu%%d: \", core_id);",
817900d97012SDavid du Colombier 	"		#endif",
818000d97012SDavid du Colombier 	"		printf(\"\t\tRevisit with fewer context switches\\n\");",
818100d97012SDavid du Colombier 	"	#endif",
818200d97012SDavid du Colombier 	"		nstates--;",
8183*de2caf28SDavid du Colombier 	"		#if defined(BFS_PAR) && !defined(BFS_SEP_HASH)",
8184*de2caf28SDavid du Colombier 	"		x_critical(BFS_ID);",
8185*de2caf28SDavid du Colombier 	"		#endif",
818600d97012SDavid du Colombier 	"		#if NCORE>1 && !defined(SEP_STATE) && !defined(BITSTATE)",
818700d97012SDavid du Colombier 	"		leave_critical(CS_ID);",
818800d97012SDavid du Colombier 	"		#endif",
818900d97012SDavid du Colombier 	"		return 0;",
819000d97012SDavid du Colombier 	"	} else if ((tmp->ctx_low == trpt->sched_limit",
8191*de2caf28SDavid du Colombier 	"	&&   (tmp->ctx_pid[(now._last)/8] & ( 1 << ((now._last)%%8) )) == 0 ))",
8192*de2caf28SDavid du Colombier 	"	{	tmp->ctx_pid[(now._last)/8] |= 1 << ((now._last)%%8); /* add */",
819300d97012SDavid du Colombier 	"	#ifdef CHECK",
819400d97012SDavid du Colombier 	"		#if NCORE>1",
819500d97012SDavid du Colombier 	"		printf(\"cpu%%d: \", core_id);",
819600d97012SDavid du Colombier 	"		#endif",
819700d97012SDavid du Colombier 	"		printf(\"\t\tRevisit with same nr of context switches\\n\");",
819800d97012SDavid du Colombier 	"	#endif",
819900d97012SDavid du Colombier 	"		nstates--;",
8200*de2caf28SDavid du Colombier 	"		#if defined(BFS_PAR) && !defined(BFS_SEP_HASH)",
8201*de2caf28SDavid du Colombier 	"		x_critical(BFS_ID);",
8202*de2caf28SDavid du Colombier 	"		#endif",
820300d97012SDavid du Colombier 	"		#if NCORE>1 && !defined(SEP_STATE) && !defined(BITSTATE)",
820400d97012SDavid du Colombier 	"		leave_critical(CS_ID);",
820500d97012SDavid du Colombier 	"		#endif",
820600d97012SDavid du Colombier 	"		return 0;",
820700d97012SDavid du Colombier 	"	}",
820800d97012SDavid du Colombier 	"  #endif",
820900d97012SDavid du Colombier 	"#endif",
8210219b2ee8SDavid du Colombier 	" #ifdef REACH",
8211219b2ee8SDavid du Colombier 	"	if (tmp->D > depth)",
8212219b2ee8SDavid du Colombier 	"	{	tmp->D = depth;",
8213219b2ee8SDavid du Colombier 	"	#ifdef CHECK",
821400d97012SDavid du Colombier 	"		#if NCORE>1",
821500d97012SDavid du Colombier 	"		printf(\"cpu%%d: \", core_id);",
821600d97012SDavid du Colombier 	"		#endif",
8217219b2ee8SDavid du Colombier 	"		printf(\"\t\tReVisiting (from smaller depth)\\n\");",
8218219b2ee8SDavid du Colombier 	"	#endif",
8219219b2ee8SDavid du Colombier 	"		nstates--;",
8220*de2caf28SDavid du Colombier 	"	#if defined(BFS_PAR) && !defined(BFS_SEP_HASH)",
8221*de2caf28SDavid du Colombier 	"		x_critical(BFS_ID);",
8222*de2caf28SDavid du Colombier 	"	#endif",
822300d97012SDavid du Colombier 	"	#if NCORE>1 && !defined(SEP_STATE) && !defined(BITSTATE)",
822400d97012SDavid du Colombier 	"		leave_critical(CS_ID);",
822500d97012SDavid du Colombier 	"	#endif",
8226312a1df1SDavid du Colombier #if 0
822700d97012SDavid du Colombier   a possible variation of iterative search for shortest counter-example
822800d97012SDavid du Colombier   (pan -i and pan -I) suggested by Pierre Moro (for safety properties):
8229312a1df1SDavid du Colombier   state revisits on shorter depths do not start until after
8230312a1df1SDavid du Colombier   the first counter-example is found.  this assumes that the max search
8231312a1df1SDavid du Colombier   depth is set large enough that a first (possibly long) counter-example
8232312a1df1SDavid du Colombier   can be found
8233312a1df1SDavid du Colombier   if set too short, this variant can miss the counter-example, even if
8234312a1df1SDavid du Colombier   it would otherwise be shorter than the depth-limit.
8235312a1df1SDavid du Colombier   (p.m. unsure if this preserves the guarantee of finding the
823600d97012SDavid du Colombier    shortest counter-example - so not enabled by default)
8237312a1df1SDavid du Colombier 	"		if (errors > 0 && iterative)", /* Moro */
8238312a1df1SDavid du Colombier #endif
8239219b2ee8SDavid du Colombier 	"		return 0;",
8240219b2ee8SDavid du Colombier 	"	}",
8241219b2ee8SDavid du Colombier 	" #endif",
824200d97012SDavid du Colombier 	" #if (defined(BFS) && defined(Q_PROVISO)) || NCORE>1",
8243*de2caf28SDavid du Colombier 	"		Lstate = (H_el *) tmp;	/* h_store */",
8244*de2caf28SDavid du Colombier 	" #endif",
8245*de2caf28SDavid du Colombier 	" #if defined(BFS_PAR) && !defined(BFS_SEP_HASH)",
8246*de2caf28SDavid du Colombier 	"		x_critical(BFS_ID);",
8247312a1df1SDavid du Colombier 	" #endif",
824800d97012SDavid du Colombier 	" #if NCORE>1 && !defined(SEP_STATE) && !defined(BITSTATE)",
824900d97012SDavid du Colombier 	"		leave_critical(CS_ID);",
825000d97012SDavid du Colombier 	" #endif",
8251219b2ee8SDavid du Colombier 	"		return 1; /* match outside stack */",
8252219b2ee8SDavid du Colombier 	"	       } else if (m < 0)",
8253219b2ee8SDavid du Colombier 	"	       {	/* insert state before tmp */",
8254219b2ee8SDavid du Colombier 	"			ntmp = grab_state(n);",
825500d97012SDavid du Colombier 	" #if NCORE>1",
825600d97012SDavid du Colombier 	"			if (!ntmp)",
825700d97012SDavid du Colombier 	"			{",
825800d97012SDavid du Colombier 	"	#if !defined(SEP_STATE) && !defined(BITSTATE)",
825900d97012SDavid du Colombier 	"				leave_critical(CS_ID);",
826000d97012SDavid du Colombier 	"	#endif",
826100d97012SDavid du Colombier 	"				return 1;  /* allow normal termination */",
826200d97012SDavid du Colombier 	"			}",
826300d97012SDavid du Colombier 	" #endif",
8264219b2ee8SDavid du Colombier 	"			ntmp->nxt = tmp;",
8265219b2ee8SDavid du Colombier 	"			if (!olst)",
826600d97012SDavid du Colombier 	"				H_tab[j1_spin] = ntmp;",
8267219b2ee8SDavid du Colombier 	"			else",
8268219b2ee8SDavid du Colombier 	"				olst->nxt = ntmp;",
8269219b2ee8SDavid du Colombier 	"			tmp = ntmp;",
8270219b2ee8SDavid du Colombier 	"			break;",
8271219b2ee8SDavid du Colombier 	"	       } else if (!tmp->nxt)",
8272219b2ee8SDavid du Colombier 	"	       {	/* append after tmp */",
8273312a1df1SDavid du Colombier 	" #ifdef COLLAPSE",
8274312a1df1SDavid du Colombier 	"Append:",
8275312a1df1SDavid du Colombier 	" #endif",
8276312a1df1SDavid du Colombier 	"			tmp->nxt = grab_state(n);",
827700d97012SDavid du Colombier 	" #if NCORE>1",
827800d97012SDavid du Colombier 	"			if (!tmp->nxt)",
827900d97012SDavid du Colombier 	"			{",
828000d97012SDavid du Colombier 	"	#if !defined(SEP_STATE) && !defined(BITSTATE)",
828100d97012SDavid du Colombier 	"				leave_critical(CS_ID);",
828200d97012SDavid du Colombier 	"	#endif",
828300d97012SDavid du Colombier 	"				return 1;  /* allow normal termination */",
828400d97012SDavid du Colombier 	"			}",
828500d97012SDavid du Colombier 	" #endif",
8286219b2ee8SDavid du Colombier 	"			tmp = tmp->nxt;",
8287219b2ee8SDavid du Colombier 	"			break;",
8288219b2ee8SDavid du Colombier 	"	   }   }",
8289219b2ee8SDavid du Colombier 	"	}",
8290219b2ee8SDavid du Colombier 	" #ifdef CHECK",
8291219b2ee8SDavid du Colombier 	"	tmp->st_id = (unsigned) nstates;",
829200d97012SDavid du Colombier 	" #if NCORE>1",
829300d97012SDavid du Colombier 	"	printf(\"cpu%%d: \", core_id);",
829400d97012SDavid du Colombier 	" #endif",
82957dd7cddfSDavid du Colombier 		"#ifdef BITSTATE",
82967dd7cddfSDavid du Colombier 	"	printf(\"	Push state %%d\\n\", ((int) nstates) - 1);",
82977dd7cddfSDavid du Colombier 		"#else",
8298219b2ee8SDavid du Colombier 	"	printf(\"	New state %%d\\n\", (int) nstates);",
8299219b2ee8SDavid du Colombier 		"#endif",
83007dd7cddfSDavid du Colombier 	"#endif",
830100d97012SDavid du Colombier 	" #if defined(BCS)",
830200d97012SDavid du Colombier 	"	tmp->ctx_low = trpt->sched_limit;",
830300d97012SDavid du Colombier 	"	#ifdef CONSERVATIVE",
8304*de2caf28SDavid du Colombier 	"	tmp->ctx_pid[(now._last)/8] = 1 << ((now._last)%%8); /* new limit */",
830500d97012SDavid du Colombier 	"	#endif",
830600d97012SDavid du Colombier 	" #endif",
8307f3793cddSDavid du Colombier 	" #if !defined(SAFETY) || defined(REACH)",
8308219b2ee8SDavid du Colombier 	"	tmp->D = depth;",
8309219b2ee8SDavid du Colombier 	" #endif",
8310*de2caf28SDavid du Colombier 	" #if !defined(SAFETY) && !defined(NOCOMP)",
8311219b2ee8SDavid du Colombier 	"	if (S_A)",
8312219b2ee8SDavid du Colombier 	"	{	v[0] = V_A;",
83137dd7cddfSDavid du Colombier 		"#ifndef NOFAIR",
8314219b2ee8SDavid du Colombier 	"		if (S_A > NFAIR)",
8315*de2caf28SDavid du Colombier 	"		{	uint ci, bp; /* as above */",
8316219b2ee8SDavid du Colombier 	"			ci = (now._cnt[now._a_t&1] / 8);",
8317219b2ee8SDavid du Colombier 	"			bp = (now._cnt[now._a_t&1] - 8*ci);",
8318219b2ee8SDavid du Colombier 	"			if (now._a_t&1)",
8319219b2ee8SDavid du Colombier 	"			{	ci = (NFAIR - 1) - ci;",
8320219b2ee8SDavid du Colombier 	"				bp = 7 - bp; /* bp = 0..7 */",
8321219b2ee8SDavid du Colombier 	"			}",
8322219b2ee8SDavid du Colombier 	"			v[1+ci] = 1 << bp;",
83237dd7cddfSDavid du Colombier 	"		}",
83247dd7cddfSDavid du Colombier 		"#endif",
83257dd7cddfSDavid du Colombier 	"	}",
83267dd7cddfSDavid du Colombier 	" #endif",
832700d97012SDavid du Colombier 	" #if defined(AUTO_RESIZE) && !defined(BITSTATE)",
832800d97012SDavid du Colombier 	"	tmp->m_K1 = K1;",
832900d97012SDavid du Colombier 	" #endif",
8330219b2ee8SDavid du Colombier 	"	memcpy(((char *)&(tmp->state)), v, n);",
8331219b2ee8SDavid du Colombier 	" #ifdef FULLSTACK",
8332219b2ee8SDavid du Colombier 	"	tmp->tagged = (S_A)?V_A:(depth+1);",
8333219b2ee8SDavid du Colombier 		"#ifdef DEBUG",
8334219b2ee8SDavid du Colombier 	"		dumpstate(-1, v, n, tmp->tagged);",
8335219b2ee8SDavid du Colombier 		"#endif",
8336*de2caf28SDavid du Colombier 	"	Lstate = (H_el *) tmp;	/* end of h_store */",
8337219b2ee8SDavid du Colombier 	" #else",
8338219b2ee8SDavid du Colombier 	"	#ifdef DEBUG",
8339219b2ee8SDavid du Colombier 	"		dumpstate(-1, v, n, 0);",
8340219b2ee8SDavid du Colombier 	"	#endif",
834100d97012SDavid du Colombier 	"	#if NCORE>1",
8342*de2caf28SDavid du Colombier 	"		Lstate = (H_el *) tmp;	/* end of h_store */",
8343219b2ee8SDavid du Colombier 	"	#endif",
834400d97012SDavid du Colombier 	" #endif",
834500d97012SDavid du Colombier 
8346*de2caf28SDavid du Colombier 	" #if defined(BFS_PAR) && !defined(BFS_SEP_HASH)",
8347*de2caf28SDavid du Colombier 	"		x_critical(BFS_ID);",
8348*de2caf28SDavid du Colombier 	" #endif",
834900d97012SDavid du Colombier 	" #if NCORE>1",
835000d97012SDavid du Colombier 	"	#ifdef V_PROVISO",
835100d97012SDavid du Colombier 	"		tmp->cpu_id = core_id;",
835200d97012SDavid du Colombier 	"	#endif",
835300d97012SDavid du Colombier 	"	#if !defined(SEP_STATE) && !defined(BITSTATE)",
835400d97012SDavid du Colombier 	"		leave_critical(CS_ID);",
835500d97012SDavid du Colombier 	"	#endif",
835600d97012SDavid du Colombier 	" #endif",
835700d97012SDavid du Colombier 
8358219b2ee8SDavid du Colombier 	"	return 0;",
8359*de2caf28SDavid du Colombier 	"}",	/* end of h_store */
8360*de2caf28SDavid du Colombier 	"#endif", /* !BFS_PAR || !USE_TDH */
8361*de2caf28SDavid du Colombier 	"",
8362*de2caf28SDavid du Colombier 	"void",
8363*de2caf28SDavid du Colombier 	"o_hash32(uchar *s, int len, int h) /* 32-bit, like d_sfh, but with seed */",
8364*de2caf28SDavid du Colombier 	"{       uint32_t tmp;",
8365*de2caf28SDavid du Colombier 	"        int rem;",
8366*de2caf28SDavid du Colombier 	"",
8367*de2caf28SDavid du Colombier 	"        rem = len & 3;",
8368*de2caf28SDavid du Colombier 	"        len >>= 2;",
8369*de2caf28SDavid du Colombier 	"",
8370*de2caf28SDavid du Colombier 	"        for ( ; len > 0; len--)",
8371*de2caf28SDavid du Colombier 	"        {       h  += get16bits(s);",
8372*de2caf28SDavid du Colombier 	"                tmp = (get16bits(s+2) << 11) ^ h;",
8373*de2caf28SDavid du Colombier 	"                h   = (h << 16) ^ tmp;",
8374*de2caf28SDavid du Colombier 	"                s  += 2*sizeof(uint16_t);",
8375*de2caf28SDavid du Colombier 	"                h  += h >> 11;",
8376*de2caf28SDavid du Colombier 	"        }",
8377*de2caf28SDavid du Colombier 	"        switch (rem) {",
8378*de2caf28SDavid du Colombier 	"        case 3: h += get16bits(s);",
8379*de2caf28SDavid du Colombier 	"                h ^= h << 16;",
8380*de2caf28SDavid du Colombier 	"                h ^= s[sizeof(uint16_t)] << 18;",
8381*de2caf28SDavid du Colombier 	"                h += h >> 11;",
8382*de2caf28SDavid du Colombier 	"                break;",
8383*de2caf28SDavid du Colombier 	"        case 2: h += get16bits(s);",
8384*de2caf28SDavid du Colombier 	"                h ^= h << 11;",
8385*de2caf28SDavid du Colombier 	"                h += h >> 17;",
8386*de2caf28SDavid du Colombier 	"                break;",
8387*de2caf28SDavid du Colombier 	"        case 1: h += *s;",
8388*de2caf28SDavid du Colombier 	"                h ^= h << 10;",
8389*de2caf28SDavid du Colombier 	"                h += h >> 1;",
8390*de2caf28SDavid du Colombier 	"                break;",
8391*de2caf28SDavid du Colombier 	"        }",
8392*de2caf28SDavid du Colombier 	"        h ^= h << 3;",
8393*de2caf28SDavid du Colombier 	"        h += h >> 5;",
8394*de2caf28SDavid du Colombier 	"        h ^= h << 4;",
8395*de2caf28SDavid du Colombier 	"        h += h >> 17;",
8396*de2caf28SDavid du Colombier 	"        h ^= h << 25;",
8397*de2caf28SDavid du Colombier 	"        h += h >> 6;",
8398*de2caf28SDavid du Colombier 	"",
8399*de2caf28SDavid du Colombier 	"        K1 = h;",
8400*de2caf28SDavid du Colombier 	"}",
8401*de2caf28SDavid du Colombier 	"void",
8402*de2caf28SDavid du Colombier 	"o_hash64(uchar *kb, int nbytes, int seed)", /* 64-bit hash */
8403*de2caf28SDavid du Colombier 	"{	uint8_t  *bp;",
8404*de2caf28SDavid du Colombier 	"	uint64_t a, b, c, n;",
8405*de2caf28SDavid du Colombier 	"	const uint64_t *k = (uint64_t *) kb;",
8406*de2caf28SDavid du Colombier 	"	n = nbytes/WS;	/* nr of 8-byte chunks */",
8407*de2caf28SDavid du Colombier 	"	/* extend to multiple of words, if needed */",
8408*de2caf28SDavid du Colombier 	"	a = WS - (nbytes %% WS);",
8409*de2caf28SDavid du Colombier 	"	if (a > 0 && a < WS)",
8410*de2caf28SDavid du Colombier 	"	{	n++;",
8411*de2caf28SDavid du Colombier 	"		bp = kb + nbytes;",
8412*de2caf28SDavid du Colombier 	"		switch (a) {",
8413*de2caf28SDavid du Colombier 	"		case 7: *bp++ = 0; /* fall thru */",
8414*de2caf28SDavid du Colombier 	"		case 6: *bp++ = 0; /* fall thru */",
8415*de2caf28SDavid du Colombier 	"		case 5: *bp++ = 0; /* fall thru */",
8416*de2caf28SDavid du Colombier 	"		case 4: *bp++ = 0; /* fall thru */",
8417*de2caf28SDavid du Colombier 	"		case 3: *bp++ = 0; /* fall thru */",
8418*de2caf28SDavid du Colombier 	"		case 2: *bp++ = 0; /* fall thru */",
8419*de2caf28SDavid du Colombier 	"		case 1: *bp   = 0;",
8420*de2caf28SDavid du Colombier 	"		case 0: break;",
8421*de2caf28SDavid du Colombier 	"	}	}",
8422*de2caf28SDavid du Colombier 	"	a = (uint64_t) seed;",
8423*de2caf28SDavid du Colombier 	"	b = HASH_CONST[HASH_NR];",
8424*de2caf28SDavid du Colombier 	"	c = 0x9e3779b97f4a7c13LL; /* arbitrary */",
8425*de2caf28SDavid du Colombier 	"	while (n >= 3)",
8426*de2caf28SDavid du Colombier 	"	{	a += k[0];",
8427*de2caf28SDavid du Colombier 	"		b += k[1];",
8428*de2caf28SDavid du Colombier 	"		c += k[2];",
8429*de2caf28SDavid du Colombier 	"		mix(a,b,c);",
8430*de2caf28SDavid du Colombier 	"		n -= 3;",
8431*de2caf28SDavid du Colombier 	"		k += 3;",
8432*de2caf28SDavid du Colombier 	"	}",
8433*de2caf28SDavid du Colombier 	"	c += (((uint64_t) nbytes)<<3);",
8434*de2caf28SDavid du Colombier 	"	switch (n) {",
8435*de2caf28SDavid du Colombier 	"	case 2: b += k[1];",
8436*de2caf28SDavid du Colombier 	"	case 1: a += k[0];",
8437*de2caf28SDavid du Colombier 	"	case 0: break;",
8438*de2caf28SDavid du Colombier 	"	}",
8439*de2caf28SDavid du Colombier 	"	mix(a,b,c);",
8440*de2caf28SDavid du Colombier 	"",
8441*de2caf28SDavid du Colombier 	"	K1 = a;",
8442*de2caf28SDavid du Colombier 	"}",
8443*de2caf28SDavid du Colombier 	"",
8444*de2caf28SDavid du Colombier 	"#if defined(USE_TDH) && !defined(WIN32) && !defined(WIN64)",
8445*de2caf28SDavid du Colombier #if 0
8446*de2caf28SDavid du Colombier 	some problems with this storage mode:
8447*de2caf28SDavid du Colombier 
8448*de2caf28SDavid du Colombier 	0. pre-allocates full hash-table with slots equal to max statevector size
8449*de2caf28SDavid du Colombier 	    e.g. with -w26 we allocate 2^26 (64 M) slots of VECTORSZ large
8450*de2caf28SDavid du Colombier 	   which can accomodate up to 64 M states
8451*de2caf28SDavid du Colombier 	   once you get close to or exceed the max, the search aborts
8452*de2caf28SDavid du Colombier 	   with a 'hashtable full' message
8453*de2caf28SDavid du Colombier 	   in HC mode the max storage needed per state is more modest and independent
8454*de2caf28SDavid du Colombier 	   of the maximum vectorsize; which makes this mode attractive as a default
8455*de2caf28SDavid du Colombier 
8456*de2caf28SDavid du Colombier 	1. does not support PO reduction through the Lstate->ostate->tagged
8457*de2caf28SDavid du Colombier 	   to distinguish open from closed states - this can reduce states by 50%
8458*de2caf28SDavid du Colombier 	   could add this as another bit from the hash value
8459*de2caf28SDavid du Colombier 	   e.g., could add it in HC mode to the first hash?
8460*de2caf28SDavid du Colombier 
8461*de2caf28SDavid du Colombier 	2. the same state may be stored multiple times
8462*de2caf28SDavid du Colombier #endif
8463*de2caf28SDavid du Colombier 	"#ifdef HC",
8464*de2caf28SDavid du Colombier 	"	#ifndef T_HC",
8465*de2caf28SDavid du Colombier 	"		#ifdef BFS_HC",
8466*de2caf28SDavid du Colombier 	"			#define T_HC	BFS_HC",
8467*de2caf28SDavid du Colombier 	"		#else",
8468*de2caf28SDavid du Colombier 	"			#define T_HC	2",
8469*de2caf28SDavid du Colombier 	"		#endif",
8470*de2caf28SDavid du Colombier 	"	#endif",
8471*de2caf28SDavid du Colombier 	"	#if T_HC<1 || T_HC>4",
8472*de2caf28SDavid du Colombier 	"		#error \"BFS_HC must be 1, 2, 3, or 4 (default is 2)\"",
8473*de2caf28SDavid du Colombier 	"	#endif",
8474*de2caf28SDavid du Colombier 	"#endif",
8475*de2caf28SDavid du Colombier 	"",
8476*de2caf28SDavid du Colombier 	"#define T_ROW     	 6", /* related to cache line size */
8477*de2caf28SDavid du Colombier 	"#define T_ROW_SIZE	 (1<<T_ROW)",
8478*de2caf28SDavid du Colombier 	"#define T_ROW_MASK	-(1<<T_ROW)",
8479*de2caf28SDavid du Colombier 	"#define T_FREE    	 0",
8480*de2caf28SDavid du Colombier 	"#define T_STAT    	 1	/* status bit */",
8481*de2caf28SDavid du Colombier 	"#ifndef T_VSZ",
8482*de2caf28SDavid du Colombier 	"	#define T_VSZ	VECTORSZ/4	/* compressed vectorsize */",
8483*de2caf28SDavid du Colombier 	"#endif",
8484*de2caf28SDavid du Colombier 	"",
8485*de2caf28SDavid du Colombier 	"static volatile char     *ohash_sd;	/* state data  */",
8486*de2caf28SDavid du Colombier 	"static volatile uint32_t *ohash_hv;	/* hash values */",
8487*de2caf28SDavid du Colombier 	"static ulong     	   ohash_max;",
8488*de2caf28SDavid du Colombier 	"static ulong    	   ohash_mask;",
8489*de2caf28SDavid du Colombier 	"",
8490*de2caf28SDavid du Colombier 	"#if defined(USE_TDH) && defined(Q_PROVISO)",
8491*de2caf28SDavid du Colombier 	"  static volatile uchar    *ohash_inq;	/* open/closed flag BFS_INQ */",
8492*de2caf28SDavid du Colombier 	"#endif",
8493*de2caf28SDavid du Colombier 	"#ifdef HC",
8494*de2caf28SDavid du Colombier 	"  static uint32_t	   ohash_hc[T_HC];",
8495*de2caf28SDavid du Colombier 	"  static ulong		   ohash_hc_sz;",
8496*de2caf28SDavid du Colombier 	"#endif",
8497*de2caf28SDavid du Colombier 	"",
8498*de2caf28SDavid du Colombier 	"void",
8499*de2caf28SDavid du Colombier 	"init_HT(ulong x)		/* USE_TDH cygwin/linux */",
8500*de2caf28SDavid du Colombier 	"{	x = x / (ulong) sizeof(H_el *);	/* room for x pointers */",
8501*de2caf28SDavid du Colombier 	"	#ifdef DEBUG",
8502*de2caf28SDavid du Colombier 	"	printf(\"prealloc x %%lu v %%d  x*v %%lu\\n\",",
8503*de2caf28SDavid du Colombier 	"		x, T_VSZ, (ulong) (x * (ulong)T_VSZ));",
8504*de2caf28SDavid du Colombier 	"	#endif",
8505*de2caf28SDavid du Colombier 	"#ifndef HC",
8506*de2caf28SDavid du Colombier 	"	if (!(x * (ulong) T_VSZ > x))",
8507*de2caf28SDavid du Colombier 	"	{	Uerror(\"assertion x * (ulong) T_VSZ > x fails\");",
8508*de2caf28SDavid du Colombier 	"	}",
8509*de2caf28SDavid du Colombier 	"	#ifdef BFS_SEP_HASH",
8510*de2caf28SDavid du Colombier 	"		ohash_sd   = (char *) emalloc(x * (ulong) T_VSZ);",
8511*de2caf28SDavid du Colombier 	"	#else",
8512*de2caf28SDavid du Colombier 	"		ohash_sd   = (volatile char *) sh_pre_malloc(x * (ulong) T_VSZ);",
8513*de2caf28SDavid du Colombier 	"	#endif",
8514*de2caf28SDavid du Colombier 	"#else", /* assume T_HC >= 1, and normally 2 */
8515*de2caf28SDavid du Colombier 	"	ohash_hc_sz = (ulong) (T_HC * (ulong) sizeof(uint32_t));",
8516*de2caf28SDavid du Colombier 	"	if (!(x * ohash_hc_sz > x))",	/* watch for overflow */
8517*de2caf28SDavid du Colombier 	"	{	Uerror(\"assertion x * ohash_hc_sz > x fails\");",
8518*de2caf28SDavid du Colombier 	"	}",
8519*de2caf28SDavid du Colombier 	"	#ifdef BFS_SEP_HASH",
8520*de2caf28SDavid du Colombier 	"		ohash_sd   = (char *) emalloc(x * ohash_hc_sz);",
8521*de2caf28SDavid du Colombier 	"	#else",
8522*de2caf28SDavid du Colombier 	"		ohash_sd   = (volatile char *) sh_pre_malloc(x * ohash_hc_sz);",
8523*de2caf28SDavid du Colombier 	"	#endif",
8524*de2caf28SDavid du Colombier 	"#endif",
8525*de2caf28SDavid du Colombier 	"#ifdef BFS_SEP_HASH",
8526*de2caf28SDavid du Colombier 	"	ohash_hv = (uint32_t *) emalloc(x * (ulong) sizeof(uint32_t));",
8527*de2caf28SDavid du Colombier 	"#else",
8528*de2caf28SDavid du Colombier 	"	ohash_hv = (volatile uint32_t *) sh_pre_malloc(x * (ulong) sizeof(uint32_t));",
8529*de2caf28SDavid du Colombier 	"#endif",
8530*de2caf28SDavid du Colombier 	"	ohash_mask = (((ulong)1)<<ssize)-1;",
8531*de2caf28SDavid du Colombier 	"	ohash_max  = (((ulong)1)<<ssize)/100;",
8532*de2caf28SDavid du Colombier 	"#if defined(USE_TDH) && defined(Q_PROVISO)",
8533*de2caf28SDavid du Colombier 	"	#ifdef BFS_SEP_HASH",
8534*de2caf28SDavid du Colombier 	"	ohash_inq  = (uchar *) emalloc(x * (ulong) sizeof(uchar));",
8535*de2caf28SDavid du Colombier 	"	#else",
8536*de2caf28SDavid du Colombier 	"	ohash_inq  = (volatile uchar *) sh_pre_malloc(x * (ulong) sizeof(uchar));",
8537*de2caf28SDavid du Colombier 	"	#endif",
8538*de2caf28SDavid du Colombier 	"#endif",
8539*de2caf28SDavid du Colombier 	"}",
8540*de2caf28SDavid du Colombier 	"",
8541*de2caf28SDavid du Colombier 	"static int h_table_full;",
8542*de2caf28SDavid du Colombier 	"#ifdef L_BOUND",
8543*de2caf28SDavid du Colombier 	"void",
8544*de2caf28SDavid du Colombier 	"bfs_mark_live(void)",
8545*de2caf28SDavid du Colombier 	"{	int i;",
8546*de2caf28SDavid du Colombier 	"",
8547*de2caf28SDavid du Colombier 	"	trpt->o_pm &= ~2;",
8548*de2caf28SDavid du Colombier 	"#ifdef VERBOSE",
8549*de2caf28SDavid du Colombier 	"	bfs_printf(\"check to mark\\n\");",
8550*de2caf28SDavid du Colombier 	"#endif",
8551*de2caf28SDavid du Colombier 	"	for (i = 0; i < (int) now._nr_pr; i++)",
8552*de2caf28SDavid du Colombier 	"	{	P0 *ptr = (P0 *) pptr(i);",
8553*de2caf28SDavid du Colombier 	"		if (accpstate[ptr->_t][ptr->_p])",
8554*de2caf28SDavid du Colombier 	"		{	trpt->o_pm |= 2;",
8555*de2caf28SDavid du Colombier 	"			now._l_bnd = L_bound;",
8556*de2caf28SDavid du Colombier 	"			now._l_sds = (uchar *) 0;",
8557*de2caf28SDavid du Colombier 	"#ifdef VERBOSE",
8558*de2caf28SDavid du Colombier 	"			bfs_printf(\"mark state live\\n\");",
8559*de2caf28SDavid du Colombier 	"#endif",
8560*de2caf28SDavid du Colombier 	"			break;",
8561*de2caf28SDavid du Colombier 	"	}	}",
8562*de2caf28SDavid du Colombier 	"}",
8563*de2caf28SDavid du Colombier 	"void",
8564*de2caf28SDavid du Colombier 	"bfs_check_live(uchar b, uchar *s)",
8565*de2caf28SDavid du Colombier 	"{	/* assert(b>0); */",
8566*de2caf28SDavid du Colombier 	"	now._l_bnd = b-1;	/* decrease bound */",
8567*de2caf28SDavid du Colombier 	"#ifdef VERBOSE",
8568*de2caf28SDavid du Colombier 	"	bfs_printf(\"check live %%d\\n\", b);",
8569*de2caf28SDavid du Colombier 	"#endif",
8570*de2caf28SDavid du Colombier 	"	if (b == L_bound && boq == -1)", /* never mid rv */
8571*de2caf28SDavid du Colombier 	"	{	now._l_sds = (uchar *) Lstate;	/* new target */",
8572*de2caf28SDavid du Colombier 	"	} else",
8573*de2caf28SDavid du Colombier 	"	{	now._l_sds = s;		/* restore target */",
8574*de2caf28SDavid du Colombier 	"		if (s == (uchar *) Lstate)",
8575*de2caf28SDavid du Colombier 	"		{	depthfound = depth - (BASE+1)*(L_bound - now._l_bnd - 1);",
8576*de2caf28SDavid du Colombier 	"			uerror(\"accept cycle found\");",
8577*de2caf28SDavid du Colombier 	"			depthfound = -1;",
8578*de2caf28SDavid du Colombier 	"			now._l_bnd = 0;",
8579*de2caf28SDavid du Colombier 	"			now._l_sds = (uchar *) 0;",
8580*de2caf28SDavid du Colombier 	"	}	}",
8581*de2caf28SDavid du Colombier 	"#ifdef VERBOSE",
8582*de2caf28SDavid du Colombier 	"	bfs_printf(\"set l_bound to %%d -- sds %%p\\n\", b-1, (void *) now._l_sds);",
8583*de2caf28SDavid du Colombier 	"#endif",
8584219b2ee8SDavid du Colombier 	"}",
8585219b2ee8SDavid du Colombier 	"#endif",
8586*de2caf28SDavid du Colombier 	"/* closed hashing with locality - similar to ltsmin */",
8587*de2caf28SDavid du Colombier 	"int",
8588*de2caf28SDavid du Colombier 	"o_store(const char *vin, int nin)",
8589*de2caf28SDavid du Colombier 	"{	int i, seed = 0;",
8590*de2caf28SDavid du Colombier 	"	ulong hash_v, ix, ex;",
8591*de2caf28SDavid du Colombier 	"	uint32_t T_BUSY, T_DONE;",
8592*de2caf28SDavid du Colombier 	"	volatile uint32_t *t_entry;",
8593*de2caf28SDavid du Colombier 	"#ifdef HC",
8594*de2caf28SDavid du Colombier 	"	ulong vs = ohash_hc_sz;",
8595*de2caf28SDavid du Colombier 	"#else",
8596*de2caf28SDavid du Colombier 	"	ulong vs = (ulong) T_VSZ;",
8597*de2caf28SDavid du Colombier 	"#endif",
8598*de2caf28SDavid du Colombier 	"#ifdef L_BOUND",
8599*de2caf28SDavid du Colombier 	"	uchar o_bnd, *o_sds;",
8600*de2caf28SDavid du Colombier 	"#endif",
8601*de2caf28SDavid du Colombier 	"#ifndef STOP_ON_FULL",
8602*de2caf28SDavid du Colombier 	"	if (h_table_full)",
8603*de2caf28SDavid du Colombier 	"	{	goto done;",
8604*de2caf28SDavid du Colombier 	"	}",
8605*de2caf28SDavid du Colombier 	"#endif",
8606*de2caf28SDavid du Colombier 	"#ifdef L_BOUND",
8607*de2caf28SDavid du Colombier 	"	if (now._l_bnd == 0)",
8608*de2caf28SDavid du Colombier 	"	{	bfs_mark_live();",
8609*de2caf28SDavid du Colombier 	"	}",
8610*de2caf28SDavid du Colombier 	"	#ifdef VERBOSE",
8611*de2caf28SDavid du Colombier 	"	  else",
8612*de2caf28SDavid du Colombier 	"	{	bfs_printf(\"non-markable state %%d\\n\", now._l_bnd);",
8613*de2caf28SDavid du Colombier 	"	}",
8614*de2caf28SDavid du Colombier 	"	#endif",
8615*de2caf28SDavid du Colombier 	"	o_bnd = now._l_bnd;",
8616*de2caf28SDavid du Colombier 	"	o_sds = now._l_sds;",
8617*de2caf28SDavid du Colombier 	"	now._l_bnd = (o_bnd)?1:0;  /* mark nested phase of bounded search */",
8618*de2caf28SDavid du Colombier 	"	now._l_sds = (uchar *) 0;",
8619*de2caf28SDavid du Colombier 	"#endif",
8620*de2caf28SDavid du Colombier 	"#if !defined(HC) && !defined(T_NOCOMP)",
8621*de2caf28SDavid du Colombier 	"	nin = compress((char *)vin, nin);",
8622*de2caf28SDavid du Colombier 	"	vin = (char *) &comp_now;",
8623*de2caf28SDavid du Colombier 	"#endif",
8624*de2caf28SDavid du Colombier 	"	do {	o_hash((uchar *)vin, nin, seed++);",
8625*de2caf28SDavid du Colombier 	"		hash_v = K1;",
8626*de2caf28SDavid du Colombier 	"	} while (hash_v == T_FREE || hash_v == T_STAT);	/* unlikely, hash_v 0 or 1 */",
8627*de2caf28SDavid du Colombier 	"",
8628*de2caf28SDavid du Colombier 	"	T_BUSY = ((uint32_t) hash_v & ~((uint32_t) T_STAT));	/* hash with status bit 0 */",
8629*de2caf28SDavid du Colombier 	"	T_DONE = ((uint32_t) hash_v |  ((uint32_t) T_STAT));	/* hash with status bit 1 */",
8630*de2caf28SDavid du Colombier 	"#ifdef HC",
8631*de2caf28SDavid du Colombier 	"	d_hash((uchar *)vin, nin);",			/* HC */
8632*de2caf28SDavid du Colombier 	"	ohash_hc[0] = (uint32_t) K1;",
8633*de2caf28SDavid du Colombier 	"	#if T_HC>1",
8634*de2caf28SDavid du Colombier 	"	ohash_hc[1] = (uint32_t) (K1>>32);",		/* assumes ulong = 64 bits */
8635*de2caf28SDavid du Colombier 	"	#endif",
8636*de2caf28SDavid du Colombier 	"	#if T_HC>2",
8637*de2caf28SDavid du Colombier 	"	ohash_hc[2] = (uint32_t) K2;",
8638*de2caf28SDavid du Colombier 	"	#endif",
8639*de2caf28SDavid du Colombier 	"	#if T_HC>3",
8640*de2caf28SDavid du Colombier 	"	ohash_hc[3] = (uint32_t) (K2>>32);",
8641*de2caf28SDavid du Colombier 	"	#endif",
8642*de2caf28SDavid du Colombier 	"#endif",
8643*de2caf28SDavid du Colombier 	"	while (seed < ohash_max)",
8644*de2caf28SDavid du Colombier 	"	{	ix = hash_v & ohash_mask;",
8645*de2caf28SDavid du Colombier 	"		ex = (ix & T_ROW_MASK) + T_ROW_SIZE;",
8646*de2caf28SDavid du Colombier 	"		for (i = 0; i < T_ROW_SIZE; i++)",
8647*de2caf28SDavid du Colombier 	"		{	t_entry = (uint32_t *) &ohash_hv[ix];",
8648*de2caf28SDavid du Colombier 	"			if (*t_entry == T_FREE && cas(t_entry, T_FREE, T_BUSY))",
8649*de2caf28SDavid du Colombier 	"			{",
8650*de2caf28SDavid du Colombier 	"#ifndef HC",
8651*de2caf28SDavid du Colombier 	"				memcpy((char *) &ohash_sd[ix * vs], vin, nin);",
8652*de2caf28SDavid du Colombier 	"#else",
8653*de2caf28SDavid du Colombier 	"				memcpy((char *) &ohash_sd[ix * vs], (char *) ohash_hc, vs);",
8654*de2caf28SDavid du Colombier 	"#endif",
8655*de2caf28SDavid du Colombier 	"#if defined(USE_TDH) && defined(Q_PROVISO)",
8656*de2caf28SDavid du Colombier 	"				ohash_inq[ix] = (uchar) BFS_INQ;",
8657*de2caf28SDavid du Colombier 	"				Lstate = (H_el *) &ohash_inq[ix];",
8658*de2caf28SDavid du Colombier 	"#endif",
8659*de2caf28SDavid du Colombier 	"				*t_entry = T_DONE;",
8660*de2caf28SDavid du Colombier 	"#ifdef VERBOSE",
8661*de2caf28SDavid du Colombier 	"	#ifdef L_BOUND",
8662*de2caf28SDavid du Colombier 	"				bfs_printf(\"New state %%p [%%p]\\n\",",
8663*de2caf28SDavid du Colombier 	"					(void *) Lstate, (void *) o_sds);",
8664*de2caf28SDavid du Colombier 	"	#else",
8665*de2caf28SDavid du Colombier 	"				bfs_printf(\"New state %%p\\n\", (void *) Lstate);",
8666*de2caf28SDavid du Colombier 	"	#endif",
8667*de2caf28SDavid du Colombier 	"#endif",
8668*de2caf28SDavid du Colombier 	"#ifdef L_BOUND",
8669*de2caf28SDavid du Colombier 	"				if (o_bnd) { bfs_check_live(o_bnd, o_sds); }",
8670*de2caf28SDavid du Colombier 	"#endif",
8671*de2caf28SDavid du Colombier 	"				return 0;	/* New State */",
8672*de2caf28SDavid du Colombier 	"			}",
8673*de2caf28SDavid du Colombier 	"			while (*t_entry == T_BUSY)",
8674*de2caf28SDavid du Colombier 	"			{	usleep(2);	/* wait */",
8675*de2caf28SDavid du Colombier 	"			}",
8676*de2caf28SDavid du Colombier 	"			if (*t_entry == T_DONE /* (first) hash matches, check data */",
8677*de2caf28SDavid du Colombier 	"#ifndef HC",
8678*de2caf28SDavid du Colombier 	"			&&   memcmp((char *) &ohash_sd[ix * vs], vin, nin) == 0)",
8679*de2caf28SDavid du Colombier 	"#else",
8680*de2caf28SDavid du Colombier 	"			&&   memcmp((char *) &ohash_sd[ix * vs], (char *) ohash_hc, vs) == 0)",
8681*de2caf28SDavid du Colombier 	"#endif",
8682*de2caf28SDavid du Colombier 	"			{",
8683*de2caf28SDavid du Colombier 	"#if defined(USE_TDH) && defined(Q_PROVISO)",
8684*de2caf28SDavid du Colombier 	"				Lstate = (H_el *) &ohash_inq[ix];",
8685*de2caf28SDavid du Colombier 	"#endif",
8686*de2caf28SDavid du Colombier 	"#ifdef VERBOSE",
8687*de2caf28SDavid du Colombier 	"	#ifdef L_BOUND",
8688*de2caf28SDavid du Colombier 	"				bfs_printf(\"Old state %%p [%%p]\\n\",",
8689*de2caf28SDavid du Colombier 	"					(void *) Lstate, (void *) o_sds);",
8690*de2caf28SDavid du Colombier 	"	#else",
8691*de2caf28SDavid du Colombier 	"				bfs_printf(\"Old state %%p\\n\", (void *) Lstate);",
8692*de2caf28SDavid du Colombier 	"	#endif",
8693*de2caf28SDavid du Colombier 	"#endif",
8694*de2caf28SDavid du Colombier 	"#ifdef L_BOUND",
8695*de2caf28SDavid du Colombier 	"				if (o_bnd) { bfs_check_live(o_bnd, o_sds); }",
8696*de2caf28SDavid du Colombier 	"#endif",
8697*de2caf28SDavid du Colombier 	"				return 1;	/* Old State */",
8698*de2caf28SDavid du Colombier 	"			}",
8699*de2caf28SDavid du Colombier 	"			hcmp++; ix++;",
8700*de2caf28SDavid du Colombier 	"			ix = (ix==ex) ? ex - T_ROW_SIZE : ix;",
8701*de2caf28SDavid du Colombier 	"		}",
8702*de2caf28SDavid du Colombier 	"		/* find a new slot: */",
8703*de2caf28SDavid du Colombier 	"		do {	o_hash((uchar *)vin, nin, (int) (hash_v + seed++));",
8704*de2caf28SDavid du Colombier 	"			hash_v = K1;",
8705*de2caf28SDavid du Colombier 	"		} while (hash_v == T_FREE || hash_v == T_STAT);",
8706*de2caf28SDavid du Colombier 	"		T_BUSY = ((uint32_t) hash_v & ~((uint32_t) T_STAT));",
8707*de2caf28SDavid du Colombier 	"		T_DONE = ((uint32_t) hash_v |  ((uint32_t) T_STAT));",
8708*de2caf28SDavid du Colombier 	"	}",
8709*de2caf28SDavid du Colombier 	"#ifdef STOP_ON_FULL",
8710*de2caf28SDavid du Colombier 	"	Uerror(\"hash table full\");",
8711*de2caf28SDavid du Colombier 	"	/* no return from Uerror */",
8712*de2caf28SDavid du Colombier 	"#else",
8713*de2caf28SDavid du Colombier 	"	if (!h_table_full)",
8714*de2caf28SDavid du Colombier 	"	{	h_table_full++;",
8715*de2caf28SDavid du Colombier 	"		if (who_am_i == 0)",
8716*de2caf28SDavid du Colombier 	"		{	bfs_printf(\"hash table is full\\n\");",
8717*de2caf28SDavid du Colombier 	"	}	}",
8718*de2caf28SDavid du Colombier 	"done:",
8719*de2caf28SDavid du Colombier 	"	bfs_punt++;	/* counts this as a lost state */",
8720*de2caf28SDavid du Colombier 	"#endif",
8721*de2caf28SDavid du Colombier 	"#ifdef L_BOUND",
8722*de2caf28SDavid du Colombier 	"	now._l_bnd = 0; /* no more checking */",
8723*de2caf28SDavid du Colombier 	"	now._l_sds = (uchar *) 0;",
8724*de2caf28SDavid du Colombier 	"#endif",
8725*de2caf28SDavid du Colombier 	"	return 1; /* technically should be 0, but we want to throttle down */",
8726*de2caf28SDavid du Colombier 	"}",
8727*de2caf28SDavid du Colombier 	"#endif", /* USE_TDH && !WIN32 && !WIN64 */
8728*de2caf28SDavid du Colombier 	"#endif", /* !BITSTATE || FULLSTACK */
87297dd7cddfSDavid du Colombier 	"#include TRANSITIONS",
8730219b2ee8SDavid du Colombier 	0,
8731219b2ee8SDavid du Colombier };
8732