diff options
author | Andrew Reynolds <andrew.j.reynolds@gmail.com> | 2021-09-14 15:43:47 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-14 20:43:47 +0000 |
commit | d34e563fe48c42aa06eea44191a21dcf29772339 (patch) | |
tree | 24d25263b80045c98fe0d65f251ea2f56b6d4cbe /src/printer | |
parent | 1014428633ca233aa0c51818d995acaca6ebfda6 (diff) |
Utilities in preparation for print benchmark utility (#7190)
This adds a few utilities in preparation for the print benchmark utility, which will replace our own dumping infrastructure.
Diffstat (limited to 'src/printer')
-rw-r--r-- | src/printer/printer.cpp | 52 | ||||
-rw-r--r-- | src/printer/printer.h | 8 |
2 files changed, 60 insertions, 0 deletions
diff --git a/src/printer/printer.cpp b/src/printer/printer.cpp index e038952c4..9bd68e697 100644 --- a/src/printer/printer.cpp +++ b/src/printer/printer.cpp @@ -204,6 +204,13 @@ void Printer::toStreamCmdDeclareFunction(std::ostream& out, printUnknownCommand(out, "declare-fun"); } +void Printer::toStreamCmdDeclareFunction(std::ostream& out, const Node& v) const +{ + std::stringstream vs; + vs << v; + toStreamCmdDeclareFunction(out, vs.str(), v.getType()); +} + void Printer::toStreamCmdDeclarePool(std::ostream& out, const std::string& id, TypeNode type, @@ -235,6 +242,25 @@ void Printer::toStreamCmdDefineFunction(std::ostream& out, printUnknownCommand(out, "define-fun"); } +void Printer::toStreamCmdDefineFunction(std::ostream& out, + Node v, + Node lambda) const +{ + std::stringstream vs; + vs << v; + std::vector<Node> formals; + Node body = lambda; + TypeNode rangeType = v.getType(); + if (body.getKind() == kind::LAMBDA) + { + formals.insert(formals.end(), lambda[0].begin(), lambda[0].end()); + body = lambda[1]; + Assert(rangeType.isFunction()); + rangeType = rangeType.getRangeType(); + } + toStreamCmdDefineFunction(out, vs.str(), formals, rangeType, body); +} + void Printer::toStreamCmdDefineFunctionRec( std::ostream& out, const std::vector<Node>& funcs, @@ -244,6 +270,32 @@ void Printer::toStreamCmdDefineFunctionRec( printUnknownCommand(out, "define-fun-rec"); } +void Printer::toStreamCmdDefineFunctionRec( + std::ostream& out, + const std::vector<Node>& funcs, + const std::vector<Node>& lambdas) const +{ + std::vector<std::vector<Node>> formals; + std::vector<Node> formulas; + for (const Node& l : lambdas) + { + std::vector<Node> formalsVec; + Node formula; + if (l.getKind() == kind::LAMBDA) + { + formalsVec.insert(formalsVec.end(), l[0].begin(), l[0].end()); + formula = l[1]; + } + else + { + formula = l; + } + formals.emplace_back(formalsVec); + formulas.emplace_back(formula); + } + toStreamCmdDefineFunctionRec(out, funcs, formals, formulas); +} + void Printer::toStreamCmdSetUserAttribute(std::ostream& out, const std::string& attr, Node n) const diff --git a/src/printer/printer.h b/src/printer/printer.h index 5e141fe8f..5ffe07f77 100644 --- a/src/printer/printer.h +++ b/src/printer/printer.h @@ -87,6 +87,8 @@ class Printer virtual void toStreamCmdDeclareFunction(std::ostream& out, const std::string& id, TypeNode type) const; + /** Variant of above for a pre-existing variable */ + void toStreamCmdDeclareFunction(std::ostream& out, const Node& v) const; /** Print declare-pool command */ virtual void toStreamCmdDeclarePool(std::ostream& out, const std::string& id, @@ -109,6 +111,8 @@ class Printer const std::vector<Node>& formals, TypeNode range, Node formula) const; + /** Variant of above that takes the definition */ + void toStreamCmdDefineFunction(std::ostream& out, Node v, Node lambda) const; /** Print define-fun-rec command */ virtual void toStreamCmdDefineFunctionRec( @@ -116,6 +120,10 @@ class Printer const std::vector<Node>& funcs, const std::vector<std::vector<Node>>& formals, const std::vector<Node>& formulas) const; + /** Variant of above that takes the definition */ + void toStreamCmdDefineFunctionRec(std::ostream& out, + const std::vector<Node>& funcs, + const std::vector<Node>& lambdas) const; /** Print set-user-attribute command */ void toStreamCmdSetUserAttribute(std::ostream& out, |