Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ultra_circuit.hpp
Go to the documentation of this file.
1#pragma once
2#include "circuit_base.hpp"
3
4namespace smt_circuit {
5
6#define RED "\033[31m"
7#define RESET "\033[0m"
8
9enum class TableType : int32_t { XOR, AND, UNKNOWN };
10struct BlockType {
11 static const size_t PUB = 0;
12 static const size_t LOOKUP = 1;
13 static const size_t ARITHMETIC = 2;
14 static const size_t DELTA_RANGE = 3;
15 static const size_t ELLIPTIC = 4;
16 static const size_t MEMORY = 5;
17 static const size_t NNF = 6;
18};
19
21 static const size_t q_m = 0;
22 static const size_t q_1 = 1;
23 static const size_t q_2 = 2;
24 static const size_t q_3 = 3;
25 static const size_t q_4 = 4;
26 static const size_t q_c = 5;
27 static const size_t q_arith = 6;
28 static const size_t q_delta_range = 7;
29 static const size_t q_elliptic = 8;
30 static const size_t q_memory = 9;
31 static const size_t q_nnf = 10;
32 static const size_t q_lookup = 11;
33 static const size_t curve_b = 12;
34};
35
36struct WireType {
37 static const size_t w_l = 0;
38 static const size_t w_r = 1;
39 static const size_t w_o = 2;
40 static const size_t w_4 = 3;
41 static const size_t w_l_shift = 4;
42 static const size_t w_r_shift = 5;
43 static const size_t w_o_shift = 6;
44 static const size_t w_4_shift = 7;
45};
46
53class UltraCircuit : public CircuitBase {
54 public:
55 std::vector<std::vector<std::vector<bb::fr>>> selectors; // all selectors from the circuit
56 // 1st entry are lookup selectors
57 // 2nd entry are arithmetic selectors
58 // 3rd entry are delta_range selectors
59 // 4th entry are elliptic selectors
60 // 5th entry are memory selectors
61 // 6th entry are nnf selectors
62 std::vector<std::vector<std::vector<uint32_t>>> wires_idxs; // values of the gates' wires idxs
63
66 std::unordered_map<uint32_t, TableType> tables_types;
67 std::unordered_map<uint32_t, size_t> tables_sizes;
69
70 std::unordered_map<uint32_t, uint64_t> range_tags; // ranges associated with a certain tag
71
72 std::vector<std::vector<std::vector<uint32_t>>> rom_records; // triplets of index, value1, value2 witness indices
73 std::vector<std::vector<std::array<uint32_t, 2>>> rom_states; // witness indices in the rom_table
75 ram_records; // quadriplets of index, value, timestamp witness indices and access type
76 std::vector<std::vector<uint32_t>> ram_states; // wintess indices in the ram_table
78 cached_rom_tables; // Stores the symbolic representations of in-circuit ROM tables
80 cached_ram_tables; // Stores the symbolic representations of in-circuit RAM tables
81 bool rom_ram_relaxed; // indicates circuit parser to tread RAM/ROM relations
82
83 explicit UltraCircuit(CircuitSchema& circuit_info,
85 TermType type = TermType::FFTerm,
86 const std::string& tag = "",
87 bool enable_optimizations = true,
88 bool rom_ram_relaxed = false);
89 UltraCircuit(const UltraCircuit& other) = default;
90 UltraCircuit(UltraCircuit&& other) = default;
91 UltraCircuit& operator=(const UltraCircuit& other) = default;
92 UltraCircuit& operator=(UltraCircuit&& other) = default;
93 ~UltraCircuit() override = default;
94
101 inline size_t get_num_gates() const
102 {
103 return selectors[0].size() + selectors[1].size() + selectors[2].size() + selectors[3].size() +
104 selectors[4].size() + selectors[5].size() + selectors[6].size();
105 };
106
107 bool simulate_circuit_eval(std::vector<bb::fr>& witness) const override;
108 void process_new_table(uint32_t table_idx);
109
110 size_t handle_arithmetic_relation(size_t cursor);
111 size_t handle_lookup_relation(size_t cursor);
112 size_t handle_elliptic_relation(size_t cursor);
113 size_t handle_delta_range_relation(size_t cursor);
114 size_t handle_nnf_relation(size_t cursor);
115
117
118 void rom_table_read(uint32_t rom_array_idx, uint32_t index_idx, uint32_t value1_idx, uint32_t value2_idx);
119 void ram_table_read(uint32_t ram_array_idx, uint32_t index_idx, uint32_t value_idx);
120 void ram_table_write(uint32_t ram_array_idx, uint32_t ram_index_idx, uint32_t read_from_value_idx);
121 void handle_rom_tables();
122 void handle_ram_tables();
123
125 CircuitSchema& circuit_info,
126 Solver* s,
128 const std::vector<std::string>& equal = {},
129 const std::vector<std::string>& not_equal = {},
130 const std::vector<std::string>& equal_at_the_same_time = {},
131 const std::vector<std::string>& not_equal_at_the_same_time = {},
132 bool enable_optimizations = false);
133 static std::pair<UltraCircuit, UltraCircuit> unique_witness(CircuitSchema& circuit_info,
134 Solver* s,
136 const std::vector<std::string>& equal = {},
137 bool enable_optimizations = false);
138};
139}; // namespace smt_circuit
Base class for symbolic circuits.
Symbolic Circuit class for Standard Circuit Builder.
std::unordered_map< uint32_t, SymSet< STuple > > cached_symbolic_tables
std::unordered_map< uint32_t, size_t > tables_sizes
void rom_table_read(uint32_t rom_array_idx, uint32_t index_idx, uint32_t value1_idx, uint32_t value2_idx)
Perform read from ROM table.
std::vector< std::vector< std::vector< uint32_t > > > ram_records
UltraCircuit & operator=(UltraCircuit &&other)=default
std::vector< std::vector< std::vector< bb::fr > > > lookup_tables
std::unordered_map< uint32_t, TableType > tables_types
std::vector< std::vector< std::array< uint32_t, 2 > > > rom_states
std::unordered_map< uint32_t, SymArray< STerm, STerm > > cached_ram_tables
UltraCircuit(const UltraCircuit &other)=default
static std::pair< UltraCircuit, UltraCircuit > unique_witness(CircuitSchema &circuit_info, Solver *s, TermType type, const std::vector< std::string > &equal={}, bool enable_optimizations=false)
Check your circuit for witness uniqueness.
size_t handle_lookup_relation(size_t cursor)
Adds all the lookup gate constraints to the solver. Relaxes constraint system for non-ff solver engin...
bool simulate_circuit_eval(std::vector< bb::fr > &witness) const override
Similar functionality to old .check_circuit() method in standard circuit builder.
size_t handle_elliptic_relation(size_t cursor)
Adds all the elliptic gate constraints to the solver.
size_t handle_nnf_relation(size_t cursor)
Adds all the nnf constraints to the solver.
void handle_ram_tables()
Adds all the RAM related constraints into the solver.
static std::pair< UltraCircuit, UltraCircuit > unique_witness_ext(CircuitSchema &circuit_info, Solver *s, TermType type, const std::vector< std::string > &equal={}, const std::vector< std::string > &not_equal={}, const std::vector< std::string > &equal_at_the_same_time={}, const std::vector< std::string > &not_equal_at_the_same_time={}, bool enable_optimizations=false)
Check your circuit for witness uniqueness.
~UltraCircuit() override=default
std::vector< std::vector< uint32_t > > ram_states
std::vector< std::vector< std::vector< uint32_t > > > rom_records
UltraCircuit & operator=(const UltraCircuit &other)=default
UltraCircuit(UltraCircuit &&other)=default
std::unordered_map< uint32_t, uint64_t > range_tags
void process_new_table(uint32_t table_idx)
void handle_rom_tables()
Adds all the ROM related constraints into the solver.
void ram_table_read(uint32_t ram_array_idx, uint32_t index_idx, uint32_t value_idx)
Perform read from RAM table.
void ram_table_write(uint32_t ram_array_idx, uint32_t ram_index_idx, uint32_t read_from_value_idx)
Perform write to RAM table.
void handle_range_constraints()
Adds all the range constraints to the solver.
size_t get_num_gates() const
Get the num gates object.
size_t handle_arithmetic_relation(size_t cursor)
Adds all the arithmetic gate constraints to the solver. Relaxes constraint system for non-ff solver e...
std::unordered_map< uint32_t, SymArray< STerm, STuple > > cached_rom_tables
size_t handle_delta_range_relation(size_t cursor)
Adds all the delta_range gate constraints to the solver.
std::vector< std::vector< std::vector< bb::fr > > > selectors
std::unordered_map< uint64_t, SymSet< STerm > > cached_range_tables
std::vector< std::vector< std::vector< uint32_t > > > wires_idxs
Class for the solver.
Definition solver.hpp:80
TermType
Allows to define three types of symbolic terms STerm - Symbolic Variables acting like a Finte Field e...
Definition term.hpp:15
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
static const size_t ARITHMETIC
static const size_t NNF
static const size_t PUB
static const size_t DELTA_RANGE
static const size_t LOOKUP
static const size_t ELLIPTIC
static const size_t MEMORY
static const size_t q_1
static const size_t q_elliptic
static const size_t q_c
static const size_t q_3
static const size_t q_lookup
static const size_t q_nnf
static const size_t q_4
static const size_t q_m
static const size_t q_memory
static const size_t curve_b
static const size_t q_arith
static const size_t q_2
static const size_t q_delta_range
static const size_t w_4_shift
static const size_t w_o
static const size_t w_l_shift
static const size_t w_l
static const size_t w_o_shift
static const size_t w_r
static const size_t w_r_shift
static const size_t w_4
Serialized state of a circuit.