From 12ef1583114dfdc99cd39e1266c4d0ad286882d0 Mon Sep 17 00:00:00 2001 From: Abdul Zreika Date: Wed, 18 Nov 2020 17:55:35 +1100 Subject: [PATCH] Standardised scc code-gen. --- src/ast2ram/AstToRamTranslator.cpp | 23 +++++++++++++---------- src/ast2ram/AstToRamTranslator.h | 2 +- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/ast2ram/AstToRamTranslator.cpp b/src/ast2ram/AstToRamTranslator.cpp index db7f9e49c8f..0f4f2eb1365 100644 --- a/src/ast2ram/AstToRamTranslator.cpp +++ b/src/ast2ram/AstToRamTranslator.cpp @@ -251,8 +251,8 @@ Own AstToRamTranslator::generateNonRecursiveRelation(const ast:: return mk(std::move(result)); } -Own AstToRamTranslator::generateStratum(size_t scc, size_t idx) const { - // make a new ram statement for the current SCC +Own AstToRamTranslator::generateStratum(size_t scc) const { + // Make a new ram statement for the current SCC VecOwn current; // load all internal input relations from the facts dir with a .facts extension @@ -261,7 +261,7 @@ Own 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) { @@ -272,16 +272,12 @@ Own 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(std::move(current)); } @@ -749,9 +745,16 @@ Own 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(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 diff --git a/src/ast2ram/AstToRamTranslator.h b/src/ast2ram/AstToRamTranslator.h index d324d4cffa2..66edcb12bdf 100644 --- a/src/ast2ram/AstToRamTranslator.h +++ b/src/ast2ram/AstToRamTranslator.h @@ -115,7 +115,6 @@ class AstToRamTranslator { void addRamRelation(std::string relationName, Own ramRelation); // clean up - Own generateStratum(size_t scc, size_t idx) const; virtual Own createDeltaClause(const ast::Clause* original, size_t recursiveAtomIdx) const; RamDomain getConstantRamRepresentation(const ast::Constant& constant) const; Own translateRecursiveClauses( @@ -132,6 +131,7 @@ class AstToRamTranslator { Own generateLoadRelation(const ast::Relation* relation) const; /** Low-level stratum translation */ + Own generateStratum(size_t scc) const; Own generateStratumPreamble(const std::set& scc) const; Own generateStratumPostamble(const std::set& scc) const; Own generateStratumLoopBody(const std::set& scc) const;