static int s_snd(Queue *q, Lextok *n) { Lextok *m; RunList *rX, *sX = X; /* rX=recvr, sX=sendr */ int i, j = 0; /* q field# */ for (m = n->rgt; m && j < q->nflds; m = m->rgt, j++) { q->contents[j] = cast_val(q->fld_width[j], eval(m->lft), 0); typ_ck(q->fld_width[j], Sym_typ(m->lft), "rv-send"); } q->qlen = 1; if (!complete_rendez()) { q->qlen = 0; return 0; } if (TstOnly) { q->qlen = 0; return 1; } q->stepnr[0] = depth; if ((verbose&16) && depth >= jumpsteps) { m = n->rgt; rX = X; X = sX; for (j = 0; m && j < q->nflds; m = m->rgt, j++) sr_talk(n, eval(m->lft), "Sent ", "->", j, q); for (i = j; i < q->nflds; i++) sr_talk(n, 0, "Sent ", "->", i, q); if (j < q->nflds) printf("%3d: warning: missing params in rv-send\n", depth); else if (m) printf("%3d: warning: too many params in rv-send\n", depth); X = rX; /* restore receiver's context */ if (!s_trail) { if (!n_rem || !q_rem) fatal("cannot happen, s_snd", (char *) 0); m = n_rem->rgt; for (j = 0; m && j < q->nflds; m = m->rgt, j++) { if (m->lft->ntyp != NAME || strcmp(m->lft->sym->name, "_") != 0) i = eval(m->lft); else i = 0; if (verbose&8) sr_talk(n_rem,i,"Recv ","<-",j,q_rem); } if (verbose&8) for (i = j; i < q->nflds; i++) sr_talk(n_rem, 0, "Recv ", "<-", j, q_rem); if (columns == 2) putarrow(depth, depth); } n_rem = (Lextok *) 0; q_rem = (Queue *) 0; } return 1; }
// ff: input flow image // s: arrow scaling // g: grid spacing void flowarrows(float *ff, int w, int h, float s, int g) { //printf("set terminal postscript eps\n"); printf("set size ratio 1\n"); printf("unset border\n"); printf("unset xtics\n"); printf("unset ytics\n"); printf("set rmargin 0\n"); printf("set lmargin 0\n"); printf("set tmargin 0\n"); printf("set bmargin 0\n"); printf("plot [0:%d] [0:%d] \"-\" notitle with vectors " // "filled " "linestyle 1" "\n", w, h); float (*f)[w][2] = (void*)ff; int gw = w/g, gh = h/g; for (int j = 0; j < gh; j++) for (int i = 0; i < gw; i++) { float m[2] = {0, 0}, nm = 0; for (int jj = 0; jj < g; jj++) for (int ii = 0; ii < g; ii++) { int pi = g*i + ii; int pj = g*j + jj; if (pi < w && pj < h && isfinite(f[pj][pi][0]) && isfinite(f[pj][pi][1])) { m[0] += f[pj][pi][0]; m[1] += f[pj][pi][1]; nm += s; } } if (nm > 0) putarrow(g*i+g/2, g*j+g/2, m[0]/nm, m[1]/nm); } printf("end\n"); }
static int a_rcv(Queue *q, Lextok *n, int full) { Lextok *m; int i=0, oi, j, k; extern int Rvous; if (q->qlen == 0) return 0; /* q is empty */ try_slot: /* test executability */ for (m = n->rgt, j=0; m && j < q->nflds; m = m->rgt, j++) if ((m->lft->ntyp == CONST && q->contents[i*q->nflds+j] != m->lft->val) || (m->lft->ntyp == EVAL && q->contents[i*q->nflds+j] != eval(m->lft->lft))) { if (n->val == 0 /* fifo recv */ || n->val == 2 /* fifo poll */ || ++i >= q->qlen) /* last slot */ return 0; /* no match */ goto try_slot; } if (TstOnly) return 1; if (verbose&8) { if (j < q->nflds) printf("%3d: warning: missing params in next recv\n", depth); else if (m) printf("%3d: warning: too many params in next recv\n", depth); } /* set the fields */ if (Rvous) { n_rem = n; q_rem = q; } oi = q->stepnr[i]; for (m = n->rgt, j = 0; m && j < q->nflds; m = m->rgt, j++) { if (columns && !full) /* was columns == 1 */ continue; if ((verbose&8) && !Rvous && depth >= jumpsteps) { sr_talk(n, q->contents[i*q->nflds+j], (full && n->val < 2)?"Recv ":"[Recv] ", "<-", j, q); } if (!full) continue; /* test */ if (m && m->lft->ntyp != CONST && m->lft->ntyp != EVAL) { (void) setval(m->lft, q->contents[i*q->nflds+j]); typ_ck(q->fld_width[j], Sym_typ(m->lft), "recv"); } if (n->val < 2) /* not a poll */ for (k = i; k < q->qlen-1; k++) { q->contents[k*q->nflds+j] = q->contents[(k+1)*q->nflds+j]; if (j == 0) q->stepnr[k] = q->stepnr[k+1]; } } if ((!columns || full) && (verbose&8) && !Rvous && depth >= jumpsteps) for (i = j; i < q->nflds; i++) { sr_talk(n, 0, (full && n->val < 2)?"Recv ":"[Recv] ", "<-", i, q); } if (columns == 2 && full && !Rvous && depth >= jumpsteps) putarrow(oi, depth); if (full && n->val < 2) q->qlen--; return 1; }