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