Skip to content

Commit

Permalink
feat!: Add Not instruction in brillig (#8488)
Browse files Browse the repository at this point in the history
The AVM supports Not. We add it in brillig to avoid having to codegen it
with two operations.

<details>

<summary>Brillig opcode count changes</summary>

```
contracts: Transpiling  AppSubscription::constructor with size 1969 => 1964
contracts: Transpiling  Auth::constructor with size 1557 => 1552
contracts: Transpiling  Auth::get_authorized with size 128 => 127
contracts: Transpiling  Auth::get_authorized_delay with size 175 => 174
contracts: Transpiling  Auth::get_scheduled_authorized with size 107 => 106
contracts: Transpiling  Auth::set_authorized with size 857 => 856
contracts: Transpiling  Auth::set_authorized_delay with size 826 => 825
contracts: Transpiling  AuthRegistry::_set_authorized with size 86 => 86
contracts: Transpiling  AuthRegistry::consume with size 522 => 521
contracts: Transpiling  AuthRegistry::is_consumable with size 123 => 122
contracts: Transpiling  AuthRegistry::is_reject_all with size 106 => 105
contracts: Transpiling  AuthRegistry::set_authorized with size 81 => 81
contracts: Transpiling  AuthRegistry::set_reject_all with size 64 => 64
contracts: Transpiling  AuthWitTest::consume_public with size 77 => 77
contracts: Transpiling  AvmInitializerTest::constructor with size 1553 => 1548
contracts: Transpiling  AvmInitializerTest::read_storage_immutable with size 89 => 88
contracts: Transpiling  AvmTest::add_args_return with size 17 => 17
contracts: Transpiling  AvmTest::add_storage_map with size 182 => 181
contracts: Transpiling  AvmTest::add_u128 with size 34 => 34
contracts: Transpiling  AvmTest::assert_nullifier_exists with size 18 => 18
contracts: Transpiling  AvmTest::assert_same with size 20 => 20
contracts: Transpiling  AvmTest::assert_timestamp with size 17 => 17
contracts: Transpiling  AvmTest::assertion_failure with size 16 => 16
contracts: Transpiling  AvmTest::check_selector with size 16 => 16
contracts: Transpiling  AvmTest::create_different_nullifier_in_nested_call with size 121 => 120
contracts: Transpiling  AvmTest::create_same_nullifier_in_nested_call with size 119 => 118
contracts: Transpiling  AvmTest::debug_logging with size 282 => 282
contracts: Transpiling  AvmTest::elliptic_curve_add_and_double with size 23 => 23
contracts: Transpiling  AvmTest::emit_nullifier_and_check with size 19 => 19
contracts: Transpiling  AvmTest::emit_unencrypted_log with size 524 => 520
contracts: Transpiling  AvmTest::get_address with size 15 => 15
contracts: Transpiling  AvmTest::get_args_hash with size 1046 => 1041
contracts: Transpiling  AvmTest::get_block_number with size 15 => 15
contracts: Transpiling  AvmTest::get_chain_id with size 15 => 15
contracts: Transpiling  AvmTest::get_da_gas_left with size 15 => 15
contracts: Transpiling  AvmTest::get_fee_per_da_gas with size 15 => 15
contracts: Transpiling  AvmTest::get_fee_per_l2_gas with size 15 => 15
contracts: Transpiling  AvmTest::get_function_selector with size 15 => 15
contracts: Transpiling  AvmTest::get_l2_gas_left with size 15 => 15
contracts: Transpiling  AvmTest::get_sender with size 15 => 15
contracts: Transpiling  AvmTest::get_storage_address with size 15 => 15
contracts: Transpiling  AvmTest::get_timestamp with size 15 => 15
contracts: Transpiling  AvmTest::get_transaction_fee with size 15 => 15
contracts: Transpiling  AvmTest::get_version with size 15 => 15
contracts: Transpiling  AvmTest::keccak_f1600 with size 77 => 76
contracts: Transpiling  AvmTest::keccak_hash with size 708 => 703
contracts: Transpiling  AvmTest::l1_to_l2_msg_exists with size 19 => 19
contracts: Transpiling  AvmTest::modulo2 with size 18 => 18
contracts: Transpiling  AvmTest::nested_call_to_add with size 196 => 195
contracts: Transpiling  AvmTest::nested_call_to_add_with_gas with size 204 => 203
contracts: Transpiling  AvmTest::nested_static_call_to_add with size 196 => 195
contracts: Transpiling  AvmTest::nested_static_call_to_set_storage with size 118 => 117
contracts: Transpiling  AvmTest::new_note_hash with size 13 => 13
contracts: Transpiling  AvmTest::new_nullifier with size 13 => 13
contracts: Transpiling  AvmTest::note_hash_exists with size 19 => 19
contracts: Transpiling  AvmTest::nullifier_collision with size 14 => 14
contracts: Transpiling  AvmTest::nullifier_exists with size 19 => 19
contracts: Transpiling  AvmTest::pedersen_commit with size 73 => 73
contracts: Transpiling  AvmTest::pedersen_hash with size 42 => 41
contracts: Transpiling  AvmTest::pedersen_hash_with_index with size 42 => 41
contracts: Transpiling  AvmTest::poseidon2_hash with size 306 => 304
contracts: Transpiling  AvmTest::read_storage_list with size 115 => 113
contracts: Transpiling  AvmTest::read_storage_map with size 103 => 102
contracts: Transpiling  AvmTest::read_storage_single with size 82 => 81
contracts: Transpiling  AvmTest::send_l2_to_l1_msg with size 14 => 14
contracts: Transpiling  AvmTest::set_opcode_big_field with size 15 => 15
contracts: Transpiling  AvmTest::set_opcode_really_big_field with size 15 => 15
contracts: Transpiling  AvmTest::set_opcode_small_field with size 15 => 15
contracts: Transpiling  AvmTest::set_opcode_u32 with size 15 => 15
contracts: Transpiling  AvmTest::set_opcode_u64 with size 15 => 15
contracts: Transpiling  AvmTest::set_opcode_u8 with size 15 => 15
contracts: Transpiling  AvmTest::set_read_storage_single with size 128 => 127
contracts: Transpiling  AvmTest::set_storage_list with size 47 => 47
contracts: Transpiling  AvmTest::set_storage_map with size 79 => 79
contracts: Transpiling  AvmTest::set_storage_single with size 43 => 43
contracts: Transpiling  AvmTest::sha256_hash with size 62 => 61
contracts: Transpiling  AvmTest::test_get_contract_instance with size 178 => 177
contracts: Transpiling  AvmTest::test_get_contract_instance_raw with size 69 => 69
contracts: Transpiling  AvmTest::to_radix_le with size 40 => 39
contracts: Transpiling  AvmTest::u128_addition_overflow with size 275 => 271
contracts: Transpiling  AvmTest::u128_from_integer_overflow with size 140 => 140
contracts: Transpiling  AvmTest::variable_base_msm with size 84 => 84
contracts: Transpiling  Benchmarking::broadcast with size 113 => 112
contracts: Transpiling  Benchmarking::increment_balance with size 263 => 261
contracts: Transpiling  CardGame::on_card_played with size 882 => 880
contracts: Transpiling  CardGame::on_cards_claimed with size 745 => 743
contracts: Transpiling  CardGame::on_game_joined with size 676 => 672
contracts: Transpiling  CardGame::start_game with size 1150 => 1148
contracts: Transpiling  Child::pub_get_value with size 24 => 24
contracts: Transpiling  Child::pub_inc_value with size 145 => 144
contracts: Transpiling  Child::pub_inc_value_internal with size 150 => 149
contracts: Transpiling  Child::pub_set_value with size 62 => 62
contracts: Transpiling  Child::set_value_twice_with_nested_first with size 182 => 181
contracts: Transpiling  Child::set_value_twice_with_nested_last with size 182 => 181
contracts: Transpiling  Child::set_value_with_two_nested_calls with size 129 => 129
contracts: Transpiling  Claim::constructor with size 1657 => 1652
contracts: Transpiling  Crowdfunding::_publish_donation_receipts with size 153 => 151
contracts: Transpiling  Crowdfunding::init with size 1763 => 1758
contracts: Transpiling  DelegatedOn::public_set_value with size 46 => 46
contracts: Transpiling  Delegator::public_delegate_set_value with size 94 => 93
contracts: Transpiling  DocsExample::get_shared_immutable_constrained_public with size 97 => 96
contracts: Transpiling  DocsExample::get_shared_immutable_constrained_public_indirect with size 86 => 86
contracts: Transpiling  DocsExample::get_shared_immutable_constrained_public_multiple with size 134 => 132
contracts: Transpiling  DocsExample::initialize_public_immutable with size 164 => 163
contracts: Transpiling  DocsExample::initialize_shared_immutable with size 164 => 163
contracts: Transpiling  DocsExample::spend_public_authwit with size 16 => 16
contracts: Transpiling  DocsExample::update_leader with size 54 => 54
contracts: Transpiling  EasyPrivateVoting::add_to_tally_public with size 220 => 219
contracts: Transpiling  EasyPrivateVoting::constructor with size 1614 => 1609
contracts: Transpiling  EasyPrivateVoting::end_vote with size 136 => 135
contracts: Transpiling  FeeJuice::_increase_public_balance with size 196 => 195
contracts: Transpiling  FeeJuice::balance_of_public with size 115 => 114
contracts: Transpiling  FeeJuice::check_balance with size 168 => 167
contracts: Transpiling  FeeJuice::set_portal with size 208 => 207
contracts: Transpiling  FPC::constructor with size 1553 => 1548
contracts: Transpiling  FPC::pay_refund with size 387 => 384
contracts: Transpiling  FPC::pay_refund_with_shielded_rebate with size 387 => 384
contracts: Transpiling  FPC::prepare_fee with size 291 => 290
contracts: Transpiling  ImportTest::pub_call_public_fn with size 118 => 117
contracts: Transpiling  InclusionProofs::constructor with size 1479 => 1474
contracts: Transpiling  InclusionProofs::push_nullifier_public with size 20 => 20
contracts: Transpiling  InclusionProofs::test_nullifier_inclusion_from_public with size 24 => 24
contracts: Transpiling  KeyRegistry::register_initial_keys with size 1066 => 1056
contracts: Transpiling  KeyRegistry::rotate_npk_m with size 1954 => 1941
contracts: Transpiling  Lending::_borrow with size 2276 => 2273
contracts: Transpiling  Lending::_deposit with size 221 => 220
contracts: Transpiling  Lending::_repay with size 1358 => 1356
contracts: Transpiling  Lending::_withdraw with size 2299 => 2296
contracts: Transpiling  Lending::borrow_public with size 232 => 231
contracts: Transpiling  Lending::deposit_public with size 501 => 500
contracts: Transpiling  Lending::get_asset with size 158 => 157
contracts: Transpiling  Lending::get_assets with size 179 => 177
contracts: Transpiling  Lending::get_position with size 848 => 846
contracts: Transpiling  Lending::init with size 300 => 299
contracts: Transpiling  Lending::repay_public with size 447 => 446
contracts: Transpiling  Lending::update_accumulator with size 2423 => 2419
contracts: Transpiling  Lending::withdraw_public with size 232 => 231
contracts: Transpiling  Parent::pub_entry_point with size 75 => 75
contracts: Transpiling  Parent::pub_entry_point_twice with size 127 => 127
contracts: Transpiling  Parent::public_nested_static_call with size 969 => 964
contracts: Transpiling  Parent::public_static_call with size 102 => 101
contracts: Transpiling  PriceFeed::get_price with size 112 => 111
contracts: Transpiling  PriceFeed::set_price with size 75 => 75
contracts: Transpiling  PrivateFPC::constructor with size 1556 => 1551
contracts: Transpiling  Router::_check_block_number with size 163 => 157
contracts: Transpiling  Router::_check_timestamp with size 166 => 160
contracts: Transpiling  StatefulTest::get_public_value with size 103 => 102
contracts: Transpiling  StatefulTest::increment_public_value with size 134 => 133
contracts: Transpiling  StatefulTest::increment_public_value_no_init_check with size 127 => 126
contracts: Transpiling  StatefulTest::public_constructor with size 1597 => 1592
contracts: Transpiling  StaticChild::pub_get_value with size 27 => 27
contracts: Transpiling  StaticChild::pub_illegal_inc_value with size 148 => 147
contracts: Transpiling  StaticChild::pub_inc_value with size 145 => 144
contracts: Transpiling  StaticChild::pub_set_value with size 62 => 62
contracts: Transpiling  StaticParent::public_call with size 75 => 75
contracts: Transpiling  StaticParent::public_get_value_from_child with size 142 => 141
contracts: Transpiling  StaticParent::public_nested_static_call with size 266 => 265
contracts: Transpiling  StaticParent::public_static_call with size 102 => 101
contracts: Transpiling  Test::assert_public_global_vars with size 42 => 42
contracts: Transpiling  Test::consume_message_from_arbitrary_sender_public with size 923 => 920
contracts: Transpiling  Test::consume_mint_public_message with size 1145 => 1141
contracts: Transpiling  Test::create_l2_to_l1_message_arbitrary_recipient_public with size 14 => 14
contracts: Transpiling  Test::create_l2_to_l1_message_public with size 28 => 28
contracts: Transpiling  Test::dummy_public_call with size 16 => 16
contracts: Transpiling  Test::emit_nullifier_public with size 13 => 13
contracts: Transpiling  Test::emit_unencrypted with size 255 => 252
contracts: Transpiling  Test::is_time_equal with size 20 => 20
contracts: Transpiling  TestLog::emit_unencrypted_events with size 251 => 249
contracts: Transpiling  Token::_increase_public_balance with size 187 => 186
contracts: Transpiling  Token::_reduce_total_supply with size 171 => 170
contracts: Transpiling  Token::admin with size 92 => 91
contracts: Transpiling  Token::assert_minter_and_mint with size 236 => 235
contracts: Transpiling  Token::balance_of_public with size 122 => 121
contracts: Transpiling  Token::burn_public with size 1618 => 1612
contracts: Transpiling  Token::complete_refund with size 440 => 440
contracts: Transpiling  Token::constructor with size 2016 => 2011
contracts: Transpiling  Token::is_minter with size 113 => 112
contracts: Transpiling  Token::mint_private with size 509 => 508
contracts: Transpiling  Token::mint_public with size 358 => 357
contracts: Transpiling  Token::public_get_decimals with size 95 => 94
contracts: Transpiling  Token::public_get_name with size 92 => 91
contracts: Transpiling  Token::public_get_symbol with size 92 => 91
contracts: Transpiling  Token::set_admin with size 136 => 135
contracts: Transpiling  Token::set_minter with size 156 => 155
contracts: Transpiling  Token::shield with size 1800 => 1794
contracts: Transpiling  Token::total_supply with size 104 => 103
contracts: Transpiling  Token::transfer_public with size 1633 => 1627
contracts: Transpiling  TokenBlacklist::_increase_public_balance with size 187 => 186
contracts: Transpiling  TokenBlacklist::_reduce_total_supply with size 171 => 170
contracts: Transpiling  TokenBlacklist::balance_of_public with size 122 => 121
contracts: Transpiling  TokenBlacklist::burn_public with size 1754 => 1747
contracts: Transpiling  TokenBlacklist::constructor with size 2308 => 2303
contracts: Transpiling  TokenBlacklist::get_roles with size 179 => 178
contracts: Transpiling  TokenBlacklist::mint_private with size 568 => 567
contracts: Transpiling  TokenBlacklist::mint_public with size 537 => 536
contracts: Transpiling  TokenBlacklist::shield with size 1936 => 1929
contracts: Transpiling  TokenBlacklist::total_supply with size 104 => 103
contracts: Transpiling  TokenBlacklist::transfer_public with size 1904 => 1897
contracts: Transpiling  TokenBlacklist::update_roles with size 1074 => 1073
contracts: Transpiling  TokenBridge::_assert_token_is_same with size 95 => 94
contracts: Transpiling  TokenBridge::_call_mint_on_token with size 248 => 246
contracts: Transpiling  TokenBridge::claim_public with size 1397 => 1392
contracts: Transpiling  TokenBridge::constructor with size 1583 => 1578
contracts: Transpiling  TokenBridge::exit_to_l1_public with size 810 => 807
contracts: Transpiling  TokenBridge::get_portal_address_public with size 94 => 93
contracts: Transpiling  TokenBridge::get_token with size 92 => 91
contracts: Transpiling  Uniswap::_approve_bridge_and_exit_input_asset_to_L1 with size 2612 => 2604
contracts: Transpiling  Uniswap::_assert_token_is_same with size 87 => 87
contracts: Transpiling  Uniswap::constructor with size 1553 => 1548
contracts: Transpiling  Uniswap::swap_public with size 3005 => 2998
contracts: Transpiling contracts...
```

</details>

---------

Co-authored-by: fcarreiro <[email protected]>
  • Loading branch information
2 people authored and AztecBot committed Sep 14, 2024
1 parent f110fbc commit 4279550
Showing 1 changed file with 67 additions and 0 deletions.
67 changes: 67 additions & 0 deletions cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -594,6 +594,16 @@ struct BrilligOpcode {
static BinaryIntOp bincodeDeserialize(std::vector<uint8_t>);
};

struct Not {
Program::MemoryAddress destination;
Program::MemoryAddress source;
Program::IntegerBitSize bit_size;

friend bool operator==(const Not&, const Not&);
std::vector<uint8_t> bincodeSerialize() const;
static Not bincodeDeserialize(std::vector<uint8_t>);
};

struct Cast {
Program::MemoryAddress destination;
Program::MemoryAddress source;
Expand Down Expand Up @@ -751,6 +761,7 @@ struct BrilligOpcode {

std::variant<BinaryFieldOp,
BinaryIntOp,
Not,
Cast,
JumpIfNot,
JumpIf,
Expand Down Expand Up @@ -6107,6 +6118,62 @@ Program::BrilligOpcode::BinaryIntOp serde::Deserializable<Program::BrilligOpcode

namespace Program {

inline bool operator==(const BrilligOpcode::Not& lhs, const BrilligOpcode::Not& rhs)
{
if (!(lhs.destination == rhs.destination)) {
return false;
}
if (!(lhs.source == rhs.source)) {
return false;
}
if (!(lhs.bit_size == rhs.bit_size)) {
return false;
}
return true;
}

inline std::vector<uint8_t> BrilligOpcode::Not::bincodeSerialize() const
{
auto serializer = serde::BincodeSerializer();
serde::Serializable<BrilligOpcode::Not>::serialize(*this, serializer);
return std::move(serializer).bytes();
}

inline BrilligOpcode::Not BrilligOpcode::Not::bincodeDeserialize(std::vector<uint8_t> input)
{
auto deserializer = serde::BincodeDeserializer(input);
auto value = serde::Deserializable<BrilligOpcode::Not>::deserialize(deserializer);
if (deserializer.get_buffer_offset() < input.size()) {
throw_or_abort("Some input bytes were not read");
}
return value;
}

} // end of namespace Program

template <>
template <typename Serializer>
void serde::Serializable<Program::BrilligOpcode::Not>::serialize(const Program::BrilligOpcode::Not& obj,
Serializer& serializer)
{
serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
serde::Serializable<decltype(obj.source)>::serialize(obj.source, serializer);
serde::Serializable<decltype(obj.bit_size)>::serialize(obj.bit_size, serializer);
}

template <>
template <typename Deserializer>
Program::BrilligOpcode::Not serde::Deserializable<Program::BrilligOpcode::Not>::deserialize(Deserializer& deserializer)
{
Program::BrilligOpcode::Not obj;
obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
obj.source = serde::Deserializable<decltype(obj.source)>::deserialize(deserializer);
obj.bit_size = serde::Deserializable<decltype(obj.bit_size)>::deserialize(deserializer);
return obj;
}

namespace Program {

inline bool operator==(const BrilligOpcode::Cast& lhs, const BrilligOpcode::Cast& rhs)
{
if (!(lhs.destination == rhs.destination)) {
Expand Down

0 comments on commit 4279550

Please sign in to comment.