Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
tinyram_aux.hpp
Go to the documentation of this file.
1 
12 #ifndef TINYRAM_AUX_HPP_
13 #define TINYRAM_AUX_HPP_
14 
15 #include <cassert>
16 #include <iostream>
17 #include <libff/common/utils.hpp>
21 #include <map>
22 
23 namespace libsnark
24 {
25 
27  tinyram_opcode_AND = 0b00000,
28  tinyram_opcode_OR = 0b00001,
29  tinyram_opcode_XOR = 0b00010,
30  tinyram_opcode_NOT = 0b00011,
31  tinyram_opcode_ADD = 0b00100,
32  tinyram_opcode_SUB = 0b00101,
38  tinyram_opcode_SHL = 0b01011,
39  tinyram_opcode_SHR = 0b01100,
40 
46 
47  tinyram_opcode_MOV = 0b10010,
49 
50  tinyram_opcode_JMP = 0b10100,
53 
57 
64 };
65 
73 };
74 
79 const static int tinyram_opcodes_register[] = {
85 
88 
90 
92 
97 const static int tinyram_opcodes_control_flow[] = {
99 
104 const static int tinyram_opcodes_stall[] = {
108 
110 
111 typedef size_t reg_count_t; // type for the number of registers
112 typedef size_t reg_width_t; // type for the width of a register
113 
114 extern std::map<tinyram_opcode, std::string> tinyram_opcode_names;
115 
116 extern std::map<std::string, tinyram_opcode> opcode_values;
117 
118 extern std::map<tinyram_opcode, tinyram_opcode_args> opcode_args;
119 
121 
123 typedef std::vector<size_t> tinyram_input_tape;
124 typedef typename tinyram_input_tape::const_iterator tinyram_input_tape_iterator;
125 
127 {
128 public:
129  reg_width_t w; /* width of a register */
130  reg_count_t k; /* number of registers */
131 
134  : w(w), k(k)
135  {
136  assert(w == 1ul << libff::log2(w));
137  };
138 
139  size_t address_size() const;
140  size_t value_size() const;
141  size_t cpu_state_size() const;
142  size_t initial_pc_addr() const;
143 
144  libff::bit_vector initial_cpu_state() const;
146  const tinyram_program &program,
147  const tinyram_input_tape &primary_input) const;
148 
149  size_t opcode_width() const;
150  size_t reg_arg_width() const;
151  size_t instruction_padding_width() const;
152  size_t reg_arg_or_imm_width() const;
153 
154  size_t dwaddr_len() const;
155  size_t subaddr_len() const;
156 
157  size_t bytes_in_word() const;
158 
159  size_t instr_size() const;
160 
161  bool operator==(const tinyram_architecture_params &other) const;
162 
163  friend std::ostream &operator<<(
164  std::ostream &out, const tinyram_architecture_params &ap);
165  friend std::istream &operator>>(
166  std::istream &in, tinyram_architecture_params &ap);
167 
168  void print() const;
169 };
170 
171 /* order everywhere is reversed (i.e. MSB comes first),
172  corresponding to the order in memory */
173 
175 {
176 public:
179  size_t desidx;
180  size_t arg1idx;
182 
184  const tinyram_opcode &opcode,
185  const bool arg2_is_imm,
186  const size_t &desidx,
187  const size_t &arg1idx,
188  const size_t &arg2idx_or_imm);
189 
190  size_t as_dword(const tinyram_architecture_params &ap) const;
191 };
192 
194  const tinyram_architecture_params &ap);
195 
196 std::vector<tinyram_instruction> generate_tinyram_prelude(
197  const tinyram_architecture_params &ap);
199 
201 {
202 public:
203  std::vector<tinyram_instruction> instructions;
204  size_t size() const { return instructions.size(); }
205  void add_instruction(const tinyram_instruction &instr);
206 };
207 
208 tinyram_program load_preprocessed_program(
209  const tinyram_architecture_params &ap, std::istream &preprocessed);
210 
212  const tinyram_architecture_params &ap,
213  const size_t boot_trace_size_bound,
214  const tinyram_program &program,
215  const tinyram_input_tape &primary_input);
216 
217 tinyram_input_tape load_tape(std::istream &tape);
218 
219 } // namespace libsnark
220 
221 #endif // TINYRAM_AUX_HPP_
libsnark::tinyram_opcode_SHL
@ tinyram_opcode_SHL
Definition: tinyram_aux.hpp:38
libsnark::tinyram_opcode_ANSWER
@ tinyram_opcode_ANSWER
Definition: tinyram_aux.hpp:63
libsnark::tinyram_opcode_args_des_arg2
@ tinyram_opcode_args_des_arg2
Definition: tinyram_aux.hpp:68
libsnark::tinyram_architecture_params::dwaddr_len
size_t dwaddr_len() const
Definition: tinyram_aux.cpp:222
libsnark::tinyram_architecture_params::value_size
size_t value_size() const
Definition: tinyram_aux.cpp:148
libsnark::tinyram_opcode_JMP
@ tinyram_opcode_JMP
Definition: tinyram_aux.hpp:50
libsnark::tinyram_opcode_names
std::map< tinyram_opcode, std::string > tinyram_opcode_names
Definition: tinyram_aux.cpp:27
libsnark::generate_tinyram_prelude
std::vector< tinyram_instruction > generate_tinyram_prelude(const tinyram_architecture_params &ap)
Definition: tinyram_aux.cpp:111
libsnark::tinyram_instruction::arg2_is_imm
bool arg2_is_imm
Definition: tinyram_aux.hpp:178
libsnark::tinyram_instruction::opcode
tinyram_opcode opcode
Definition: tinyram_aux.hpp:177
libsnark::tinyram_instruction::arg2idx_or_imm
size_t arg2idx_or_imm
Definition: tinyram_aux.hpp:181
libsnark
Definition: accumulation_vector.hpp:18
libsnark::tinyram_opcode_CMPA
@ tinyram_opcode_CMPA
Definition: tinyram_aux.hpp:42
libsnark::tinyram_architecture_params::instruction_padding_width
size_t instruction_padding_width() const
Definition: tinyram_aux.cpp:211
libsnark::tinyram_architecture_params::subaddr_len
size_t subaddr_len() const
Definition: tinyram_aux.cpp:227
libsnark::tinyram_architecture_params::operator<<
friend std::ostream & operator<<(std::ostream &out, const tinyram_architecture_params &ap)
Definition: tinyram_aux.cpp:242
libsnark::tinyram_opcode_args_arg2_des
@ tinyram_opcode_args_arg2_des
Definition: tinyram_aux.hpp:72
libsnark::tinyram_opcode_UMOD
@ tinyram_opcode_UMOD
Definition: tinyram_aux.hpp:37
libsnark::tinyram_opcode_CMPE
@ tinyram_opcode_CMPE
Definition: tinyram_aux.hpp:41
libsnark::tinyram_architecture_params::print
void print() const
Definition: tinyram_aux.cpp:287
libsnark::tinyram_opcode_11000
@ tinyram_opcode_11000
Definition: tinyram_aux.hpp:55
libsnark::tinyram_opcode_CMPGE
@ tinyram_opcode_CMPGE
Definition: tinyram_aux.hpp:45
libsnark::load_preprocessed_program
tinyram_program load_preprocessed_program(const tinyram_architecture_params &ap, std::istream &preprocessed)
Definition: tinyram_aux.cpp:312
libsnark::tinyram_opcode_MOV
@ tinyram_opcode_MOV
Definition: tinyram_aux.hpp:47
libsnark::tinyram_architecture_params
Definition: tinyram_aux.hpp:126
libsnark::tinyram_opcode_STOREW
@ tinyram_opcode_STOREW
Definition: tinyram_aux.hpp:60
libsnark::tinyram_opcode_CMOV
@ tinyram_opcode_CMOV
Definition: tinyram_aux.hpp:48
libsnark::memory_contents
std::map< size_t, size_t > memory_contents
Definition: memory_interface.hpp:25
libsnark::tinyram_architecture_params::reg_arg_or_imm_width
size_t reg_arg_or_imm_width() const
Definition: tinyram_aux.cpp:217
libsnark::tinyram_instruction
Definition: tinyram_aux.hpp:174
libsnark::tinyram_opcode_SUB
@ tinyram_opcode_SUB
Definition: tinyram_aux.hpp:32
libsnark::tinyram_opcode_UMULH
@ tinyram_opcode_UMULH
Definition: tinyram_aux.hpp:34
libsnark::tinyram_opcode_SMULH
@ tinyram_opcode_SMULH
Definition: tinyram_aux.hpp:35
libsnark::tinyram_opcode_AND
@ tinyram_opcode_AND
Definition: tinyram_aux.hpp:27
libsnark::tinyram_opcode_MULL
@ tinyram_opcode_MULL
Definition: tinyram_aux.hpp:33
libsnark::tinyram_architecture_params::tinyram_architecture_params
tinyram_architecture_params(const reg_width_t w, const reg_count_t k)
Definition: tinyram_aux.hpp:133
libsnark::tinyram_input_tape
std::vector< size_t > tinyram_input_tape
Definition: tinyram_aux.hpp:122
libsnark::tinyram_opcode_args_none
@ tinyram_opcode_args_none
Definition: tinyram_aux.hpp:71
libsnark::random_tinyram_instruction
tinyram_instruction random_tinyram_instruction(const tinyram_architecture_params &ap)
Definition: tinyram_aux.cpp:293
libsnark::ensure_tinyram_opcode_value_map
void ensure_tinyram_opcode_value_map()
Definition: tinyram_aux.cpp:102
libsnark::tinyram_architecture_params::bytes_in_word
size_t bytes_in_word() const
Definition: tinyram_aux.cpp:232
libsnark::tinyram_opcode_SHR
@ tinyram_opcode_SHR
Definition: tinyram_aux.hpp:39
libsnark::tinyram_input_tape_iterator
tinyram_input_tape::const_iterator tinyram_input_tape_iterator
Definition: tinyram_aux.hpp:124
libsnark::tinyram_opcode_args_des_arg1_arg2
@ tinyram_opcode_args_des_arg1_arg2
Definition: tinyram_aux.hpp:67
libsnark::tinyram_architecture_params::operator==
bool operator==(const tinyram_architecture_params &other) const
Definition: tinyram_aux.cpp:236
libsnark::opcode_args
std::map< tinyram_opcode, tinyram_opcode_args > opcode_args
Definition: tinyram_aux.cpp:66
libsnark::tinyram_architecture_params::w
reg_width_t w
Definition: tinyram_aux.hpp:129
libsnark::tinyram_opcode_args_arg2
@ tinyram_opcode_args_arg2
Definition: tinyram_aux.hpp:70
libsnark::reg_count_t
size_t reg_count_t
Definition: tinyram_aux.hpp:111
libsnark::tinyram_architecture_params::cpu_state_size
size_t cpu_state_size() const
Definition: tinyram_aux.cpp:150
libsnark::tinyram_architecture_params::tinyram_architecture_params
tinyram_architecture_params()
Definition: tinyram_aux.hpp:132
libsnark::tinyram_program::size
size_t size() const
Definition: tinyram_aux.hpp:204
libsnark::tinyram_instruction::desidx
size_t desidx
Definition: tinyram_aux.hpp:179
libsnark::tinyram_instruction::arg1idx
size_t arg1idx
Definition: tinyram_aux.hpp:180
libsnark::tinyram_opcode_READ
@ tinyram_opcode_READ
Definition: tinyram_aux.hpp:62
libsnark::tinyram_opcode
tinyram_opcode
Definition: tinyram_aux.hpp:26
libsnark::tinyram_opcode_11001
@ tinyram_opcode_11001
Definition: tinyram_aux.hpp:56
libsnark::tinyram_opcode_XOR
@ tinyram_opcode_XOR
Definition: tinyram_aux.hpp:29
libsnark::tinyram_opcode_CMPAE
@ tinyram_opcode_CMPAE
Definition: tinyram_aux.hpp:43
libsnark::tinyram_opcode_CNJMP
@ tinyram_opcode_CNJMP
Definition: tinyram_aux.hpp:52
libsnark::tinyram_architecture_params::k
reg_count_t k
Definition: tinyram_aux.hpp:130
libsnark::tinyram_opcode_NOT
@ tinyram_opcode_NOT
Definition: tinyram_aux.hpp:30
libsnark::tinyram_opcode_CMPG
@ tinyram_opcode_CMPG
Definition: tinyram_aux.hpp:44
libsnark::tinyram_default_instruction
tinyram_instruction tinyram_default_instruction
Definition: tinyram_aux.cpp:24
libsnark::tinyram_architecture_params::reg_arg_width
size_t reg_arg_width() const
Definition: tinyram_aux.cpp:206
memory_interface.hpp
libsnark::tinyram_architecture_params::initial_cpu_state
libff::bit_vector initial_cpu_state() const
Definition: tinyram_aux.cpp:163
libsnark::tinyram_architecture_params::address_size
size_t address_size() const
Definition: tinyram_aux.cpp:143
libsnark::tinyram_instruction::as_dword
size_t as_dword(const tinyram_architecture_params &ap) const
Definition: tinyram_aux.cpp:273
libsnark::load_tape
tinyram_input_tape load_tape(std::istream &tape)
Definition: tinyram_aux.cpp:369
libsnark::reg_width_t
size_t reg_width_t
Definition: tinyram_aux.hpp:112
libsnark::tinyram_architecture_params::operator>>
friend std::istream & operator>>(std::istream &in, tinyram_architecture_params &ap)
Definition: tinyram_aux.cpp:250
libsnark::tinyram_opcode_CJMP
@ tinyram_opcode_CJMP
Definition: tinyram_aux.hpp:51
libsnark::tinyram_boot_trace_from_program_and_input
memory_store_trace tinyram_boot_trace_from_program_and_input(const tinyram_architecture_params &ap, const size_t boot_trace_size_bound, const tinyram_program &program, const tinyram_input_tape &primary_input)
Definition: tinyram_aux.cpp:338
libsnark::tinyram_opcode_LOADW
@ tinyram_opcode_LOADW
Definition: tinyram_aux.hpp:61
libsnark::tinyram_instruction::tinyram_instruction
tinyram_instruction(const tinyram_opcode &opcode, const bool arg2_is_imm, const size_t &desidx, const size_t &arg1idx, const size_t &arg2idx_or_imm)
Definition: tinyram_aux.cpp:259
libsnark::opcode_values
std::map< std::string, tinyram_opcode > opcode_values
Definition: tinyram_aux.cpp:100
libsnark::tinyram_architecture_params::instr_size
size_t instr_size() const
Definition: tinyram_aux.cpp:234
libsnark::tinyram_program::add_instruction
void add_instruction(const tinyram_instruction &instr)
Definition: tinyram_aux.cpp:307
libsnark::tinyram_architecture_params::initial_pc_addr
size_t initial_pc_addr() const
Definition: tinyram_aux.cpp:156
libsnark::tinyram_architecture_params::opcode_width
size_t opcode_width() const
Definition: tinyram_aux.cpp:200
libsnark::tinyram_architecture_params::initial_memory_contents
memory_contents initial_memory_contents(const tinyram_program &program, const tinyram_input_tape &primary_input) const
Definition: tinyram_aux.cpp:169
libsnark::tinyram_opcode_args_arg1_arg2
@ tinyram_opcode_args_arg1_arg2
Definition: tinyram_aux.hpp:69
libsnark::tinyram_program
Definition: tinyram_aux.hpp:200
libsnark::tinyram_opcode_STOREB
@ tinyram_opcode_STOREB
Definition: tinyram_aux.hpp:58
libsnark::tinyram_program::instructions
std::vector< tinyram_instruction > instructions
Definition: tinyram_aux.hpp:203
libsnark::tinyram_opcode_args
tinyram_opcode_args
Definition: tinyram_aux.hpp:66
libsnark::tinyram_opcode_10111
@ tinyram_opcode_10111
Definition: tinyram_aux.hpp:54
libsnark::tinyram_opcode_UDIV
@ tinyram_opcode_UDIV
Definition: tinyram_aux.hpp:36
libsnark::tinyram_opcode_ADD
@ tinyram_opcode_ADD
Definition: tinyram_aux.hpp:31
libsnark::tinyram_opcode_LOADB
@ tinyram_opcode_LOADB
Definition: tinyram_aux.hpp:59
ram_params.hpp
r1cs.hpp
libsnark::tinyram_opcode_OR
@ tinyram_opcode_OR
Definition: tinyram_aux.hpp:28