Beispiel #1
0
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;
} // }}}
Beispiel #2
0
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;
} // }}}
Beispiel #3
0
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();
} // }}}
Beispiel #4
0
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();
} // }}}
Beispiel #5
0
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
} // }}}
Beispiel #6
0
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();
} // }}}
Beispiel #7
0
MpsCond::MpsCond(const MpsExp &cond, const MpsTerm &truebranch, const MpsTerm &falsebranch) // {{{
{
  myCond = cond.Copy();
  myTrueBranch = truebranch.Copy();
  myFalseBranch = falsebranch.Copy();
} // }}}