Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
acir_loader.cpp
Go to the documentation of this file.
1#include "acir_loader.hpp"
4#include "barretenberg/serialize/msgpack_impl.hpp
5#include "barretenberg/smt_verification/circuit/ultra_circuit.hpp"
6#include "barretenberg/smt_verification/terms/term.hpp"
7#include <fstream>
8#include <string>
9#include <vector>
10
11std::vector<uint8_t> readFile(std::string filename)
12{
13 std::ifstream file(filename, std::ios::binary);
14 file.unsetf(std::ios::skipws);
15
16 std::streampos fileSize;
17
18 file.seekg(0, std::ios::end);
19 fileSize = file.tellg();
20 file.seekg(0, std::ios::beg);
21
22 std::vector<uint8_t> vec;
23
24 vec.insert(vec.begin(), std::istream_iterator<uint8_t>(file), std::istream_iterator<uint8_t>());
25 file.close();
26 return vec;
27}
28
29AcirToSmtLoader::AcirToSmtLoader(std::string filename)
30{
31 this->acir_program_buf = readFile(filename);
32 this->instruction_name = filename;
33 this->constraint_system = acir_format::program_buf_to_acir_format(this->acir_program_buf, false).at(0);
34 this->circuit_buf = this->get_circuit_builder().export_circuit();
35}
36
37bb::UltraCircuitBuilder AcirToSmtLoader::get_circuit_builder()
38{
39 bb::UltraCircuitBuilder builder = acir_format::create_circuit(this->constraint_system, false);
40 builder.set_variable_name(0, "a");
41 builder.set_variable_name(1, "b");
42 builder.set_variable_name(2, "c");
43 return builder;
44}
45
46smt_solver::Solver AcirToSmtLoader::get_smt_solver()
47{
48 smt_circuit::CircuitSchema circuit_info = this->get_circuit_schema();
49 // In circuits generated by the shift left (shl) opcode, there is a variable with bit length 197.
50 // This is likely because the shl operation internally calls truncate opcode to handle overflow
51 return smt_solver::Solver(circuit_info.modulus, smt_circuit::default_solver_config, 16, 240);
52}
53
54smt_circuit::CircuitSchema AcirToSmtLoader::get_circuit_schema()
55{
56 return smt_circuit_schema::unpack_from_buffer(this->circuit_buf);
57}
58
59smt_circuit::UltraCircuit AcirToSmtLoader::get_bitvec_smt_circuit(smt_solver::Solver* solver)
60{
61 smt_circuit::CircuitSchema circuit_info = smt_circuit_schema::unpack_from_buffer(this->circuit_buf);
62 return smt_circuit::UltraCircuit(circuit_info, solver, smt_terms::TermType::BVTerm);
63}
64
65smt_circuit::UltraCircuit AcirToSmtLoader::get_field_smt_circuit(smt_solver::Solver* solver)
66{
67 smt_circuit::CircuitSchema circuit_info = smt_circuit_schema::unpack_from_buffer(this->circuit_buf);
68 return smt_circuit::UltraCircuit(circuit_info, solver, smt_terms::TermType::FFTerm);
69}
70
71smt_circuit::UltraCircuit AcirToSmtLoader::get_integer_smt_circuit(smt_solver::Solver* solver)
72{
73 smt_circuit::CircuitSchema circuit_info = smt_circuit_schema::unpack_from_buffer(this->circuit_buf);
74 return smt_circuit::UltraCircuit(circuit_info, solver, smt_terms::TermType::ITerm);
75}
FF a
FF b