Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
memory_manager.cpp
Go to the documentation of this file.
3
4using namespace bb::avm2::testing;
5
7{
8 if (this != &other) {
11 }
12 return *this;
13}
14
19
21{
22 // if address is already set
24 auto stored_tag = memory_address_to_tag[address];
25 // if address is already set to the same tag, do nothing
26 if (stored_tag == tag) {
27 return;
28 }
29 // if address is already set to different tag, remove address from stored_variables
30 stored_variables[stored_tag].erase(
31 std::remove(stored_variables[stored_tag].begin(), stored_variables[stored_tag].end(), address),
32 stored_variables[stored_tag].end());
33 }
35 stored_variables[tag].push_back(address);
36}
37
39{
40 auto memory_address = get_memory_offset(address.tag, address.index);
41 if (!memory_address.has_value()) {
42 return std::nullopt;
43 }
44 auto absolute_address = memory_address.value();
45 switch (address.mode) {
47 absolute_address = address.pointer_address;
48 break;
50 absolute_address -= address.base_offset;
51 break;
53 absolute_address = address.pointer_address;
54 absolute_address -= address.base_offset;
55 break;
57 break;
58 }
59 return absolute_address;
60}
61
63{
64 auto absolute_address = address.address;
65 switch (address.mode) {
67 absolute_address = address.pointer_address;
68 break;
70 absolute_address -= address.base_offset;
71 break;
73 absolute_address = address.pointer_address;
74 absolute_address -= address.base_offset;
75 break;
77 break;
78 }
79 return absolute_address;
80}
81
83{
84 switch (mode) {
86 operand = operand.indirect();
87 break;
89 operand = operand.relative();
90 break;
92 operand = operand.indirect();
93 operand = operand.relative();
94 break;
96 break;
97 }
98 return operand;
99}
100
103{
104 auto absolute_address = get_memory_address_to_resolve(address);
105 if (!absolute_address.has_value()) {
106 return std::nullopt;
107 }
108 if (absolute_address.value() > 255) {
109 return std::nullopt;
110 }
111 auto operand = OperandBuilder::from<uint8_t>(static_cast<uint8_t>(absolute_address.value()));
112
113 auto actual_address = get_memory_offset(address.tag, address.index);
114
115 return std::make_pair(actual_address.value(), get_memory_address_operand(operand, address.mode));
116}
117
120{
121 auto absolute_address = get_memory_address_to_resolve(address);
122 if (!absolute_address.has_value()) {
123 return std::nullopt;
124 }
125 if (absolute_address.value() > 255) {
126 return std::nullopt;
127 }
128 auto operand = OperandBuilder::from<uint8_t>(static_cast<uint8_t>(absolute_address.value()));
129 return std::make_pair(address.address, get_memory_address_operand(operand, address.mode));
130}
131
134{
135 auto absolute_address = get_memory_address_to_resolve(address);
136 if (!absolute_address.has_value()) {
137 return std::nullopt;
138 }
139 if (absolute_address.value() > 65535) {
140 return std::nullopt;
141 }
142 auto operand = OperandBuilder::from<uint16_t>(static_cast<uint16_t>(absolute_address.value()));
143 auto actual_address = get_memory_offset(address.tag, address.index);
144 return std::make_pair(actual_address.value(), get_memory_address_operand(operand, address.mode));
145}
146
149{
150 auto absolute_address = get_memory_address_to_resolve(address);
151 if (!absolute_address.has_value()) {
152 return std::nullopt;
153 }
154 if (absolute_address.value() > 65535) {
155 return std::nullopt;
156 }
157 auto operand = OperandBuilder::from<uint16_t>(static_cast<uint16_t>(absolute_address.value()));
158 return std::make_pair(address.address, get_memory_address_operand(operand, address.mode));
159}
160
162{
163 auto it = this->stored_variables.find(tag);
164 if (it == this->stored_variables.end() || it->second.empty()) {
165 return std::nullopt;
166 }
167 auto& arr = it->second;
168 return arr[index % arr.size()];
169}
170
172{
174 if (!value.has_value()) {
175 return std::nullopt;
176 }
177
178 if (value.value() > 255) {
179 return std::nullopt;
180 }
181
182 return static_cast<uint8_t>(value.value());
183}
184
189
191{
192 if (storage_addresses.empty()) {
193 return std::nullopt;
194 }
195 return storage_addresses[slot_offset_index % storage_addresses.size()];
196}
197
202
204{
205 if (emitted_note_hashes.empty()) {
206 return std::nullopt;
207 }
208 return emitted_note_hashes[note_hash_index % emitted_note_hashes.size()];
209}
210
212{
213 if (emitted_note_hashes.empty()) {
214 return std::nullopt;
215 }
216 return note_hash_index % emitted_note_hashes.size();
217}
bb::avm2::testing::OperandBuilder get_memory_address_operand(bb::avm2::testing::OperandBuilder operand, AddressingMode mode)
std::map< bb::avm2::MemoryTag, std::vector< uint32_t > > stored_variables
MemoryManager & operator=(const MemoryManager &other)
std::vector< bb::avm2::FF > emitted_note_hashes
std::optional< bb::avm2::FF > get_emitted_note_hash(uint16_t note_hash_index)
std::map< uint32_t, bb::avm2::MemoryTag > memory_address_to_tag
std::optional< std::pair< uint32_t, bb::avm2::testing::OperandBuilder > > get_memory_address_and_operand_8(AddressRef address)
std::optional< bb::avm2::FF > get_slot(uint16_t slot_offset_index)
bool is_memory_address_set(uint16_t address)
std::optional< uint8_t > get_memory_offset_8_bit(bb::avm2::MemoryTag tag, uint16_t address_index)
std::optional< uint16_t > get_leaf_index(uint16_t note_hash_index)
void set_memory_address(bb::avm2::MemoryTag tag, uint32_t address)
std::optional< std::pair< uint32_t, bb::avm2::testing::OperandBuilder > > get_memory_address_and_operand_16(AddressRef address)
void append_slot(bb::avm2::FF slot)
std::optional< uint32_t > get_memory_address_to_resolve(AddressRef address)
std::optional< uint32_t > get_memory_offset(bb::avm2::MemoryTag tag, uint32_t address_index)
void append_emitted_note_hash(bb::avm2::FF note_hash)
std::vector< bb::avm2::FF > storage_addresses
AddressingMode
AvmFlavorSettings::FF FF
Definition field.hpp:10
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13