Skip to content

Commit

Permalink
Standardised scc code-gen.
Browse files Browse the repository at this point in the history
  • Loading branch information
azreika committed Nov 18, 2020
1 parent 7b597c3 commit 12ef158
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 11 deletions.
23 changes: 13 additions & 10 deletions src/ast2ram/AstToRamTranslator.cpp
Expand Up @@ -251,8 +251,8 @@ Own<ram::Statement> AstToRamTranslator::generateNonRecursiveRelation(const ast::
return mk<ram::Sequence>(std::move(result));
}

Own<ram::Statement> AstToRamTranslator::generateStratum(size_t scc, size_t idx) const {
// make a new ram statement for the current SCC
Own<ram::Statement> AstToRamTranslator::generateStratum(size_t scc) const {
// Make a new ram statement for the current SCC
VecOwn<ram::Statement> current;

// load all internal input relations from the facts dir with a .facts extension
Expand All @@ -261,7 +261,7 @@ Own<ram::Statement> AstToRamTranslator::generateStratum(size_t scc, size_t idx)
appendStmt(current, generateLoadRelation(relation));
}

// compute the current stratum
// Compute the current stratum
const auto& isRecursive = sccGraph->isRecursive(scc);
const auto& sccRelations = sccGraph->getInternalRelations(scc);
if (isRecursive) {
Expand All @@ -272,16 +272,12 @@ Own<ram::Statement> AstToRamTranslator::generateStratum(size_t scc, size_t idx)
appendStmt(current, generateNonRecursiveRelation(*relation));
}

// store all internal output relations to the output dir with a .csv extension
// Store all internal output relations to the output dir with a .csv extension
const auto& sccOutputRelations = sccGraph->getInternalOutputRelations(scc);
for (const auto& relation : sccOutputRelations) {
appendStmt(current, generateStoreRelation(relation));
}

// clear expired relations
const auto& expiredRelations = relationSchedule->schedule().at(idx).expired();
appendStmt(current, generateClearExpiredRelations(expiredRelations));

return mk<ram::Sequence>(std::move(current));
}

Expand Down Expand Up @@ -749,9 +745,16 @@ Own<ram::Sequence> AstToRamTranslator::translateProgram(const ast::TranslationUn

// Create subroutines for each SCC according to topological order
for (size_t i = 0; i < sccOrdering.size(); i++) {
auto sccCode = generateStratum(sccOrdering.at(i), i);
// Generate the main stratum code
auto stratum = generateStratum(sccOrdering.at(i));

// Clear expired relations
const auto& expiredRelations = relationSchedule->schedule().at(i).expired();
stratum = mk<ram::Sequence>(std::move(stratum), generateClearExpiredRelations(expiredRelations));

// Add the subroutine
std::string stratumID = "stratum_" + toString(i);
addRamSubroutine(stratumID, std::move(sccCode));
addRamSubroutine(stratumID, std::move(stratum));
}

// Invoke all strata
Expand Down
2 changes: 1 addition & 1 deletion src/ast2ram/AstToRamTranslator.h
Expand Up @@ -115,7 +115,6 @@ class AstToRamTranslator {
void addRamRelation(std::string relationName, Own<ram::Relation> ramRelation);

// clean up
Own<ram::Statement> generateStratum(size_t scc, size_t idx) const;
virtual Own<ast::Clause> createDeltaClause(const ast::Clause* original, size_t recursiveAtomIdx) const;
RamDomain getConstantRamRepresentation(const ast::Constant& constant) const;
Own<ram::Statement> translateRecursiveClauses(
Expand All @@ -132,6 +131,7 @@ class AstToRamTranslator {
Own<ram::Statement> generateLoadRelation(const ast::Relation* relation) const;

/** Low-level stratum translation */
Own<ram::Statement> generateStratum(size_t scc) const;
Own<ram::Statement> generateStratumPreamble(const std::set<const ast::Relation*>& scc) const;
Own<ram::Statement> generateStratumPostamble(const std::set<const ast::Relation*>& scc) const;
Own<ram::Statement> generateStratumLoopBody(const std::set<const ast::Relation*>& scc) const;
Expand Down

0 comments on commit 12ef158

Please sign in to comment.