/** * Generate code for a group of mutually recursive definitions */ void DocCompiler::generateRec(Tree sig, Tree var, Tree le, int priority) { int N = len(le); vector<bool> used(N); vector<int> delay(N); vector<string> vname(N); vector<string> ctype(N); // prepare each element of a recursive definition for(int i = 0; i < N; i++) { Tree e = sigProj(i, sig); // recreate each recursive definition if(fOccMarkup.retrieve(e)) { // this projection is used used[i] = true; // cerr << "generateRec : used[" << i << "] = true" << endl; getTypedNames(getCertifiedSigType(e), "r", ctype[i], vname[i]); gDocNoticeFlagMap["recursigs"] = true; // cerr << "- r : generateRec setVectorNameProperty : \"" << vname[i] << "\"" << endl; setVectorNameProperty(e, vname[i]); delay[i] = fOccMarkup.retrieve(e)->getMaxDelay(); } else { // this projection is not used therefore // we should not generate code for it used[i] = false; // cerr << "generateRec : used[" << i << "] = false" << endl; } } // generate delayline for each element of a recursive definition for(int i = 0; i < N; i++) { if(used[i]) { generateDelayLine(ctype[i], vname[i], delay[i], CS(nth(le, i), priority)); } } }
//! Fabrique une liste de n mem projections d'un groupe récursif siglist makeMemSigProjList (Tree t, int n) { siglist l(n); for (int i = 0; i < n; i++) l[i] = sigDelay1(sigProj(i, t)); return l; }