Skip to content

Commit

Permalink
Modularised exit condition generation.
Browse files Browse the repository at this point in the history
  • Loading branch information
azreika committed Nov 17, 2020
1 parent 85a662a commit bf81dd7
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 22 deletions.
56 changes: 34 additions & 22 deletions src/ast2ram/AstToRamTranslator.cpp
Expand Up @@ -524,33 +524,46 @@ VecOwn<ram::Statement> AstToRamTranslator::generateStratumMainLoop(
return loopSeq;
}

/** generate RAM code for recursive relations in a strongly-connected component */
Own<ram::Statement> AstToRamTranslator::translateRecursiveRelation(
const std::set<const ast::Relation*>& scc) {
// -- Initialise all the individual sections --
auto preamble = generateStratumPreamble(scc);
auto loopSeq = generateStratumMainLoop(scc);
auto updateTable = generateStratumTableUpdates(scc);
auto postamble = generateStratumPostamble(scc);

// --- Combine the individual sections into the final fixpoint loop --
// Construct exit conditions for odd and even iteration
auto addCondition = [](Own<ram::Condition>& cond, Own<ram::Condition> clause) {
cond = ((cond) ? mk<ram::Conjunction>(std::move(cond), std::move(clause)) : std::move(clause));
VecOwn<ram::Statement> AstToRamTranslator::generateStratumExitConditions(
const std::set<const ast::Relation*>& scc) const {
// Helper function to add a new term to a conjunctive condition
auto addCondition = [&](Own<ram::Condition>& cond, Own<ram::Condition> term) {
cond = (cond == nullptr) ? std::move(term) : mk<ram::Conjunction>(std::move(cond), std::move(term));
};

Own<ram::Condition> exitCond;
VecOwn<ram::Statement> exitStmts;
VecOwn<ram::Statement> exitConditions;

// (1) if all relations in the scc are empty
Own<ram::Condition> emptinessCheck;
for (const ast::Relation* rel : scc) {
addCondition(emptinessCheck, mk<ram::EmptinessCheck>(getNewRelationName(rel)));
}
appendStmt(exitConditions, mk<ram::Exit>(std::move(emptinessCheck)));

// (2) if the size limit has been reached for any limitsize relations
for (const ast::Relation* rel : scc) {
addCondition(exitCond, mk<ram::EmptinessCheck>(getNewRelationName(rel)));
if (ioType->isLimitSize(rel)) {
Own<ram::Condition> limit = mk<ram::Constraint>(BinaryConstraintOp::GE,
mk<ram::RelationSize>(getConcreteRelationName(rel)),
mk<ram::SignedConstant>(ioType->getLimitSize(rel)));
appendStmt(exitStmts, mk<ram::Exit>(std::move(limit)));
appendStmt(exitConditions, mk<ram::Exit>(std::move(limit)));
}
}

return exitConditions;
}

/** generate RAM code for recursive relations in a strongly-connected component */
Own<ram::Statement> AstToRamTranslator::translateRecursiveRelation(
const std::set<const ast::Relation*>& scc) {
// -- Initialise all the individual sections --
auto preamble = generateStratumPreamble(scc);
auto loopSeq = generateStratumMainLoop(scc);
auto updateTable = generateStratumTableUpdates(scc);
auto exitConditions = generateStratumExitConditions(scc);
auto postamble = generateStratumPostamble(scc);

// --- Combine the individual sections into the final fixpoint loop --
VecOwn<ram::Statement> res;

// Add in the preamble
Expand All @@ -560,12 +573,11 @@ Own<ram::Statement> AstToRamTranslator::translateRecursiveRelation(

// Add in the main loop and update sections
auto loop = mk<ram::Parallel>(std::move(loopSeq));
if (!loop->getStatements().empty() && exitCond && !updateTable.empty()) {
auto ramExitCondition = mk<ram::Exit>(std::move(exitCond));
auto ramExitSequence = mk<ram::Sequence>(std::move(exitStmts));
if (!loop->getStatements().empty() && !exitConditions.empty() && !updateTable.empty()) {
auto ramExitSequence = mk<ram::Sequence>(std::move(exitConditions));
auto ramUpdateSequence = mk<ram::Sequence>(std::move(updateTable));
auto ramLoopSequence = mk<ram::Loop>(mk<ram::Sequence>(std::move(loop), std::move(ramExitCondition),
std::move(ramExitSequence), std::move(ramUpdateSequence)));
auto ramLoopSequence = mk<ram::Loop>(
mk<ram::Sequence>(std::move(loop), std::move(ramExitSequence), std::move(ramUpdateSequence)));
appendStmt(res, std::move(ramLoopSequence));
}

Expand Down
1 change: 1 addition & 0 deletions src/ast2ram/AstToRamTranslator.h
Expand Up @@ -166,6 +166,7 @@ class AstToRamTranslator {
VecOwn<ram::Statement> generateStratumPostamble(const std::set<const ast::Relation*>& scc) const;
VecOwn<ram::Statement> generateStratumTableUpdates(const std::set<const ast::Relation*>& scc) const;
VecOwn<ram::Statement> generateStratumMainLoop(const std::set<const ast::Relation*>& scc);
VecOwn<ram::Statement> generateStratumExitConditions(const std::set<const ast::Relation*>& scc) const;
};

} // namespace souffle::ast2ram

0 comments on commit bf81dd7

Please sign in to comment.