barretenberg
Loading...
Searching...
No Matches
AvmMini_trace.hpp
1#pragma once
2
3#include "barretenberg/common/throw_or_abort.hpp"
4#include "barretenberg/ecc/curves/bn254/fr.hpp"
5#include "barretenberg/proof_system/circuit_builder/circuit_builder_base.hpp"
6#include "barretenberg/proof_system/circuit_builder/generated/AvmMini_circuit_builder.hpp"
7
8#include "barretenberg/flavor/generated/AvmMini_flavor.hpp"
9
10#include "barretenberg/relations/generated/AvmMini/avm_mini.hpp"
11
13using FF = Flavor::FF;
15
16namespace proof_system {
17
18// This is the internal context that we keep along the lifecycle of bytecode execution
19// to iteratively build the whole trace. This is effectively performing witness generation.
20// At the end of circuit building, mainTrace can be moved to AvmMiniCircuitBuilder by calling
21// AvmMiniCircuitBuilder::set_trace(rows).
23
24 public:
25 // Number of rows
26 static const size_t N = 256;
27 static const size_t MemSize = 1024;
28
29 static const uint32_t SubClkLoadA = 0;
30 static const uint32_t SubClkLoadB = 1;
31 static const uint32_t SubClkLoadC = 2;
32 static const uint32_t SubClkStoreA = 3;
33 static const uint32_t SubClkStoreB = 4;
34 static const uint32_t SubClkStoreC = 5;
35
37
38 // Temporary helper to initialize memory.
39 void setFFMem(size_t idx, FF el);
40
41 std::vector<Row> finalize();
42 void reset();
43
44 // Addition over finite field with direct memory access.
45 void add(uint32_t s0, uint32_t s1, uint32_t d0);
46
47 // CALLDATACOPY opcode with direct memory access, i.e.,
48 // M_F[d0:d0+s1] = M_calldata[s0:s0+s1]
49 void callDataCopy(uint32_t s0, uint32_t s1, uint32_t d0, std::vector<FF> const& callDataMem);
50
51 // RETURN opcode with direct memory access, i.e.,
52 // return M_F[s0:s0+s1]
53 std::vector<FF> returnOP(uint32_t s0, uint32_t s1);
54
55 private:
56 struct MemoryTraceEntry {
57 uint32_t m_clk;
58 uint32_t m_sub_clk;
59 uint32_t m_addr;
60 FF m_val;
61 bool m_rw;
62 };
63
64 std::vector<Row> mainTrace;
65 std::vector<MemoryTraceEntry> memTrace; // Entries will be sorted by m_clk, m_sub_clk after finalize().
66 std::array<FF, MemSize> ffMemory{}; // Memory table for finite field elements
67 // Used for simulation of memory table
68
69 static bool compareMemEntries(const MemoryTraceEntry& left, const MemoryTraceEntry& right);
70 void insertInMemTrace(uint32_t m_clk, uint32_t m_sub_clk, uint32_t m_addr, FF m_val, bool m_rw);
71 void loadAInMemTrace(uint32_t addr, FF val);
72 void loadBInMemTrace(uint32_t addr, FF val);
73 void loadCInMemTrace(uint32_t addr, FF val);
74 void storeAInMemTrace(uint32_t addr, FF val);
75 void storeBInMemTrace(uint32_t addr, FF val);
76 void storeCInMemTrace(uint32_t addr, FF val);
77};
78} // namespace proof_system
Definition: AvmMini_trace.hpp:22
void callDataCopy(uint32_t s0, uint32_t s1, uint32_t d0, std::vector< FF > const &callDataMem)
CALLDATACOPY opcode with direct memory access, i.e., M_F[d0:d0+s1] = M_calldata[s0:s0+s1] Simplified ...
Definition: AvmMini_trace.cpp:219
void setFFMem(size_t idx, FF el)
Helper to initialize ffMemory. (Testing purpose mostly.)
Definition: AvmMini_trace.cpp:382
std::vector< Row > finalize()
Finalisation of the memory trace and incorporating it to the main trace. In particular,...
Definition: AvmMini_trace.cpp:395
std::vector< FF > returnOP(uint32_t s0, uint32_t s1)
RETURN opcode with direct memory access, i.e., return M_F[s0:s0+s1] Simplified version with exclusive...
Definition: AvmMini_trace.cpp:308
void add(uint32_t s0, uint32_t s1, uint32_t d0)
Addition over finite field with direct memory access.
Definition: AvmMini_trace.cpp:167
void reset()
Resetting the internal state so that a new trace can be rebuilt using the same object.
Definition: AvmMini_trace.cpp:30
AvmMiniTraceBuilder()
Constructor of a trace builder of AVM. Only serves to set the capacity of the underlying traces.
Definition: AvmMini_trace.cpp:20
Definition: AvmMini_flavor.hpp:21
Definition: AvmMini_circuit_builder.hpp:18