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