charmxi: Fix most warnings and simplify code
[charm.git] / src / xlat-i / sdag / CSdagConstruct.C
1 #include <string.h>
2 #include <stdlib.h>
3 #include "sdag-globals.h"
4 #include "xi-symbol.h"
5 //#include "CParsedFile.h"
6 #include "EToken.h"
7
8 namespace xi {
9
10 SdagConstruct *buildAtomic(const char* code,
11                            SdagConstruct *pub_list,
12                            const char *trace_name)
13 {
14   char *tmp = strdup(code);
15   RemoveSdagComments(tmp);
16   SdagConstruct *ret = new SdagConstruct(SATOMIC, new XStr(tmp), pub_list, 0,0,0,0, 0 );
17   free(tmp);
18
19   if (trace_name)
20   {
21     tmp = strdup(trace_name);
22     tmp[strlen(tmp)-1]=0;
23     ret->traceName = new XStr(tmp+1);
24     free(tmp);
25   }
26
27   return ret;
28 }
29
30 void SdagConstruct::numberNodes(void)
31 {
32   switch(type) {
33     case SSDAGENTRY: nodeNum = numSdagEntries++; break;
34     case SOVERLAP: nodeNum = numOverlaps++; break;
35     case SWHEN: nodeNum = numWhens++; break;
36     case SFOR: nodeNum = numFors++; break;
37     case SWHILE: nodeNum = numWhiles++; break;
38     case SIF: nodeNum = numIfs++; if(con2!=0) con2->numberNodes(); break;
39     case SELSE: nodeNum = numElses++; break;
40     case SFORALL: nodeNum = numForalls++; break;
41     case SSLIST: nodeNum = numSlists++; break;
42     case SOLIST: nodeNum = numOlists++; break;
43     case SATOMIC: nodeNum = numAtomics++; break;
44     case SFORWARD: nodeNum = numForwards++; break;
45     case SCONNECT: nodeNum = numConnects++; break;
46     case SINT_EXPR:
47     case SIDENT: 
48     default:
49       break;
50   }
51   SdagConstruct *cn;
52   if (constructs != 0) {
53     for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
54       cn->numberNodes();
55     }
56   }
57 }
58
59 void SdagConstruct::labelNodes(void)
60 {
61   char text[128];
62   switch(type) {
63     case SSDAGENTRY:
64       sprintf(text, "%s", con1->text->charstar());
65       label = new XStr(text);
66       break;
67     case SOVERLAP: 
68       sprintf(text, "_overlap_%d", nodeNum); 
69       label = new XStr(text);
70       break;
71     case SWHEN: 
72       sprintf(text, "_when_%d", nodeNum); 
73       label = new XStr(text);
74       EntryList *el;
75       el = elist;
76       while (el !=NULL) {
77         el->entry->label = new XStr(el->entry->name);
78         el=el->next; 
79       }
80       break;
81     case SFOR: 
82       sprintf(text, "_for_%d", nodeNum); 
83       label = new XStr(text);
84       break;
85     case SWHILE: 
86       sprintf(text, "_while_%d", nodeNum); 
87       label = new XStr(text);
88       break;
89     case SIF: 
90       sprintf(text, "_if_%d", nodeNum); 
91       label = new XStr(text);
92       if(con2!=0) con2->labelNodes();
93       break;
94     case SELSE: 
95       sprintf(text, "_else_%d", nodeNum); 
96       label = new XStr(text);
97       break;
98     case SFORALL: 
99       sprintf(text, "_forall_%d", nodeNum); 
100       label = new XStr(text);
101       break;
102     case SSLIST: 
103       sprintf(text, "_slist_%d", nodeNum); 
104       label = new XStr(text);
105       break;
106     case SOLIST: 
107       sprintf(text, "_olist_%d", nodeNum); 
108       label = new XStr(text);
109       break;
110     case SATOMIC: 
111       sprintf(text, "_atomic_%d", nodeNum); 
112       label = new XStr(text);
113       break;
114     case SFORWARD: 
115       sprintf(text, "_forward_%d", nodeNum); 
116       label = new XStr(text);
117       break;
118     case SCONNECT:
119       sprintf(text, "_connect_%s",connectEntry->charstar()); 
120       label = new XStr(text);
121       break;
122     case SINT_EXPR:
123     case SIDENT:
124     default:
125       break;
126   }
127   SdagConstruct *cn;
128   if (constructs != 0) {
129     for(cn=(SdagConstruct *)(constructs->begin()); !constructs->end(); cn=(SdagConstruct *)(constructs->next())) {
130       cn->labelNodes();
131     }
132   }
133 }
134
135 void EntryList::generateEntryList(TList<CEntry*>& CEntrylist, SdagConstruct *thisWhen)
136 {
137    EntryList *el;
138    el = this;
139    while (el != NULL)
140    {
141      el->entry->generateEntryList(CEntrylist, thisWhen);
142      el = el->next;
143    }
144 }
145
146 void Entry::generateEntryList(TList<CEntry*>& CEntrylist, SdagConstruct *thisWhen)
147 {
148    // case SENTRY:
149    CEntry *entry;
150    int notfound=1;
151    
152    for(entry=CEntrylist.begin(); !CEntrylist.end(); entry=CEntrylist.next()) {
153      if(*(entry->entry) == (const char *)name) 
154      {
155         ParamList *epl;
156         epl = entry->paramlist;
157         ParamList *pl;
158         pl = param;
159         notfound = 1;
160         if ((entry->paramlist->isVoid() == 1) && (pl->isVoid() == 1)) {
161            notfound = 0;
162         }
163         while ((pl != NULL) && (epl != NULL))
164         {
165            if (pl->isArray() && epl->isArray()) {
166              if (strcmp(pl->getBaseName(), epl->getBaseName()) == 0)
167                 notfound = 0;
168            }
169            else if (pl->isBuiltin() && epl->isBuiltin()) {
170              if (strcmp(pl->getBaseName(), epl->getBaseName()) == 0)
171                 notfound = 0;
172            }
173            else if (pl->isReference() && epl->isReference()) {
174              if (strcmp(pl->getBaseName(), epl->getBaseName()) == 0)
175                 notfound = 0;
176            }
177            else if (pl->isMessage() && epl->isMessage()) {
178              if (strcmp(pl->getBaseName(), epl->getBaseName()) == 0)
179                 notfound = 0;
180            }
181            else if (pl->isNamed() && epl->isNamed()) {
182              if (strcmp(pl->getBaseName(), epl->getBaseName()) == 0)
183                 notfound = 0;
184            }
185            pl = pl->next;
186            epl = epl->next;
187         }
188         if (((pl == NULL) && (epl != NULL)) ||
189            ((pl != NULL) && (epl == NULL)))
190              notfound = 1;
191         if (notfound == 0) {
192           // check to see if thisWhen is already in entry's whenList
193           int whenFound = 0;
194           TList<SdagConstruct*> *tmpList = &(entry->whenList);
195           SdagConstruct *tmpNode;
196           for(tmpNode = tmpList->begin(); !tmpList->end(); tmpNode = tmpList->next()) {
197             if(tmpNode->nodeNum == thisWhen->nodeNum)
198                whenFound = 1;
199           }
200           if(!whenFound)
201             entry->whenList.append(thisWhen);
202           entryPtr = entry;
203           if(intExpr != 0)
204             entry->refNumNeeded = 1; 
205          } 
206      }
207    }
208    if(notfound == 1) {
209      CEntry *newEntry;
210      newEntry = new CEntry(new XStr(name), param, estateVars, paramIsMarshalled() );
211      CEntrylist.append(newEntry);
212      entryPtr = newEntry;
213      newEntry->whenList.append(thisWhen);
214      if(intExpr != 0)
215        newEntry->refNumNeeded = 1; 
216    }
217       //break;
218 }
219
220 void SdagConstruct::generateEntryList(TList<CEntry*>& CEntrylist, SdagConstruct *thisWhen)
221 {
222   SdagConstruct *cn;
223   switch(type) {
224     case SWHEN:
225       elist->generateEntryList(CEntrylist, this);  /* con1 is the WHEN's ELIST */
226       break;
227     case SIF:
228         /* con2 is the ELSE corresponding to this IF */
229       if(con2!=0) con2->generateEntryList(CEntrylist, thisWhen); 
230       break;
231   }
232   if (constructs != 0) {
233     for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
234       cn->generateEntryList(CEntrylist,thisWhen);
235     }
236   }
237 }
238  
239 void SdagConstruct::generateConnectEntries(XStr& op){
240    op << "  void " <<connectEntry->charstar() <<'(';
241    ParamList *pl = param;
242    XStr msgParams;
243    int count;
244    if (pl->isVoid() == 1) {
245      op << "void) {\n"; 
246    }
247    else if (pl->isMessage() == 1){
248      op << pl->getBaseName() <<" *" <<pl->getGivenName() <<") {\n";
249    }
250    else {
251     count = 0;
252     op << "CkMarshallMsg *" /*<< connectEntry->charstar()*/ <<"_msg) {\n";
253     msgParams <<"   char *impl_buf= _msg->msgBuf;\n";
254     param->beginUnmarshall(msgParams);
255    }
256    op << msgParams.charstar() <<"\n"; 
257    op << "  " <<text->charstar() <<"\n";
258
259    op << "  }\n";
260    
261 }
262
263 void SdagConstruct::generateConnectEntryList(TList<SdagConstruct*>& ConnectEList) {
264   if (type == SCONNECT)
265      ConnectEList.append(this);
266   if (constructs != 0) {
267     SdagConstruct *cn;
268     for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
269       cn->generateConnectEntryList(ConnectEList);
270     }
271   }
272
273 }
274
275 void SdagConstruct::propagateState(int uniqueVarNum)
276
277   CStateVar *sv; 
278   /*if(type != SSDAGENTRY) {
279     fprintf(stderr, "use of non-entry as the outermost construct..\n");
280     exit(1);
281   }*/
282   stateVars = new TList<CStateVar*>();
283   ParamList *pl = param;
284   if (pl->isVoid() == 1) {
285      sv = new CStateVar(1, NULL, 0, NULL, 0, NULL, 0);
286      stateVars->append(sv);
287   }
288   else if (pl->isMessage() == 1){
289      sv = new CStateVar(0, pl->getBaseName(), 1, pl->getGivenName(), 0, NULL, 1);
290      stateVars->append(sv);
291   }
292   else {
293     while(pl != NULL) {
294       if (pl->isPointer() == 1) {
295         sv = new CStateVar(0, pl->getBaseName(), pl->getNumStars(), pl->getGivenName(), 0, NULL, 0); 
296       }
297       else if (pl->isReference() == 1) {
298         sv = new CStateVar(0, pl->getBaseName(), 0, pl->getGivenName(), new XStr("&"), NULL, 0); 
299
300       }
301       else if (pl->isArray() == 1) {
302         sv = new CStateVar(0, pl->getBaseName(), 0, pl->getGivenName(), 0, pl->getArrayLen(), 0); 
303       }
304       else if (pl->isBuiltin() == 1) {
305         sv = new CStateVar(0, pl->getBaseName(), 0, pl->getGivenName(), 0, NULL, 0); 
306
307       }
308       else if (pl->isNamed()) {
309           sv = new CStateVar(0, pl->getBaseName(), 0, pl->getGivenName(), 0, NULL, 0); 
310       }
311       pl = pl->next;
312       stateVars->append(sv);
313     }
314   }
315
316 #if CMK_BLUEGENE_CHARM
317   // adding _bgParentLog as the last extra parameter for tracing
318   stateVarsChildren = new TList<CStateVar*>();
319
320   for(sv=stateVars->begin();!stateVars->end();sv=stateVars->next())
321     stateVarsChildren->append(sv);
322   sv = new CStateVar(0, "void *", 0,"_bgParentLog", 0, NULL, 1);  
323   stateVarsChildren->append(sv);
324 #else
325   stateVarsChildren = stateVars; 
326 #endif
327
328   SdagConstruct *cn;
329   TList<CStateVar*> *whensEntryMethodStateVars; 
330   whensEntryMethodStateVars = new TList<CStateVar*>();
331   for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
332      cn->propagateState(*stateVarsChildren, *whensEntryMethodStateVars , *publishesList, uniqueVarNum);
333   }
334 }
335
336
337 void SdagConstruct::propagateState(TList<CStateVar*>& list, TList<CStateVar*>& wlist, TList<SdagConstruct*>& publist, int uniqueVarNum)
338 {
339   CStateVar *sv;
340   TList <CStateVar*> *olistTempStateVars;
341   TList<CStateVar*> *whensEntryMethodStateVars; 
342   olistTempStateVars = new TList<CStateVar*>();
343   stateVars = new TList<CStateVar*>();
344   switch(type) {
345     case SFORALL:
346       stateVarsChildren = new TList<CStateVar*>();
347       for(sv=list.begin(); !list.end(); sv=list.next()) {
348         stateVars->append(sv);
349         stateVarsChildren->append(sv);
350       }
351       sv = new CStateVar(0,"int", 0, con1->text->charstar(), 0,NULL, 0);
352       stateVarsChildren->append(sv);
353       {
354         char txt[128];
355         sprintf(txt, "_cf%d", nodeNum);
356         counter = new XStr(txt);
357         sv = new CStateVar(0, "CCounter", 1, txt,0,NULL, 1);
358         stateVarsChildren->append(sv);
359       }
360       break;
361     case SWHEN:
362       whensEntryMethodStateVars = new TList<CStateVar*>();
363       stateVarsChildren = new TList<CStateVar*>();
364       int numParameters; 
365       int count;
366       int isMsg;
367       int stateVarsHasVoid;
368       int stateVarsChildrenHasVoid; 
369       numParameters=0; count=0; isMsg=0; 
370       stateVarsHasVoid = 0;
371       stateVarsChildrenHasVoid = 0;
372       for(sv = stateVars->begin(); ((!stateVars->end()) && (stateVarsHasVoid != 1)); sv=stateVars->next()) {
373          if (sv->isVoid == 1)
374              stateVarsHasVoid == 1;     // what this means??? gengbin
375       }
376       for(sv=list.begin(); !list.end(); sv=list.next()) {
377          if ((sv->isVoid == 1) && (stateVarsHasVoid != 1)) {
378             stateVars->append(sv);
379             stateVarsHasVoid == 1;
380          }
381          else if (sv->isVoid != 1)
382             stateVars->append(sv);
383          if ((sv->isVoid == 1) && (stateVarsChildrenHasVoid != 1)) {
384             stateVarsChildren->append(sv);
385             stateVarsChildrenHasVoid == 1;
386          }
387          else if (sv->isVoid != 1) {
388             stateVarsChildren->append(sv);
389          }
390       }
391
392      
393       {  
394         EntryList *el;
395         el = elist;
396         ParamList *pl;
397         while (el != NULL) {
398           pl = el->entry->param;
399           el->entry->stateVars = new TList<CStateVar*>();
400           if (pl->isVoid()) {
401             sv = new CStateVar(1, NULL, 0, NULL, 0, NULL, 0);
402             //stateVars->append(sv);
403               stateVarsChildren->append(sv);
404               whensEntryMethodStateVars->append(sv); 
405               el->entry->estateVars.append(sv);
406               el->entry->stateVars->append(sv);
407           }
408           else if (pl->isMessage()){
409             sv = new CStateVar(0, pl->getBaseName(), 1, pl->getGivenName(), 0, NULL, 1);
410             //stateVars->append(sv);
411               stateVarsChildren->append(sv);
412               whensEntryMethodStateVars->append(sv); 
413               el->entry->estateVars.append(sv);
414               el->entry->stateVars->append(sv);
415           }
416           else {
417             while(pl != NULL) {
418               if (pl->isPointer()) {
419                 sv = new CStateVar(0, pl->getBaseName(), pl->getNumStars(), pl->getGivenName(), 0, NULL, 0); 
420               }
421               else if (pl->isReference()) {
422                 sv = new CStateVar(0, pl->getBaseName(), 0, pl->getGivenName(), new XStr("&"), NULL, 0); 
423               }
424               else if (pl->isArray()) {
425                 sv = new CStateVar(0, pl->getBaseName(), 0, pl->getGivenName(), 0, pl->getArrayLen(), 0); 
426               }
427               else if (pl->isBuiltin()) {
428                 sv = new CStateVar(0, pl->getBaseName(), 0, pl->getGivenName(), 0, NULL, 0); 
429               }
430               else if (pl->isNamed()) {
431                 sv = new CStateVar(0, (XStr)(*(pl->param->getType())), 0, pl->getGivenName(), 0, NULL, 0); 
432               }
433               else
434                  printf("PROBLEM - I DON'T KNOW THE TYPE\n");
435               pl = pl->next;
436               stateVarsChildren->append(sv);
437               whensEntryMethodStateVars->append(sv); 
438               el->entry->estateVars.append(sv);
439               el->entry->stateVars->append(sv);
440             }
441           }
442           el = el->next;
443
444         }
445       }
446       break;
447     case SIF:
448       for(sv=list.begin(); !list.end(); sv=list.next()) {
449         stateVars->append(sv);
450       }
451       stateVarsChildren = stateVars;
452       if(con2 != 0) con2->propagateState(list, wlist,publist, uniqueVarNum);
453       break;
454     case SOLIST:
455       stateVarsChildren = new TList<CStateVar*>();
456       for(sv=list.begin(); !list.end(); sv=list.next()) {
457         stateVars->append(sv);
458         stateVarsChildren->append(sv);
459       }
460       {
461         char txt[128];
462         sprintf(txt, "_co%d", nodeNum);
463         counter = new XStr(txt);
464         sv = new CStateVar(0,"CCounter",1, txt,0, NULL, 1);
465         stateVarsChildren->append(sv);
466       }
467       break;
468     case SFOR:
469     case SWHILE:
470     case SELSE:
471     case SSLIST:
472     case SOVERLAP:
473       for(sv=list.begin(); !list.end(); sv=list.next()) {
474         stateVars->append(sv);
475       }
476       stateVarsChildren = stateVars;
477       break;
478     case SATOMIC:
479       for(sv=list.begin(); !list.end(); sv=list.next()) {
480         stateVars->append(sv);
481       }
482       stateVarsChildren = stateVars;
483       if (con1 != 0) {
484         publist.append(con1);
485         /*SdagConstruct *sc;
486         SdagConstruct *sc1;
487         for(sc =publist.begin(); !publist.end(); sc=publist.next()) {
488            for(sc1=sc->constructs->begin(); !sc->constructs->end(); sc1 = sc->constructs->next())
489            printf("Publist = %s\n", sc1->text->charstar());
490         }*/
491       }
492       break;
493     case SFORWARD:
494       stateVarsChildren = new TList<CStateVar*>();
495       for(sv=list.begin(); !list.end(); sv=list.next()) { 
496         stateVars->append(sv);
497       }
498       for(sv=wlist.begin(); !wlist.end(); sv=wlist.next()) { 
499         stateVarsChildren->append(sv);
500       }
501
502       break;
503     case SCONNECT: 
504     case SINT_EXPR:
505     case SIDENT:
506     case SENTRY:
507     case SELIST:
508       break;
509     default:
510       fprintf(stderr, "internal error in sdag translator..\n");
511       exit(1);
512       break;
513   }
514   SdagConstruct *cn;
515   if (constructs != 0) {
516     for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
517       if (type == SWHEN)
518          cn->propagateState(*stateVarsChildren, *whensEntryMethodStateVars, publist,  uniqueVarNum);
519       else
520          cn->propagateState(*stateVarsChildren, wlist, publist,  uniqueVarNum);
521     }
522  } 
523 }
524
525 void SdagConstruct::generateCode(XStr& op)
526 {
527   switch(type) {
528     case SSDAGENTRY:
529       generateSdagEntry(op);
530       break;
531     case SSLIST:
532       generateSlist(op);
533       break;
534     case SOLIST:
535       generateOlist(op);
536       break;
537     case SFORALL:
538       generateForall(op);
539       break;
540     case SATOMIC:
541       generateAtomic(op);
542       break;
543     case SIF:
544       generateIf(op);
545       if(con2 != 0)
546         con2->generateCode(op);
547       break;
548     case SELSE:
549       generateElse(op);
550       break;
551     case SWHILE:
552       generateWhile(op);
553       break;
554     case SFOR:
555       generateFor(op);
556       break;
557     case SOVERLAP:
558       generateOverlap(op);
559       break;
560     case SWHEN:
561       generateWhen(op);
562       break;
563     case SFORWARD:
564       generateForward(op);
565       break;
566     case SCONNECT:
567       generateConnect(op);
568       break;
569     default:
570       break;
571   }
572   SdagConstruct *cn;
573   if (constructs != 0) {
574     for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
575       cn->generateCode(op);
576     }
577   }
578 }
579
580 void SdagConstruct::generateConnect(XStr& op) {
581   op << "  void " << label->charstar() << "() {\n";
582   op << "    int index;\n";
583   if ((param->isVoid() == 0) && (param->isMessage() == 0)) {
584      op << "    CkMarshallMsg *x;\n";  
585      op << "    index = CkIndex_Ar1::" <<connectEntry->charstar() <<"(x);\n";  //replace
586      op << "    CkCallback cb(index, CkArrayIndex1D(thisIndex), a1);\n";  // replace 
587   }
588   else if (param->isVoid() == 1) {
589      op << "    index = CkIndex_Ar1::" <<connectEntry->charstar() <<"(void);\n";  //replace
590      op << "    CkCallback cb(index, CkArrayIndex1D(thisIndex), a1);\n";  // replace 
591   }
592   else {
593      op << "    " << param->getBaseName() <<" *x;\n";  // replace
594      op << "    index = CkIndex_Ar1::" <<connectEntry->charstar() <<"(x);\n";  //replace
595      op << "    CkCallback cb(index, CkArrayIndex1D(thisIndex), a1);\n";  // replace 
596   }
597   op << "    myPublish->get_" <<connectEntry->charstar() <<"(cb);\n";  //replace - myPublish
598
599   op << "  }\n\n";  
600 }
601
602 void SdagConstruct::generateForward(XStr& op) {
603   SdagConstruct *cn;
604   op << "  void " << label->charstar() << "(";
605   generatePrototype(op, *stateVars);
606   op << ") {\n";
607   for (cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
608     op << "    { "<<cn->text->charstar()<<"(";
609     generateCall(op, *stateVarsChildren);
610     op<<"); }\n";
611   }
612   if(nextBeginOrEnd == 1)
613     op << "    " << next->label->charstar() << "(";
614   else
615     op << "    " << next->label->charstar() << "_end(";
616   generateCall(op, *stateVars);
617   op << ");\n";
618   op << "  }\n\n";
619 }
620
621
622 void SdagConstruct::generateWhen(XStr& op)
623 {
624   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
625   op << "  int " << label->charstar() << "(";
626   generatePrototype(op, *stateVars);
627   op << ") {\n";
628 #if CMK_BLUEGENE_CHARM
629   generateBeginTime(op);
630 #endif
631
632   CStateVar *sv;
633
634   Entry *e;
635   EntryList *el;
636   el = elist;
637   while (el != NULL){
638     e = el->entry;
639     if (e->param->isVoid() == 1)
640         op << "    CMsgBuffer *"<<e->getEntryName()<<"_buf;\n";
641     else if (e->paramIsMarshalled() == 1) {
642
643         op << "    CMsgBuffer *"<<e->getEntryName()<<"_buf;\n";
644         op << "    CkMarshallMsg *" <<
645                         e->getEntryName() << "_msg;\n";
646     }
647     else {
648         for(sv=e->stateVars->begin(); !e->stateVars->end(); e->stateVars->next()) {
649           op << "    CMsgBuffer *"<<sv->name->charstar()<<"_buf;\n";
650           op << "    " << sv->type->charstar() << " *" <<
651                           sv->name->charstar() << ";\n";
652         } 
653     }
654     el = el->next;
655   }
656
657   op << "\n";
658   el = elist;
659   while (el != NULL) {
660      e = el->entry;
661      if ((e->paramIsMarshalled() == 1) || (e->param->isVoid() == 1)) {
662         if((e->intExpr == 0) || (e->param->isVoid() == 1)) {   // DOUBLE CHECK THIS LOGIC
663            op << "    " << e->getEntryName(); 
664            op << "_buf = __cDep->getMessage(" << e->entryPtr->entryNum << ");\n";
665         }           
666         else {
667            op << "    " << e->getEntryName() << 
668                  "_buf = __cDep->getMessage(" << e->entryPtr->entryNum <<
669                  ", " << e->intExpr << ");\n";
670         }
671      }
672      else { // The parameter is a message
673         sv = e->stateVars->begin();
674         if(e->intExpr == 0) {
675            op << "    " << sv->name->charstar(); 
676            op << "_buf = __cDep->getMessage(" << e->entryPtr->entryNum << ");\n";
677         }           
678         else {
679            op << "    " << sv->name->charstar() << 
680                  "_buf = __cDep->getMessage(" << e->entryPtr->entryNum <<
681                  ", " << e->intExpr << ");\n";
682         }
683      }  
684     el = el->next;
685   }
686
687   op << "\n";
688   op << "    if (";
689   el = elist;
690   while (el != NULL)  {
691      e = el->entry;
692      if ((e->paramIsMarshalled() == 1) || (e->param->isVoid() ==1)) {
693         op << "(" << e->getEntryName() << "_buf != 0)";
694      }
695      else {
696         sv = e->stateVars->begin();
697         op << "(" << sv->name->charstar() << "_buf != 0)";
698      }
699      el = el->next;
700      if (el != NULL)
701         op << "&&";
702   }
703   op << ") {\n";
704
705 #if CMK_BLUEGENE_CHARM
706   // for tracing
707   //TODO: instead of this, add a length field to EntryList
708   int elen=0;
709   for(el=elist; el!=NULL; el=elist->next) elen++;
710  
711   op << "         void * logs1["<< elen << "]; \n";
712   op << "         void * logs2["<< elen + 1<< "]; \n";
713   int localnum = 0;
714   for(el=elist; el!=NULL; el=elist->next) {
715     e = el->entry;
716        if ((e->paramIsMarshalled() == 1) || (e->param->isVoid() ==1)) {
717         op << "       logs1[" << localnum << "] = " << /*el->con4->text->charstar() sv->type->charstar()*/e->getEntryName() << "_buf->bgLog1; \n";
718         op << "       logs2[" << localnum << "] = " << /*el->con4->text->charstar() sv->type->charstar()*/e->getEntryName() << "_buf->bgLog2; \n";
719         localnum++;
720       }
721       else{
722         op << "       logs1[" << localnum << "] = " << /*el->con4->text->charstar()*/ sv->name->charstar()<< "_buf->bgLog1; \n";
723         op << "       logs2[" << localnum << "] = " << /*el->con4->text->charstar()*/ sv->name->charstar() << "_buf->bgLog2; \n";
724         localnum++;
725       }
726   }
727       
728   op << "       logs2[" << localnum << "] = " << "_bgParentLog; \n";
729   generateEventBracket(op,SWHEN);
730   op << "       _TRACE_BG_FORWARD_DEPS(logs1,logs2,"<< localnum << ",_bgParentLog);\n";
731 #endif
732
733   el = elist;
734   while (el != NULL) {
735      e = el->entry;
736      if (e->param->isVoid() == 1) {
737         op <<"       CkFreeSysMsg((void *) "<<e->getEntryName() <<"_buf->msg);\n";
738         op << "       __cDep->removeMessage(" << e->getEntryName() <<
739               "_buf);\n";
740         op << "      delete " << e->getEntryName() << "_buf;\n";
741      }
742      else if (e->paramIsMarshalled() == 1) {
743         op << "       " << e->getEntryName() << "_msg = (CkMarshallMsg *)"  
744                << e->getEntryName() << "_buf->msg;\n";
745         op << "       char *"<<e->getEntryName() <<"_impl_buf=((CkMarshallMsg *)"
746            <<e->getEntryName() <<"_msg)->msgBuf;\n";
747         op <<"       PUP::fromMem " <<e->getEntryName() <<"_implP(" 
748            <<e->getEntryName() <<"_impl_buf);\n";
749
750         for(sv=e->stateVars->begin(); !e->stateVars->end(); sv=e->stateVars->next()) {
751            if (sv->arrayLength != NULL)
752               op <<"      int impl_off_"<<sv->name->charstar()
753                  <<"; "<<e->getEntryName() <<"_implP|impl_off_"
754                  <<sv->name->charstar()<<";\n";
755            else
756                op <<"       "<<sv->type->charstar()<<" "<<sv->name->charstar()
757                <<"; " <<e->getEntryName() <<"_implP|"
758                <<sv->name->charstar()<<";\n";
759         }
760         op << "       " <<e->getEntryName() <<"_impl_buf+=CK_ALIGN("
761            <<e->getEntryName() <<"_implP.size(),16);\n";
762         for(sv=e->stateVars->begin(); !e->stateVars->end(); sv=e->stateVars->next()) {
763            if (sv->arrayLength != NULL)
764               op << "    "<<sv->type->charstar()<< " *" <<sv->name->charstar() <<"=(" <<sv->type->charstar()
765                  <<" *)(" <<e->getEntryName() <<"_impl_buf+" <<"impl_off_"
766                  <<sv->name->charstar()<<");\n";
767         }
768         op << "       __cDep->removeMessage(" << e->getEntryName() <<
769               "_buf);\n";
770         op << "       delete " << e->getEntryName() << "_buf;\n";
771      }
772      else {  // There was a message as the only parameter
773         sv = e->stateVars->begin();
774         op << "       " << sv->name->charstar() << " = (" << 
775               sv->type->charstar() << " *) " <<
776               sv->name->charstar() << "_buf->msg;\n";
777         op << "       __cDep->removeMessage(" << sv->name->charstar() <<
778               "_buf);\n";
779         op << "       delete " << sv->name->charstar() << "_buf;\n";
780      }
781      el = el->next;
782   }
783
784   // max(current,merge) --> current, then reset the mergepath
785 #ifdef USE_CRITICAL_PATH_HEADER_ARRAY
786   op << "       " << label->charstar()  << "_PathMergePoint.updateMax(currentlyExecutingPath); /* Critical Path Detection */ \n";
787   op << "       currentlyExecutingPath = " << label->charstar()  << "_PathMergePoint; /* Critical Path Detection */ \n";
788   op << "       " << label->charstar()  << "_PathMergePoint.reset(); /* Critical Path Detection */ \n";
789 #endif
790
791   if (constructs != 0) {
792     if (!constructs->empty() ) {
793        op << "       " << constructs->front()->label->charstar() << "(";
794        generateCall(op, *stateVarsChildren);
795        op << ");\n";
796     }
797     else {
798        op << "       " << label->charstar() << "_end(";
799        generateCall(op, *stateVarsChildren);
800        op << ");\n";
801     }
802   }
803   else {
804      op << "       " << label->charstar() << "_end(";
805      generateCall(op, *stateVarsChildren);
806      op << ");\n";
807   }
808
809   el = elist;
810   while (el != NULL){
811     e = el->entry;
812     if (e->paramIsMarshalled() == 1) {
813         op << "       delete " << e->getEntryName() << "_msg;\n";
814     }
815     el = el->next;
816   }
817   op << "       return 1;\n";
818   op << "    } else {\n";
819
820   int nRefs=0, nAny=0;
821   el = elist;
822   while (el != NULL) {
823     e = el->entry;
824     if(e->intExpr == 0)
825       nAny++;
826     else
827       nRefs++;
828     el = el->next;
829   }
830 // keep these consts consistent with sdag.h in runtime
831
832 #define MAXARG 8
833 #define MAXANY 8
834 #define MAXREF 8
835
836   if(stateVars->length() > MAXARG) {
837     fprintf(stderr, "numStateVars more that %d, contact developers.\n",
838                      MAXARG);
839     exit(1);
840   }
841   if(nRefs > MAXREF) {
842     fprintf(stderr, "numDepends more that %d, contact developers.\n",
843                      MAXREF);
844     exit(1);
845   }
846   if(nAny > MAXANY) {
847     fprintf(stderr, "numDepends more that %d, contact developers.\n",
848                      MAXANY);
849     exit(1);
850   }
851   op << "       CWhenTrigger *tr;\n";
852   op << "       tr = new CWhenTrigger(" << nodeNum << ", " <<
853         stateVars->length() << ", " << nRefs << ", " << nAny << ");\n";
854   int iArgs=0;
855  
856 //  op << "       int impl_off=0;\n";
857   int hasArray = 0;
858   int isVoid = 0;
859   int numParamsNeedingMarshalling = 0;
860   int paramIndex =0;
861   for(sv=stateVars->begin();!stateVars->end();sv=stateVars->next()) {
862     if (sv->isVoid == 1) {
863         isVoid = 1;
864        op <<"       tr->args[" <<iArgs++ <<"] = (size_t) CkAllocSysMsg();\n";
865     }
866     else {
867       if (sv->isMsg == 1) {
868          op << "       tr->args["<<iArgs++ <<"] = (size_t) " <<sv->name->charstar()<<";\n";
869       }
870       else {
871          numParamsNeedingMarshalling++;
872          if (numParamsNeedingMarshalling == 1) {
873            op << "       int impl_off=0;\n";
874            paramIndex = iArgs;
875            iArgs++;
876          }
877       }
878       if (sv->arrayLength !=NULL) {
879          hasArray++;
880          if (hasArray == 1)
881            op<< "       int impl_arrstart=0;\n";
882          op <<"       int impl_off_"<<sv->name->charstar()<<", impl_cnt_"<<sv->name->charstar()<<";\n";
883          op <<"       impl_off_"<<sv->name->charstar()<<"=impl_off=CK_ALIGN(impl_off,sizeof("<<sv->type->charstar()<<"));\n";
884          op <<"       impl_off+=(impl_cnt_"<<sv->name->charstar()<<"=sizeof("<<sv->type->charstar()<<")*("<<sv->arrayLength->charstar()<<"));\n";
885       }
886     }
887   }
888   if (numParamsNeedingMarshalling > 0) {
889      op << "       { \n";
890      op << "         PUP::sizer implP;\n";
891      for(sv=stateVars->begin();!stateVars->end();sv=stateVars->next()) {
892        if (sv->arrayLength !=NULL)
893          op << "         implP|impl_off_" <<sv->name->charstar() <<";\n";
894        else if ((sv->isMsg != 1) && (sv->isVoid !=1)) 
895          op << "         implP|" <<sv->name->charstar() <<";\n";
896      }
897      if (hasArray > 0) {
898         op <<"         impl_arrstart=CK_ALIGN(implP.size(),16);\n";
899         op <<"         impl_off+=impl_arrstart;\n";
900      }
901      else {
902         op << "         impl_off+=implP.size();\n";
903      }
904      op << "       }\n";
905      op << "       CkMarshallMsg *impl_msg;\n";
906      op << "       impl_msg = CkAllocateMarshallMsg(impl_off,NULL);\n";
907      op << "       {\n";
908      op << "         PUP::toMem implP((void *)impl_msg->msgBuf);\n";
909      for(sv=stateVars->begin();!stateVars->end();sv=stateVars->next()) {
910        if (sv->arrayLength !=NULL)
911           op << "         implP|impl_off_" <<sv->name->charstar() <<";\n";
912        else if ((sv->isMsg != 1) && (sv->isVoid != 1))  
913           op << "         implP|" <<sv->name->charstar() <<";\n";
914      }
915      op << "       }\n";
916      if (hasArray > 0) {
917         op <<"       char *impl_buf=impl_msg->msgBuf+impl_arrstart;\n";
918         for(sv=stateVars->begin();!stateVars->end();sv=stateVars->next()) {
919            if (sv->arrayLength !=NULL)
920               op << "       memcpy(impl_buf+impl_off_"<<sv->name->charstar()<<
921                          ","<<sv->name->charstar()<<",impl_cnt_"<<sv->name->charstar()<<");\n";
922         }  
923      }
924   op << "       tr->args[" <<paramIndex <<"] = (size_t) impl_msg;\n";
925   }
926   int iRef=0, iAny=0;
927
928   el = elist;
929   while (el != NULL) {
930     e = el->entry;
931     if(e->intExpr == 0) {
932       op << "       tr->anyEntries[" << iAny++ << "] = " <<
933             e->entryPtr->entryNum << ";\n";
934     } else {
935       op << "       tr->entries[" << iRef << "] = " << 
936             e->entryPtr->entryNum << ";\n";
937       op << "       tr->refnums[" << iRef++ << "] = " <<
938             e->intExpr << ";\n";
939     }
940     el = el->next;
941   }
942
943 #ifdef USE_CRITICAL_PATH_HEADER_ARRAY
944   // max(current,merge) --> current
945   op << "       " << label->charstar()  << "_PathMergePoint.updateMax(currentlyExecutingPath); /* Critical Path Detection */ \n";
946   op << "       currentlyExecutingPath = " << label->charstar()  << "_PathMergePoint; /* Critical Path Detection */ \n";
947 #endif
948
949   op << "       __cDep->Register(tr);\n";
950   op << "       return 0;\n";
951   op << "    }\n";
952
953   // end actual code
954   op << "  }\n\n";
955
956   // trace
957   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
958   strcat(nameStr,"_end");
959
960   // end function
961   op << "  void " << label->charstar() << "_end(";
962   generatePrototype(op, *stateVarsChildren);
963   op << ") {\n";
964 #if CMK_BLUEGENE_CHARM
965   generateBeginTime(op);
966   generateEventBracket(op,SWHEN_END);
967 #endif
968   // actual code here 
969   if(nextBeginOrEnd == 1)
970    op << "    " << next->label->charstar();
971   else 
972     op << "    " << next->label->charstar() << "_end";
973
974   op << "(";
975
976   generateCall(op, *stateVars); 
977   
978   op << ");\n";
979
980   el = elist;
981   while (el) {
982     e = el->entry;
983     if (e->param->isMessage() == 1) {
984       sv = e->stateVars->begin();
985       op << "    CmiFree(UsrToEnv(" << sv->name->charstar() << "));\n";
986     }
987
988     el = el->next;
989   }
990
991   // end actual code
992   op << "  }\n\n";
993 }
994
995 void SdagConstruct::generateWhile(XStr& op)
996 {
997   // inlined start function
998   op << "  void " << label->charstar() << "(";
999   generatePrototype(op, *stateVars);
1000   op << ") {\n";
1001   // actual code here 
1002   op << "    if (" << con1->text->charstar() << ") {\n";
1003   op << "      " << constructs->front()->label->charstar() << 
1004         "(";
1005   generateCall(op, *stateVarsChildren);
1006   op << ");\n";
1007   op << "    } else {\n";
1008   if(nextBeginOrEnd == 1)
1009    op << "      " << next->label->charstar() << "(";
1010   else
1011    op << "      " << next->label->charstar() << "_end(";
1012   generateCall(op, *stateVars);
1013   op << ");\n";
1014   op << "    }\n";
1015   // end actual code
1016   op << "  }\n\n";
1017   // inlined end function
1018   op << "  void " << label->charstar() << "_end(";
1019   generatePrototype(op, *stateVarsChildren);
1020   op << ") {\n";
1021   // actual code here 
1022   op << "    if (" << con1->text->charstar() << ") {\n";
1023   op << "      " << constructs->front()->label->charstar() <<
1024         "(";
1025   generateCall(op, *stateVarsChildren);
1026   op << ");\n";
1027   op << "    } else {\n";
1028   if(nextBeginOrEnd == 1)
1029    op << "      " <<  next->label->charstar() << "(";
1030   else
1031    op << "      " << next->label->charstar() << "_end(";
1032   generateCall(op, *stateVars);
1033   op << ");\n";
1034   op << "    }\n";
1035   // end actual code
1036   op << "  }\n\n";
1037 }
1038
1039 void SdagConstruct::generateFor(XStr& op)
1040 {
1041   // inlined start function
1042   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
1043   op << "  void " << label->charstar() << "(";
1044   generatePrototype(op, *stateVars);
1045   op << ") {\n";
1046 #if CMK_BLUEGENE_CHARM
1047   // actual code here 
1048   generateBeginTime(op);
1049 #endif
1050   op << "    " << con1->text->charstar() << ";\n";
1051   //Record only the beginning for FOR
1052 #if CMK_BLUEGENE_CHARM
1053   generateEventBracket(op,SFOR);
1054 #endif
1055   op << "    if (" << con2->text->charstar() << ") {\n";
1056   op << "      " << constructs->front()->label->charstar() <<
1057         "(";
1058   generateCall(op, *stateVarsChildren);
1059   op << ");\n";
1060   op << "    } else {\n";
1061   if(nextBeginOrEnd == 1)
1062    op << "      " << next->label->charstar() << "(";
1063   else
1064    op << "      " << next->label->charstar() << "_end(";
1065   generateCall(op, *stateVars);
1066   op << ");\n";
1067   op << "    }\n";
1068   // end actual code
1069   op << "  }\n";
1070   // inlined end function
1071   // trace
1072   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
1073   strcat(nameStr,"_end");
1074   op << "  void " << label->charstar() << "_end(";
1075   generatePrototype(op, *stateVarsChildren);
1076   op << ") {\n";
1077 #if CMK_BLUEGENE_CHARM
1078   generateBeginTime(op);
1079 #endif
1080   // actual code here 
1081   op << con3->text->charstar() << ";\n";
1082   op << "    if (" << con2->text->charstar() << ") {\n";
1083   op << "      " << constructs->front()->label->charstar() <<
1084         "(";
1085   generateCall(op, *stateVarsChildren);
1086   op << ");\n";
1087   op << "    } else {\n";
1088 #if CMK_BLUEGENE_CHARM
1089   generateEventBracket(op,SFOR_END);
1090 #endif
1091   if(nextBeginOrEnd == 1)
1092    op << "      " << next->label->charstar() << "(";
1093   else
1094    op << "      " << next->label->charstar() << "_end(";
1095    generateCall(op, *stateVars);
1096   op << ");\n";
1097   op << "    }\n";
1098   // end actual code
1099   op << "  }\n";
1100 }
1101
1102 void SdagConstruct::generateIf(XStr& op)
1103 {
1104   // inlined start function
1105   strcpy(nameStr,label->charstar());
1106   op << "  void " << label->charstar() << "(";
1107   generatePrototype(op, *stateVars);
1108   op << ") {\n";
1109 #if CMK_BLUEGENE_CHARM
1110   generateBeginTime(op);
1111   generateEventBracket(op,SIF);
1112 #endif
1113   // actual code here 
1114   op << "    if (" << con1->text->charstar() << ") {\n";
1115   op << "      " << constructs->front()->label->charstar() <<
1116         "(";
1117   generateCall(op, *stateVarsChildren);
1118   op << ");\n";
1119   op << "    } else {\n";
1120   if (con2 != 0) {
1121     op << "      " << con2->label->charstar() << "(";
1122     generateCall(op, *stateVarsChildren);
1123     op << ");\n";
1124   } else {
1125     op << "      " << label->charstar() << "_end(";
1126     generateCall(op, *stateVarsChildren);
1127     op << ");\n";
1128   }
1129   op << "    }\n";
1130   // end actual code
1131   op << "  }\n\n";
1132   // inlined end function
1133   strcpy(nameStr,label->charstar());
1134   strcat(nameStr,"_end");
1135   op << "  void " << label->charstar() << "_end(";
1136   generatePrototype(op, *stateVarsChildren);
1137   op << ") {\n";
1138 #if CMK_BLUEGENE_CHARM
1139   generateBeginTime(op);
1140   generateEventBracket(op,SIF_END);
1141 #endif
1142   // actual code here 
1143   if(nextBeginOrEnd == 1)
1144    op << "      " << next->label->charstar() << "(";
1145   else
1146    op << "      " << next->label->charstar() << "_end(";
1147   generateCall(op, *stateVars);
1148   op << ");\n";
1149   // end actual code
1150   op << "  }\n\n";
1151 }
1152
1153 void SdagConstruct::generateElse(XStr& op)
1154 {
1155   // inlined start function
1156   strcpy(nameStr,label->charstar());
1157   op << "  void " << label->charstar() << "(";
1158   generatePrototype(op, *stateVars);
1159   op << ") {\n";
1160   // trace
1161   generateBeginTime(op);
1162   generateEventBracket(op,SELSE);
1163   // actual code here 
1164   op << "    " << constructs->front()->label->charstar() << 
1165         "(";
1166   generateCall(op, *stateVarsChildren);
1167   op << ");\n";
1168   // end actual code
1169   op << "  }\n\n";
1170   // inlined end function
1171   // trace
1172   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
1173   strcat(nameStr,"_end");
1174   op << "  void " << label->charstar() << "_end(";
1175   generatePrototype(op, *stateVarsChildren);
1176   op << ") {\n";
1177 #if CMK_BLUEGENE_CHARM
1178   generateBeginTime(op);
1179   generateEventBracket(op,SELSE_END);
1180 #endif
1181   // actual code here 
1182   if(nextBeginOrEnd == 1)
1183    op << "      " << next->label->charstar() << "(";
1184   else
1185    op << "      " << next->label->charstar() << "_end(";
1186   generateCall(op, *stateVars);
1187   op << ");\n";
1188   // end actual code
1189   op << "  }\n\n";
1190 }
1191
1192 void SdagConstruct::generateForall(XStr& op)
1193 {
1194   // inlined start function
1195   op << "  void " << label->charstar() << "(";
1196   generatePrototype(op, *stateVars);
1197   op << ") {\n";
1198   // actual code here 
1199   op << "    int __first = (" << con2->text->charstar() <<
1200         "), __last = (" << con3->text->charstar() << 
1201         "), __stride = (" << con4->text->charstar() << ");\n";
1202   op << "    if (__first > __last) {\n";
1203   op << "      int __tmp=__first; __first=__last; __last=__tmp;\n";
1204   op << "      __stride = -__stride;\n";
1205   op << "    }\n";
1206   op << "    CCounter *" << counter->charstar() << 
1207         " = new CCounter(__first,__last,__stride);\n"; 
1208   op << "    for(int " << con1->text->charstar() << 
1209         "=__first;" << con1->text->charstar() <<
1210         "<=__last;" << con1->text->charstar() << "+=__stride) {\n";
1211   op << "      " << constructs->front()->label->charstar() <<
1212         "(";
1213   generateCall(op, *stateVarsChildren);
1214   op << ");\n";
1215   op << "    }\n";
1216   // end actual code
1217   op << "  }\n\n";
1218   // inlined end function
1219   op << "  void " << label->charstar() << "_end(";
1220   generatePrototype(op, *stateVarsChildren);
1221   op << ") {\n";
1222   // actual code here 
1223   op << "    " << counter->charstar() << "->decrement(); /* DECREMENT 1 */ \n";
1224   op << "    if (" << counter->charstar() << "->isDone()) {\n";
1225   op << "      delete " << counter->charstar() << ";\n";
1226   if(nextBeginOrEnd == 1)
1227    op << "      " << next->label->charstar() << "(";
1228   else
1229    op << "      " << next->label->charstar() << "_end(";
1230   generateCall(op, *stateVars);
1231   op << ");\n";
1232   // end actual code
1233   op << "    }\n  }\n\n";
1234 }
1235
1236 void SdagConstruct::generateOlist(XStr& op)
1237 {
1238   SdagConstruct *cn;
1239   // inlined start function
1240   op << "  void " << label->charstar() << "(";
1241   generatePrototype(op, *stateVars);
1242   op << ") {\n";
1243   // actual code here 
1244   op << "    CCounter *" << counter->charstar() << "= new CCounter(" <<
1245         constructs->length() << ");\n";
1246   for(cn=constructs->begin(); 
1247                      !constructs->end(); cn=constructs->next()) {
1248     op << "    " << cn->label->charstar() << "(";
1249     generateCall(op, *stateVarsChildren);
1250     op << ");\n";
1251   }
1252   // end actual code
1253   op << "  }\n";
1254
1255   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
1256   strcat(nameStr,"_end");
1257 #if CMK_BLUEGENE_CHARM
1258   op << "  CkVec<void*> " <<label->charstar() << "_bgLogList;\n";
1259 #endif
1260
1261   // inlined end function
1262   op << "  void " << label->charstar() << "_end(";
1263   generatePrototype(op, *stateVarsChildren);
1264   op << ") {\n";
1265 #if CMK_BLUEGENE_CHARM
1266   generateBeginTime(op);
1267   op << "    " <<label->charstar() << "_bgLogList.insertAtEnd(_bgParentLog);\n";
1268 #endif
1269   // actual code here 
1270   //Accumulate all the bgParent pointers that the calling when_end functions give
1271   op << "    " << counter->charstar() << "->decrement();\n";
1272  
1273 #ifdef USE_CRITICAL_PATH_HEADER_ARRAY
1274  op << "    olist_" << counter->charstar() << "_PathMergePoint.updateMax(currentlyExecutingPath);  /* Critical Path Detection FIXME: is the currently executing path the right thing for this? The duration ought to have been added somewhere. */ \n";
1275 #endif
1276
1277   op << "    if (" << counter->charstar() << "->isDone()) {\n";
1278
1279 #ifdef USE_CRITICAL_PATH_HEADER_ARRAY
1280   op << "      currentlyExecutingPath = olist_" << counter->charstar() << "_PathMergePoint; /* Critical Path Detection */ \n";
1281   op << "      olist_" << counter->charstar() << "_PathMergePoint.reset(); /* Critical Path Detection */ \n";
1282 #endif
1283
1284   op << "      delete " << counter->charstar() << ";\n";
1285
1286 #if CMK_BLUEGENE_CHARM
1287   generateListEventBracket(op,SOLIST_END);
1288   op << "       "<< label->charstar() <<"_bgLogList.length()=0;\n";
1289 #endif
1290
1291   if(nextBeginOrEnd == 1)
1292    op << "      " << next->label->charstar() << "(";
1293   else
1294    op << "      " << next->label->charstar() << "_end(";
1295   generateCall(op, *stateVars);
1296   op << ");\n";
1297   // end actual code
1298   op << "    }\n";
1299   op << "  }\n";
1300 }
1301
1302 void SdagConstruct::generateOverlap(XStr& op)
1303 {
1304   // inlined start function
1305   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
1306   op << "  void " << label->charstar() << "(";
1307   generatePrototype(op, *stateVars);
1308   op << ") {\n";
1309 #if CMK_BLUEGENE_CHARM
1310   generateBeginTime(op);
1311   generateEventBracket(op,SOVERLAP);
1312 #endif
1313   // actual code here 
1314   op << "    " << constructs->front()->label->charstar() <<
1315         "(";
1316   generateCall(op, *stateVarsChildren);
1317   op << ");\n";
1318   // end actual code
1319   op << "  }\n";
1320   // trace
1321   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
1322   strcat(nameStr,"_end");
1323   // inlined end function
1324   op << "  void " << label->charstar() << "_end(";
1325   generatePrototype(op, *stateVarsChildren);
1326   op << ") {\n";
1327 #if CMK_BLUEGENE_CHARM
1328   generateBeginTime(op);
1329   generateEventBracket(op,SOVERLAP_END);
1330 #endif
1331   // actual code here 
1332   if(nextBeginOrEnd == 1)
1333    op << "    " << next->label->charstar() << "(";
1334   else
1335    op << "    " << next->label->charstar() << "_end(";
1336   generateCall(op, *stateVars);
1337   op << ");\n";
1338   // end actual code
1339   op << "  }\n";
1340 }
1341
1342 void SdagConstruct::generateSlist(XStr& op)
1343 {
1344   // inlined start function
1345   op << "  void " << label->charstar() << "(";
1346   generatePrototype(op, *stateVars);
1347   op << ") {\n";
1348   // actual code here 
1349   op << "    " << constructs->front()->label->charstar() <<
1350         "(";
1351   generateCall(op, *stateVarsChildren);
1352   op << ");\n";
1353   // end actual code
1354   op << "  }\n";
1355   // inlined end function
1356   op << "  void " << label->charstar() << "_end(";
1357   generatePrototype(op, *stateVarsChildren); 
1358   op << ") {\n";
1359   // actual code here 
1360   if(nextBeginOrEnd == 1)
1361    op << "    " << next->label->charstar() << "(";
1362   else
1363    op << "    " << next->label->charstar() << "_end(";
1364   generateCall(op, *stateVars);
1365   op << ");\n";
1366   // end actual code
1367   op << "  }\n";
1368 }
1369
1370 void SdagConstruct::generateSdagEntry(XStr& op)
1371 {
1372   // header file
1373   op << "public:\n";
1374   op << "  void " << con1->text->charstar() << "(";
1375   generatePrototype(op, *stateVars);
1376   op << ") {\n";
1377   SdagConstruct *sc;
1378   SdagConstruct *sc1;
1379   for(sc =publishesList->begin(); !publishesList->end(); sc=publishesList->next()) {
1380      for(sc1=sc->constructs->begin(); !sc->constructs->end(); sc1 = sc->constructs->next())
1381         op << "    _connect_" << sc1->text->charstar() <<"();\n";
1382   }
1383 #if CMK_BLUEGENE_CHARM
1384   generateEndSeq(op);
1385 #endif
1386   // actual code here 
1387   op << "    " << constructs->front()->label->charstar() <<
1388         "(";
1389   generateCall(op, *stateVarsChildren);
1390   op << ");\n";
1391 #if CMK_BLUEGENE_CHARM
1392   generateTlineEndCall(op);
1393   generateBeginExec(op, "spaceholder");
1394 #endif
1395   generateDummyBeginExecute(op);
1396   // end actual code
1397   op << "  }\n\n";
1398   op << "private:\n";
1399   op << "  void " << con1->text->charstar() << "_end(";
1400 #if CMK_BLUEGENE_CHARM
1401   generatePrototype(op, *stateVarsChildren);
1402 #else
1403   generatePrototype(op, *stateVars);
1404 #endif
1405   op << ") {\n";
1406   op << "  }\n\n";
1407 }
1408
1409 void SdagConstruct::generateAtomic(XStr& op)
1410
1411   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
1412   op << "  void " << label->charstar() << "(";
1413   generatePrototype(op, *stateVars);
1414   op << ") {\n";
1415 #if CMK_BLUEGENE_CHARM
1416   generateBeginExec(op, nameStr);
1417 #endif
1418   generateTraceBeginCall(op);
1419   op << "    " << text->charstar() << "\n";
1420   // trace
1421   generateTraceEndCall(op);
1422 #if CMK_BLUEGENE_CHARM
1423   generateEndExec(op);
1424 #endif
1425   if(nextBeginOrEnd == 1)
1426     op << "    " << next->label->charstar() << "(";
1427   else
1428     op << "    " << next->label->charstar() << "_end(";
1429   generateCall(op, *stateVars);
1430   op << ");\n";
1431   op << "  }\n\n";
1432 }
1433
1434 void SdagConstruct::generatePrototype(XStr& op, ParamList *list)
1435 {
1436    ParamList *pl = list;
1437    int count = 0;
1438    int i, numStars;
1439    if (pl->isVoid() == 1) {
1440      op << "void"; 
1441    }
1442    else if (pl->isMessage() == 1){
1443      op << pl->getBaseName() <<" *" <<pl->getGivenName() ;
1444    }
1445    else {
1446      while(pl != NULL) {
1447        if (count > 0)
1448           op <<", ";
1449        if (pl->isPointer() == 1) {
1450          op <<pl->getBaseName(); 
1451          numStars = pl->getNumStars();
1452          for(i=0; i< numStars; i++)
1453            op <<"*";
1454          op <<" "<<pl->getGivenName();
1455        }
1456        else if (pl->isReference() == 1) 
1457          op <<pl->getBaseName() <<"& " <<pl->getGivenName();
1458        else if (pl->isArray() == 1) 
1459          op <<pl->getBaseName() <<"* " <<pl->getGivenName();
1460        else if ((pl->isBuiltin() == 1) || (pl->isNamed() == 1))
1461          op <<pl->getBaseName() <<" " <<pl->getGivenName();
1462        pl = pl->next;
1463        count++;
1464      }
1465    }
1466 }
1467
1468
1469 void SdagConstruct::generatePrototype(XStr& op, TList<CStateVar*>& list)
1470 {
1471   CStateVar *sv;
1472   int isVoid;
1473   int count;
1474   count = 0;
1475   for(sv=list.begin(); !list.end(); ) {
1476     isVoid = sv->isVoid;
1477     if ((count != 0) && (isVoid != 1))
1478        op << ", ";
1479     if (sv->isVoid != 1) {
1480       if (sv->type != 0) 
1481          op <<sv->type->charstar() <<" ";
1482       if (sv->byRef != 0)
1483          op <<" &";
1484       if (sv->arrayLength != NULL) 
1485          op <<"*";
1486       else if (sv->numPtrs != 0) {
1487         for (int i=0; i<sv->numPtrs; i++) 
1488           op <<"*";
1489          op <<" ";
1490       }
1491       if (sv->name != 0)
1492          op <<sv->name->charstar();
1493     }
1494     if (sv->isVoid != 1)
1495        count++;
1496     sv = list.next();
1497   }
1498 }
1499
1500 void SdagConstruct::generateCall(XStr& op, TList<CStateVar*>& list) {
1501   CStateVar *sv;
1502   int isVoid;
1503   int count;
1504   count = 0;
1505   for(sv=list.begin(); !list.end(); ) {
1506      isVoid = sv->isVoid;
1507      if ((count != 0) && (isVoid != 1))
1508         op << ", ";
1509      if (sv->name != 0) 
1510        op << sv->name->charstar();
1511     if (sv->isVoid != 1)
1512        count++;
1513     sv = list.next();
1514   }
1515 }
1516
1517 // boe = 1, if the next call is to begin construct
1518 // boe = 0, if the next call is to end a contruct
1519 void SdagConstruct::setNext(SdagConstruct *n, int boe)
1520 {
1521   switch(type) {
1522     case SSLIST:
1523       next = n;
1524       nextBeginOrEnd = boe;
1525       {
1526         SdagConstruct *notConnectNode = this;
1527         SdagConstruct *cn=constructs->begin();
1528         if (cn==0) // empty slist
1529           return;
1530         else if (cn->type != SCONNECT)
1531           notConnectNode = cn;
1532         int flag = 1;
1533         SdagConstruct *nextNode=constructs->next();
1534         for(; nextNode != 0;) {
1535           if (nextNode->type != SCONNECT)
1536             notConnectNode = nextNode;
1537           flag = 1;
1538           while ((flag == 1) && (nextNode->type == SCONNECT)) {
1539             nextNode = constructs->next();
1540             if (nextNode == 0)
1541               flag = 0;
1542           }
1543           if (nextNode != 0) {
1544             cn->setNext(nextNode, 1);
1545             cn = nextNode;
1546             nextNode = constructs->next();
1547           }
1548         }
1549         cn->setNext(this, 0);
1550       }
1551       return;
1552     case SSDAGENTRY:
1553     case SOVERLAP:
1554     case SOLIST:
1555     case SFORALL:
1556     case SWHEN:
1557     case SFOR:
1558     case SWHILE:
1559     case SATOMIC:
1560     case SFORWARD:
1561     case SELSE:
1562       next = n;
1563       nextBeginOrEnd = boe;
1564       n = this; boe = 0; break;
1565     case SIF:
1566       next = n;
1567       nextBeginOrEnd = boe;
1568       if(con2 != 0)
1569         con2->setNext(n, boe);
1570       n = this;
1571       boe = 0;
1572       break;
1573     default:
1574       break;
1575   }
1576   SdagConstruct *cn;
1577   if (constructs != 0) {
1578     for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
1579       cn->setNext(n, boe);
1580     }
1581   }
1582 }
1583
1584
1585 // for trace
1586
1587 void SdagConstruct::generateTrace()
1588 {
1589   char text[1024];
1590   switch(type) {
1591   case SATOMIC:
1592     if (traceName) {
1593       sprintf(text, "%s_%s", CParsedFile::className->charstar(), traceName->charstar());
1594       // remove blanks
1595       for (unsigned int i=0; i<strlen(text); i++)
1596         if (text[i]==' '||text[i]=='\t') text[i]='_';
1597     }
1598     else {
1599       sprintf(text, "%s%s", CParsedFile::className->charstar(), label->charstar());
1600     }
1601     traceName = new XStr(text);
1602     break;
1603   default:
1604     break;
1605   }
1606
1607   SdagConstruct *cn;
1608   for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
1609     cn->generateTrace();
1610   }
1611   if (con1) con1->generateTrace();
1612   if (con2) con2->generateTrace();
1613   if (con3) con3->generateTrace();
1614 }
1615
1616 void SdagConstruct::generateTraceBeginCall(XStr& op)          // for trace
1617 {
1618   if(traceName)
1619     op << "    " << "_TRACE_BEGIN_EXECUTE_DETAILED(-1, -1, " << "__idx_" << traceName->charstar() << ", CkMyPe(), 0, NULL); \n";
1620 }
1621
1622 void SdagConstruct::generateDummyBeginExecute(XStr& op)
1623 {
1624     op << "    " << "_TRACE_BEGIN_EXECUTE_DETAILED(-1, -1, _dummyEP, CkMyPe(), 0, NULL); \n";
1625 }
1626
1627 void SdagConstruct::generateTraceEndCall(XStr& op)          // for trace
1628 {
1629   op << "    " << "_TRACE_END_EXECUTE(); \n";
1630 }
1631
1632 void SdagConstruct::generateBeginExec(XStr& op, const char *name){
1633   op << "     " << "_TRACE_BG_BEGIN_EXECUTE_NOMSG(\""<<name<<"\",&_bgParentLog,1);\n"; 
1634 }
1635
1636 void SdagConstruct::generateEndExec(XStr& op){
1637   op << "     " << "_TRACE_BG_END_EXECUTE(0);\n";
1638 }
1639
1640 void SdagConstruct::generateBeginTime(XStr& op)
1641 {
1642   //Record begin time for tracing
1643   op << "    double __begintime = CkVTimer(); \n";
1644 }
1645
1646 void SdagConstruct::generateTlineEndCall(XStr& op)
1647 {
1648   //Trace this event
1649   op <<"    _TRACE_BG_TLINE_END(&_bgParentLog);\n";
1650 }
1651
1652 void SdagConstruct::generateEndSeq(XStr& op)
1653 {
1654   op <<  "    void* _bgParentLog = NULL;\n";
1655   op <<  "    CkElapse(0.01e-6);\n";
1656   //op<<  "    BgElapse(1e-6);\n";
1657   generateTlineEndCall(op);
1658   generateTraceEndCall(op);
1659   generateEndExec(op);
1660 }
1661
1662 void SdagConstruct::generateEventBracket(XStr& op, int eventType)
1663 {
1664   (void) eventType;
1665   //Trace this event
1666   op << "     _TRACE_BG_USER_EVENT_BRACKET(\"" << nameStr
1667      << "\", __begintime, CkVTimer(),&_bgParentLog); \n";
1668 }
1669
1670 void SdagConstruct::generateListEventBracket(XStr& op, int eventType)
1671 {
1672   (void) eventType;
1673   op << "    _TRACE_BGLIST_USER_EVENT_BRACKET(\"" << nameStr
1674      << "\",__begintime,CkVTimer(),&_bgParentLog, " << label->charstar()
1675      << "_bgLogList);\n";
1676 }
1677
1678 void SdagConstruct::generateRegisterEp(XStr& op)          // for trace
1679 {
1680   if (traceName) {
1681     op << "    __idx_" << traceName->charstar()
1682        << " = CkRegisterEp(\"" << traceName->charstar()
1683        << "(void)\", NULL, 0, CkIndex_" << CParsedFile::className->charstar()
1684        << "::__idx, 0);\n";
1685   }
1686
1687   SdagConstruct *cn;
1688   for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
1689     cn->generateRegisterEp(op);
1690   }
1691   if (con1) con1->generateRegisterEp(op);
1692   if (con2) con2->generateRegisterEp(op);
1693   if (con3) con3->generateRegisterEp(op);
1694 }
1695
1696 void SdagConstruct::generateTraceEpDecl(XStr& op)          // for trace
1697 {
1698   if (traceName) {
1699     op << "  static int __idx_" << traceName->charstar() << ";\n"; 
1700   }
1701   SdagConstruct *cn;
1702   for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
1703     cn->generateTraceEpDecl(op);
1704   }
1705   if (con1) con1->generateTraceEpDecl(op);
1706   if (con2) con2->generateTraceEpDecl(op);
1707   if (con3) con3->generateTraceEpDecl(op);
1708 }
1709
1710
1711 void SdagConstruct::generateTraceEpDef(XStr& op)          // for trace
1712 {
1713   if (traceName) {
1714     op << "  int " << CParsedFile::className->charstar()
1715        << "::__idx_" << traceName->charstar() << "=0;\\\n";
1716   }
1717   SdagConstruct *cn;
1718   for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
1719     cn->generateTraceEpDef(op);
1720   }
1721   if (con1) con1->generateTraceEpDef(op);
1722   if (con2) con2->generateTraceEpDef(op);
1723   if (con3) con3->generateTraceEpDef(op);
1724 }
1725
1726
1727 void RemoveSdagComments(char *str)
1728 {
1729   char *ptr = str;
1730   while ((ptr = strstr(ptr, "//"))) {
1731     char *lend = strstr(ptr, "\n");
1732     if (lend==NULL) break;
1733     while (ptr != lend) *ptr++=' ';
1734   }
1735 }
1736
1737 }