From b3186c9a1fb0d3b987b8c05f668f92f6bc1f7308 Mon Sep 17 00:00:00 2001 From: Abdul Zreika Date: Fri, 16 Oct 2020 14:47:02 +1100 Subject: [PATCH] Started making parts of the translator clearer. Plus using relDetail. --- src/ast2ram/AstToRamTranslator.cpp | 30 +++++++++++++----------- src/ast2ram/AstToRamTranslator.h | 4 ++++ src/include/souffle/utility/StringUtil.h | 7 ++++++ 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/ast2ram/AstToRamTranslator.cpp b/src/ast2ram/AstToRamTranslator.cpp index f959c57e7d6..79df42143ba 100644 --- a/src/ast2ram/AstToRamTranslator.cpp +++ b/src/ast2ram/AstToRamTranslator.cpp @@ -46,6 +46,7 @@ #include "ast/analysis/Functor.h" #include "ast/analysis/IOType.h" #include "ast/analysis/RecursiveClauses.h" +#include "ast/analysis/RelationDetailCache.h" #include "ast/analysis/RelationSchedule.h" #include "ast/analysis/SCCGraph.h" #include "ast/analysis/TopologicallySortedSCCGraph.h" @@ -108,6 +109,7 @@ #include "souffle/TypeAttribute.h" #include "souffle/utility/FunctionalUtil.h" #include "souffle/utility/MiscUtil.h" +#include "souffle/utility/StringUtil.h" #include #include #include @@ -136,19 +138,18 @@ Own AstToRamTranslator::makeRamTupleElement(const Location& l } size_t AstToRamTranslator::getEvaluationArity(const ast::Atom* atom) const { - if (atom->getQualifiedName().toString().find("@delta_") == 0) { - const ast::QualifiedName& originalRel = - ast::QualifiedName(atom->getQualifiedName().toString().substr(7)); - return auxArityAnalysis->getArity(getRelation(*program, originalRel)); - } else if (atom->getQualifiedName().toString().find("@new_") == 0) { - const ast::QualifiedName& originalRel = - ast::QualifiedName(atom->getQualifiedName().toString().substr(5)); - return auxArityAnalysis->getArity(getRelation(*program, originalRel)); - } else if (atom->getQualifiedName().toString().find("@info_") == 0) { - return 0; - } else { - return auxArityAnalysis->getArity(atom); + std::string relName = atom->getQualifiedName().toString(); + if (isPrefix("@info_", relName)) return 0; + + // Get the original relation name + if (isPrefix("@delta_", relName)) { + relName = stripPrefix("@delta_", relName); + } else if (isPrefix("@new_", relName)) { + relName = stripPrefix("@new_", relName); } + + const auto* originalRelation = relDetail->getRelation(ast::QualifiedName(relName)); + return auxArityAnalysis->getArity(originalRelation); } std::vector> AstToRamTranslator::getInputDirectives( @@ -433,7 +434,7 @@ Own AstToRamTranslator::translateNonRecursiveRelation( std::string relName = translateRelation(&rel); /* iterate over all clauses that belong to the relation */ - for (ast::Clause* clause : getClauses(*program, rel)) { + for (ast::Clause* clause : relDetail->getClauses(rel.getQualifiedName())) { // skip recursive rules if (recursiveClauses->recursive(clause)) { continue; @@ -596,7 +597,7 @@ Own AstToRamTranslator::translateRecursiveRelation(const std::se VecOwn loopRelSeq; /* Find clauses for relation rel */ - for (const auto& cl : getClauses(*program, *rel)) { + for (const auto& cl : relDetail->getClauses(rel->getQualifiedName())) { // skip non-recursive clauses if (!recursiveClauses->recursive(cl)) { continue; @@ -1024,6 +1025,7 @@ void AstToRamTranslator::translateProgram(const ast::TranslationUnit& translatio translationUnit.getAnalysis()->schedule(); auxArityAnalysis = translationUnit.getAnalysis(); functorAnalysis = translationUnit.getAnalysis(); + relDetail = translationUnit.getAnalysis(); // determine the sips to use std::string sipsChosen = "all-bound"; diff --git a/src/ast2ram/AstToRamTranslator.h b/src/ast2ram/AstToRamTranslator.h index 947ea2536ba..8eb1ebc06de 100644 --- a/src/ast2ram/AstToRamTranslator.h +++ b/src/ast2ram/AstToRamTranslator.h @@ -47,6 +47,7 @@ class IOTypeAnalysis; class AuxiliaryArityAnalysis; class FunctorAnalysis; class RecursiveClausesAnalysis; +class RelationDetailCacheAnalysis; class TypeEnvironment; } // namespace souffle::ast::analysis @@ -130,6 +131,9 @@ class AstToRamTranslator { /** Auxiliary Arity Analysis */ const ast::analysis::AuxiliaryArityAnalysis* auxArityAnalysis = nullptr; + /** Relation detail cache analysis */ + const ast::analysis::RelationDetailCacheAnalysis* relDetail = nullptr; + /** SIPS metric for reordering */ Own sips; diff --git a/src/include/souffle/utility/StringUtil.h b/src/include/souffle/utility/StringUtil.h index aaee82a1af5..b59a7889f86 100644 --- a/src/include/souffle/utility/StringUtil.h +++ b/src/include/souffle/utility/StringUtil.h @@ -322,6 +322,13 @@ inline std::vector splitString(const std::string& str, char delimit return parts; } +/** + * Strips the prefix of a given string if it exists. No change otherwise. + */ +inline std::string stripPrefix(const std::string& prefix, const std::string& element) { + return isPrefix(prefix, element) ? element.substr(prefix.length()) : element; +} + /** * Stringify a string using escapes for escape, newline, tab, double-quotes and semicolons */