sdag: Eliminate dead variables and weird logic that led to warnings
[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       numParameters=0; count=0; isMsg=0; 
368
369       for(sv=list.begin(); !list.end(); sv=list.next()) {
370         stateVars->append(sv);
371         stateVarsChildren->append(sv);
372       }
373      
374       {  
375         EntryList *el;
376         el = elist;
377         ParamList *pl;
378         while (el != NULL) {
379           pl = el->entry->param;
380           el->entry->stateVars = new TList<CStateVar*>();
381           if (pl->isVoid()) {
382             sv = new CStateVar(1, NULL, 0, NULL, 0, NULL, 0);
383             //stateVars->append(sv);
384               stateVarsChildren->append(sv);
385               whensEntryMethodStateVars->append(sv); 
386               el->entry->estateVars.append(sv);
387               el->entry->stateVars->append(sv);
388           }
389           else if (pl->isMessage()){
390             sv = new CStateVar(0, pl->getBaseName(), 1, pl->getGivenName(), 0, NULL, 1);
391             //stateVars->append(sv);
392               stateVarsChildren->append(sv);
393               whensEntryMethodStateVars->append(sv); 
394               el->entry->estateVars.append(sv);
395               el->entry->stateVars->append(sv);
396           }
397           else {
398             while(pl != NULL) {
399               if (pl->isPointer()) {
400                 sv = new CStateVar(0, pl->getBaseName(), pl->getNumStars(), pl->getGivenName(), 0, NULL, 0); 
401               }
402               else if (pl->isReference()) {
403                 sv = new CStateVar(0, pl->getBaseName(), 0, pl->getGivenName(), new XStr("&"), NULL, 0); 
404               }
405               else if (pl->isArray()) {
406                 sv = new CStateVar(0, pl->getBaseName(), 0, pl->getGivenName(), 0, pl->getArrayLen(), 0); 
407               }
408               else if (pl->isBuiltin()) {
409                 sv = new CStateVar(0, pl->getBaseName(), 0, pl->getGivenName(), 0, NULL, 0); 
410               }
411               else if (pl->isNamed()) {
412                 sv = new CStateVar(0, (XStr)(*(pl->param->getType())), 0, pl->getGivenName(), 0, NULL, 0); 
413               }
414               else
415                  printf("PROBLEM - I DON'T KNOW THE TYPE\n");
416               pl = pl->next;
417               stateVarsChildren->append(sv);
418               whensEntryMethodStateVars->append(sv); 
419               el->entry->estateVars.append(sv);
420               el->entry->stateVars->append(sv);
421             }
422           }
423           el = el->next;
424
425         }
426       }
427       break;
428     case SIF:
429       for(sv=list.begin(); !list.end(); sv=list.next()) {
430         stateVars->append(sv);
431       }
432       stateVarsChildren = stateVars;
433       if(con2 != 0) con2->propagateState(list, wlist,publist, uniqueVarNum);
434       break;
435     case SOLIST:
436       stateVarsChildren = new TList<CStateVar*>();
437       for(sv=list.begin(); !list.end(); sv=list.next()) {
438         stateVars->append(sv);
439         stateVarsChildren->append(sv);
440       }
441       {
442         char txt[128];
443         sprintf(txt, "_co%d", nodeNum);
444         counter = new XStr(txt);
445         sv = new CStateVar(0,"CCounter",1, txt,0, NULL, 1);
446         stateVarsChildren->append(sv);
447       }
448       break;
449     case SFOR:
450     case SWHILE:
451     case SELSE:
452     case SSLIST:
453     case SOVERLAP:
454       for(sv=list.begin(); !list.end(); sv=list.next()) {
455         stateVars->append(sv);
456       }
457       stateVarsChildren = stateVars;
458       break;
459     case SATOMIC:
460       for(sv=list.begin(); !list.end(); sv=list.next()) {
461         stateVars->append(sv);
462       }
463       stateVarsChildren = stateVars;
464       if (con1 != 0) {
465         publist.append(con1);
466         /*SdagConstruct *sc;
467         SdagConstruct *sc1;
468         for(sc =publist.begin(); !publist.end(); sc=publist.next()) {
469            for(sc1=sc->constructs->begin(); !sc->constructs->end(); sc1 = sc->constructs->next())
470            printf("Publist = %s\n", sc1->text->charstar());
471         }*/
472       }
473       break;
474     case SFORWARD:
475       stateVarsChildren = new TList<CStateVar*>();
476       for(sv=list.begin(); !list.end(); sv=list.next()) { 
477         stateVars->append(sv);
478       }
479       for(sv=wlist.begin(); !wlist.end(); sv=wlist.next()) { 
480         stateVarsChildren->append(sv);
481       }
482
483       break;
484     case SCONNECT: 
485     case SINT_EXPR:
486     case SIDENT:
487     case SENTRY:
488     case SELIST:
489       break;
490     default:
491       fprintf(stderr, "internal error in sdag translator..\n");
492       exit(1);
493       break;
494   }
495   SdagConstruct *cn;
496   if (constructs != 0) {
497     for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
498       if (type == SWHEN)
499          cn->propagateState(*stateVarsChildren, *whensEntryMethodStateVars, publist,  uniqueVarNum);
500       else
501          cn->propagateState(*stateVarsChildren, wlist, publist,  uniqueVarNum);
502     }
503  } 
504 }
505
506 void SdagConstruct::generateCode(XStr& op)
507 {
508   switch(type) {
509     case SSDAGENTRY:
510       generateSdagEntry(op);
511       break;
512     case SSLIST:
513       generateSlist(op);
514       break;
515     case SOLIST:
516       generateOlist(op);
517       break;
518     case SFORALL:
519       generateForall(op);
520       break;
521     case SATOMIC:
522       generateAtomic(op);
523       break;
524     case SIF:
525       generateIf(op);
526       if(con2 != 0)
527         con2->generateCode(op);
528       break;
529     case SELSE:
530       generateElse(op);
531       break;
532     case SWHILE:
533       generateWhile(op);
534       break;
535     case SFOR:
536       generateFor(op);
537       break;
538     case SOVERLAP:
539       generateOverlap(op);
540       break;
541     case SWHEN:
542       generateWhen(op);
543       break;
544     case SFORWARD:
545       generateForward(op);
546       break;
547     case SCONNECT:
548       generateConnect(op);
549       break;
550     default:
551       break;
552   }
553   SdagConstruct *cn;
554   if (constructs != 0) {
555     for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
556       cn->generateCode(op);
557     }
558   }
559 }
560
561 void SdagConstruct::generateConnect(XStr& op) {
562   op << "  void " << label->charstar() << "() {\n";
563   op << "    int index;\n";
564   if ((param->isVoid() == 0) && (param->isMessage() == 0)) {
565      op << "    CkMarshallMsg *x;\n";  
566      op << "    index = CkIndex_Ar1::" <<connectEntry->charstar() <<"(x);\n";  //replace
567      op << "    CkCallback cb(index, CkArrayIndex1D(thisIndex), a1);\n";  // replace 
568   }
569   else if (param->isVoid() == 1) {
570      op << "    index = CkIndex_Ar1::" <<connectEntry->charstar() <<"(void);\n";  //replace
571      op << "    CkCallback cb(index, CkArrayIndex1D(thisIndex), a1);\n";  // replace 
572   }
573   else {
574      op << "    " << param->getBaseName() <<" *x;\n";  // replace
575      op << "    index = CkIndex_Ar1::" <<connectEntry->charstar() <<"(x);\n";  //replace
576      op << "    CkCallback cb(index, CkArrayIndex1D(thisIndex), a1);\n";  // replace 
577   }
578   op << "    myPublish->get_" <<connectEntry->charstar() <<"(cb);\n";  //replace - myPublish
579
580   op << "  }\n\n";  
581 }
582
583 void SdagConstruct::generateForward(XStr& op) {
584   SdagConstruct *cn;
585   op << "  void " << label->charstar() << "(";
586   generatePrototype(op, *stateVars);
587   op << ") {\n";
588   for (cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
589     op << "    { "<<cn->text->charstar()<<"(";
590     generateCall(op, *stateVarsChildren);
591     op<<"); }\n";
592   }
593   if(nextBeginOrEnd == 1)
594     op << "    " << next->label->charstar() << "(";
595   else
596     op << "    " << next->label->charstar() << "_end(";
597   generateCall(op, *stateVars);
598   op << ");\n";
599   op << "  }\n\n";
600 }
601
602
603 void SdagConstruct::generateWhen(XStr& op)
604 {
605   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
606   op << "  int " << label->charstar() << "(";
607   generatePrototype(op, *stateVars);
608   op << ") {\n";
609 #if CMK_BLUEGENE_CHARM
610   generateBeginTime(op);
611 #endif
612
613   CStateVar *sv;
614
615   Entry *e;
616   EntryList *el;
617   el = elist;
618   while (el != NULL){
619     e = el->entry;
620     if (e->param->isVoid() == 1)
621         op << "    CMsgBuffer *"<<e->getEntryName()<<"_buf;\n";
622     else if (e->paramIsMarshalled() == 1) {
623
624         op << "    CMsgBuffer *"<<e->getEntryName()<<"_buf;\n";
625         op << "    CkMarshallMsg *" <<
626                         e->getEntryName() << "_msg;\n";
627     }
628     else {
629         for(sv=e->stateVars->begin(); !e->stateVars->end(); e->stateVars->next()) {
630           op << "    CMsgBuffer *"<<sv->name->charstar()<<"_buf;\n";
631           op << "    " << sv->type->charstar() << " *" <<
632                           sv->name->charstar() << ";\n";
633         } 
634     }
635     el = el->next;
636   }
637
638   op << "\n";
639   el = elist;
640   while (el != NULL) {
641      e = el->entry;
642      if ((e->paramIsMarshalled() == 1) || (e->param->isVoid() == 1)) {
643         if((e->intExpr == 0) || (e->param->isVoid() == 1)) {   // DOUBLE CHECK THIS LOGIC
644            op << "    " << e->getEntryName(); 
645            op << "_buf = __cDep->getMessage(" << e->entryPtr->entryNum << ");\n";
646         }           
647         else {
648            op << "    " << e->getEntryName() << 
649                  "_buf = __cDep->getMessage(" << e->entryPtr->entryNum <<
650                  ", " << e->intExpr << ");\n";
651         }
652      }
653      else { // The parameter is a message
654         sv = e->stateVars->begin();
655         if(e->intExpr == 0) {
656            op << "    " << sv->name->charstar(); 
657            op << "_buf = __cDep->getMessage(" << e->entryPtr->entryNum << ");\n";
658         }           
659         else {
660            op << "    " << sv->name->charstar() << 
661                  "_buf = __cDep->getMessage(" << e->entryPtr->entryNum <<
662                  ", " << e->intExpr << ");\n";
663         }
664      }  
665     el = el->next;
666   }
667
668   op << "\n";
669   op << "    if (";
670   el = elist;
671   while (el != NULL)  {
672      e = el->entry;
673      if ((e->paramIsMarshalled() == 1) || (e->param->isVoid() ==1)) {
674         op << "(" << e->getEntryName() << "_buf != 0)";
675      }
676      else {
677         sv = e->stateVars->begin();
678         op << "(" << sv->name->charstar() << "_buf != 0)";
679      }
680      el = el->next;
681      if (el != NULL)
682         op << "&&";
683   }
684   op << ") {\n";
685
686 #if CMK_BLUEGENE_CHARM
687   // for tracing
688   //TODO: instead of this, add a length field to EntryList
689   int elen=0;
690   for(el=elist; el!=NULL; el=elist->next) elen++;
691  
692   op << "         void * logs1["<< elen << "]; \n";
693   op << "         void * logs2["<< elen + 1<< "]; \n";
694   int localnum = 0;
695   for(el=elist; el!=NULL; el=elist->next) {
696     e = el->entry;
697        if ((e->paramIsMarshalled() == 1) || (e->param->isVoid() ==1)) {
698         op << "       logs1[" << localnum << "] = " << /*el->con4->text->charstar() sv->type->charstar()*/e->getEntryName() << "_buf->bgLog1; \n";
699         op << "       logs2[" << localnum << "] = " << /*el->con4->text->charstar() sv->type->charstar()*/e->getEntryName() << "_buf->bgLog2; \n";
700         localnum++;
701       }
702       else{
703         op << "       logs1[" << localnum << "] = " << /*el->con4->text->charstar()*/ sv->name->charstar()<< "_buf->bgLog1; \n";
704         op << "       logs2[" << localnum << "] = " << /*el->con4->text->charstar()*/ sv->name->charstar() << "_buf->bgLog2; \n";
705         localnum++;
706       }
707   }
708       
709   op << "       logs2[" << localnum << "] = " << "_bgParentLog; \n";
710   generateEventBracket(op,SWHEN);
711   op << "       _TRACE_BG_FORWARD_DEPS(logs1,logs2,"<< localnum << ",_bgParentLog);\n";
712 #endif
713
714   el = elist;
715   while (el != NULL) {
716      e = el->entry;
717      if (e->param->isVoid() == 1) {
718         op <<"       CkFreeSysMsg((void *) "<<e->getEntryName() <<"_buf->msg);\n";
719         op << "       __cDep->removeMessage(" << e->getEntryName() <<
720               "_buf);\n";
721         op << "      delete " << e->getEntryName() << "_buf;\n";
722      }
723      else if (e->paramIsMarshalled() == 1) {
724         op << "       " << e->getEntryName() << "_msg = (CkMarshallMsg *)"  
725                << e->getEntryName() << "_buf->msg;\n";
726         op << "       char *"<<e->getEntryName() <<"_impl_buf=((CkMarshallMsg *)"
727            <<e->getEntryName() <<"_msg)->msgBuf;\n";
728         op <<"       PUP::fromMem " <<e->getEntryName() <<"_implP(" 
729            <<e->getEntryName() <<"_impl_buf);\n";
730
731         for(sv=e->stateVars->begin(); !e->stateVars->end(); sv=e->stateVars->next()) {
732            if (sv->arrayLength != NULL)
733               op <<"      int impl_off_"<<sv->name->charstar()
734                  <<"; "<<e->getEntryName() <<"_implP|impl_off_"
735                  <<sv->name->charstar()<<";\n";
736            else
737                op <<"       "<<sv->type->charstar()<<" "<<sv->name->charstar()
738                <<"; " <<e->getEntryName() <<"_implP|"
739                <<sv->name->charstar()<<";\n";
740         }
741         op << "       " <<e->getEntryName() <<"_impl_buf+=CK_ALIGN("
742            <<e->getEntryName() <<"_implP.size(),16);\n";
743         for(sv=e->stateVars->begin(); !e->stateVars->end(); sv=e->stateVars->next()) {
744            if (sv->arrayLength != NULL)
745               op << "    "<<sv->type->charstar()<< " *" <<sv->name->charstar() <<"=(" <<sv->type->charstar()
746                  <<" *)(" <<e->getEntryName() <<"_impl_buf+" <<"impl_off_"
747                  <<sv->name->charstar()<<");\n";
748         }
749         op << "       __cDep->removeMessage(" << e->getEntryName() <<
750               "_buf);\n";
751         op << "       delete " << e->getEntryName() << "_buf;\n";
752      }
753      else {  // There was a message as the only parameter
754         sv = e->stateVars->begin();
755         op << "       " << sv->name->charstar() << " = (" << 
756               sv->type->charstar() << " *) " <<
757               sv->name->charstar() << "_buf->msg;\n";
758         op << "       __cDep->removeMessage(" << sv->name->charstar() <<
759               "_buf);\n";
760         op << "       delete " << sv->name->charstar() << "_buf;\n";
761      }
762      el = el->next;
763   }
764
765   // max(current,merge) --> current, then reset the mergepath
766 #ifdef USE_CRITICAL_PATH_HEADER_ARRAY
767   op << "       " << label->charstar()  << "_PathMergePoint.updateMax(currentlyExecutingPath); /* Critical Path Detection */ \n";
768   op << "       currentlyExecutingPath = " << label->charstar()  << "_PathMergePoint; /* Critical Path Detection */ \n";
769   op << "       " << label->charstar()  << "_PathMergePoint.reset(); /* Critical Path Detection */ \n";
770 #endif
771
772   if (constructs != 0) {
773     if (!constructs->empty() ) {
774        op << "       " << constructs->front()->label->charstar() << "(";
775        generateCall(op, *stateVarsChildren);
776        op << ");\n";
777     }
778     else {
779        op << "       " << label->charstar() << "_end(";
780        generateCall(op, *stateVarsChildren);
781        op << ");\n";
782     }
783   }
784   else {
785      op << "       " << label->charstar() << "_end(";
786      generateCall(op, *stateVarsChildren);
787      op << ");\n";
788   }
789
790   el = elist;
791   while (el != NULL){
792     e = el->entry;
793     if (e->paramIsMarshalled() == 1) {
794         op << "       delete " << e->getEntryName() << "_msg;\n";
795     }
796     el = el->next;
797   }
798   op << "       return 1;\n";
799   op << "    } else {\n";
800
801   int nRefs=0, nAny=0;
802   el = elist;
803   while (el != NULL) {
804     e = el->entry;
805     if(e->intExpr == 0)
806       nAny++;
807     else
808       nRefs++;
809     el = el->next;
810   }
811 // keep these consts consistent with sdag.h in runtime
812
813 #define MAXARG 8
814 #define MAXANY 8
815 #define MAXREF 8
816
817   if(stateVars->length() > MAXARG) {
818     fprintf(stderr, "numStateVars more that %d, contact developers.\n",
819                      MAXARG);
820     exit(1);
821   }
822   if(nRefs > MAXREF) {
823     fprintf(stderr, "numDepends more that %d, contact developers.\n",
824                      MAXREF);
825     exit(1);
826   }
827   if(nAny > MAXANY) {
828     fprintf(stderr, "numDepends more that %d, contact developers.\n",
829                      MAXANY);
830     exit(1);
831   }
832   op << "       CWhenTrigger *tr;\n";
833   op << "       tr = new CWhenTrigger(" << nodeNum << ", " <<
834         stateVars->length() << ", " << nRefs << ", " << nAny << ");\n";
835   int iArgs=0;
836  
837 //  op << "       int impl_off=0;\n";
838   int hasArray = 0;
839   int isVoid = 0;
840   int numParamsNeedingMarshalling = 0;
841   int paramIndex =0;
842   for(sv=stateVars->begin();!stateVars->end();sv=stateVars->next()) {
843     if (sv->isVoid == 1) {
844         isVoid = 1;
845        op <<"       tr->args[" <<iArgs++ <<"] = (size_t) CkAllocSysMsg();\n";
846     }
847     else {
848       if (sv->isMsg == 1) {
849          op << "       tr->args["<<iArgs++ <<"] = (size_t) " <<sv->name->charstar()<<";\n";
850       }
851       else {
852          numParamsNeedingMarshalling++;
853          if (numParamsNeedingMarshalling == 1) {
854            op << "       int impl_off=0;\n";
855            paramIndex = iArgs;
856            iArgs++;
857          }
858       }
859       if (sv->arrayLength !=NULL) {
860          hasArray++;
861          if (hasArray == 1)
862            op<< "       int impl_arrstart=0;\n";
863          op <<"       int impl_off_"<<sv->name->charstar()<<", impl_cnt_"<<sv->name->charstar()<<";\n";
864          op <<"       impl_off_"<<sv->name->charstar()<<"=impl_off=CK_ALIGN(impl_off,sizeof("<<sv->type->charstar()<<"));\n";
865          op <<"       impl_off+=(impl_cnt_"<<sv->name->charstar()<<"=sizeof("<<sv->type->charstar()<<")*("<<sv->arrayLength->charstar()<<"));\n";
866       }
867     }
868   }
869   if (numParamsNeedingMarshalling > 0) {
870      op << "       { \n";
871      op << "         PUP::sizer implP;\n";
872      for(sv=stateVars->begin();!stateVars->end();sv=stateVars->next()) {
873        if (sv->arrayLength !=NULL)
874          op << "         implP|impl_off_" <<sv->name->charstar() <<";\n";
875        else if ((sv->isMsg != 1) && (sv->isVoid !=1)) 
876          op << "         implP|" <<sv->name->charstar() <<";\n";
877      }
878      if (hasArray > 0) {
879         op <<"         impl_arrstart=CK_ALIGN(implP.size(),16);\n";
880         op <<"         impl_off+=impl_arrstart;\n";
881      }
882      else {
883         op << "         impl_off+=implP.size();\n";
884      }
885      op << "       }\n";
886      op << "       CkMarshallMsg *impl_msg;\n";
887      op << "       impl_msg = CkAllocateMarshallMsg(impl_off,NULL);\n";
888      op << "       {\n";
889      op << "         PUP::toMem implP((void *)impl_msg->msgBuf);\n";
890      for(sv=stateVars->begin();!stateVars->end();sv=stateVars->next()) {
891        if (sv->arrayLength !=NULL)
892           op << "         implP|impl_off_" <<sv->name->charstar() <<";\n";
893        else if ((sv->isMsg != 1) && (sv->isVoid != 1))  
894           op << "         implP|" <<sv->name->charstar() <<";\n";
895      }
896      op << "       }\n";
897      if (hasArray > 0) {
898         op <<"       char *impl_buf=impl_msg->msgBuf+impl_arrstart;\n";
899         for(sv=stateVars->begin();!stateVars->end();sv=stateVars->next()) {
900            if (sv->arrayLength !=NULL)
901               op << "       memcpy(impl_buf+impl_off_"<<sv->name->charstar()<<
902                          ","<<sv->name->charstar()<<",impl_cnt_"<<sv->name->charstar()<<");\n";
903         }  
904      }
905   op << "       tr->args[" <<paramIndex <<"] = (size_t) impl_msg;\n";
906   }
907   int iRef=0, iAny=0;
908
909   el = elist;
910   while (el != NULL) {
911     e = el->entry;
912     if(e->intExpr == 0) {
913       op << "       tr->anyEntries[" << iAny++ << "] = " <<
914             e->entryPtr->entryNum << ";\n";
915     } else {
916       op << "       tr->entries[" << iRef << "] = " << 
917             e->entryPtr->entryNum << ";\n";
918       op << "       tr->refnums[" << iRef++ << "] = " <<
919             e->intExpr << ";\n";
920     }
921     el = el->next;
922   }
923
924 #ifdef USE_CRITICAL_PATH_HEADER_ARRAY
925   // max(current,merge) --> current
926   op << "       " << label->charstar()  << "_PathMergePoint.updateMax(currentlyExecutingPath); /* Critical Path Detection */ \n";
927   op << "       currentlyExecutingPath = " << label->charstar()  << "_PathMergePoint; /* Critical Path Detection */ \n";
928 #endif
929
930   op << "       __cDep->Register(tr);\n";
931   op << "       return 0;\n";
932   op << "    }\n";
933
934   // end actual code
935   op << "  }\n\n";
936
937   // trace
938   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
939   strcat(nameStr,"_end");
940
941   // end function
942   op << "  void " << label->charstar() << "_end(";
943   generatePrototype(op, *stateVarsChildren);
944   op << ") {\n";
945 #if CMK_BLUEGENE_CHARM
946   generateBeginTime(op);
947   generateEventBracket(op,SWHEN_END);
948 #endif
949   // actual code here 
950   if(nextBeginOrEnd == 1)
951    op << "    " << next->label->charstar();
952   else 
953     op << "    " << next->label->charstar() << "_end";
954
955   op << "(";
956
957   generateCall(op, *stateVars); 
958   
959   op << ");\n";
960
961   el = elist;
962   while (el) {
963     e = el->entry;
964     if (e->param->isMessage() == 1) {
965       sv = e->stateVars->begin();
966       op << "    CmiFree(UsrToEnv(" << sv->name->charstar() << "));\n";
967     }
968
969     el = el->next;
970   }
971
972   // end actual code
973   op << "  }\n\n";
974 }
975
976 void SdagConstruct::generateWhile(XStr& op)
977 {
978   // inlined start function
979   op << "  void " << label->charstar() << "(";
980   generatePrototype(op, *stateVars);
981   op << ") {\n";
982   // actual code here 
983   op << "    if (" << con1->text->charstar() << ") {\n";
984   op << "      " << constructs->front()->label->charstar() << 
985         "(";
986   generateCall(op, *stateVarsChildren);
987   op << ");\n";
988   op << "    } else {\n";
989   if(nextBeginOrEnd == 1)
990    op << "      " << next->label->charstar() << "(";
991   else
992    op << "      " << next->label->charstar() << "_end(";
993   generateCall(op, *stateVars);
994   op << ");\n";
995   op << "    }\n";
996   // end actual code
997   op << "  }\n\n";
998   // inlined end function
999   op << "  void " << label->charstar() << "_end(";
1000   generatePrototype(op, *stateVarsChildren);
1001   op << ") {\n";
1002   // actual code here 
1003   op << "    if (" << con1->text->charstar() << ") {\n";
1004   op << "      " << constructs->front()->label->charstar() <<
1005         "(";
1006   generateCall(op, *stateVarsChildren);
1007   op << ");\n";
1008   op << "    } else {\n";
1009   if(nextBeginOrEnd == 1)
1010    op << "      " <<  next->label->charstar() << "(";
1011   else
1012    op << "      " << next->label->charstar() << "_end(";
1013   generateCall(op, *stateVars);
1014   op << ");\n";
1015   op << "    }\n";
1016   // end actual code
1017   op << "  }\n\n";
1018 }
1019
1020 void SdagConstruct::generateFor(XStr& op)
1021 {
1022   // inlined start function
1023   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
1024   op << "  void " << label->charstar() << "(";
1025   generatePrototype(op, *stateVars);
1026   op << ") {\n";
1027 #if CMK_BLUEGENE_CHARM
1028   // actual code here 
1029   generateBeginTime(op);
1030 #endif
1031   op << "    " << con1->text->charstar() << ";\n";
1032   //Record only the beginning for FOR
1033 #if CMK_BLUEGENE_CHARM
1034   generateEventBracket(op,SFOR);
1035 #endif
1036   op << "    if (" << con2->text->charstar() << ") {\n";
1037   op << "      " << constructs->front()->label->charstar() <<
1038         "(";
1039   generateCall(op, *stateVarsChildren);
1040   op << ");\n";
1041   op << "    } else {\n";
1042   if(nextBeginOrEnd == 1)
1043    op << "      " << next->label->charstar() << "(";
1044   else
1045    op << "      " << next->label->charstar() << "_end(";
1046   generateCall(op, *stateVars);
1047   op << ");\n";
1048   op << "    }\n";
1049   // end actual code
1050   op << "  }\n";
1051   // inlined end function
1052   // trace
1053   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
1054   strcat(nameStr,"_end");
1055   op << "  void " << label->charstar() << "_end(";
1056   generatePrototype(op, *stateVarsChildren);
1057   op << ") {\n";
1058 #if CMK_BLUEGENE_CHARM
1059   generateBeginTime(op);
1060 #endif
1061   // actual code here 
1062   op << con3->text->charstar() << ";\n";
1063   op << "    if (" << con2->text->charstar() << ") {\n";
1064   op << "      " << constructs->front()->label->charstar() <<
1065         "(";
1066   generateCall(op, *stateVarsChildren);
1067   op << ");\n";
1068   op << "    } else {\n";
1069 #if CMK_BLUEGENE_CHARM
1070   generateEventBracket(op,SFOR_END);
1071 #endif
1072   if(nextBeginOrEnd == 1)
1073    op << "      " << next->label->charstar() << "(";
1074   else
1075    op << "      " << next->label->charstar() << "_end(";
1076    generateCall(op, *stateVars);
1077   op << ");\n";
1078   op << "    }\n";
1079   // end actual code
1080   op << "  }\n";
1081 }
1082
1083 void SdagConstruct::generateIf(XStr& op)
1084 {
1085   // inlined start function
1086   strcpy(nameStr,label->charstar());
1087   op << "  void " << label->charstar() << "(";
1088   generatePrototype(op, *stateVars);
1089   op << ") {\n";
1090 #if CMK_BLUEGENE_CHARM
1091   generateBeginTime(op);
1092   generateEventBracket(op,SIF);
1093 #endif
1094   // actual code here 
1095   op << "    if (" << con1->text->charstar() << ") {\n";
1096   op << "      " << constructs->front()->label->charstar() <<
1097         "(";
1098   generateCall(op, *stateVarsChildren);
1099   op << ");\n";
1100   op << "    } else {\n";
1101   if (con2 != 0) {
1102     op << "      " << con2->label->charstar() << "(";
1103     generateCall(op, *stateVarsChildren);
1104     op << ");\n";
1105   } else {
1106     op << "      " << label->charstar() << "_end(";
1107     generateCall(op, *stateVarsChildren);
1108     op << ");\n";
1109   }
1110   op << "    }\n";
1111   // end actual code
1112   op << "  }\n\n";
1113   // inlined end function
1114   strcpy(nameStr,label->charstar());
1115   strcat(nameStr,"_end");
1116   op << "  void " << label->charstar() << "_end(";
1117   generatePrototype(op, *stateVarsChildren);
1118   op << ") {\n";
1119 #if CMK_BLUEGENE_CHARM
1120   generateBeginTime(op);
1121   generateEventBracket(op,SIF_END);
1122 #endif
1123   // actual code here 
1124   if(nextBeginOrEnd == 1)
1125    op << "      " << next->label->charstar() << "(";
1126   else
1127    op << "      " << next->label->charstar() << "_end(";
1128   generateCall(op, *stateVars);
1129   op << ");\n";
1130   // end actual code
1131   op << "  }\n\n";
1132 }
1133
1134 void SdagConstruct::generateElse(XStr& op)
1135 {
1136   // inlined start function
1137   strcpy(nameStr,label->charstar());
1138   op << "  void " << label->charstar() << "(";
1139   generatePrototype(op, *stateVars);
1140   op << ") {\n";
1141   // trace
1142   generateBeginTime(op);
1143   generateEventBracket(op,SELSE);
1144   // actual code here 
1145   op << "    " << constructs->front()->label->charstar() << 
1146         "(";
1147   generateCall(op, *stateVarsChildren);
1148   op << ");\n";
1149   // end actual code
1150   op << "  }\n\n";
1151   // inlined end function
1152   // trace
1153   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
1154   strcat(nameStr,"_end");
1155   op << "  void " << label->charstar() << "_end(";
1156   generatePrototype(op, *stateVarsChildren);
1157   op << ") {\n";
1158 #if CMK_BLUEGENE_CHARM
1159   generateBeginTime(op);
1160   generateEventBracket(op,SELSE_END);
1161 #endif
1162   // actual code here 
1163   if(nextBeginOrEnd == 1)
1164    op << "      " << next->label->charstar() << "(";
1165   else
1166    op << "      " << next->label->charstar() << "_end(";
1167   generateCall(op, *stateVars);
1168   op << ");\n";
1169   // end actual code
1170   op << "  }\n\n";
1171 }
1172
1173 void SdagConstruct::generateForall(XStr& op)
1174 {
1175   // inlined start function
1176   op << "  void " << label->charstar() << "(";
1177   generatePrototype(op, *stateVars);
1178   op << ") {\n";
1179   // actual code here 
1180   op << "    int __first = (" << con2->text->charstar() <<
1181         "), __last = (" << con3->text->charstar() << 
1182         "), __stride = (" << con4->text->charstar() << ");\n";
1183   op << "    if (__first > __last) {\n";
1184   op << "      int __tmp=__first; __first=__last; __last=__tmp;\n";
1185   op << "      __stride = -__stride;\n";
1186   op << "    }\n";
1187   op << "    CCounter *" << counter->charstar() << 
1188         " = new CCounter(__first,__last,__stride);\n"; 
1189   op << "    for(int " << con1->text->charstar() << 
1190         "=__first;" << con1->text->charstar() <<
1191         "<=__last;" << con1->text->charstar() << "+=__stride) {\n";
1192   op << "      " << constructs->front()->label->charstar() <<
1193         "(";
1194   generateCall(op, *stateVarsChildren);
1195   op << ");\n";
1196   op << "    }\n";
1197   // end actual code
1198   op << "  }\n\n";
1199   // inlined end function
1200   op << "  void " << label->charstar() << "_end(";
1201   generatePrototype(op, *stateVarsChildren);
1202   op << ") {\n";
1203   // actual code here 
1204   op << "    " << counter->charstar() << "->decrement(); /* DECREMENT 1 */ \n";
1205   op << "    if (" << counter->charstar() << "->isDone()) {\n";
1206   op << "      delete " << counter->charstar() << ";\n";
1207   if(nextBeginOrEnd == 1)
1208    op << "      " << next->label->charstar() << "(";
1209   else
1210    op << "      " << next->label->charstar() << "_end(";
1211   generateCall(op, *stateVars);
1212   op << ");\n";
1213   // end actual code
1214   op << "    }\n  }\n\n";
1215 }
1216
1217 void SdagConstruct::generateOlist(XStr& op)
1218 {
1219   SdagConstruct *cn;
1220   // inlined start function
1221   op << "  void " << label->charstar() << "(";
1222   generatePrototype(op, *stateVars);
1223   op << ") {\n";
1224   // actual code here 
1225   op << "    CCounter *" << counter->charstar() << "= new CCounter(" <<
1226         constructs->length() << ");\n";
1227   for(cn=constructs->begin(); 
1228                      !constructs->end(); cn=constructs->next()) {
1229     op << "    " << cn->label->charstar() << "(";
1230     generateCall(op, *stateVarsChildren);
1231     op << ");\n";
1232   }
1233   // end actual code
1234   op << "  }\n";
1235
1236   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
1237   strcat(nameStr,"_end");
1238 #if CMK_BLUEGENE_CHARM
1239   op << "  CkVec<void*> " <<label->charstar() << "_bgLogList;\n";
1240 #endif
1241
1242   // inlined end function
1243   op << "  void " << label->charstar() << "_end(";
1244   generatePrototype(op, *stateVarsChildren);
1245   op << ") {\n";
1246 #if CMK_BLUEGENE_CHARM
1247   generateBeginTime(op);
1248   op << "    " <<label->charstar() << "_bgLogList.insertAtEnd(_bgParentLog);\n";
1249 #endif
1250   // actual code here 
1251   //Accumulate all the bgParent pointers that the calling when_end functions give
1252   op << "    " << counter->charstar() << "->decrement();\n";
1253  
1254 #ifdef USE_CRITICAL_PATH_HEADER_ARRAY
1255  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";
1256 #endif
1257
1258   op << "    if (" << counter->charstar() << "->isDone()) {\n";
1259
1260 #ifdef USE_CRITICAL_PATH_HEADER_ARRAY
1261   op << "      currentlyExecutingPath = olist_" << counter->charstar() << "_PathMergePoint; /* Critical Path Detection */ \n";
1262   op << "      olist_" << counter->charstar() << "_PathMergePoint.reset(); /* Critical Path Detection */ \n";
1263 #endif
1264
1265   op << "      delete " << counter->charstar() << ";\n";
1266
1267 #if CMK_BLUEGENE_CHARM
1268   generateListEventBracket(op,SOLIST_END);
1269   op << "       "<< label->charstar() <<"_bgLogList.length()=0;\n";
1270 #endif
1271
1272   if(nextBeginOrEnd == 1)
1273    op << "      " << next->label->charstar() << "(";
1274   else
1275    op << "      " << next->label->charstar() << "_end(";
1276   generateCall(op, *stateVars);
1277   op << ");\n";
1278   // end actual code
1279   op << "    }\n";
1280   op << "  }\n";
1281 }
1282
1283 void SdagConstruct::generateOverlap(XStr& op)
1284 {
1285   // inlined start function
1286   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
1287   op << "  void " << label->charstar() << "(";
1288   generatePrototype(op, *stateVars);
1289   op << ") {\n";
1290 #if CMK_BLUEGENE_CHARM
1291   generateBeginTime(op);
1292   generateEventBracket(op,SOVERLAP);
1293 #endif
1294   // actual code here 
1295   op << "    " << constructs->front()->label->charstar() <<
1296         "(";
1297   generateCall(op, *stateVarsChildren);
1298   op << ");\n";
1299   // end actual code
1300   op << "  }\n";
1301   // trace
1302   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
1303   strcat(nameStr,"_end");
1304   // inlined end function
1305   op << "  void " << label->charstar() << "_end(";
1306   generatePrototype(op, *stateVarsChildren);
1307   op << ") {\n";
1308 #if CMK_BLUEGENE_CHARM
1309   generateBeginTime(op);
1310   generateEventBracket(op,SOVERLAP_END);
1311 #endif
1312   // actual code here 
1313   if(nextBeginOrEnd == 1)
1314    op << "    " << next->label->charstar() << "(";
1315   else
1316    op << "    " << next->label->charstar() << "_end(";
1317   generateCall(op, *stateVars);
1318   op << ");\n";
1319   // end actual code
1320   op << "  }\n";
1321 }
1322
1323 void SdagConstruct::generateSlist(XStr& op)
1324 {
1325   // inlined start function
1326   op << "  void " << label->charstar() << "(";
1327   generatePrototype(op, *stateVars);
1328   op << ") {\n";
1329   // actual code here 
1330   op << "    " << constructs->front()->label->charstar() <<
1331         "(";
1332   generateCall(op, *stateVarsChildren);
1333   op << ");\n";
1334   // end actual code
1335   op << "  }\n";
1336   // inlined end function
1337   op << "  void " << label->charstar() << "_end(";
1338   generatePrototype(op, *stateVarsChildren); 
1339   op << ") {\n";
1340   // actual code here 
1341   if(nextBeginOrEnd == 1)
1342    op << "    " << next->label->charstar() << "(";
1343   else
1344    op << "    " << next->label->charstar() << "_end(";
1345   generateCall(op, *stateVars);
1346   op << ");\n";
1347   // end actual code
1348   op << "  }\n";
1349 }
1350
1351 void SdagConstruct::generateSdagEntry(XStr& op)
1352 {
1353   // header file
1354   op << "public:\n";
1355   op << "  void " << con1->text->charstar() << "(";
1356   generatePrototype(op, *stateVars);
1357   op << ") {\n";
1358   SdagConstruct *sc;
1359   SdagConstruct *sc1;
1360   for(sc =publishesList->begin(); !publishesList->end(); sc=publishesList->next()) {
1361      for(sc1=sc->constructs->begin(); !sc->constructs->end(); sc1 = sc->constructs->next())
1362         op << "    _connect_" << sc1->text->charstar() <<"();\n";
1363   }
1364 #if CMK_BLUEGENE_CHARM
1365   generateEndSeq(op);
1366 #endif
1367   // actual code here 
1368   op << "    " << constructs->front()->label->charstar() <<
1369         "(";
1370   generateCall(op, *stateVarsChildren);
1371   op << ");\n";
1372 #if CMK_BLUEGENE_CHARM
1373   generateTlineEndCall(op);
1374   generateBeginExec(op, "spaceholder");
1375 #endif
1376   generateDummyBeginExecute(op);
1377   // end actual code
1378   op << "  }\n\n";
1379   op << "private:\n";
1380   op << "  void " << con1->text->charstar() << "_end(";
1381 #if CMK_BLUEGENE_CHARM
1382   generatePrototype(op, *stateVarsChildren);
1383 #else
1384   generatePrototype(op, *stateVars);
1385 #endif
1386   op << ") {\n";
1387   op << "  }\n\n";
1388 }
1389
1390 void SdagConstruct::generateAtomic(XStr& op)
1391
1392   sprintf(nameStr,"%s%s", CParsedFile::className->charstar(),label->charstar());
1393   op << "  void " << label->charstar() << "(";
1394   generatePrototype(op, *stateVars);
1395   op << ") {\n";
1396 #if CMK_BLUEGENE_CHARM
1397   generateBeginExec(op, nameStr);
1398 #endif
1399   generateTraceBeginCall(op);
1400   op << "    " << text->charstar() << "\n";
1401   // trace
1402   generateTraceEndCall(op);
1403 #if CMK_BLUEGENE_CHARM
1404   generateEndExec(op);
1405 #endif
1406   if(nextBeginOrEnd == 1)
1407     op << "    " << next->label->charstar() << "(";
1408   else
1409     op << "    " << next->label->charstar() << "_end(";
1410   generateCall(op, *stateVars);
1411   op << ");\n";
1412   op << "  }\n\n";
1413 }
1414
1415 void SdagConstruct::generatePrototype(XStr& op, ParamList *list)
1416 {
1417    ParamList *pl = list;
1418    int count = 0;
1419    int i, numStars;
1420    if (pl->isVoid() == 1) {
1421      op << "void"; 
1422    }
1423    else if (pl->isMessage() == 1){
1424      op << pl->getBaseName() <<" *" <<pl->getGivenName() ;
1425    }
1426    else {
1427      while(pl != NULL) {
1428        if (count > 0)
1429           op <<", ";
1430        if (pl->isPointer() == 1) {
1431          op <<pl->getBaseName(); 
1432          numStars = pl->getNumStars();
1433          for(i=0; i< numStars; i++)
1434            op <<"*";
1435          op <<" "<<pl->getGivenName();
1436        }
1437        else if (pl->isReference() == 1) 
1438          op <<pl->getBaseName() <<"& " <<pl->getGivenName();
1439        else if (pl->isArray() == 1) 
1440          op <<pl->getBaseName() <<"* " <<pl->getGivenName();
1441        else if ((pl->isBuiltin() == 1) || (pl->isNamed() == 1))
1442          op <<pl->getBaseName() <<" " <<pl->getGivenName();
1443        pl = pl->next;
1444        count++;
1445      }
1446    }
1447 }
1448
1449
1450 void SdagConstruct::generatePrototype(XStr& op, TList<CStateVar*>& list)
1451 {
1452   CStateVar *sv;
1453   int isVoid;
1454   int count;
1455   count = 0;
1456   for(sv=list.begin(); !list.end(); ) {
1457     isVoid = sv->isVoid;
1458     if ((count != 0) && (isVoid != 1))
1459        op << ", ";
1460     if (sv->isVoid != 1) {
1461       if (sv->type != 0) 
1462          op <<sv->type->charstar() <<" ";
1463       if (sv->byRef != 0)
1464          op <<" &";
1465       if (sv->arrayLength != NULL) 
1466          op <<"*";
1467       else if (sv->numPtrs != 0) {
1468         for (int i=0; i<sv->numPtrs; i++) 
1469           op <<"*";
1470          op <<" ";
1471       }
1472       if (sv->name != 0)
1473          op <<sv->name->charstar();
1474     }
1475     if (sv->isVoid != 1)
1476        count++;
1477     sv = list.next();
1478   }
1479 }
1480
1481 void SdagConstruct::generateCall(XStr& op, TList<CStateVar*>& list) {
1482   CStateVar *sv;
1483   int isVoid;
1484   int count;
1485   count = 0;
1486   for(sv=list.begin(); !list.end(); ) {
1487      isVoid = sv->isVoid;
1488      if ((count != 0) && (isVoid != 1))
1489         op << ", ";
1490      if (sv->name != 0) 
1491        op << sv->name->charstar();
1492     if (sv->isVoid != 1)
1493        count++;
1494     sv = list.next();
1495   }
1496 }
1497
1498 // boe = 1, if the next call is to begin construct
1499 // boe = 0, if the next call is to end a contruct
1500 void SdagConstruct::setNext(SdagConstruct *n, int boe)
1501 {
1502   switch(type) {
1503     case SSLIST:
1504       next = n;
1505       nextBeginOrEnd = boe;
1506       {
1507         SdagConstruct *notConnectNode = this;
1508         SdagConstruct *cn=constructs->begin();
1509         if (cn==0) // empty slist
1510           return;
1511         else if (cn->type != SCONNECT)
1512           notConnectNode = cn;
1513         int flag = 1;
1514         SdagConstruct *nextNode=constructs->next();
1515         for(; nextNode != 0;) {
1516           if (nextNode->type != SCONNECT)
1517             notConnectNode = nextNode;
1518           flag = 1;
1519           while ((flag == 1) && (nextNode->type == SCONNECT)) {
1520             nextNode = constructs->next();
1521             if (nextNode == 0)
1522               flag = 0;
1523           }
1524           if (nextNode != 0) {
1525             cn->setNext(nextNode, 1);
1526             cn = nextNode;
1527             nextNode = constructs->next();
1528           }
1529         }
1530         cn->setNext(this, 0);
1531       }
1532       return;
1533     case SSDAGENTRY:
1534     case SOVERLAP:
1535     case SOLIST:
1536     case SFORALL:
1537     case SWHEN:
1538     case SFOR:
1539     case SWHILE:
1540     case SATOMIC:
1541     case SFORWARD:
1542     case SELSE:
1543       next = n;
1544       nextBeginOrEnd = boe;
1545       n = this; boe = 0; break;
1546     case SIF:
1547       next = n;
1548       nextBeginOrEnd = boe;
1549       if(con2 != 0)
1550         con2->setNext(n, boe);
1551       n = this;
1552       boe = 0;
1553       break;
1554     default:
1555       break;
1556   }
1557   SdagConstruct *cn;
1558   if (constructs != 0) {
1559     for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
1560       cn->setNext(n, boe);
1561     }
1562   }
1563 }
1564
1565
1566 // for trace
1567
1568 void SdagConstruct::generateTrace()
1569 {
1570   char text[1024];
1571   switch(type) {
1572   case SATOMIC:
1573     if (traceName) {
1574       sprintf(text, "%s_%s", CParsedFile::className->charstar(), traceName->charstar());
1575       // remove blanks
1576       for (unsigned int i=0; i<strlen(text); i++)
1577         if (text[i]==' '||text[i]=='\t') text[i]='_';
1578     }
1579     else {
1580       sprintf(text, "%s%s", CParsedFile::className->charstar(), label->charstar());
1581     }
1582     traceName = new XStr(text);
1583     break;
1584   default:
1585     break;
1586   }
1587
1588   SdagConstruct *cn;
1589   for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
1590     cn->generateTrace();
1591   }
1592   if (con1) con1->generateTrace();
1593   if (con2) con2->generateTrace();
1594   if (con3) con3->generateTrace();
1595 }
1596
1597 void SdagConstruct::generateTraceBeginCall(XStr& op)          // for trace
1598 {
1599   if(traceName)
1600     op << "    " << "_TRACE_BEGIN_EXECUTE_DETAILED(-1, -1, " << "__idx_" << traceName->charstar() << ", CkMyPe(), 0, NULL); \n";
1601 }
1602
1603 void SdagConstruct::generateDummyBeginExecute(XStr& op)
1604 {
1605     op << "    " << "_TRACE_BEGIN_EXECUTE_DETAILED(-1, -1, _dummyEP, CkMyPe(), 0, NULL); \n";
1606 }
1607
1608 void SdagConstruct::generateTraceEndCall(XStr& op)          // for trace
1609 {
1610   op << "    " << "_TRACE_END_EXECUTE(); \n";
1611 }
1612
1613 void SdagConstruct::generateBeginExec(XStr& op, const char *name){
1614   op << "     " << "_TRACE_BG_BEGIN_EXECUTE_NOMSG(\""<<name<<"\",&_bgParentLog,1);\n"; 
1615 }
1616
1617 void SdagConstruct::generateEndExec(XStr& op){
1618   op << "     " << "_TRACE_BG_END_EXECUTE(0);\n";
1619 }
1620
1621 void SdagConstruct::generateBeginTime(XStr& op)
1622 {
1623   //Record begin time for tracing
1624   op << "    double __begintime = CkVTimer(); \n";
1625 }
1626
1627 void SdagConstruct::generateTlineEndCall(XStr& op)
1628 {
1629   //Trace this event
1630   op <<"    _TRACE_BG_TLINE_END(&_bgParentLog);\n";
1631 }
1632
1633 void SdagConstruct::generateEndSeq(XStr& op)
1634 {
1635   op <<  "    void* _bgParentLog = NULL;\n";
1636   op <<  "    CkElapse(0.01e-6);\n";
1637   //op<<  "    BgElapse(1e-6);\n";
1638   generateTlineEndCall(op);
1639   generateTraceEndCall(op);
1640   generateEndExec(op);
1641 }
1642
1643 void SdagConstruct::generateEventBracket(XStr& op, int eventType)
1644 {
1645   (void) eventType;
1646   //Trace this event
1647   op << "     _TRACE_BG_USER_EVENT_BRACKET(\"" << nameStr
1648      << "\", __begintime, CkVTimer(),&_bgParentLog); \n";
1649 }
1650
1651 void SdagConstruct::generateListEventBracket(XStr& op, int eventType)
1652 {
1653   (void) eventType;
1654   op << "    _TRACE_BGLIST_USER_EVENT_BRACKET(\"" << nameStr
1655      << "\",__begintime,CkVTimer(),&_bgParentLog, " << label->charstar()
1656      << "_bgLogList);\n";
1657 }
1658
1659 void SdagConstruct::generateRegisterEp(XStr& op)          // for trace
1660 {
1661   if (traceName) {
1662     op << "    __idx_" << traceName->charstar()
1663        << " = CkRegisterEp(\"" << traceName->charstar()
1664        << "(void)\", NULL, 0, CkIndex_" << CParsedFile::className->charstar()
1665        << "::__idx, 0);\n";
1666   }
1667
1668   SdagConstruct *cn;
1669   for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
1670     cn->generateRegisterEp(op);
1671   }
1672   if (con1) con1->generateRegisterEp(op);
1673   if (con2) con2->generateRegisterEp(op);
1674   if (con3) con3->generateRegisterEp(op);
1675 }
1676
1677 void SdagConstruct::generateTraceEpDecl(XStr& op)          // for trace
1678 {
1679   if (traceName) {
1680     op << "  static int __idx_" << traceName->charstar() << ";\n"; 
1681   }
1682   SdagConstruct *cn;
1683   for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
1684     cn->generateTraceEpDecl(op);
1685   }
1686   if (con1) con1->generateTraceEpDecl(op);
1687   if (con2) con2->generateTraceEpDecl(op);
1688   if (con3) con3->generateTraceEpDecl(op);
1689 }
1690
1691
1692 void SdagConstruct::generateTraceEpDef(XStr& op)          // for trace
1693 {
1694   if (traceName) {
1695     op << "  int " << CParsedFile::className->charstar()
1696        << "::__idx_" << traceName->charstar() << "=0;\\\n";
1697   }
1698   SdagConstruct *cn;
1699   for(cn=constructs->begin(); !constructs->end(); cn=constructs->next()) {
1700     cn->generateTraceEpDef(op);
1701   }
1702   if (con1) con1->generateTraceEpDef(op);
1703   if (con2) con2->generateTraceEpDef(op);
1704   if (con3) con3->generateTraceEpDef(op);
1705 }
1706
1707
1708 void RemoveSdagComments(char *str)
1709 {
1710   char *ptr = str;
1711   while ((ptr = strstr(ptr, "//"))) {
1712     char *lend = strstr(ptr, "\n");
1713     if (lend==NULL) break;
1714     while (ptr != lend) *ptr++=' ';
1715   }
1716 }
1717
1718 }