Skip to content

Commit eab944c

Browse files
feat(avm/brillig)!: take addresses in calldatacopy (#8388)
Makes calldatacopy more flexible. It's also needed to use this opcode in user-space. As I mentioned we'll probably want most or all opcode immediates to be addresses for maximum flexibility. This is a first experimentation on the pains of doing it :) --------- Co-authored-by: sirasistant <sirasistant@gmail.com>
1 parent 075036e commit eab944c

File tree

25 files changed

+926
-507
lines changed

25 files changed

+926
-507
lines changed

avm-transpiler/src/transpile.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,15 @@ pub fn brillig_to_avm(
8181
],
8282
});
8383
}
84-
BrilligOpcode::CalldataCopy { destination_address, size, offset } => {
84+
BrilligOpcode::CalldataCopy { destination_address, size_address, offset_address } => {
8585
avm_instrs.push(AvmInstruction {
8686
opcode: AvmOpcode::CALLDATACOPY,
8787
indirect: Some(ALL_DIRECT),
8888
operands: vec![
8989
AvmOperand::U32 {
90-
value: *offset as u32, // cdOffset (calldata offset)
90+
value: offset_address.to_usize() as u32, // cdOffset (calldata offset)
9191
},
92-
AvmOperand::U32 { value: *size as u32 },
92+
AvmOperand::U32 { value: size_address.to_usize() as u32 }, // sizeOffset
9393
AvmOperand::U32 {
9494
value: destination_address.to_usize() as u32, // dstOffset
9595
},

barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp

+8-8
Original file line numberDiff line numberDiff line change
@@ -632,8 +632,8 @@ struct BrilligOpcode {
632632

633633
struct CalldataCopy {
634634
Program::MemoryAddress destination_address;
635-
uint64_t size;
636-
uint64_t offset;
635+
Program::MemoryAddress size_address;
636+
Program::MemoryAddress offset_address;
637637

638638
friend bool operator==(const CalldataCopy&, const CalldataCopy&);
639639
std::vector<uint8_t> bincodeSerialize() const;
@@ -6320,10 +6320,10 @@ inline bool operator==(const BrilligOpcode::CalldataCopy& lhs, const BrilligOpco
63206320
if (!(lhs.destination_address == rhs.destination_address)) {
63216321
return false;
63226322
}
6323-
if (!(lhs.size == rhs.size)) {
6323+
if (!(lhs.size_address == rhs.size_address)) {
63246324
return false;
63256325
}
6326-
if (!(lhs.offset == rhs.offset)) {
6326+
if (!(lhs.offset_address == rhs.offset_address)) {
63276327
return false;
63286328
}
63296329
return true;
@@ -6354,8 +6354,8 @@ void serde::Serializable<Program::BrilligOpcode::CalldataCopy>::serialize(
63546354
const Program::BrilligOpcode::CalldataCopy& obj, Serializer& serializer)
63556355
{
63566356
serde::Serializable<decltype(obj.destination_address)>::serialize(obj.destination_address, serializer);
6357-
serde::Serializable<decltype(obj.size)>::serialize(obj.size, serializer);
6358-
serde::Serializable<decltype(obj.offset)>::serialize(obj.offset, serializer);
6357+
serde::Serializable<decltype(obj.size_address)>::serialize(obj.size_address, serializer);
6358+
serde::Serializable<decltype(obj.offset_address)>::serialize(obj.offset_address, serializer);
63596359
}
63606360

63616361
template <>
@@ -6365,8 +6365,8 @@ Program::BrilligOpcode::CalldataCopy serde::Deserializable<Program::BrilligOpcod
63656365
{
63666366
Program::BrilligOpcode::CalldataCopy obj;
63676367
obj.destination_address = serde::Deserializable<decltype(obj.destination_address)>::deserialize(deserializer);
6368-
obj.size = serde::Deserializable<decltype(obj.size)>::deserialize(deserializer);
6369-
obj.offset = serde::Deserializable<decltype(obj.offset)>::deserialize(deserializer);
6368+
obj.size_address = serde::Deserializable<decltype(obj.size_address)>::deserialize(deserializer);
6369+
obj.offset_address = serde::Deserializable<decltype(obj.offset_address)>::deserialize(deserializer);
63706370
return obj;
63716371
}
63726372

barretenberg/cpp/src/barretenberg/vm/avm/tests/arithmetic.test.cpp

+31-10
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,9 @@ TEST_F(AvmArithmeticTestsFF, addition)
393393
{
394394
std::vector<FF> const calldata = { 37, 4, 11 };
395395
gen_trace_builder(calldata);
396-
trace_builder.op_calldata_copy(0, 0, 3, 0);
396+
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
397+
trace_builder.op_set(0, 3, 1, AvmMemoryTag::U32);
398+
trace_builder.op_calldata_copy(0, 0, 1, 0);
397399

398400
// Memory layout: [37,4,11,0,0,0,....]
399401
trace_builder.op_add(0, 0, 1, 4, AvmMemoryTag::FF); // [37,4,11,0,41,0,....]
@@ -415,7 +417,9 @@ TEST_F(AvmArithmeticTestsFF, subtraction)
415417
{
416418
std::vector<FF> const calldata = { 8, 4, 17 };
417419
gen_trace_builder(calldata);
418-
trace_builder.op_calldata_copy(0, 0, 3, 0);
420+
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
421+
trace_builder.op_set(0, 3, 1, AvmMemoryTag::U32);
422+
trace_builder.op_calldata_copy(0, 0, 1, 0);
419423

420424
// Memory layout: [8,4,17,0,0,0,....]
421425
trace_builder.op_sub(0, 2, 0, 1, AvmMemoryTag::FF); // [8,9,17,0,0,0....]
@@ -436,7 +440,9 @@ TEST_F(AvmArithmeticTestsFF, multiplication)
436440
{
437441
std::vector<FF> const calldata = { 5, 0, 20 };
438442
gen_trace_builder(calldata);
439-
trace_builder.op_calldata_copy(0, 0, 3, 0);
443+
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
444+
trace_builder.op_set(0, 3, 1, AvmMemoryTag::U32);
445+
trace_builder.op_calldata_copy(0, 0, 1, 0);
440446

441447
// Memory layout: [5,0,20,0,0,0,....]
442448
trace_builder.op_mul(0, 2, 0, 1, AvmMemoryTag::FF); // [5,100,20,0,0,0....]
@@ -456,8 +462,10 @@ TEST_F(AvmArithmeticTestsFF, multiplication)
456462
// Test on multiplication by zero over finite field type.
457463
TEST_F(AvmArithmeticTestsFF, multiplicationByZero)
458464
{
459-
std::vector<FF> const calldata = { 127 };
465+
std::vector<FF> const calldata = { 127, 0, 0 };
460466
gen_trace_builder(calldata);
467+
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
468+
trace_builder.op_set(0, 3, 1, AvmMemoryTag::U32);
461469
trace_builder.op_calldata_copy(0, 0, 1, 0);
462470

463471
// Memory layout: [127,0,0,0,0,0,....]
@@ -480,7 +488,9 @@ TEST_F(AvmArithmeticTestsFF, fDivision)
480488
{
481489
std::vector<FF> const calldata = { 15, 315 };
482490
gen_trace_builder(calldata);
483-
trace_builder.op_calldata_copy(0, 0, 2, 0);
491+
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
492+
trace_builder.op_set(0, 2, 1, AvmMemoryTag::U32);
493+
trace_builder.op_calldata_copy(0, 0, 1, 0);
484494

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

511523
// Memory layout: [15,0,0,0,0,0,....]
@@ -531,8 +543,10 @@ TEST_F(AvmArithmeticTestsFF, fDivisionNumeratorZero)
531543
// We check that the operator error flag is raised.
532544
TEST_F(AvmArithmeticTestsFF, fDivisionByZeroError)
533545
{
534-
std::vector<FF> const calldata = { 15 };
546+
std::vector<FF> const calldata = { 15, 0, 0 };
535547
gen_trace_builder(calldata);
548+
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
549+
trace_builder.op_set(0, 3, 1, AvmMemoryTag::U32);
536550
trace_builder.op_calldata_copy(0, 0, 1, 0);
537551

538552
// Memory layout: [15,0,0,0,0,0,....]
@@ -585,7 +599,9 @@ TEST_F(AvmArithmeticTestsFF, mixedOperationsWithError)
585599
{
586600
std::vector<FF> const calldata = { 45, 23, 12 };
587601
gen_trace_builder(calldata);
588-
trace_builder.op_calldata_copy(0, 0, 3, 2);
602+
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
603+
trace_builder.op_set(0, 3, 1, AvmMemoryTag::U32);
604+
trace_builder.op_calldata_copy(0, 0, 1, 0);
589605

590606
// Memory layout: [0,0,45,23,12,0,0,0,....]
591607
trace_builder.op_add(0, 2, 3, 4, AvmMemoryTag::FF); // [0,0,45,23,68,0,0,0,....]
@@ -610,7 +626,9 @@ TEST_F(AvmArithmeticTestsFF, equality)
610626
FF elem = FF::modulus - FF(1);
611627
std::vector<FF> const calldata = { elem, elem };
612628
gen_trace_builder(calldata);
613-
trace_builder.op_calldata_copy(0, 0, 2, 0);
629+
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
630+
trace_builder.op_set(0, 2, 1, AvmMemoryTag::U32);
631+
trace_builder.op_calldata_copy(0, 0, 1, 0);
614632
trace_builder.op_eq(0, 0, 1, 2, AvmMemoryTag::FF); // Memory Layout [q - 1, q - 1, 1, 0..]
615633
trace_builder.op_return(0, 0, 3);
616634
auto trace = trace_builder.finalize();
@@ -631,7 +649,10 @@ TEST_F(AvmArithmeticTestsFF, nonEquality)
631649
FF elem = FF::modulus - FF(1);
632650
std::vector<FF> const calldata = { elem, elem + FF(1) };
633651
gen_trace_builder(calldata);
634-
trace_builder.op_calldata_copy(0, 0, 2, 0);
652+
trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32);
653+
trace_builder.op_set(0, 2, 1, AvmMemoryTag::U32);
654+
trace_builder.op_calldata_copy(0, 0, 1, 0);
655+
635656
trace_builder.op_eq(0, 0, 1, 2, AvmMemoryTag::FF); // Memory Layout [q - 1, q, 0, 0..]
636657
trace_builder.op_return(0, 0, 3);
637658
auto trace = trace_builder.finalize();

barretenberg/cpp/src/barretenberg/vm/avm/tests/cast.test.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ TEST_F(AvmCastTests, truncationFFToU16ModMinus1)
171171
{
172172
calldata = { FF::modulus - 1 };
173173
trace_builder = AvmTraceBuilder(public_inputs, {}, 0, calldata);
174+
trace_builder.op_set(0, 1, 1, AvmMemoryTag::U32);
174175
trace_builder.op_calldata_copy(0, 0, 1, 0);
175176
trace_builder.op_cast(0, 0, 1, AvmMemoryTag::U16);
176177
trace_builder.op_return(0, 0, 0);
@@ -184,6 +185,7 @@ TEST_F(AvmCastTests, truncationFFToU16ModMinus2)
184185
{
185186
calldata = { FF::modulus_minus_two };
186187
trace_builder = AvmTraceBuilder(public_inputs, {}, 0, calldata);
188+
trace_builder.op_set(0, 1, 1, AvmMemoryTag::U32);
187189
trace_builder.op_calldata_copy(0, 0, 1, 0);
188190
trace_builder.op_cast(0, 0, 1, AvmMemoryTag::U16);
189191
trace_builder.op_return(0, 0, 0);

0 commit comments

Comments
 (0)