Skip to content

Commit

Permalink
feat(avm/brillig): take addresses in calldatacopy
Browse files Browse the repository at this point in the history
  • Loading branch information
fcarreiro committed Sep 5, 2024
1 parent 249e50e commit 689c6e9
Show file tree
Hide file tree
Showing 19 changed files with 786 additions and 402 deletions.
6 changes: 3 additions & 3 deletions avm-transpiler/src/transpile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,15 +81,15 @@ pub fn brillig_to_avm(
],
});
}
BrilligOpcode::CalldataCopy { destination_address, size, offset } => {
BrilligOpcode::CalldataCopy { destination_address, size_address, offset_address } => {
avm_instrs.push(AvmInstruction {
opcode: AvmOpcode::CALLDATACOPY,
indirect: Some(ALL_DIRECT),
operands: vec![
AvmOperand::U32 {
value: *offset as u32, // cdOffset (calldata offset)
value: offset_address.to_usize() as u32, // cdOffset (calldata offset)
},
AvmOperand::U32 { value: *size as u32 },
AvmOperand::U32 { value: size_address.to_usize() as u32 }, // sizeOffset
AvmOperand::U32 {
value: destination_address.to_usize() as u32, // dstOffset
},
Expand Down
41 changes: 31 additions & 10 deletions barretenberg/cpp/src/barretenberg/vm/avm/tests/arithmetic.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,9 @@ TEST_F(AvmArithmeticTestsFF, addition)
{
std::vector<FF> const calldata = { 37, 4, 11 };
gen_trace_builder(calldata);
trace_builder.op_calldata_copy(0, 0, 3, 0);
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
trace_builder.op_set(0, 3, 1, AvmMemoryTag::U32);
trace_builder.op_calldata_copy(0, 0, 1, 0);

// Memory layout: [37,4,11,0,0,0,....]
trace_builder.op_add(0, 0, 1, 4, AvmMemoryTag::FF); // [37,4,11,0,41,0,....]
Expand All @@ -415,7 +417,9 @@ TEST_F(AvmArithmeticTestsFF, subtraction)
{
std::vector<FF> const calldata = { 8, 4, 17 };
gen_trace_builder(calldata);
trace_builder.op_calldata_copy(0, 0, 3, 0);
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
trace_builder.op_set(0, 3, 1, AvmMemoryTag::U32);
trace_builder.op_calldata_copy(0, 0, 1, 0);

// Memory layout: [8,4,17,0,0,0,....]
trace_builder.op_sub(0, 2, 0, 1, AvmMemoryTag::FF); // [8,9,17,0,0,0....]
Expand All @@ -436,7 +440,9 @@ TEST_F(AvmArithmeticTestsFF, multiplication)
{
std::vector<FF> const calldata = { 5, 0, 20 };
gen_trace_builder(calldata);
trace_builder.op_calldata_copy(0, 0, 3, 0);
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
trace_builder.op_set(0, 3, 1, AvmMemoryTag::U32);
trace_builder.op_calldata_copy(0, 0, 1, 0);

// Memory layout: [5,0,20,0,0,0,....]
trace_builder.op_mul(0, 2, 0, 1, AvmMemoryTag::FF); // [5,100,20,0,0,0....]
Expand All @@ -456,8 +462,10 @@ TEST_F(AvmArithmeticTestsFF, multiplication)
// Test on multiplication by zero over finite field type.
TEST_F(AvmArithmeticTestsFF, multiplicationByZero)
{
std::vector<FF> const calldata = { 127 };
std::vector<FF> const calldata = { 127, 0, 0 };
gen_trace_builder(calldata);
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
trace_builder.op_set(0, 3, 1, AvmMemoryTag::U32);
trace_builder.op_calldata_copy(0, 0, 1, 0);

// Memory layout: [127,0,0,0,0,0,....]
Expand All @@ -480,7 +488,9 @@ TEST_F(AvmArithmeticTestsFF, fDivision)
{
std::vector<FF> const calldata = { 15, 315 };
gen_trace_builder(calldata);
trace_builder.op_calldata_copy(0, 0, 2, 0);
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
trace_builder.op_set(0, 2, 1, AvmMemoryTag::U32);
trace_builder.op_calldata_copy(0, 0, 1, 0);

// Memory layout: [15,315,0,0,0,0,....]
trace_builder.op_fdiv(0, 1, 0, 2); // [15,315,21,0,0,0....]
Expand All @@ -504,8 +514,10 @@ TEST_F(AvmArithmeticTestsFF, fDivision)
// Test on division with zero numerator over finite field type.
TEST_F(AvmArithmeticTestsFF, fDivisionNumeratorZero)
{
std::vector<FF> const calldata = { 15 };
std::vector<FF> const calldata = { 15, 0, 0 };
gen_trace_builder(calldata);
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
trace_builder.op_set(0, 3, 1, AvmMemoryTag::U32);
trace_builder.op_calldata_copy(0, 0, 1, 0);

// Memory layout: [15,0,0,0,0,0,....]
Expand All @@ -531,8 +543,10 @@ TEST_F(AvmArithmeticTestsFF, fDivisionNumeratorZero)
// We check that the operator error flag is raised.
TEST_F(AvmArithmeticTestsFF, fDivisionByZeroError)
{
std::vector<FF> const calldata = { 15 };
std::vector<FF> const calldata = { 15, 0, 0 };
gen_trace_builder(calldata);
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
trace_builder.op_set(0, 3, 1, AvmMemoryTag::U32);
trace_builder.op_calldata_copy(0, 0, 1, 0);

// Memory layout: [15,0,0,0,0,0,....]
Expand Down Expand Up @@ -585,7 +599,9 @@ TEST_F(AvmArithmeticTestsFF, mixedOperationsWithError)
{
std::vector<FF> const calldata = { 45, 23, 12 };
gen_trace_builder(calldata);
trace_builder.op_calldata_copy(0, 0, 3, 2);
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
trace_builder.op_set(0, 3, 1, AvmMemoryTag::U32);
trace_builder.op_calldata_copy(0, 0, 1, 0);

// Memory layout: [0,0,45,23,12,0,0,0,....]
trace_builder.op_add(0, 2, 3, 4, AvmMemoryTag::FF); // [0,0,45,23,68,0,0,0,....]
Expand All @@ -610,7 +626,9 @@ TEST_F(AvmArithmeticTestsFF, equality)
FF elem = FF::modulus - FF(1);
std::vector<FF> const calldata = { elem, elem };
gen_trace_builder(calldata);
trace_builder.op_calldata_copy(0, 0, 2, 0);
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
trace_builder.op_set(0, 2, 1, AvmMemoryTag::U32);
trace_builder.op_calldata_copy(0, 0, 1, 0);
trace_builder.op_eq(0, 0, 1, 2, AvmMemoryTag::FF); // Memory Layout [q - 1, q - 1, 1, 0..]
trace_builder.op_return(0, 0, 3);
auto trace = trace_builder.finalize();
Expand All @@ -631,7 +649,10 @@ TEST_F(AvmArithmeticTestsFF, nonEquality)
FF elem = FF::modulus - FF(1);
std::vector<FF> const calldata = { elem, elem + FF(1) };
gen_trace_builder(calldata);
trace_builder.op_calldata_copy(0, 0, 2, 0);
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
trace_builder.op_set(0, 2, 1, AvmMemoryTag::U32);
trace_builder.op_calldata_copy(0, 0, 1, 0);

trace_builder.op_eq(0, 0, 1, 2, AvmMemoryTag::FF); // Memory Layout [q - 1, q, 0, 0..]
trace_builder.op_return(0, 0, 3);
auto trace = trace_builder.finalize();
Expand Down
2 changes: 2 additions & 0 deletions barretenberg/cpp/src/barretenberg/vm/avm/tests/cast.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ TEST_F(AvmCastTests, truncationFFToU16ModMinus1)
{
calldata = { FF::modulus - 1 };
trace_builder = AvmTraceBuilder(public_inputs, {}, 0, calldata);
trace_builder.op_set(0, 1, 1, AvmMemoryTag::U32);
trace_builder.op_calldata_copy(0, 0, 1, 0);
trace_builder.op_cast(0, 0, 1, AvmMemoryTag::U16);
trace_builder.op_return(0, 0, 0);
Expand All @@ -184,6 +185,7 @@ TEST_F(AvmCastTests, truncationFFToU16ModMinus2)
{
calldata = { FF::modulus_minus_two };
trace_builder = AvmTraceBuilder(public_inputs, {}, 0, calldata);
trace_builder.op_set(0, 1, 1, AvmMemoryTag::U32);
trace_builder.op_calldata_copy(0, 0, 1, 0);
trace_builder.op_cast(0, 0, 1, AvmMemoryTag::U16);
trace_builder.op_return(0, 0, 0);
Expand Down
Loading

0 comments on commit 689c6e9

Please sign in to comment.