diff --git a/yellow-paper/docs/public-vm/InstructionSet.mdx b/yellow-paper/docs/public-vm/InstructionSet.mdx
new file mode 100644
index 00000000000..141e435dd25
--- /dev/null
+++ b/yellow-paper/docs/public-vm/InstructionSet.mdx
@@ -0,0 +1,5 @@
+# Instruction Set
+
+import GeneratedInstructionSet from './gen/_InstructionSet.mdx';
+
+
\ No newline at end of file
diff --git a/yellow-paper/docs/public-vm/Types.mdx b/yellow-paper/docs/public-vm/Types.mdx
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/yellow-paper/docs/public-vm/_category_.json b/yellow-paper/docs/public-vm/_category_.json
new file mode 100644
index 00000000000..b71bfdd8d04
--- /dev/null
+++ b/yellow-paper/docs/public-vm/_category_.json
@@ -0,0 +1,8 @@
+{
+ "label": "AVM: Aztec's Public VM",
+ "position": 5,
+ "link": {
+ "type": "generated-index",
+ "description": "Aztec's Public VM..."
+ }
+}
diff --git a/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx
new file mode 100644
index 00000000000..60bd17532b4
--- /dev/null
+++ b/yellow-paper/docs/public-vm/gen/_InstructionSet.mdx
@@ -0,0 +1,1330 @@
+[comment]: # (THIS IS A GENERATED FILE! DO NOT EDIT!)
+[comment]: # (Generated via `yarn preprocess`)
+
+[comment]: # (Generated by InstructionSetMarkdownGen.tsx and InstructionSet.js)
+
+import Markdown from 'react-markdown'
+import CodeBlock from '@theme/CodeBlock'
+
+
+## Instructions Table
+
+
+Opcode | Name | Summary | Bit-size | Expression |
+
+ 0x00 | [`ADD`](#isa-section-add) |
+ Addition (a + b) |
+ 96 |
+ {
+ `M[dstOffset] = M[aOffset] + M[bOffset] mod 2^k`
+ } |
+
+
+ 0x01 | [`SUB`](#isa-section-sub) |
+ Subtraction (a - b) |
+ 96 |
+ {
+ `M[dstOffset] = M[aOffset] - M[bOffset] mod 2^k`
+ } |
+
+
+ 0x02 | [`DIV`](#isa-section-div) |
+ Unsigned division (a / b) |
+ 96 |
+ {
+ `M[dstOffset] = M[aOffset] / M[bOffset]`
+ } |
+
+
+ 0x03 | [`EQ`](#isa-section-eq) |
+ Equality check (a == b) |
+ 96 |
+ {
+ `M[dstOffset] = M[aOffset] == M[bOffset] ? 1 : 0`
+ } |
+
+
+ 0x04 | [`LT`](#isa-section-lt) |
+ Less-than check (a < b) |
+ 96 |
+ {
+ `M[dstOffset] = M[aOffset] < M[bOffset] ? 1 : 0`
+ } |
+
+
+ 0x05 | [`LTE`](#isa-section-lte) |
+ Less-than-or-equals check (a <= b) |
+ 96 |
+ {
+ `M[dstOffset] = M[aOffset] <= M[bOffset] ? 1 : 0`
+ } |
+
+
+ 0x06 | [`AND`](#isa-section-and) |
+ Bitwise AND (a & b) |
+ 96 |
+ {
+ `M[dstOffset] = M[aOffset] AND M[bOffset]`
+ } |
+
+
+ 0x07 | [`OR`](#isa-section-or) |
+ Bitwise OR (a | b) |
+ 96 |
+ {
+ `M[dstOffset] = M[aOffset] OR M[bOffset]`
+ } |
+
+
+ 0x08 | [`XOR`](#isa-section-xor) |
+ Bitwise XOR (a ^ b) |
+ 96 |
+ {
+ `M[dstOffset] = M[aOffset] XOR M[bOffset]`
+ } |
+
+
+ 0x09 | [`NOT`](#isa-section-not) |
+ Bitwise NOT (inversion) |
+ 72 |
+ {
+ `M[dstOffset] = NOT M[aOffset]`
+ } |
+
+
+ 0x0a | [`SHL`](#isa-section-shl) |
+ Bitwise leftward shift (a << b) |
+ 96 |
+ {
+ `M[dstOffset] = M[aOffset] << M[bOffset]`
+ } |
+
+
+ 0x0b | [`SHR`](#isa-section-shr) |
+ Bitwise rightward shift (a >> b) |
+ 96 |
+ {
+ `M[dstOffset] = M[aOffset] >> M[bOffset]`
+ } |
+
+
+ 0x0c | [`SET`](#isa-section-set) |
+ Set a memory word from a constant in the bytecode. |
+ 48+N |
+ {
+ `M[dstOffset] = const`
+ } |
+
+
+ 0x0d | [`MOV`](#isa-section-mov) |
+ Move a word from source memory location to destination`. |
+ 64 |
+ {
+ `M[dstOffset] = M[srcOffset]`
+ } |
+
+
+ 0x0e | [`CMOV`](#isa-section-cmov) |
+ Move a word (conditionally chosen) from one memory location to another (`d = cond > 0 ? a : b`). |
+ 112 |
+ {
+ `M[dstOffset] = M[condOffset] > 0 ? M[aOffset] : M[bOffset]`
+ } |
+
+
+ 0x0f | [`CAST`](#isa-section-cast) |
+ Type cast |
+ 72 |
+ {
+ `M[dstOffset] = cast(M[aOffset])`
+ } |
+
+
+ 0x10 | [`CALLDATACOPY`](#isa-section-calldatacopy) |
+ Copy calldata into memory. |
+ 88 |
+ {
+ `M[dstOffset:dstOffset+size] = calldata[cdOffset:cdOffset+size]`
+ } |
+
+
+ 0x11 | [`SLOAD`](#isa-section-sload) |
+ Load a word from storage. |
+ 64 |
+ {
+ `M[dstOffset] = storage[M[slotOffset]]`
+ } |
+
+
+ 0x12 | [`SSTORE`](#isa-section-sstore) |
+ Write a word to storage. |
+ 64 |
+ {
+ `storage[M[slotOffset]] = M[srcOffset]`
+ } |
+
+
+ 0x13 | [`L1L2MSGLOAD`](#isa-section-l1l2msgload) |
+ Retrieve an L1-to-L2 message by key |
+ 136 |
+
+{`{
+ M[dstMsgOffset],
+ M[dstSibPathOffset],
+ M[dstLeafIndexOffset],
+ M[dstRootOffset]
+} = getL1ToL2Message(M[keyOffset])`}
+ |
+
+
+ 0x14 | [`SENDL1TOL2MSG`](#isa-section-sendl2tol1msg) |
+ Retrieve an L1-to-L2 message by key |
+ 136 |
+
+{`{
+ M[dstMsgOffset],
+ M[dstSibPathOffset],
+ M[dstLeafIndexOffset],
+ M[dstRootOffset]
+} = getL1ToL2Message(M[keyOffset])`}
+ |
+
+
+ 0x15 | [`JUMP`](#isa-section-jump) |
+ Jump to a location in the bytecode. |
+ 40 |
+ {
+ `PC = loc`
+ } |
+
+
+ 0x16 | [`JUMPI`](#isa-section-jumpi) |
+ Conditionally jump to a location in the bytecode. |
+ 64 |
+ {
+ `PC = M[condOffset] > 0 ? loc : PC`
+ } |
+
+
+ 0x17 | [`RETURN`](#isa-section-return) |
+ Halt execution with `success`, optionally returning some data. |
+ 64 |
+ {
+ `return(M[offset:offset+size])`
+ } |
+
+
+ 0x18 | [`REVERT`](#isa-section-revert) |
+ Halt execution with `failure`, optionally returning some data. |
+ 64 |
+ {
+ `revert(M[offset:offset+size])`
+ } |
+
+
+ 0x19 | [`CALL`](#isa-section-call) |
+ Call into another contract. |
+ 208 |
+
+{`M[successOffset] = call(
+ M[l1GasOffset], M[l2GasOffset], M[addrOffset],
+ M[argsOffset], M[argsSize],
+ M[retOffset], M[retSize])`}
+ |
+
+
+ 0x1a | [`STATICCALL`](#isa-section-staticcall) |
+ Call into another contract, disallowing persistent state modifications. |
+ 208 |
+
+{`M[successOffset] = staticcall(
+ M[l1GasOffset], M[l2GasOffset], M[addrOffset],
+ M[argsOffset], M[argsSize],
+ M[retOffset], M[retSize])`}
+ |
+
+
+ 0x1b | [`ULOG`](#isa-section-ulog) |
+ Emit an unencrypted log with data from the `field` memory page |
+ 64 |
+ {
+ `ulog(M[offset:offset+size])`
+ } |
+
+
+ 0x1c | [`CHAINID`](#isa-section-chainid) |
+ Get this rollup's L1 chain ID |
+ 40 |
+ {
+ `M[dstOffset] = Globals.chainId`
+ } |
+
+
+ 0x1d | [`VERSION`](#isa-section-version) |
+ Get this rollup's L2 version ID |
+ 40 |
+ {
+ `M[dstOffset] = Globals.version`
+ } |
+
+
+ 0x1e | [`BLOCKNUMBER`](#isa-section-blocknumber) |
+ Get this block's number |
+ 40 |
+ {
+ `M[dstOffset] = Globals.blocknumber`
+ } |
+
+
+ 0x1f | [`TIMESTAMP`](#isa-section-timestamp) |
+ Get this L2 block's timestamp |
+ 40 |
+ {
+ `M[dstOffset] = Globals.timestamp`
+ } |
+
+
+ 0x20 | [`COINBASE`](#isa-section-coinbase) |
+ Get the block's beneficiary address |
+ 40 |
+ {
+ `M[dstOffset] = Globals.coinbase`
+ } |
+
+
+ 0x21 | [`BLOCKL1GASLIMIT`](#isa-section-blockl1gaslimit) |
+ Total amount of "L1 gas" that a block can consume |
+ 40 |
+ {
+ `M[dstOffset] = Globals.l1GasLimit`
+ } |
+
+
+ 0x22 | [`BLOCKL2GASLIMIT`](#isa-section-blockl2gaslimit) |
+ Total amount of "L2 gas" that a block can consume |
+ 40 |
+ {
+ `M[dstOffset] = Globals.l2GasLimit`
+ } |
+
+
+ 0x23 | [`NOTESROOT`](#isa-section-notesroot) |
+ Get the historical note-hash tree root as of the specified block number. |
+ 64 |
+ {
+ `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].note_hash_tree_root`
+ } |
+
+
+ 0x24 | [`NULLIFIERSROOT`](#isa-section-nullroot) |
+ Get the historical nullifier tree root as of the specified block number. |
+ 64 |
+ {
+ `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].nullifier_tree_root`
+ } |
+
+
+ 0x25 | [`CONTRACTSROOT`](#isa-section-contractsroot) |
+ Get the historical contracts tree root as of the specified block number. |
+ 64 |
+ {
+ `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].contracts_tree_root`
+ } |
+
+
+ 0x26 | [`MSGSROOT`](#isa-section-msgsroot) |
+ Get the historical l1-to-l2 messages tree root as of the specified block number. |
+ 64 |
+ {
+ `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].l1_to_l2_messages_tree_root`
+ } |
+
+
+ 0x27 | [`BLOCKSROOT`](#isa-section-blocksroot) |
+ Get the historical blocks tree root as of the specified block number. |
+ 64 |
+ {
+ `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].blocks_tree_root`
+ } |
+
+
+ 0x28 | [`PUBLICDATAROOT`](#isa-section-publicdataroot) |
+ Get the historical public data tree root as of the specified block number. |
+ 64 |
+ {
+ `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].public_data_tree_root`
+ } |
+
+
+ 0x29 | [`GLOBALSHASH`](#isa-section-globalshash) |
+ Get the historical global variables hash as of the specified block number. |
+ 64 |
+ {
+ `M[dstOffset] = HistoricalBlockData[M[blockNumOffset]].global_variables_hash`
+ } |
+
+
+ 0x2a | [`ORIGIN`](#isa-section-origin) |
+ Get the transaction's origination address |
+ 40 |
+ {
+ `M[dstOffset] = TxContext.origin`
+ } |
+
+
+ 0x2b | [`REFUNDEE`](#isa-section-refundee) |
+ The recipient of fee refunds for this transaction |
+ 40 |
+ {
+ `M[dstOffset] = TxContext.refundee`
+ } |
+
+
+ 0x2c | [`FEEPERL1GAS`](#isa-section-feeperl1gas) |
+ The fee to be paid per "L1 gas" - set by the transaction's original caller |
+ 40 |
+ {
+ `M[dstOffset] = TxContext.feePerL1Gas`
+ } |
+
+
+ 0x2d | [`FEEPERL2GAS`](#isa-section-feeperl2gas) |
+ The fee to be paid per "L2 gas" - set by the transaction's original caller |
+ 40 |
+ {
+ `M[dstOffset] = TxContext.feePerL2Gas`
+ } |
+
+
+ 0x2e | [`CALLER`](#isa-section-caller) |
+ Get the address of the sender (the caller's context) |
+ 40 |
+ {
+ `M[dstOffset] = CallContext.sender`
+ } |
+
+
+ 0x2f | [`ADDRESS`](#isa-section-address) |
+ Get the address of the currently executing l2 contract |
+ 40 |
+ {
+ `M[dstOffset] = CallContext.storageContractAddress`
+ } |
+
+
+ 0x30 | [`PORTAL`](#isa-section-portal) |
+ Get the address of the l1 portal contract |
+ 40 |
+ {
+ `M[dstOffset] = CallContext.portalAddress`
+ } |
+
+
+ 0x31 | [`CALLDEPTH`](#isa-section-calldepth) |
+ Get how many calls deep the current call context is |
+ 40 |
+ {
+ `M[dstOffset] = CallContext.calldepth`
+ } |
+
+
+ 0x32 | [`L1GAS`](#isa-section-l1gas) |
+ Remaining "L1 gas" for this call (after this instruction). |
+ 40 |
+ {
+ `M[dstOffset] = LatestContext.l1Gas`
+ } |
+
+
+ 0x33 | [`L2GAS`](#isa-section-l2gas) |
+ Remaining "L2 gas" for this call (after this instruction). |
+ 40 |
+ {
+ `M[dstOffset] = LatestContext.l2Gas`
+ } |
+
+
+
+
+## Instructions
+
+###