mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Adjust Z3Interface::fromZ3 for the extra cases
This commit is contained in:
@@ -23,7 +23,9 @@
|
||||
|
||||
#include <libsolutil/Common.h>
|
||||
#include <libsolutil/Numeric.h>
|
||||
#include <libsolutil/CommonData.h>
|
||||
|
||||
#include <range/v3/algorithm/all_of.hpp>
|
||||
#include <range/v3/view.hpp>
|
||||
|
||||
#include <cstdio>
|
||||
@@ -305,6 +307,64 @@ public:
|
||||
);
|
||||
}
|
||||
|
||||
static bool sameSort(std::vector<Expression> const& _args)
|
||||
{
|
||||
if (_args.empty())
|
||||
return true;
|
||||
|
||||
auto sort = _args.front().sort;
|
||||
return ranges::all_of(
|
||||
_args,
|
||||
[&](auto const& _expr){ return _expr.sort->kind == sort->kind; }
|
||||
);
|
||||
}
|
||||
|
||||
static Expression mkAnd(std::vector<Expression> _args)
|
||||
{
|
||||
smtAssert(!_args.empty(), "");
|
||||
smtAssert(sameSort(_args), "");
|
||||
|
||||
auto sort = _args.front().sort;
|
||||
if (sort->kind == Kind::BitVector)
|
||||
return Expression("bvand", std::move(_args), sort);
|
||||
|
||||
smtAssert(sort->kind == Kind::Bool, "");
|
||||
return Expression("and", std::move(_args), Kind::Bool);
|
||||
}
|
||||
|
||||
static Expression mkOr(std::vector<Expression> _args)
|
||||
{
|
||||
smtAssert(!_args.empty(), "");
|
||||
smtAssert(sameSort(_args), "");
|
||||
|
||||
auto sort = _args.front().sort;
|
||||
if (sort->kind == Kind::BitVector)
|
||||
return Expression("bvor", std::move(_args), sort);
|
||||
|
||||
smtAssert(sort->kind == Kind::Bool, "");
|
||||
return Expression("or", std::move(_args), Kind::Bool);
|
||||
}
|
||||
|
||||
static Expression mkPlus(std::vector<Expression> _args)
|
||||
{
|
||||
smtAssert(!_args.empty(), "");
|
||||
smtAssert(sameSort(_args), "");
|
||||
|
||||
auto sort = _args.front().sort;
|
||||
smtAssert(sort->kind == Kind::BitVector || sort->kind == Kind::Int, "");
|
||||
return Expression("+", std::move(_args), sort);
|
||||
}
|
||||
|
||||
static Expression mkMul(std::vector<Expression> _args)
|
||||
{
|
||||
smtAssert(!_args.empty(), "");
|
||||
smtAssert(sameSort(_args), "");
|
||||
|
||||
auto sort = _args.front().sort;
|
||||
smtAssert(sort->kind == Kind::BitVector || sort->kind == Kind::Int, "");
|
||||
return Expression("*", std::move(_args), sort);
|
||||
}
|
||||
|
||||
friend Expression operator!(Expression _a)
|
||||
{
|
||||
if (_a.sort->kind == Kind::BitVector)
|
||||
|
||||
Reference in New Issue
Block a user