Skip to content

Commit

Permalink
Cleaned up program translator.
Browse files Browse the repository at this point in the history
  • Loading branch information
azreika committed Nov 13, 2020
1 parent 0005fc1 commit ebbeab5
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 29 deletions.
52 changes: 26 additions & 26 deletions src/ast2ram/AstToRamTranslator.cpp
Expand Up @@ -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<ast::analysis::IOTypeAnalysis>();
typeEnv = &translationUnit.getAnalysis<ast::analysis::TypeEnvironmentAnalysis>()->getTypeEnvironment();
const auto& sccOrder = *translationUnit.getAnalysis<ast::analysis::TopologicallySortedSCCGraphAnalysis>();
relationSchedule = translationUnit.getAnalysis<ast::analysis::RelationScheduleAnalysis>();
sccGraph = translationUnit.getAnalysis<ast::analysis::SCCGraphAnalysis>();
recursiveClauses = translationUnit.getAnalysis<ast::analysis::RecursiveClausesAnalysis>();
auxArityAnalysis = translationUnit.getAnalysis<ast::analysis::AuxiliaryArityAnalysis>();
functorAnalysis = translationUnit.getAnalysis<ast::analysis::FunctorAnalysis>();
relDetail = translationUnit.getAnalysis<ast::analysis::RelationDetailCacheAnalysis>();
polyAnalysis = translationUnit.getAnalysis<ast::analysis::PolymorphicObjectsAnalysis>();

// 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<ast::NumericConstant&>(nc).setFinalType(polyAnalysis->getInferredType(&nc));
});
Expand All @@ -767,6 +752,22 @@ void AstToRamTranslator::translateProgram(const ast::TranslationUnit& translatio
visitDepthFirst(*program, [&](const ast::UserDefinedFunctor& udf) {
const_cast<ast::UserDefinedFunctor&>(udf).setFinalReturnType(functorAnalysis->getReturnType(&udf));
});
}

void AstToRamTranslator::translateProgram(const ast::TranslationUnit& translationUnit) {
// keep track of relevant analyses
ioType = translationUnit.getAnalysis<ast::analysis::IOTypeAnalysis>();
typeEnv = &translationUnit.getAnalysis<ast::analysis::TypeEnvironmentAnalysis>()->getTypeEnvironment();
relationSchedule = translationUnit.getAnalysis<ast::analysis::RelationScheduleAnalysis>();
sccGraph = translationUnit.getAnalysis<ast::analysis::SCCGraphAnalysis>();
recursiveClauses = translationUnit.getAnalysis<ast::analysis::RecursiveClausesAnalysis>();
auxArityAnalysis = translationUnit.getAnalysis<ast::analysis::AuxiliaryArityAnalysis>();
functorAnalysis = translationUnit.getAnalysis<ast::analysis::FunctorAnalysis>();
relDetail = translationUnit.getAnalysis<ast::analysis::RelationDetailCacheAnalysis>();
polyAnalysis = translationUnit.getAnalysis<ast::analysis::PolymorphicObjectsAnalysis>();

// finalise polymorphic types in the AST
finaliseAstTypes();

// determine the sips to use
std::string sipsChosen = "all-bound";
Expand All @@ -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<ast::analysis::TopologicallySortedSCCGraphAnalysis>()->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<ram::Statement> res;
for (size_t i = 0; i < indexOfScc; i++) {
appendStmt(res, mk<ram::Call>("stratum_" + std::to_string(i)));
for (size_t i = 0; i < sccOrdering.size(); i++) {
appendStmt(res, mk<ram::Call>("stratum_" + toString(i)));
}

// add main timer if profiling
Expand Down
8 changes: 5 additions & 3 deletions src/ast2ram/AstToRamTranslator.h
Expand Up @@ -93,6 +93,7 @@ class AstToRamTranslator {
Own<ram::Expression> translateValue(const ast::Argument* arg, const ValueIndex& index);
Own<ram::Condition> translateConstraint(const ast::Literal* arg, const ValueIndex& index);
Own<ram::Expression> 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;
Expand Down Expand Up @@ -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<ram::Statement>& stmtList, Own<ram::Statement> stmt);
Own<ram::Sequence> translateSCC(size_t scc, size_t idx);
Expand Down Expand Up @@ -167,6 +165,10 @@ class AstToRamTranslator {

/** add a statement to load a relation */
void makeRamLoad(VecOwn<ram::Statement>& 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

0 comments on commit ebbeab5

Please sign in to comment.