bool MpsAssign::Parallelize(const MpsTerm &receives, MpsTerm* &seqTerm, MpsTerm* &parTerm) const // {{{ { // Find used vars set<string> usedVars = myExp->FV(); usedVars.insert(myId); // Split receives using the used vars MpsTerm *pre; MpsTerm *post; receives.Split(usedVars,pre,post); bool opt1=dynamic_cast<const MpsEnd*>(post)==NULL; // Parallelize succ with post receives MpsTerm *seqSucc; MpsTerm *parSucc; bool opt2=mySucc->Parallelize(*post,seqSucc,parSucc); delete post; // Make parallelized term MpsTerm *parTmp = new MpsAssign(myId, *myExp, *myType, *parSucc); delete parSucc; parTerm = pre->Append(*parTmp); delete pre; delete parTmp; // Make sequential term seqTerm = new MpsAssign(myId, *myExp, *myType, *seqSucc); delete seqSucc; return opt1 || opt2; } // }}}
bool MpsGuiValue::Parallelize(const MpsTerm &receivers, MpsTerm* &seqTerm, MpsTerm* &parTerm) const // {{{ { // Find used vars set<string> usedVars = myValue->FV(); set<string> fv = myName->FV(); usedVars.insert(fv.begin(),fv.end()); usedVars.insert(mySession); // Split receives using the used vars MpsTerm *pre; MpsTerm *post; receivers.Split(usedVars,pre,post); bool opt1=dynamic_cast<const MpsEnd*>(post)==NULL; // Parallelize succ with post receives MpsTerm *seqSucc; MpsTerm *parSucc; bool opt2=mySucc->Parallelize(*post,seqSucc,parSucc); delete post; // Make parallelized term MpsTerm *parTmp = new MpsGuiValue(myMaxpid, mySession, myPid, *myName, *myValue, *parSucc); delete parSucc; parTerm = pre->Append(*parTmp); delete pre; delete parTmp; // Make sequential term seqTerm = new MpsGuiValue(myMaxpid, mySession, myPid, *myName, *myValue, *seqSucc); delete seqSucc; return opt1 || opt2; } // }}}
string MpsAssign::ToC() const // {{{ { stringstream result; result << myType->ToC() << " " << ToC_Name(myId) << ";" << endl; string varName = myExp->ToC(result,GetExpType().ToC()); MpsTerm *tmpSucc = mySucc->ERename(myId,varName); result << tmpSucc->ToC(); delete tmpSucc; return result.str(); } // }}}
MpsAssign::MpsAssign(const string &id, const MpsExp &exp, const MpsMsgType &type, const MpsTerm &succ) // {{{ { myId = id; myExp = exp.Copy(); myType = type.Copy(); mySucc = succ.Copy(); } // }}}
bool MpsCond::Parallelize(const MpsTerm &receives, MpsTerm* &seqTerm, MpsTerm* &parTerm) const // {{{ { MpsTerm *seqTrueBranch = myTrueBranch->Parallelize(); MpsTerm *seqFalseBranch = myFalseBranch->Parallelize(); seqTerm=new MpsCond(*myCond, *seqTrueBranch, *seqFalseBranch); parTerm=receives.Append(*seqTerm); return false; // All optimizations are guarded } // }}}
MpsGuiValue::MpsGuiValue(int maxpid, const std::string &session, int pid, const MpsExp &name, const MpsExp &value, const MpsTerm &succ) // {{{ : mySession(session), myMaxpid(maxpid), myPid(pid) { mySucc = succ.Copy(); myValue = value.Copy(); myName = name.Copy(); } // }}}
MpsCond::MpsCond(const MpsExp &cond, const MpsTerm &truebranch, const MpsTerm &falsebranch) // {{{ { myCond = cond.Copy(); myTrueBranch = truebranch.Copy(); myFalseBranch = falsebranch.Copy(); } // }}}