-
Notifications
You must be signed in to change notification settings - Fork 234
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(avm)!: variants for binary operations #8473
Conversation
This stack of pull requests is managed by Graphite. Learn more about stacking. Join @fcarreiro and the rest of your teammates on Graphite |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Approved with a couple questions
static readonly opcode = Opcode.ADD; | ||
static readonly opcode = Opcode.ADD_8; // FIXME: needed for gas. | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's this fixme? Is it noting that we need to set opcode = Opcode.ADD_8
because of gas?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
because we should be able to omit this and just say "as u16" or whatever later?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, the thing is that the general consumeGas(xxx)
method uses this.opcode
to retrieve the gas costs, so it needs to be set. In any case, an opcode class INSTANCE doesnt otherwise know its own opcode, and therefore cannot pass it to consumeGas.
Later we have a few options. The one that makes the most sense could be to "index" gas by something else than opcode value. Maybe a canonical opcode value (copy of the enum), or a string ('ADD' vs ADD_8), or even the Add class itself (if we don't use a Record
).
export class FieldDiv extends Instruction { | ||
// TODO: This class now temporarily has a tag, until all tags are removed. | ||
export class FieldDiv extends ThreeOperandArithmeticInstruction { | ||
static type: string = 'FDIV'; | ||
static readonly opcode = Opcode.FDIV; | ||
|
||
// Informs (de)serialization. See Instruction.deserialize. | ||
static readonly wireFormat: OperandType[] = [ | ||
OperandType.UINT8, | ||
OperandType.UINT8, | ||
OperandType.UINT32, | ||
OperandType.UINT32, | ||
OperandType.UINT32, | ||
]; | ||
|
||
constructor(private indirect: number, private aOffset: number, private bOffset: number, private dstOffset: number) { | ||
super(); | ||
} | ||
|
||
public async execute(context: AvmContext): Promise<void> { | ||
const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect }; | ||
const memory = context.machineState.memory.track(this.type); | ||
context.machineState.consumeGas(this.gasCost(memoryOperations)); | ||
|
||
const [aOffset, bOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve( | ||
[this.aOffset, this.bOffset, this.dstOffset], | ||
memory, | ||
); | ||
memory.checkTags(TypeTag.FIELD, aOffset, bOffset); | ||
|
||
const a = memory.getAs<Field>(aOffset); | ||
const b = memory.getAs<Field>(bOffset); | ||
static readonly opcode = Opcode.FDIV_8; // FIXME: needed for gas. | ||
|
||
const dest = a.fdiv(b); | ||
memory.set(dstOffset, dest); | ||
|
||
memory.assert(memoryOperations); | ||
context.machineState.incrementPc(); | ||
protected compute(a: Field, b: Field): Field { | ||
// return (a as Field).fdiv(b as Field); | ||
return a.fdiv(b); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's not totally clear to me why this PR let's us remove all of this code 🤔 Is it because we now have a more generic way to handle different opcode wire formats?
Benchmark resultsMetrics with a significant change:
Detailed resultsAll benchmarks are run on txs on the This benchmark source data is available in JSON format on S3 here. Proof generationEach column represents the number of threads used in proof generation.
L2 block published to L1Each column represents the number of txs on an L2 block published to L1.
L2 chain processingEach column represents the number of blocks on the L2 chain where each block has 8 txs.
Circuits statsStats on running time and I/O sizes collected for every kernel circuit run across all benchmarks.
Stats on running time collected for app circuits
AVM SimulationTime to simulate various public functions in the AVM.
Public DB AccessTime to access various public DBs.
Tree insertion statsThe duration to insert a fixed batch of leaves into each tree type.
MiscellaneousTransaction sizes based on how many contract classes are registered in the tx.
Transaction size based on fee payment method | Metric | | |
Merge activity
|
🤖 I have created a release *beep* *boop* --- <details><summary>aztec-package: 0.54.0</summary> ## [0.54.0](aztec-package-v0.53.0...aztec-package-v0.54.0) (2024-09-10) ### Features * Archiver fork block num ([#8425](#8425)) ([a9f2364](a9f2364)) ### Miscellaneous * Merge devnet to master ([#8472](#8472)) ([26706e9](26706e9)) </details> <details><summary>barretenberg.js: 0.54.0</summary> ## [0.54.0](barretenberg.js-v0.53.0...barretenberg.js-v0.54.0) (2024-09-10) ### Miscellaneous * **barretenberg.js:** Synchronize aztec-packages versions </details> <details><summary>aztec-packages: 0.54.0</summary> ## [0.54.0](aztec-packages-v0.53.0...aztec-packages-v0.54.0) (2024-09-10) ### ⚠ BREAKING CHANGES * **avm:** variants for binary operations ([#8473](#8473)) * **avm:** make JUMP(I) 16-bit ([#8443](#8443)) * **avm:** variants for SET opcode ([#8441](#8441)) * **avm:** variants for MOV opcode ([#8440](#8440)) ### Features * (bb) 128-bit challenges ([#8406](#8406)) ([d5b2397](d5b2397)) * `Module::add_item` (noir-lang/noir#5947) ([8ac81b1](8ac81b1)) * Add `Expr::as_let` (noir-lang/noir#5964) ([8ac81b1](8ac81b1)) * Add `FunctionDefinition::module` and `StructDefinition::module` (noir-lang/noir#5956) ([8ac81b1](8ac81b1)) * Add `FunctionDefinition` methods `is_unconstrained` and `set_unconstrained` (noir-lang/noir#5962) ([8ac81b1](8ac81b1)) * Add `StructDefinition::add_generic` (noir-lang/noir#5961) ([8ac81b1](8ac81b1)) * Add `StructDefinition::name` (noir-lang/noir#5960) ([8ac81b1](8ac81b1)) * Add a `panic` method to the stdlib (noir-lang/noir#5966) ([8ac81b1](8ac81b1)) * Archiver fork block num ([#8425](#8425)) ([a9f2364](a9f2364)) * Arithmetic Generics (noir-lang/noir#5950) ([8ac81b1](8ac81b1)) * **avm-transpiler:** Optionally count opcode types ([#8439](#8439)) ([21c06b5](21c06b5)) * **avm/public:** User space PublicContext::get_args_hash ([#8292](#8292)) ([56ce16a](56ce16a)) * **avm:** DSL integration of AVM recursive verifier ([#8405](#8405)) ([467120e](467120e)), closes [#8285](#8285) * **avm:** Make JUMP(I) 16-bit ([#8443](#8443)) ([5bb38b1](5bb38b1)) * **avm:** Variants for binary operations ([#8473](#8473)) ([8de1f2a](8de1f2a)) * **avm:** Variants for MOV opcode ([#8440](#8440)) ([5b27fbc](5b27fbc)) * **avm:** Variants for SET opcode ([#8441](#8441)) ([dc43306](dc43306)) * **bb:** Towards reduced polynomial memory usage ([#7990](#7990)) ([372f23c](372f23c)) * Let `nargo` and LSP work well in the stdlib (noir-lang/noir#5969) ([8ac81b1](8ac81b1)) * LSP autocompletion for attributes (noir-lang/noir#5963) ([8ac81b1](8ac81b1)) * LSP now suggests self fields and methods (noir-lang/noir#5955) ([8ac81b1](8ac81b1)) * Show doc comments in LSP (noir-lang/noir#5968) ([8ac81b1](8ac81b1)) ### Bug Fixes * Add re-exports back ([#8453](#8453)) ([b6cab90](b6cab90)) * **avm:** Full proving kernel fix ([#8468](#8468)) ([684d962](684d962)) * **bb:** Mac release ([#8450](#8450)) ([1b3f914](1b3f914)) * **docs:** Some docs updates ([#8412](#8412)) ([ad73f30](ad73f30)) * Error when `quote` is used in runtime code (noir-lang/noir#5978) ([8ac81b1](8ac81b1)) * Error when comptime functions are used in runtime code (noir-lang/noir#5976) ([8ac81b1](8ac81b1)) * Fmt ([#8454](#8454)) ([34b4a8a](34b4a8a)) * Guesstimate gas for propose ([#8445](#8445)) ([bff0338](bff0338)) * Let `derive(Eq)` work for empty structs (noir-lang/noir#5965) ([8ac81b1](8ac81b1)) * LSP document symbol didn't work for primitive impls (noir-lang/noir#5970) ([8ac81b1](8ac81b1)) * **mem2reg:** Handle aliases better when setting a known value for a load (noir-lang/noir#5959) ([8ac81b1](8ac81b1)) * **mem2reg:** Handle aliases in function last store cleanup and additional alias unit test (noir-lang/noir#5967) ([8ac81b1](8ac81b1)) * Public data reads and writes verification ([#8296](#8296)) ([ae86347](ae86347)) * Restrict keccak256_injective test input to 8 bits (noir-lang/noir#5977) ([8ac81b1](8ac81b1)) * Suggest trait attributes in LSP (noir-lang/noir#5972) ([8ac81b1](8ac81b1)) ### Miscellaneous * **bb:** Remove poly downsizing, other fast-follow from structured polys ([#8475](#8475)) ([ac88f30](ac88f30)) * **ci:** Rerun ci when ready for review + don't allow draft merge ([#8456](#8456)) ([ede16d3](ede16d3)) * **docs:** Update box readme, remove duplicated features, added box install to the docs ([#8254](#8254)) ([b747ac1](b747ac1)) * Document BoundedVec (noir-lang/noir#5974) ([8ac81b1](8ac81b1)) * Document HashMap (noir-lang/noir#5984) ([8ac81b1](8ac81b1)) * Merge devnet to master ([#8472](#8472)) ([26706e9](26706e9)) * Remove 3 unused functions warnings in the stdlib (noir-lang/noir#5973) ([8ac81b1](8ac81b1)) * Remove warnings from protocol circuits ([#8420](#8420)) ([c4dbcab](c4dbcab)) * Rename files relating to what were "instances" ([#8383](#8383)) ([a934e85](a934e85)) * Replace relative paths to noir-protocol-circuits ([1c43bae](1c43bae)) </details> <details><summary>barretenberg: 0.54.0</summary> ## [0.54.0](barretenberg-v0.53.0...barretenberg-v0.54.0) (2024-09-10) ### ⚠ BREAKING CHANGES * **avm:** variants for binary operations ([#8473](#8473)) * **avm:** make JUMP(I) 16-bit ([#8443](#8443)) * **avm:** variants for SET opcode ([#8441](#8441)) * **avm:** variants for MOV opcode ([#8440](#8440)) ### Features * (bb) 128-bit challenges ([#8406](#8406)) ([d5b2397](d5b2397)) * **avm:** DSL integration of AVM recursive verifier ([#8405](#8405)) ([467120e](467120e)), closes [#8285](#8285) * **avm:** Make JUMP(I) 16-bit ([#8443](#8443)) ([5bb38b1](5bb38b1)) * **avm:** Variants for binary operations ([#8473](#8473)) ([8de1f2a](8de1f2a)) * **avm:** Variants for MOV opcode ([#8440](#8440)) ([5b27fbc](5b27fbc)) * **avm:** Variants for SET opcode ([#8441](#8441)) ([dc43306](dc43306)) * **bb:** Towards reduced polynomial memory usage ([#7990](#7990)) ([372f23c](372f23c)) ### Bug Fixes * **avm:** Full proving kernel fix ([#8468](#8468)) ([684d962](684d962)) * **bb:** Mac release ([#8450](#8450)) ([1b3f914](1b3f914)) ### Miscellaneous * **bb:** Remove poly downsizing, other fast-follow from structured polys ([#8475](#8475)) ([ac88f30](ac88f30)) * Rename files relating to what were "instances" ([#8383](#8383)) ([a934e85](a934e85)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
🤖 I have created a release *beep* *boop* --- <details><summary>aztec-package: 0.54.0</summary> ## [0.54.0](AztecProtocol/aztec-packages@aztec-package-v0.53.0...aztec-package-v0.54.0) (2024-09-10) ### Features * Archiver fork block num ([#8425](AztecProtocol/aztec-packages#8425)) ([a9f2364](AztecProtocol/aztec-packages@a9f2364)) ### Miscellaneous * Merge devnet to master ([#8472](AztecProtocol/aztec-packages#8472)) ([26706e9](AztecProtocol/aztec-packages@26706e9)) </details> <details><summary>barretenberg.js: 0.54.0</summary> ## [0.54.0](AztecProtocol/aztec-packages@barretenberg.js-v0.53.0...barretenberg.js-v0.54.0) (2024-09-10) ### Miscellaneous * **barretenberg.js:** Synchronize aztec-packages versions </details> <details><summary>aztec-packages: 0.54.0</summary> ## [0.54.0](AztecProtocol/aztec-packages@aztec-packages-v0.53.0...aztec-packages-v0.54.0) (2024-09-10) ### ⚠ BREAKING CHANGES * **avm:** variants for binary operations ([#8473](AztecProtocol/aztec-packages#8473)) * **avm:** make JUMP(I) 16-bit ([#8443](AztecProtocol/aztec-packages#8443)) * **avm:** variants for SET opcode ([#8441](AztecProtocol/aztec-packages#8441)) * **avm:** variants for MOV opcode ([#8440](AztecProtocol/aztec-packages#8440)) ### Features * (bb) 128-bit challenges ([#8406](AztecProtocol/aztec-packages#8406)) ([d5b2397](AztecProtocol/aztec-packages@d5b2397)) * `Module::add_item` (noir-lang/noir#5947) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * Add `Expr::as_let` (noir-lang/noir#5964) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * Add `FunctionDefinition::module` and `StructDefinition::module` (noir-lang/noir#5956) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * Add `FunctionDefinition` methods `is_unconstrained` and `set_unconstrained` (noir-lang/noir#5962) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * Add `StructDefinition::add_generic` (noir-lang/noir#5961) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * Add `StructDefinition::name` (noir-lang/noir#5960) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * Add a `panic` method to the stdlib (noir-lang/noir#5966) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * Archiver fork block num ([#8425](AztecProtocol/aztec-packages#8425)) ([a9f2364](AztecProtocol/aztec-packages@a9f2364)) * Arithmetic Generics (noir-lang/noir#5950) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * **avm-transpiler:** Optionally count opcode types ([#8439](AztecProtocol/aztec-packages#8439)) ([21c06b5](AztecProtocol/aztec-packages@21c06b5)) * **avm/public:** User space PublicContext::get_args_hash ([#8292](AztecProtocol/aztec-packages#8292)) ([56ce16a](AztecProtocol/aztec-packages@56ce16a)) * **avm:** DSL integration of AVM recursive verifier ([#8405](AztecProtocol/aztec-packages#8405)) ([467120e](AztecProtocol/aztec-packages@467120e)), closes [#8285](AztecProtocol/aztec-packages#8285) * **avm:** Make JUMP(I) 16-bit ([#8443](AztecProtocol/aztec-packages#8443)) ([5bb38b1](AztecProtocol/aztec-packages@5bb38b1)) * **avm:** Variants for binary operations ([#8473](AztecProtocol/aztec-packages#8473)) ([8de1f2a](AztecProtocol/aztec-packages@8de1f2a)) * **avm:** Variants for MOV opcode ([#8440](AztecProtocol/aztec-packages#8440)) ([5b27fbc](AztecProtocol/aztec-packages@5b27fbc)) * **avm:** Variants for SET opcode ([#8441](AztecProtocol/aztec-packages#8441)) ([dc43306](AztecProtocol/aztec-packages@dc43306)) * **bb:** Towards reduced polynomial memory usage ([#7990](AztecProtocol/aztec-packages#7990)) ([372f23c](AztecProtocol/aztec-packages@372f23c)) * Let `nargo` and LSP work well in the stdlib (noir-lang/noir#5969) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * LSP autocompletion for attributes (noir-lang/noir#5963) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * LSP now suggests self fields and methods (noir-lang/noir#5955) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * Show doc comments in LSP (noir-lang/noir#5968) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) ### Bug Fixes * Add re-exports back ([#8453](AztecProtocol/aztec-packages#8453)) ([b6cab90](AztecProtocol/aztec-packages@b6cab90)) * **avm:** Full proving kernel fix ([#8468](AztecProtocol/aztec-packages#8468)) ([684d962](AztecProtocol/aztec-packages@684d962)) * **bb:** Mac release ([#8450](AztecProtocol/aztec-packages#8450)) ([1b3f914](AztecProtocol/aztec-packages@1b3f914)) * **docs:** Some docs updates ([#8412](AztecProtocol/aztec-packages#8412)) ([ad73f30](AztecProtocol/aztec-packages@ad73f30)) * Error when `quote` is used in runtime code (noir-lang/noir#5978) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * Error when comptime functions are used in runtime code (noir-lang/noir#5976) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * Fmt ([#8454](AztecProtocol/aztec-packages#8454)) ([34b4a8a](AztecProtocol/aztec-packages@34b4a8a)) * Guesstimate gas for propose ([#8445](AztecProtocol/aztec-packages#8445)) ([bff0338](AztecProtocol/aztec-packages@bff0338)) * Let `derive(Eq)` work for empty structs (noir-lang/noir#5965) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * LSP document symbol didn't work for primitive impls (noir-lang/noir#5970) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * **mem2reg:** Handle aliases better when setting a known value for a load (noir-lang/noir#5959) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * **mem2reg:** Handle aliases in function last store cleanup and additional alias unit test (noir-lang/noir#5967) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * Public data reads and writes verification ([#8296](AztecProtocol/aztec-packages#8296)) ([ae86347](AztecProtocol/aztec-packages@ae86347)) * Restrict keccak256_injective test input to 8 bits (noir-lang/noir#5977) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * Suggest trait attributes in LSP (noir-lang/noir#5972) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) ### Miscellaneous * **bb:** Remove poly downsizing, other fast-follow from structured polys ([#8475](AztecProtocol/aztec-packages#8475)) ([ac88f30](AztecProtocol/aztec-packages@ac88f30)) * **ci:** Rerun ci when ready for review + don't allow draft merge ([#8456](AztecProtocol/aztec-packages#8456)) ([ede16d3](AztecProtocol/aztec-packages@ede16d3)) * **docs:** Update box readme, remove duplicated features, added box install to the docs ([#8254](AztecProtocol/aztec-packages#8254)) ([b747ac1](AztecProtocol/aztec-packages@b747ac1)) * Document BoundedVec (noir-lang/noir#5974) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * Document HashMap (noir-lang/noir#5984) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * Merge devnet to master ([#8472](AztecProtocol/aztec-packages#8472)) ([26706e9](AztecProtocol/aztec-packages@26706e9)) * Remove 3 unused functions warnings in the stdlib (noir-lang/noir#5973) ([8ac81b1](AztecProtocol/aztec-packages@8ac81b1)) * Remove warnings from protocol circuits ([#8420](AztecProtocol/aztec-packages#8420)) ([c4dbcab](AztecProtocol/aztec-packages@c4dbcab)) * Rename files relating to what were "instances" ([#8383](AztecProtocol/aztec-packages#8383)) ([a934e85](AztecProtocol/aztec-packages@a934e85)) * Replace relative paths to noir-protocol-circuits ([1c43bae](AztecProtocol/aztec-packages@1c43bae)) </details> <details><summary>barretenberg: 0.54.0</summary> ## [0.54.0](AztecProtocol/aztec-packages@barretenberg-v0.53.0...barretenberg-v0.54.0) (2024-09-10) ### ⚠ BREAKING CHANGES * **avm:** variants for binary operations ([#8473](AztecProtocol/aztec-packages#8473)) * **avm:** make JUMP(I) 16-bit ([#8443](AztecProtocol/aztec-packages#8443)) * **avm:** variants for SET opcode ([#8441](AztecProtocol/aztec-packages#8441)) * **avm:** variants for MOV opcode ([#8440](AztecProtocol/aztec-packages#8440)) ### Features * (bb) 128-bit challenges ([#8406](AztecProtocol/aztec-packages#8406)) ([d5b2397](AztecProtocol/aztec-packages@d5b2397)) * **avm:** DSL integration of AVM recursive verifier ([#8405](AztecProtocol/aztec-packages#8405)) ([467120e](AztecProtocol/aztec-packages@467120e)), closes [#8285](AztecProtocol/aztec-packages#8285) * **avm:** Make JUMP(I) 16-bit ([#8443](AztecProtocol/aztec-packages#8443)) ([5bb38b1](AztecProtocol/aztec-packages@5bb38b1)) * **avm:** Variants for binary operations ([#8473](AztecProtocol/aztec-packages#8473)) ([8de1f2a](AztecProtocol/aztec-packages@8de1f2a)) * **avm:** Variants for MOV opcode ([#8440](AztecProtocol/aztec-packages#8440)) ([5b27fbc](AztecProtocol/aztec-packages@5b27fbc)) * **avm:** Variants for SET opcode ([#8441](AztecProtocol/aztec-packages#8441)) ([dc43306](AztecProtocol/aztec-packages@dc43306)) * **bb:** Towards reduced polynomial memory usage ([#7990](AztecProtocol/aztec-packages#7990)) ([372f23c](AztecProtocol/aztec-packages@372f23c)) ### Bug Fixes * **avm:** Full proving kernel fix ([#8468](AztecProtocol/aztec-packages#8468)) ([684d962](AztecProtocol/aztec-packages@684d962)) * **bb:** Mac release ([#8450](AztecProtocol/aztec-packages#8450)) ([1b3f914](AztecProtocol/aztec-packages@1b3f914)) ### Miscellaneous * **bb:** Remove poly downsizing, other fast-follow from structured polys ([#8475](AztecProtocol/aztec-packages#8475)) ([ac88f30](AztecProtocol/aztec-packages@ac88f30)) * Rename files relating to what were "instances" ([#8383](AztecProtocol/aztec-packages#8383)) ([a934e85](AztecProtocol/aztec-packages@a934e85)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
Gets us another ~30% bytecode size gain.
I still have to remove tags.