HAL
solver.h
Go to the documentation of this file.
1 // MIT License
2 //
3 // Copyright (c) 2019 Ruhr University Bochum, Chair for Embedded Security. All Rights reserved.
4 // Copyright (c) 2019 Marc Fyrbiak, Sebastian Wallat, Max Hoffmann ("ORIGINAL AUTHORS"). All rights reserved.
5 // Copyright (c) 2021 Max Planck Institute for Security and Privacy. All Rights reserved.
6 // Copyright (c) 2021 Jörn Langheinrich, Julian Speith, Nils Albartus, René Walendy, Simon Klix ("ORIGINAL AUTHORS"). All Rights reserved.
7 //
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to deal
10 // in the Software without restriction, including without limitation the rights
11 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 // copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
14 //
15 // The above copyright notice and this permission notice shall be included in all
16 // copies or substantial portions of the Software.
17 //
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 // SOFTWARE.
25 
26 #pragma once
27 
29 
30 namespace hal
31 {
32  namespace SMT
33  {
40  class Solver final
41  {
42  public:
44  // Constructors, Destructors, Operators
46 
52  Solver(const std::vector<Constraint>& constraints = {});
53 
55  // Interface
57 
63  const std::vector<Constraint>& get_constraints() const;
64 
71  Solver& with_constraint(const Constraint& constraint);
72 
79  Solver& with_constraints(const std::vector<Constraint>& constraints);
80 
89 
96  Result<SolverResult> query(const QueryConfig& config = QueryConfig()) const;
97 
104  Result<SolverResult> query_local(const QueryConfig& config) const;
105 
113  static Result<SolverResult> query_local_with_smt2(const QueryConfig& config, const std::string& smt2);
114 
123  Result<SolverResult> query_remote(const QueryConfig& config) const;
124 
131  Result<std::string> to_smt2(const QueryConfig& config) const;
132 
133  private:
135  // Member
137 
139  std::vector<Constraint> m_constraints;
140 
141  static std::map<std::pair<SolverType, SolverCall>, std::function<Result<std::tuple<bool, std::string>>(const std::string&, const QueryConfig&)>> spec2query;
142  static std::map<SolverType, std::function<Result<std::string>()>> type2query_binary;
143  static std::map<SolverType, bool> type2link_status;
144 
146  // Interface
148 
159  static Result<std::string> translate_to_smt2(const std::vector<Constraint>& constraints, const QueryConfig& config);
160 
172  static Result<SolverResult> translate_from_smt2(bool was_killed, std::string stdout, const QueryConfig& config);
173  };
174  } // namespace SMT
175 } // namespace hal
Result< SolverResult > query_local(const QueryConfig &config) const
Definition: solver.cpp:428
Result< std::string > to_smt2(const QueryConfig &config) const
Definition: solver.cpp:457
static bool has_local_solver_for(SolverType type, SolverCall call)
Definition: solver.cpp:376
Solver & with_constraints(const std::vector< Constraint > &constraints)
Definition: solver.cpp:362
const std::vector< Constraint > & get_constraints() const
Definition: solver.cpp:371
static Result< SolverResult > query_local_with_smt2(const QueryConfig &config, const std::string &smt2)
Definition: solver.cpp:440
Solver(const std::vector< Constraint > &constraints={})
Definition: solver.cpp:352
Result< SolverResult > query_remote(const QueryConfig &config) const
Definition: solver.cpp:451
Result< SolverResult > query(const QueryConfig &config=QueryConfig()) const
Definition: solver.cpp:402
Solver & with_constraint(const Constraint &constraint)
Definition: solver.cpp:356
SolverCall
Definition: types.h:52
SolverType
Definition: types.h:44
PinType type