From 3f60680f1a22391e1bff70efffdeae7f94ce7638 Mon Sep 17 00:00:00 2001 From: fcarreiro Date: Wed, 13 Mar 2024 18:40:20 +0000 Subject: [PATCH] fix(avm-transpiler): FDIV and U128 test case --- avm-transpiler/src/opcodes.rs | 2 +- avm-transpiler/src/transpile.rs | 6 +++++- .../contracts/avm_test_contract/src/main.nr | 5 +++++ .../simulator/src/avm/avm_simulator.test.ts | 18 ++++++++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/avm-transpiler/src/opcodes.rs b/avm-transpiler/src/opcodes.rs index a3779e6499e..49de1fb366a 100644 --- a/avm-transpiler/src/opcodes.rs +++ b/avm-transpiler/src/opcodes.rs @@ -1,6 +1,6 @@ /// All AVM opcodes /// Keep updated with TS and yellow paper! -#[derive(Copy, Clone)] +#[derive(PartialEq, Copy, Clone)] pub enum AvmOpcode { // Compute ADD, diff --git a/avm-transpiler/src/transpile.rs b/avm-transpiler/src/transpile.rs index a3e265ee5aa..59cba34d907 100644 --- a/avm-transpiler/src/transpile.rs +++ b/avm-transpiler/src/transpile.rs @@ -41,7 +41,11 @@ pub fn brillig_to_avm(brillig: &Brillig) -> Vec { avm_instrs.push(AvmInstruction { opcode: avm_opcode, indirect: Some(ALL_DIRECT), - tag: Some(AvmTypeTag::FIELD), + tag: if avm_opcode == AvmOpcode::FDIV { + None + } else { + Some(AvmTypeTag::FIELD) + }, operands: vec![ AvmOperand::U32 { value: lhs.to_usize() as u32, diff --git a/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr index 76ac08e2e33..3aaf19173b7 100644 --- a/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr @@ -104,6 +104,11 @@ contract AvmTest { 200 as Field } + #[aztec(public-vm)] + fn addU128(a: U128, b: U128) -> pub U128 { + a + b + } + // /************************************************************************ // * Hashing functions // ************************************************************************/ diff --git a/yarn-project/simulator/src/avm/avm_simulator.test.ts b/yarn-project/simulator/src/avm/avm_simulator.test.ts index e6cdb37e7d4..c78050e2d7f 100644 --- a/yarn-project/simulator/src/avm/avm_simulator.test.ts +++ b/yarn-project/simulator/src/avm/avm_simulator.test.ts @@ -59,6 +59,24 @@ describe('AVM simulator', () => { expect(results.output).toEqual([new Fr(3)]); }); + it('Should execute contract function that performs U128 addition', async () => { + const calldata: Fr[] = [ + // First U128 + new Fr(1), + new Fr(2), + // Second U128 + new Fr(3), + new Fr(4), + ]; + const context = initContext({ env: initExecutionEnvironment({ calldata }) }); + + const bytecode = getAvmTestContractBytecode('avm_addU128'); + const results = await new AvmSimulator(context).executeBytecode(bytecode); + + expect(results.reverted).toBe(false); + expect(results.output).toEqual([new Fr(4), new Fr(6)]); + }); + describe.each([ ['avm_setOpcodeUint8', 8n], // ['avm_setOpcodeUint16', 60000n],