1219b2ee8SDavid du Colombier /***** spin: pangen1.c *****/
2219b2ee8SDavid du Colombier
3312a1df1SDavid du Colombier /* Copyright (c) 1989-2003 by Lucent Technologies, Bell Laboratories. */
47dd7cddfSDavid du Colombier /* All Rights Reserved. This software is for educational purposes only. */
5312a1df1SDavid du Colombier /* No guarantee whatsoever is expressed or implied by the distribution of */
6312a1df1SDavid du Colombier /* this code. Permission is given to distribute this code provided that */
7312a1df1SDavid du Colombier /* this introductory message is not removed and no monies are exchanged. */
8312a1df1SDavid du Colombier /* Software written by Gerard J. Holzmann. For tool documentation see: */
9312a1df1SDavid du Colombier /* http://spinroot.com/ */
10312a1df1SDavid du Colombier /* Send all bug-reports and/or questions to: bugs@spinroot.com */
11*00d97012SDavid du Colombier /* (c) 2007: small additions for V5.0 to support multi-core verifications */
12219b2ee8SDavid du Colombier
13219b2ee8SDavid du Colombier #include "spin.h"
14219b2ee8SDavid du Colombier #include "y.tab.h"
15219b2ee8SDavid du Colombier #include "pangen1.h"
16219b2ee8SDavid du Colombier #include "pangen3.h"
17*00d97012SDavid du Colombier #include "pangen6.h"
18*00d97012SDavid du Colombier #include <assert.h>
19219b2ee8SDavid du Colombier
207dd7cddfSDavid du Colombier extern FILE *tc, *th, *tt;
217dd7cddfSDavid du Colombier extern Label *labtab;
227dd7cddfSDavid du Colombier extern Ordered *all_names;
23219b2ee8SDavid du Colombier extern ProcList *rdy;
24219b2ee8SDavid du Colombier extern Queue *qtab;
257dd7cddfSDavid du Colombier extern Symbol *Fname;
26*00d97012SDavid du Colombier extern int lineno, verbose, Pid, separate, old_scope_rules, nclaims;
277dd7cddfSDavid du Colombier extern int nrRdy, nqs, mst, Mpars, claimnr, eventmapnr;
287dd7cddfSDavid du Colombier extern short has_sorted, has_random, has_provided;
29*00d97012SDavid du Colombier extern Queue *ltab[];
30219b2ee8SDavid du Colombier
31312a1df1SDavid du Colombier int Npars=0, u_sync=0, u_async=0, hastrack = 1;
32312a1df1SDavid du Colombier short has_io = 0;
33312a1df1SDavid du Colombier short has_state=0; /* code contains c_state */
34219b2ee8SDavid du Colombier
357dd7cddfSDavid du Colombier static Symbol *LstSet=ZS;
367dd7cddfSDavid du Colombier static int acceptors=0, progressors=0, nBits=0;
377dd7cddfSDavid du Colombier static int Types[] = { UNSIGNED, BIT, BYTE, CHAN, MTYPE, SHORT, INT, STRUCT };
387dd7cddfSDavid du Colombier
397dd7cddfSDavid du Colombier static int doglobal(char *, int);
407dd7cddfSDavid du Colombier static void dohidden(void);
417dd7cddfSDavid du Colombier static void do_init(FILE *, Symbol *);
427dd7cddfSDavid du Colombier static void end_labs(Symbol *, int);
43*00d97012SDavid du Colombier static void put_ptype(char *, int, int, int, enum btypes);
447dd7cddfSDavid du Colombier static void tc_predef_np(void);
457dd7cddfSDavid du Colombier static void put_pinit(ProcList *);
46*00d97012SDavid du Colombier static void multi_init(void);
477dd7cddfSDavid du Colombier void walk_struct(FILE *, int, char *, Symbol *, char *, char *, char *);
487dd7cddfSDavid du Colombier
497dd7cddfSDavid du Colombier static void
reverse_names(ProcList * p)50219b2ee8SDavid du Colombier reverse_names(ProcList *p)
51219b2ee8SDavid du Colombier {
52219b2ee8SDavid du Colombier if (!p) return;
53219b2ee8SDavid du Colombier reverse_names(p->nxt);
547dd7cddfSDavid du Colombier fprintf(th, " \"%s\",\n", p->n->name);
55219b2ee8SDavid du Colombier }
56*00d97012SDavid du Colombier static void
reverse_types(ProcList * p)57*00d97012SDavid du Colombier reverse_types(ProcList *p)
58*00d97012SDavid du Colombier {
59*00d97012SDavid du Colombier if (!p) return;
60*00d97012SDavid du Colombier reverse_types(p->nxt);
61*00d97012SDavid du Colombier fprintf(th, " %d, /* %s */\n", p->b, p->n->name);
62*00d97012SDavid du Colombier }
63*00d97012SDavid du Colombier
64*00d97012SDavid du Colombier static int
blog(int n)65*00d97012SDavid du Colombier blog(int n) /* for small log2 without rounding problems */
66*00d97012SDavid du Colombier { int m=1, r=2;
67*00d97012SDavid du Colombier
68*00d97012SDavid du Colombier while (r < n) { m++; r *= 2; }
69*00d97012SDavid du Colombier return 1+m;
70*00d97012SDavid du Colombier }
71219b2ee8SDavid du Colombier
72219b2ee8SDavid du Colombier void
genheader(void)73219b2ee8SDavid du Colombier genheader(void)
74219b2ee8SDavid du Colombier { ProcList *p; int i;
75219b2ee8SDavid du Colombier
76312a1df1SDavid du Colombier if (separate == 2)
77312a1df1SDavid du Colombier { putunames(th);
78312a1df1SDavid du Colombier goto here;
79312a1df1SDavid du Colombier }
80*00d97012SDavid du Colombier /* 5.2.3: gcc 3 no longer seems to compute sizeof at compile time */
81*00d97012SDavid du Colombier fprintf(th, "#define WS %d /* word size in bytes */\n", (int) sizeof(void *));
82219b2ee8SDavid du Colombier fprintf(th, "#define SYNC %d\n", u_sync);
83219b2ee8SDavid du Colombier fprintf(th, "#define ASYNC %d\n\n", u_async);
84*00d97012SDavid du Colombier fprintf(th, "#ifndef NCORE\n");
85*00d97012SDavid du Colombier fprintf(th, " #ifdef DUAL_CORE\n");
86*00d97012SDavid du Colombier fprintf(th, " #define NCORE 2\n");
87*00d97012SDavid du Colombier fprintf(th, " #elif QUAD_CORE\n");
88*00d97012SDavid du Colombier fprintf(th, " #define NCORE 4\n");
89*00d97012SDavid du Colombier fprintf(th, " #else\n");
90*00d97012SDavid du Colombier fprintf(th, " #define NCORE 1\n");
91*00d97012SDavid du Colombier fprintf(th, " #endif\n");
92*00d97012SDavid du Colombier fprintf(th, "#endif\n");
93219b2ee8SDavid du Colombier
94219b2ee8SDavid du Colombier putunames(th);
95219b2ee8SDavid du Colombier
96219b2ee8SDavid du Colombier fprintf(tc, "short Air[] = { ");
97219b2ee8SDavid du Colombier for (p = rdy, i=0; p; p = p->nxt, i++)
987dd7cddfSDavid du Colombier fprintf(tc, "%s (short) Air%d", (p!=rdy)?",":"", i);
997dd7cddfSDavid du Colombier fprintf(tc, ", (short) Air%d", i); /* np_ */
100*00d97012SDavid du Colombier if (nclaims > 1)
101*00d97012SDavid du Colombier { fprintf(tc, "\n#ifndef NOCLAIM\n");
102*00d97012SDavid du Colombier fprintf(tc, " , (short) Air%d", i+1); /* Multi */
103*00d97012SDavid du Colombier fprintf(tc, "\n#endif\n\t");
104*00d97012SDavid du Colombier }
105219b2ee8SDavid du Colombier fprintf(tc, " };\n");
106219b2ee8SDavid du Colombier
1077dd7cddfSDavid du Colombier fprintf(th, "char *procname[] = {\n");
108219b2ee8SDavid du Colombier reverse_names(rdy);
1097dd7cddfSDavid du Colombier fprintf(th, " \":np_:\",\n");
1107dd7cddfSDavid du Colombier fprintf(th, "};\n\n");
111219b2ee8SDavid du Colombier
112*00d97012SDavid du Colombier fprintf(th, "enum btypes { NONE=%d, N_CLAIM=%d,", NONE, N_CLAIM);
113*00d97012SDavid du Colombier fprintf(th, " I_PROC=%d, A_PROC=%d,", I_PROC, A_PROC);
114*00d97012SDavid du Colombier fprintf(th, " P_PROC=%d, E_TRACE=%d, N_TRACE=%d };\n",
115*00d97012SDavid du Colombier P_PROC, E_TRACE, N_TRACE);
116*00d97012SDavid du Colombier fprintf(th, "int Btypes[] = {\n");
117*00d97012SDavid du Colombier reverse_types(rdy);
118*00d97012SDavid du Colombier fprintf(th, " 0 /* :np_: */\n");
119*00d97012SDavid du Colombier fprintf(th, "};\n\n");
120*00d97012SDavid du Colombier
1217dd7cddfSDavid du Colombier here:
1227dd7cddfSDavid du Colombier for (p = rdy; p; p = p->nxt)
123*00d97012SDavid du Colombier put_ptype(p->n->name, p->tn, mst, nrRdy+1, p->b);
1247dd7cddfSDavid du Colombier /* +1 for np_ */
125*00d97012SDavid du Colombier put_ptype("np_", nrRdy, mst, nrRdy+1, 0);
126*00d97012SDavid du Colombier
127*00d97012SDavid du Colombier if (nclaims > 1)
128*00d97012SDavid du Colombier { /* this is the structure that goes into the state-vector
129*00d97012SDavid du Colombier * instead of the actual never claims
130*00d97012SDavid du Colombier * this assumes that the claims do not have any local variables
131*00d97012SDavid du Colombier * this claim records the types and states of all subclaims in an array
132*00d97012SDavid du Colombier * NB: not sure if we need the first 3 fields in this structure
133*00d97012SDavid du Colombier * it's here for now to avoid breaking some possible dependence
134*00d97012SDavid du Colombier * in the calculations above, we were already taking into account
135*00d97012SDavid du Colombier * that there is one never-claim, which will now be this one
136*00d97012SDavid du Colombier */
137*00d97012SDavid du Colombier
138*00d97012SDavid du Colombier i = blog(mst);
139*00d97012SDavid du Colombier fprintf(th, "\n");
140*00d97012SDavid du Colombier fprintf(th, "#ifndef NOCLAIM\n");
141*00d97012SDavid du Colombier fprintf(th, " #undef VERI\n");
142*00d97012SDavid du Colombier fprintf(th, " #define VERI %d\n", nrRdy+1);
143*00d97012SDavid du Colombier fprintf(th, " #define Pclaim P%d\n\n", nrRdy+1);
144*00d97012SDavid du Colombier fprintf(th, "typedef struct P%d {\n", nrRdy+1);
145*00d97012SDavid du Colombier fprintf(th, " unsigned _pid : 8; /* always zero */\n");
146*00d97012SDavid du Colombier fprintf(th, " unsigned _t : %d; /* active-claim type */\n",
147*00d97012SDavid du Colombier blog(nrRdy+1));
148*00d97012SDavid du Colombier fprintf(th, " unsigned _p : %d; /* active-claim state */\n",
149*00d97012SDavid du Colombier i);
150*00d97012SDavid du Colombier fprintf(th, " unsigned _n : %d; /* active-claim index */\n",
151*00d97012SDavid du Colombier blog(nclaims));
152*00d97012SDavid du Colombier if (i <= 255) /* in stdint.h = UCHAR_MAX from limits.h */
153*00d97012SDavid du Colombier { fprintf(th, " uchar c_cur[NCLAIMS]; /* claim-states */\n");
154*00d97012SDavid du Colombier } else if (i <= 65535) /* really USHRT_MAX from limits.h */
155*00d97012SDavid du Colombier { fprintf(th, " ushort c_cur[NCLAIMS]; /* claim-states */\n");
156*00d97012SDavid du Colombier } else /* the most unlikely case */
157*00d97012SDavid du Colombier { fprintf(th, " uint c_cur[NCLAIMS]; /* claim-states */\n");
158*00d97012SDavid du Colombier }
159*00d97012SDavid du Colombier fprintf(th, "} P%d;\n", nrRdy+1);
160*00d97012SDavid du Colombier fprintf(th, "uchar spin_c_typ[NCLAIMS]; /* claim-types */\n");
161*00d97012SDavid du Colombier fprintf(th, " #define Air%d (0)\n\n", nrRdy+1);
162*00d97012SDavid du Colombier fprintf(th, "#endif\n");
163*00d97012SDavid du Colombier /*
164*00d97012SDavid du Colombier * find special states as:
165*00d97012SDavid du Colombier * stopstate [ claimnr ][ curstate ] == 1
166*00d97012SDavid du Colombier * accpstate [ claimnr ][ curstate ]
167*00d97012SDavid du Colombier * progstate [ claimnr ][ curstate ]
168*00d97012SDavid du Colombier * reached [ claimnr ][ curstate ]
169*00d97012SDavid du Colombier * visstate [ claimnr ][ curstate ]
170*00d97012SDavid du Colombier * loopstate [ claimnr ][ curstate ]
171*00d97012SDavid du Colombier * mapstate [ claimnr ][ curstate ]
172*00d97012SDavid du Colombier */
173*00d97012SDavid du Colombier } else
174*00d97012SDavid du Colombier { fprintf(th, "\n#define Pclaim P0\n");
175*00d97012SDavid du Colombier fprintf(th, "#ifndef NCLAIMS\n");
176*00d97012SDavid du Colombier fprintf(th, " #define NCLAIMS 1\n");
177*00d97012SDavid du Colombier fprintf(th, "#endif\n");
178*00d97012SDavid du Colombier fprintf(th, "uchar spin_c_typ[NCLAIMS]; /* claim-types */\n");
179*00d97012SDavid du Colombier }
1807dd7cddfSDavid du Colombier
1817dd7cddfSDavid du Colombier ntimes(th, 0, 1, Head0);
1827dd7cddfSDavid du Colombier
183312a1df1SDavid du Colombier if (separate != 2)
184312a1df1SDavid du Colombier { extern void c_add_stack(FILE *);
185*00d97012SDavid du Colombier extern void c_stack_size(FILE *);
186312a1df1SDavid du Colombier
1877dd7cddfSDavid du Colombier ntimes(th, 0, 1, Header);
188*00d97012SDavid du Colombier fprintf(th, "#define StackSize (");
189*00d97012SDavid du Colombier c_stack_size(th);
190*00d97012SDavid du Colombier fprintf(th, ")\n");
191*00d97012SDavid du Colombier
192312a1df1SDavid du Colombier c_add_stack(th);
193312a1df1SDavid du Colombier ntimes(th, 0, 1, Header0);
194312a1df1SDavid du Colombier }
1957dd7cddfSDavid du Colombier ntimes(th, 0, 1, Head1);
1967dd7cddfSDavid du Colombier
1977dd7cddfSDavid du Colombier LstSet = ZS;
1987dd7cddfSDavid du Colombier (void) doglobal("", PUTV);
199312a1df1SDavid du Colombier
200312a1df1SDavid du Colombier hastrack = c_add_sv(th);
201312a1df1SDavid du Colombier
202*00d97012SDavid du Colombier fprintf(th, "#ifdef TRIX\n");
203*00d97012SDavid du Colombier fprintf(th, " /* room for 512 proc+chan ptrs, + safety margin */\n");
204*00d97012SDavid du Colombier fprintf(th, " char *_ids_[MAXPROC+MAXQ+4];\n");
205*00d97012SDavid du Colombier fprintf(th, "#else\n");
206219b2ee8SDavid du Colombier fprintf(th, " uchar sv[VECTORSZ];\n");
207*00d97012SDavid du Colombier fprintf(th, "#endif\n");
208*00d97012SDavid du Colombier
209312a1df1SDavid du Colombier fprintf(th, "} State");
210312a1df1SDavid du Colombier #ifdef SOLARIS
211312a1df1SDavid du Colombier fprintf(th,"\n#ifdef GCC\n");
212312a1df1SDavid du Colombier fprintf(th, "\t__attribute__ ((aligned(8)))");
213312a1df1SDavid du Colombier fprintf(th, "\n#endif\n\t");
214312a1df1SDavid du Colombier #endif
215312a1df1SDavid du Colombier fprintf(th, ";\n\n");
216312a1df1SDavid du Colombier
217*00d97012SDavid du Colombier fprintf(th, "#ifdef TRIX\n");
218*00d97012SDavid du Colombier fprintf(th, "typedef struct TRIX_v6 {\n");
219*00d97012SDavid du Colombier fprintf(th, " uchar *body; /* aligned */\n");
220*00d97012SDavid du Colombier fprintf(th, "#ifndef BFS\n");
221*00d97012SDavid du Colombier fprintf(th, " short modified;\n");
222*00d97012SDavid du Colombier fprintf(th, "#endif\n");
223*00d97012SDavid du Colombier fprintf(th, " short psize;\n");
224*00d97012SDavid du Colombier fprintf(th, " short parent_pid;\n");
225*00d97012SDavid du Colombier fprintf(th, " struct TRIX_v6 *nxt;\n");
226*00d97012SDavid du Colombier fprintf(th, "} TRIX_v6;\n");
227*00d97012SDavid du Colombier fprintf(th, "TRIX_v6 *freebodies;\n");
228*00d97012SDavid du Colombier fprintf(th, "TRIX_v6 *processes[MAXPROC+1];\n");
229*00d97012SDavid du Colombier fprintf(th, "TRIX_v6 *channels[MAXQ+1]; \n");
230*00d97012SDavid du Colombier fprintf(th, "long _p_count[MAXPROC];\n");
231*00d97012SDavid du Colombier fprintf(th, "long _c_count[MAXPROC];\n");
232*00d97012SDavid du Colombier fprintf(th, "#endif\n\n");
233*00d97012SDavid du Colombier
234312a1df1SDavid du Colombier fprintf(th, "#define HAS_TRACK %d\n", hastrack);
235312a1df1SDavid du Colombier
236312a1df1SDavid du Colombier if (separate != 2)
237219b2ee8SDavid du Colombier dohidden();
238219b2ee8SDavid du Colombier }
239219b2ee8SDavid du Colombier
240219b2ee8SDavid du Colombier void
genaddproc(void)241219b2ee8SDavid du Colombier genaddproc(void)
242219b2ee8SDavid du Colombier { ProcList *p;
243*00d97012SDavid du Colombier int i = 0, j;
244219b2ee8SDavid du Colombier
2457dd7cddfSDavid du Colombier if (separate == 2) goto shortcut;
2467dd7cddfSDavid du Colombier
247*00d97012SDavid du Colombier fprintf(tc, "\n#ifdef TRIX\n");
248*00d97012SDavid du Colombier fprintf(tc, "int what_p_size(int);\n");
249*00d97012SDavid du Colombier fprintf(tc, "int what_q_size(int);\n\n");
250*00d97012SDavid du Colombier /* the number of processes just changed by 1 (up or down) */
251*00d97012SDavid du Colombier /* this means that the channel indices move up or down by one slot */
252*00d97012SDavid du Colombier /* not all new channels may have a valid index yet, but we move */
253*00d97012SDavid du Colombier /* all of them anyway, as if they existed */
254*00d97012SDavid du Colombier fprintf(tc, "void\nre_mark_all(int whichway)\n");
255*00d97012SDavid du Colombier fprintf(tc, "{ int j;\n");
256*00d97012SDavid du Colombier fprintf(tc, " #ifdef V_TRIX\n");
257*00d97012SDavid du Colombier fprintf(tc, " printf(\"%%d: re_mark_all channels %%d\\n\", depth, whichway);\n");
258*00d97012SDavid du Colombier fprintf(tc, " #endif\n");
259*00d97012SDavid du Colombier fprintf(tc, " #ifndef BFS\n");
260*00d97012SDavid du Colombier fprintf(tc, " for (j = 0; j < now._nr_qs; j++)\n");
261*00d97012SDavid du Colombier fprintf(tc, " channels[j]->modified = 1; /* channel index moved */\n");
262*00d97012SDavid du Colombier fprintf(tc, " #endif\n");
263*00d97012SDavid du Colombier fprintf(tc, " #ifndef TRIX_ORIG\n");
264*00d97012SDavid du Colombier fprintf(tc, " if (whichway > 0)\n");
265*00d97012SDavid du Colombier fprintf(tc, " { for (j = now._nr_pr + now._nr_qs - 1; j >= now._nr_pr; j--)\n");
266*00d97012SDavid du Colombier fprintf(tc, " now._ids_[j] = now._ids_[j-1];\n");
267*00d97012SDavid du Colombier fprintf(tc, " } else\n");
268*00d97012SDavid du Colombier fprintf(tc, " { for (j = now._nr_pr; j < now._nr_pr + now._nr_qs; j++)\n");
269*00d97012SDavid du Colombier fprintf(tc, " now._ids_[j] = now._ids_[j+1];\n");
270*00d97012SDavid du Colombier fprintf(tc, " }\n");
271*00d97012SDavid du Colombier fprintf(tc, " #endif\n");
272*00d97012SDavid du Colombier fprintf(tc, "}\n");
273*00d97012SDavid du Colombier
274*00d97012SDavid du Colombier fprintf(tc, "#endif\n\n");
275*00d97012SDavid du Colombier
276*00d97012SDavid du Colombier fprintf(tc, "int\naddproc(int calling_pid, int n");
277*00d97012SDavid du Colombier for (/* i = 0 */; i < Npars; i++)
278219b2ee8SDavid du Colombier fprintf(tc, ", int par%d", i);
279219b2ee8SDavid du Colombier
280219b2ee8SDavid du Colombier ntimes(tc, 0, 1, Addp0);
2817dd7cddfSDavid du Colombier ntimes(tc, 1, nrRdy+1, R5); /* +1 for np_ */
282*00d97012SDavid du Colombier
283*00d97012SDavid du Colombier if (nclaims > 1)
284*00d97012SDavid du Colombier { fprintf(tc, "#ifndef NOCLAIM\n");
285*00d97012SDavid du Colombier ntimes(tc, nrRdy+1, nrRdy+2, R5);
286*00d97012SDavid du Colombier fprintf(tc, "#endif\n");
287*00d97012SDavid du Colombier }
288*00d97012SDavid du Colombier
289219b2ee8SDavid du Colombier ntimes(tc, 0, 1, Addp1);
290219b2ee8SDavid du Colombier
2917dd7cddfSDavid du Colombier if (has_provided)
292312a1df1SDavid du Colombier { fprintf(tt, "\nint\nprovided(int II, unsigned char ot, ");
2937dd7cddfSDavid du Colombier fprintf(tt, "int tt, Trans *t)\n");
2947dd7cddfSDavid du Colombier fprintf(tt, "{\n\tswitch(ot) {\n");
2957dd7cddfSDavid du Colombier }
2967dd7cddfSDavid du Colombier shortcut:
297*00d97012SDavid du Colombier if (nclaims > 1)
298*00d97012SDavid du Colombier { multi_init();
299*00d97012SDavid du Colombier }
3007dd7cddfSDavid du Colombier tc_predef_np();
301219b2ee8SDavid du Colombier for (p = rdy; p; p = p->nxt)
3027dd7cddfSDavid du Colombier { Pid = p->tn;
3037dd7cddfSDavid du Colombier put_pinit(p);
3047dd7cddfSDavid du Colombier }
3057dd7cddfSDavid du Colombier if (separate == 2) return;
3067dd7cddfSDavid du Colombier
3077dd7cddfSDavid du Colombier Pid = 0;
3087dd7cddfSDavid du Colombier if (has_provided)
3097dd7cddfSDavid du Colombier { fprintf(tt, "\tdefault: return 1; /* e.g., a claim */\n");
3107dd7cddfSDavid du Colombier fprintf(tt, "\t}\n\treturn 0;\n}\n");
3117dd7cddfSDavid du Colombier }
312219b2ee8SDavid du Colombier
313219b2ee8SDavid du Colombier ntimes(tc, i, i+1, R6);
3147dd7cddfSDavid du Colombier if (separate == 0)
3157dd7cddfSDavid du Colombier ntimes(tc, 1, nrRdy+1, R5); /* +1 for np_ */
3167dd7cddfSDavid du Colombier else
3177dd7cddfSDavid du Colombier ntimes(tc, 1, nrRdy, R5);
3187dd7cddfSDavid du Colombier ntimes(tc, 0, 1, R8a);
319219b2ee8SDavid du Colombier }
320219b2ee8SDavid du Colombier
321219b2ee8SDavid du Colombier void
do_locinits(FILE * fd)322312a1df1SDavid du Colombier do_locinits(FILE *fd)
323312a1df1SDavid du Colombier { ProcList *p;
324312a1df1SDavid du Colombier
325312a1df1SDavid du Colombier for (p = rdy; p; p = p->nxt)
326312a1df1SDavid du Colombier c_add_locinit(fd, p->tn, p->n->name);
327312a1df1SDavid du Colombier }
328312a1df1SDavid du Colombier
329312a1df1SDavid du Colombier void
genother(void)330219b2ee8SDavid du Colombier genother(void)
331219b2ee8SDavid du Colombier { ProcList *p;
332219b2ee8SDavid du Colombier
3337dd7cddfSDavid du Colombier switch (separate) {
3347dd7cddfSDavid du Colombier case 2:
335*00d97012SDavid du Colombier if (nclaims > 0)
336*00d97012SDavid du Colombier { for (p = rdy; p; p = p->nxt)
337*00d97012SDavid du Colombier { if (p->b == N_CLAIM)
338*00d97012SDavid du Colombier { ntimes(tc, p->tn, p->tn+1, R0); /* claims only */
339*00d97012SDavid du Colombier } } }
3407dd7cddfSDavid du Colombier break;
3417dd7cddfSDavid du Colombier case 1:
342219b2ee8SDavid du Colombier ntimes(tc, 0, 1, Code0);
343*00d97012SDavid du Colombier for (p = rdy; p; p = p->nxt)
344*00d97012SDavid du Colombier { if (p->b != N_CLAIM)
345*00d97012SDavid du Colombier { ntimes(tc, p->tn, p->tn+1, R0); /* all except claims */
346*00d97012SDavid du Colombier } }
3477dd7cddfSDavid du Colombier break;
3487dd7cddfSDavid du Colombier case 0:
3497dd7cddfSDavid du Colombier ntimes(tc, 0, 1, Code0);
3507dd7cddfSDavid du Colombier ntimes(tc, 0, nrRdy+1, R0); /* +1 for np_ */
3517dd7cddfSDavid du Colombier break;
3527dd7cddfSDavid du Colombier }
353219b2ee8SDavid du Colombier
354219b2ee8SDavid du Colombier for (p = rdy; p; p = p->nxt)
355219b2ee8SDavid du Colombier end_labs(p->n, p->tn);
356219b2ee8SDavid du Colombier
3577dd7cddfSDavid du Colombier switch (separate) {
3587dd7cddfSDavid du Colombier case 2:
359*00d97012SDavid du Colombier if (nclaims > 0)
360*00d97012SDavid du Colombier { for (p = rdy; p; p = p->nxt)
361*00d97012SDavid du Colombier { if (p->b == N_CLAIM)
362*00d97012SDavid du Colombier { ntimes(tc, p->tn, p->tn+1, R0a); /* claims only */
363*00d97012SDavid du Colombier } } }
3647dd7cddfSDavid du Colombier return;
3657dd7cddfSDavid du Colombier case 1:
366*00d97012SDavid du Colombier for (p = rdy; p; p = p->nxt)
367*00d97012SDavid du Colombier { if (p->b != N_CLAIM)
368*00d97012SDavid du Colombier { ntimes(tc, p->tn, p->tn+1, R0a); /* all except claims */
369*00d97012SDavid du Colombier } }
3707dd7cddfSDavid du Colombier fprintf(tc, " if (state_tables)\n");
371*00d97012SDavid du Colombier fprintf(tc, " ini_claim(%d, 0);\n", claimnr); /* the default claim */
372*00d97012SDavid du Colombier if (acceptors == 0)
373*00d97012SDavid du Colombier { acceptors = 1; /* assume at least 1 acceptstate */
374*00d97012SDavid du Colombier }
3757dd7cddfSDavid du Colombier break;
3767dd7cddfSDavid du Colombier case 0:
3777dd7cddfSDavid du Colombier ntimes(tc, 0, nrRdy, R0a); /* all */
3787dd7cddfSDavid du Colombier break;
3797dd7cddfSDavid du Colombier }
380219b2ee8SDavid du Colombier
381219b2ee8SDavid du Colombier ntimes(th, acceptors, acceptors+1, Code1);
382219b2ee8SDavid du Colombier ntimes(th, progressors, progressors+1, Code3);
3837dd7cddfSDavid du Colombier ntimes(th, nrRdy+1, nrRdy+2, R2); /* +1 for np_ */
384219b2ee8SDavid du Colombier
385*00d97012SDavid du Colombier ntimes(tc, 0, 1, Code2a); /* dfs, bfs */
386*00d97012SDavid du Colombier ntimes(tc, 0, 1, Code2c); /* multicore */
387*00d97012SDavid du Colombier ntimes(tc, 0, 1, Code2d);
388*00d97012SDavid du Colombier
389*00d97012SDavid du Colombier fprintf(tc, "void\ndo_reach(void)\n{\n");
390219b2ee8SDavid du Colombier ntimes(tc, 0, nrRdy, R4);
391219b2ee8SDavid du Colombier fprintf(tc, "}\n\n");
3927dd7cddfSDavid du Colombier
393*00d97012SDavid du Colombier fprintf(tc, "void\niniglobals(int calling_pid)\n{\n");
394*00d97012SDavid du Colombier ntimes(tc, 1, u_sync+u_async+1, R3); /* because nqs is still 0 */
395*00d97012SDavid du Colombier fprintf(tc, "\tMaxbody = max(Maxbody, sizeof(State)-VECTORSZ);\n");
396*00d97012SDavid du Colombier fprintf(tc, "\tif ((Maxbody %% WS) != 0)\n");
397*00d97012SDavid du Colombier fprintf(tc, "\t Maxbody += WS - (Maxbody %% WS);\n\n");
398*00d97012SDavid du Colombier
399*00d97012SDavid du Colombier /* after the value of Maxbody has settled */
4007dd7cddfSDavid du Colombier if (doglobal("", INIV) > 0)
4017dd7cddfSDavid du Colombier { fprintf(tc, "#ifdef VAR_RANGES\n");
4027dd7cddfSDavid du Colombier (void) doglobal("logval(\"", LOGV);
4037dd7cddfSDavid du Colombier fprintf(tc, "#endif\n");
4047dd7cddfSDavid du Colombier }
405*00d97012SDavid du Colombier fprintf(tc, "}\n\n");
4067dd7cddfSDavid du Colombier }
4077dd7cddfSDavid du Colombier
4087dd7cddfSDavid du Colombier void
gensvmap(void)4097dd7cddfSDavid du Colombier gensvmap(void)
4107dd7cddfSDavid du Colombier {
4117dd7cddfSDavid du Colombier ntimes(tc, 0, 1, SvMap);
412219b2ee8SDavid du Colombier }
413219b2ee8SDavid du Colombier
414219b2ee8SDavid du Colombier static struct {
415219b2ee8SDavid du Colombier char *s, *t; int n, m, p;
416219b2ee8SDavid du Colombier } ln[] = {
4177dd7cddfSDavid du Colombier {"end", "stopstate", 3, 0, 0},
4187dd7cddfSDavid du Colombier {"progress", "progstate", 8, 0, 1},
4197dd7cddfSDavid du Colombier {"accept", "accpstate", 6, 1, 0},
4207dd7cddfSDavid du Colombier {0, 0, 0, 0, 0},
421219b2ee8SDavid du Colombier };
422219b2ee8SDavid du Colombier
4237dd7cddfSDavid du Colombier static void
end_labs(Symbol * s,int i)424219b2ee8SDavid du Colombier end_labs(Symbol *s, int i)
4257dd7cddfSDavid du Colombier { int oln = lineno;
4267dd7cddfSDavid du Colombier Symbol *ofn = Fname;
427219b2ee8SDavid du Colombier Label *l;
4287dd7cddfSDavid du Colombier int j; char foo[128];
4297dd7cddfSDavid du Colombier
430*00d97012SDavid du Colombier if ((pid_is_claim(i) && separate == 1)
431*00d97012SDavid du Colombier || (!pid_is_claim(i) && separate == 2))
4327dd7cddfSDavid du Colombier return;
433219b2ee8SDavid du Colombier
434219b2ee8SDavid du Colombier for (l = labtab; l; l = l->nxt)
435219b2ee8SDavid du Colombier for (j = 0; ln[j].n; j++)
436*00d97012SDavid du Colombier { if (strncmp(l->s->name, ln[j].s, ln[j].n) == 0
4377dd7cddfSDavid du Colombier && strcmp(l->c->name, s->name) == 0)
438219b2ee8SDavid du Colombier { fprintf(tc, "\t%s[%d][%d] = 1;\n",
439219b2ee8SDavid du Colombier ln[j].t, i, l->e->seqno);
440219b2ee8SDavid du Colombier acceptors += ln[j].m;
441219b2ee8SDavid du Colombier progressors += ln[j].p;
4427dd7cddfSDavid du Colombier if (l->e->status & D_ATOM)
4437dd7cddfSDavid du Colombier { sprintf(foo, "%s label inside d_step",
4447dd7cddfSDavid du Colombier ln[j].s);
4457dd7cddfSDavid du Colombier goto complain;
446219b2ee8SDavid du Colombier }
447312a1df1SDavid du Colombier if (j > 0 && (l->e->status & ATOM))
4487dd7cddfSDavid du Colombier { sprintf(foo, "%s label inside atomic",
4497dd7cddfSDavid du Colombier ln[j].s);
4507dd7cddfSDavid du Colombier complain: lineno = l->e->n->ln;
4517dd7cddfSDavid du Colombier Fname = l->e->n->fn;
4527dd7cddfSDavid du Colombier printf("spin: %3d:%s, warning, %s - is invisible\n",
4537dd7cddfSDavid du Colombier lineno, Fname?Fname->name:"-", foo);
454*00d97012SDavid du Colombier } } }
4557dd7cddfSDavid du Colombier /* visible states -- through remote refs: */
4567dd7cddfSDavid du Colombier for (l = labtab; l; l = l->nxt)
4577dd7cddfSDavid du Colombier if (l->visible
4587dd7cddfSDavid du Colombier && strcmp(l->s->context->name, s->name) == 0)
4597dd7cddfSDavid du Colombier fprintf(tc, "\tvisstate[%d][%d] = 1;\n",
4607dd7cddfSDavid du Colombier i, l->e->seqno);
4617dd7cddfSDavid du Colombier
4627dd7cddfSDavid du Colombier lineno = oln;
4637dd7cddfSDavid du Colombier Fname = ofn;
464219b2ee8SDavid du Colombier }
465219b2ee8SDavid du Colombier
466219b2ee8SDavid du Colombier void
ntimes(FILE * fd,int n,int m,char * c[])467219b2ee8SDavid du Colombier ntimes(FILE *fd, int n, int m, char *c[])
468219b2ee8SDavid du Colombier {
469219b2ee8SDavid du Colombier int i, j;
470219b2ee8SDavid du Colombier for (j = 0; c[j]; j++)
471219b2ee8SDavid du Colombier for (i = n; i < m; i++)
472219b2ee8SDavid du Colombier { fprintf(fd, c[j], i, i, i, i, i, i);
473219b2ee8SDavid du Colombier fprintf(fd, "\n");
474219b2ee8SDavid du Colombier }
475219b2ee8SDavid du Colombier }
476219b2ee8SDavid du Colombier
4777dd7cddfSDavid du Colombier void
prehint(Symbol * s)4787dd7cddfSDavid du Colombier prehint(Symbol *s)
4797dd7cddfSDavid du Colombier { Lextok *n;
4807dd7cddfSDavid du Colombier
4817dd7cddfSDavid du Colombier printf("spin: warning, ");
4827dd7cddfSDavid du Colombier if (!s) return;
4837dd7cddfSDavid du Colombier
4847dd7cddfSDavid du Colombier n = (s->context != ZS)?s->context->ini:s->ini;
4857dd7cddfSDavid du Colombier if (n)
486*00d97012SDavid du Colombier printf("line %s:%d, ", n->fn->name, n->ln);
4877dd7cddfSDavid du Colombier }
4887dd7cddfSDavid du Colombier
4897dd7cddfSDavid du Colombier void
checktype(Symbol * sp,char * s)4907dd7cddfSDavid du Colombier checktype(Symbol *sp, char *s)
4917dd7cddfSDavid du Colombier { char buf[128]; int i;
4927dd7cddfSDavid du Colombier
4937dd7cddfSDavid du Colombier if (!s
4947dd7cddfSDavid du Colombier || (sp->type != BYTE
4957dd7cddfSDavid du Colombier && sp->type != SHORT
4967dd7cddfSDavid du Colombier && sp->type != INT))
4977dd7cddfSDavid du Colombier return;
4987dd7cddfSDavid du Colombier
4997dd7cddfSDavid du Colombier if (sp->hidden&16) /* formal parameter */
5007dd7cddfSDavid du Colombier { ProcList *p; Lextok *f, *t;
5017dd7cddfSDavid du Colombier int posnr = 0;
5027dd7cddfSDavid du Colombier for (p = rdy; p; p = p->nxt)
5037dd7cddfSDavid du Colombier if (p->n->name
5047dd7cddfSDavid du Colombier && strcmp(s, p->n->name) == 0)
5057dd7cddfSDavid du Colombier break;
5067dd7cddfSDavid du Colombier if (p)
5077dd7cddfSDavid du Colombier for (f = p->p; f; f = f->rgt) /* list of types */
5087dd7cddfSDavid du Colombier for (t = f->lft; t; t = t->rgt, posnr++)
5097dd7cddfSDavid du Colombier if (t->sym
5107dd7cddfSDavid du Colombier && strcmp(t->sym->name, sp->name) == 0)
5117dd7cddfSDavid du Colombier { checkrun(sp, posnr);
5127dd7cddfSDavid du Colombier return;
5137dd7cddfSDavid du Colombier }
5147dd7cddfSDavid du Colombier
5157dd7cddfSDavid du Colombier } else if (!(sp->hidden&4))
5167dd7cddfSDavid du Colombier { if (!(verbose&32)) return;
5177dd7cddfSDavid du Colombier sputtype(buf, sp->type);
518312a1df1SDavid du Colombier i = (int) strlen(buf);
519*00d97012SDavid du Colombier while (i > 0 && buf[--i] == ' ') buf[i] = '\0';
5207dd7cddfSDavid du Colombier prehint(sp);
5217dd7cddfSDavid du Colombier if (sp->context)
5227dd7cddfSDavid du Colombier printf("proctype %s:", s);
5237dd7cddfSDavid du Colombier else
5247dd7cddfSDavid du Colombier printf("global");
5257dd7cddfSDavid du Colombier printf(" '%s %s' could be declared 'bit %s'\n",
5267dd7cddfSDavid du Colombier buf, sp->name, sp->name);
5277dd7cddfSDavid du Colombier } else if (sp->type != BYTE && !(sp->hidden&8))
5287dd7cddfSDavid du Colombier { if (!(verbose&32)) return;
5297dd7cddfSDavid du Colombier sputtype(buf, sp->type);
530312a1df1SDavid du Colombier i = (int) strlen(buf);
5317dd7cddfSDavid du Colombier while (buf[--i] == ' ') buf[i] = '\0';
5327dd7cddfSDavid du Colombier prehint(sp);
5337dd7cddfSDavid du Colombier if (sp->context)
5347dd7cddfSDavid du Colombier printf("proctype %s:", s);
5357dd7cddfSDavid du Colombier else
5367dd7cddfSDavid du Colombier printf("global");
5377dd7cddfSDavid du Colombier printf(" '%s %s' could be declared 'byte %s'\n",
5387dd7cddfSDavid du Colombier buf, sp->name, sp->name);
5397dd7cddfSDavid du Colombier }
5407dd7cddfSDavid du Colombier }
541219b2ee8SDavid du Colombier
542*00d97012SDavid du Colombier static int
dolocal(FILE * ofd,char * pre,int dowhat,int p,char * s,enum btypes b)543*00d97012SDavid du Colombier dolocal(FILE *ofd, char *pre, int dowhat, int p, char *s, enum btypes b)
5447dd7cddfSDavid du Colombier { int h, j, k=0; extern int nr_errs;
5457dd7cddfSDavid du Colombier Ordered *walk;
546219b2ee8SDavid du Colombier Symbol *sp;
547*00d97012SDavid du Colombier char buf[128], buf2[128], buf3[128];
548219b2ee8SDavid du Colombier
549f3793cddSDavid du Colombier if (dowhat == INIV)
550f3793cddSDavid du Colombier { /* initialize in order of declaration */
551f3793cddSDavid du Colombier for (walk = all_names; walk; walk = walk->next)
552f3793cddSDavid du Colombier { sp = walk->entry;
553f3793cddSDavid du Colombier if (sp->context
554f3793cddSDavid du Colombier && !sp->owner
555f3793cddSDavid du Colombier && strcmp(s, sp->context->name) == 0)
556f3793cddSDavid du Colombier { checktype(sp, s); /* fall through */
557f3793cddSDavid du Colombier if (!(sp->hidden&16))
558f3793cddSDavid du Colombier { sprintf(buf, "((P%d *)pptr(h))->", p);
559f3793cddSDavid du Colombier do_var(ofd, dowhat, buf, sp, "", " = ", ";\n");
560f3793cddSDavid du Colombier }
561f3793cddSDavid du Colombier k++;
562f3793cddSDavid du Colombier } }
563f3793cddSDavid du Colombier } else
564f3793cddSDavid du Colombier { for (j = 0; j < 8; j++)
5657dd7cddfSDavid du Colombier for (h = 0; h <= 1; h++)
5667dd7cddfSDavid du Colombier for (walk = all_names; walk; walk = walk->next)
5677dd7cddfSDavid du Colombier { sp = walk->entry;
568219b2ee8SDavid du Colombier if (sp->context
569219b2ee8SDavid du Colombier && !sp->owner
570219b2ee8SDavid du Colombier && sp->type == Types[j]
571*00d97012SDavid du Colombier && ((h == 0 && (sp->nel == 1 && sp->isarray == 0))
572*00d97012SDavid du Colombier || (h == 1 && (sp->nel > 1 || sp->isarray == 1)))
573219b2ee8SDavid du Colombier && strcmp(s, sp->context->name) == 0)
5747dd7cddfSDavid du Colombier { switch (dowhat) {
5757dd7cddfSDavid du Colombier case LOGV:
5767dd7cddfSDavid du Colombier if (sp->type == CHAN
5777dd7cddfSDavid du Colombier && verbose == 0)
5787dd7cddfSDavid du Colombier break;
5797dd7cddfSDavid du Colombier sprintf(buf, "%s%s:", pre, s);
5807dd7cddfSDavid du Colombier { sprintf(buf2, "\", ((P%d *)pptr(h))->", p);
581312a1df1SDavid du Colombier sprintf(buf3, ");\n");
5827dd7cddfSDavid du Colombier }
5837dd7cddfSDavid du Colombier do_var(ofd, dowhat, "", sp, buf, buf2, buf3);
5847dd7cddfSDavid du Colombier break;
5857dd7cddfSDavid du Colombier case PUTV:
5867dd7cddfSDavid du Colombier sprintf(buf, "((P%d *)pptr(h))->", p);
5877dd7cddfSDavid du Colombier do_var(ofd, dowhat, buf, sp, "", " = ", ";\n");
5887dd7cddfSDavid du Colombier k++;
5897dd7cddfSDavid du Colombier break;
5907dd7cddfSDavid du Colombier }
591*00d97012SDavid du Colombier if (b == N_CLAIM)
5927dd7cddfSDavid du Colombier { printf("error: %s defines local %s\n",
5937dd7cddfSDavid du Colombier s, sp->name);
594219b2ee8SDavid du Colombier nr_errs++;
595f3793cddSDavid du Colombier } } } }
596f3793cddSDavid du Colombier
597219b2ee8SDavid du Colombier return k;
598219b2ee8SDavid du Colombier }
599219b2ee8SDavid du Colombier
600312a1df1SDavid du Colombier void
c_chandump(FILE * fd)601312a1df1SDavid du Colombier c_chandump(FILE *fd)
602312a1df1SDavid du Colombier { Queue *q;
603312a1df1SDavid du Colombier char buf[256];
604312a1df1SDavid du Colombier int i;
605312a1df1SDavid du Colombier
606312a1df1SDavid du Colombier if (!qtab)
607312a1df1SDavid du Colombier { fprintf(fd, "void\nc_chandump(int unused) ");
608*00d97012SDavid du Colombier fprintf(fd, "{ unused++; /* avoid complaints */ }\n");
609312a1df1SDavid du Colombier return;
610312a1df1SDavid du Colombier }
611312a1df1SDavid du Colombier
612312a1df1SDavid du Colombier fprintf(fd, "void\nc_chandump(int from)\n");
613312a1df1SDavid du Colombier fprintf(fd, "{ uchar *z; int slot;\n");
614312a1df1SDavid du Colombier
615312a1df1SDavid du Colombier fprintf(fd, " from--;\n");
616312a1df1SDavid du Colombier fprintf(fd, " if (from >= (int) now._nr_qs || from < 0)\n");
617312a1df1SDavid du Colombier fprintf(fd, " { printf(\"pan: bad qid %%d\\n\", from+1);\n");
618312a1df1SDavid du Colombier fprintf(fd, " return;\n");
619312a1df1SDavid du Colombier fprintf(fd, " }\n");
620312a1df1SDavid du Colombier fprintf(fd, " z = qptr(from);\n");
621312a1df1SDavid du Colombier fprintf(fd, " switch (((Q0 *)z)->_t) {\n");
622312a1df1SDavid du Colombier
623312a1df1SDavid du Colombier for (q = qtab; q; q = q->nxt)
624312a1df1SDavid du Colombier { fprintf(fd, " case %d:\n\t\t", q->qid);
625312a1df1SDavid du Colombier sprintf(buf, "((Q%d *)z)->", q->qid);
626312a1df1SDavid du Colombier
627312a1df1SDavid du Colombier fprintf(fd, "for (slot = 0; slot < %sQlen; slot++)\n\t\t", buf);
628312a1df1SDavid du Colombier fprintf(fd, "{ printf(\" [\");\n\t\t");
629312a1df1SDavid du Colombier for (i = 0; i < q->nflds; i++)
630312a1df1SDavid du Colombier { if (q->fld_width[i] == MTYPE)
631312a1df1SDavid du Colombier { fprintf(fd, "\tprintm(%scontents[slot].fld%d);\n\t\t",
632312a1df1SDavid du Colombier buf, i);
633312a1df1SDavid du Colombier } else
634312a1df1SDavid du Colombier fprintf(fd, "\tprintf(\"%%d,\", %scontents[slot].fld%d);\n\t\t",
635312a1df1SDavid du Colombier buf, i);
636312a1df1SDavid du Colombier }
637312a1df1SDavid du Colombier fprintf(fd, " printf(\"],\");\n\t\t");
638312a1df1SDavid du Colombier fprintf(fd, "}\n\t\t");
639312a1df1SDavid du Colombier fprintf(fd, "break;\n");
640312a1df1SDavid du Colombier }
641312a1df1SDavid du Colombier fprintf(fd, " }\n");
642312a1df1SDavid du Colombier fprintf(fd, " printf(\"\\n\");\n}\n");
643312a1df1SDavid du Colombier }
644312a1df1SDavid du Colombier
645312a1df1SDavid du Colombier void
c_var(FILE * fd,char * pref,Symbol * sp)646312a1df1SDavid du Colombier c_var(FILE *fd, char *pref, Symbol *sp)
647*00d97012SDavid du Colombier { char *ptr, buf[256];
648312a1df1SDavid du Colombier int i;
649312a1df1SDavid du Colombier
650*00d97012SDavid du Colombier if (!sp)
651*00d97012SDavid du Colombier { fatal("cannot happen - c_var", 0);
652*00d97012SDavid du Colombier }
653*00d97012SDavid du Colombier
654*00d97012SDavid du Colombier ptr = sp?sp->name:"";
655*00d97012SDavid du Colombier if (!old_scope_rules)
656*00d97012SDavid du Colombier { while (*ptr == '_' || isdigit((int)*ptr))
657*00d97012SDavid du Colombier { ptr++;
658*00d97012SDavid du Colombier } }
659*00d97012SDavid du Colombier
660312a1df1SDavid du Colombier switch (sp->type) {
661312a1df1SDavid du Colombier case STRUCT:
662312a1df1SDavid du Colombier /* c_struct(fd, pref, sp); */
663312a1df1SDavid du Colombier fprintf(fd, "\t\tprintf(\"\t(struct %s)\\n\");\n",
664312a1df1SDavid du Colombier sp->name);
665312a1df1SDavid du Colombier sprintf(buf, "%s%s.", pref, sp->name);
666312a1df1SDavid du Colombier c_struct(fd, buf, sp);
667312a1df1SDavid du Colombier break;
668312a1df1SDavid du Colombier case BIT: case BYTE:
669312a1df1SDavid du Colombier case SHORT: case INT:
670312a1df1SDavid du Colombier case UNSIGNED:
671312a1df1SDavid du Colombier sputtype(buf, sp->type);
672*00d97012SDavid du Colombier if (sp->nel == 1 && sp->isarray == 0)
673f3793cddSDavid du Colombier { fprintf(fd, "\tprintf(\"\t%s %s:\t%%d\\n\", %s%s);\n",
674*00d97012SDavid du Colombier buf, ptr, pref, sp->name);
675f3793cddSDavid du Colombier } else
676f3793cddSDavid du Colombier { fprintf(fd, "\t{\tint l_in;\n");
677f3793cddSDavid du Colombier fprintf(fd, "\t\tfor (l_in = 0; l_in < %d; l_in++)\n", sp->nel);
678f3793cddSDavid du Colombier fprintf(fd, "\t\t{\n");
679f3793cddSDavid du Colombier fprintf(fd, "\t\t\tprintf(\"\t%s %s[%%d]:\t%%d\\n\", l_in, %s%s[l_in]);\n",
680*00d97012SDavid du Colombier buf, ptr, pref, sp->name);
681f3793cddSDavid du Colombier fprintf(fd, "\t\t}\n");
682f3793cddSDavid du Colombier fprintf(fd, "\t}\n");
683f3793cddSDavid du Colombier }
684312a1df1SDavid du Colombier break;
685312a1df1SDavid du Colombier case CHAN:
686*00d97012SDavid du Colombier if (sp->nel == 1 && sp->isarray == 0)
687*00d97012SDavid du Colombier { fprintf(fd, "\tprintf(\"\tchan %s (=%%d):\tlen %%d:\\t\", ", ptr);
688312a1df1SDavid du Colombier fprintf(fd, "%s%s, q_len(%s%s));\n",
689312a1df1SDavid du Colombier pref, sp->name, pref, sp->name);
690312a1df1SDavid du Colombier fprintf(fd, "\tc_chandump(%s%s);\n", pref, sp->name);
691312a1df1SDavid du Colombier } else
692312a1df1SDavid du Colombier for (i = 0; i < sp->nel; i++)
693312a1df1SDavid du Colombier { fprintf(fd, "\tprintf(\"\tchan %s[%d] (=%%d):\tlen %%d:\\t\", ",
694*00d97012SDavid du Colombier ptr, i);
695312a1df1SDavid du Colombier fprintf(fd, "%s%s[%d], q_len(%s%s[%d]));\n",
696312a1df1SDavid du Colombier pref, sp->name, i, pref, sp->name, i);
697312a1df1SDavid du Colombier fprintf(fd, "\tc_chandump(%s%s[%d]);\n",
698312a1df1SDavid du Colombier pref, sp->name, i);
699312a1df1SDavid du Colombier }
700312a1df1SDavid du Colombier break;
701312a1df1SDavid du Colombier }
702312a1df1SDavid du Colombier }
703312a1df1SDavid du Colombier
704f3793cddSDavid du Colombier int
c_splurge_any(ProcList * p)705f3793cddSDavid du Colombier c_splurge_any(ProcList *p)
706f3793cddSDavid du Colombier { Ordered *walk;
707f3793cddSDavid du Colombier Symbol *sp;
708f3793cddSDavid du Colombier
709*00d97012SDavid du Colombier if (p->b != N_CLAIM && p->b != E_TRACE && p->b != N_TRACE)
710f3793cddSDavid du Colombier for (walk = all_names; walk; walk = walk->next)
711f3793cddSDavid du Colombier { sp = walk->entry;
712f3793cddSDavid du Colombier if (!sp->context
713f3793cddSDavid du Colombier || sp->type == 0
714f3793cddSDavid du Colombier || strcmp(sp->context->name, p->n->name) != 0
715f3793cddSDavid du Colombier || sp->owner || (sp->hidden&1)
716f3793cddSDavid du Colombier || (sp->type == MTYPE && ismtype(sp->name)))
717f3793cddSDavid du Colombier continue;
718f3793cddSDavid du Colombier
719f3793cddSDavid du Colombier return 1;
720f3793cddSDavid du Colombier }
721f3793cddSDavid du Colombier return 0;
722f3793cddSDavid du Colombier }
723f3793cddSDavid du Colombier
724312a1df1SDavid du Colombier void
c_splurge(FILE * fd,ProcList * p)725312a1df1SDavid du Colombier c_splurge(FILE *fd, ProcList *p)
726312a1df1SDavid du Colombier { Ordered *walk;
727312a1df1SDavid du Colombier Symbol *sp;
728312a1df1SDavid du Colombier char pref[64];
729312a1df1SDavid du Colombier
730*00d97012SDavid du Colombier if (p->b != N_CLAIM && p->b != E_TRACE && p->b != N_TRACE)
731312a1df1SDavid du Colombier for (walk = all_names; walk; walk = walk->next)
732312a1df1SDavid du Colombier { sp = walk->entry;
733312a1df1SDavid du Colombier if (!sp->context
734f3793cddSDavid du Colombier || sp->type == 0
735312a1df1SDavid du Colombier || strcmp(sp->context->name, p->n->name) != 0
736312a1df1SDavid du Colombier || sp->owner || (sp->hidden&1)
737312a1df1SDavid du Colombier || (sp->type == MTYPE && ismtype(sp->name)))
738312a1df1SDavid du Colombier continue;
739312a1df1SDavid du Colombier
740312a1df1SDavid du Colombier sprintf(pref, "((P%d *)pptr(pid))->", p->tn);
741312a1df1SDavid du Colombier c_var(fd, pref, sp);
742312a1df1SDavid du Colombier }
743312a1df1SDavid du Colombier }
744312a1df1SDavid du Colombier
745312a1df1SDavid du Colombier void
c_wrapper(FILE * fd)746312a1df1SDavid du Colombier c_wrapper(FILE *fd) /* allow pan.c to print out global sv entries */
747312a1df1SDavid du Colombier { Ordered *walk;
748312a1df1SDavid du Colombier ProcList *p;
749312a1df1SDavid du Colombier Symbol *sp;
750312a1df1SDavid du Colombier Lextok *n;
751312a1df1SDavid du Colombier extern Lextok *Mtype;
752312a1df1SDavid du Colombier int j;
753312a1df1SDavid du Colombier
754312a1df1SDavid du Colombier fprintf(fd, "void\nc_globals(void)\n{\t/* int i; */\n");
755312a1df1SDavid du Colombier fprintf(fd, " printf(\"global vars:\\n\");\n");
756312a1df1SDavid du Colombier for (walk = all_names; walk; walk = walk->next)
757312a1df1SDavid du Colombier { sp = walk->entry;
758312a1df1SDavid du Colombier if (sp->context || sp->owner || (sp->hidden&1)
759312a1df1SDavid du Colombier || (sp->type == MTYPE && ismtype(sp->name)))
760312a1df1SDavid du Colombier continue;
761312a1df1SDavid du Colombier
762312a1df1SDavid du Colombier c_var(fd, "now.", sp);
763312a1df1SDavid du Colombier }
764312a1df1SDavid du Colombier fprintf(fd, "}\n");
765312a1df1SDavid du Colombier
766312a1df1SDavid du Colombier fprintf(fd, "void\nc_locals(int pid, int tp)\n{\t/* int i; */\n");
767312a1df1SDavid du Colombier fprintf(fd, " switch(tp) {\n");
768312a1df1SDavid du Colombier for (p = rdy; p; p = p->nxt)
769312a1df1SDavid du Colombier { fprintf(fd, " case %d:\n", p->tn);
770f3793cddSDavid du Colombier if (c_splurge_any(p))
771f3793cddSDavid du Colombier { fprintf(fd, " \tprintf(\"local vars proc %%d (%s):\\n\", pid);\n",
772f3793cddSDavid du Colombier p->n->name);
773312a1df1SDavid du Colombier c_splurge(fd, p);
774f3793cddSDavid du Colombier } else
775f3793cddSDavid du Colombier { fprintf(fd, " \t/* none */\n");
776f3793cddSDavid du Colombier }
777312a1df1SDavid du Colombier fprintf(fd, " \tbreak;\n");
778312a1df1SDavid du Colombier }
779312a1df1SDavid du Colombier fprintf(fd, " }\n}\n");
780312a1df1SDavid du Colombier
781312a1df1SDavid du Colombier fprintf(fd, "void\nprintm(int x)\n{\n");
782312a1df1SDavid du Colombier fprintf(fd, " switch (x) {\n");
783312a1df1SDavid du Colombier for (n = Mtype, j = 1; n && j; n = n->rgt, j++)
784312a1df1SDavid du Colombier fprintf(fd, "\tcase %d: Printf(\"%s\"); break;\n",
785312a1df1SDavid du Colombier j, n->lft->sym->name);
786312a1df1SDavid du Colombier fprintf(fd, " default: Printf(\"%%d\", x);\n");
787312a1df1SDavid du Colombier fprintf(fd, " }\n");
788312a1df1SDavid du Colombier fprintf(fd, "}\n");
789312a1df1SDavid du Colombier }
790312a1df1SDavid du Colombier
7917dd7cddfSDavid du Colombier static int
doglobal(char * pre,int dowhat)7927dd7cddfSDavid du Colombier doglobal(char *pre, int dowhat)
7937dd7cddfSDavid du Colombier { Ordered *walk;
7947dd7cddfSDavid du Colombier Symbol *sp;
7957dd7cddfSDavid du Colombier int j, cnt = 0;
796219b2ee8SDavid du Colombier
7977dd7cddfSDavid du Colombier for (j = 0; j < 8; j++)
7987dd7cddfSDavid du Colombier for (walk = all_names; walk; walk = walk->next)
7997dd7cddfSDavid du Colombier { sp = walk->entry;
800219b2ee8SDavid du Colombier if (!sp->context
801219b2ee8SDavid du Colombier && !sp->owner
802219b2ee8SDavid du Colombier && sp->type == Types[j])
8037dd7cddfSDavid du Colombier { if (Types[j] != MTYPE || !ismtype(sp->name))
8047dd7cddfSDavid du Colombier switch (dowhat) {
8057dd7cddfSDavid du Colombier case LOGV:
8067dd7cddfSDavid du Colombier if (sp->type == CHAN
8077dd7cddfSDavid du Colombier && verbose == 0)
8087dd7cddfSDavid du Colombier break;
8097dd7cddfSDavid du Colombier if (sp->hidden&1)
8107dd7cddfSDavid du Colombier break;
8117dd7cddfSDavid du Colombier do_var(tc, dowhat, "", sp,
8127dd7cddfSDavid du Colombier pre, "\", now.", ");\n");
8137dd7cddfSDavid du Colombier break;
8147dd7cddfSDavid du Colombier case INIV:
8157dd7cddfSDavid du Colombier checktype(sp, (char *) 0);
8167dd7cddfSDavid du Colombier cnt++; /* fall through */
8177dd7cddfSDavid du Colombier case PUTV:
818*00d97012SDavid du Colombier do_var(tc, dowhat,
819*00d97012SDavid du Colombier (sp->hidden&1)?"":"now.", sp,
8207dd7cddfSDavid du Colombier "", " = ", ";\n");
8217dd7cddfSDavid du Colombier break;
8227dd7cddfSDavid du Colombier } } }
8237dd7cddfSDavid du Colombier return cnt;
824219b2ee8SDavid du Colombier }
825219b2ee8SDavid du Colombier
8267dd7cddfSDavid du Colombier static void
dohidden(void)827219b2ee8SDavid du Colombier dohidden(void)
8287dd7cddfSDavid du Colombier { Ordered *walk;
8297dd7cddfSDavid du Colombier Symbol *sp;
8307dd7cddfSDavid du Colombier int j;
831219b2ee8SDavid du Colombier
8327dd7cddfSDavid du Colombier for (j = 0; j < 8; j++)
8337dd7cddfSDavid du Colombier for (walk = all_names; walk; walk = walk->next)
8347dd7cddfSDavid du Colombier { sp = walk->entry;
8357dd7cddfSDavid du Colombier if ((sp->hidden&1)
836219b2ee8SDavid du Colombier && sp->type == Types[j])
837219b2ee8SDavid du Colombier { if (sp->context || sp->owner)
838219b2ee8SDavid du Colombier fatal("cannot hide non-globals (%s)", sp->name);
839219b2ee8SDavid du Colombier if (sp->type == CHAN)
840219b2ee8SDavid du Colombier fatal("cannot hide channels (%s)", sp->name);
841219b2ee8SDavid du Colombier fprintf(th, "/* hidden variable: */");
842219b2ee8SDavid du Colombier typ2c(sp);
8437dd7cddfSDavid du Colombier } }
8447dd7cddfSDavid du Colombier fprintf(th, "int _; /* a predefined write-only variable */\n\n");
845219b2ee8SDavid du Colombier }
846219b2ee8SDavid du Colombier
847219b2ee8SDavid du Colombier void
do_var(FILE * ofd,int dowhat,char * s,Symbol * sp,char * pre,char * sep,char * ter)8487dd7cddfSDavid du Colombier do_var(FILE *ofd, int dowhat, char *s, Symbol *sp,
8497dd7cddfSDavid du Colombier char *pre, char *sep, char *ter)
850219b2ee8SDavid du Colombier { int i;
851*00d97012SDavid du Colombier char *ptr = sp?sp->name:"";
852*00d97012SDavid du Colombier
853*00d97012SDavid du Colombier if (!sp)
854*00d97012SDavid du Colombier { fatal("cannot happen - do_var", 0);
855*00d97012SDavid du Colombier }
856219b2ee8SDavid du Colombier
857219b2ee8SDavid du Colombier switch(dowhat) {
858219b2ee8SDavid du Colombier case PUTV:
8597dd7cddfSDavid du Colombier if (sp->hidden&1) break;
8607dd7cddfSDavid du Colombier
861219b2ee8SDavid du Colombier typ2c(sp);
862219b2ee8SDavid du Colombier break;
863*00d97012SDavid du Colombier
8647dd7cddfSDavid du Colombier case LOGV:
865*00d97012SDavid du Colombier if (!old_scope_rules)
866*00d97012SDavid du Colombier { while (*ptr == '_' || isdigit((int)*ptr))
867*00d97012SDavid du Colombier { ptr++;
868*00d97012SDavid du Colombier } }
869*00d97012SDavid du Colombier /* fall thru */
870219b2ee8SDavid du Colombier case INIV:
871219b2ee8SDavid du Colombier if (sp->type == STRUCT)
872219b2ee8SDavid du Colombier { /* struct may contain a chan */
8737dd7cddfSDavid du Colombier walk_struct(ofd, dowhat, s, sp, pre, sep, ter);
874219b2ee8SDavid du Colombier break;
875219b2ee8SDavid du Colombier }
8767dd7cddfSDavid du Colombier if (!sp->ini && dowhat != LOGV) /* it defaults to 0 */
877219b2ee8SDavid du Colombier break;
878*00d97012SDavid du Colombier if (sp->nel == 1 && sp->isarray == 0)
879*00d97012SDavid du Colombier { if (dowhat == LOGV)
880*00d97012SDavid du Colombier { fprintf(ofd, "\t\t%s%s%s%s",
881*00d97012SDavid du Colombier pre, s, ptr, sep);
882*00d97012SDavid du Colombier fprintf(ofd, "%s%s", s, sp->name);
883*00d97012SDavid du Colombier } else
8847dd7cddfSDavid du Colombier { fprintf(ofd, "\t\t%s%s%s%s",
8857dd7cddfSDavid du Colombier pre, s, sp->name, sep);
8867dd7cddfSDavid du Colombier do_init(ofd, sp);
887*00d97012SDavid du Colombier }
8887dd7cddfSDavid du Colombier fprintf(ofd, "%s", ter);
889219b2ee8SDavid du Colombier } else
890f3793cddSDavid du Colombier { if (sp->ini && sp->ini->ntyp == CHAN)
891f3793cddSDavid du Colombier { for (i = 0; i < sp->nel; i++)
8927dd7cddfSDavid du Colombier { fprintf(ofd, "\t\t%s%s%s[%d]%s",
8937dd7cddfSDavid du Colombier pre, s, sp->name, i, sep);
8947dd7cddfSDavid du Colombier if (dowhat == LOGV)
8957dd7cddfSDavid du Colombier fprintf(ofd, "%s%s[%d]",
8967dd7cddfSDavid du Colombier s, sp->name, i);
8977dd7cddfSDavid du Colombier else
8987dd7cddfSDavid du Colombier do_init(ofd, sp);
8997dd7cddfSDavid du Colombier fprintf(ofd, "%s", ter);
900219b2ee8SDavid du Colombier }
901f3793cddSDavid du Colombier } else
902f3793cddSDavid du Colombier { fprintf(ofd, "\t{\tint l_in;\n");
903f3793cddSDavid du Colombier fprintf(ofd, "\t\tfor (l_in = 0; l_in < %d; l_in++)\n", sp->nel);
904f3793cddSDavid du Colombier fprintf(ofd, "\t\t{\n");
905f3793cddSDavid du Colombier fprintf(ofd, "\t\t\t%s%s%s[l_in]%s",
906f3793cddSDavid du Colombier pre, s, sp->name, sep);
907f3793cddSDavid du Colombier if (dowhat == LOGV)
908f3793cddSDavid du Colombier fprintf(ofd, "%s%s[l_in]", s, sp->name);
909f3793cddSDavid du Colombier else
910f3793cddSDavid du Colombier putstmnt(ofd, sp->ini, 0);
911f3793cddSDavid du Colombier fprintf(ofd, "%s", ter);
912f3793cddSDavid du Colombier fprintf(ofd, "\t\t}\n");
913f3793cddSDavid du Colombier fprintf(ofd, "\t}\n");
914f3793cddSDavid du Colombier } }
915219b2ee8SDavid du Colombier break;
916219b2ee8SDavid du Colombier }
917219b2ee8SDavid du Colombier }
918219b2ee8SDavid du Colombier
9197dd7cddfSDavid du Colombier static void
do_init(FILE * ofd,Symbol * sp)9207dd7cddfSDavid du Colombier do_init(FILE *ofd, Symbol *sp)
921*00d97012SDavid du Colombier { int i;
922219b2ee8SDavid du Colombier
9237dd7cddfSDavid du Colombier if (sp->ini
9247dd7cddfSDavid du Colombier && sp->type == CHAN
9257dd7cddfSDavid du Colombier && ((i = qmake(sp)) > 0))
926219b2ee8SDavid du Colombier { if (sp->ini->ntyp == CHAN)
927*00d97012SDavid du Colombier { fprintf(ofd, "addqueue(calling_pid, %d, %d)",
928219b2ee8SDavid du Colombier i, ltab[i-1]->nslots == 0);
929219b2ee8SDavid du Colombier } else
930*00d97012SDavid du Colombier { fprintf(ofd, "%d", i);
931219b2ee8SDavid du Colombier }
932*00d97012SDavid du Colombier } else
933*00d97012SDavid du Colombier { putstmnt(ofd, sp->ini, 0);
934*00d97012SDavid du Colombier }
935219b2ee8SDavid du Colombier }
936219b2ee8SDavid du Colombier
9377dd7cddfSDavid du Colombier static void
put_ptype(char * s,int i,int m0,int m1,enum btypes b)938*00d97012SDavid du Colombier put_ptype(char *s, int i, int m0, int m1, enum btypes b)
939219b2ee8SDavid du Colombier { int k;
940219b2ee8SDavid du Colombier
941*00d97012SDavid du Colombier if (b == I_PROC)
942*00d97012SDavid du Colombier { fprintf(th, "#define Pinit ((P%d *)this)\n", i);
943*00d97012SDavid du Colombier } else if (b == P_PROC || b == A_PROC)
944*00d97012SDavid du Colombier { fprintf(th, "#define P%s ((P%d *)this)\n", s, i);
945*00d97012SDavid du Colombier }
946312a1df1SDavid du Colombier
947219b2ee8SDavid du Colombier fprintf(th, "typedef struct P%d { /* %s */\n", i, s);
948219b2ee8SDavid du Colombier fprintf(th, " unsigned _pid : 8; /* 0..255 */\n");
949219b2ee8SDavid du Colombier fprintf(th, " unsigned _t : %d; /* proctype */\n", blog(m1));
950219b2ee8SDavid du Colombier fprintf(th, " unsigned _p : %d; /* state */\n", blog(m0));
951219b2ee8SDavid du Colombier LstSet = ZS;
952219b2ee8SDavid du Colombier nBits = 8 + blog(m1) + blog(m0);
953*00d97012SDavid du Colombier k = dolocal(tc, "", PUTV, i, s, b); /* includes pars */
954312a1df1SDavid du Colombier
955312a1df1SDavid du Colombier c_add_loc(th, s);
956312a1df1SDavid du Colombier
957219b2ee8SDavid du Colombier fprintf(th, "} P%d;\n", i);
958312a1df1SDavid du Colombier if ((!LstSet && k > 0) || has_state)
959219b2ee8SDavid du Colombier fprintf(th, "#define Air%d 0\n", i);
960*00d97012SDavid du Colombier else if (LstSet || k == 0) /* 5.0, added condition */
961219b2ee8SDavid du Colombier { fprintf(th, "#define Air%d (sizeof(P%d) - ", i, i);
962219b2ee8SDavid du Colombier if (k == 0)
963219b2ee8SDavid du Colombier { fprintf(th, "%d", (nBits+7)/8);
964219b2ee8SDavid du Colombier goto done;
965219b2ee8SDavid du Colombier }
9667dd7cddfSDavid du Colombier if ((LstSet->type != BIT && LstSet->type != UNSIGNED)
9677dd7cddfSDavid du Colombier || LstSet->nel != 1)
968312a1df1SDavid du Colombier { fprintf(th, "Offsetof(P%d, %s) - %d*sizeof(",
969312a1df1SDavid du Colombier i, LstSet->name, LstSet->nel);
970219b2ee8SDavid du Colombier }
971219b2ee8SDavid du Colombier switch(LstSet->type) {
9727dd7cddfSDavid du Colombier case UNSIGNED:
9737dd7cddfSDavid du Colombier fprintf(th, "%d", (nBits+7)/8);
9747dd7cddfSDavid du Colombier break;
975219b2ee8SDavid du Colombier case BIT:
9767dd7cddfSDavid du Colombier if (LstSet->nel == 1)
977219b2ee8SDavid du Colombier { fprintf(th, "%d", (nBits+7)/8);
978219b2ee8SDavid du Colombier break;
979219b2ee8SDavid du Colombier } /* else fall through */
9807dd7cddfSDavid du Colombier case MTYPE: case BYTE: case CHAN:
981219b2ee8SDavid du Colombier fprintf(th, "uchar)"); break;
982219b2ee8SDavid du Colombier case SHORT:
983219b2ee8SDavid du Colombier fprintf(th, "short)"); break;
984219b2ee8SDavid du Colombier case INT:
985219b2ee8SDavid du Colombier fprintf(th, "int)"); break;
986219b2ee8SDavid du Colombier default:
987219b2ee8SDavid du Colombier fatal("cannot happen Air %s",
988219b2ee8SDavid du Colombier LstSet->name);
989219b2ee8SDavid du Colombier }
990219b2ee8SDavid du Colombier done: fprintf(th, ")\n");
991219b2ee8SDavid du Colombier }
992219b2ee8SDavid du Colombier }
993219b2ee8SDavid du Colombier
9947dd7cddfSDavid du Colombier static void
tc_predef_np(void)9957dd7cddfSDavid du Colombier tc_predef_np(void)
9967dd7cddfSDavid du Colombier { int i = nrRdy; /* 1+ highest proctype nr */
9977dd7cddfSDavid du Colombier
9987dd7cddfSDavid du Colombier fprintf(th, "#define _NP_ %d\n", i);
999f3793cddSDavid du Colombier /* if (separate == 2) fprintf(th, "extern "); */
10007dd7cddfSDavid du Colombier fprintf(th, "uchar reached%d[3]; /* np_ */\n", i);
1001*00d97012SDavid du Colombier fprintf(th, "uchar *loopstate%d; /* np_ */\n", i);
10027dd7cddfSDavid du Colombier
10037dd7cddfSDavid du Colombier fprintf(th, "#define nstates%d 3 /* np_ */\n", i);
10047dd7cddfSDavid du Colombier fprintf(th, "#define endstate%d 2 /* np_ */\n\n", i);
10057dd7cddfSDavid du Colombier fprintf(th, "#define start%d 0 /* np_ */\n", i);
10067dd7cddfSDavid du Colombier
10077dd7cddfSDavid du Colombier fprintf(tc, "\tcase %d: /* np_ */\n", i);
10087dd7cddfSDavid du Colombier if (separate == 1)
10097dd7cddfSDavid du Colombier { fprintf(tc, "\t\tini_claim(%d, h);\n", i);
10107dd7cddfSDavid du Colombier } else
10117dd7cddfSDavid du Colombier { fprintf(tc, "\t\t((P%d *)pptr(h))->_t = %d;\n", i, i);
10127dd7cddfSDavid du Colombier fprintf(tc, "\t\t((P%d *)pptr(h))->_p = 0;\n", i);
10137dd7cddfSDavid du Colombier fprintf(tc, "\t\treached%d[0] = 1;\n", i);
10147dd7cddfSDavid du Colombier fprintf(tc, "\t\taccpstate[%d][1] = 1;\n", i);
10157dd7cddfSDavid du Colombier }
10167dd7cddfSDavid du Colombier fprintf(tc, "\t\tbreak;\n");
10177dd7cddfSDavid du Colombier }
10187dd7cddfSDavid du Colombier
10197dd7cddfSDavid du Colombier static void
multi_init(void)1020*00d97012SDavid du Colombier multi_init(void)
1021*00d97012SDavid du Colombier { ProcList *p;
1022*00d97012SDavid du Colombier Element *e;
1023*00d97012SDavid du Colombier int i = nrRdy+1;
1024*00d97012SDavid du Colombier int ini, j;
1025*00d97012SDavid du Colombier int nrc = nclaims;
1026*00d97012SDavid du Colombier
1027*00d97012SDavid du Colombier fprintf(tc, "#ifndef NOCLAIM\n");
1028*00d97012SDavid du Colombier fprintf(tc, "\tcase %d: /* claim select */\n", i);
1029*00d97012SDavid du Colombier for (p = rdy, j = 0; p; p = p->nxt, j++)
1030*00d97012SDavid du Colombier { if (p->b == N_CLAIM)
1031*00d97012SDavid du Colombier { e = p->s->frst;
1032*00d97012SDavid du Colombier ini = huntele(e, e->status, -1)->seqno;
1033*00d97012SDavid du Colombier
1034*00d97012SDavid du Colombier fprintf(tc, "\t\tspin_c_typ[%d] = %d; /* %s */\n",
1035*00d97012SDavid du Colombier j, p->tn, p->n->name);
1036*00d97012SDavid du Colombier fprintf(tc, "\t\t((P%d *)pptr(h))->c_cur[%d] = %d;\n",
1037*00d97012SDavid du Colombier i, j, ini);
1038*00d97012SDavid du Colombier fprintf(tc, "\t\treached%d[%d]=1;\n", p->tn, ini);
1039*00d97012SDavid du Colombier
1040*00d97012SDavid du Colombier /* the default initial claim is first one in model */
1041*00d97012SDavid du Colombier if (--nrc == 0)
1042*00d97012SDavid du Colombier { fprintf(tc, "\t\t((P%d *)pptr(h))->_t = %d;\n", i, p->tn);
1043*00d97012SDavid du Colombier fprintf(tc, "\t\t((P%d *)pptr(h))->_p = %d;\n", i, ini);
1044*00d97012SDavid du Colombier fprintf(tc, "\t\t((P%d *)pptr(h))->_n = %d; /* %s */\n",
1045*00d97012SDavid du Colombier i, j, p->n->name);
1046*00d97012SDavid du Colombier fprintf(tc, "\t\tsrc_claim = src_ln%d;\n", p->tn);
1047*00d97012SDavid du Colombier fprintf(tc, "#ifndef BFS\n");
1048*00d97012SDavid du Colombier fprintf(tc, "\t\tif (whichclaim == -1 && claimname == NULL)\n");
1049*00d97012SDavid du Colombier fprintf(tc, "\t\t\tprintf(\"0: Claim %s (%d), from state %d\\n\");\n",
1050*00d97012SDavid du Colombier p->n->name, p->tn, ini);
1051*00d97012SDavid du Colombier fprintf(tc, "#endif\n");
1052*00d97012SDavid du Colombier }
1053*00d97012SDavid du Colombier } }
1054*00d97012SDavid du Colombier fprintf(tc, "\t\tif (whichclaim != -1)\n");
1055*00d97012SDavid du Colombier fprintf(tc, "\t\t{ select_claim(whichclaim);\n");
1056*00d97012SDavid du Colombier fprintf(tc, "\t\t}\n");
1057*00d97012SDavid du Colombier fprintf(tc, "\t\tbreak;\n\n");
1058*00d97012SDavid du Colombier fprintf(tc, "#endif\n");
1059*00d97012SDavid du Colombier }
1060*00d97012SDavid du Colombier
1061*00d97012SDavid du Colombier static void
put_pinit(ProcList * P)10627dd7cddfSDavid du Colombier put_pinit(ProcList *P)
1063219b2ee8SDavid du Colombier { Lextok *fp, *fpt, *t;
10647dd7cddfSDavid du Colombier Element *e = P->s->frst;
10657dd7cddfSDavid du Colombier Symbol *s = P->n;
10667dd7cddfSDavid du Colombier Lextok *p = P->p;
10677dd7cddfSDavid du Colombier int i = P->tn;
10687dd7cddfSDavid du Colombier int ini, j, k;
10697dd7cddfSDavid du Colombier
1070*00d97012SDavid du Colombier if (pid_is_claim(i)
10717dd7cddfSDavid du Colombier && separate == 1)
10727dd7cddfSDavid du Colombier { fprintf(tc, "\tcase %d: /* %s */\n", i, s->name);
10737dd7cddfSDavid du Colombier fprintf(tc, "\t\tini_claim(%d, h);\n", i);
10747dd7cddfSDavid du Colombier fprintf(tc, "\t\tbreak;\n");
10757dd7cddfSDavid du Colombier return;
10767dd7cddfSDavid du Colombier }
1077*00d97012SDavid du Colombier if (!pid_is_claim(i)
10787dd7cddfSDavid du Colombier && separate == 2)
10797dd7cddfSDavid du Colombier return;
1080219b2ee8SDavid du Colombier
1081312a1df1SDavid du Colombier ini = huntele(e, e->status, -1)->seqno;
1082219b2ee8SDavid du Colombier fprintf(th, "#define start%d %d\n", i, ini);
10837dd7cddfSDavid du Colombier if (i == eventmapnr)
10847dd7cddfSDavid du Colombier fprintf(th, "#define start_event %d\n", ini);
1085219b2ee8SDavid du Colombier
1086219b2ee8SDavid du Colombier fprintf(tc, "\tcase %d: /* %s */\n", i, s->name);
10877dd7cddfSDavid du Colombier
1088219b2ee8SDavid du Colombier fprintf(tc, "\t\t((P%d *)pptr(h))->_t = %d;\n", i, i);
1089*00d97012SDavid du Colombier fprintf(tc, "\t\t((P%d *)pptr(h))->_p = %d;\n", i, ini);
1090*00d97012SDavid du Colombier fprintf(tc, "\t\treached%d[%d]=1;\n", i, ini);
1091*00d97012SDavid du Colombier if (P->b == N_CLAIM)
1092*00d97012SDavid du Colombier { fprintf(tc, "\t\tsrc_claim = src_ln%d;\n", i);
1093*00d97012SDavid du Colombier }
1094219b2ee8SDavid du Colombier
10957dd7cddfSDavid du Colombier if (has_provided)
10967dd7cddfSDavid du Colombier { fprintf(tt, "\tcase %d: /* %s */\n\t\t", i, s->name);
10977dd7cddfSDavid du Colombier if (P->prov)
10987dd7cddfSDavid du Colombier { fprintf(tt, "if (");
10997dd7cddfSDavid du Colombier putstmnt(tt, P->prov, 0);
11007dd7cddfSDavid du Colombier fprintf(tt, ")\n\t\t\t");
11017dd7cddfSDavid du Colombier }
11027dd7cddfSDavid du Colombier fprintf(tt, "return 1;\n");
11037dd7cddfSDavid du Colombier if (P->prov)
11047dd7cddfSDavid du Colombier fprintf(tt, "\t\tbreak;\n");
11057dd7cddfSDavid du Colombier }
1106219b2ee8SDavid du Colombier
11077dd7cddfSDavid du Colombier fprintf(tc, "\t\t/* params: */\n");
1108219b2ee8SDavid du Colombier for (fp = p, j=0; fp; fp = fp->rgt)
1109219b2ee8SDavid du Colombier for (fpt = fp->lft; fpt; fpt = fpt->rgt, j++)
1110219b2ee8SDavid du Colombier { t = (fpt->ntyp == ',') ? fpt->lft : fpt;
1111*00d97012SDavid du Colombier if (t->sym->nel > 1 || t->sym->isarray)
1112219b2ee8SDavid du Colombier { lineno = t->ln;
1113219b2ee8SDavid du Colombier Fname = t->fn;
1114219b2ee8SDavid du Colombier fatal("array in parameter list, %s",
1115219b2ee8SDavid du Colombier t->sym->name);
1116219b2ee8SDavid du Colombier }
1117219b2ee8SDavid du Colombier fprintf(tc, "\t\t((P%d *)pptr(h))->", i);
1118219b2ee8SDavid du Colombier if (t->sym->type == STRUCT)
11197dd7cddfSDavid du Colombier { if (full_name(tc, t, t->sym, 1))
11207dd7cddfSDavid du Colombier { lineno = t->ln;
11217dd7cddfSDavid du Colombier Fname = t->fn;
1122312a1df1SDavid du Colombier fatal("hidden array in parameter %s",
11237dd7cddfSDavid du Colombier t->sym->name);
11247dd7cddfSDavid du Colombier }
11257dd7cddfSDavid du Colombier } else
1126219b2ee8SDavid du Colombier fprintf(tc, "%s", t->sym->name);
1127219b2ee8SDavid du Colombier fprintf(tc, " = par%d;\n", j);
1128219b2ee8SDavid du Colombier }
11297dd7cddfSDavid du Colombier fprintf(tc, "\t\t/* locals: */\n");
1130*00d97012SDavid du Colombier k = dolocal(tc, "", INIV, i, s->name, P->b);
11317dd7cddfSDavid du Colombier if (k > 0)
11327dd7cddfSDavid du Colombier { fprintf(tc, "#ifdef VAR_RANGES\n");
1133*00d97012SDavid du Colombier (void) dolocal(tc, "logval(\"", LOGV, i, s->name, P->b);
11347dd7cddfSDavid du Colombier fprintf(tc, "#endif\n");
11357dd7cddfSDavid du Colombier }
1136312a1df1SDavid du Colombier
1137312a1df1SDavid du Colombier fprintf(tc, "#ifdef HAS_CODE\n");
1138312a1df1SDavid du Colombier fprintf(tc, "\t\tlocinit%d(h);\n", i);
1139312a1df1SDavid du Colombier fprintf(tc, "#endif\n");
1140312a1df1SDavid du Colombier
1141219b2ee8SDavid du Colombier dumpclaims(tc, i, s->name);
1142219b2ee8SDavid du Colombier fprintf(tc, "\t break;\n");
1143219b2ee8SDavid du Colombier }
1144219b2ee8SDavid du Colombier
1145219b2ee8SDavid du Colombier Element *
huntstart(Element * f)1146219b2ee8SDavid du Colombier huntstart(Element *f)
1147219b2ee8SDavid du Colombier { Element *e = f;
1148312a1df1SDavid du Colombier Element *elast = (Element *) 0;
1149312a1df1SDavid du Colombier int cnt = 0;
1150219b2ee8SDavid du Colombier
1151f3793cddSDavid du Colombier while (elast != e && cnt++ < 200) /* new 4.0.8 */
1152312a1df1SDavid du Colombier { elast = e;
1153219b2ee8SDavid du Colombier if (e->n)
1154219b2ee8SDavid du Colombier { if (e->n->ntyp == '.' && e->nxt)
1155219b2ee8SDavid du Colombier e = e->nxt;
1156219b2ee8SDavid du Colombier else if (e->n->ntyp == UNLESS)
1157312a1df1SDavid du Colombier e = e->sub->this->frst;
1158312a1df1SDavid du Colombier } }
1159312a1df1SDavid du Colombier
1160f3793cddSDavid du Colombier if (cnt >= 200 || !e)
1161312a1df1SDavid du Colombier fatal("confusing control structure", (char *) 0);
1162219b2ee8SDavid du Colombier return e;
1163219b2ee8SDavid du Colombier }
1164219b2ee8SDavid du Colombier
1165219b2ee8SDavid du Colombier Element *
huntele(Element * f,int o,int stopat)1166312a1df1SDavid du Colombier huntele(Element *f, int o, int stopat)
1167219b2ee8SDavid du Colombier { Element *g, *e = f;
1168312a1df1SDavid du Colombier int cnt=0; /* a precaution against loops */
1169219b2ee8SDavid du Colombier
1170219b2ee8SDavid du Colombier if (e)
1171*00d97012SDavid du Colombier for ( ; cnt < 200 && e->n; cnt++)
1172312a1df1SDavid du Colombier {
1173312a1df1SDavid du Colombier if (e->seqno == stopat)
1174312a1df1SDavid du Colombier break;
1175312a1df1SDavid du Colombier
1176312a1df1SDavid du Colombier switch (e->n->ntyp) {
1177219b2ee8SDavid du Colombier case GOTO:
1178219b2ee8SDavid du Colombier g = get_lab(e->n,1);
1179219b2ee8SDavid du Colombier cross_dsteps(e->n, g->n);
1180219b2ee8SDavid du Colombier break;
1181219b2ee8SDavid du Colombier case '.':
1182219b2ee8SDavid du Colombier case BREAK:
1183219b2ee8SDavid du Colombier if (!e->nxt)
1184219b2ee8SDavid du Colombier return e;
1185219b2ee8SDavid du Colombier g = e->nxt;
1186219b2ee8SDavid du Colombier break;
1187219b2ee8SDavid du Colombier case UNLESS:
1188312a1df1SDavid du Colombier g = huntele(e->sub->this->frst, o, stopat);
1189219b2ee8SDavid du Colombier break;
1190219b2ee8SDavid du Colombier case D_STEP:
1191219b2ee8SDavid du Colombier case ATOMIC:
1192219b2ee8SDavid du Colombier case NON_ATOMIC:
1193312a1df1SDavid du Colombier default:
1194219b2ee8SDavid du Colombier return e;
1195219b2ee8SDavid du Colombier }
1196219b2ee8SDavid du Colombier if ((o & ATOM) && !(g->status & ATOM))
1197219b2ee8SDavid du Colombier return e;
1198219b2ee8SDavid du Colombier e = g;
1199219b2ee8SDavid du Colombier }
1200f3793cddSDavid du Colombier if (cnt >= 200 || !e)
1201312a1df1SDavid du Colombier fatal("confusing control structure", (char *) 0);
1202219b2ee8SDavid du Colombier return e;
1203219b2ee8SDavid du Colombier }
1204219b2ee8SDavid du Colombier
1205219b2ee8SDavid du Colombier void
typ2c(Symbol * sp)1206219b2ee8SDavid du Colombier typ2c(Symbol *sp)
12077dd7cddfSDavid du Colombier { int wsbits = sizeof(long)*8; /* wordsize in bits */
1208219b2ee8SDavid du Colombier switch (sp->type) {
12097dd7cddfSDavid du Colombier case UNSIGNED:
12107dd7cddfSDavid du Colombier if (sp->hidden&1)
12117dd7cddfSDavid du Colombier fprintf(th, "\tuchar %s;", sp->name);
12127dd7cddfSDavid du Colombier else
12137dd7cddfSDavid du Colombier fprintf(th, "\tunsigned %s : %d",
12147dd7cddfSDavid du Colombier sp->name, sp->nbits);
12157dd7cddfSDavid du Colombier LstSet = sp;
12167dd7cddfSDavid du Colombier if (nBits%wsbits > 0
12177dd7cddfSDavid du Colombier && wsbits - nBits%wsbits < sp->nbits)
12187dd7cddfSDavid du Colombier { /* must padd to a word-boundary */
12197dd7cddfSDavid du Colombier nBits += wsbits - nBits%wsbits;
12207dd7cddfSDavid du Colombier }
12217dd7cddfSDavid du Colombier nBits += sp->nbits;
12227dd7cddfSDavid du Colombier break;
1223219b2ee8SDavid du Colombier case BIT:
1224*00d97012SDavid du Colombier if (sp->nel == 1 && sp->isarray == 0 && !(sp->hidden&1))
1225219b2ee8SDavid du Colombier { fprintf(th, "\tunsigned %s : 1", sp->name);
1226219b2ee8SDavid du Colombier LstSet = sp;
1227219b2ee8SDavid du Colombier nBits++;
1228219b2ee8SDavid du Colombier break;
1229219b2ee8SDavid du Colombier } /* else fall through */
1230312a1df1SDavid du Colombier if (!(sp->hidden&1) && (verbose&32))
12317dd7cddfSDavid du Colombier printf("spin: warning: bit-array %s[%d] mapped to byte-array\n",
12327dd7cddfSDavid du Colombier sp->name, sp->nel);
12337dd7cddfSDavid du Colombier nBits += 8*sp->nel; /* mapped onto array of uchars */
12347dd7cddfSDavid du Colombier case MTYPE:
1235219b2ee8SDavid du Colombier case BYTE:
1236219b2ee8SDavid du Colombier case CHAN: /* good for up to 255 channels */
1237219b2ee8SDavid du Colombier fprintf(th, "\tuchar %s", sp->name);
1238219b2ee8SDavid du Colombier LstSet = sp;
1239219b2ee8SDavid du Colombier break;
1240219b2ee8SDavid du Colombier case SHORT:
1241219b2ee8SDavid du Colombier fprintf(th, "\tshort %s", sp->name);
1242219b2ee8SDavid du Colombier LstSet = sp;
1243219b2ee8SDavid du Colombier break;
1244219b2ee8SDavid du Colombier case INT:
1245219b2ee8SDavid du Colombier fprintf(th, "\tint %s", sp->name);
1246219b2ee8SDavid du Colombier LstSet = sp;
1247219b2ee8SDavid du Colombier break;
1248219b2ee8SDavid du Colombier case STRUCT:
12497dd7cddfSDavid du Colombier if (!sp->Snm)
12507dd7cddfSDavid du Colombier fatal("undeclared structure element %s", sp->name);
1251219b2ee8SDavid du Colombier fprintf(th, "\tstruct %s %s",
1252219b2ee8SDavid du Colombier sp->Snm->name,
1253219b2ee8SDavid du Colombier sp->name);
1254219b2ee8SDavid du Colombier LstSet = ZS;
1255219b2ee8SDavid du Colombier break;
1256312a1df1SDavid du Colombier case CODE_FRAG:
1257219b2ee8SDavid du Colombier case PREDEF:
1258219b2ee8SDavid du Colombier return;
1259219b2ee8SDavid du Colombier default:
1260219b2ee8SDavid du Colombier fatal("variable %s undeclared", sp->name);
1261219b2ee8SDavid du Colombier }
1262219b2ee8SDavid du Colombier
1263*00d97012SDavid du Colombier if (sp->nel > 1 || sp->isarray)
1264219b2ee8SDavid du Colombier fprintf(th, "[%d]", sp->nel);
1265219b2ee8SDavid du Colombier fprintf(th, ";\n");
1266219b2ee8SDavid du Colombier }
1267219b2ee8SDavid du Colombier
12687dd7cddfSDavid du Colombier static void
ncases(FILE * fd,int p,int n,int m,char * c[])1269219b2ee8SDavid du Colombier ncases(FILE *fd, int p, int n, int m, char *c[])
1270219b2ee8SDavid du Colombier { int i, j;
1271219b2ee8SDavid du Colombier
1272219b2ee8SDavid du Colombier for (j = 0; c[j]; j++)
1273219b2ee8SDavid du Colombier for (i = n; i < m; i++)
1274219b2ee8SDavid du Colombier { fprintf(fd, c[j], i, p, i);
1275219b2ee8SDavid du Colombier fprintf(fd, "\n");
1276219b2ee8SDavid du Colombier }
1277219b2ee8SDavid du Colombier }
1278219b2ee8SDavid du Colombier
1279219b2ee8SDavid du Colombier void
qlen_type(int qmax)1280312a1df1SDavid du Colombier qlen_type(int qmax)
1281312a1df1SDavid du Colombier {
1282312a1df1SDavid du Colombier fprintf(th, "\t");
1283312a1df1SDavid du Colombier if (qmax < 256)
1284312a1df1SDavid du Colombier fprintf(th, "uchar");
1285312a1df1SDavid du Colombier else if (qmax < 65535)
1286312a1df1SDavid du Colombier fprintf(th, "ushort");
1287312a1df1SDavid du Colombier else
1288312a1df1SDavid du Colombier fprintf(th, "uint");
1289312a1df1SDavid du Colombier fprintf(th, " Qlen; /* q_size */\n");
1290312a1df1SDavid du Colombier }
1291312a1df1SDavid du Colombier
1292312a1df1SDavid du Colombier void
genaddqueue(void)1293219b2ee8SDavid du Colombier genaddqueue(void)
12947dd7cddfSDavid du Colombier { char buf0[256];
1295312a1df1SDavid du Colombier int j, qmax = 0;
1296219b2ee8SDavid du Colombier Queue *q;
1297219b2ee8SDavid du Colombier
1298219b2ee8SDavid du Colombier ntimes(tc, 0, 1, Addq0);
1299312a1df1SDavid du Colombier if (has_io && !nqs)
1300312a1df1SDavid du Colombier fprintf(th, "#define NQS 1 /* nqs=%d, but has_io */\n", nqs);
1301312a1df1SDavid du Colombier else
1302312a1df1SDavid du Colombier fprintf(th, "#define NQS %d\n", nqs);
1303219b2ee8SDavid du Colombier fprintf(th, "short q_flds[%d];\n", nqs+1);
13047dd7cddfSDavid du Colombier fprintf(th, "short q_max[%d];\n", nqs+1);
1305312a1df1SDavid du Colombier
1306312a1df1SDavid du Colombier for (q = qtab; q; q = q->nxt)
1307312a1df1SDavid du Colombier if (q->nslots > qmax)
1308312a1df1SDavid du Colombier qmax = q->nslots;
1309312a1df1SDavid du Colombier
1310219b2ee8SDavid du Colombier for (q = qtab; q; q = q->nxt)
1311219b2ee8SDavid du Colombier { j = q->qid;
1312219b2ee8SDavid du Colombier fprintf(tc, "\tcase %d: j = sizeof(Q%d);", j, j);
1313219b2ee8SDavid du Colombier fprintf(tc, " q_flds[%d] = %d;", j, q->nflds);
13147dd7cddfSDavid du Colombier fprintf(tc, " q_max[%d] = %d;", j, max(1,q->nslots));
1315219b2ee8SDavid du Colombier fprintf(tc, " break;\n");
1316312a1df1SDavid du Colombier
1317312a1df1SDavid du Colombier fprintf(th, "typedef struct Q%d {\n", j);
1318312a1df1SDavid du Colombier qlen_type(qmax); /* 4.2.2 */
1319312a1df1SDavid du Colombier fprintf(th, " uchar _t; /* q_type */\n");
1320312a1df1SDavid du Colombier fprintf(th, " struct {\n");
1321312a1df1SDavid du Colombier
1322219b2ee8SDavid du Colombier for (j = 0; j < q->nflds; j++)
1323219b2ee8SDavid du Colombier { switch (q->fld_width[j]) {
1324219b2ee8SDavid du Colombier case BIT:
1325219b2ee8SDavid du Colombier if (q->nflds != 1)
1326219b2ee8SDavid du Colombier { fprintf(th, "\t\tunsigned");
1327219b2ee8SDavid du Colombier fprintf(th, " fld%d : 1;\n", j);
1328219b2ee8SDavid du Colombier break;
13297dd7cddfSDavid du Colombier } /* else fall through: smaller struct */
1330219b2ee8SDavid du Colombier case MTYPE:
1331219b2ee8SDavid du Colombier case CHAN:
1332219b2ee8SDavid du Colombier case BYTE:
1333219b2ee8SDavid du Colombier fprintf(th, "\t\tuchar fld%d;\n", j);
1334219b2ee8SDavid du Colombier break;
1335219b2ee8SDavid du Colombier case SHORT:
1336219b2ee8SDavid du Colombier fprintf(th, "\t\tshort fld%d;\n", j);
1337219b2ee8SDavid du Colombier break;
1338219b2ee8SDavid du Colombier case INT:
1339219b2ee8SDavid du Colombier fprintf(th, "\t\tint fld%d;\n", j);
1340219b2ee8SDavid du Colombier break;
1341219b2ee8SDavid du Colombier default:
1342219b2ee8SDavid du Colombier fatal("bad channel spec", "");
1343219b2ee8SDavid du Colombier }
1344219b2ee8SDavid du Colombier }
1345219b2ee8SDavid du Colombier fprintf(th, " } contents[%d];\n", max(1, q->nslots));
1346219b2ee8SDavid du Colombier fprintf(th, "} Q%d;\n", q->qid);
1347219b2ee8SDavid du Colombier }
1348312a1df1SDavid du Colombier
1349312a1df1SDavid du Colombier fprintf(th, "typedef struct Q0 {\t/* generic q */\n");
1350312a1df1SDavid du Colombier qlen_type(qmax); /* 4.2.2 */
1351312a1df1SDavid du Colombier fprintf(th, " uchar _t;\n");
1352312a1df1SDavid du Colombier fprintf(th, "} Q0;\n");
1353312a1df1SDavid du Colombier
1354219b2ee8SDavid du Colombier ntimes(tc, 0, 1, Addq1);
1355219b2ee8SDavid du Colombier
1356*00d97012SDavid du Colombier fprintf(tc, "#ifdef TRIX\n");
1357*00d97012SDavid du Colombier fprintf(tc, "int\nwhat_p_size(int t)\n{\tint j;\n");
1358*00d97012SDavid du Colombier fprintf(tc, " switch (t) {\n");
1359*00d97012SDavid du Colombier ntimes(tc, 0, nrRdy+1, R5); /* +1 for np_ */
1360*00d97012SDavid du Colombier fprintf(tc, " default: Uerror(\"bad proctype\");\n");
1361*00d97012SDavid du Colombier fprintf(tc, " }\n return j;\n}\n\n");
1362*00d97012SDavid du Colombier
1363*00d97012SDavid du Colombier fprintf(tc, "int\nwhat_q_size(int t)\n{\tint j;\n");
1364*00d97012SDavid du Colombier fprintf(tc, " switch (t) {\n");
1365*00d97012SDavid du Colombier for (j = 0; j < nqs+1; j++)
1366*00d97012SDavid du Colombier { fprintf(tc, " case %d: j = sizeof(Q%d); break;\n", j, j);
1367*00d97012SDavid du Colombier }
1368*00d97012SDavid du Colombier fprintf(tc, " default: Uerror(\"bad qtype\");\n");
1369*00d97012SDavid du Colombier fprintf(tc, " }\n return j;\n}\n");
1370*00d97012SDavid du Colombier fprintf(tc, "#endif\n\n");
1371*00d97012SDavid du Colombier
1372219b2ee8SDavid du Colombier if (has_random)
13737dd7cddfSDavid du Colombier { fprintf(th, "int Q_has(int");
13747dd7cddfSDavid du Colombier for (j = 0; j < Mpars; j++)
13757dd7cddfSDavid du Colombier fprintf(th, ", int, int");
13767dd7cddfSDavid du Colombier fprintf(th, ");\n");
13777dd7cddfSDavid du Colombier
13787dd7cddfSDavid du Colombier fprintf(tc, "int\nQ_has(int into");
1379219b2ee8SDavid du Colombier for (j = 0; j < Mpars; j++)
1380219b2ee8SDavid du Colombier fprintf(tc, ", int want%d, int fld%d", j, j);
1381219b2ee8SDavid du Colombier fprintf(tc, ")\n");
1382219b2ee8SDavid du Colombier fprintf(tc, "{ int i;\n\n");
1383219b2ee8SDavid du Colombier fprintf(tc, " if (!into--)\n");
13847dd7cddfSDavid du Colombier fprintf(tc, " uerror(\"ref to unknown chan ");
13857dd7cddfSDavid du Colombier fprintf(tc, "(recv-poll)\");\n\n");
1386219b2ee8SDavid du Colombier fprintf(tc, " if (into >= now._nr_qs || into < 0)\n");
1387219b2ee8SDavid du Colombier fprintf(tc, " Uerror(\"qrecv bad queue#\");\n\n");
13887dd7cddfSDavid du Colombier fprintf(tc, " for (i = 0; i < ((Q0 *)qptr(into))->Qlen;");
13897dd7cddfSDavid du Colombier fprintf(tc, " i++)\n");
1390219b2ee8SDavid du Colombier fprintf(tc, " {\n");
1391219b2ee8SDavid du Colombier for (j = 0; j < Mpars; j++)
1392219b2ee8SDavid du Colombier { fprintf(tc, " if (want%d && ", j);
13937dd7cddfSDavid du Colombier fprintf(tc, "qrecv(into+1, i, %d, 0) != fld%d)\n",
13947dd7cddfSDavid du Colombier j, j);
1395219b2ee8SDavid du Colombier fprintf(tc, " continue;\n");
1396219b2ee8SDavid du Colombier }
1397219b2ee8SDavid du Colombier fprintf(tc, " return i+1;\n");
1398219b2ee8SDavid du Colombier fprintf(tc, " }\n");
1399219b2ee8SDavid du Colombier fprintf(tc, " return 0;\n");
1400219b2ee8SDavid du Colombier fprintf(tc, "}\n");
1401219b2ee8SDavid du Colombier }
1402219b2ee8SDavid du Colombier
1403312a1df1SDavid du Colombier fprintf(tc, "#if NQS>0\n");
1404219b2ee8SDavid du Colombier fprintf(tc, "void\nqsend(int into, int sorted");
1405219b2ee8SDavid du Colombier for (j = 0; j < Mpars; j++)
1406219b2ee8SDavid du Colombier fprintf(tc, ", int fld%d", j);
1407*00d97012SDavid du Colombier fprintf(tc, ", int args_given)\n");
1408219b2ee8SDavid du Colombier ntimes(tc, 0, 1, Addq11);
1409219b2ee8SDavid du Colombier
1410219b2ee8SDavid du Colombier for (q = qtab; q; q = q->nxt)
1411219b2ee8SDavid du Colombier { sprintf(buf0, "((Q%d *)z)->", q->qid);
14127dd7cddfSDavid du Colombier fprintf(tc, "\tcase %d:%s\n", q->qid,
14137dd7cddfSDavid du Colombier (q->nslots)?"":" /* =rv= */");
1414219b2ee8SDavid du Colombier if (q->nslots == 0) /* reset handshake point */
1415219b2ee8SDavid du Colombier fprintf(tc, "\t\t(trpt+2)->o_m = 0;\n");
1416219b2ee8SDavid du Colombier
1417219b2ee8SDavid du Colombier if (has_sorted)
1418219b2ee8SDavid du Colombier { fprintf(tc, "\t\tif (!sorted) goto append%d;\n", q->qid);
1419219b2ee8SDavid du Colombier fprintf(tc, "\t\tfor (j = 0; j < %sQlen; j++)\n", buf0);
1420219b2ee8SDavid du Colombier fprintf(tc, "\t\t{\t/* find insertion point */\n");
1421219b2ee8SDavid du Colombier sprintf(buf0, "((Q%d *)z)->contents[j].fld", q->qid);
1422219b2ee8SDavid du Colombier for (j = 0; j < q->nflds; j++)
1423219b2ee8SDavid du Colombier { fprintf(tc, "\t\t\tif (fld%d > %s%d) continue;\n",
1424219b2ee8SDavid du Colombier j, buf0, j);
14257dd7cddfSDavid du Colombier fprintf(tc, "\t\t\tif (fld%d < %s%d) ", j, buf0, j);
14267dd7cddfSDavid du Colombier fprintf(tc, "goto found%d;\n\n", q->qid);
1427219b2ee8SDavid du Colombier }
1428219b2ee8SDavid du Colombier fprintf(tc, "\t\t}\n");
1429219b2ee8SDavid du Colombier fprintf(tc, "\tfound%d:\n", q->qid);
1430219b2ee8SDavid du Colombier sprintf(buf0, "((Q%d *)z)->", q->qid);
1431219b2ee8SDavid du Colombier fprintf(tc, "\t\tfor (k = %sQlen - 1; k >= j; k--)\n", buf0);
1432219b2ee8SDavid du Colombier fprintf(tc, "\t\t{\t/* shift up */\n");
1433219b2ee8SDavid du Colombier for (j = 0; j < q->nflds; j++)
14347dd7cddfSDavid du Colombier { fprintf(tc, "\t\t\t%scontents[k+1].fld%d = ",
14357dd7cddfSDavid du Colombier buf0, j);
14367dd7cddfSDavid du Colombier fprintf(tc, "%scontents[k].fld%d;\n",
14377dd7cddfSDavid du Colombier buf0, j);
1438219b2ee8SDavid du Colombier }
1439219b2ee8SDavid du Colombier fprintf(tc, "\t\t}\n");
1440219b2ee8SDavid du Colombier fprintf(tc, "\tappend%d:\t/* insert in slot j */\n", q->qid);
1441219b2ee8SDavid du Colombier }
1442219b2ee8SDavid du Colombier
1443312a1df1SDavid du Colombier fprintf(tc, "#ifdef HAS_SORTED\n");
1444312a1df1SDavid du Colombier fprintf(tc, "\t\t(trpt+1)->ipt = j;\n"); /* ipt was bup.oval */
1445312a1df1SDavid du Colombier fprintf(tc, "#endif\n");
1446219b2ee8SDavid du Colombier fprintf(tc, "\t\t%sQlen = %sQlen + 1;\n", buf0, buf0);
1447219b2ee8SDavid du Colombier sprintf(buf0, "((Q%d *)z)->contents[j].fld", q->qid);
1448219b2ee8SDavid du Colombier for (j = 0; j < q->nflds; j++)
1449219b2ee8SDavid du Colombier fprintf(tc, "\t\t%s%d = fld%d;\n", buf0, j, j);
1450*00d97012SDavid du Colombier fprintf(tc, "\t\tif (args_given != %d)\n", q->nflds);
1451*00d97012SDavid du Colombier fprintf(tc, "\t\t{ if (args_given > %d)\n", q->nflds);
1452*00d97012SDavid du Colombier fprintf(tc, "\t\t uerror(\"too many parameters in send stmnt\");\n");
1453*00d97012SDavid du Colombier fprintf(tc, "\t\t else\n");
1454*00d97012SDavid du Colombier fprintf(tc, "\t\t uerror(\"too few parameters in send stmnt\");\n");
1455*00d97012SDavid du Colombier fprintf(tc, "\t\t}\n");
1456219b2ee8SDavid du Colombier fprintf(tc, "\t\tbreak;\n");
1457219b2ee8SDavid du Colombier }
1458219b2ee8SDavid du Colombier ntimes(tc, 0, 1, Addq2);
1459219b2ee8SDavid du Colombier
1460219b2ee8SDavid du Colombier for (q = qtab; q; q = q->nxt)
1461219b2ee8SDavid du Colombier fprintf(tc, "\tcase %d: return %d;\n", q->qid, (!q->nslots));
1462219b2ee8SDavid du Colombier
1463219b2ee8SDavid du Colombier ntimes(tc, 0, 1, Addq3);
1464219b2ee8SDavid du Colombier
1465219b2ee8SDavid du Colombier for (q = qtab; q; q = q->nxt)
1466219b2ee8SDavid du Colombier fprintf(tc, "\tcase %d: return (q_sz(from) == %d);\n",
1467219b2ee8SDavid du Colombier q->qid, max(1, q->nslots));
1468219b2ee8SDavid du Colombier
1469219b2ee8SDavid du Colombier ntimes(tc, 0, 1, Addq4);
1470219b2ee8SDavid du Colombier for (q = qtab; q; q = q->nxt)
1471219b2ee8SDavid du Colombier { sprintf(buf0, "((Q%d *)z)->", q->qid);
1472219b2ee8SDavid du Colombier fprintf(tc, " case %d:%s\n\t\t",
1473219b2ee8SDavid du Colombier q->qid, (q->nslots)?"":" /* =rv= */");
1474219b2ee8SDavid du Colombier if (q->nflds == 1)
1475219b2ee8SDavid du Colombier { fprintf(tc, "if (fld == 0) r = %s", buf0);
1476219b2ee8SDavid du Colombier fprintf(tc, "contents[slot].fld0;\n");
1477219b2ee8SDavid du Colombier } else
1478219b2ee8SDavid du Colombier { fprintf(tc, "switch (fld) {\n");
1479219b2ee8SDavid du Colombier ncases(tc, q->qid, 0, q->nflds, R12);
14807dd7cddfSDavid du Colombier fprintf(tc, "\t\tdefault: Uerror");
14817dd7cddfSDavid du Colombier fprintf(tc, "(\"too many fields in recv\");\n");
1482219b2ee8SDavid du Colombier fprintf(tc, "\t\t}\n");
1483219b2ee8SDavid du Colombier }
1484219b2ee8SDavid du Colombier fprintf(tc, "\t\tif (done)\n");
1485312a1df1SDavid du Colombier if (q->nslots == 0)
1486312a1df1SDavid du Colombier { fprintf(tc, "\t\t{ j = %sQlen - 1;\n", buf0);
1487312a1df1SDavid du Colombier fprintf(tc, "\t\t %sQlen = 0;\n", buf0);
1488312a1df1SDavid du Colombier sprintf(buf0, "\t\t\t((Q%d *)z)->contents", q->qid);
1489312a1df1SDavid du Colombier } else
1490312a1df1SDavid du Colombier { fprintf(tc, "\t\t{ j = %sQlen;\n", buf0);
1491219b2ee8SDavid du Colombier fprintf(tc, "\t\t %sQlen = --j;\n", buf0);
1492219b2ee8SDavid du Colombier fprintf(tc, "\t\t for (k=slot; k<j; k++)\n");
1493219b2ee8SDavid du Colombier fprintf(tc, "\t\t {\n");
1494219b2ee8SDavid du Colombier sprintf(buf0, "\t\t\t((Q%d *)z)->contents", q->qid);
1495219b2ee8SDavid du Colombier for (j = 0; j < q->nflds; j++)
1496219b2ee8SDavid du Colombier { fprintf(tc, "\t%s[k].fld%d = \n", buf0, j);
1497219b2ee8SDavid du Colombier fprintf(tc, "\t\t%s[k+1].fld%d;\n", buf0, j);
1498219b2ee8SDavid du Colombier }
1499219b2ee8SDavid du Colombier fprintf(tc, "\t\t }\n");
1500312a1df1SDavid du Colombier }
1501312a1df1SDavid du Colombier
1502219b2ee8SDavid du Colombier for (j = 0; j < q->nflds; j++)
1503219b2ee8SDavid du Colombier fprintf(tc, "%s[j].fld%d = 0;\n", buf0, j);
1504219b2ee8SDavid du Colombier fprintf(tc, "\t\t\tif (fld+1 != %d)\n\t\t\t", q->nflds);
1505219b2ee8SDavid du Colombier fprintf(tc, "\tuerror(\"missing pars in receive\");\n");
1506219b2ee8SDavid du Colombier /* incompletely received msgs cannot be unrecv'ed */
1507219b2ee8SDavid du Colombier fprintf(tc, "\t\t}\n");
1508219b2ee8SDavid du Colombier fprintf(tc, "\t\tbreak;\n");
1509219b2ee8SDavid du Colombier }
1510219b2ee8SDavid du Colombier ntimes(tc, 0, 1, Addq5);
15117dd7cddfSDavid du Colombier for (q = qtab; q; q = q->nxt)
15127dd7cddfSDavid du Colombier fprintf(tc, " case %d: j = sizeof(Q%d); break;\n",
15137dd7cddfSDavid du Colombier q->qid, q->qid);
15147dd7cddfSDavid du Colombier ntimes(tc, 0, 1, R8b);
15157dd7cddfSDavid du Colombier
1516219b2ee8SDavid du Colombier ntimes(th, 0, 1, Proto); /* tag on function prototypes */
1517219b2ee8SDavid du Colombier fprintf(th, "void qsend(int, int");
1518219b2ee8SDavid du Colombier for (j = 0; j < Mpars; j++)
1519219b2ee8SDavid du Colombier fprintf(th, ", int");
1520*00d97012SDavid du Colombier fprintf(th, ", int);\n");
1521219b2ee8SDavid du Colombier
1522*00d97012SDavid du Colombier fprintf(th, "#define Addproc(x) addproc(256, x");
1523*00d97012SDavid du Colombier /* 256 is param outside the range of valid pids */
1524219b2ee8SDavid du Colombier for (j = 0; j < Npars; j++)
1525219b2ee8SDavid du Colombier fprintf(th, ", 0");
1526219b2ee8SDavid du Colombier fprintf(th, ")\n");
1527219b2ee8SDavid du Colombier }
1528