pub struct Weight {
ref_time: u64,
proof_size: u64,
}
impl Weight {
pub const fn from_parts(ref_time: u64, proof_size: u64) -> Self {
Self {
ref_time,
proof_size,
}
}
pub const fn ref_time(&self) -> u64 {
self.ref_time
}
pub const fn proof_size(&self) -> u64 {
self.proof_size
}
pub const fn saturating_add(self, rhs: Self) -> Self {
Self {
ref_time: self.ref_time.saturating_add(rhs.ref_time),
proof_size: self.proof_size.saturating_add(rhs.proof_size),
}
}
pub const fn saturating_sub(self, rhs: Self) -> Self {
Self {
ref_time: self.ref_time.saturating_sub(rhs.ref_time),
proof_size: self.proof_size.saturating_sub(rhs.proof_size),
}
}
pub const fn saturating_mul(self, scalar: u64) -> Self {
Self {
ref_time: self.ref_time.saturating_mul(scalar),
proof_size: self.proof_size.saturating_mul(scalar),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct InstructionWeights {
pub version: u32,
pub fallback: u32,
pub i64const: u32,
pub i64load: u32,
pub i64store: u32,
pub select: u32,
pub r#if: u32,
pub br: u32,
pub br_if: u32,
pub br_table: u32,
pub br_table_per_entry: u32,
pub call: u32,
pub call_indirect: u32,
pub call_per_local: u32,
pub local_get: u32,
pub local_set: u32,
pub local_tee: u32,
pub global_get: u32,
pub global_set: u32,
pub memory_size: u32,
pub memory_grow: u32,
pub i64clz: u32,
pub i64ctz: u32,
pub i64popcnt: u32,
pub i64eqz: u32,
pub i64extendsi32: u32,
pub i64extendui32: u32,
pub i32wrapi64: u32,
pub i64eq: u32,
pub i64ne: u32,
pub i64lts: u32,
pub i64ltu: u32,
pub i64gts: u32,
pub i64gtu: u32,
pub i64les: u32,
pub i64leu: u32,
pub i64ges: u32,
pub i64geu: u32,
pub i64add: u32,
pub i64sub: u32,
pub i64mul: u32,
pub i64divs: u32,
pub i64divu: u32,
pub i64rems: u32,
pub i64remu: u32,
pub i64and: u32,
pub i64or: u32,
pub i64xor: u32,
pub i64shl: u32,
pub i64shrs: u32,
pub i64shru: u32,
pub i64rotl: u32,
pub i64rotr: u32,
}
macro_rules! replace_token {
($_in:tt $replacement:tt) => {
$replacement
};
}
macro_rules! call_zero {
($name:ident, $( $arg:expr ),*) => {
InstructionWeights::$name($( replace_token!($arg 0) ),*)
};
}
macro_rules! cost_args {
($name:ident, $( $arg: expr ),+) => {
(InstructionWeights::$name($( $arg ),+).saturating_sub(call_zero!($name, $( $arg ),+)))
}
}
macro_rules! cost_instr_no_params {
($name:ident) => {
cost_args!($name, 1).ref_time() as u32
};
}
macro_rules! cost_instr {
($name:ident, $num_params:expr) => {
cost_instr_no_params!($name)
.saturating_sub((cost_instr_no_params!(instr_i64const) / 2).saturating_mul($num_params))
};
}
impl Default for InstructionWeights {
fn default() -> Self {
Self {
version: 4,
fallback: 0,
i64const: cost_instr!(instr_i64const, 1),
i64load: cost_instr!(instr_i64load, 2),
i64store: cost_instr!(instr_i64store, 2),
select: cost_instr!(instr_select, 4),
r#if: cost_instr!(instr_if, 3),
br: cost_instr!(instr_br, 2),
br_if: cost_instr!(instr_br_if, 3),
br_table: cost_instr!(instr_br_table, 3),
br_table_per_entry: cost_instr!(instr_br_table_per_entry, 0),
call: cost_instr!(instr_call, 2),
call_indirect: cost_instr!(instr_call_indirect, 3),
call_per_local: cost_instr!(instr_call_per_local, 0),
local_get: cost_instr!(instr_local_get, 1),
local_set: cost_instr!(instr_local_set, 1),
local_tee: cost_instr!(instr_local_tee, 2),
global_get: cost_instr!(instr_global_get, 1),
global_set: cost_instr!(instr_global_set, 1),
memory_size: cost_instr!(instr_memory_size, 1),
memory_grow: cost_instr!(instr_memory_grow, 1),
i64clz: cost_instr!(instr_i64clz, 2),
i64ctz: cost_instr!(instr_i64ctz, 2),
i64popcnt: cost_instr!(instr_i64popcnt, 2),
i64eqz: cost_instr!(instr_i64eqz, 2),
i64extendsi32: cost_instr!(instr_i64extendsi32, 2),
i64extendui32: cost_instr!(instr_i64extendui32, 2),
i32wrapi64: cost_instr!(instr_i32wrapi64, 2),
i64eq: cost_instr!(instr_i64eq, 3),
i64ne: cost_instr!(instr_i64ne, 3),
i64lts: cost_instr!(instr_i64lts, 3),
i64ltu: cost_instr!(instr_i64ltu, 3),
i64gts: cost_instr!(instr_i64gts, 3),
i64gtu: cost_instr!(instr_i64gtu, 3),
i64les: cost_instr!(instr_i64les, 3),
i64leu: cost_instr!(instr_i64leu, 3),
i64ges: cost_instr!(instr_i64ges, 3),
i64geu: cost_instr!(instr_i64geu, 3),
i64add: cost_instr!(instr_i64add, 3),
i64sub: cost_instr!(instr_i64sub, 3),
i64mul: cost_instr!(instr_i64mul, 3),
i64divs: cost_instr!(instr_i64divs, 3),
i64divu: cost_instr!(instr_i64divu, 3),
i64rems: cost_instr!(instr_i64rems, 3),
i64remu: cost_instr!(instr_i64remu, 3),
i64and: cost_instr!(instr_i64and, 3),
i64or: cost_instr!(instr_i64or, 3),
i64xor: cost_instr!(instr_i64xor, 3),
i64shl: cost_instr!(instr_i64shl, 3),
i64shrs: cost_instr!(instr_i64shrs, 3),
i64shru: cost_instr!(instr_i64shru, 3),
i64rotl: cost_instr!(instr_i64rotl, 3),
i64rotr: cost_instr!(instr_i64rotr, 3),
}
}
}
pub trait WeightInfo {
fn instr_i64const(r: u32) -> Weight;
fn instr_i64load(r: u32) -> Weight;
fn instr_i64store(r: u32) -> Weight;
fn instr_select(r: u32) -> Weight;
fn instr_if(r: u32) -> Weight;
fn instr_br(r: u32) -> Weight;
fn instr_br_if(r: u32) -> Weight;
fn instr_br_table(r: u32) -> Weight;
fn instr_br_table_per_entry(e: u32) -> Weight;
fn instr_call(r: u32) -> Weight;
fn instr_call_indirect(r: u32) -> Weight;
fn instr_call_per_local(l: u32) -> Weight;
fn instr_local_get(r: u32) -> Weight;
fn instr_local_set(r: u32) -> Weight;
fn instr_local_tee(r: u32) -> Weight;
fn instr_global_get(r: u32) -> Weight;
fn instr_global_set(r: u32) -> Weight;
fn instr_memory_size(r: u32) -> Weight;
fn instr_memory_grow(r: u32) -> Weight;
fn instr_i64clz(r: u32) -> Weight;
fn instr_i64ctz(r: u32) -> Weight;
fn instr_i64popcnt(r: u32) -> Weight;
fn instr_i64eqz(r: u32) -> Weight;
fn instr_i64extendsi32(r: u32) -> Weight;
fn instr_i64extendui32(r: u32) -> Weight;
fn instr_i32wrapi64(r: u32) -> Weight;
fn instr_i64eq(r: u32) -> Weight;
fn instr_i64ne(r: u32) -> Weight;
fn instr_i64lts(r: u32) -> Weight;
fn instr_i64ltu(r: u32) -> Weight;
fn instr_i64gts(r: u32) -> Weight;
fn instr_i64gtu(r: u32) -> Weight;
fn instr_i64les(r: u32) -> Weight;
fn instr_i64leu(r: u32) -> Weight;
fn instr_i64ges(r: u32) -> Weight;
fn instr_i64geu(r: u32) -> Weight;
fn instr_i64add(r: u32) -> Weight;
fn instr_i64sub(r: u32) -> Weight;
fn instr_i64mul(r: u32) -> Weight;
fn instr_i64divs(r: u32) -> Weight;
fn instr_i64divu(r: u32) -> Weight;
fn instr_i64rems(r: u32) -> Weight;
fn instr_i64remu(r: u32) -> Weight;
fn instr_i64and(r: u32) -> Weight;
fn instr_i64or(r: u32) -> Weight;
fn instr_i64xor(r: u32) -> Weight;
fn instr_i64shl(r: u32) -> Weight;
fn instr_i64shrs(r: u32) -> Weight;
fn instr_i64shru(r: u32) -> Weight;
fn instr_i64rotl(r: u32) -> Weight;
fn instr_i64rotr(r: u32) -> Weight;
}
impl WeightInfo for InstructionWeights {
fn instr_i64const(r: u32) -> Weight {
Weight::from_parts(1_583_300, 0)
.saturating_add(Weight::from_parts(2_743, 0).saturating_mul(r.into()))
}
fn instr_i64load(r: u32) -> Weight {
Weight::from_parts(2_279_812, 0)
.saturating_add(Weight::from_parts(6_339, 0).saturating_mul(r.into()))
}
fn instr_i64store(r: u32) -> Weight {
Weight::from_parts(2_274_070, 0)
.saturating_add(Weight::from_parts(6_647, 0).saturating_mul(r.into()))
}
fn instr_select(r: u32) -> Weight {
Weight::from_parts(1_730_388, 0)
.saturating_add(Weight::from_parts(8_918, 0).saturating_mul(r.into()))
}
fn instr_if(r: u32) -> Weight {
Weight::from_parts(1_473_000, 0)
.saturating_add(Weight::from_parts(12_167, 0).saturating_mul(r.into()))
}
fn instr_br(r: u32) -> Weight {
Weight::from_parts(1_490_208, 0)
.saturating_add(Weight::from_parts(6_271, 0).saturating_mul(r.into()))
}
fn instr_br_if(r: u32) -> Weight {
Weight::from_parts(1_584_684, 0)
.saturating_add(Weight::from_parts(8_819, 0).saturating_mul(r.into()))
}
fn instr_br_table(r: u32) -> Weight {
Weight::from_parts(1_501_244, 0)
.saturating_add(Weight::from_parts(12_311, 0).saturating_mul(r.into()))
}
fn instr_br_table_per_entry(e: u32) -> Weight {
Weight::from_parts(1_594_462, 0)
.saturating_add(Weight::from_parts(29, 0).saturating_mul(e.into()))
}
fn instr_call(r: u32) -> Weight {
Weight::from_parts(1_602_036, 0)
.saturating_add(Weight::from_parts(17_082, 0).saturating_mul(r.into()))
}
fn instr_call_indirect(r: u32) -> Weight {
Weight::from_parts(2_069_590, 0)
.saturating_add(Weight::from_parts(24_049, 0).saturating_mul(r.into()))
}
fn instr_call_per_local(l: u32) -> Weight {
Weight::from_parts(1_699_579, 0)
.saturating_add(Weight::from_parts(1_651, 0).saturating_mul(l.into()))
}
fn instr_local_get(r: u32) -> Weight {
Weight::from_parts(3_200_824, 0)
.saturating_add(Weight::from_parts(4_187, 0).saturating_mul(r.into()))
}
fn instr_local_set(r: u32) -> Weight {
Weight::from_parts(3_302_628, 0)
.saturating_add(Weight::from_parts(4_193, 0).saturating_mul(r.into()))
}
fn instr_local_tee(r: u32) -> Weight {
Weight::from_parts(3_359_832, 0)
.saturating_add(Weight::from_parts(4_829, 0).saturating_mul(r.into()))
}
fn instr_global_get(r: u32) -> Weight {
Weight::from_parts(1_899_252, 0)
.saturating_add(Weight::from_parts(8_373, 0).saturating_mul(r.into()))
}
fn instr_global_set(r: u32) -> Weight {
Weight::from_parts(1_892_537, 0)
.saturating_add(Weight::from_parts(9_177, 0).saturating_mul(r.into()))
}
fn instr_memory_size(r: u32) -> Weight {
Weight::from_parts(2_140_940, 0)
.saturating_add(Weight::from_parts(3_926, 0).saturating_mul(r.into()))
}
fn instr_memory_grow(r: u32) -> Weight {
Weight::from_parts(4_481, 0)
.saturating_add(Weight::from_parts(14_765_592, 0).saturating_mul(r.into()))
}
fn instr_i64clz(r: u32) -> Weight {
Weight::from_parts(1_596_467, 0)
.saturating_add(Weight::from_parts(4_251, 0).saturating_mul(r.into()))
}
fn instr_i64ctz(r: u32) -> Weight {
Weight::from_parts(1_569_760, 0)
.saturating_add(Weight::from_parts(4_777, 0).saturating_mul(r.into()))
}
fn instr_i64popcnt(r: u32) -> Weight {
Weight::from_parts(1_642_163, 0)
.saturating_add(Weight::from_parts(4_241, 0).saturating_mul(r.into()))
}
fn instr_i64eqz(r: u32) -> Weight {
Weight::from_parts(1_726_615, 0)
.saturating_add(Weight::from_parts(4_631, 0).saturating_mul(r.into()))
}
fn instr_i64extendsi32(r: u32) -> Weight {
Weight::from_parts(1_620_217, 0)
.saturating_add(Weight::from_parts(4_220, 0).saturating_mul(r.into()))
}
fn instr_i64extendui32(r: u32) -> Weight {
Weight::from_parts(1_611_025, 0)
.saturating_add(Weight::from_parts(4_681, 0).saturating_mul(r.into()))
}
fn instr_i32wrapi64(r: u32) -> Weight {
Weight::from_parts(1_616_506, 0)
.saturating_add(Weight::from_parts(4_247, 0).saturating_mul(r.into()))
}
fn instr_i64eq(r: u32) -> Weight {
Weight::from_parts(1_641_492, 0)
.saturating_add(Weight::from_parts(6_262, 0).saturating_mul(r.into()))
}
fn instr_i64ne(r: u32) -> Weight {
Weight::from_parts(1_673_299, 0)
.saturating_add(Weight::from_parts(5_741, 0).saturating_mul(r.into()))
}
fn instr_i64lts(r: u32) -> Weight {
Weight::from_parts(1_615_167, 0)
.saturating_add(Weight::from_parts(5_767, 0).saturating_mul(r.into()))
}
fn instr_i64ltu(r: u32) -> Weight {
Weight::from_parts(1_687_595, 0)
.saturating_add(Weight::from_parts(6_201, 0).saturating_mul(r.into()))
}
fn instr_i64gts(r: u32) -> Weight {
Weight::from_parts(1_629_044, 0)
.saturating_add(Weight::from_parts(6_318, 0).saturating_mul(r.into()))
}
fn instr_i64gtu(r: u32) -> Weight {
Weight::from_parts(1_660_178, 0)
.saturating_add(Weight::from_parts(5_774, 0).saturating_mul(r.into()))
}
fn instr_i64les(r: u32) -> Weight {
Weight::from_parts(1_619_688, 0)
.saturating_add(Weight::from_parts(5_761, 0).saturating_mul(r.into()))
}
fn instr_i64leu(r: u32) -> Weight {
Weight::from_parts(1_619_756, 0)
.saturating_add(Weight::from_parts(6_248, 0).saturating_mul(r.into()))
}
fn instr_i64ges(r: u32) -> Weight {
Weight::from_parts(1_629_993, 0)
.saturating_add(Weight::from_parts(6_339, 0).saturating_mul(r.into()))
}
fn instr_i64geu(r: u32) -> Weight {
Weight::from_parts(1_605_123, 0)
.saturating_add(Weight::from_parts(5_774, 0).saturating_mul(r.into()))
}
fn instr_i64add(r: u32) -> Weight {
Weight::from_parts(1_699_382, 0)
.saturating_add(Weight::from_parts(5_736, 0).saturating_mul(r.into()))
}
fn instr_i64sub(r: u32) -> Weight {
Weight::from_parts(1_599_038, 0)
.saturating_add(Weight::from_parts(6_325, 0).saturating_mul(r.into()))
}
fn instr_i64mul(r: u32) -> Weight {
Weight::from_parts(1_655_350, 0)
.saturating_add(Weight::from_parts(5_753, 0).saturating_mul(r.into()))
}
fn instr_i64divs(r: u32) -> Weight {
Weight::from_parts(1_710_195, 0)
.saturating_add(Weight::from_parts(6_791, 0).saturating_mul(r.into()))
}
fn instr_i64divu(r: u32) -> Weight {
Weight::from_parts(2_022_275, 0)
.saturating_add(Weight::from_parts(5_864, 0).saturating_mul(r.into()))
}
fn instr_i64rems(r: u32) -> Weight {
Weight::from_parts(1_735_622, 0)
.saturating_add(Weight::from_parts(6_772, 0).saturating_mul(r.into()))
}
fn instr_i64remu(r: u32) -> Weight {
Weight::from_parts(1_636_788, 0)
.saturating_add(Weight::from_parts(5_794, 0).saturating_mul(r.into()))
}
fn instr_i64and(r: u32) -> Weight {
Weight::from_parts(1_703_832, 0)
.saturating_add(Weight::from_parts(6_158, 0).saturating_mul(r.into()))
}
fn instr_i64or(r: u32) -> Weight {
Weight::from_parts(1_653_216, 0)
.saturating_add(Weight::from_parts(5_754, 0).saturating_mul(r.into()))
}
fn instr_i64xor(r: u32) -> Weight {
Weight::from_parts(1_685_121, 0)
.saturating_add(Weight::from_parts(6_309, 0).saturating_mul(r.into()))
}
fn instr_i64shl(r: u32) -> Weight {
Weight::from_parts(1_580_918, 0)
.saturating_add(Weight::from_parts(5_775, 0).saturating_mul(r.into()))
}
fn instr_i64shrs(r: u32) -> Weight {
Weight::from_parts(1_646_493, 0)
.saturating_add(Weight::from_parts(6_237, 0).saturating_mul(r.into()))
}
fn instr_i64shru(r: u32) -> Weight {
Weight::from_parts(1_633_531, 0)
.saturating_add(Weight::from_parts(5_759, 0).saturating_mul(r.into()))
}
fn instr_i64rotl(r: u32) -> Weight {
Weight::from_parts(1_634_023, 0)
.saturating_add(Weight::from_parts(5_771, 0).saturating_mul(r.into()))
}
fn instr_i64rotr(r: u32) -> Weight {
Weight::from_parts(1_627_867, 0)
.saturating_add(Weight::from_parts(6_175, 0).saturating_mul(r.into()))
}
}