zkevm_assembly/
lib.rs

1//!
2//! The zkEVM common library.
3//!
4
5#![allow(dead_code)]
6
7#[cfg(test)]
8#[rustfmt::skip]
9mod tests;
10
11pub(crate) mod assembly;
12pub(crate) mod error;
13
14pub use zkevm_opcode_defs;
15pub use zkevm_opcode_defs::ISAVersion;
16
17pub use self::assembly::instruction::add::Add as AddInstruction;
18pub use self::assembly::instruction::bitwise::Bitwise as BitwiseInstruction;
19pub use self::assembly::instruction::context::Context as ContextInstruction;
20pub use self::assembly::instruction::div::Div as DivInstruction;
21pub use self::assembly::instruction::far_call::FarCall as ExternalCallInstruction;
22pub use self::assembly::instruction::jump::Jump as JumpInstruction;
23pub use self::assembly::instruction::mul::Mul as MulInstruction;
24pub use self::assembly::instruction::near_call::NearCall as LocalCallInstruction;
25pub use self::assembly::instruction::nop::Nop as NopInstruction;
26pub use self::assembly::instruction::ret::Ret as ReturnInstruction;
27pub use self::assembly::instruction::shift::Shift as ShiftInstruction;
28pub use self::assembly::instruction::sub::Sub as SubInstruction;
29
30pub use self::assembly::instruction::Instruction;
31pub use self::assembly::operand::FullOperand;
32pub use self::assembly::operand::RegisterOperand;
33pub use self::assembly::Assembly;
34pub use self::error::{AssemblyParseError, BinaryParseError, InstructionReadError};
35
36#[derive(Clone, Copy, Debug, PartialEq, Eq)]
37#[repr(u64)]
38pub enum RunningVmEncodingMode {
39    Production = 0,
40    Testing = 1,
41}
42
43impl RunningVmEncodingMode {
44    pub const fn from_u64(value: u64) -> Self {
45        match value {
46            x if x == Self::Production as u64 => Self::Production,
47            x if x == Self::Testing as u64 => Self::Testing,
48            _ => unreachable!(),
49        }
50    }
51
52    pub const fn as_u64(self) -> u64 {
53        self as u64
54    }
55}
56
57use std::sync::atomic::AtomicU64;
58
59pub static ENCODING_MODE: AtomicU64 = AtomicU64::new(RunningVmEncodingMode::Production as u64);
60
61pub fn set_encoding_mode(value: RunningVmEncodingMode) {
62    ENCODING_MODE.store(value.as_u64(), std::sync::atomic::Ordering::SeqCst);
63}
64
65pub fn get_encoding_mode() -> RunningVmEncodingMode {
66    RunningVmEncodingMode::from_u64(ENCODING_MODE.load(std::sync::atomic::Ordering::Relaxed))
67}
68
69pub const DEFAULT_ISA_VERSION: ISAVersion = ISAVersion(2);
70
71const _: () = if DEFAULT_ISA_VERSION.0 != zkevm_opcode_defs::DEFAULT_ISA_VERSION.0 {
72    panic!()
73} else {
74};
75
76pub static ISA_VERSION_U64: AtomicU64 = AtomicU64::new(DEFAULT_ISA_VERSION.0 as u64);
77
78pub fn set_isa_version(value: ISAVersion) {
79    ISA_VERSION_U64.store(value.0 as u64, std::sync::atomic::Ordering::SeqCst);
80}
81
82pub fn get_isa_version() -> ISAVersion {
83    ISAVersion(ISA_VERSION_U64.load(std::sync::atomic::Ordering::Relaxed) as u8)
84}