diff --git a/src/ast2ram/AstToRamTranslator.cpp b/src/ast2ram/AstToRamTranslator.cpp index 9dea3e6be6f..cb824b06f56 100644 --- a/src/ast2ram/AstToRamTranslator.cpp +++ b/src/ast2ram/AstToRamTranslator.cpp @@ -735,22 +735,7 @@ const ram::Relation* AstToRamTranslator::lookupRelation(const std::string& name) return (*it).second.get(); } -/** translates the given datalog program into an equivalent RAM program */ -void AstToRamTranslator::translateProgram(const ast::TranslationUnit& translationUnit) { - // keep track of relevant analyses - ioType = translationUnit.getAnalysis(); - typeEnv = &translationUnit.getAnalysis()->getTypeEnvironment(); - const auto& sccOrder = *translationUnit.getAnalysis(); - relationSchedule = translationUnit.getAnalysis(); - sccGraph = translationUnit.getAnalysis(); - recursiveClauses = translationUnit.getAnalysis(); - auxArityAnalysis = translationUnit.getAnalysis(); - functorAnalysis = translationUnit.getAnalysis(); - relDetail = translationUnit.getAnalysis(); - polyAnalysis = translationUnit.getAnalysis(); - - // set up the final fixed types - // TODO (azreika): should be removed once the translator is refactored to avoid cloning +void AstToRamTranslator::finaliseAstTypes() { visitDepthFirst(*program, [&](const ast::NumericConstant& nc) { const_cast(nc).setFinalType(polyAnalysis->getInferredType(&nc)); }); @@ -767,6 +752,22 @@ void AstToRamTranslator::translateProgram(const ast::TranslationUnit& translatio visitDepthFirst(*program, [&](const ast::UserDefinedFunctor& udf) { const_cast(udf).setFinalReturnType(functorAnalysis->getReturnType(&udf)); }); +} + +void AstToRamTranslator::translateProgram(const ast::TranslationUnit& translationUnit) { + // keep track of relevant analyses + ioType = translationUnit.getAnalysis(); + typeEnv = &translationUnit.getAnalysis()->getTypeEnvironment(); + relationSchedule = translationUnit.getAnalysis(); + sccGraph = translationUnit.getAnalysis(); + recursiveClauses = translationUnit.getAnalysis(); + auxArityAnalysis = translationUnit.getAnalysis(); + functorAnalysis = translationUnit.getAnalysis(); + relDetail = translationUnit.getAnalysis(); + polyAnalysis = translationUnit.getAnalysis(); + + // finalise polymorphic types in the AST + finaliseAstTypes(); // determine the sips to use std::string sipsChosen = "all-bound"; @@ -781,23 +782,22 @@ void AstToRamTranslator::translateProgram(const ast::TranslationUnit& translatio // handle the case of an empty SCC graph if (sccGraph->getNumberOfSCCs() == 0) return; - // create all Ram relations in ramRelations - for (const auto& scc : sccOrder.order()) { + // create all RAM relations in ramRelations + const auto& sccOrdering = + translationUnit.getAnalysis()->order(); + for (const auto& scc : sccOrdering) { createRamRelation(scc); } - // iterate over each SCC according to the topological order - size_t indexOfScc = 0; - for (const auto& scc : sccOrder.order()) { - // create subroutine for this stratum - ramSubroutines["stratum_" + std::to_string(indexOfScc)] = translateSCC(scc, indexOfScc); - indexOfScc++; + // create subroutine for each SCC according to topological order + for (size_t i = 0; i < sccOrdering.size(); i++) { + ramSubroutines["stratum_" + toString(i)] = translateSCC(sccOrdering.at(i), i); } // invoke all strata VecOwn res; - for (size_t i = 0; i < indexOfScc; i++) { - appendStmt(res, mk("stratum_" + std::to_string(i))); + for (size_t i = 0; i < sccOrdering.size(); i++) { + appendStmt(res, mk("stratum_" + toString(i))); } // add main timer if profiling diff --git a/src/ast2ram/AstToRamTranslator.h b/src/ast2ram/AstToRamTranslator.h index 265663a7479..beb45e2863b 100644 --- a/src/ast2ram/AstToRamTranslator.h +++ b/src/ast2ram/AstToRamTranslator.h @@ -93,6 +93,7 @@ class AstToRamTranslator { Own translateValue(const ast::Argument* arg, const ValueIndex& index); Own translateConstraint(const ast::Literal* arg, const ValueIndex& index); Own translateConstant(const ast::Constant& c); + virtual void translateProgram(const ast::TranslationUnit& translationUnit); /** determine the auxiliary for relations */ size_t getEvaluationArity(const ast::Atom* atom) const; @@ -124,9 +125,6 @@ class AstToRamTranslator { const ast::analysis::RelationDetailCacheAnalysis* relDetail = nullptr; const ast::analysis::PolymorphicObjectsAnalysis* polyAnalysis = nullptr; - /** Translate AST to RAM Program */ - virtual void translateProgram(const ast::TranslationUnit& translationUnit); - void nameUnnamedVariables(ast::Clause* clause); void appendStmt(VecOwn& stmtList, Own stmt); Own translateSCC(size_t scc, size_t idx); @@ -167,6 +165,10 @@ class AstToRamTranslator { /** add a statement to load a relation */ void makeRamLoad(VecOwn& curStmts, const ast::Relation* relation); + + /** finalise the types of polymorphic objects */ + // TODO (azreika): should be removed once the translator is refactored to avoid cloning + void finaliseAstTypes(); }; } // namespace souffle::ast2ram