2#include "barretenberg/smt_verification/solver/solver.hpp"
5using namespace smt_solver;
25 , modulus(cvc5::Term()){};
27 explicit FFITerm(
const std::string& t,
Solver* slv,
bool isconst =
false, uint32_t base = 16);
31 , modulus(s->s.mkInteger(s->modulus))
44 void operator+=(
const FFITerm& other);
46 void operator-=(
const FFITerm& other);
48 void operator*=(
const FFITerm& other);
50 void operator/=(
const FFITerm& other);
55 operator std::string()
const {
return term.isIntegerValue() ? term.getIntegerValue() : term.toString(); };
56 operator cvc5::Term()
const {
return term; };
59 friend std::ostream& operator<<(std::ostream& out,
const FFITerm& k) {
return out << k.term; }
61 friend FFITerm batch_add(
const std::vector<FFITerm>& children)
63 Solver* slv = children[0].solver;
64 std::vector<cvc5::Term> terms(children.begin(), children.end());
65 cvc5::Term res = slv->s.mkTerm(cvc5::Kind::ADD, terms);
66 res = slv->s.mkTerm(cvc5::Kind::INTS_MODULUS, { res, children[0].modulus });
70 friend FFITerm batch_mul(
const std::vector<FFITerm>& children)
72 Solver* slv = children[0].solver;
73 std::vector<cvc5::Term> terms(children.begin(), children.end());
74 cvc5::Term res = slv->s.mkTerm(cvc5::Kind::MULT, terms);
75 res = slv->s.mkTerm(cvc5::Kind::INTS_MODULUS, { res, children[0].modulus });
Class for the solver.
Definition: solver.hpp:28
Integer Modulo element class.
Definition: ffiterm.hpp:16
void operator!=(const FFITerm &other) const
Definition: ffiterm.cpp:149
static FFITerm Var(const std::string &name, Solver *slv)
Definition: ffiterm.cpp:12
static FFITerm Const(const std::string &val, Solver *slv, uint32_t base=16)
Definition: ffiterm.cpp:25
FFITerm operator/(const FFITerm &other) const
Division operation.
Definition: ffiterm.cpp:103
void operator==(const FFITerm &other) const
Definition: ffiterm.cpp:139