/************** Convolution Problem Ismail KADAYIF *********/ #include #include "amdc96.h" #define XRANGE 12 #define WRANGE 4 #define XGEN 1L #define WGEN 2L #define XELEM 3L #define WELEM 4L #define TERM 5L #define TOP 6L #define SUM 7L #define RESULT 8L #define PRINT 9L #define FILTER 10L #define END 11L typedef struct {int d[XRANGE];int range;int index;} x_struct; typedef struct {int d[WRANGE];int range;int index;} w_elem; typedef struct {int d;int range;int index;}x_elem; typedef struct {LocName out;}filter; typedef struct {int sum;int number;}sum_struct; x_struct x={{1,2,3,4,5,6,7,8,9,10,11,12},12,1}; w_elem w={{4,5,6,7},4,1}; void primeop(Message,Location); void xgenop(Location L) { x_struct *g; x_elem *e; LocName LN; g=(x_struct*)amdc_getLoc(L,XGEN); e=(x_elem*)amdc_newMsg((Script)primeop,XELEM,sizeof(x_elem)); e->d=g->d[g->index-1]; e->range=g->range; e->index=g->index; amdc_enqueueAtLoc(L,(Message)e); if(g->indexrange) { g->index++; LN=amdc_getNameOfLoc(L); LN.X[0]++; amdc_sendTo((Message)g,LN); } else amdc_freeMsg((Message)g); } void wgenop(Location L) { int j; w_elem *g,*e; LocName LN; g=(w_elem*)amdc_getLoc(L,WGEN); e=(w_elem*)amdc_newMsg((Script)primeop,WELEM,sizeof(w_elem)); for(j=0;jrange;j++) e->d[j]=g->d[j]; e->index=g->index; e->range=g->range; amdc_enqueueAtLoc(L,(Message)e); if(g->indexindex++; LN=amdc_getNameOfLoc(L); LN.X[0]++; amdc_sendTo((Message)g,LN); } else amdc_freeMsg((Message)g); } void mulgenop(Location L) { int t,index,xindex; filter *f; x_elem* x; w_elem* w; LocName LN; f=(filter*)amdc_getLoc(L,FILTER); x=(x_elem*)amdc_getLoc(L,XELEM); w=(w_elem*)amdc_getLoc(L,WELEM); if(x->indexrange) { LN=amdc_getNameOfLoc(L); LN.X[0]++; amdc_sendTo(amdc_copyMsg((Message)f),LN); } t=w->range; index=0; xindex=x->index; while(t>0) { if((xindex>0)&&(xindex<=XRANGE-WRANGE+1)) { int *c; c=(int*)amdc_newMsg((Script)primeop,TERM,sizeof(int)); *c=x->d*w->d[index]; f->out.X[0]=xindex-1; amdc_sendTo((Message)c,f->out); } t--; index++; xindex--; } amdc_freeMsg((Message)f); amdc_freeMsg((Message)w); amdc_freeMsg((Message)x); } void topgenop(Location L) { sum_struct *s,*t; LocName LN; s=(sum_struct*)amdc_getLoc(L,TOP); t=(sum_struct*)amdc_newMsg((Script)primeop,SUM,sizeof(sum_struct)); t->sum=0; t->number=WRANGE; amdc_putLoc(L,(Message)t); if(s->sum>1) { LN=amdc_getNameOfLoc(L); LN.X[0]++; s->sum--; amdc_sendTo((Message)s,LN); } else amdc_freeMsg((Message)s); while(amdc_presentLoc(L,TERM)!=NULL) { Message m; m=amdc_getLoc(L,TERM); amdc_enqueueAtLoc(L,m); } } void sumgenop(Location L) { LocName LN; sum_struct *s; int *c; s=(sum_struct*)amdc_getLoc(L,SUM); c=(int*)amdc_getLoc(L,TERM); LN=amdc_getNameOfLoc(L); s->sum+=*c; s->number--; amdc_freeMsg((Message)c); if(s->number>0) amdc_putLoc(L,(Message)s); else { int *i; i=(int*)amdc_newMsg((Script)primeop,RESULT,sizeof(int)); *i=s->sum; amdc_enqueueAtLoc(L,(Message)i); amdc_freeMsg((Message)s); } } void printgenop(Location L) { int *i; sum_struct *s; LocName LN; i=(int*)amdc_getLoc(L,RESULT); s=(sum_struct*)amdc_getLoc(L,PRINT); LN=amdc_getNameOfLoc(L); printf("y[%d]=%d\n",LN.X[0]+1,*i); amdc_freeMsg((Message)i); if(s->numbersum) { LN=amdc_getNameOfLoc(L); LN.X[0]++; s->number++; amdc_sendTo((Message)s,LN); } else { LN=amdc_0DLocName(AMDC_PROCESS_SYMBOL); amdc_sendTo((Message)s,LN); } } void primeop(Message me,Location L) { amdc_putLoc(L,me); if(amdc_presentLoc(L,XGEN)) xgenop(L); else if(amdc_presentLoc(L,WGEN))wgenop(L); else if(amdc_presentLoc(L,XELEM)&&amdc_presentLoc(L,WELEM) &&amdc_presentLoc(L,FILTER)) mulgenop(L); else if(amdc_presentLoc(L,TOP)) topgenop(L); else if(amdc_presentLoc(L,SUM)&&amdc_presentLoc(L,TERM))sumgenop(L); else if(amdc_presentLoc(L,RESULT)&&amdc_presentLoc(L,PRINT)) printgenop(L); else return; } int Main() { x_struct *gx; sum_struct *t; w_elem *gw; Message p; int i; filter *f; LocName LP,LO; Location mine=amdc_getMyLoc(); if(amdc_getMyId()==0) { int j; printf("starting...\n"); for(i=0;id[j]=x.d[j]; gx->range=x.range; gx->index=1; amdc_sendTo((Message)gx,LP); for(j=0;jd[j]=w.d[j]; gw->range=w.range; gw->index=1; amdc_sendTo((Message)gw,LP); f=(filter*)amdc_newMsg((Script)primeop,FILTER,sizeof(filter)); f->out=LO; amdc_sendTo((Message)f,LP); t=(sum_struct*)amdc_newMsg((Script)primeop,TOP,sizeof(sum_struct)); t->number=gw->range; t->sum=XRANGE-(WRANGE-1); amdc_sendTo((Message)t,LO); t=(sum_struct*)amdc_newMsg((Script)primeop,PRINT,sizeof(sum_struct)); t->sum=XRANGE-(WRANGE-1); t->number=1; amdc_sendTo((Message)t,LO); while((p=amdc_getLoc(mine,PRINT))==NULL) amdc_pollBlock(); amdc_freeMsg(p); printf("done\n"); } else while((amdc_getLoc(mine,END))==NULL) amdc_pollBlock(); }