-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Add initial add opcode * Begin operand indirection * Add address for dest * Fix compilation error * Format code * Run clippy * Add target for asm (#17) * Add sub program * Add 'add' program * Update makefile with asm target * Update test setup, add failing sub test and 'add' test * Cargo fmt * Remove echo * Clippy * Update test setup, add failing sub test and 'add' test * Remove echo * Clippy * Add sub implementation * Make sub test work * Add should be zero and modify simple test * Modify tests * Format * Working tests * Lint --------- Co-authored-by: Gianbelinche <[email protected]> Co-authored-by: Francisco Krause Arnim <[email protected]> Co-authored-by: Francisco Krause Arnim <[email protected]>
- Loading branch information
1 parent
0987aff
commit f3a3034
Showing
12 changed files
with
304 additions
and
46 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,16 +1,30 @@ | ||
.PHONY: clean | ||
.PHONY: clean lint compile-programs-asm compile-programs-yul | ||
|
||
ARTIFACTS_DIR=./program_artifacts | ||
PROGRAMS_DIR=./programs | ||
ZKSOLC_FLAGS=--asm --bin --yul --overwrite | ||
ZKSOLC_YUL_FLAGS=--asm --bin --yul --overwrite | ||
ZKSOLC_ASM_FLAGS=--zkasm --bin --overwrite | ||
|
||
PROGRAMS = $(wildcard $(PROGRAMS_DIR)/*.yul) | ||
ARTIFACTS = $(patsubst $(PROGRAMS_DIR)/%.yul, $(ARTIFACTS_DIR)/%.artifacts, $(PROGRAMS)) | ||
YUL_PROGRAMS = $(wildcard $(PROGRAMS_DIR)/*.yul) | ||
ASM_PROGRAMS = $(wildcard $(PROGRAMS_DIR)/*.zasm) | ||
ARTIFACTS_YUL = $(patsubst $(PROGRAMS_DIR)/%.yul, $(ARTIFACTS_DIR)/%.artifacts.yul, $(YUL_PROGRAMS)) | ||
ARTIFACTS_ASM = $(patsubst $(PROGRAMS_DIR)/%.zasm, $(ARTIFACTS_DIR)/%.artifacts.zasm, $(ASM_PROGRAMS)) | ||
|
||
compile-programs: $(ARTIFACTS) | ||
compile-programs-asm: $(ARTIFACTS_ASM) | ||
compile-programs-yul: $(ARTIFACTS_YUL) | ||
|
||
$(ARTIFACTS_DIR)/%.artifacts: $(PROGRAMS_DIR)/%.yul | ||
zksolc $(ZKSOLC_FLAGS) $< -o $@ --debug-output-dir $@ | ||
compile-programs: clean compile-programs-asm compile-programs-yul | ||
|
||
$(ARTIFACTS_DIR)/%.artifacts.yul: $(PROGRAMS_DIR)/%.yul | ||
zksolc $(ZKSOLC_YUL_FLAGS) $< -o $@ --debug-output-dir $@ | ||
|
||
$(ARTIFACTS_DIR)/%.artifacts.zasm: $(PROGRAMS_DIR)/%.zasm | ||
zksolc $(ZKSOLC_ASM_FLAGS) $< -o $@ --debug-output-dir $@ | ||
|
||
clean: | ||
-rm -rf $(ARTIFACTS_DIR) | ||
|
||
lint: | ||
cargo clippy --workspace --all-features --benches --examples --tests -- -D warnings | ||
test: clean compile-programs | ||
cargo test |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
.text | ||
.file "add.zasm" | ||
.globl __entry | ||
__entry: | ||
.func_begin0: | ||
add 3, r0, r1 | ||
sstore r0, r1 | ||
add r0, r0, r1 | ||
ret | ||
.func_end0: | ||
|
||
.note.GNU-stack | ||
.rodata |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
.text | ||
.file "sub_and_add.zasm" | ||
.globl __entry | ||
__entry: | ||
|
||
.func_begin0: | ||
sub r1, r1, r1 | ||
add 1, r1, r1 | ||
sstore r0, r1 | ||
ret | ||
|
||
.func_end0: | ||
.note.GNU-stack | ||
.rodata |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
.text | ||
.file "sub.zasm" | ||
.globl __entry | ||
__entry: | ||
.func_begin0: | ||
sub 3, r0, r1 | ||
sub 3, r1, r1 | ||
sstore r0, r1 | ||
ret | ||
.func_end0: | ||
.note.GNU-stack | ||
.rodata |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
.text | ||
.file "sub.zasm" | ||
.globl __entry | ||
__entry: | ||
.func_begin0: | ||
sub 3, r0, r1 | ||
sstore r0, r1 | ||
ret | ||
.func_end0: | ||
.note.GNU-stack | ||
.rodata |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,131 @@ | ||
use u256::U256; | ||
use zkevm_opcode_defs::{ImmMemHandlerFlags, Operand, RegOrImmFlags}; | ||
|
||
use crate::{state::VMState, value::TaggedValue, Opcode}; | ||
|
||
fn only_reg_read(vm: &mut VMState, opcode: &Opcode) -> (U256, U256) { | ||
let src0 = vm.get_register(opcode.src0_index); | ||
let src1 = vm.get_register(opcode.src1_index); | ||
(src0, src1) | ||
} | ||
|
||
fn only_imm16_read(vm: &mut VMState, opcode: &Opcode) -> (U256, U256) { | ||
let src1 = vm.get_register(opcode.src1_index); | ||
(U256::from(opcode.imm0), src1) | ||
} | ||
|
||
fn reg_and_imm_read(vm: &mut VMState, opcode: &Opcode) -> (U256, U256) { | ||
let src0 = vm.get_register(opcode.src0_index); | ||
let src1 = vm.get_register(opcode.src1_index); | ||
let offset = opcode.imm0; | ||
|
||
(src0 + U256::from(offset), src1) | ||
} | ||
|
||
pub fn address_operands_read(vm: &mut VMState, opcode: &Opcode) -> (U256, U256) { | ||
match opcode.src0_operand_type { | ||
Operand::RegOnly => only_reg_read(vm, opcode), | ||
Operand::RegOrImm(variant) => match variant { | ||
RegOrImmFlags::UseRegOnly => only_reg_read(vm, opcode), | ||
RegOrImmFlags::UseImm16Only => only_imm16_read(vm, opcode), | ||
}, | ||
Operand::Full(variant) => { | ||
match variant { | ||
ImmMemHandlerFlags::UseRegOnly => only_reg_read(vm, opcode), | ||
ImmMemHandlerFlags::UseStackWithPushPop => { | ||
// stack-=[src0 + offset] + src1 | ||
let (src0, src1) = reg_and_imm_read(vm, opcode); | ||
let res = vm.current_frame.stack[vm.sp() - src0.as_usize()].value; | ||
// TODO: Add push/pop stack | ||
(res, src1) | ||
} | ||
ImmMemHandlerFlags::UseStackWithOffset => { | ||
// stack[src0 + offset] + src1 | ||
let (src0, src1) = reg_and_imm_read(vm, opcode); | ||
|
||
let res = vm.current_frame.stack[vm.sp() - src0.as_usize()].value; | ||
(res, src1) | ||
} | ||
ImmMemHandlerFlags::UseAbsoluteOnStack => { | ||
// stack=[src0 + offset] + src1 | ||
let (src0, src1) = reg_and_imm_read(vm, opcode); | ||
let res = vm.current_frame.stack[src0.as_usize()].value; | ||
(res, src1) | ||
} | ||
ImmMemHandlerFlags::UseImm16Only => only_imm16_read(vm, opcode), | ||
ImmMemHandlerFlags::UseCodePage => { | ||
let (src0, src1) = reg_and_imm_read(vm, opcode); | ||
|
||
let res = vm.current_frame.code_page[src0.as_usize()]; | ||
(res, src1) | ||
} | ||
} | ||
} | ||
} | ||
} | ||
fn only_reg_write(vm: &mut VMState, opcode: &Opcode, res: U256) { | ||
vm.set_register(opcode.dst0_index, res); | ||
} | ||
|
||
fn reg_and_imm_write(vm: &mut VMState, opcode: &Opcode) -> U256 { | ||
let dst0 = vm.get_register(opcode.dst0_index); | ||
let offset = opcode.imm0; | ||
|
||
dst0 + U256::from(offset) | ||
} | ||
|
||
pub fn address_operands_store(vm: &mut VMState, opcode: &Opcode, res: U256) { | ||
match opcode.dst0_operand_type { | ||
Operand::RegOnly => { | ||
only_reg_write(vm, opcode, res); | ||
} | ||
Operand::RegOrImm(variant) => match variant { | ||
RegOrImmFlags::UseRegOnly => { | ||
only_reg_write(vm, opcode, res); | ||
} | ||
RegOrImmFlags::UseImm16Only => { | ||
panic!("dest cannot be imm16 only"); | ||
} | ||
}, | ||
Operand::Full(variant) => { | ||
match variant { | ||
ImmMemHandlerFlags::UseRegOnly => { | ||
only_reg_write(vm, opcode, res); | ||
} | ||
ImmMemHandlerFlags::UseStackWithPushPop => { | ||
// stack-=[src0 + offset] + src1 | ||
let src0 = reg_and_imm_write(vm, opcode); | ||
let sp = vm.sp(); | ||
vm.current_frame.stack[sp - src0.as_usize()] = TaggedValue { | ||
value: res, | ||
is_pointer: false, | ||
}; | ||
// TODO: Add push/pop stack | ||
} | ||
ImmMemHandlerFlags::UseStackWithOffset => { | ||
// stack[src0 + offset] + src1 | ||
let src0 = reg_and_imm_write(vm, opcode); | ||
let sp = vm.sp(); | ||
vm.current_frame.stack[sp - src0.as_usize()] = TaggedValue { | ||
value: res, | ||
is_pointer: false, | ||
}; | ||
} | ||
ImmMemHandlerFlags::UseAbsoluteOnStack => { | ||
// stack=[src0 + offset] + src1 | ||
let src0 = reg_and_imm_write(vm, opcode); | ||
vm.current_frame.stack[src0.as_usize()] = TaggedValue { | ||
value: res, | ||
is_pointer: false, | ||
}; | ||
} | ||
ImmMemHandlerFlags::UseImm16Only => { | ||
panic!("dest cannot be imm16 only"); | ||
} | ||
ImmMemHandlerFlags::UseCodePage => { | ||
panic!("dest cannot be code page"); | ||
} | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,29 +1,21 @@ | ||
use crate::address_operands::{address_operands_read, address_operands_store}; | ||
use crate::{opcode::Opcode, state::VMState}; | ||
use zkevm_opcode_defs::ImmMemHandlerFlags; | ||
use zkevm_opcode_defs::Operand; | ||
|
||
fn _add_reg_only(vm: &mut VMState, opcode: Opcode) { | ||
// src0 + src1 -> dst0 | ||
let src0 = vm.get_register(opcode.src0_index); | ||
let src1 = vm.get_register(opcode.src1_index); | ||
vm.set_register(opcode.dst0_index, src0 + src1); | ||
} | ||
|
||
fn _add_imm16_only(vm: &mut VMState, opcode: Opcode) { | ||
// imm0 + src0 -> dst0 | ||
let src1 = vm.get_register(opcode.src1_index); | ||
vm.set_register(opcode.dst0_index, src1 + opcode.imm0); | ||
} | ||
|
||
pub fn _add(vm: &mut VMState, opcode: Opcode) { | ||
match opcode.src0_operand_type { | ||
Operand::RegOnly => todo!(), | ||
Operand::RegOrImm(_) => todo!(), | ||
Operand::Full(variant) => { | ||
match variant { | ||
ImmMemHandlerFlags::UseRegOnly => { | ||
// src0 + src1 -> dst0 | ||
let src0 = vm.get_register(opcode.src0_index); | ||
let src1 = vm.get_register(opcode.src1_index); | ||
vm.set_register(opcode.dst0_index, src0 + src1); | ||
} | ||
ImmMemHandlerFlags::UseStackWithPushPop => todo!(), | ||
ImmMemHandlerFlags::UseStackWithOffset => todo!(), | ||
ImmMemHandlerFlags::UseAbsoluteOnStack => todo!(), | ||
ImmMemHandlerFlags::UseImm16Only => { | ||
// imm0 + src0 -> dst0 | ||
let src0 = vm.get_register(opcode.src0_index); | ||
vm.set_register(opcode.dst0_index, src0 + opcode.imm0); | ||
} | ||
ImmMemHandlerFlags::UseCodePage => todo!(), | ||
} | ||
} | ||
} | ||
let (src0, src1) = address_operands_read(vm, &opcode); | ||
let res = src0 + src1; | ||
address_operands_store(vm, &opcode, res); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,2 @@ | ||
pub mod add; | ||
pub mod sub; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
use crate::address_operands::{address_operands_read, address_operands_store}; | ||
use crate::{opcode::Opcode, state::VMState}; | ||
|
||
pub fn _sub(vm: &mut VMState, opcode: Opcode) { | ||
let (src0, src1) = address_operands_read(vm, &opcode); | ||
let res = src0 - src1; | ||
address_operands_store(vm, &opcode, res); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.