#ifndef GOOSE_VERIFY_VALUE_H
#define GOOSE_VERIFY_VALUE_H
#include "z3++.h"
#include "llr/llr.h"
namespace goose::verify
{
struct Z3Val
{
z3::expr expr;
ir::Value type;
};
extern optional< Z3Val > BuildZ3ValFromConstant( const sema::Context& c, const Value& val );
extern optional< Z3Val > BuildZ3ExprFromValue( Builder& b, const Value& val );
extern optional< Z3Val > BuildZ3ConstantFromType( const sema::Context& c, const Value& type, const string& name );
extern optional< Z3Val > BuildZ3ConstantFromType( const sema::Context& c, const Term& type, const string& name );
extern optional< Z3Val > BuildZ3Op( Builder& b, const llr::Instruction& instr );
extern z3::expr GetAsBitVec( const z3::expr& expr, const Value& type );
extern z3::expr GetAsBitVec( const Z3Val& zv );
extern z3::expr GetAsInt( const z3::expr& expr, const Value& type );
extern z3::expr GetAsInt( const Z3Val& zv );
}
#endif