From 5cdb8484545d66c090091470a10ae5b427e2524c Mon Sep 17 00:00:00 2001 From: Monica pardeshi Date: Tue, 17 Jan 2023 13:58:54 -0500 Subject: [PATCH 01/11] still need to handle weird stuff --- cranelift/codegen/src/clif_lower.isle | 2 + .../veri/veri_annotation/src/parser.lalrpop | 1 + .../isle/veri/veri_annotation/src/parser.rs | 5970 +++++++++-------- .../veri/veri_engine/examples/sdiv/sdiv.isle | 72 + .../veri_engine/examples/sdiv/sdiv32.isle | 91 + cranelift/isle/veri/veri_engine/src/solver.rs | 2 + .../veri/veri_engine/src/type_inference.rs | 41 +- .../isle/veri/veri_ir/src/annotation_ir.rs | 2 + cranelift/isle/veri/veri_ir/src/lib.rs | 1 + 9 files changed, 3375 insertions(+), 2807 deletions(-) create mode 100644 cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle create mode 100644 cranelift/isle/veri/veri_engine/examples/sdiv/sdiv32.isle diff --git a/cranelift/codegen/src/clif_lower.isle b/cranelift/codegen/src/clif_lower.isle index d8a1434d2dce..b3d5cb4f9713 100644 --- a/cranelift/codegen/src/clif_lower.isle +++ b/cranelift/codegen/src/clif_lower.isle @@ -860,6 +860,8 @@ (inst_data (InstructionData.Binary (Opcode.Udiv) (value_array_2 x y))) ) +;;@ (spec (sig (args x, y) (ret)) +;;@ (assertions (= (sdiv (x) (y)) (ret)))) (decl sdiv (Value Value) Inst) (extractor (sdiv x y) diff --git a/cranelift/isle/veri/veri_annotation/src/parser.lalrpop b/cranelift/isle/veri/veri_annotation/src/parser.lalrpop index 00fe5345e268..fe990d5c2522 100644 --- a/cranelift/isle/veri/veri_annotation/src/parser.lalrpop +++ b/cranelift/isle/veri/veri_annotation/src/parser.lalrpop @@ -99,6 +99,7 @@ pub Expr: Box = { "(" "*" ")" => Box::new(Expr::BVMul(u, v, 0)), "(" "/" ")" => Box::new(Expr::BVUDiv(u, v, 0)), + "(" "sdiv" ")" => Box::new(Expr::BVSDiv(u, v, 0)), "(" "+" ")" => Box::new(Expr::BVAdd(u, v, 0)), "(" "-" ")" => Box::new(Expr::BVSub(u, v, 0)), "(" "&" ")" => Box::new(Expr::BVAnd(u, v, 0)), diff --git a/cranelift/isle/veri/veri_annotation/src/parser.rs b/cranelift/isle/veri/veri_annotation/src/parser.rs index 81743377f4cc..6f85ed4e007a 100644 --- a/cranelift/isle/veri/veri_annotation/src/parser.rs +++ b/cranelift/isle/veri/veri_annotation/src/parser.rs @@ -1,5 +1,5 @@ // auto-generated: "lalrpop 0.19.8" -// sha3: cd6a5ffe658e185aa3f7e92ec71cf987c830a6151817fb09f509be2e5875bd56 +// sha3: 10bbc6ea861a9324d3e1d70ba3a4f7dc5f5932c897d511999483c0d62e538787 use std::str::FromStr; use veri_ir as ast; use ast::annotation_ir::*; @@ -53,34 +53,34 @@ mod __parse__BoundVar { } const __ACTION: &[i8] = &[ // State 0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, // State 1 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 2 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, // State 3 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 4 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 5 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 6 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 7 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 8 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 9 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 10 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 11 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 12 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; fn __action(state: i8, integer: usize) -> i8 { - __ACTION[(state as usize) * 55 + integer] + __ACTION[(state as usize) * 56 + integer] } const __EOF_ACTION: &[i8] = &[ // State 0 @@ -88,27 +88,27 @@ mod __parse__BoundVar { // State 1 0, // State 2 - -87, + -88, // State 3 - -97, + -98, // State 4 -18, // State 5 - -81, - // State 6 -82, - // State 7 + // State 6 -83, + // State 7 + -84, // State 8 -19, // State 9 - -90, + -91, // State 10 - -89, + -90, // State 11 - -88, + -89, // State 12 - -94, + -95, ]; fn __goto(state: i8, nt: usize) -> i8 { match nt { @@ -157,6 +157,7 @@ mod __parse__BoundVar { r###""rev""###, r###""rotl""###, r###""rotr""###, + r###""sdiv""###, r###""shl""###, r###""shr""###, r###""sig""###, @@ -228,7 +229,7 @@ mod __parse__BoundVar { #[inline] fn error_action(&self, state: i8) -> i8 { - __action(state, 55 - 1) + __action(state, 56 - 1) } #[inline] @@ -341,11 +342,12 @@ mod __parse__BoundVar { Token(52, _) if true => Some(47), Token(53, _) if true => Some(48), Token(54, _) if true => Some(49), - Token(0, _) if true => Some(50), - Token(1, _) if true => Some(51), - Token(2, _) if true => Some(52), - Token(3, _) if true => Some(53), - Token(4, _) if true => Some(54), + Token(55, _) if true => Some(50), + Token(0, _) if true => Some(51), + Token(1, _) if true => Some(52), + Token(2, _) if true => Some(53), + Token(3, _) if true => Some(54), + Token(4, _) if true => Some(55), _ => None, } } @@ -358,8 +360,8 @@ mod __parse__BoundVar { ) -> __Symbol<'input> { match __token_index { - 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 => match __token { - Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 => match __token { + Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(55, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), _ => unreachable!(), }, _ => unreachable!(), @@ -698,6 +700,9 @@ mod __parse__BoundVar { __reduce95(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } 96 => { + __reduce96(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } + 97 => { // __BoundVar = BoundVar => ActionFn(1); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); @@ -705,9 +710,6 @@ mod __parse__BoundVar { let __nt = super::__action1::<>(input, __sym0); return Some(Ok(__nt)); } - 97 => { - __reduce97(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) - } 98 => { __reduce98(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } @@ -732,6 +734,9 @@ mod __parse__BoundVar { 105 => { __reduce105(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } + 106 => { + __reduce106(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } _ => panic!("invalid action code {}", __action) }; let __states_len = __states.len(); @@ -1007,13 +1012,13 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = BoundVar, "," => ActionFn(80); + // ( ",") = BoundVar, "," => ActionFn(81); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action80::<>(input, __sym0, __sym1); + let __nt = super::__action81::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (2, 0) } @@ -1026,10 +1031,10 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(78); + // ( ",")* = => ActionFn(79); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action78::<>(input, &__start, &__end); + let __nt = super::__action79::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (0, 1) } @@ -1042,11 +1047,11 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(79); + // ( ",")* = ( ",")+ => ActionFn(80); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action79::<>(input, __sym0); + let __nt = super::__action80::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (1, 1) } @@ -1059,13 +1064,13 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = BoundVar, "," => ActionFn(97); + // ( ",")+ = BoundVar, "," => ActionFn(98); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action97::<>(input, __sym0, __sym1); + let __nt = super::__action98::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (2, 2) } @@ -1078,14 +1083,14 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(98); + // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(99); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action98::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action99::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (3, 2) } @@ -1098,13 +1103,13 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Expr, "," => ActionFn(90); + // ( ",") = Expr, "," => ActionFn(91); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action90::<>(input, __sym0, __sym1); + let __nt = super::__action91::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (2, 3) } @@ -1117,10 +1122,10 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(88); + // ( ",")* = => ActionFn(89); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action88::<>(input, &__start, &__end); + let __nt = super::__action89::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (0, 4) } @@ -1133,11 +1138,11 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(89); + // ( ",")* = ( ",")+ => ActionFn(90); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action89::<>(input, __sym0); + let __nt = super::__action90::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (1, 4) } @@ -1150,13 +1155,13 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Expr, "," => ActionFn(101); + // ( ",")+ = Expr, "," => ActionFn(102); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action101::<>(input, __sym0, __sym1); + let __nt = super::__action102::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (2, 5) } @@ -1169,14 +1174,14 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Expr, "," => ActionFn(102); + // ( ",")+ = ( ",")+, Expr, "," => ActionFn(103); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action102::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action103::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (3, 5) } @@ -1189,13 +1194,13 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Type, "," => ActionFn(85); + // ( ",") = Type, "," => ActionFn(86); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action85::<>(input, __sym0, __sym1); + let __nt = super::__action86::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 6) } @@ -1208,10 +1213,10 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(83); + // ( ",")* = => ActionFn(84); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action83::<>(input, &__start, &__end); + let __nt = super::__action84::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (0, 7) } @@ -1224,11 +1229,11 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(84); + // ( ",")* = ( ",")+ => ActionFn(85); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action84::<>(input, __sym0); + let __nt = super::__action85::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (1, 7) } @@ -1241,13 +1246,13 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Type, "," => ActionFn(105); + // ( ",")+ = Type, "," => ActionFn(106); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action105::<>(input, __sym0, __sym1); + let __nt = super::__action106::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (2, 8) } @@ -1260,14 +1265,14 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Type, "," => ActionFn(106); + // ( ",")+ = ( ",")+, Type, "," => ActionFn(107); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action106::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action107::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (3, 8) } @@ -1354,11 +1359,11 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = BoundVar => ActionFn(76); + // BoundVar? = BoundVar => ActionFn(77); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action76::<>(input, __sym0); + let __nt = super::__action77::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (1, 12) } @@ -1371,10 +1376,10 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = => ActionFn(77); + // BoundVar? = => ActionFn(78); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action77::<>(input, &__start, &__end); + let __nt = super::__action78::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (0, 12) } @@ -1387,11 +1392,11 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = BoundVar => ActionFn(109); + // Comma = BoundVar => ActionFn(110); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action109::<>(input, __sym0); + let __nt = super::__action110::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -1404,10 +1409,10 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(110); + // Comma = => ActionFn(111); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action110::<>(input, &__start, &__end); + let __nt = super::__action111::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (0, 13) } @@ -1420,13 +1425,13 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, BoundVar => ActionFn(111); + // Comma = ( ",")+, BoundVar => ActionFn(112); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action111::<>(input, __sym0, __sym1); + let __nt = super::__action112::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (2, 13) } @@ -1439,11 +1444,11 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(112); + // Comma = ( ",")+ => ActionFn(113); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action112::<>(input, __sym0); + let __nt = super::__action113::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -1456,11 +1461,11 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Expr => ActionFn(113); + // Comma = Expr => ActionFn(114); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action113::<>(input, __sym0); + let __nt = super::__action114::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -1473,10 +1478,10 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(114); + // Comma = => ActionFn(115); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action114::<>(input, &__start, &__end); + let __nt = super::__action115::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (0, 14) } @@ -1489,13 +1494,13 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Expr => ActionFn(115); + // Comma = ( ",")+, Expr => ActionFn(116); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action115::<>(input, __sym0, __sym1); + let __nt = super::__action116::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (2, 14) } @@ -1508,11 +1513,11 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(116); + // Comma = ( ",")+ => ActionFn(117); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action116::<>(input, __sym0); + let __nt = super::__action117::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -1525,11 +1530,11 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Type => ActionFn(117); + // Comma = Type => ActionFn(118); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action117::<>(input, __sym0); + let __nt = super::__action118::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -1542,10 +1547,10 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(118); + // Comma = => ActionFn(119); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action118::<>(input, &__start, &__end); + let __nt = super::__action119::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (0, 15) } @@ -1558,13 +1563,13 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Type => ActionFn(119); + // Comma = ( ",")+, Type => ActionFn(120); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action119::<>(input, __sym0, __sym1); + let __nt = super::__action120::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (2, 15) } @@ -1577,11 +1582,11 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(120); + // Comma = ( ",")+ => ActionFn(121); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action120::<>(input, __sym0); + let __nt = super::__action121::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -2041,7 +2046,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "+", Expr, Expr, ")" => ActionFn(52); + // Expr = "(", "sdiv", Expr, Expr, ")" => ActionFn(52); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -2063,7 +2068,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "-", Expr, Expr, ")" => ActionFn(53); + // Expr = "(", "+", Expr, Expr, ")" => ActionFn(53); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -2085,7 +2090,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "&", Expr, Expr, ")" => ActionFn(54); + // Expr = "(", "-", Expr, Expr, ")" => ActionFn(54); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -2107,7 +2112,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "|", Expr, Expr, ")" => ActionFn(55); + // Expr = "(", "&", Expr, Expr, ")" => ActionFn(55); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -2129,7 +2134,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(56); + // Expr = "(", "|", Expr, Expr, ")" => ActionFn(56); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -2151,7 +2156,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(57); + // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(57); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -2173,7 +2178,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(58); + // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(58); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -2195,7 +2200,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(59); + // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(59); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -2217,7 +2222,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(60); + // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(60); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -2239,11 +2244,11 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(61); + // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(61); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -2261,11 +2266,11 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(62); + // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(62); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -2283,11 +2288,11 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(63); + // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(63); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -2305,11 +2310,11 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(64); + // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(64); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -2327,7 +2332,29 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(65); + // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(65); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant3(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym4.2.clone(); + let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant3(__nt), __end)); + (5, 17) + } + pub(crate) fn __reduce68< + 'input, + >( + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: core::marker::PhantomData<(&'input ())>, + ) -> (usize, usize) + { + // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(66); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant3(__symbols); @@ -2337,11 +2364,11 @@ mod __parse__BoundVar { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym5.2.clone(); - let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (6, 17) } - pub(crate) fn __reduce68< + pub(crate) fn __reduce69< 'input, >( input: &'input str, @@ -2350,7 +2377,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(66); + // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(67); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -2359,11 +2386,11 @@ mod __parse__BoundVar { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce69< + pub(crate) fn __reduce70< 'input, >( input: &'input str, @@ -2372,7 +2399,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(67); + // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(68); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -2381,11 +2408,11 @@ mod __parse__BoundVar { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce70< + pub(crate) fn __reduce71< 'input, >( input: &'input str, @@ -2394,7 +2421,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(68); + // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(69); assert!(__symbols.len() >= 11); let __sym10 = __pop_Variant0(__symbols); let __sym9 = __pop_Variant0(__symbols); @@ -2409,11 +2436,11 @@ mod __parse__BoundVar { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym10.2.clone(); - let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); + let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (11, 17) } - pub(crate) fn __reduce71< + pub(crate) fn __reduce72< 'input, >( input: &'input str, @@ -2422,7 +2449,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(69); + // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(70); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -2431,11 +2458,11 @@ mod __parse__BoundVar { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce72< + pub(crate) fn __reduce73< 'input, >( input: &'input str, @@ -2444,7 +2471,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "bv2int", Expr, ")" => ActionFn(70); + // Expr = "(", "bv2int", Expr, ")" => ActionFn(71); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -2452,11 +2479,11 @@ mod __parse__BoundVar { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce73< + pub(crate) fn __reduce74< 'input, >( input: &'input str, @@ -2465,7 +2492,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "widthof", Expr, ")" => ActionFn(71); + // Expr = "(", "widthof", Expr, ")" => ActionFn(72); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -2473,11 +2500,11 @@ mod __parse__BoundVar { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce74< + pub(crate) fn __reduce75< 'input, >( input: &'input str, @@ -2486,15 +2513,15 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = Expr => ActionFn(86); + // Expr? = Expr => ActionFn(87); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action86::<>(input, __sym0); + let __nt = super::__action87::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (1, 18) } - pub(crate) fn __reduce75< + pub(crate) fn __reduce76< 'input, >( input: &'input str, @@ -2503,14 +2530,14 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = => ActionFn(87); + // Expr? = => ActionFn(88); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action87::<>(input, &__start, &__end); + let __nt = super::__action88::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (0, 18) } - pub(crate) fn __reduce76< + pub(crate) fn __reduce77< 'input, >( input: &'input str, @@ -2527,7 +2554,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 19) } - pub(crate) fn __reduce77< + pub(crate) fn __reduce78< 'input, >( input: &'input str, @@ -2554,7 +2581,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (10, 20) } - pub(crate) fn __reduce78< + pub(crate) fn __reduce79< 'input, >( input: &'input str, @@ -2575,7 +2602,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (4, 21) } - pub(crate) fn __reduce79< + pub(crate) fn __reduce80< 'input, >( input: &'input str, @@ -2599,7 +2626,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (7, 22) } - pub(crate) fn __reduce80< + pub(crate) fn __reduce81< 'input, >( input: &'input str, @@ -2616,7 +2643,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce81< + pub(crate) fn __reduce82< 'input, >( input: &'input str, @@ -2633,7 +2660,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce82< + pub(crate) fn __reduce83< 'input, >( input: &'input str, @@ -2650,7 +2677,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce83< + pub(crate) fn __reduce84< 'input, >( input: &'input str, @@ -2667,7 +2694,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant17(__nt), __end)); (1, 24) } - pub(crate) fn __reduce84< + pub(crate) fn __reduce85< 'input, >( input: &'input str, @@ -2676,7 +2703,7 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(72); + // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(73); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -2688,11 +2715,11 @@ mod __parse__BoundVar { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym7.2.clone(); - let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action73::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (8, 25) } - pub(crate) fn __reduce85< + pub(crate) fn __reduce86< 'input, >( input: &'input str, @@ -2716,7 +2743,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (7, 26) } - pub(crate) fn __reduce86< + pub(crate) fn __reduce87< 'input, >( input: &'input str, @@ -2733,7 +2760,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce87< + pub(crate) fn __reduce88< 'input, >( input: &'input str, @@ -2752,7 +2779,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 27) } - pub(crate) fn __reduce88< + pub(crate) fn __reduce89< 'input, >( input: &'input str, @@ -2769,7 +2796,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce89< + pub(crate) fn __reduce90< 'input, >( input: &'input str, @@ -2786,7 +2813,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce90< + pub(crate) fn __reduce91< 'input, >( input: &'input str, @@ -2795,15 +2822,15 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = Type => ActionFn(81); + // Type? = Type => ActionFn(82); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action81::<>(input, __sym0); + let __nt = super::__action82::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (1, 28) } - pub(crate) fn __reduce91< + pub(crate) fn __reduce92< 'input, >( input: &'input str, @@ -2812,14 +2839,14 @@ mod __parse__BoundVar { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = => ActionFn(82); + // Type? = => ActionFn(83); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action82::<>(input, &__start, &__end); + let __nt = super::__action83::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (0, 28) } - pub(crate) fn __reduce92< + pub(crate) fn __reduce93< 'input, >( input: &'input str, @@ -2836,7 +2863,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 29) } - pub(crate) fn __reduce93< + pub(crate) fn __reduce94< 'input, >( input: &'input str, @@ -2853,7 +2880,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant21(__nt), __end)); (1, 30) } - pub(crate) fn __reduce94< + pub(crate) fn __reduce95< 'input, >( input: &'input str, @@ -2873,7 +2900,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce95< + pub(crate) fn __reduce96< 'input, >( input: &'input str, @@ -2893,7 +2920,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce97< + pub(crate) fn __reduce98< 'input, >( input: &'input str, @@ -2910,7 +2937,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (1, 33) } - pub(crate) fn __reduce98< + pub(crate) fn __reduce99< 'input, >( input: &'input str, @@ -2927,7 +2954,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (1, 34) } - pub(crate) fn __reduce99< + pub(crate) fn __reduce100< 'input, >( input: &'input str, @@ -2944,7 +2971,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (1, 35) } - pub(crate) fn __reduce100< + pub(crate) fn __reduce101< 'input, >( input: &'input str, @@ -2961,7 +2988,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (1, 36) } - pub(crate) fn __reduce101< + pub(crate) fn __reduce102< 'input, >( input: &'input str, @@ -2978,7 +3005,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (1, 37) } - pub(crate) fn __reduce102< + pub(crate) fn __reduce103< 'input, >( input: &'input str, @@ -2995,7 +3022,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (1, 38) } - pub(crate) fn __reduce103< + pub(crate) fn __reduce104< 'input, >( input: &'input str, @@ -3012,7 +3039,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (1, 39) } - pub(crate) fn __reduce104< + pub(crate) fn __reduce105< 'input, >( input: &'input str, @@ -3029,7 +3056,7 @@ mod __parse__BoundVar { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 40) } - pub(crate) fn __reduce105< + pub(crate) fn __reduce106< 'input, >( input: &'input str, @@ -3092,32 +3119,32 @@ mod __parse__Const { } const __ACTION: &[i8] = &[ // State 0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, // State 1 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, // State 2 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 3 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, // State 4 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 5 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -84, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -85, 0, 0, 0, // State 6 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 7 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 8 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 9 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 10 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 11 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; fn __action(state: i8, integer: usize) -> i8 { - __ACTION[(state as usize) * 55 + integer] + __ACTION[(state as usize) * 56 + integer] } const __EOF_ACTION: &[i8] = &[ // State 0 @@ -3127,23 +3154,23 @@ mod __parse__Const { // State 2 0, // State 3 - -87, + -88, // State 4 - -98, + -99, // State 5 0, // State 6 0, // State 7 - -94, + -95, // State 8 -34, // State 9 - -90, + -91, // State 10 - -89, + -90, // State 11 - -88, + -89, ]; fn __goto(state: i8, nt: usize) -> i8 { match nt { @@ -3195,6 +3222,7 @@ mod __parse__Const { r###""rev""###, r###""rotl""###, r###""rotr""###, + r###""sdiv""###, r###""shl""###, r###""shr""###, r###""sig""###, @@ -3266,7 +3294,7 @@ mod __parse__Const { #[inline] fn error_action(&self, state: i8) -> i8 { - __action(state, 55 - 1) + __action(state, 56 - 1) } #[inline] @@ -3379,11 +3407,12 @@ mod __parse__Const { Token(52, _) if true => Some(47), Token(53, _) if true => Some(48), Token(54, _) if true => Some(49), - Token(0, _) if true => Some(50), - Token(1, _) if true => Some(51), - Token(2, _) if true => Some(52), - Token(3, _) if true => Some(53), - Token(4, _) if true => Some(54), + Token(55, _) if true => Some(50), + Token(0, _) if true => Some(51), + Token(1, _) if true => Some(52), + Token(2, _) if true => Some(53), + Token(3, _) if true => Some(54), + Token(4, _) if true => Some(55), _ => None, } } @@ -3396,8 +3425,8 @@ mod __parse__Const { ) -> __Symbol<'input> { match __token_index { - 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 => match __token { - Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 => match __token { + Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(55, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), _ => unreachable!(), }, _ => unreachable!(), @@ -3739,6 +3768,9 @@ mod __parse__Const { __reduce96(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } 97 => { + __reduce97(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } + 98 => { // __Const = Const => ActionFn(4); let __sym0 = __pop_Variant11(__symbols); let __start = __sym0.0.clone(); @@ -3746,9 +3778,6 @@ mod __parse__Const { let __nt = super::__action4::<>(input, __sym0); return Some(Ok(__nt)); } - 98 => { - __reduce98(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) - } 99 => { __reduce99(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } @@ -3770,6 +3799,9 @@ mod __parse__Const { 105 => { __reduce105(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } + 106 => { + __reduce106(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } _ => panic!("invalid action code {}", __action) }; let __states_len = __states.len(); @@ -4045,13 +4077,13 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = BoundVar, "," => ActionFn(80); + // ( ",") = BoundVar, "," => ActionFn(81); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action80::<>(input, __sym0, __sym1); + let __nt = super::__action81::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (2, 0) } @@ -4064,10 +4096,10 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(78); + // ( ",")* = => ActionFn(79); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action78::<>(input, &__start, &__end); + let __nt = super::__action79::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (0, 1) } @@ -4080,11 +4112,11 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(79); + // ( ",")* = ( ",")+ => ActionFn(80); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action79::<>(input, __sym0); + let __nt = super::__action80::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (1, 1) } @@ -4097,13 +4129,13 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = BoundVar, "," => ActionFn(97); + // ( ",")+ = BoundVar, "," => ActionFn(98); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action97::<>(input, __sym0, __sym1); + let __nt = super::__action98::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (2, 2) } @@ -4116,14 +4148,14 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(98); + // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(99); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action98::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action99::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (3, 2) } @@ -4136,13 +4168,13 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Expr, "," => ActionFn(90); + // ( ",") = Expr, "," => ActionFn(91); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action90::<>(input, __sym0, __sym1); + let __nt = super::__action91::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (2, 3) } @@ -4155,10 +4187,10 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(88); + // ( ",")* = => ActionFn(89); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action88::<>(input, &__start, &__end); + let __nt = super::__action89::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (0, 4) } @@ -4171,11 +4203,11 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(89); + // ( ",")* = ( ",")+ => ActionFn(90); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action89::<>(input, __sym0); + let __nt = super::__action90::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (1, 4) } @@ -4188,13 +4220,13 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Expr, "," => ActionFn(101); + // ( ",")+ = Expr, "," => ActionFn(102); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action101::<>(input, __sym0, __sym1); + let __nt = super::__action102::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (2, 5) } @@ -4207,14 +4239,14 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Expr, "," => ActionFn(102); + // ( ",")+ = ( ",")+, Expr, "," => ActionFn(103); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action102::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action103::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (3, 5) } @@ -4227,13 +4259,13 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Type, "," => ActionFn(85); + // ( ",") = Type, "," => ActionFn(86); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action85::<>(input, __sym0, __sym1); + let __nt = super::__action86::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 6) } @@ -4246,10 +4278,10 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(83); + // ( ",")* = => ActionFn(84); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action83::<>(input, &__start, &__end); + let __nt = super::__action84::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (0, 7) } @@ -4262,11 +4294,11 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(84); + // ( ",")* = ( ",")+ => ActionFn(85); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action84::<>(input, __sym0); + let __nt = super::__action85::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (1, 7) } @@ -4279,13 +4311,13 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Type, "," => ActionFn(105); + // ( ",")+ = Type, "," => ActionFn(106); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action105::<>(input, __sym0, __sym1); + let __nt = super::__action106::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (2, 8) } @@ -4298,14 +4330,14 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Type, "," => ActionFn(106); + // ( ",")+ = ( ",")+, Type, "," => ActionFn(107); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action106::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action107::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (3, 8) } @@ -4392,11 +4424,11 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = BoundVar => ActionFn(76); + // BoundVar? = BoundVar => ActionFn(77); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action76::<>(input, __sym0); + let __nt = super::__action77::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (1, 12) } @@ -4409,10 +4441,10 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = => ActionFn(77); + // BoundVar? = => ActionFn(78); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action77::<>(input, &__start, &__end); + let __nt = super::__action78::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (0, 12) } @@ -4425,11 +4457,11 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = BoundVar => ActionFn(109); + // Comma = BoundVar => ActionFn(110); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action109::<>(input, __sym0); + let __nt = super::__action110::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -4442,10 +4474,10 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(110); + // Comma = => ActionFn(111); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action110::<>(input, &__start, &__end); + let __nt = super::__action111::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (0, 13) } @@ -4458,13 +4490,13 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, BoundVar => ActionFn(111); + // Comma = ( ",")+, BoundVar => ActionFn(112); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action111::<>(input, __sym0, __sym1); + let __nt = super::__action112::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (2, 13) } @@ -4477,11 +4509,11 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(112); + // Comma = ( ",")+ => ActionFn(113); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action112::<>(input, __sym0); + let __nt = super::__action113::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -4494,11 +4526,11 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Expr => ActionFn(113); + // Comma = Expr => ActionFn(114); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action113::<>(input, __sym0); + let __nt = super::__action114::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -4511,10 +4543,10 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(114); + // Comma = => ActionFn(115); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action114::<>(input, &__start, &__end); + let __nt = super::__action115::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (0, 14) } @@ -4527,13 +4559,13 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Expr => ActionFn(115); + // Comma = ( ",")+, Expr => ActionFn(116); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action115::<>(input, __sym0, __sym1); + let __nt = super::__action116::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (2, 14) } @@ -4546,11 +4578,11 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(116); + // Comma = ( ",")+ => ActionFn(117); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action116::<>(input, __sym0); + let __nt = super::__action117::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -4563,11 +4595,11 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Type => ActionFn(117); + // Comma = Type => ActionFn(118); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action117::<>(input, __sym0); + let __nt = super::__action118::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -4580,10 +4612,10 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(118); + // Comma = => ActionFn(119); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action118::<>(input, &__start, &__end); + let __nt = super::__action119::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (0, 15) } @@ -4596,13 +4628,13 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Type => ActionFn(119); + // Comma = ( ",")+, Type => ActionFn(120); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action119::<>(input, __sym0, __sym1); + let __nt = super::__action120::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (2, 15) } @@ -4615,11 +4647,11 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(120); + // Comma = ( ",")+ => ActionFn(121); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action120::<>(input, __sym0); + let __nt = super::__action121::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -5079,7 +5111,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "+", Expr, Expr, ")" => ActionFn(52); + // Expr = "(", "sdiv", Expr, Expr, ")" => ActionFn(52); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -5101,7 +5133,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "-", Expr, Expr, ")" => ActionFn(53); + // Expr = "(", "+", Expr, Expr, ")" => ActionFn(53); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -5123,7 +5155,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "&", Expr, Expr, ")" => ActionFn(54); + // Expr = "(", "-", Expr, Expr, ")" => ActionFn(54); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -5145,7 +5177,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "|", Expr, Expr, ")" => ActionFn(55); + // Expr = "(", "&", Expr, Expr, ")" => ActionFn(55); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -5167,7 +5199,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(56); + // Expr = "(", "|", Expr, Expr, ")" => ActionFn(56); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -5189,7 +5221,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(57); + // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(57); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -5211,7 +5243,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(58); + // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(58); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -5233,7 +5265,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(59); + // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(59); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -5255,7 +5287,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(60); + // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(60); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -5277,11 +5309,11 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(61); + // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(61); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -5299,11 +5331,11 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(62); + // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(62); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -5321,11 +5353,11 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(63); + // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(63); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -5343,11 +5375,11 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(64); + // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(64); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -5365,7 +5397,29 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(65); + // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(65); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant3(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym4.2.clone(); + let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant3(__nt), __end)); + (5, 17) + } + pub(crate) fn __reduce68< + 'input, + >( + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: core::marker::PhantomData<(&'input ())>, + ) -> (usize, usize) + { + // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(66); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant3(__symbols); @@ -5375,11 +5429,11 @@ mod __parse__Const { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym5.2.clone(); - let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (6, 17) } - pub(crate) fn __reduce68< + pub(crate) fn __reduce69< 'input, >( input: &'input str, @@ -5388,7 +5442,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(66); + // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(67); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -5397,11 +5451,11 @@ mod __parse__Const { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce69< + pub(crate) fn __reduce70< 'input, >( input: &'input str, @@ -5410,7 +5464,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(67); + // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(68); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -5419,11 +5473,11 @@ mod __parse__Const { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce70< + pub(crate) fn __reduce71< 'input, >( input: &'input str, @@ -5432,7 +5486,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(68); + // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(69); assert!(__symbols.len() >= 11); let __sym10 = __pop_Variant0(__symbols); let __sym9 = __pop_Variant0(__symbols); @@ -5447,11 +5501,11 @@ mod __parse__Const { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym10.2.clone(); - let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); + let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (11, 17) } - pub(crate) fn __reduce71< + pub(crate) fn __reduce72< 'input, >( input: &'input str, @@ -5460,7 +5514,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(69); + // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(70); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -5469,11 +5523,11 @@ mod __parse__Const { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce72< + pub(crate) fn __reduce73< 'input, >( input: &'input str, @@ -5482,7 +5536,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "bv2int", Expr, ")" => ActionFn(70); + // Expr = "(", "bv2int", Expr, ")" => ActionFn(71); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -5490,11 +5544,11 @@ mod __parse__Const { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce73< + pub(crate) fn __reduce74< 'input, >( input: &'input str, @@ -5503,7 +5557,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "widthof", Expr, ")" => ActionFn(71); + // Expr = "(", "widthof", Expr, ")" => ActionFn(72); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -5511,11 +5565,11 @@ mod __parse__Const { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce74< + pub(crate) fn __reduce75< 'input, >( input: &'input str, @@ -5524,15 +5578,15 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = Expr => ActionFn(86); + // Expr? = Expr => ActionFn(87); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action86::<>(input, __sym0); + let __nt = super::__action87::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (1, 18) } - pub(crate) fn __reduce75< + pub(crate) fn __reduce76< 'input, >( input: &'input str, @@ -5541,14 +5595,14 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = => ActionFn(87); + // Expr? = => ActionFn(88); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action87::<>(input, &__start, &__end); + let __nt = super::__action88::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (0, 18) } - pub(crate) fn __reduce76< + pub(crate) fn __reduce77< 'input, >( input: &'input str, @@ -5565,7 +5619,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 19) } - pub(crate) fn __reduce77< + pub(crate) fn __reduce78< 'input, >( input: &'input str, @@ -5592,7 +5646,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (10, 20) } - pub(crate) fn __reduce78< + pub(crate) fn __reduce79< 'input, >( input: &'input str, @@ -5613,7 +5667,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (4, 21) } - pub(crate) fn __reduce79< + pub(crate) fn __reduce80< 'input, >( input: &'input str, @@ -5637,7 +5691,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (7, 22) } - pub(crate) fn __reduce80< + pub(crate) fn __reduce81< 'input, >( input: &'input str, @@ -5654,7 +5708,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce81< + pub(crate) fn __reduce82< 'input, >( input: &'input str, @@ -5671,7 +5725,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce82< + pub(crate) fn __reduce83< 'input, >( input: &'input str, @@ -5688,7 +5742,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce83< + pub(crate) fn __reduce84< 'input, >( input: &'input str, @@ -5705,7 +5759,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant17(__nt), __end)); (1, 24) } - pub(crate) fn __reduce84< + pub(crate) fn __reduce85< 'input, >( input: &'input str, @@ -5714,7 +5768,7 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(72); + // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(73); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -5726,11 +5780,11 @@ mod __parse__Const { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym7.2.clone(); - let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action73::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (8, 25) } - pub(crate) fn __reduce85< + pub(crate) fn __reduce86< 'input, >( input: &'input str, @@ -5754,7 +5808,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (7, 26) } - pub(crate) fn __reduce86< + pub(crate) fn __reduce87< 'input, >( input: &'input str, @@ -5771,7 +5825,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce87< + pub(crate) fn __reduce88< 'input, >( input: &'input str, @@ -5790,7 +5844,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 27) } - pub(crate) fn __reduce88< + pub(crate) fn __reduce89< 'input, >( input: &'input str, @@ -5807,7 +5861,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce89< + pub(crate) fn __reduce90< 'input, >( input: &'input str, @@ -5824,7 +5878,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce90< + pub(crate) fn __reduce91< 'input, >( input: &'input str, @@ -5833,15 +5887,15 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = Type => ActionFn(81); + // Type? = Type => ActionFn(82); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action81::<>(input, __sym0); + let __nt = super::__action82::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (1, 28) } - pub(crate) fn __reduce91< + pub(crate) fn __reduce92< 'input, >( input: &'input str, @@ -5850,14 +5904,14 @@ mod __parse__Const { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = => ActionFn(82); + // Type? = => ActionFn(83); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action82::<>(input, &__start, &__end); + let __nt = super::__action83::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (0, 28) } - pub(crate) fn __reduce92< + pub(crate) fn __reduce93< 'input, >( input: &'input str, @@ -5874,7 +5928,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 29) } - pub(crate) fn __reduce93< + pub(crate) fn __reduce94< 'input, >( input: &'input str, @@ -5891,7 +5945,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant21(__nt), __end)); (1, 30) } - pub(crate) fn __reduce94< + pub(crate) fn __reduce95< 'input, >( input: &'input str, @@ -5911,7 +5965,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce95< + pub(crate) fn __reduce96< 'input, >( input: &'input str, @@ -5931,7 +5985,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce96< + pub(crate) fn __reduce97< 'input, >( input: &'input str, @@ -5948,7 +6002,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (1, 32) } - pub(crate) fn __reduce98< + pub(crate) fn __reduce99< 'input, >( input: &'input str, @@ -5965,7 +6019,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (1, 34) } - pub(crate) fn __reduce99< + pub(crate) fn __reduce100< 'input, >( input: &'input str, @@ -5982,7 +6036,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (1, 35) } - pub(crate) fn __reduce100< + pub(crate) fn __reduce101< 'input, >( input: &'input str, @@ -5999,7 +6053,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (1, 36) } - pub(crate) fn __reduce101< + pub(crate) fn __reduce102< 'input, >( input: &'input str, @@ -6016,7 +6070,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (1, 37) } - pub(crate) fn __reduce102< + pub(crate) fn __reduce103< 'input, >( input: &'input str, @@ -6033,7 +6087,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (1, 38) } - pub(crate) fn __reduce103< + pub(crate) fn __reduce104< 'input, >( input: &'input str, @@ -6050,7 +6104,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (1, 39) } - pub(crate) fn __reduce104< + pub(crate) fn __reduce105< 'input, >( input: &'input str, @@ -6067,7 +6121,7 @@ mod __parse__Const { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 40) } - pub(crate) fn __reduce105< + pub(crate) fn __reduce106< 'input, >( input: &'input str, @@ -6130,342 +6184,350 @@ mod __parse__Expr { } const __ACTION: &[i16] = &[ // State 0 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1 - 4, 5, 6, 0, 0, 0, 7, 8, 0, 9, 10, 0, 11, 12, 13, 14, 15, 16, 0, 0, 0, 17, 18, 19, 20, 0, 21, 72, 0, 22, 23, 0, 0, 24, 25, 26, 27, 28, 0, 29, 0, 73, 30, 31, 32, 0, 33, 34, 0, 35, 74, 0, 75, 76, 77, + 4, 5, 6, 0, 0, 0, 7, 8, 0, 9, 10, 0, 11, 12, 13, 14, 15, 16, 0, 0, 0, 17, 18, 19, 20, 0, 21, 74, 0, 22, 23, 0, 0, 24, 25, 26, 27, 28, 29, 0, 30, 0, 75, 31, 32, 33, 0, 34, 35, 0, 36, 76, 0, 77, 78, 79, // State 2 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, // State 3 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 4 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 5 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 6 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 7 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 8 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 9 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 10 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 11 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 12 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 13 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 14 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 15 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 16 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 17 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 18 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 19 - 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 20 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, // State 21 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 22 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, // State 23 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 24 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 25 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 26 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 27 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 28 - 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 29 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 30 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 31 - 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 32 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 33 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 34 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 35 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 36 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 37 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 38 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 39 - 0, 0, 0, 2, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 40 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 41 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 42 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 43 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 44 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 45 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 46 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 47 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 48 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 49 - 4, 5, 6, 0, 0, 0, 7, 8, 0, 9, 10, 0, 11, 12, 13, 14, 15, 16, 0, 0, 0, 17, 18, 19, 20, 0, 21, 72, 0, 22, 23, 0, 112, 24, 25, 26, 27, 28, 0, 29, 0, 73, 30, 31, 32, 0, 33, 34, 0, 35, 74, 81, 75, 76, 77, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 50 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, + 4, 5, 6, 0, 0, 0, 7, 8, 0, 9, 10, 0, 11, 12, 13, 14, 15, 16, 0, 0, 0, 17, 18, 19, 20, 0, 21, 74, 0, 22, 23, 0, 114, 24, 25, 26, 27, 28, 29, 0, 30, 0, 75, 31, 32, 33, 0, 34, 35, 0, 36, 76, 83, 77, 78, 79, // State 51 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, // State 52 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 53 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 54 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 55 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 56 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 57 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 58 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 59 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 60 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 61 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 62 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 63 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 64 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 65 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 66 - 0, 0, 0, 0, 0, -87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 67 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 68 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, // State 69 - 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 70 - 0, 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 71 - 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 72 - 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 73 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -84, 0, 0, 0, + 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 74 - 0, 0, 0, 0, 0, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 75 - 0, 0, 0, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -85, 0, 0, 0, // State 76 - 0, 0, 0, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 77 - 0, 0, 0, -36, 0, -36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -36, 0, 0, -36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 78 - 0, 0, 0, -35, 0, -35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -35, 0, 0, -35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 79 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -36, 0, -36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -36, 0, 0, -36, 0, 0, 0, 0, 0, 0, // State 80 - 0, 0, 0, -94, 0, -94, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, 0, + 0, 0, 0, -35, 0, -35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -35, 0, 0, -35, 0, 0, 0, 0, 0, 0, // State 81 - 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 82 - 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -95, 0, -95, 0, 0, 0, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -95, 0, 0, 0, // State 83 - 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 84 - 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 85 - 0, 0, 0, -38, 0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 0, 0, -38, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 86 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 87 - 0, 0, 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -38, 0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 0, 0, -38, 0, 0, 0, 0, 0, 0, // State 88 - 0, 0, 0, -37, 0, -37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -37, 0, 0, -37, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 89 - 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 90 - 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -37, 0, -37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -37, 0, 0, -37, 0, 0, 0, 0, 0, 0, // State 91 - 0, 0, 0, -39, 0, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, 0, 0, -39, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 92 - 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 93 - 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -39, 0, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, 0, 0, -39, 0, 0, 0, 0, 0, 0, // State 94 - 0, 0, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 95 - 0, 0, 0, 0, 0, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 96 - 0, 0, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 97 - 0, 0, 0, -45, 0, -45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -45, 0, 0, -45, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 98 - 0, 0, 0, 0, 0, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 99 - 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -45, 0, -45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -45, 0, 0, -45, 0, 0, 0, 0, 0, 0, // State 100 - 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 101 - 0, 0, 0, 0, 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 102 - 0, 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 103 - 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 104 - 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 105 - 0, 0, 0, -73, 0, -73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -73, 0, 0, -73, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 106 - 0, 0, 0, -49, 0, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49, 0, 0, -49, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 107 - 0, 0, 0, -47, 0, -47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -47, 0, 0, -47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -74, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, -74, 0, 0, 0, 0, 0, 0, // State 108 - 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -49, 0, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49, 0, 0, -49, 0, 0, 0, 0, 0, 0, // State 109 - 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -47, 0, -47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -47, 0, 0, -47, 0, 0, 0, 0, 0, 0, // State 110 - 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 111 - 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 112 - 0, 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 113 - 0, 0, 0, -51, 0, -51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 0, 0, -51, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 114 - 0, 0, 0, 0, 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 115 - 0, 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -51, 0, -51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 0, 0, -51, 0, 0, 0, 0, 0, 0, // State 116 - 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 117 - 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 118 - 0, 0, 0, 0, 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 119 - 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 120 - 0, 0, 0, -74, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, -74, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 121 - 0, 0, 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 122 - 0, 0, 0, 0, 0, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 123 - 0, 0, 0, 0, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -75, 0, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, -75, 0, 0, 0, 0, 0, 0, // State 124 - 0, 0, 0, 0, 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 125 - 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 126 - 0, 0, 0, -46, 0, -46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -46, 0, 0, -46, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 127 - 0, 0, 0, 0, 0, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 128 - 0, 0, 0, 0, 0, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 129 - 0, 0, 0, 0, 0, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -46, 0, -46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -46, 0, 0, -46, 0, 0, 0, 0, 0, 0, // State 130 - 0, 0, 0, -57, 0, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -57, 0, 0, -57, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 131 - 0, 0, 0, -40, 0, -40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -40, 0, 0, -40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 132 - 0, 0, 0, -53, 0, -53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -53, 0, 0, -53, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 133 - 0, 0, 0, -55, 0, -55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -55, 0, 0, -55, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -58, 0, -58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -58, 0, 0, -58, 0, 0, 0, 0, 0, 0, // State 134 - 0, 0, 0, -56, 0, -56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -56, 0, 0, -56, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -40, 0, -40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -40, 0, 0, -40, 0, 0, 0, 0, 0, 0, // State 135 - 0, 0, 0, -54, 0, -54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -54, 0, 0, -54, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -53, 0, -53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -53, 0, 0, -53, 0, 0, 0, 0, 0, 0, // State 136 - 0, 0, 0, -44, 0, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, 0, 0, -44, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -56, 0, -56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -56, 0, 0, -56, 0, 0, 0, 0, 0, 0, // State 137 - 0, 0, 0, -43, 0, -43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43, 0, 0, -43, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -57, 0, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -57, 0, 0, -57, 0, 0, 0, 0, 0, 0, // State 138 - 0, 0, 0, -42, 0, -42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42, 0, 0, -42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -54, 0, -54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -54, 0, 0, -54, 0, 0, 0, 0, 0, 0, // State 139 - 0, 0, 0, -50, 0, -50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -50, 0, 0, -50, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -44, 0, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, 0, 0, -44, 0, 0, 0, 0, 0, 0, // State 140 - 0, 0, 0, -48, 0, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, 0, 0, -48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -43, 0, -43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43, 0, 0, -43, 0, 0, 0, 0, 0, 0, // State 141 - 0, 0, 0, -52, 0, -52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52, 0, 0, -52, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -42, 0, -42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42, 0, 0, -42, 0, 0, 0, 0, 0, 0, // State 142 - 0, 0, 0, -70, 0, -70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -70, 0, 0, -70, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -50, 0, -50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -50, 0, 0, -50, 0, 0, 0, 0, 0, 0, // State 143 - 0, 0, 0, -69, 0, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -69, 0, 0, -69, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -48, 0, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, 0, 0, -48, 0, 0, 0, 0, 0, 0, // State 144 - 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -52, 0, -52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52, 0, 0, -52, 0, 0, 0, 0, 0, 0, // State 145 - 0, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -71, 0, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71, 0, 0, -71, 0, 0, 0, 0, 0, 0, // State 146 - 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -70, 0, -70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -70, 0, 0, -70, 0, 0, 0, 0, 0, 0, // State 147 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 148 - 0, 0, 0, -72, 0, -72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -72, 0, 0, -72, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 149 - 0, 0, 0, -60, 0, -60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -60, 0, 0, -60, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 150 - 0, 0, 0, -61, 0, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, 0, 0, -61, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, // State 151 - 0, 0, 0, -62, 0, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, 0, 0, -62, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -73, 0, -73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -73, 0, 0, -73, 0, 0, 0, 0, 0, 0, // State 152 - 0, 0, 0, -63, 0, -63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -63, 0, 0, -63, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -61, 0, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, 0, 0, -61, 0, 0, 0, 0, 0, 0, // State 153 - 0, 0, 0, -67, 0, -67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -67, 0, 0, -67, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -62, 0, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, 0, 0, -62, 0, 0, 0, 0, 0, 0, // State 154 - 0, 0, 0, -66, 0, -66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -66, 0, 0, -66, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -55, 0, -55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -55, 0, 0, -55, 0, 0, 0, 0, 0, 0, // State 155 - 0, 0, 0, -59, 0, -59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -59, 0, 0, -59, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -63, 0, -63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -63, 0, 0, -63, 0, 0, 0, 0, 0, 0, // State 156 - 0, 0, 0, -65, 0, -65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -65, 0, 0, -65, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -64, 0, -64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -64, 0, 0, -64, 0, 0, 0, 0, 0, 0, // State 157 - 0, 0, 0, -64, 0, -64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -64, 0, 0, -64, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -68, 0, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -68, 0, 0, -68, 0, 0, 0, 0, 0, 0, // State 158 - 0, 0, 0, -58, 0, -58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -58, 0, 0, -58, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -67, 0, -67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -67, 0, 0, -67, 0, 0, 0, 0, 0, 0, // State 159 - 0, 0, 0, -41, 0, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -41, 0, 0, -41, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -60, 0, -60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -60, 0, 0, -60, 0, 0, 0, 0, 0, 0, // State 160 - 0, 0, 0, 0, 0, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -66, 0, -66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -66, 0, 0, -66, 0, 0, 0, 0, 0, 0, // State 161 - 0, 0, 0, -68, 0, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -68, 0, 0, -68, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -65, 0, -65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -65, 0, 0, -65, 0, 0, 0, 0, 0, 0, // State 162 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -59, 0, -59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -59, 0, 0, -59, 0, 0, 0, 0, 0, 0, // State 163 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -41, 0, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -41, 0, 0, -41, 0, 0, 0, 0, 0, 0, // State 164 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 165 - 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -69, 0, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -69, 0, 0, -69, 0, 0, 0, 0, 0, 0, // State 166 - 0, 0, 0, -71, 0, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71, 0, 0, -71, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 167 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 168 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 0, + // State 169 + 0, 0, 0, 0, 0, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 170 + 0, 0, 0, -72, 0, -72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -72, 0, 0, -72, 0, 0, 0, 0, 0, 0, ]; fn __action(state: i16, integer: usize) -> i16 { - __ACTION[(state as usize) * 55 + integer] + __ACTION[(state as usize) * 56 + integer] } const __EOF_ACTION: &[i16] = &[ // State 0 @@ -6605,11 +6667,11 @@ mod __parse__Expr { // State 67 0, // State 68 - -99, + 0, // State 69 0, // State 70 - 0, + -100, // State 71 0, // State 72 @@ -6623,13 +6685,13 @@ mod __parse__Expr { // State 76 0, // State 77 - -36, + 0, // State 78 - -35, - // State 79 0, + // State 79 + -36, // State 80 - 0, + -35, // State 81 0, // State 82 @@ -6639,23 +6701,23 @@ mod __parse__Expr { // State 84 0, // State 85 - -38, + 0, // State 86 0, // State 87 - 0, + -38, // State 88 - -37, + 0, // State 89 0, // State 90 - 0, + -37, // State 91 - -39, + 0, // State 92 0, // State 93 - 0, + -39, // State 94 0, // State 95 @@ -6663,11 +6725,11 @@ mod __parse__Expr { // State 96 0, // State 97 - -45, + 0, // State 98 0, // State 99 - 0, + -45, // State 100 0, // State 101 @@ -6679,15 +6741,15 @@ mod __parse__Expr { // State 104 0, // State 105 - -73, + 0, // State 106 - -49, + 0, // State 107 - -47, + -74, // State 108 - 0, + -49, // State 109 - 0, + -47, // State 110 0, // State 111 @@ -6695,11 +6757,11 @@ mod __parse__Expr { // State 112 0, // State 113 - -51, + 0, // State 114 0, // State 115 - 0, + -51, // State 116 0, // State 117 @@ -6709,180 +6771,190 @@ mod __parse__Expr { // State 119 0, // State 120 - -74, + 0, // State 121 0, // State 122 0, // State 123 - 0, + -75, // State 124 0, // State 125 0, // State 126 - -46, + 0, // State 127 0, // State 128 0, // State 129 - 0, + -46, // State 130 - -57, + 0, // State 131 - -40, + 0, // State 132 - -53, + 0, // State 133 - -55, + -58, // State 134 - -56, + -40, // State 135 - -54, + -53, // State 136 - -44, + -56, // State 137 - -43, + -57, // State 138 - -42, + -54, // State 139 - -50, + -44, // State 140 - -48, + -43, // State 141 - -52, + -42, // State 142 - -70, + -50, // State 143 - -69, + -48, // State 144 - 0, + -52, // State 145 - 0, + -71, // State 146 - 0, + -70, // State 147 0, // State 148 - -72, + 0, // State 149 - -60, + 0, // State 150 - -61, + 0, // State 151 - -62, + -73, // State 152 - -63, + -61, // State 153 - -67, + -62, // State 154 - -66, + -55, // State 155 - -59, + -63, // State 156 - -65, - // State 157 -64, + // State 157 + -68, // State 158 - -58, + -67, // State 159 - -41, + -60, // State 160 - 0, + -66, // State 161 - -68, + -65, // State 162 - 0, + -59, // State 163 - 0, + -41, // State 164 0, // State 165 - 0, + -69, // State 166 - -71, + 0, + // State 167 + 0, + // State 168 + 0, + // State 169 + 0, + // State 170 + -72, ]; fn __goto(state: i16, nt: usize) -> i16 { match nt { - 16 => 69, + 16 => 71, 17 => match state { - 5 => 36, - 6 => 37, - 7 => 38, - 8 => 39, - 9 => 40, - 10 => 41, - 11 => 42, - 12 => 43, - 13 => 44, - 14 => 45, - 15 => 46, - 19 => 47, - 24 => 52, - 25 => 53, - 26 => 54, - 27 => 55, - 28 => 56, - 30 => 58, - 31 => 59, + 5 => 37, + 6 => 38, + 7 => 39, + 8 => 40, + 9 => 41, + 10 => 42, + 11 => 43, + 12 => 44, + 13 => 45, + 14 => 46, + 15 => 47, + 19 => 48, + 24 => 53, + 25 => 54, + 26 => 55, + 27 => 56, + 28 => 57, + 29 => 58, + 31 => 60, 32 => 61, - 33 => 62, - 0 => 68, - 3 => 81, - 16 => 82, - 17 => 83, - 18 => 84, - 21 => 86, - 23 => 87, - 29 => 89, - 34 => 90, + 33 => 63, + 34 => 64, + 0 => 70, + 3 => 83, + 16 => 84, + 17 => 85, + 18 => 86, + 21 => 88, + 23 => 89, + 30 => 91, 35 => 92, - 36 => 93, - 37 => 94, - 38 => 95, - 39 => 96, + 36 => 94, + 37 => 95, + 38 => 96, + 39 => 97, 40 => 98, - 41 => 99, - 42 => 100, - 43 => 101, - 44 => 102, - 45 => 103, - 46 => 104, - 47 => 108, - 48 => 109, - 51 => 112, + 41 => 100, + 42 => 101, + 43 => 102, + 44 => 103, + 45 => 104, + 46 => 105, + 47 => 106, + 48 => 110, + 49 => 111, 52 => 114, - 53 => 115, - 54 => 116, - 55 => 117, - 56 => 118, - 57 => 119, + 53 => 116, + 54 => 117, + 55 => 118, + 56 => 119, + 57 => 120, 58 => 121, 59 => 122, - 60 => 123, - 61 => 124, - 62 => 125, - 64 => 146, - 65 => 147, - 67 => 164, - _ => 35, + 60 => 124, + 61 => 125, + 62 => 126, + 63 => 127, + 64 => 128, + 66 => 149, + 67 => 150, + 69 => 168, + _ => 36, }, - 23 => 70, + 23 => 72, 24 => 2, - 27 => 127, + 27 => 130, 30 => match state { - 22 => 51, - 50 => 64, - 2 => 79, - 49 => 110, - 66 => 160, - _ => 50, + 22 => 52, + 51 => 66, + 2 => 81, + 50 => 112, + 68 => 164, + _ => 51, }, 31 => match state { - 28 => 57, - 31 => 60, - _ => 48, + 29 => 59, + 32 => 62, + _ => 49, }, _ => 0, } @@ -6925,6 +6997,7 @@ mod __parse__Expr { r###""rev""###, r###""rotl""###, r###""rotr""###, + r###""sdiv""###, r###""shl""###, r###""shr""###, r###""sig""###, @@ -6996,7 +7069,7 @@ mod __parse__Expr { #[inline] fn error_action(&self, state: i16) -> i16 { - __action(state, 55 - 1) + __action(state, 56 - 1) } #[inline] @@ -7109,11 +7182,12 @@ mod __parse__Expr { Token(52, _) if true => Some(47), Token(53, _) if true => Some(48), Token(54, _) if true => Some(49), - Token(0, _) if true => Some(50), - Token(1, _) if true => Some(51), - Token(2, _) if true => Some(52), - Token(3, _) if true => Some(53), - Token(4, _) if true => Some(54), + Token(55, _) if true => Some(50), + Token(0, _) if true => Some(51), + Token(1, _) if true => Some(52), + Token(2, _) if true => Some(53), + Token(3, _) if true => Some(54), + Token(4, _) if true => Some(55), _ => None, } } @@ -7126,8 +7200,8 @@ mod __parse__Expr { ) -> __Symbol<'input> { match __token_index { - 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 => match __token { - Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 => match __token { + Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(55, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), _ => unreachable!(), }, _ => unreachable!(), @@ -7472,6 +7546,9 @@ mod __parse__Expr { __reduce97(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } 98 => { + __reduce98(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } + 99 => { // __Expr = Expr => ActionFn(8); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); @@ -7479,9 +7556,6 @@ mod __parse__Expr { let __nt = super::__action8::<>(input, __sym0); return Some(Ok(__nt)); } - 99 => { - __reduce99(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) - } 100 => { __reduce100(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } @@ -7500,6 +7574,9 @@ mod __parse__Expr { 105 => { __reduce105(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } + 106 => { + __reduce106(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } _ => panic!("invalid action code {}", __action) }; let __states_len = __states.len(); @@ -7775,13 +7852,13 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = BoundVar, "," => ActionFn(80); + // ( ",") = BoundVar, "," => ActionFn(81); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action80::<>(input, __sym0, __sym1); + let __nt = super::__action81::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (2, 0) } @@ -7794,10 +7871,10 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(78); + // ( ",")* = => ActionFn(79); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action78::<>(input, &__start, &__end); + let __nt = super::__action79::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (0, 1) } @@ -7810,11 +7887,11 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(79); + // ( ",")* = ( ",")+ => ActionFn(80); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action79::<>(input, __sym0); + let __nt = super::__action80::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (1, 1) } @@ -7827,13 +7904,13 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = BoundVar, "," => ActionFn(97); + // ( ",")+ = BoundVar, "," => ActionFn(98); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action97::<>(input, __sym0, __sym1); + let __nt = super::__action98::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (2, 2) } @@ -7846,14 +7923,14 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(98); + // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(99); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action98::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action99::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (3, 2) } @@ -7866,13 +7943,13 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Expr, "," => ActionFn(90); + // ( ",") = Expr, "," => ActionFn(91); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action90::<>(input, __sym0, __sym1); + let __nt = super::__action91::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (2, 3) } @@ -7885,10 +7962,10 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(88); + // ( ",")* = => ActionFn(89); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action88::<>(input, &__start, &__end); + let __nt = super::__action89::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (0, 4) } @@ -7901,11 +7978,11 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(89); + // ( ",")* = ( ",")+ => ActionFn(90); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action89::<>(input, __sym0); + let __nt = super::__action90::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (1, 4) } @@ -7918,13 +7995,13 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Expr, "," => ActionFn(101); + // ( ",")+ = Expr, "," => ActionFn(102); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action101::<>(input, __sym0, __sym1); + let __nt = super::__action102::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (2, 5) } @@ -7937,14 +8014,14 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Expr, "," => ActionFn(102); + // ( ",")+ = ( ",")+, Expr, "," => ActionFn(103); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action102::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action103::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (3, 5) } @@ -7957,13 +8034,13 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Type, "," => ActionFn(85); + // ( ",") = Type, "," => ActionFn(86); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action85::<>(input, __sym0, __sym1); + let __nt = super::__action86::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 6) } @@ -7976,10 +8053,10 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(83); + // ( ",")* = => ActionFn(84); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action83::<>(input, &__start, &__end); + let __nt = super::__action84::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (0, 7) } @@ -7992,11 +8069,11 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(84); + // ( ",")* = ( ",")+ => ActionFn(85); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action84::<>(input, __sym0); + let __nt = super::__action85::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (1, 7) } @@ -8009,13 +8086,13 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Type, "," => ActionFn(105); + // ( ",")+ = Type, "," => ActionFn(106); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action105::<>(input, __sym0, __sym1); + let __nt = super::__action106::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (2, 8) } @@ -8028,14 +8105,14 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Type, "," => ActionFn(106); + // ( ",")+ = ( ",")+, Type, "," => ActionFn(107); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action106::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action107::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (3, 8) } @@ -8122,11 +8199,11 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = BoundVar => ActionFn(76); + // BoundVar? = BoundVar => ActionFn(77); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action76::<>(input, __sym0); + let __nt = super::__action77::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (1, 12) } @@ -8139,10 +8216,10 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = => ActionFn(77); + // BoundVar? = => ActionFn(78); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action77::<>(input, &__start, &__end); + let __nt = super::__action78::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (0, 12) } @@ -8155,11 +8232,11 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = BoundVar => ActionFn(109); + // Comma = BoundVar => ActionFn(110); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action109::<>(input, __sym0); + let __nt = super::__action110::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -8172,10 +8249,10 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(110); + // Comma = => ActionFn(111); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action110::<>(input, &__start, &__end); + let __nt = super::__action111::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (0, 13) } @@ -8188,13 +8265,13 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, BoundVar => ActionFn(111); + // Comma = ( ",")+, BoundVar => ActionFn(112); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action111::<>(input, __sym0, __sym1); + let __nt = super::__action112::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (2, 13) } @@ -8207,11 +8284,11 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(112); + // Comma = ( ",")+ => ActionFn(113); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action112::<>(input, __sym0); + let __nt = super::__action113::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -8224,11 +8301,11 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Expr => ActionFn(113); + // Comma = Expr => ActionFn(114); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action113::<>(input, __sym0); + let __nt = super::__action114::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -8241,10 +8318,10 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(114); + // Comma = => ActionFn(115); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action114::<>(input, &__start, &__end); + let __nt = super::__action115::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (0, 14) } @@ -8257,13 +8334,13 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Expr => ActionFn(115); + // Comma = ( ",")+, Expr => ActionFn(116); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action115::<>(input, __sym0, __sym1); + let __nt = super::__action116::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (2, 14) } @@ -8276,11 +8353,11 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(116); + // Comma = ( ",")+ => ActionFn(117); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action116::<>(input, __sym0); + let __nt = super::__action117::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -8293,11 +8370,11 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Type => ActionFn(117); + // Comma = Type => ActionFn(118); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action117::<>(input, __sym0); + let __nt = super::__action118::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -8310,10 +8387,10 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(118); + // Comma = => ActionFn(119); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action118::<>(input, &__start, &__end); + let __nt = super::__action119::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (0, 15) } @@ -8326,13 +8403,13 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Type => ActionFn(119); + // Comma = ( ",")+, Type => ActionFn(120); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action119::<>(input, __sym0, __sym1); + let __nt = super::__action120::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (2, 15) } @@ -8345,11 +8422,11 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(120); + // Comma = ( ",")+ => ActionFn(121); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action120::<>(input, __sym0); + let __nt = super::__action121::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -8809,7 +8886,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "+", Expr, Expr, ")" => ActionFn(52); + // Expr = "(", "sdiv", Expr, Expr, ")" => ActionFn(52); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -8831,7 +8908,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "-", Expr, Expr, ")" => ActionFn(53); + // Expr = "(", "+", Expr, Expr, ")" => ActionFn(53); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -8853,7 +8930,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "&", Expr, Expr, ")" => ActionFn(54); + // Expr = "(", "-", Expr, Expr, ")" => ActionFn(54); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -8875,7 +8952,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "|", Expr, Expr, ")" => ActionFn(55); + // Expr = "(", "&", Expr, Expr, ")" => ActionFn(55); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -8897,7 +8974,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(56); + // Expr = "(", "|", Expr, Expr, ")" => ActionFn(56); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -8919,7 +8996,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(57); + // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(57); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -8941,7 +9018,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(58); + // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(58); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -8963,7 +9040,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(59); + // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(59); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -8985,7 +9062,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(60); + // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(60); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -9007,11 +9084,11 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(61); + // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(61); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -9029,11 +9106,11 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(62); + // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(62); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -9051,11 +9128,11 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(63); + // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(63); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -9073,11 +9150,11 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(64); + // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(64); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -9095,7 +9172,29 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(65); + // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(65); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant3(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym4.2.clone(); + let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant3(__nt), __end)); + (5, 17) + } + pub(crate) fn __reduce68< + 'input, + >( + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: core::marker::PhantomData<(&'input ())>, + ) -> (usize, usize) + { + // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(66); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant3(__symbols); @@ -9105,11 +9204,11 @@ mod __parse__Expr { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym5.2.clone(); - let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (6, 17) } - pub(crate) fn __reduce68< + pub(crate) fn __reduce69< 'input, >( input: &'input str, @@ -9118,7 +9217,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(66); + // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(67); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -9127,11 +9226,11 @@ mod __parse__Expr { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce69< + pub(crate) fn __reduce70< 'input, >( input: &'input str, @@ -9140,7 +9239,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(67); + // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(68); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -9149,11 +9248,11 @@ mod __parse__Expr { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce70< + pub(crate) fn __reduce71< 'input, >( input: &'input str, @@ -9162,7 +9261,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(68); + // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(69); assert!(__symbols.len() >= 11); let __sym10 = __pop_Variant0(__symbols); let __sym9 = __pop_Variant0(__symbols); @@ -9177,11 +9276,11 @@ mod __parse__Expr { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym10.2.clone(); - let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); + let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (11, 17) } - pub(crate) fn __reduce71< + pub(crate) fn __reduce72< 'input, >( input: &'input str, @@ -9190,7 +9289,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(69); + // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(70); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -9199,11 +9298,11 @@ mod __parse__Expr { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce72< + pub(crate) fn __reduce73< 'input, >( input: &'input str, @@ -9212,7 +9311,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "bv2int", Expr, ")" => ActionFn(70); + // Expr = "(", "bv2int", Expr, ")" => ActionFn(71); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -9220,11 +9319,11 @@ mod __parse__Expr { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce73< + pub(crate) fn __reduce74< 'input, >( input: &'input str, @@ -9233,7 +9332,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "widthof", Expr, ")" => ActionFn(71); + // Expr = "(", "widthof", Expr, ")" => ActionFn(72); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -9241,11 +9340,11 @@ mod __parse__Expr { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce74< + pub(crate) fn __reduce75< 'input, >( input: &'input str, @@ -9254,15 +9353,15 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = Expr => ActionFn(86); + // Expr? = Expr => ActionFn(87); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action86::<>(input, __sym0); + let __nt = super::__action87::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (1, 18) } - pub(crate) fn __reduce75< + pub(crate) fn __reduce76< 'input, >( input: &'input str, @@ -9271,14 +9370,14 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = => ActionFn(87); + // Expr? = => ActionFn(88); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action87::<>(input, &__start, &__end); + let __nt = super::__action88::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (0, 18) } - pub(crate) fn __reduce76< + pub(crate) fn __reduce77< 'input, >( input: &'input str, @@ -9295,7 +9394,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 19) } - pub(crate) fn __reduce77< + pub(crate) fn __reduce78< 'input, >( input: &'input str, @@ -9322,7 +9421,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (10, 20) } - pub(crate) fn __reduce78< + pub(crate) fn __reduce79< 'input, >( input: &'input str, @@ -9343,7 +9442,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (4, 21) } - pub(crate) fn __reduce79< + pub(crate) fn __reduce80< 'input, >( input: &'input str, @@ -9367,7 +9466,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (7, 22) } - pub(crate) fn __reduce80< + pub(crate) fn __reduce81< 'input, >( input: &'input str, @@ -9384,7 +9483,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce81< + pub(crate) fn __reduce82< 'input, >( input: &'input str, @@ -9401,7 +9500,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce82< + pub(crate) fn __reduce83< 'input, >( input: &'input str, @@ -9418,7 +9517,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce83< + pub(crate) fn __reduce84< 'input, >( input: &'input str, @@ -9435,7 +9534,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant17(__nt), __end)); (1, 24) } - pub(crate) fn __reduce84< + pub(crate) fn __reduce85< 'input, >( input: &'input str, @@ -9444,7 +9543,7 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(72); + // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(73); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -9456,11 +9555,11 @@ mod __parse__Expr { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym7.2.clone(); - let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action73::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (8, 25) } - pub(crate) fn __reduce85< + pub(crate) fn __reduce86< 'input, >( input: &'input str, @@ -9484,7 +9583,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (7, 26) } - pub(crate) fn __reduce86< + pub(crate) fn __reduce87< 'input, >( input: &'input str, @@ -9501,7 +9600,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce87< + pub(crate) fn __reduce88< 'input, >( input: &'input str, @@ -9520,7 +9619,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 27) } - pub(crate) fn __reduce88< + pub(crate) fn __reduce89< 'input, >( input: &'input str, @@ -9537,7 +9636,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce89< + pub(crate) fn __reduce90< 'input, >( input: &'input str, @@ -9554,7 +9653,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce90< + pub(crate) fn __reduce91< 'input, >( input: &'input str, @@ -9563,15 +9662,15 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = Type => ActionFn(81); + // Type? = Type => ActionFn(82); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action81::<>(input, __sym0); + let __nt = super::__action82::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (1, 28) } - pub(crate) fn __reduce91< + pub(crate) fn __reduce92< 'input, >( input: &'input str, @@ -9580,14 +9679,14 @@ mod __parse__Expr { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = => ActionFn(82); + // Type? = => ActionFn(83); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action82::<>(input, &__start, &__end); + let __nt = super::__action83::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (0, 28) } - pub(crate) fn __reduce92< + pub(crate) fn __reduce93< 'input, >( input: &'input str, @@ -9604,7 +9703,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 29) } - pub(crate) fn __reduce93< + pub(crate) fn __reduce94< 'input, >( input: &'input str, @@ -9621,7 +9720,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant21(__nt), __end)); (1, 30) } - pub(crate) fn __reduce94< + pub(crate) fn __reduce95< 'input, >( input: &'input str, @@ -9641,7 +9740,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce95< + pub(crate) fn __reduce96< 'input, >( input: &'input str, @@ -9661,7 +9760,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce96< + pub(crate) fn __reduce97< 'input, >( input: &'input str, @@ -9678,7 +9777,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (1, 32) } - pub(crate) fn __reduce97< + pub(crate) fn __reduce98< 'input, >( input: &'input str, @@ -9695,7 +9794,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (1, 33) } - pub(crate) fn __reduce99< + pub(crate) fn __reduce100< 'input, >( input: &'input str, @@ -9712,7 +9811,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (1, 35) } - pub(crate) fn __reduce100< + pub(crate) fn __reduce101< 'input, >( input: &'input str, @@ -9729,7 +9828,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (1, 36) } - pub(crate) fn __reduce101< + pub(crate) fn __reduce102< 'input, >( input: &'input str, @@ -9746,7 +9845,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (1, 37) } - pub(crate) fn __reduce102< + pub(crate) fn __reduce103< 'input, >( input: &'input str, @@ -9763,7 +9862,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (1, 38) } - pub(crate) fn __reduce103< + pub(crate) fn __reduce104< 'input, >( input: &'input str, @@ -9780,7 +9879,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (1, 39) } - pub(crate) fn __reduce104< + pub(crate) fn __reduce105< 'input, >( input: &'input str, @@ -9797,7 +9896,7 @@ mod __parse__Expr { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 40) } - pub(crate) fn __reduce105< + pub(crate) fn __reduce106< 'input, >( input: &'input str, @@ -9860,380 +9959,388 @@ mod __parse__Function { } const __ACTION: &[i16] = &[ // State 0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 77, 78, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, // State 1 - 0, 0, 0, 0, 0, -23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 77, 78, + 0, 0, 0, 0, 0, -23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, // State 2 - 0, 0, 0, 0, 0, -25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 77, 78, + 0, 0, 0, 0, 0, -25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 80, // State 3 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 4 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 5 - 0, 0, 0, 0, 0, -87, 0, 0, -87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, + 0, 0, 0, 0, 0, -88, 0, 0, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, // State 6 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 7 - 10, 11, 12, 0, 0, 0, 13, 14, 0, 15, 16, 0, 17, 18, 19, 20, 21, 22, 0, 0, 0, 23, 24, 25, 26, 0, 27, 98, 0, 28, 29, 0, 0, 30, 31, 32, 33, 34, 0, 35, 0, 99, 36, 37, 38, 0, 39, 40, 0, 41, 100, 0, 76, 77, 78, + 10, 11, 12, 0, 0, 0, 13, 14, 0, 15, 16, 0, 17, 18, 19, 20, 21, 22, 0, 0, 0, 23, 24, 25, 26, 0, 27, 100, 0, 28, 29, 0, 0, 30, 31, 32, 33, 34, 35, 0, 36, 0, 101, 37, 38, 39, 0, 40, 41, 0, 42, 102, 0, 78, 79, 80, // State 8 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, // State 9 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 10 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 11 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 12 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 13 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 14 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 15 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 16 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 17 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 18 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 19 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 20 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 21 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 22 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 23 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 24 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 25 - 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 26 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, // State 27 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 28 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, // State 29 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 30 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 31 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 32 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 33 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 34 - 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 35 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 36 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 37 - 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 38 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 39 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 40 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 41 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 42 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 43 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 44 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 45 - 0, 0, 0, 8, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 46 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 47 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 48 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 49 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 50 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 51 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 52 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 53 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 54 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 55 - 10, 11, 12, 0, 0, 0, 13, 14, 0, 15, 16, 0, 17, 18, 19, 20, 21, 22, 0, 0, 0, 23, 24, 25, 26, 0, 27, 98, 0, 28, 29, 0, 134, 30, 31, 32, 33, 34, 0, 35, 0, 99, 36, 37, 38, 0, 39, 40, 0, 41, 100, 92, 76, 77, 78, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 56 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, + 10, 11, 12, 0, 0, 0, 13, 14, 0, 15, 16, 0, 17, 18, 19, 20, 21, 22, 0, 0, 0, 23, 24, 25, 26, 0, 27, 100, 0, 28, 29, 0, 136, 30, 31, 32, 33, 34, 35, 0, 36, 0, 101, 37, 38, 39, 0, 40, 41, 0, 42, 102, 94, 78, 79, 80, // State 57 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, // State 58 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 59 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 60 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 61 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 62 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 63 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 64 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 65 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 66 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 67 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 68 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 69 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 70 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 71 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 72 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 73 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 74 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 75 - 0, 0, 0, -81, 0, -81, 0, 0, -81, 0, 0, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 76 - 0, 0, 0, -82, 0, -82, 0, 0, -82, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 77 - 0, 0, 0, -83, 0, -83, 0, 0, -83, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -82, 0, -82, 0, 0, -82, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 78 - 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -83, 0, -83, 0, 0, -83, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 79 - 0, 0, 0, 0, 0, -22, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -84, 0, -84, 0, 0, -84, 0, 0, -84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 80 - 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 81 - 0, 0, 0, 0, 0, -18, 0, 0, -18, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -22, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 82 - 0, 0, 0, 0, 0, -24, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 83 - 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -18, 0, 0, -18, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 84 - 0, 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, -4, -4, + 0, 0, 0, 0, 0, -24, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 85 - 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, -5, -5, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 86 - 0, 0, 0, 0, 0, -19, 0, 0, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, -4, -4, // State 87 - 0, 0, 0, 0, 0, -90, 0, 0, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, -5, -5, // State 88 - 0, 0, 0, 0, 0, -89, 0, 0, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -19, 0, 0, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 89 - 0, 0, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -91, 0, 0, -91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 90 - 0, 0, 0, 0, 0, -88, 0, 0, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -90, 0, 0, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 91 - 0, 0, 0, -94, 0, -94, 0, 0, -94, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, 0, + 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 92 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -89, 0, 0, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 93 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -95, 0, -95, 0, 0, -95, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -95, 0, 0, 0, // State 94 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 95 - 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, // State 96 - 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 97 - 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 98 - 0, 0, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 99 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -84, 0, 0, 0, + 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 100 - 0, 0, 0, -36, 0, -36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -36, 0, 0, -36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 101 - 0, 0, 0, -35, 0, -35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -35, 0, 0, -35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -85, 0, 0, 0, // State 102 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -36, 0, -36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -36, 0, 0, -36, 0, 0, 0, 0, 0, 0, // State 103 - 0, 0, 0, 0, 0, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -35, 0, -35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -35, 0, 0, -35, 0, 0, 0, 0, 0, 0, // State 104 - 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 105 - 0, 0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 106 - 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 107 - 0, 0, 0, -38, 0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 0, 0, -38, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 108 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 109 - 0, 0, 0, 0, 0, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -38, 0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 0, 0, -38, 0, 0, 0, 0, 0, 0, // State 110 - 0, 0, 0, -37, 0, -37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -37, 0, 0, -37, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 111 - 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 112 - 0, 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -37, 0, -37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -37, 0, 0, -37, 0, 0, 0, 0, 0, 0, // State 113 - 0, 0, 0, -39, 0, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, 0, 0, -39, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 114 - 0, 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 115 - 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -39, 0, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, 0, 0, -39, 0, 0, 0, 0, 0, 0, // State 116 - 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 117 - 0, 0, 0, 0, 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 118 - 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 119 - 0, 0, 0, -45, 0, -45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -45, 0, 0, -45, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 120 - 0, 0, 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 121 - 0, 0, 0, 0, 0, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -45, 0, -45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -45, 0, 0, -45, 0, 0, 0, 0, 0, 0, // State 122 - 0, 0, 0, 0, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 123 - 0, 0, 0, 0, 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 124 - 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 125 - 0, 0, 0, 0, 0, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 126 - 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 127 - 0, 0, 0, -73, 0, -73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -73, 0, 0, -73, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 128 - 0, 0, 0, -49, 0, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49, 0, 0, -49, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 129 - 0, 0, 0, -47, 0, -47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -47, 0, 0, -47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -74, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, -74, 0, 0, 0, 0, 0, 0, // State 130 - 0, 0, 0, 0, 0, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -49, 0, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49, 0, 0, -49, 0, 0, 0, 0, 0, 0, // State 131 - 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -47, 0, -47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -47, 0, 0, -47, 0, 0, 0, 0, 0, 0, // State 132 - 0, 0, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 133 - 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 134 - 0, 0, 0, 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 135 - 0, 0, 0, -51, 0, -51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 0, 0, -51, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 136 - 0, 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 137 - 0, 0, 0, 0, 0, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -51, 0, -51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 0, 0, -51, 0, 0, 0, 0, 0, 0, // State 138 - 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 139 - 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 140 - 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 141 - 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 142 - 0, 0, 0, -74, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, -74, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 143 - 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 144 - 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 145 - 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -75, 0, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, -75, 0, 0, 0, 0, 0, 0, // State 146 - 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 147 - 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 148 - 0, 0, 0, -46, 0, -46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -46, 0, 0, -46, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 149 - 0, 0, 0, 0, 0, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 150 - 0, 0, 0, -57, 0, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -57, 0, 0, -57, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 151 - 0, 0, 0, -40, 0, -40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -40, 0, 0, -40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -46, 0, -46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -46, 0, 0, -46, 0, 0, 0, 0, 0, 0, // State 152 - 0, 0, 0, -53, 0, -53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -53, 0, 0, -53, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 153 - 0, 0, 0, -55, 0, -55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -55, 0, 0, -55, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -58, 0, -58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -58, 0, 0, -58, 0, 0, 0, 0, 0, 0, // State 154 - 0, 0, 0, -56, 0, -56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -56, 0, 0, -56, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -40, 0, -40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -40, 0, 0, -40, 0, 0, 0, 0, 0, 0, // State 155 - 0, 0, 0, -54, 0, -54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -54, 0, 0, -54, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -53, 0, -53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -53, 0, 0, -53, 0, 0, 0, 0, 0, 0, // State 156 - 0, 0, 0, -44, 0, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, 0, 0, -44, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -56, 0, -56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -56, 0, 0, -56, 0, 0, 0, 0, 0, 0, // State 157 - 0, 0, 0, -43, 0, -43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43, 0, 0, -43, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -57, 0, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -57, 0, 0, -57, 0, 0, 0, 0, 0, 0, // State 158 - 0, 0, 0, -42, 0, -42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42, 0, 0, -42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -54, 0, -54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -54, 0, 0, -54, 0, 0, 0, 0, 0, 0, // State 159 - 0, 0, 0, -50, 0, -50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -50, 0, 0, -50, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -44, 0, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, 0, 0, -44, 0, 0, 0, 0, 0, 0, // State 160 - 0, 0, 0, -48, 0, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, 0, 0, -48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -43, 0, -43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43, 0, 0, -43, 0, 0, 0, 0, 0, 0, // State 161 - 0, 0, 0, -52, 0, -52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52, 0, 0, -52, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -42, 0, -42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42, 0, 0, -42, 0, 0, 0, 0, 0, 0, // State 162 - 0, 0, 0, -70, 0, -70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -70, 0, 0, -70, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -50, 0, -50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -50, 0, 0, -50, 0, 0, 0, 0, 0, 0, // State 163 - 0, 0, 0, -69, 0, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -69, 0, 0, -69, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -48, 0, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, 0, 0, -48, 0, 0, 0, 0, 0, 0, // State 164 - 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -52, 0, -52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52, 0, 0, -52, 0, 0, 0, 0, 0, 0, // State 165 - 0, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -71, 0, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71, 0, 0, -71, 0, 0, 0, 0, 0, 0, // State 166 - 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -70, 0, -70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -70, 0, 0, -70, 0, 0, 0, 0, 0, 0, // State 167 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 168 - 0, 0, 0, -72, 0, -72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -72, 0, 0, -72, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 169 - 0, 0, 0, -60, 0, -60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -60, 0, 0, -60, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 170 - 0, 0, 0, -61, 0, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, 0, 0, -61, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 186, 0, 0, 0, 0, 0, 0, // State 171 - 0, 0, 0, -62, 0, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, 0, 0, -62, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -73, 0, -73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -73, 0, 0, -73, 0, 0, 0, 0, 0, 0, // State 172 - 0, 0, 0, -63, 0, -63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -63, 0, 0, -63, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -61, 0, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, 0, 0, -61, 0, 0, 0, 0, 0, 0, // State 173 - 0, 0, 0, -67, 0, -67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -67, 0, 0, -67, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -62, 0, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, 0, 0, -62, 0, 0, 0, 0, 0, 0, // State 174 - 0, 0, 0, -66, 0, -66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -66, 0, 0, -66, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -55, 0, -55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -55, 0, 0, -55, 0, 0, 0, 0, 0, 0, // State 175 - 0, 0, 0, -59, 0, -59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -59, 0, 0, -59, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -63, 0, -63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -63, 0, 0, -63, 0, 0, 0, 0, 0, 0, // State 176 - 0, 0, 0, -65, 0, -65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -65, 0, 0, -65, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -64, 0, -64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -64, 0, 0, -64, 0, 0, 0, 0, 0, 0, // State 177 - 0, 0, 0, -64, 0, -64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -64, 0, 0, -64, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -68, 0, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -68, 0, 0, -68, 0, 0, 0, 0, 0, 0, // State 178 - 0, 0, 0, -58, 0, -58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -58, 0, 0, -58, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -67, 0, -67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -67, 0, 0, -67, 0, 0, 0, 0, 0, 0, // State 179 - 0, 0, 0, -41, 0, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -41, 0, 0, -41, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -60, 0, -60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -60, 0, 0, -60, 0, 0, 0, 0, 0, 0, // State 180 - 0, 0, 0, -68, 0, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -68, 0, 0, -68, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -66, 0, -66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -66, 0, 0, -66, 0, 0, 0, 0, 0, 0, // State 181 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -65, 0, -65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -65, 0, 0, -65, 0, 0, 0, 0, 0, 0, // State 182 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -59, 0, -59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -59, 0, 0, -59, 0, 0, 0, 0, 0, 0, // State 183 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -41, 0, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -41, 0, 0, -41, 0, 0, 0, 0, 0, 0, // State 184 - 0, 0, 0, 0, 0, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -69, 0, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -69, 0, 0, -69, 0, 0, 0, 0, 0, 0, // State 185 - 0, 0, 0, -71, 0, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71, 0, 0, -71, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 186 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 187 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, + // State 188 + 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 189 + 0, 0, 0, -72, 0, -72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -72, 0, 0, -72, 0, 0, 0, 0, 0, 0, ]; fn __action(state: i16, integer: usize) -> i16 { - __ACTION[(state as usize) * 55 + integer] + __ACTION[(state as usize) * 56 + integer] } const __EOF_ACTION: &[i16] = &[ // State 0 @@ -10383,11 +10490,11 @@ mod __parse__Function { // State 72 0, // State 73 - -100, + 0, // State 74 0, // State 75 - 0, + -101, // State 76 0, // State 77 @@ -10425,11 +10532,11 @@ mod __parse__Function { // State 93 0, // State 94 - -78, + 0, // State 95 0, // State 96 - 0, + -79, // State 97 0, // State 98 @@ -10608,103 +10715,113 @@ mod __parse__Function { 0, // State 185 0, + // State 186 + 0, + // State 187 + 0, + // State 188 + 0, + // State 189 + 0, ]; fn __goto(state: i16, nt: usize) -> i16 { match nt { 2 => 2, - 9 => 78, + 9 => 80, 11 => match state { - 2 => 82, - _ => 79, + 2 => 84, + _ => 81, }, - 13 => 80, - 16 => 95, + 13 => 82, + 16 => 97, 17 => match state { - 11 => 42, - 12 => 43, - 13 => 44, - 14 => 45, - 15 => 46, - 16 => 47, - 17 => 48, - 18 => 49, - 19 => 50, - 20 => 51, - 21 => 52, - 25 => 53, - 30 => 58, - 31 => 59, - 32 => 60, - 33 => 61, - 34 => 62, - 36 => 64, - 37 => 65, + 11 => 43, + 12 => 44, + 13 => 45, + 14 => 46, + 15 => 47, + 16 => 48, + 17 => 49, + 18 => 50, + 19 => 51, + 20 => 52, + 21 => 53, + 25 => 54, + 30 => 59, + 31 => 60, + 32 => 61, + 33 => 62, + 34 => 63, + 35 => 64, + 37 => 66, 38 => 67, - 39 => 68, - 6 => 93, - 9 => 103, - 22 => 104, - 23 => 105, - 24 => 106, - 27 => 108, - 29 => 109, - 35 => 111, - 40 => 112, + 39 => 69, + 40 => 70, + 6 => 95, + 9 => 105, + 22 => 106, + 23 => 107, + 24 => 108, + 27 => 110, + 29 => 111, + 36 => 113, 41 => 114, - 42 => 115, - 43 => 116, - 44 => 117, - 45 => 118, + 42 => 116, + 43 => 117, + 44 => 118, + 45 => 119, 46 => 120, - 47 => 121, - 48 => 122, - 49 => 123, - 50 => 124, - 51 => 125, - 52 => 126, - 53 => 130, - 54 => 131, - 57 => 134, + 47 => 122, + 48 => 123, + 49 => 124, + 50 => 125, + 51 => 126, + 52 => 127, + 53 => 128, + 54 => 132, + 55 => 133, 58 => 136, - 59 => 137, - 60 => 138, - 61 => 139, - 62 => 140, - 63 => 141, + 59 => 138, + 60 => 139, + 61 => 140, + 62 => 141, + 63 => 142, 64 => 143, 65 => 144, - 66 => 145, - 67 => 146, - 68 => 147, - 70 => 166, - 71 => 167, - 72 => 183, - _ => 41, + 66 => 146, + 67 => 147, + 68 => 148, + 69 => 149, + 70 => 150, + 72 => 169, + 73 => 170, + 74 => 187, + _ => 42, }, - 20 => 73, + 20 => 75, 23 => match state { - 0 => 74, - 1..=2 => 81, - _ => 96, + 0 => 76, + 1..=2 => 83, + _ => 98, }, 24 => 8, 27 => match state { - 4 => 89, - 69 => 149, - _ => 86, + 4 => 91, + 71 => 152, + _ => 88, }, 30 => match state { - 28 => 57, - 56 => 70, - 5 => 90, - 8 => 102, - 55 => 132, - _ => 56, + 28 => 58, + 57 => 72, + 5 => 92, + 8 => 104, + 56 => 134, + _ => 57, }, 31 => match state { - 34 => 63, - 37 => 66, - _ => 54, + 35 => 65, + 38 => 68, + _ => 55, }, _ => 0, } @@ -10747,6 +10864,7 @@ mod __parse__Function { r###""rev""###, r###""rotl""###, r###""rotr""###, + r###""sdiv""###, r###""shl""###, r###""shr""###, r###""sig""###, @@ -10818,7 +10936,7 @@ mod __parse__Function { #[inline] fn error_action(&self, state: i16) -> i16 { - __action(state, 55 - 1) + __action(state, 56 - 1) } #[inline] @@ -10931,11 +11049,12 @@ mod __parse__Function { Token(52, _) if true => Some(47), Token(53, _) if true => Some(48), Token(54, _) if true => Some(49), - Token(0, _) if true => Some(50), - Token(1, _) if true => Some(51), - Token(2, _) if true => Some(52), - Token(3, _) if true => Some(53), - Token(4, _) if true => Some(54), + Token(55, _) if true => Some(50), + Token(0, _) if true => Some(51), + Token(1, _) if true => Some(52), + Token(2, _) if true => Some(53), + Token(3, _) if true => Some(54), + Token(4, _) if true => Some(55), _ => None, } } @@ -10948,8 +11067,8 @@ mod __parse__Function { ) -> __Symbol<'input> { match __token_index { - 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 => match __token { - Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 => match __token { + Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(55, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), _ => unreachable!(), }, _ => unreachable!(), @@ -11297,6 +11416,9 @@ mod __parse__Function { __reduce98(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } 99 => { + __reduce99(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } + 100 => { // __Function = Function => ActionFn(5); let __sym0 = __pop_Variant13(__symbols); let __start = __sym0.0.clone(); @@ -11304,9 +11426,6 @@ mod __parse__Function { let __nt = super::__action5::<>(input, __sym0); return Some(Ok(__nt)); } - 100 => { - __reduce100(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) - } 101 => { __reduce101(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } @@ -11322,6 +11441,9 @@ mod __parse__Function { 105 => { __reduce105(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } + 106 => { + __reduce106(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } _ => panic!("invalid action code {}", __action) }; let __states_len = __states.len(); @@ -11597,13 +11719,13 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = BoundVar, "," => ActionFn(80); + // ( ",") = BoundVar, "," => ActionFn(81); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action80::<>(input, __sym0, __sym1); + let __nt = super::__action81::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (2, 0) } @@ -11616,10 +11738,10 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(78); + // ( ",")* = => ActionFn(79); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action78::<>(input, &__start, &__end); + let __nt = super::__action79::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (0, 1) } @@ -11632,11 +11754,11 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(79); + // ( ",")* = ( ",")+ => ActionFn(80); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action79::<>(input, __sym0); + let __nt = super::__action80::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (1, 1) } @@ -11649,13 +11771,13 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = BoundVar, "," => ActionFn(97); + // ( ",")+ = BoundVar, "," => ActionFn(98); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action97::<>(input, __sym0, __sym1); + let __nt = super::__action98::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (2, 2) } @@ -11668,14 +11790,14 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(98); + // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(99); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action98::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action99::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (3, 2) } @@ -11688,13 +11810,13 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Expr, "," => ActionFn(90); + // ( ",") = Expr, "," => ActionFn(91); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action90::<>(input, __sym0, __sym1); + let __nt = super::__action91::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (2, 3) } @@ -11707,10 +11829,10 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(88); + // ( ",")* = => ActionFn(89); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action88::<>(input, &__start, &__end); + let __nt = super::__action89::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (0, 4) } @@ -11723,11 +11845,11 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(89); + // ( ",")* = ( ",")+ => ActionFn(90); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action89::<>(input, __sym0); + let __nt = super::__action90::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (1, 4) } @@ -11740,13 +11862,13 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Expr, "," => ActionFn(101); + // ( ",")+ = Expr, "," => ActionFn(102); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action101::<>(input, __sym0, __sym1); + let __nt = super::__action102::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (2, 5) } @@ -11759,14 +11881,14 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Expr, "," => ActionFn(102); + // ( ",")+ = ( ",")+, Expr, "," => ActionFn(103); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action102::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action103::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (3, 5) } @@ -11779,13 +11901,13 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Type, "," => ActionFn(85); + // ( ",") = Type, "," => ActionFn(86); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action85::<>(input, __sym0, __sym1); + let __nt = super::__action86::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 6) } @@ -11798,10 +11920,10 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(83); + // ( ",")* = => ActionFn(84); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action83::<>(input, &__start, &__end); + let __nt = super::__action84::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (0, 7) } @@ -11814,11 +11936,11 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(84); + // ( ",")* = ( ",")+ => ActionFn(85); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action84::<>(input, __sym0); + let __nt = super::__action85::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (1, 7) } @@ -11831,13 +11953,13 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Type, "," => ActionFn(105); + // ( ",")+ = Type, "," => ActionFn(106); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action105::<>(input, __sym0, __sym1); + let __nt = super::__action106::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (2, 8) } @@ -11850,14 +11972,14 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Type, "," => ActionFn(106); + // ( ",")+ = ( ",")+, Type, "," => ActionFn(107); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action106::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action107::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (3, 8) } @@ -11944,11 +12066,11 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = BoundVar => ActionFn(76); + // BoundVar? = BoundVar => ActionFn(77); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action76::<>(input, __sym0); + let __nt = super::__action77::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (1, 12) } @@ -11961,10 +12083,10 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = => ActionFn(77); + // BoundVar? = => ActionFn(78); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action77::<>(input, &__start, &__end); + let __nt = super::__action78::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (0, 12) } @@ -11977,11 +12099,11 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = BoundVar => ActionFn(109); + // Comma = BoundVar => ActionFn(110); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action109::<>(input, __sym0); + let __nt = super::__action110::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -11994,10 +12116,10 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(110); + // Comma = => ActionFn(111); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action110::<>(input, &__start, &__end); + let __nt = super::__action111::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (0, 13) } @@ -12010,13 +12132,13 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, BoundVar => ActionFn(111); + // Comma = ( ",")+, BoundVar => ActionFn(112); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action111::<>(input, __sym0, __sym1); + let __nt = super::__action112::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (2, 13) } @@ -12029,11 +12151,11 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(112); + // Comma = ( ",")+ => ActionFn(113); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action112::<>(input, __sym0); + let __nt = super::__action113::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -12046,11 +12168,11 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Expr => ActionFn(113); + // Comma = Expr => ActionFn(114); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action113::<>(input, __sym0); + let __nt = super::__action114::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -12063,10 +12185,10 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(114); + // Comma = => ActionFn(115); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action114::<>(input, &__start, &__end); + let __nt = super::__action115::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (0, 14) } @@ -12079,13 +12201,13 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Expr => ActionFn(115); + // Comma = ( ",")+, Expr => ActionFn(116); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action115::<>(input, __sym0, __sym1); + let __nt = super::__action116::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (2, 14) } @@ -12098,11 +12220,11 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(116); + // Comma = ( ",")+ => ActionFn(117); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action116::<>(input, __sym0); + let __nt = super::__action117::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -12115,11 +12237,11 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Type => ActionFn(117); + // Comma = Type => ActionFn(118); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action117::<>(input, __sym0); + let __nt = super::__action118::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -12132,10 +12254,10 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(118); + // Comma = => ActionFn(119); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action118::<>(input, &__start, &__end); + let __nt = super::__action119::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (0, 15) } @@ -12148,13 +12270,13 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Type => ActionFn(119); + // Comma = ( ",")+, Type => ActionFn(120); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action119::<>(input, __sym0, __sym1); + let __nt = super::__action120::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (2, 15) } @@ -12167,11 +12289,11 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(120); + // Comma = ( ",")+ => ActionFn(121); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action120::<>(input, __sym0); + let __nt = super::__action121::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -12631,7 +12753,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "+", Expr, Expr, ")" => ActionFn(52); + // Expr = "(", "sdiv", Expr, Expr, ")" => ActionFn(52); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -12653,7 +12775,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "-", Expr, Expr, ")" => ActionFn(53); + // Expr = "(", "+", Expr, Expr, ")" => ActionFn(53); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -12675,7 +12797,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "&", Expr, Expr, ")" => ActionFn(54); + // Expr = "(", "-", Expr, Expr, ")" => ActionFn(54); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -12697,7 +12819,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "|", Expr, Expr, ")" => ActionFn(55); + // Expr = "(", "&", Expr, Expr, ")" => ActionFn(55); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -12719,7 +12841,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(56); + // Expr = "(", "|", Expr, Expr, ")" => ActionFn(56); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -12741,7 +12863,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(57); + // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(57); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -12763,7 +12885,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(58); + // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(58); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -12785,7 +12907,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(59); + // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(59); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -12807,7 +12929,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(60); + // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(60); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -12829,11 +12951,11 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(61); + // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(61); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -12851,11 +12973,11 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(62); + // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(62); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -12873,11 +12995,11 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(63); + // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(63); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -12895,11 +13017,11 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(64); + // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(64); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -12917,7 +13039,29 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(65); + // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(65); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant3(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym4.2.clone(); + let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant3(__nt), __end)); + (5, 17) + } + pub(crate) fn __reduce68< + 'input, + >( + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: core::marker::PhantomData<(&'input ())>, + ) -> (usize, usize) + { + // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(66); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant3(__symbols); @@ -12927,11 +13071,11 @@ mod __parse__Function { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym5.2.clone(); - let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (6, 17) } - pub(crate) fn __reduce68< + pub(crate) fn __reduce69< 'input, >( input: &'input str, @@ -12940,7 +13084,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(66); + // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(67); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -12949,11 +13093,11 @@ mod __parse__Function { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce69< + pub(crate) fn __reduce70< 'input, >( input: &'input str, @@ -12962,7 +13106,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(67); + // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(68); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -12971,11 +13115,11 @@ mod __parse__Function { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce70< + pub(crate) fn __reduce71< 'input, >( input: &'input str, @@ -12984,7 +13128,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(68); + // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(69); assert!(__symbols.len() >= 11); let __sym10 = __pop_Variant0(__symbols); let __sym9 = __pop_Variant0(__symbols); @@ -12999,11 +13143,11 @@ mod __parse__Function { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym10.2.clone(); - let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); + let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (11, 17) } - pub(crate) fn __reduce71< + pub(crate) fn __reduce72< 'input, >( input: &'input str, @@ -13012,7 +13156,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(69); + // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(70); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -13021,11 +13165,11 @@ mod __parse__Function { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce72< + pub(crate) fn __reduce73< 'input, >( input: &'input str, @@ -13034,7 +13178,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "bv2int", Expr, ")" => ActionFn(70); + // Expr = "(", "bv2int", Expr, ")" => ActionFn(71); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -13042,11 +13186,11 @@ mod __parse__Function { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce73< + pub(crate) fn __reduce74< 'input, >( input: &'input str, @@ -13055,7 +13199,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "widthof", Expr, ")" => ActionFn(71); + // Expr = "(", "widthof", Expr, ")" => ActionFn(72); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -13063,11 +13207,11 @@ mod __parse__Function { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce74< + pub(crate) fn __reduce75< 'input, >( input: &'input str, @@ -13076,15 +13220,15 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = Expr => ActionFn(86); + // Expr? = Expr => ActionFn(87); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action86::<>(input, __sym0); + let __nt = super::__action87::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (1, 18) } - pub(crate) fn __reduce75< + pub(crate) fn __reduce76< 'input, >( input: &'input str, @@ -13093,14 +13237,14 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = => ActionFn(87); + // Expr? = => ActionFn(88); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action87::<>(input, &__start, &__end); + let __nt = super::__action88::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (0, 18) } - pub(crate) fn __reduce76< + pub(crate) fn __reduce77< 'input, >( input: &'input str, @@ -13117,7 +13261,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 19) } - pub(crate) fn __reduce77< + pub(crate) fn __reduce78< 'input, >( input: &'input str, @@ -13144,7 +13288,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (10, 20) } - pub(crate) fn __reduce78< + pub(crate) fn __reduce79< 'input, >( input: &'input str, @@ -13165,7 +13309,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (4, 21) } - pub(crate) fn __reduce79< + pub(crate) fn __reduce80< 'input, >( input: &'input str, @@ -13189,7 +13333,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (7, 22) } - pub(crate) fn __reduce80< + pub(crate) fn __reduce81< 'input, >( input: &'input str, @@ -13206,7 +13350,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce81< + pub(crate) fn __reduce82< 'input, >( input: &'input str, @@ -13223,7 +13367,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce82< + pub(crate) fn __reduce83< 'input, >( input: &'input str, @@ -13240,7 +13384,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce83< + pub(crate) fn __reduce84< 'input, >( input: &'input str, @@ -13257,7 +13401,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant17(__nt), __end)); (1, 24) } - pub(crate) fn __reduce84< + pub(crate) fn __reduce85< 'input, >( input: &'input str, @@ -13266,7 +13410,7 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(72); + // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(73); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -13278,11 +13422,11 @@ mod __parse__Function { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym7.2.clone(); - let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action73::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (8, 25) } - pub(crate) fn __reduce85< + pub(crate) fn __reduce86< 'input, >( input: &'input str, @@ -13306,7 +13450,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (7, 26) } - pub(crate) fn __reduce86< + pub(crate) fn __reduce87< 'input, >( input: &'input str, @@ -13323,7 +13467,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce87< + pub(crate) fn __reduce88< 'input, >( input: &'input str, @@ -13342,7 +13486,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 27) } - pub(crate) fn __reduce88< + pub(crate) fn __reduce89< 'input, >( input: &'input str, @@ -13359,7 +13503,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce89< + pub(crate) fn __reduce90< 'input, >( input: &'input str, @@ -13376,7 +13520,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce90< + pub(crate) fn __reduce91< 'input, >( input: &'input str, @@ -13385,15 +13529,15 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = Type => ActionFn(81); + // Type? = Type => ActionFn(82); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action81::<>(input, __sym0); + let __nt = super::__action82::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (1, 28) } - pub(crate) fn __reduce91< + pub(crate) fn __reduce92< 'input, >( input: &'input str, @@ -13402,14 +13546,14 @@ mod __parse__Function { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = => ActionFn(82); + // Type? = => ActionFn(83); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action82::<>(input, &__start, &__end); + let __nt = super::__action83::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (0, 28) } - pub(crate) fn __reduce92< + pub(crate) fn __reduce93< 'input, >( input: &'input str, @@ -13426,7 +13570,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 29) } - pub(crate) fn __reduce93< + pub(crate) fn __reduce94< 'input, >( input: &'input str, @@ -13443,7 +13587,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant21(__nt), __end)); (1, 30) } - pub(crate) fn __reduce94< + pub(crate) fn __reduce95< 'input, >( input: &'input str, @@ -13463,7 +13607,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce95< + pub(crate) fn __reduce96< 'input, >( input: &'input str, @@ -13483,7 +13627,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce96< + pub(crate) fn __reduce97< 'input, >( input: &'input str, @@ -13500,7 +13644,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (1, 32) } - pub(crate) fn __reduce97< + pub(crate) fn __reduce98< 'input, >( input: &'input str, @@ -13517,7 +13661,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (1, 33) } - pub(crate) fn __reduce98< + pub(crate) fn __reduce99< 'input, >( input: &'input str, @@ -13534,7 +13678,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (1, 34) } - pub(crate) fn __reduce100< + pub(crate) fn __reduce101< 'input, >( input: &'input str, @@ -13551,7 +13695,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (1, 36) } - pub(crate) fn __reduce101< + pub(crate) fn __reduce102< 'input, >( input: &'input str, @@ -13568,7 +13712,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (1, 37) } - pub(crate) fn __reduce102< + pub(crate) fn __reduce103< 'input, >( input: &'input str, @@ -13585,7 +13729,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (1, 38) } - pub(crate) fn __reduce103< + pub(crate) fn __reduce104< 'input, >( input: &'input str, @@ -13602,7 +13746,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (1, 39) } - pub(crate) fn __reduce104< + pub(crate) fn __reduce105< 'input, >( input: &'input str, @@ -13619,7 +13763,7 @@ mod __parse__Function { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 40) } - pub(crate) fn __reduce105< + pub(crate) fn __reduce106< 'input, >( input: &'input str, @@ -13682,362 +13826,370 @@ mod __parse__FunctionApplication { } const __ACTION: &[i16] = &[ // State 0 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1 - 5, 6, 7, 0, 0, 0, 8, 9, 0, 10, 11, 0, 12, 13, 14, 15, 16, 17, 0, 0, 0, 18, 19, 20, 21, 0, 22, 75, 0, 23, 24, 0, 0, 25, 26, 27, 28, 29, 0, 30, 0, 76, 31, 32, 33, 0, 34, 35, 0, 36, 77, 0, 78, 79, 80, + 5, 6, 7, 0, 0, 0, 8, 9, 0, 10, 11, 0, 12, 13, 14, 15, 16, 17, 0, 0, 0, 18, 19, 20, 21, 0, 22, 77, 0, 23, 24, 0, 0, 25, 26, 27, 28, 29, 30, 0, 31, 0, 78, 32, 33, 34, 0, 35, 36, 0, 37, 79, 0, 80, 81, 82, // State 2 - 0, 0, 0, 2, 0, -27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, -27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 3 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, // State 4 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 5 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 6 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 7 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 8 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 9 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 10 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 11 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 12 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 13 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 14 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 15 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 16 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 17 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 18 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 19 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 20 - 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 21 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, // State 22 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 23 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, // State 24 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 25 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 26 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 27 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 28 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 29 - 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 30 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 31 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 32 - 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 33 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 34 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 35 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 36 - 0, 0, 0, 2, 0, -29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 37 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, -29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 38 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 39 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 40 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 41 - 0, 0, 0, 2, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 42 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 43 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 44 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 45 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 46 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 47 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 48 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 49 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 50 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 51 - 5, 6, 7, 0, 0, 0, 8, 9, 0, 10, 11, 0, 12, 13, 14, 15, 16, 17, 0, 0, 0, 18, 19, 20, 21, 0, 22, 75, 0, 23, 24, 0, 121, 25, 26, 27, 28, 29, 0, 30, 0, 76, 31, 32, 33, 0, 34, 35, 0, 36, 77, 87, 78, 79, 80, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 52 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, + 5, 6, 7, 0, 0, 0, 8, 9, 0, 10, 11, 0, 12, 13, 14, 15, 16, 17, 0, 0, 0, 18, 19, 20, 21, 0, 22, 77, 0, 23, 24, 0, 123, 25, 26, 27, 28, 29, 30, 0, 31, 0, 78, 32, 33, 34, 0, 35, 36, 0, 37, 79, 89, 80, 81, 82, // State 53 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, // State 54 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 55 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 56 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 57 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 58 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 59 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 60 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 61 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 62 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 63 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 64 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 65 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 66 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 67 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 68 - 0, 0, 0, 0, 0, -87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 69 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 70 - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, // State 71 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 72 - 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 73 - 0, 0, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 74 - 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 75 - 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 76 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -84, 0, 0, 0, + 0, 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 77 - 0, 0, 0, 0, 0, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 78 - 0, 0, 0, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -85, 0, 0, 0, // State 79 - 0, 0, 0, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 80 - 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 81 - 0, 0, 0, 0, 0, -26, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 82 - 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 83 - 0, 0, 0, -36, 0, -36, 0, 0, -36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -36, 0, 0, -36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -26, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 84 - 0, 0, 0, -35, 0, -35, 0, 0, -35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -35, 0, 0, -35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 85 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -36, 0, -36, 0, 0, -36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -36, 0, 0, -36, 0, 0, 0, 0, 0, 0, // State 86 - 0, 0, 0, -94, 0, -94, 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, 0, + 0, 0, 0, -35, 0, -35, 0, 0, -35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -35, 0, 0, -35, 0, 0, 0, 0, 0, 0, // State 87 - 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 88 - 0, 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -95, 0, -95, 0, 0, 0, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -95, 0, 0, 0, // State 89 - 0, 0, 0, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 90 - 0, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 91 - 0, 0, 0, -38, 0, -38, 0, 0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 0, 0, -38, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 92 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 93 - 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -38, 0, -38, 0, 0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 0, 0, -38, 0, 0, 0, 0, 0, 0, // State 94 - 0, 0, 0, -37, 0, -37, 0, 0, -37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -37, 0, 0, -37, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 95 - 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 96 - 0, 0, 0, 0, 0, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -37, 0, -37, 0, 0, -37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -37, 0, 0, -37, 0, 0, 0, 0, 0, 0, // State 97 - 0, 0, 0, 0, 0, -28, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 98 - 0, 0, 0, -9, 0, -9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 99 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -28, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 100 - 0, 0, 0, -39, 0, -39, 0, 0, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, 0, 0, -39, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -9, 0, -9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 101 - 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 102 - 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -39, 0, -39, 0, 0, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, 0, 0, -39, 0, 0, 0, 0, 0, 0, // State 103 - 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 104 - 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 105 - 0, 0, 0, 0, 0, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 106 - 0, 0, 0, -45, 0, -45, 0, 0, -45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -45, 0, 0, -45, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 107 - 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 108 - 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -45, 0, -45, 0, 0, -45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -45, 0, 0, -45, 0, 0, 0, 0, 0, 0, // State 109 - 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 110 - 0, 0, 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 111 - 0, 0, 0, 0, 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 112 - 0, 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 113 - 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 114 - 0, 0, 0, -73, 0, -73, 0, 0, -73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -73, 0, 0, -73, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 115 - 0, 0, 0, -49, 0, -49, 0, 0, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49, 0, 0, -49, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 116 - 0, 0, 0, -47, 0, -47, 0, 0, -47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -47, 0, 0, -47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -74, 0, -74, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, -74, 0, 0, 0, 0, 0, 0, // State 117 - 0, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -49, 0, -49, 0, 0, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49, 0, 0, -49, 0, 0, 0, 0, 0, 0, // State 118 - 0, 0, 0, 0, 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -47, 0, -47, 0, 0, -47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -47, 0, 0, -47, 0, 0, 0, 0, 0, 0, // State 119 - 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 120 - 0, 0, 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 121 - 0, 0, 0, 0, 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 122 - 0, 0, 0, -51, 0, -51, 0, 0, -51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 0, 0, -51, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 123 - 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 124 - 0, 0, 0, 0, 0, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -51, 0, -51, 0, 0, -51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 0, 0, -51, 0, 0, 0, 0, 0, 0, // State 125 - 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 126 - 0, 0, 0, 0, 0, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 127 - 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 128 - 0, 0, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 129 - 0, 0, 0, -74, 0, -74, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, -74, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 130 - 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 131 - 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 132 - 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -75, 0, -75, 0, 0, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, -75, 0, 0, 0, 0, 0, 0, // State 133 - 0, 0, 0, 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 134 - 0, 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 135 - 0, 0, 0, -46, 0, -46, 0, 0, -46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -46, 0, 0, -46, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 136 - 0, 0, 0, -10, 0, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 137 - 0, 0, 0, 0, 0, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 138 - 0, 0, 0, 0, 0, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -46, 0, -46, 0, 0, -46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -46, 0, 0, -46, 0, 0, 0, 0, 0, 0, // State 139 - 0, 0, 0, 0, 0, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -10, 0, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 140 - 0, 0, 0, -57, 0, -57, 0, 0, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -57, 0, 0, -57, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 141 - 0, 0, 0, -40, 0, -40, 0, 0, -40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -40, 0, 0, -40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 142 - 0, 0, 0, -53, 0, -53, 0, 0, -53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -53, 0, 0, -53, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 143 - 0, 0, 0, -55, 0, -55, 0, 0, -55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -55, 0, 0, -55, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -58, 0, -58, 0, 0, -58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -58, 0, 0, -58, 0, 0, 0, 0, 0, 0, // State 144 - 0, 0, 0, -56, 0, -56, 0, 0, -56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -56, 0, 0, -56, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -40, 0, -40, 0, 0, -40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -40, 0, 0, -40, 0, 0, 0, 0, 0, 0, // State 145 - 0, 0, 0, -54, 0, -54, 0, 0, -54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -54, 0, 0, -54, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -53, 0, -53, 0, 0, -53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -53, 0, 0, -53, 0, 0, 0, 0, 0, 0, // State 146 - 0, 0, 0, -44, 0, -44, 0, 0, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, 0, 0, -44, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -56, 0, -56, 0, 0, -56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -56, 0, 0, -56, 0, 0, 0, 0, 0, 0, // State 147 - 0, 0, 0, -43, 0, -43, 0, 0, -43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43, 0, 0, -43, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -57, 0, -57, 0, 0, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -57, 0, 0, -57, 0, 0, 0, 0, 0, 0, // State 148 - 0, 0, 0, -42, 0, -42, 0, 0, -42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42, 0, 0, -42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -54, 0, -54, 0, 0, -54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -54, 0, 0, -54, 0, 0, 0, 0, 0, 0, // State 149 - 0, 0, 0, -50, 0, -50, 0, 0, -50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -50, 0, 0, -50, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -44, 0, -44, 0, 0, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, 0, 0, -44, 0, 0, 0, 0, 0, 0, // State 150 - 0, 0, 0, -48, 0, -48, 0, 0, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, 0, 0, -48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -43, 0, -43, 0, 0, -43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43, 0, 0, -43, 0, 0, 0, 0, 0, 0, // State 151 - 0, 0, 0, -52, 0, -52, 0, 0, -52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52, 0, 0, -52, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -42, 0, -42, 0, 0, -42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42, 0, 0, -42, 0, 0, 0, 0, 0, 0, // State 152 - 0, 0, 0, -70, 0, -70, 0, 0, -70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -70, 0, 0, -70, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -50, 0, -50, 0, 0, -50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -50, 0, 0, -50, 0, 0, 0, 0, 0, 0, // State 153 - 0, 0, 0, -69, 0, -69, 0, 0, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -69, 0, 0, -69, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -48, 0, -48, 0, 0, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, 0, 0, -48, 0, 0, 0, 0, 0, 0, // State 154 - 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -52, 0, -52, 0, 0, -52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52, 0, 0, -52, 0, 0, 0, 0, 0, 0, // State 155 - 0, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -71, 0, -71, 0, 0, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71, 0, 0, -71, 0, 0, 0, 0, 0, 0, // State 156 - 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -70, 0, -70, 0, 0, -70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -70, 0, 0, -70, 0, 0, 0, 0, 0, 0, // State 157 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 158 - 0, 0, 0, -72, 0, -72, 0, 0, -72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -72, 0, 0, -72, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 159 - 0, 0, 0, -60, 0, -60, 0, 0, -60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -60, 0, 0, -60, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 160 - 0, 0, 0, -61, 0, -61, 0, 0, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, 0, 0, -61, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, // State 161 - 0, 0, 0, -62, 0, -62, 0, 0, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, 0, 0, -62, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -73, 0, -73, 0, 0, -73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -73, 0, 0, -73, 0, 0, 0, 0, 0, 0, // State 162 - 0, 0, 0, -63, 0, -63, 0, 0, -63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -63, 0, 0, -63, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -61, 0, -61, 0, 0, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, 0, 0, -61, 0, 0, 0, 0, 0, 0, // State 163 - 0, 0, 0, -67, 0, -67, 0, 0, -67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -67, 0, 0, -67, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -62, 0, -62, 0, 0, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, 0, 0, -62, 0, 0, 0, 0, 0, 0, // State 164 - 0, 0, 0, -66, 0, -66, 0, 0, -66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -66, 0, 0, -66, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -55, 0, -55, 0, 0, -55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -55, 0, 0, -55, 0, 0, 0, 0, 0, 0, // State 165 - 0, 0, 0, -59, 0, -59, 0, 0, -59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -59, 0, 0, -59, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -63, 0, -63, 0, 0, -63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -63, 0, 0, -63, 0, 0, 0, 0, 0, 0, // State 166 - 0, 0, 0, -65, 0, -65, 0, 0, -65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -65, 0, 0, -65, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -64, 0, -64, 0, 0, -64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -64, 0, 0, -64, 0, 0, 0, 0, 0, 0, // State 167 - 0, 0, 0, -64, 0, -64, 0, 0, -64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -64, 0, 0, -64, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -68, 0, -68, 0, 0, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -68, 0, 0, -68, 0, 0, 0, 0, 0, 0, // State 168 - 0, 0, 0, -58, 0, -58, 0, 0, -58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -58, 0, 0, -58, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -67, 0, -67, 0, 0, -67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -67, 0, 0, -67, 0, 0, 0, 0, 0, 0, // State 169 - 0, 0, 0, -41, 0, -41, 0, 0, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -41, 0, 0, -41, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -60, 0, -60, 0, 0, -60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -60, 0, 0, -60, 0, 0, 0, 0, 0, 0, // State 170 - 0, 0, 0, 0, 0, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -66, 0, -66, 0, 0, -66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -66, 0, 0, -66, 0, 0, 0, 0, 0, 0, // State 171 - 0, 0, 0, -68, 0, -68, 0, 0, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -68, 0, 0, -68, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -65, 0, -65, 0, 0, -65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -65, 0, 0, -65, 0, 0, 0, 0, 0, 0, // State 172 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -59, 0, -59, 0, 0, -59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -59, 0, 0, -59, 0, 0, 0, 0, 0, 0, // State 173 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -41, 0, -41, 0, 0, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -41, 0, 0, -41, 0, 0, 0, 0, 0, 0, // State 174 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 175 - 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -69, 0, -69, 0, 0, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -69, 0, 0, -69, 0, 0, 0, 0, 0, 0, // State 176 - 0, 0, 0, -71, 0, -71, 0, 0, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71, 0, 0, -71, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 177 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 178 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, + // State 179 + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 180 + 0, 0, 0, -72, 0, -72, 0, 0, -72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -72, 0, 0, -72, 0, 0, 0, 0, 0, 0, ]; fn __action(state: i16, integer: usize) -> i16 { - __ACTION[(state as usize) * 55 + integer] + __ACTION[(state as usize) * 56 + integer] } const __EOF_ACTION: &[i16] = &[ // State 0 @@ -14183,11 +14335,11 @@ mod __parse__FunctionApplication { // State 70 0, // State 71 - -101, + 0, // State 72 0, // State 73 - 0, + -102, // State 74 0, // State 75 @@ -14239,11 +14391,11 @@ mod __parse__FunctionApplication { // State 98 0, // State 99 - -79, + 0, // State 100 0, // State 101 - 0, + -80, // State 102 0, // State 103 @@ -14394,93 +14546,103 @@ mod __parse__FunctionApplication { 0, // State 176 0, + // State 177 + 0, + // State 178 + 0, + // State 179 + 0, + // State 180 + 0, ]; fn __goto(state: i16, nt: usize) -> i16 { match nt { - 5 => 36, - 14 => 80, - 16 => 72, + 5 => 37, + 14 => 82, + 16 => 74, 17 => match state { - 6 => 38, - 7 => 39, - 8 => 40, - 9 => 41, - 10 => 42, - 11 => 43, - 12 => 44, - 13 => 45, - 14 => 46, - 15 => 47, - 16 => 48, - 20 => 49, - 25 => 54, - 26 => 55, - 27 => 56, - 28 => 57, - 29 => 58, - 31 => 60, - 32 => 61, + 6 => 39, + 7 => 40, + 8 => 41, + 9 => 42, + 10 => 43, + 11 => 44, + 12 => 45, + 13 => 46, + 14 => 47, + 15 => 48, + 16 => 49, + 20 => 50, + 25 => 55, + 26 => 56, + 27 => 57, + 28 => 58, + 29 => 59, + 30 => 60, + 32 => 62, 33 => 63, - 34 => 64, - 0 => 70, - 2 => 81, - 4 => 87, - 17 => 88, - 18 => 89, - 19 => 90, - 22 => 92, - 24 => 93, - 30 => 95, - 35 => 96, - 36 => 97, - 37 => 101, - 38 => 102, - 39 => 103, - 40 => 104, - 41 => 105, + 34 => 65, + 35 => 66, + 0 => 72, + 2 => 83, + 4 => 89, + 17 => 90, + 18 => 91, + 19 => 92, + 22 => 94, + 24 => 95, + 31 => 97, + 36 => 98, + 37 => 99, + 38 => 103, + 39 => 104, + 40 => 105, + 41 => 106, 42 => 107, - 43 => 108, - 44 => 109, - 45 => 110, - 46 => 111, - 47 => 112, - 48 => 113, - 49 => 117, - 50 => 118, - 53 => 121, + 43 => 109, + 44 => 110, + 45 => 111, + 46 => 112, + 47 => 113, + 48 => 114, + 49 => 115, + 50 => 119, + 51 => 120, 54 => 123, - 55 => 124, - 56 => 125, - 57 => 126, - 58 => 127, - 59 => 128, + 55 => 125, + 56 => 126, + 57 => 127, + 58 => 128, + 59 => 129, 60 => 130, 61 => 131, - 62 => 132, - 63 => 133, - 64 => 134, - 66 => 156, - 67 => 157, - 69 => 174, - _ => 37, + 62 => 133, + 63 => 134, + 64 => 135, + 65 => 136, + 66 => 137, + 68 => 159, + 69 => 160, + 71 => 178, + _ => 38, }, - 19 => 82, - 21 => 71, - 23 => 73, + 19 => 84, + 21 => 73, + 23 => 75, 24 => 3, - 27 => 137, + 27 => 140, 30 => match state { - 23 => 53, - 52 => 66, - 3 => 85, - 51 => 119, - 68 => 170, - _ => 52, + 23 => 54, + 53 => 68, + 3 => 87, + 52 => 121, + 70 => 174, + _ => 53, }, 31 => match state { - 29 => 59, - 32 => 62, - _ => 50, + 30 => 61, + 33 => 64, + _ => 51, }, _ => 0, } @@ -14523,6 +14685,7 @@ mod __parse__FunctionApplication { r###""rev""###, r###""rotl""###, r###""rotr""###, + r###""sdiv""###, r###""shl""###, r###""shr""###, r###""sig""###, @@ -14594,7 +14757,7 @@ mod __parse__FunctionApplication { #[inline] fn error_action(&self, state: i16) -> i16 { - __action(state, 55 - 1) + __action(state, 56 - 1) } #[inline] @@ -14707,11 +14870,12 @@ mod __parse__FunctionApplication { Token(52, _) if true => Some(47), Token(53, _) if true => Some(48), Token(54, _) if true => Some(49), - Token(0, _) if true => Some(50), - Token(1, _) if true => Some(51), - Token(2, _) if true => Some(52), - Token(3, _) if true => Some(53), - Token(4, _) if true => Some(54), + Token(55, _) if true => Some(50), + Token(0, _) if true => Some(51), + Token(1, _) if true => Some(52), + Token(2, _) if true => Some(53), + Token(3, _) if true => Some(54), + Token(4, _) if true => Some(55), _ => None, } } @@ -14724,8 +14888,8 @@ mod __parse__FunctionApplication { ) -> __Symbol<'input> { match __token_index { - 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 => match __token { - Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 => match __token { + Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(55, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), _ => unreachable!(), }, _ => unreachable!(), @@ -15076,6 +15240,9 @@ mod __parse__FunctionApplication { __reduce99(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } 100 => { + __reduce100(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } + 101 => { // __FunctionApplication = FunctionApplication => ActionFn(6); let __sym0 = __pop_Variant14(__symbols); let __start = __sym0.0.clone(); @@ -15083,9 +15250,6 @@ mod __parse__FunctionApplication { let __nt = super::__action6::<>(input, __sym0); return Some(Ok(__nt)); } - 101 => { - __reduce101(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) - } 102 => { __reduce102(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } @@ -15098,6 +15262,9 @@ mod __parse__FunctionApplication { 105 => { __reduce105(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } + 106 => { + __reduce106(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } _ => panic!("invalid action code {}", __action) }; let __states_len = __states.len(); @@ -15373,13 +15540,13 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = BoundVar, "," => ActionFn(80); + // ( ",") = BoundVar, "," => ActionFn(81); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action80::<>(input, __sym0, __sym1); + let __nt = super::__action81::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (2, 0) } @@ -15392,10 +15559,10 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(78); + // ( ",")* = => ActionFn(79); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action78::<>(input, &__start, &__end); + let __nt = super::__action79::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (0, 1) } @@ -15408,11 +15575,11 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(79); + // ( ",")* = ( ",")+ => ActionFn(80); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action79::<>(input, __sym0); + let __nt = super::__action80::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (1, 1) } @@ -15425,13 +15592,13 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = BoundVar, "," => ActionFn(97); + // ( ",")+ = BoundVar, "," => ActionFn(98); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action97::<>(input, __sym0, __sym1); + let __nt = super::__action98::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (2, 2) } @@ -15444,14 +15611,14 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(98); + // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(99); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action98::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action99::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (3, 2) } @@ -15464,13 +15631,13 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Expr, "," => ActionFn(90); + // ( ",") = Expr, "," => ActionFn(91); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action90::<>(input, __sym0, __sym1); + let __nt = super::__action91::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (2, 3) } @@ -15483,10 +15650,10 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(88); + // ( ",")* = => ActionFn(89); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action88::<>(input, &__start, &__end); + let __nt = super::__action89::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (0, 4) } @@ -15499,11 +15666,11 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(89); + // ( ",")* = ( ",")+ => ActionFn(90); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action89::<>(input, __sym0); + let __nt = super::__action90::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (1, 4) } @@ -15516,13 +15683,13 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Expr, "," => ActionFn(101); + // ( ",")+ = Expr, "," => ActionFn(102); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action101::<>(input, __sym0, __sym1); + let __nt = super::__action102::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (2, 5) } @@ -15535,14 +15702,14 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Expr, "," => ActionFn(102); + // ( ",")+ = ( ",")+, Expr, "," => ActionFn(103); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action102::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action103::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (3, 5) } @@ -15555,13 +15722,13 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Type, "," => ActionFn(85); + // ( ",") = Type, "," => ActionFn(86); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action85::<>(input, __sym0, __sym1); + let __nt = super::__action86::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 6) } @@ -15574,10 +15741,10 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(83); + // ( ",")* = => ActionFn(84); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action83::<>(input, &__start, &__end); + let __nt = super::__action84::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (0, 7) } @@ -15590,11 +15757,11 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(84); + // ( ",")* = ( ",")+ => ActionFn(85); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action84::<>(input, __sym0); + let __nt = super::__action85::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (1, 7) } @@ -15607,13 +15774,13 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Type, "," => ActionFn(105); + // ( ",")+ = Type, "," => ActionFn(106); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action105::<>(input, __sym0, __sym1); + let __nt = super::__action106::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (2, 8) } @@ -15626,14 +15793,14 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Type, "," => ActionFn(106); + // ( ",")+ = ( ",")+, Type, "," => ActionFn(107); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action106::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action107::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (3, 8) } @@ -15720,11 +15887,11 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = BoundVar => ActionFn(76); + // BoundVar? = BoundVar => ActionFn(77); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action76::<>(input, __sym0); + let __nt = super::__action77::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (1, 12) } @@ -15737,10 +15904,10 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = => ActionFn(77); + // BoundVar? = => ActionFn(78); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action77::<>(input, &__start, &__end); + let __nt = super::__action78::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (0, 12) } @@ -15753,11 +15920,11 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = BoundVar => ActionFn(109); + // Comma = BoundVar => ActionFn(110); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action109::<>(input, __sym0); + let __nt = super::__action110::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -15770,10 +15937,10 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(110); + // Comma = => ActionFn(111); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action110::<>(input, &__start, &__end); + let __nt = super::__action111::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (0, 13) } @@ -15786,13 +15953,13 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, BoundVar => ActionFn(111); + // Comma = ( ",")+, BoundVar => ActionFn(112); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action111::<>(input, __sym0, __sym1); + let __nt = super::__action112::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (2, 13) } @@ -15805,11 +15972,11 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(112); + // Comma = ( ",")+ => ActionFn(113); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action112::<>(input, __sym0); + let __nt = super::__action113::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -15822,11 +15989,11 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Expr => ActionFn(113); + // Comma = Expr => ActionFn(114); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action113::<>(input, __sym0); + let __nt = super::__action114::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -15839,10 +16006,10 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(114); + // Comma = => ActionFn(115); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action114::<>(input, &__start, &__end); + let __nt = super::__action115::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (0, 14) } @@ -15855,13 +16022,13 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Expr => ActionFn(115); + // Comma = ( ",")+, Expr => ActionFn(116); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action115::<>(input, __sym0, __sym1); + let __nt = super::__action116::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (2, 14) } @@ -15874,11 +16041,11 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(116); + // Comma = ( ",")+ => ActionFn(117); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action116::<>(input, __sym0); + let __nt = super::__action117::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -15891,11 +16058,11 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Type => ActionFn(117); + // Comma = Type => ActionFn(118); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action117::<>(input, __sym0); + let __nt = super::__action118::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -15908,10 +16075,10 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(118); + // Comma = => ActionFn(119); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action118::<>(input, &__start, &__end); + let __nt = super::__action119::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (0, 15) } @@ -15924,13 +16091,13 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Type => ActionFn(119); + // Comma = ( ",")+, Type => ActionFn(120); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action119::<>(input, __sym0, __sym1); + let __nt = super::__action120::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (2, 15) } @@ -15943,11 +16110,11 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(120); + // Comma = ( ",")+ => ActionFn(121); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action120::<>(input, __sym0); + let __nt = super::__action121::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -16407,7 +16574,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "+", Expr, Expr, ")" => ActionFn(52); + // Expr = "(", "sdiv", Expr, Expr, ")" => ActionFn(52); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -16429,7 +16596,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "-", Expr, Expr, ")" => ActionFn(53); + // Expr = "(", "+", Expr, Expr, ")" => ActionFn(53); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -16451,7 +16618,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "&", Expr, Expr, ")" => ActionFn(54); + // Expr = "(", "-", Expr, Expr, ")" => ActionFn(54); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -16473,7 +16640,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "|", Expr, Expr, ")" => ActionFn(55); + // Expr = "(", "&", Expr, Expr, ")" => ActionFn(55); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -16495,7 +16662,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(56); + // Expr = "(", "|", Expr, Expr, ")" => ActionFn(56); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -16517,7 +16684,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(57); + // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(57); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -16539,7 +16706,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(58); + // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(58); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -16561,7 +16728,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(59); + // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(59); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -16583,7 +16750,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(60); + // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(60); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -16605,11 +16772,11 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(61); + // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(61); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -16627,11 +16794,11 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(62); + // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(62); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -16649,11 +16816,11 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(63); + // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(63); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -16671,11 +16838,11 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(64); + // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(64); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -16693,7 +16860,29 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(65); + // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(65); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant3(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym4.2.clone(); + let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant3(__nt), __end)); + (5, 17) + } + pub(crate) fn __reduce68< + 'input, + >( + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: core::marker::PhantomData<(&'input ())>, + ) -> (usize, usize) + { + // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(66); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant3(__symbols); @@ -16703,11 +16892,11 @@ mod __parse__FunctionApplication { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym5.2.clone(); - let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (6, 17) } - pub(crate) fn __reduce68< + pub(crate) fn __reduce69< 'input, >( input: &'input str, @@ -16716,7 +16905,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(66); + // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(67); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -16725,11 +16914,11 @@ mod __parse__FunctionApplication { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce69< + pub(crate) fn __reduce70< 'input, >( input: &'input str, @@ -16738,7 +16927,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(67); + // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(68); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -16747,11 +16936,11 @@ mod __parse__FunctionApplication { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce70< + pub(crate) fn __reduce71< 'input, >( input: &'input str, @@ -16760,7 +16949,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(68); + // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(69); assert!(__symbols.len() >= 11); let __sym10 = __pop_Variant0(__symbols); let __sym9 = __pop_Variant0(__symbols); @@ -16775,11 +16964,11 @@ mod __parse__FunctionApplication { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym10.2.clone(); - let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); + let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (11, 17) } - pub(crate) fn __reduce71< + pub(crate) fn __reduce72< 'input, >( input: &'input str, @@ -16788,7 +16977,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(69); + // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(70); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -16797,11 +16986,11 @@ mod __parse__FunctionApplication { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce72< + pub(crate) fn __reduce73< 'input, >( input: &'input str, @@ -16810,7 +16999,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "bv2int", Expr, ")" => ActionFn(70); + // Expr = "(", "bv2int", Expr, ")" => ActionFn(71); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -16818,11 +17007,11 @@ mod __parse__FunctionApplication { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce73< + pub(crate) fn __reduce74< 'input, >( input: &'input str, @@ -16831,7 +17020,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "widthof", Expr, ")" => ActionFn(71); + // Expr = "(", "widthof", Expr, ")" => ActionFn(72); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -16839,11 +17028,11 @@ mod __parse__FunctionApplication { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce74< + pub(crate) fn __reduce75< 'input, >( input: &'input str, @@ -16852,15 +17041,15 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = Expr => ActionFn(86); + // Expr? = Expr => ActionFn(87); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action86::<>(input, __sym0); + let __nt = super::__action87::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (1, 18) } - pub(crate) fn __reduce75< + pub(crate) fn __reduce76< 'input, >( input: &'input str, @@ -16869,14 +17058,14 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = => ActionFn(87); + // Expr? = => ActionFn(88); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action87::<>(input, &__start, &__end); + let __nt = super::__action88::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (0, 18) } - pub(crate) fn __reduce76< + pub(crate) fn __reduce77< 'input, >( input: &'input str, @@ -16893,7 +17082,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 19) } - pub(crate) fn __reduce77< + pub(crate) fn __reduce78< 'input, >( input: &'input str, @@ -16920,7 +17109,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (10, 20) } - pub(crate) fn __reduce78< + pub(crate) fn __reduce79< 'input, >( input: &'input str, @@ -16941,7 +17130,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (4, 21) } - pub(crate) fn __reduce79< + pub(crate) fn __reduce80< 'input, >( input: &'input str, @@ -16965,7 +17154,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (7, 22) } - pub(crate) fn __reduce80< + pub(crate) fn __reduce81< 'input, >( input: &'input str, @@ -16982,7 +17171,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce81< + pub(crate) fn __reduce82< 'input, >( input: &'input str, @@ -16999,7 +17188,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce82< + pub(crate) fn __reduce83< 'input, >( input: &'input str, @@ -17016,7 +17205,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce83< + pub(crate) fn __reduce84< 'input, >( input: &'input str, @@ -17033,7 +17222,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant17(__nt), __end)); (1, 24) } - pub(crate) fn __reduce84< + pub(crate) fn __reduce85< 'input, >( input: &'input str, @@ -17042,7 +17231,7 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(72); + // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(73); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -17054,11 +17243,11 @@ mod __parse__FunctionApplication { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym7.2.clone(); - let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action73::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (8, 25) } - pub(crate) fn __reduce85< + pub(crate) fn __reduce86< 'input, >( input: &'input str, @@ -17082,7 +17271,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (7, 26) } - pub(crate) fn __reduce86< + pub(crate) fn __reduce87< 'input, >( input: &'input str, @@ -17099,7 +17288,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce87< + pub(crate) fn __reduce88< 'input, >( input: &'input str, @@ -17118,7 +17307,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 27) } - pub(crate) fn __reduce88< + pub(crate) fn __reduce89< 'input, >( input: &'input str, @@ -17135,7 +17324,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce89< + pub(crate) fn __reduce90< 'input, >( input: &'input str, @@ -17152,7 +17341,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce90< + pub(crate) fn __reduce91< 'input, >( input: &'input str, @@ -17161,15 +17350,15 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = Type => ActionFn(81); + // Type? = Type => ActionFn(82); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action81::<>(input, __sym0); + let __nt = super::__action82::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (1, 28) } - pub(crate) fn __reduce91< + pub(crate) fn __reduce92< 'input, >( input: &'input str, @@ -17178,14 +17367,14 @@ mod __parse__FunctionApplication { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = => ActionFn(82); + // Type? = => ActionFn(83); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action82::<>(input, &__start, &__end); + let __nt = super::__action83::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (0, 28) } - pub(crate) fn __reduce92< + pub(crate) fn __reduce93< 'input, >( input: &'input str, @@ -17202,7 +17391,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 29) } - pub(crate) fn __reduce93< + pub(crate) fn __reduce94< 'input, >( input: &'input str, @@ -17219,7 +17408,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant21(__nt), __end)); (1, 30) } - pub(crate) fn __reduce94< + pub(crate) fn __reduce95< 'input, >( input: &'input str, @@ -17239,7 +17428,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce95< + pub(crate) fn __reduce96< 'input, >( input: &'input str, @@ -17259,7 +17448,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce96< + pub(crate) fn __reduce97< 'input, >( input: &'input str, @@ -17276,7 +17465,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (1, 32) } - pub(crate) fn __reduce97< + pub(crate) fn __reduce98< 'input, >( input: &'input str, @@ -17293,7 +17482,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (1, 33) } - pub(crate) fn __reduce98< + pub(crate) fn __reduce99< 'input, >( input: &'input str, @@ -17310,7 +17499,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (1, 34) } - pub(crate) fn __reduce99< + pub(crate) fn __reduce100< 'input, >( input: &'input str, @@ -17327,7 +17516,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (1, 35) } - pub(crate) fn __reduce101< + pub(crate) fn __reduce102< 'input, >( input: &'input str, @@ -17344,7 +17533,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (1, 37) } - pub(crate) fn __reduce102< + pub(crate) fn __reduce103< 'input, >( input: &'input str, @@ -17361,7 +17550,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (1, 38) } - pub(crate) fn __reduce103< + pub(crate) fn __reduce104< 'input, >( input: &'input str, @@ -17378,7 +17567,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (1, 39) } - pub(crate) fn __reduce104< + pub(crate) fn __reduce105< 'input, >( input: &'input str, @@ -17395,7 +17584,7 @@ mod __parse__FunctionApplication { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 40) } - pub(crate) fn __reduce105< + pub(crate) fn __reduce106< 'input, >( input: &'input str, @@ -17458,48 +17647,48 @@ mod __parse__FunctionType { } const __ACTION: &[i8] = &[ // State 0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1 - 0, 0, 0, 0, 0, -31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 2 - 0, 0, 0, 0, 0, -33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 3 - 0, 0, 0, 0, 0, -87, 0, 0, -87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, + 0, 0, 0, 0, 0, -88, 0, 0, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, // State 4 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 5 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 6 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 7 - 0, 0, 0, 0, 0, -93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 8 - 0, 0, 0, 0, 0, -30, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -30, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 9 - 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 10 - 0, 0, 0, 0, 0, -90, 0, 0, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -91, 0, 0, -91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 11 - 0, 0, 0, 0, 0, -89, 0, 0, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -90, 0, 0, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 12 - 0, 0, 0, 0, 0, -32, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -32, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 13 - 0, 0, 0, 0, 0, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 14 - 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 15 - 0, 0, 0, 0, 0, -88, 0, 0, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -89, 0, 0, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 16 - 0, 0, 0, 0, 0, -94, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -95, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 17 - 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15, -15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15, -15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 18 - 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 19 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; fn __action(state: i8, integer: usize) -> i8 { - __ACTION[(state as usize) * 55 + integer] + __ACTION[(state as usize) * 56 + integer] } const __EOF_ACTION: &[i8] = &[ // State 0 @@ -17513,7 +17702,7 @@ mod __parse__FunctionType { // State 4 0, // State 5 - -102, + -103, // State 6 0, // State 7 @@ -17541,7 +17730,7 @@ mod __parse__FunctionType { // State 18 0, // State 19 - -80, + -81, ]; fn __goto(state: i8, nt: usize) -> i8 { match nt { @@ -17596,6 +17785,7 @@ mod __parse__FunctionType { r###""rev""###, r###""rotl""###, r###""rotr""###, + r###""sdiv""###, r###""shl""###, r###""shr""###, r###""sig""###, @@ -17667,7 +17857,7 @@ mod __parse__FunctionType { #[inline] fn error_action(&self, state: i8) -> i8 { - __action(state, 55 - 1) + __action(state, 56 - 1) } #[inline] @@ -17780,11 +17970,12 @@ mod __parse__FunctionType { Token(52, _) if true => Some(47), Token(53, _) if true => Some(48), Token(54, _) if true => Some(49), - Token(0, _) if true => Some(50), - Token(1, _) if true => Some(51), - Token(2, _) if true => Some(52), - Token(3, _) if true => Some(53), - Token(4, _) if true => Some(54), + Token(55, _) if true => Some(50), + Token(0, _) if true => Some(51), + Token(1, _) if true => Some(52), + Token(2, _) if true => Some(53), + Token(3, _) if true => Some(54), + Token(4, _) if true => Some(55), _ => None, } } @@ -17797,8 +17988,8 @@ mod __parse__FunctionType { ) -> __Symbol<'input> { match __token_index { - 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 => match __token { - Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 => match __token { + Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(55, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), _ => unreachable!(), }, _ => unreachable!(), @@ -18152,6 +18343,9 @@ mod __parse__FunctionType { __reduce100(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } 101 => { + __reduce101(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } + 102 => { // __FunctionType = FunctionType => ActionFn(3); let __sym0 = __pop_Variant15(__symbols); let __start = __sym0.0.clone(); @@ -18159,9 +18353,6 @@ mod __parse__FunctionType { let __nt = super::__action3::<>(input, __sym0); return Some(Ok(__nt)); } - 102 => { - __reduce102(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) - } 103 => { __reduce103(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } @@ -18171,6 +18362,9 @@ mod __parse__FunctionType { 105 => { __reduce105(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } + 106 => { + __reduce106(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } _ => panic!("invalid action code {}", __action) }; let __states_len = __states.len(); @@ -18446,13 +18640,13 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = BoundVar, "," => ActionFn(80); + // ( ",") = BoundVar, "," => ActionFn(81); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action80::<>(input, __sym0, __sym1); + let __nt = super::__action81::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (2, 0) } @@ -18465,10 +18659,10 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(78); + // ( ",")* = => ActionFn(79); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action78::<>(input, &__start, &__end); + let __nt = super::__action79::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (0, 1) } @@ -18481,11 +18675,11 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(79); + // ( ",")* = ( ",")+ => ActionFn(80); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action79::<>(input, __sym0); + let __nt = super::__action80::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (1, 1) } @@ -18498,13 +18692,13 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = BoundVar, "," => ActionFn(97); + // ( ",")+ = BoundVar, "," => ActionFn(98); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action97::<>(input, __sym0, __sym1); + let __nt = super::__action98::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (2, 2) } @@ -18517,14 +18711,14 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(98); + // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(99); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action98::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action99::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (3, 2) } @@ -18537,13 +18731,13 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Expr, "," => ActionFn(90); + // ( ",") = Expr, "," => ActionFn(91); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action90::<>(input, __sym0, __sym1); + let __nt = super::__action91::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (2, 3) } @@ -18556,10 +18750,10 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(88); + // ( ",")* = => ActionFn(89); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action88::<>(input, &__start, &__end); + let __nt = super::__action89::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (0, 4) } @@ -18572,11 +18766,11 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(89); + // ( ",")* = ( ",")+ => ActionFn(90); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action89::<>(input, __sym0); + let __nt = super::__action90::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (1, 4) } @@ -18589,13 +18783,13 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Expr, "," => ActionFn(101); + // ( ",")+ = Expr, "," => ActionFn(102); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action101::<>(input, __sym0, __sym1); + let __nt = super::__action102::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (2, 5) } @@ -18608,14 +18802,14 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Expr, "," => ActionFn(102); + // ( ",")+ = ( ",")+, Expr, "," => ActionFn(103); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action102::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action103::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (3, 5) } @@ -18628,13 +18822,13 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Type, "," => ActionFn(85); + // ( ",") = Type, "," => ActionFn(86); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action85::<>(input, __sym0, __sym1); + let __nt = super::__action86::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 6) } @@ -18647,10 +18841,10 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(83); + // ( ",")* = => ActionFn(84); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action83::<>(input, &__start, &__end); + let __nt = super::__action84::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (0, 7) } @@ -18663,11 +18857,11 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(84); + // ( ",")* = ( ",")+ => ActionFn(85); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action84::<>(input, __sym0); + let __nt = super::__action85::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (1, 7) } @@ -18680,13 +18874,13 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Type, "," => ActionFn(105); + // ( ",")+ = Type, "," => ActionFn(106); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action105::<>(input, __sym0, __sym1); + let __nt = super::__action106::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (2, 8) } @@ -18699,14 +18893,14 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Type, "," => ActionFn(106); + // ( ",")+ = ( ",")+, Type, "," => ActionFn(107); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action106::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action107::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (3, 8) } @@ -18793,11 +18987,11 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = BoundVar => ActionFn(76); + // BoundVar? = BoundVar => ActionFn(77); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action76::<>(input, __sym0); + let __nt = super::__action77::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (1, 12) } @@ -18810,10 +19004,10 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = => ActionFn(77); + // BoundVar? = => ActionFn(78); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action77::<>(input, &__start, &__end); + let __nt = super::__action78::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (0, 12) } @@ -18826,11 +19020,11 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = BoundVar => ActionFn(109); + // Comma = BoundVar => ActionFn(110); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action109::<>(input, __sym0); + let __nt = super::__action110::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -18843,10 +19037,10 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(110); + // Comma = => ActionFn(111); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action110::<>(input, &__start, &__end); + let __nt = super::__action111::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (0, 13) } @@ -18859,13 +19053,13 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, BoundVar => ActionFn(111); + // Comma = ( ",")+, BoundVar => ActionFn(112); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action111::<>(input, __sym0, __sym1); + let __nt = super::__action112::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (2, 13) } @@ -18878,11 +19072,11 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(112); + // Comma = ( ",")+ => ActionFn(113); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action112::<>(input, __sym0); + let __nt = super::__action113::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -18895,11 +19089,11 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Expr => ActionFn(113); + // Comma = Expr => ActionFn(114); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action113::<>(input, __sym0); + let __nt = super::__action114::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -18912,10 +19106,10 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(114); + // Comma = => ActionFn(115); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action114::<>(input, &__start, &__end); + let __nt = super::__action115::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (0, 14) } @@ -18928,13 +19122,13 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Expr => ActionFn(115); + // Comma = ( ",")+, Expr => ActionFn(116); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action115::<>(input, __sym0, __sym1); + let __nt = super::__action116::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (2, 14) } @@ -18947,11 +19141,11 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(116); + // Comma = ( ",")+ => ActionFn(117); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action116::<>(input, __sym0); + let __nt = super::__action117::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -18964,11 +19158,11 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Type => ActionFn(117); + // Comma = Type => ActionFn(118); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action117::<>(input, __sym0); + let __nt = super::__action118::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -18981,10 +19175,10 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(118); + // Comma = => ActionFn(119); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action118::<>(input, &__start, &__end); + let __nt = super::__action119::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (0, 15) } @@ -18997,13 +19191,13 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Type => ActionFn(119); + // Comma = ( ",")+, Type => ActionFn(120); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action119::<>(input, __sym0, __sym1); + let __nt = super::__action120::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (2, 15) } @@ -19016,11 +19210,11 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(120); + // Comma = ( ",")+ => ActionFn(121); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action120::<>(input, __sym0); + let __nt = super::__action121::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -19480,7 +19674,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "+", Expr, Expr, ")" => ActionFn(52); + // Expr = "(", "sdiv", Expr, Expr, ")" => ActionFn(52); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -19502,7 +19696,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "-", Expr, Expr, ")" => ActionFn(53); + // Expr = "(", "+", Expr, Expr, ")" => ActionFn(53); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -19524,7 +19718,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "&", Expr, Expr, ")" => ActionFn(54); + // Expr = "(", "-", Expr, Expr, ")" => ActionFn(54); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -19546,7 +19740,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "|", Expr, Expr, ")" => ActionFn(55); + // Expr = "(", "&", Expr, Expr, ")" => ActionFn(55); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -19568,7 +19762,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(56); + // Expr = "(", "|", Expr, Expr, ")" => ActionFn(56); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -19590,7 +19784,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(57); + // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(57); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -19612,7 +19806,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(58); + // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(58); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -19634,7 +19828,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(59); + // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(59); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -19656,7 +19850,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(60); + // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(60); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -19678,11 +19872,11 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(61); + // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(61); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -19700,11 +19894,11 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(62); + // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(62); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -19722,11 +19916,11 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(63); + // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(63); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -19744,11 +19938,11 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(64); + // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(64); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -19766,7 +19960,29 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(65); + // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(65); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant3(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym4.2.clone(); + let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant3(__nt), __end)); + (5, 17) + } + pub(crate) fn __reduce68< + 'input, + >( + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: core::marker::PhantomData<(&'input ())>, + ) -> (usize, usize) + { + // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(66); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant3(__symbols); @@ -19776,11 +19992,11 @@ mod __parse__FunctionType { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym5.2.clone(); - let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (6, 17) } - pub(crate) fn __reduce68< + pub(crate) fn __reduce69< 'input, >( input: &'input str, @@ -19789,7 +20005,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(66); + // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(67); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -19798,11 +20014,11 @@ mod __parse__FunctionType { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce69< + pub(crate) fn __reduce70< 'input, >( input: &'input str, @@ -19811,7 +20027,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(67); + // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(68); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -19820,11 +20036,11 @@ mod __parse__FunctionType { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce70< + pub(crate) fn __reduce71< 'input, >( input: &'input str, @@ -19833,7 +20049,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(68); + // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(69); assert!(__symbols.len() >= 11); let __sym10 = __pop_Variant0(__symbols); let __sym9 = __pop_Variant0(__symbols); @@ -19848,11 +20064,11 @@ mod __parse__FunctionType { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym10.2.clone(); - let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); + let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (11, 17) } - pub(crate) fn __reduce71< + pub(crate) fn __reduce72< 'input, >( input: &'input str, @@ -19861,7 +20077,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(69); + // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(70); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -19870,11 +20086,11 @@ mod __parse__FunctionType { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce72< + pub(crate) fn __reduce73< 'input, >( input: &'input str, @@ -19883,7 +20099,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "bv2int", Expr, ")" => ActionFn(70); + // Expr = "(", "bv2int", Expr, ")" => ActionFn(71); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -19891,11 +20107,11 @@ mod __parse__FunctionType { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce73< + pub(crate) fn __reduce74< 'input, >( input: &'input str, @@ -19904,7 +20120,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "widthof", Expr, ")" => ActionFn(71); + // Expr = "(", "widthof", Expr, ")" => ActionFn(72); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -19912,11 +20128,11 @@ mod __parse__FunctionType { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce74< + pub(crate) fn __reduce75< 'input, >( input: &'input str, @@ -19925,15 +20141,15 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = Expr => ActionFn(86); + // Expr? = Expr => ActionFn(87); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action86::<>(input, __sym0); + let __nt = super::__action87::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (1, 18) } - pub(crate) fn __reduce75< + pub(crate) fn __reduce76< 'input, >( input: &'input str, @@ -19942,14 +20158,14 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = => ActionFn(87); + // Expr? = => ActionFn(88); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action87::<>(input, &__start, &__end); + let __nt = super::__action88::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (0, 18) } - pub(crate) fn __reduce76< + pub(crate) fn __reduce77< 'input, >( input: &'input str, @@ -19966,7 +20182,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 19) } - pub(crate) fn __reduce77< + pub(crate) fn __reduce78< 'input, >( input: &'input str, @@ -19993,7 +20209,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (10, 20) } - pub(crate) fn __reduce78< + pub(crate) fn __reduce79< 'input, >( input: &'input str, @@ -20014,7 +20230,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (4, 21) } - pub(crate) fn __reduce79< + pub(crate) fn __reduce80< 'input, >( input: &'input str, @@ -20038,7 +20254,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (7, 22) } - pub(crate) fn __reduce80< + pub(crate) fn __reduce81< 'input, >( input: &'input str, @@ -20055,7 +20271,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce81< + pub(crate) fn __reduce82< 'input, >( input: &'input str, @@ -20072,7 +20288,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce82< + pub(crate) fn __reduce83< 'input, >( input: &'input str, @@ -20089,7 +20305,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce83< + pub(crate) fn __reduce84< 'input, >( input: &'input str, @@ -20106,7 +20322,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant17(__nt), __end)); (1, 24) } - pub(crate) fn __reduce84< + pub(crate) fn __reduce85< 'input, >( input: &'input str, @@ -20115,7 +20331,7 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(72); + // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(73); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -20127,11 +20343,11 @@ mod __parse__FunctionType { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym7.2.clone(); - let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action73::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (8, 25) } - pub(crate) fn __reduce85< + pub(crate) fn __reduce86< 'input, >( input: &'input str, @@ -20155,7 +20371,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (7, 26) } - pub(crate) fn __reduce86< + pub(crate) fn __reduce87< 'input, >( input: &'input str, @@ -20172,7 +20388,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce87< + pub(crate) fn __reduce88< 'input, >( input: &'input str, @@ -20191,7 +20407,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 27) } - pub(crate) fn __reduce88< + pub(crate) fn __reduce89< 'input, >( input: &'input str, @@ -20208,7 +20424,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce89< + pub(crate) fn __reduce90< 'input, >( input: &'input str, @@ -20225,7 +20441,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce90< + pub(crate) fn __reduce91< 'input, >( input: &'input str, @@ -20234,15 +20450,15 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = Type => ActionFn(81); + // Type? = Type => ActionFn(82); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action81::<>(input, __sym0); + let __nt = super::__action82::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (1, 28) } - pub(crate) fn __reduce91< + pub(crate) fn __reduce92< 'input, >( input: &'input str, @@ -20251,14 +20467,14 @@ mod __parse__FunctionType { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = => ActionFn(82); + // Type? = => ActionFn(83); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action82::<>(input, &__start, &__end); + let __nt = super::__action83::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (0, 28) } - pub(crate) fn __reduce92< + pub(crate) fn __reduce93< 'input, >( input: &'input str, @@ -20275,7 +20491,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 29) } - pub(crate) fn __reduce93< + pub(crate) fn __reduce94< 'input, >( input: &'input str, @@ -20292,7 +20508,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant21(__nt), __end)); (1, 30) } - pub(crate) fn __reduce94< + pub(crate) fn __reduce95< 'input, >( input: &'input str, @@ -20312,7 +20528,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce95< + pub(crate) fn __reduce96< 'input, >( input: &'input str, @@ -20332,7 +20548,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce96< + pub(crate) fn __reduce97< 'input, >( input: &'input str, @@ -20349,7 +20565,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (1, 32) } - pub(crate) fn __reduce97< + pub(crate) fn __reduce98< 'input, >( input: &'input str, @@ -20366,7 +20582,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (1, 33) } - pub(crate) fn __reduce98< + pub(crate) fn __reduce99< 'input, >( input: &'input str, @@ -20383,7 +20599,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (1, 34) } - pub(crate) fn __reduce99< + pub(crate) fn __reduce100< 'input, >( input: &'input str, @@ -20400,7 +20616,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (1, 35) } - pub(crate) fn __reduce100< + pub(crate) fn __reduce101< 'input, >( input: &'input str, @@ -20417,7 +20633,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (1, 36) } - pub(crate) fn __reduce102< + pub(crate) fn __reduce103< 'input, >( input: &'input str, @@ -20434,7 +20650,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (1, 38) } - pub(crate) fn __reduce103< + pub(crate) fn __reduce104< 'input, >( input: &'input str, @@ -20451,7 +20667,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (1, 39) } - pub(crate) fn __reduce104< + pub(crate) fn __reduce105< 'input, >( input: &'input str, @@ -20468,7 +20684,7 @@ mod __parse__FunctionType { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 40) } - pub(crate) fn __reduce105< + pub(crate) fn __reduce106< 'input, >( input: &'input str, @@ -20531,408 +20747,416 @@ mod __parse__TermAnnotation { } const __ACTION: &[i16] = &[ // State 0 - 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1 - 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 2 - 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 3 - 0, 0, 0, 7, 0, -27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, -27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 4 - 0, 0, 0, 0, 0, -23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 91, 92, + 0, 0, 0, 0, 0, -23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 93, 94, // State 5 - 0, 0, 0, 7, 0, -29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, -29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 6 - 11, 12, 13, 0, 0, 0, 14, 15, 0, 16, 17, 0, 18, 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 0, 28, 98, 0, 29, 30, 0, 0, 31, 32, 33, 34, 35, 0, 36, 0, 99, 37, 38, 39, 0, 40, 41, 0, 42, 100, 0, 90, 91, 92, + 11, 12, 13, 0, 0, 0, 14, 15, 0, 16, 17, 0, 18, 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 0, 28, 100, 0, 29, 30, 0, 0, 31, 32, 33, 34, 35, 36, 0, 37, 0, 101, 38, 39, 40, 0, 41, 42, 0, 43, 102, 0, 92, 93, 94, // State 7 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 91, 92, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 93, 94, // State 8 - 0, 0, 0, 0, 0, -25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 91, 92, + 0, 0, 0, 0, 0, -25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 93, 94, // State 9 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, // State 10 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 11 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 12 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 13 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 14 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 15 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 16 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 17 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 18 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 19 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 20 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 21 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 22 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 23 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 24 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 25 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 26 - 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 27 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, // State 28 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 29 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, // State 30 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 31 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 32 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 33 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 34 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 35 - 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 36 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 37 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 38 - 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 39 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 40 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 41 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 42 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 43 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 44 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 45 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 46 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 47 - 0, 0, 0, 7, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 48 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 49 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 50 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 51 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 52 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 53 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 54 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 55 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 56 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 57 - 11, 12, 13, 0, 0, 0, 14, 15, 0, 16, 17, 0, 18, 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 0, 28, 98, 0, 29, 30, 0, 146, 31, 32, 33, 34, 35, 0, 36, 0, 99, 37, 38, 39, 0, 40, 41, 0, 42, 100, 110, 90, 91, 92, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 58 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, + 11, 12, 13, 0, 0, 0, 14, 15, 0, 16, 17, 0, 18, 19, 20, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 0, 28, 100, 0, 29, 30, 0, 148, 31, 32, 33, 34, 35, 36, 0, 37, 0, 101, 38, 39, 40, 0, 41, 42, 0, 43, 102, 112, 92, 93, 94, // State 59 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, // State 60 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 61 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 62 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 63 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 64 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 65 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 66 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 67 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 68 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 69 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 70 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 71 - 0, 0, 0, 0, 0, -87, 0, 0, -87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 72 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 73 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -88, 0, 0, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, // State 74 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 75 - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 76 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 77 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 78 - 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 79 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 80 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 81 - 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 82 - 0, 0, 0, 0, 0, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 83 - 0, 0, 0, 0, 0, -26, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 84 - 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 85 - 0, 0, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -26, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 86 - 0, 0, 0, 0, 0, -22, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 87 - 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 88 - 0, 0, 0, 0, 0, -18, 0, 0, -18, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -22, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 89 - 0, 0, 0, 0, 0, -81, 0, 0, -81, 0, 0, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 90 - 0, 0, 0, 0, 0, -82, 0, 0, -82, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -18, 0, 0, -18, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 91 - 0, 0, 0, 0, 0, -83, 0, 0, -83, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -82, 0, 0, -82, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 92 - 0, 0, 0, 0, 0, -28, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -83, 0, 0, -83, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 93 - 0, 0, 0, -9, 0, -9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -84, 0, 0, -84, 0, 0, -84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 94 - 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -28, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 95 - 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -9, 0, -9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 96 - 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 97 - 0, 0, 0, 0, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 98 - 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 99 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -84, 0, 0, 0, + 0, 0, 0, 0, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 100 - 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 101 - 0, 0, 0, 0, 0, -24, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -85, 0, 0, 0, // State 102 - 0, 0, 0, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 103 - 0, 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, -4, -4, + 0, 0, 0, 0, 0, -24, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 104 - 0, 0, 0, -10, 0, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 105 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, -4, -4, // State 106 - 0, 0, 0, -36, 0, -36, 0, 0, -36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -36, 0, 0, -36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -10, 0, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 107 - 0, 0, 0, -35, 0, -35, 0, 0, -35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -35, 0, 0, -35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 108 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -36, 0, -36, 0, 0, -36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -36, 0, 0, -36, 0, 0, 0, 0, 0, 0, // State 109 - 0, 0, 0, -94, 0, -94, 0, 0, -94, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, 0, 0, 0, + 0, 0, 0, -35, 0, -35, 0, 0, -35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -35, 0, 0, -35, 0, 0, 0, 0, 0, 0, // State 110 - 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 111 - 0, 0, 0, 0, 0, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -95, 0, -95, 0, 0, -95, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -95, 0, 0, 0, // State 112 - 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 113 - 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 114 - 0, 0, 0, -38, 0, -38, 0, 0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 0, 0, -38, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 115 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 116 - 0, 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -38, 0, -38, 0, 0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 0, 0, -38, 0, 0, 0, 0, 0, 0, // State 117 - 0, 0, 0, -37, 0, -37, 0, 0, -37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -37, 0, 0, -37, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 118 - 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 119 - 0, 0, 0, 0, 0, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -37, 0, -37, 0, 0, -37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -37, 0, 0, -37, 0, 0, 0, 0, 0, 0, // State 120 - 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 121 - 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, -5, -5, + 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 122 - 0, 0, 0, 0, 0, -19, 0, 0, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 123 - 0, 0, 0, 0, 0, -90, 0, 0, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, -5, -5, // State 124 - 0, 0, 0, 0, 0, -89, 0, 0, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -19, 0, 0, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 125 - 0, 0, 0, -39, 0, -39, 0, 0, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, 0, 0, -39, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -91, 0, 0, -91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 126 - 0, 0, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -90, 0, 0, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 127 - 0, 0, 0, 0, 0, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -39, 0, -39, 0, 0, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, 0, 0, -39, 0, 0, 0, 0, 0, 0, // State 128 - 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 129 - 0, 0, 0, 0, 0, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 130 - 0, 0, 0, 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 131 - 0, 0, 0, -45, 0, -45, 0, 0, -45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -45, 0, 0, -45, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 132 - 0, 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 133 - 0, 0, 0, 0, 0, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -45, 0, -45, 0, 0, -45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -45, 0, 0, -45, 0, 0, 0, 0, 0, 0, // State 134 - 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 135 - 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 136 - 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 137 - 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 138 - 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 139 - 0, 0, 0, -73, 0, -73, 0, 0, -73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -73, 0, 0, -73, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 140 - 0, 0, 0, -49, 0, -49, 0, 0, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49, 0, 0, -49, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 141 - 0, 0, 0, -47, 0, -47, 0, 0, -47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -47, 0, 0, -47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -74, 0, -74, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, -74, 0, 0, 0, 0, 0, 0, // State 142 - 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -49, 0, -49, 0, 0, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49, 0, 0, -49, 0, 0, 0, 0, 0, 0, // State 143 - 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -47, 0, -47, 0, 0, -47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -47, 0, 0, -47, 0, 0, 0, 0, 0, 0, // State 144 - 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 145 - 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 146 - 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 147 - 0, 0, 0, -51, 0, -51, 0, 0, -51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 0, 0, -51, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 148 - 0, 0, 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 149 - 0, 0, 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -51, 0, -51, 0, 0, -51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -51, 0, 0, -51, 0, 0, 0, 0, 0, 0, // State 150 - 0, 0, 0, 0, 0, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 151 - 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 152 - 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 153 - 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 154 - 0, 0, 0, -74, 0, -74, 0, 0, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, 0, 0, -74, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 155 - 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 156 - 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 157 - 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -75, 0, -75, 0, 0, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -75, 0, 0, -75, 0, 0, 0, 0, 0, 0, // State 158 - 0, 0, 0, 0, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 159 - 0, 0, 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 160 - 0, 0, 0, -46, 0, -46, 0, 0, -46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -46, 0, 0, -46, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 161 - 0, 0, 0, -86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 162 - 0, 0, 0, 0, 0, -88, 0, 0, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 163 - 0, 0, 0, 0, 0, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -46, 0, -46, 0, 0, -46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -46, 0, 0, -46, 0, 0, 0, 0, 0, 0, // State 164 - 0, 0, 0, -57, 0, -57, 0, 0, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -57, 0, 0, -57, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 165 - 0, 0, 0, -40, 0, -40, 0, 0, -40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -40, 0, 0, -40, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -89, 0, 0, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 166 - 0, 0, 0, -53, 0, -53, 0, 0, -53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -53, 0, 0, -53, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 167 - 0, 0, 0, -55, 0, -55, 0, 0, -55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -55, 0, 0, -55, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -58, 0, -58, 0, 0, -58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -58, 0, 0, -58, 0, 0, 0, 0, 0, 0, // State 168 - 0, 0, 0, -56, 0, -56, 0, 0, -56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -56, 0, 0, -56, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -40, 0, -40, 0, 0, -40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -40, 0, 0, -40, 0, 0, 0, 0, 0, 0, // State 169 - 0, 0, 0, -54, 0, -54, 0, 0, -54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -54, 0, 0, -54, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -53, 0, -53, 0, 0, -53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -53, 0, 0, -53, 0, 0, 0, 0, 0, 0, // State 170 - 0, 0, 0, -44, 0, -44, 0, 0, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, 0, 0, -44, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -56, 0, -56, 0, 0, -56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -56, 0, 0, -56, 0, 0, 0, 0, 0, 0, // State 171 - 0, 0, 0, -43, 0, -43, 0, 0, -43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43, 0, 0, -43, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -57, 0, -57, 0, 0, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -57, 0, 0, -57, 0, 0, 0, 0, 0, 0, // State 172 - 0, 0, 0, -42, 0, -42, 0, 0, -42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42, 0, 0, -42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -54, 0, -54, 0, 0, -54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -54, 0, 0, -54, 0, 0, 0, 0, 0, 0, // State 173 - 0, 0, 0, -50, 0, -50, 0, 0, -50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -50, 0, 0, -50, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -44, 0, -44, 0, 0, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, 0, 0, -44, 0, 0, 0, 0, 0, 0, // State 174 - 0, 0, 0, -48, 0, -48, 0, 0, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, 0, 0, -48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -43, 0, -43, 0, 0, -43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43, 0, 0, -43, 0, 0, 0, 0, 0, 0, // State 175 - 0, 0, 0, -52, 0, -52, 0, 0, -52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52, 0, 0, -52, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -42, 0, -42, 0, 0, -42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -42, 0, 0, -42, 0, 0, 0, 0, 0, 0, // State 176 - 0, 0, 0, -70, 0, -70, 0, 0, -70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -70, 0, 0, -70, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -50, 0, -50, 0, 0, -50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -50, 0, 0, -50, 0, 0, 0, 0, 0, 0, // State 177 - 0, 0, 0, -69, 0, -69, 0, 0, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -69, 0, 0, -69, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -48, 0, -48, 0, 0, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, 0, 0, -48, 0, 0, 0, 0, 0, 0, // State 178 - 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -52, 0, -52, 0, 0, -52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -52, 0, 0, -52, 0, 0, 0, 0, 0, 0, // State 179 - 0, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -71, 0, -71, 0, 0, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71, 0, 0, -71, 0, 0, 0, 0, 0, 0, // State 180 - 0, 0, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -70, 0, -70, 0, 0, -70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -70, 0, 0, -70, 0, 0, 0, 0, 0, 0, // State 181 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 182 - 0, 0, 0, -72, 0, -72, 0, 0, -72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -72, 0, 0, -72, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 183 - 0, 0, 0, -60, 0, -60, 0, 0, -60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -60, 0, 0, -60, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 184 - 0, 0, 0, -61, 0, -61, 0, 0, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, 0, 0, -61, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 0, 0, 0, 0, 0, 0, // State 185 - 0, 0, 0, -62, 0, -62, 0, 0, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, 0, 0, -62, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -73, 0, -73, 0, 0, -73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -73, 0, 0, -73, 0, 0, 0, 0, 0, 0, // State 186 - 0, 0, 0, -63, 0, -63, 0, 0, -63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -63, 0, 0, -63, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -61, 0, -61, 0, 0, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, 0, 0, -61, 0, 0, 0, 0, 0, 0, // State 187 - 0, 0, 0, -67, 0, -67, 0, 0, -67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -67, 0, 0, -67, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -62, 0, -62, 0, 0, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, 0, 0, -62, 0, 0, 0, 0, 0, 0, // State 188 - 0, 0, 0, -66, 0, -66, 0, 0, -66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -66, 0, 0, -66, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -55, 0, -55, 0, 0, -55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -55, 0, 0, -55, 0, 0, 0, 0, 0, 0, // State 189 - 0, 0, 0, -59, 0, -59, 0, 0, -59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -59, 0, 0, -59, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -63, 0, -63, 0, 0, -63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -63, 0, 0, -63, 0, 0, 0, 0, 0, 0, // State 190 - 0, 0, 0, -65, 0, -65, 0, 0, -65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -65, 0, 0, -65, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -64, 0, -64, 0, 0, -64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -64, 0, 0, -64, 0, 0, 0, 0, 0, 0, // State 191 - 0, 0, 0, -64, 0, -64, 0, 0, -64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -64, 0, 0, -64, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -68, 0, -68, 0, 0, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -68, 0, 0, -68, 0, 0, 0, 0, 0, 0, // State 192 - 0, 0, 0, -58, 0, -58, 0, 0, -58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -58, 0, 0, -58, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -67, 0, -67, 0, 0, -67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -67, 0, 0, -67, 0, 0, 0, 0, 0, 0, // State 193 - 0, 0, 0, -41, 0, -41, 0, 0, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -41, 0, 0, -41, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -60, 0, -60, 0, 0, -60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -60, 0, 0, -60, 0, 0, 0, 0, 0, 0, // State 194 - 0, 0, 0, -68, 0, -68, 0, 0, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -68, 0, 0, -68, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -66, 0, -66, 0, 0, -66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -66, 0, 0, -66, 0, 0, 0, 0, 0, 0, // State 195 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -65, 0, -65, 0, 0, -65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -65, 0, 0, -65, 0, 0, 0, 0, 0, 0, // State 196 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -59, 0, -59, 0, 0, -59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -59, 0, 0, -59, 0, 0, 0, 0, 0, 0, // State 197 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 199, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -41, 0, -41, 0, 0, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -41, 0, 0, -41, 0, 0, 0, 0, 0, 0, // State 198 - 0, 0, 0, 0, 0, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -69, 0, -69, 0, 0, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -69, 0, 0, -69, 0, 0, 0, 0, 0, 0, // State 199 - 0, 0, 0, -71, 0, -71, 0, 0, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71, 0, 0, -71, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 200 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 201 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 203, 0, 0, 0, 0, 0, 0, + // State 202 + 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // State 203 + 0, 0, 0, -72, 0, -72, 0, 0, -72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -72, 0, 0, -72, 0, 0, 0, 0, 0, 0, ]; fn __action(state: i16, integer: usize) -> i16 { - __ACTION[(state as usize) * 55 + integer] + __ACTION[(state as usize) * 56 + integer] } const __EOF_ACTION: &[i16] = &[ // State 0 @@ -21088,11 +21312,11 @@ mod __parse__TermAnnotation { // State 75 0, // State 76 - -103, + 0, // State 77 0, // State 78 - 0, + -104, // State 79 0, // State 80 @@ -21146,11 +21370,11 @@ mod __parse__TermAnnotation { // State 104 0, // State 105 - -85, + 0, // State 106 0, // State 107 - 0, + -86, // State 108 0, // State 109 @@ -21335,108 +21559,118 @@ mod __parse__TermAnnotation { 0, // State 199 0, + // State 200 + 0, + // State 201 + 0, + // State 202 + 0, + // State 203 + 0, ]; fn __goto(state: i16, nt: usize) -> i16 { match nt { 2 => 8, 5 => 5, - 9 => 85, - 10 => 81, + 9 => 87, + 10 => 83, 11 => match state { - 7 => 100, - 8 => 101, - _ => 86, + 7 => 102, + 8 => 103, + _ => 88, }, - 13 => 87, - 14 => 82, - 16 => 95, + 13 => 89, + 14 => 84, + 16 => 97, 17 => match state { - 12 => 44, - 13 => 45, - 14 => 46, - 15 => 47, - 16 => 48, - 17 => 49, - 18 => 50, - 19 => 51, - 20 => 52, - 21 => 53, - 22 => 54, - 26 => 55, - 31 => 60, - 32 => 61, - 33 => 62, - 34 => 63, - 35 => 64, - 37 => 66, - 38 => 67, + 12 => 45, + 13 => 46, + 14 => 47, + 15 => 48, + 16 => 49, + 17 => 50, + 18 => 51, + 19 => 52, + 20 => 53, + 21 => 54, + 22 => 55, + 26 => 56, + 31 => 61, + 32 => 62, + 33 => 63, + 34 => 64, + 35 => 65, + 36 => 66, + 38 => 68, 39 => 69, - 40 => 70, - 3 => 83, - 5 => 92, - 10 => 110, - 23 => 111, - 24 => 112, - 25 => 113, - 28 => 115, - 30 => 116, - 36 => 118, - 41 => 119, - 43 => 126, - 44 => 127, - 45 => 128, - 46 => 129, - 47 => 130, + 40 => 71, + 41 => 72, + 3 => 85, + 5 => 94, + 10 => 112, + 23 => 113, + 24 => 114, + 25 => 115, + 28 => 117, + 30 => 118, + 37 => 120, + 42 => 121, + 44 => 128, + 45 => 129, + 46 => 130, + 47 => 131, 48 => 132, - 49 => 133, - 50 => 134, - 51 => 135, - 52 => 136, - 53 => 137, - 54 => 138, - 55 => 142, - 56 => 143, - 59 => 146, + 49 => 134, + 50 => 135, + 51 => 136, + 52 => 137, + 53 => 138, + 54 => 139, + 55 => 140, + 56 => 144, + 57 => 145, 60 => 148, - 61 => 149, - 62 => 150, - 63 => 151, - 64 => 152, - 65 => 153, + 61 => 150, + 62 => 151, + 63 => 152, + 64 => 153, + 65 => 154, 66 => 155, 67 => 156, - 68 => 157, - 69 => 158, - 70 => 159, - 73 => 180, - 74 => 181, - 75 => 197, - _ => 43, + 68 => 158, + 69 => 159, + 70 => 160, + 71 => 161, + 72 => 162, + 75 => 183, + 76 => 184, + 77 => 201, + _ => 44, }, - 19 => 84, + 19 => 86, 23 => match state { - 6 | 57 => 96, - _ => 88, + 6 | 58 => 98, + _ => 90, }, 24 => 9, - 25 => 76, - 26 => 78, + 25 => 78, + 26 => 80, 27 => match state { - 72 => 163, - _ => 122, + 74 => 166, + _ => 124, }, 30 => match state { - 29 => 59, - 58 => 73, - 9 => 108, - 57 => 144, - 71 => 162, - _ => 58, + 29 => 60, + 59 => 75, + 9 => 110, + 58 => 146, + 73 => 165, + _ => 59, }, 31 => match state { - 35 => 65, - 38 => 68, - _ => 56, + 36 => 67, + 39 => 70, + _ => 57, }, _ => 0, } @@ -21479,6 +21713,7 @@ mod __parse__TermAnnotation { r###""rev""###, r###""rotl""###, r###""rotr""###, + r###""sdiv""###, r###""shl""###, r###""shr""###, r###""sig""###, @@ -21550,7 +21785,7 @@ mod __parse__TermAnnotation { #[inline] fn error_action(&self, state: i16) -> i16 { - __action(state, 55 - 1) + __action(state, 56 - 1) } #[inline] @@ -21663,11 +21898,12 @@ mod __parse__TermAnnotation { Token(52, _) if true => Some(47), Token(53, _) if true => Some(48), Token(54, _) if true => Some(49), - Token(0, _) if true => Some(50), - Token(1, _) if true => Some(51), - Token(2, _) if true => Some(52), - Token(3, _) if true => Some(53), - Token(4, _) if true => Some(54), + Token(55, _) if true => Some(50), + Token(0, _) if true => Some(51), + Token(1, _) if true => Some(52), + Token(2, _) if true => Some(53), + Token(3, _) if true => Some(54), + Token(4, _) if true => Some(55), _ => None, } } @@ -21680,8 +21916,8 @@ mod __parse__TermAnnotation { ) -> __Symbol<'input> { match __token_index { - 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 => match __token { - Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 => match __token { + Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(55, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), _ => unreachable!(), }, _ => unreachable!(), @@ -22038,6 +22274,9 @@ mod __parse__TermAnnotation { __reduce101(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } 102 => { + __reduce102(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } + 103 => { // __TermAnnotation = TermAnnotation => ActionFn(9); let __sym0 = __pop_Variant18(__symbols); let __start = __sym0.0.clone(); @@ -22045,15 +22284,15 @@ mod __parse__TermAnnotation { let __nt = super::__action9::<>(input, __sym0); return Some(Ok(__nt)); } - 103 => { - __reduce103(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) - } 104 => { __reduce104(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } 105 => { __reduce105(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } + 106 => { + __reduce106(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } _ => panic!("invalid action code {}", __action) }; let __states_len = __states.len(); @@ -22329,13 +22568,13 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = BoundVar, "," => ActionFn(80); + // ( ",") = BoundVar, "," => ActionFn(81); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action80::<>(input, __sym0, __sym1); + let __nt = super::__action81::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (2, 0) } @@ -22348,10 +22587,10 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(78); + // ( ",")* = => ActionFn(79); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action78::<>(input, &__start, &__end); + let __nt = super::__action79::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (0, 1) } @@ -22364,11 +22603,11 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(79); + // ( ",")* = ( ",")+ => ActionFn(80); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action79::<>(input, __sym0); + let __nt = super::__action80::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (1, 1) } @@ -22381,13 +22620,13 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = BoundVar, "," => ActionFn(97); + // ( ",")+ = BoundVar, "," => ActionFn(98); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action97::<>(input, __sym0, __sym1); + let __nt = super::__action98::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (2, 2) } @@ -22400,14 +22639,14 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(98); + // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(99); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action98::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action99::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (3, 2) } @@ -22420,13 +22659,13 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Expr, "," => ActionFn(90); + // ( ",") = Expr, "," => ActionFn(91); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action90::<>(input, __sym0, __sym1); + let __nt = super::__action91::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (2, 3) } @@ -22439,10 +22678,10 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(88); + // ( ",")* = => ActionFn(89); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action88::<>(input, &__start, &__end); + let __nt = super::__action89::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (0, 4) } @@ -22455,11 +22694,11 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(89); + // ( ",")* = ( ",")+ => ActionFn(90); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action89::<>(input, __sym0); + let __nt = super::__action90::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (1, 4) } @@ -22472,13 +22711,13 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Expr, "," => ActionFn(101); + // ( ",")+ = Expr, "," => ActionFn(102); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action101::<>(input, __sym0, __sym1); + let __nt = super::__action102::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (2, 5) } @@ -22491,14 +22730,14 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Expr, "," => ActionFn(102); + // ( ",")+ = ( ",")+, Expr, "," => ActionFn(103); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action102::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action103::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (3, 5) } @@ -22511,13 +22750,13 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Type, "," => ActionFn(85); + // ( ",") = Type, "," => ActionFn(86); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action85::<>(input, __sym0, __sym1); + let __nt = super::__action86::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 6) } @@ -22530,10 +22769,10 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(83); + // ( ",")* = => ActionFn(84); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action83::<>(input, &__start, &__end); + let __nt = super::__action84::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (0, 7) } @@ -22546,11 +22785,11 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(84); + // ( ",")* = ( ",")+ => ActionFn(85); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action84::<>(input, __sym0); + let __nt = super::__action85::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (1, 7) } @@ -22563,13 +22802,13 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Type, "," => ActionFn(105); + // ( ",")+ = Type, "," => ActionFn(106); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action105::<>(input, __sym0, __sym1); + let __nt = super::__action106::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (2, 8) } @@ -22582,14 +22821,14 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Type, "," => ActionFn(106); + // ( ",")+ = ( ",")+, Type, "," => ActionFn(107); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action106::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action107::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (3, 8) } @@ -22676,11 +22915,11 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = BoundVar => ActionFn(76); + // BoundVar? = BoundVar => ActionFn(77); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action76::<>(input, __sym0); + let __nt = super::__action77::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (1, 12) } @@ -22693,10 +22932,10 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = => ActionFn(77); + // BoundVar? = => ActionFn(78); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action77::<>(input, &__start, &__end); + let __nt = super::__action78::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (0, 12) } @@ -22709,11 +22948,11 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = BoundVar => ActionFn(109); + // Comma = BoundVar => ActionFn(110); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action109::<>(input, __sym0); + let __nt = super::__action110::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -22726,10 +22965,10 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(110); + // Comma = => ActionFn(111); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action110::<>(input, &__start, &__end); + let __nt = super::__action111::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (0, 13) } @@ -22742,13 +22981,13 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, BoundVar => ActionFn(111); + // Comma = ( ",")+, BoundVar => ActionFn(112); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action111::<>(input, __sym0, __sym1); + let __nt = super::__action112::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (2, 13) } @@ -22761,11 +23000,11 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(112); + // Comma = ( ",")+ => ActionFn(113); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action112::<>(input, __sym0); + let __nt = super::__action113::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -22778,11 +23017,11 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Expr => ActionFn(113); + // Comma = Expr => ActionFn(114); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action113::<>(input, __sym0); + let __nt = super::__action114::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -22795,10 +23034,10 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(114); + // Comma = => ActionFn(115); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action114::<>(input, &__start, &__end); + let __nt = super::__action115::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (0, 14) } @@ -22811,13 +23050,13 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Expr => ActionFn(115); + // Comma = ( ",")+, Expr => ActionFn(116); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action115::<>(input, __sym0, __sym1); + let __nt = super::__action116::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (2, 14) } @@ -22830,11 +23069,11 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(116); + // Comma = ( ",")+ => ActionFn(117); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action116::<>(input, __sym0); + let __nt = super::__action117::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -22847,11 +23086,11 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Type => ActionFn(117); + // Comma = Type => ActionFn(118); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action117::<>(input, __sym0); + let __nt = super::__action118::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -22864,10 +23103,10 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(118); + // Comma = => ActionFn(119); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action118::<>(input, &__start, &__end); + let __nt = super::__action119::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (0, 15) } @@ -22880,13 +23119,13 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Type => ActionFn(119); + // Comma = ( ",")+, Type => ActionFn(120); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action119::<>(input, __sym0, __sym1); + let __nt = super::__action120::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (2, 15) } @@ -22899,11 +23138,11 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(120); + // Comma = ( ",")+ => ActionFn(121); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action120::<>(input, __sym0); + let __nt = super::__action121::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -23363,7 +23602,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "+", Expr, Expr, ")" => ActionFn(52); + // Expr = "(", "sdiv", Expr, Expr, ")" => ActionFn(52); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -23385,7 +23624,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "-", Expr, Expr, ")" => ActionFn(53); + // Expr = "(", "+", Expr, Expr, ")" => ActionFn(53); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -23407,7 +23646,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "&", Expr, Expr, ")" => ActionFn(54); + // Expr = "(", "-", Expr, Expr, ")" => ActionFn(54); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -23429,7 +23668,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "|", Expr, Expr, ")" => ActionFn(55); + // Expr = "(", "&", Expr, Expr, ")" => ActionFn(55); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -23451,7 +23690,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(56); + // Expr = "(", "|", Expr, Expr, ")" => ActionFn(56); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -23473,7 +23712,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(57); + // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(57); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -23495,7 +23734,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(58); + // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(58); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -23517,7 +23756,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(59); + // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(59); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -23539,7 +23778,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(60); + // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(60); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -23561,11 +23800,11 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(61); + // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(61); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -23583,11 +23822,11 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(62); + // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(62); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -23605,11 +23844,11 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(63); + // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(63); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -23627,11 +23866,11 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(64); + // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(64); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -23649,7 +23888,29 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(65); + // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(65); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant3(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym4.2.clone(); + let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant3(__nt), __end)); + (5, 17) + } + pub(crate) fn __reduce68< + 'input, + >( + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: core::marker::PhantomData<(&'input ())>, + ) -> (usize, usize) + { + // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(66); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant3(__symbols); @@ -23659,11 +23920,11 @@ mod __parse__TermAnnotation { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym5.2.clone(); - let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (6, 17) } - pub(crate) fn __reduce68< + pub(crate) fn __reduce69< 'input, >( input: &'input str, @@ -23672,7 +23933,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(66); + // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(67); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -23681,11 +23942,11 @@ mod __parse__TermAnnotation { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce69< + pub(crate) fn __reduce70< 'input, >( input: &'input str, @@ -23694,7 +23955,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(67); + // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(68); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -23703,11 +23964,11 @@ mod __parse__TermAnnotation { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce70< + pub(crate) fn __reduce71< 'input, >( input: &'input str, @@ -23716,7 +23977,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(68); + // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(69); assert!(__symbols.len() >= 11); let __sym10 = __pop_Variant0(__symbols); let __sym9 = __pop_Variant0(__symbols); @@ -23731,11 +23992,11 @@ mod __parse__TermAnnotation { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym10.2.clone(); - let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); + let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (11, 17) } - pub(crate) fn __reduce71< + pub(crate) fn __reduce72< 'input, >( input: &'input str, @@ -23744,7 +24005,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(69); + // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(70); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -23753,11 +24014,11 @@ mod __parse__TermAnnotation { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce72< + pub(crate) fn __reduce73< 'input, >( input: &'input str, @@ -23766,7 +24027,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "bv2int", Expr, ")" => ActionFn(70); + // Expr = "(", "bv2int", Expr, ")" => ActionFn(71); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -23774,11 +24035,11 @@ mod __parse__TermAnnotation { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce73< + pub(crate) fn __reduce74< 'input, >( input: &'input str, @@ -23787,7 +24048,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "widthof", Expr, ")" => ActionFn(71); + // Expr = "(", "widthof", Expr, ")" => ActionFn(72); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -23795,11 +24056,11 @@ mod __parse__TermAnnotation { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce74< + pub(crate) fn __reduce75< 'input, >( input: &'input str, @@ -23808,15 +24069,15 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = Expr => ActionFn(86); + // Expr? = Expr => ActionFn(87); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action86::<>(input, __sym0); + let __nt = super::__action87::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (1, 18) } - pub(crate) fn __reduce75< + pub(crate) fn __reduce76< 'input, >( input: &'input str, @@ -23825,14 +24086,14 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = => ActionFn(87); + // Expr? = => ActionFn(88); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action87::<>(input, &__start, &__end); + let __nt = super::__action88::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (0, 18) } - pub(crate) fn __reduce76< + pub(crate) fn __reduce77< 'input, >( input: &'input str, @@ -23849,7 +24110,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 19) } - pub(crate) fn __reduce77< + pub(crate) fn __reduce78< 'input, >( input: &'input str, @@ -23876,7 +24137,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (10, 20) } - pub(crate) fn __reduce78< + pub(crate) fn __reduce79< 'input, >( input: &'input str, @@ -23897,7 +24158,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (4, 21) } - pub(crate) fn __reduce79< + pub(crate) fn __reduce80< 'input, >( input: &'input str, @@ -23921,7 +24182,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (7, 22) } - pub(crate) fn __reduce80< + pub(crate) fn __reduce81< 'input, >( input: &'input str, @@ -23938,7 +24199,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce81< + pub(crate) fn __reduce82< 'input, >( input: &'input str, @@ -23955,7 +24216,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce82< + pub(crate) fn __reduce83< 'input, >( input: &'input str, @@ -23972,7 +24233,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce83< + pub(crate) fn __reduce84< 'input, >( input: &'input str, @@ -23989,7 +24250,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant17(__nt), __end)); (1, 24) } - pub(crate) fn __reduce84< + pub(crate) fn __reduce85< 'input, >( input: &'input str, @@ -23998,7 +24259,7 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(72); + // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(73); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -24010,11 +24271,11 @@ mod __parse__TermAnnotation { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym7.2.clone(); - let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action73::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (8, 25) } - pub(crate) fn __reduce85< + pub(crate) fn __reduce86< 'input, >( input: &'input str, @@ -24038,7 +24299,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (7, 26) } - pub(crate) fn __reduce86< + pub(crate) fn __reduce87< 'input, >( input: &'input str, @@ -24055,7 +24316,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce87< + pub(crate) fn __reduce88< 'input, >( input: &'input str, @@ -24074,7 +24335,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 27) } - pub(crate) fn __reduce88< + pub(crate) fn __reduce89< 'input, >( input: &'input str, @@ -24091,7 +24352,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce89< + pub(crate) fn __reduce90< 'input, >( input: &'input str, @@ -24108,7 +24369,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce90< + pub(crate) fn __reduce91< 'input, >( input: &'input str, @@ -24117,15 +24378,15 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = Type => ActionFn(81); + // Type? = Type => ActionFn(82); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action81::<>(input, __sym0); + let __nt = super::__action82::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (1, 28) } - pub(crate) fn __reduce91< + pub(crate) fn __reduce92< 'input, >( input: &'input str, @@ -24134,14 +24395,14 @@ mod __parse__TermAnnotation { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = => ActionFn(82); + // Type? = => ActionFn(83); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action82::<>(input, &__start, &__end); + let __nt = super::__action83::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (0, 28) } - pub(crate) fn __reduce92< + pub(crate) fn __reduce93< 'input, >( input: &'input str, @@ -24158,7 +24419,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 29) } - pub(crate) fn __reduce93< + pub(crate) fn __reduce94< 'input, >( input: &'input str, @@ -24175,7 +24436,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant21(__nt), __end)); (1, 30) } - pub(crate) fn __reduce94< + pub(crate) fn __reduce95< 'input, >( input: &'input str, @@ -24195,7 +24456,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce95< + pub(crate) fn __reduce96< 'input, >( input: &'input str, @@ -24215,7 +24476,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce96< + pub(crate) fn __reduce97< 'input, >( input: &'input str, @@ -24232,7 +24493,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (1, 32) } - pub(crate) fn __reduce97< + pub(crate) fn __reduce98< 'input, >( input: &'input str, @@ -24249,7 +24510,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (1, 33) } - pub(crate) fn __reduce98< + pub(crate) fn __reduce99< 'input, >( input: &'input str, @@ -24266,7 +24527,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (1, 34) } - pub(crate) fn __reduce99< + pub(crate) fn __reduce100< 'input, >( input: &'input str, @@ -24283,7 +24544,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (1, 35) } - pub(crate) fn __reduce100< + pub(crate) fn __reduce101< 'input, >( input: &'input str, @@ -24300,7 +24561,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (1, 36) } - pub(crate) fn __reduce101< + pub(crate) fn __reduce102< 'input, >( input: &'input str, @@ -24317,7 +24578,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (1, 37) } - pub(crate) fn __reduce103< + pub(crate) fn __reduce104< 'input, >( input: &'input str, @@ -24334,7 +24595,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (1, 39) } - pub(crate) fn __reduce104< + pub(crate) fn __reduce105< 'input, >( input: &'input str, @@ -24351,7 +24612,7 @@ mod __parse__TermAnnotation { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 40) } - pub(crate) fn __reduce105< + pub(crate) fn __reduce106< 'input, >( input: &'input str, @@ -24414,66 +24675,66 @@ mod __parse__TermSignature { } const __ACTION: &[i8] = &[ // State 0 - 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1 - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 2 - 0, 0, 0, 0, 0, -23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, + 0, 0, 0, 0, 0, -23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, // State 3 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, // State 4 - 0, 0, 0, 0, 0, -25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, + 0, 0, 0, 0, 0, -25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, // State 5 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 6 - 0, 0, 0, 0, 0, -87, 0, 0, -87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, + 0, 0, 0, 0, 0, -88, 0, 0, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, // State 7 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 8 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 9 - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 10 - 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 11 - 0, 0, 0, 0, 0, -22, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -22, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 12 - 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 13 - 0, 0, 0, 0, 0, -18, 0, 0, -18, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -18, 0, 0, -18, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 14 - 0, 0, 0, 0, 0, -81, 0, 0, -81, 0, 0, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -82, 0, 0, -82, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 15 - 0, 0, 0, 0, 0, -82, 0, 0, -82, 0, 0, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -83, 0, 0, -83, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 16 - 0, 0, 0, 0, 0, -83, 0, 0, -83, 0, 0, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -84, 0, 0, -84, 0, 0, -84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 17 - 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 18 - 0, 0, 0, 0, 0, -24, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -24, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 19 - 0, 0, 0, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 20 - 0, 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, -4, -4, + 0, 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4, -4, -4, // State 21 - 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 22 - 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, -5, -5, + 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, -5, -5, // State 23 - 0, 0, 0, 0, 0, -19, 0, 0, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -19, 0, 0, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 24 - 0, 0, 0, 0, 0, -90, 0, 0, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -91, 0, 0, -91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 25 - 0, 0, 0, 0, 0, -89, 0, 0, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -90, 0, 0, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 26 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 27 - 0, 0, 0, 0, 0, -88, 0, 0, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -89, 0, 0, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 28 - 0, 0, 0, 0, 0, -94, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -95, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; fn __action(state: i8, integer: usize) -> i8 { - __ACTION[(state as usize) * 55 + integer] + __ACTION[(state as usize) * 56 + integer] } const __EOF_ACTION: &[i8] = &[ // State 0 @@ -24491,7 +24752,7 @@ mod __parse__TermSignature { // State 6 0, // State 7 - -104, + -105, // State 8 0, // State 9 @@ -24529,7 +24790,7 @@ mod __parse__TermSignature { // State 25 0, // State 26 - -86, + -87, // State 27 0, // State 28 @@ -24591,6 +24852,7 @@ mod __parse__TermSignature { r###""rev""###, r###""rotl""###, r###""rotr""###, + r###""sdiv""###, r###""shl""###, r###""shr""###, r###""sig""###, @@ -24662,7 +24924,7 @@ mod __parse__TermSignature { #[inline] fn error_action(&self, state: i8) -> i8 { - __action(state, 55 - 1) + __action(state, 56 - 1) } #[inline] @@ -24775,11 +25037,12 @@ mod __parse__TermSignature { Token(52, _) if true => Some(47), Token(53, _) if true => Some(48), Token(54, _) if true => Some(49), - Token(0, _) if true => Some(50), - Token(1, _) if true => Some(51), - Token(2, _) if true => Some(52), - Token(3, _) if true => Some(53), - Token(4, _) if true => Some(54), + Token(55, _) if true => Some(50), + Token(0, _) if true => Some(51), + Token(1, _) if true => Some(52), + Token(2, _) if true => Some(53), + Token(3, _) if true => Some(54), + Token(4, _) if true => Some(55), _ => None, } } @@ -24792,8 +25055,8 @@ mod __parse__TermSignature { ) -> __Symbol<'input> { match __token_index { - 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 => match __token { - Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 => match __token { + Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(55, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), _ => unreachable!(), }, _ => unreachable!(), @@ -25153,6 +25416,9 @@ mod __parse__TermSignature { __reduce102(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } 103 => { + __reduce103(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } + 104 => { // __TermSignature = TermSignature => ActionFn(2); let __sym0 = __pop_Variant19(__symbols); let __start = __sym0.0.clone(); @@ -25160,12 +25426,12 @@ mod __parse__TermSignature { let __nt = super::__action2::<>(input, __sym0); return Some(Ok(__nt)); } - 104 => { - __reduce104(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) - } 105 => { __reduce105(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } + 106 => { + __reduce106(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } _ => panic!("invalid action code {}", __action) }; let __states_len = __states.len(); @@ -25441,13 +25707,13 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = BoundVar, "," => ActionFn(80); + // ( ",") = BoundVar, "," => ActionFn(81); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action80::<>(input, __sym0, __sym1); + let __nt = super::__action81::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (2, 0) } @@ -25460,10 +25726,10 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(78); + // ( ",")* = => ActionFn(79); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action78::<>(input, &__start, &__end); + let __nt = super::__action79::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (0, 1) } @@ -25476,11 +25742,11 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(79); + // ( ",")* = ( ",")+ => ActionFn(80); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action79::<>(input, __sym0); + let __nt = super::__action80::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (1, 1) } @@ -25493,13 +25759,13 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = BoundVar, "," => ActionFn(97); + // ( ",")+ = BoundVar, "," => ActionFn(98); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action97::<>(input, __sym0, __sym1); + let __nt = super::__action98::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (2, 2) } @@ -25512,14 +25778,14 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(98); + // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(99); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action98::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action99::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (3, 2) } @@ -25532,13 +25798,13 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Expr, "," => ActionFn(90); + // ( ",") = Expr, "," => ActionFn(91); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action90::<>(input, __sym0, __sym1); + let __nt = super::__action91::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (2, 3) } @@ -25551,10 +25817,10 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(88); + // ( ",")* = => ActionFn(89); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action88::<>(input, &__start, &__end); + let __nt = super::__action89::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (0, 4) } @@ -25567,11 +25833,11 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(89); + // ( ",")* = ( ",")+ => ActionFn(90); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action89::<>(input, __sym0); + let __nt = super::__action90::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (1, 4) } @@ -25584,13 +25850,13 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Expr, "," => ActionFn(101); + // ( ",")+ = Expr, "," => ActionFn(102); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action101::<>(input, __sym0, __sym1); + let __nt = super::__action102::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (2, 5) } @@ -25603,14 +25869,14 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Expr, "," => ActionFn(102); + // ( ",")+ = ( ",")+, Expr, "," => ActionFn(103); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action102::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action103::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (3, 5) } @@ -25623,13 +25889,13 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Type, "," => ActionFn(85); + // ( ",") = Type, "," => ActionFn(86); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action85::<>(input, __sym0, __sym1); + let __nt = super::__action86::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 6) } @@ -25642,10 +25908,10 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(83); + // ( ",")* = => ActionFn(84); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action83::<>(input, &__start, &__end); + let __nt = super::__action84::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (0, 7) } @@ -25658,11 +25924,11 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(84); + // ( ",")* = ( ",")+ => ActionFn(85); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action84::<>(input, __sym0); + let __nt = super::__action85::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (1, 7) } @@ -25675,13 +25941,13 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Type, "," => ActionFn(105); + // ( ",")+ = Type, "," => ActionFn(106); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action105::<>(input, __sym0, __sym1); + let __nt = super::__action106::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (2, 8) } @@ -25694,14 +25960,14 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Type, "," => ActionFn(106); + // ( ",")+ = ( ",")+, Type, "," => ActionFn(107); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action106::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action107::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (3, 8) } @@ -25788,11 +26054,11 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = BoundVar => ActionFn(76); + // BoundVar? = BoundVar => ActionFn(77); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action76::<>(input, __sym0); + let __nt = super::__action77::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (1, 12) } @@ -25805,10 +26071,10 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = => ActionFn(77); + // BoundVar? = => ActionFn(78); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action77::<>(input, &__start, &__end); + let __nt = super::__action78::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (0, 12) } @@ -25821,11 +26087,11 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = BoundVar => ActionFn(109); + // Comma = BoundVar => ActionFn(110); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action109::<>(input, __sym0); + let __nt = super::__action110::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -25838,10 +26104,10 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(110); + // Comma = => ActionFn(111); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action110::<>(input, &__start, &__end); + let __nt = super::__action111::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (0, 13) } @@ -25854,13 +26120,13 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, BoundVar => ActionFn(111); + // Comma = ( ",")+, BoundVar => ActionFn(112); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action111::<>(input, __sym0, __sym1); + let __nt = super::__action112::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (2, 13) } @@ -25873,11 +26139,11 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(112); + // Comma = ( ",")+ => ActionFn(113); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action112::<>(input, __sym0); + let __nt = super::__action113::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -25890,11 +26156,11 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Expr => ActionFn(113); + // Comma = Expr => ActionFn(114); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action113::<>(input, __sym0); + let __nt = super::__action114::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -25907,10 +26173,10 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(114); + // Comma = => ActionFn(115); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action114::<>(input, &__start, &__end); + let __nt = super::__action115::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (0, 14) } @@ -25923,13 +26189,13 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Expr => ActionFn(115); + // Comma = ( ",")+, Expr => ActionFn(116); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action115::<>(input, __sym0, __sym1); + let __nt = super::__action116::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (2, 14) } @@ -25942,11 +26208,11 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(116); + // Comma = ( ",")+ => ActionFn(117); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action116::<>(input, __sym0); + let __nt = super::__action117::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -25959,11 +26225,11 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Type => ActionFn(117); + // Comma = Type => ActionFn(118); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action117::<>(input, __sym0); + let __nt = super::__action118::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -25976,10 +26242,10 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(118); + // Comma = => ActionFn(119); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action118::<>(input, &__start, &__end); + let __nt = super::__action119::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (0, 15) } @@ -25992,13 +26258,13 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Type => ActionFn(119); + // Comma = ( ",")+, Type => ActionFn(120); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action119::<>(input, __sym0, __sym1); + let __nt = super::__action120::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (2, 15) } @@ -26011,11 +26277,11 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(120); + // Comma = ( ",")+ => ActionFn(121); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action120::<>(input, __sym0); + let __nt = super::__action121::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -26475,7 +26741,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "+", Expr, Expr, ")" => ActionFn(52); + // Expr = "(", "sdiv", Expr, Expr, ")" => ActionFn(52); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -26497,7 +26763,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "-", Expr, Expr, ")" => ActionFn(53); + // Expr = "(", "+", Expr, Expr, ")" => ActionFn(53); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -26519,7 +26785,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "&", Expr, Expr, ")" => ActionFn(54); + // Expr = "(", "-", Expr, Expr, ")" => ActionFn(54); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -26541,7 +26807,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "|", Expr, Expr, ")" => ActionFn(55); + // Expr = "(", "&", Expr, Expr, ")" => ActionFn(55); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -26563,7 +26829,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(56); + // Expr = "(", "|", Expr, Expr, ")" => ActionFn(56); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -26585,7 +26851,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(57); + // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(57); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -26607,7 +26873,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(58); + // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(58); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -26629,7 +26895,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(59); + // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(59); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -26651,7 +26917,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(60); + // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(60); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -26673,11 +26939,11 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(61); + // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(61); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -26695,11 +26961,11 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(62); + // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(62); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -26717,11 +26983,11 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(63); + // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(63); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -26739,11 +27005,11 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(64); + // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(64); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -26761,7 +27027,29 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(65); + // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(65); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant3(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym4.2.clone(); + let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant3(__nt), __end)); + (5, 17) + } + pub(crate) fn __reduce68< + 'input, + >( + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: core::marker::PhantomData<(&'input ())>, + ) -> (usize, usize) + { + // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(66); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant3(__symbols); @@ -26771,11 +27059,11 @@ mod __parse__TermSignature { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym5.2.clone(); - let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (6, 17) } - pub(crate) fn __reduce68< + pub(crate) fn __reduce69< 'input, >( input: &'input str, @@ -26784,7 +27072,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(66); + // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(67); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -26793,11 +27081,11 @@ mod __parse__TermSignature { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce69< + pub(crate) fn __reduce70< 'input, >( input: &'input str, @@ -26806,7 +27094,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(67); + // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(68); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -26815,11 +27103,11 @@ mod __parse__TermSignature { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce70< + pub(crate) fn __reduce71< 'input, >( input: &'input str, @@ -26828,7 +27116,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(68); + // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(69); assert!(__symbols.len() >= 11); let __sym10 = __pop_Variant0(__symbols); let __sym9 = __pop_Variant0(__symbols); @@ -26843,11 +27131,11 @@ mod __parse__TermSignature { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym10.2.clone(); - let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); + let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (11, 17) } - pub(crate) fn __reduce71< + pub(crate) fn __reduce72< 'input, >( input: &'input str, @@ -26856,7 +27144,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(69); + // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(70); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -26865,11 +27153,11 @@ mod __parse__TermSignature { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce72< + pub(crate) fn __reduce73< 'input, >( input: &'input str, @@ -26878,7 +27166,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "bv2int", Expr, ")" => ActionFn(70); + // Expr = "(", "bv2int", Expr, ")" => ActionFn(71); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -26886,11 +27174,11 @@ mod __parse__TermSignature { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce73< + pub(crate) fn __reduce74< 'input, >( input: &'input str, @@ -26899,7 +27187,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "widthof", Expr, ")" => ActionFn(71); + // Expr = "(", "widthof", Expr, ")" => ActionFn(72); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -26907,11 +27195,11 @@ mod __parse__TermSignature { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce74< + pub(crate) fn __reduce75< 'input, >( input: &'input str, @@ -26920,15 +27208,15 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = Expr => ActionFn(86); + // Expr? = Expr => ActionFn(87); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action86::<>(input, __sym0); + let __nt = super::__action87::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (1, 18) } - pub(crate) fn __reduce75< + pub(crate) fn __reduce76< 'input, >( input: &'input str, @@ -26937,14 +27225,14 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = => ActionFn(87); + // Expr? = => ActionFn(88); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action87::<>(input, &__start, &__end); + let __nt = super::__action88::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (0, 18) } - pub(crate) fn __reduce76< + pub(crate) fn __reduce77< 'input, >( input: &'input str, @@ -26961,7 +27249,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 19) } - pub(crate) fn __reduce77< + pub(crate) fn __reduce78< 'input, >( input: &'input str, @@ -26988,7 +27276,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (10, 20) } - pub(crate) fn __reduce78< + pub(crate) fn __reduce79< 'input, >( input: &'input str, @@ -27009,7 +27297,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (4, 21) } - pub(crate) fn __reduce79< + pub(crate) fn __reduce80< 'input, >( input: &'input str, @@ -27033,7 +27321,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (7, 22) } - pub(crate) fn __reduce80< + pub(crate) fn __reduce81< 'input, >( input: &'input str, @@ -27050,7 +27338,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce81< + pub(crate) fn __reduce82< 'input, >( input: &'input str, @@ -27067,7 +27355,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce82< + pub(crate) fn __reduce83< 'input, >( input: &'input str, @@ -27084,7 +27372,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce83< + pub(crate) fn __reduce84< 'input, >( input: &'input str, @@ -27101,7 +27389,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant17(__nt), __end)); (1, 24) } - pub(crate) fn __reduce84< + pub(crate) fn __reduce85< 'input, >( input: &'input str, @@ -27110,7 +27398,7 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(72); + // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(73); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -27122,11 +27410,11 @@ mod __parse__TermSignature { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym7.2.clone(); - let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action73::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (8, 25) } - pub(crate) fn __reduce85< + pub(crate) fn __reduce86< 'input, >( input: &'input str, @@ -27150,7 +27438,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (7, 26) } - pub(crate) fn __reduce86< + pub(crate) fn __reduce87< 'input, >( input: &'input str, @@ -27167,7 +27455,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce87< + pub(crate) fn __reduce88< 'input, >( input: &'input str, @@ -27186,7 +27474,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 27) } - pub(crate) fn __reduce88< + pub(crate) fn __reduce89< 'input, >( input: &'input str, @@ -27203,7 +27491,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce89< + pub(crate) fn __reduce90< 'input, >( input: &'input str, @@ -27220,7 +27508,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce90< + pub(crate) fn __reduce91< 'input, >( input: &'input str, @@ -27229,15 +27517,15 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = Type => ActionFn(81); + // Type? = Type => ActionFn(82); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action81::<>(input, __sym0); + let __nt = super::__action82::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (1, 28) } - pub(crate) fn __reduce91< + pub(crate) fn __reduce92< 'input, >( input: &'input str, @@ -27246,14 +27534,14 @@ mod __parse__TermSignature { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = => ActionFn(82); + // Type? = => ActionFn(83); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action82::<>(input, &__start, &__end); + let __nt = super::__action83::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (0, 28) } - pub(crate) fn __reduce92< + pub(crate) fn __reduce93< 'input, >( input: &'input str, @@ -27270,7 +27558,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 29) } - pub(crate) fn __reduce93< + pub(crate) fn __reduce94< 'input, >( input: &'input str, @@ -27287,7 +27575,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant21(__nt), __end)); (1, 30) } - pub(crate) fn __reduce94< + pub(crate) fn __reduce95< 'input, >( input: &'input str, @@ -27307,7 +27595,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce95< + pub(crate) fn __reduce96< 'input, >( input: &'input str, @@ -27327,7 +27615,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce96< + pub(crate) fn __reduce97< 'input, >( input: &'input str, @@ -27344,7 +27632,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (1, 32) } - pub(crate) fn __reduce97< + pub(crate) fn __reduce98< 'input, >( input: &'input str, @@ -27361,7 +27649,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (1, 33) } - pub(crate) fn __reduce98< + pub(crate) fn __reduce99< 'input, >( input: &'input str, @@ -27378,7 +27666,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (1, 34) } - pub(crate) fn __reduce99< + pub(crate) fn __reduce100< 'input, >( input: &'input str, @@ -27395,7 +27683,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (1, 35) } - pub(crate) fn __reduce100< + pub(crate) fn __reduce101< 'input, >( input: &'input str, @@ -27412,7 +27700,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (1, 36) } - pub(crate) fn __reduce101< + pub(crate) fn __reduce102< 'input, >( input: &'input str, @@ -27429,7 +27717,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (1, 37) } - pub(crate) fn __reduce102< + pub(crate) fn __reduce103< 'input, >( input: &'input str, @@ -27446,7 +27734,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (1, 38) } - pub(crate) fn __reduce104< + pub(crate) fn __reduce105< 'input, >( input: &'input str, @@ -27463,7 +27751,7 @@ mod __parse__TermSignature { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 40) } - pub(crate) fn __reduce105< + pub(crate) fn __reduce106< 'input, >( input: &'input str, @@ -27526,38 +27814,38 @@ mod __parse__Type { } const __ACTION: &[i8] = &[ // State 0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, // State 2 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 3 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 4 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 5 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 6 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; fn __action(state: i8, integer: usize) -> i8 { - __ACTION[(state as usize) * 55 + integer] + __ACTION[(state as usize) * 56 + integer] } const __EOF_ACTION: &[i8] = &[ // State 0 0, // State 1 - -87, + -88, // State 2 - -105, + -106, // State 3 - -90, + -91, // State 4 - -89, + -90, // State 5 - -88, + -89, // State 6 - -94, + -95, ]; fn __goto(state: i8, nt: usize) -> i8 { match nt { @@ -27604,6 +27892,7 @@ mod __parse__Type { r###""rev""###, r###""rotl""###, r###""rotr""###, + r###""sdiv""###, r###""shl""###, r###""shr""###, r###""sig""###, @@ -27675,7 +27964,7 @@ mod __parse__Type { #[inline] fn error_action(&self, state: i8) -> i8 { - __action(state, 55 - 1) + __action(state, 56 - 1) } #[inline] @@ -27788,11 +28077,12 @@ mod __parse__Type { Token(52, _) if true => Some(47), Token(53, _) if true => Some(48), Token(54, _) if true => Some(49), - Token(0, _) if true => Some(50), - Token(1, _) if true => Some(51), - Token(2, _) if true => Some(52), - Token(3, _) if true => Some(53), - Token(4, _) if true => Some(54), + Token(55, _) if true => Some(50), + Token(0, _) if true => Some(51), + Token(1, _) if true => Some(52), + Token(2, _) if true => Some(53), + Token(3, _) if true => Some(54), + Token(4, _) if true => Some(55), _ => None, } } @@ -27805,8 +28095,8 @@ mod __parse__Type { ) -> __Symbol<'input> { match __token_index { - 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 => match __token { - Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 => match __token { + Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(55, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), _ => unreachable!(), }, _ => unreachable!(), @@ -28169,6 +28459,9 @@ mod __parse__Type { __reduce103(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } 104 => { + __reduce104(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } + 105 => { // __Type = Type => ActionFn(0); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); @@ -28176,8 +28469,8 @@ mod __parse__Type { let __nt = super::__action0::<>(input, __sym0); return Some(Ok(__nt)); } - 105 => { - __reduce105(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + 106 => { + __reduce106(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } _ => panic!("invalid action code {}", __action) }; @@ -28454,13 +28747,13 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = BoundVar, "," => ActionFn(80); + // ( ",") = BoundVar, "," => ActionFn(81); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action80::<>(input, __sym0, __sym1); + let __nt = super::__action81::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (2, 0) } @@ -28473,10 +28766,10 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(78); + // ( ",")* = => ActionFn(79); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action78::<>(input, &__start, &__end); + let __nt = super::__action79::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (0, 1) } @@ -28489,11 +28782,11 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(79); + // ( ",")* = ( ",")+ => ActionFn(80); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action79::<>(input, __sym0); + let __nt = super::__action80::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (1, 1) } @@ -28506,13 +28799,13 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = BoundVar, "," => ActionFn(97); + // ( ",")+ = BoundVar, "," => ActionFn(98); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action97::<>(input, __sym0, __sym1); + let __nt = super::__action98::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (2, 2) } @@ -28525,14 +28818,14 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(98); + // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(99); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action98::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action99::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (3, 2) } @@ -28545,13 +28838,13 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Expr, "," => ActionFn(90); + // ( ",") = Expr, "," => ActionFn(91); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action90::<>(input, __sym0, __sym1); + let __nt = super::__action91::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (2, 3) } @@ -28564,10 +28857,10 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(88); + // ( ",")* = => ActionFn(89); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action88::<>(input, &__start, &__end); + let __nt = super::__action89::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (0, 4) } @@ -28580,11 +28873,11 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(89); + // ( ",")* = ( ",")+ => ActionFn(90); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action89::<>(input, __sym0); + let __nt = super::__action90::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (1, 4) } @@ -28597,13 +28890,13 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Expr, "," => ActionFn(101); + // ( ",")+ = Expr, "," => ActionFn(102); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action101::<>(input, __sym0, __sym1); + let __nt = super::__action102::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (2, 5) } @@ -28616,14 +28909,14 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Expr, "," => ActionFn(102); + // ( ",")+ = ( ",")+, Expr, "," => ActionFn(103); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action102::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action103::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (3, 5) } @@ -28636,13 +28929,13 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Type, "," => ActionFn(85); + // ( ",") = Type, "," => ActionFn(86); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action85::<>(input, __sym0, __sym1); + let __nt = super::__action86::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 6) } @@ -28655,10 +28948,10 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(83); + // ( ",")* = => ActionFn(84); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action83::<>(input, &__start, &__end); + let __nt = super::__action84::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (0, 7) } @@ -28671,11 +28964,11 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(84); + // ( ",")* = ( ",")+ => ActionFn(85); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action84::<>(input, __sym0); + let __nt = super::__action85::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (1, 7) } @@ -28688,13 +28981,13 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Type, "," => ActionFn(105); + // ( ",")+ = Type, "," => ActionFn(106); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action105::<>(input, __sym0, __sym1); + let __nt = super::__action106::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (2, 8) } @@ -28707,14 +29000,14 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Type, "," => ActionFn(106); + // ( ",")+ = ( ",")+, Type, "," => ActionFn(107); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action106::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action107::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (3, 8) } @@ -28801,11 +29094,11 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = BoundVar => ActionFn(76); + // BoundVar? = BoundVar => ActionFn(77); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action76::<>(input, __sym0); + let __nt = super::__action77::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (1, 12) } @@ -28818,10 +29111,10 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = => ActionFn(77); + // BoundVar? = => ActionFn(78); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action77::<>(input, &__start, &__end); + let __nt = super::__action78::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (0, 12) } @@ -28834,11 +29127,11 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = BoundVar => ActionFn(109); + // Comma = BoundVar => ActionFn(110); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action109::<>(input, __sym0); + let __nt = super::__action110::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -28851,10 +29144,10 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(110); + // Comma = => ActionFn(111); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action110::<>(input, &__start, &__end); + let __nt = super::__action111::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (0, 13) } @@ -28867,13 +29160,13 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, BoundVar => ActionFn(111); + // Comma = ( ",")+, BoundVar => ActionFn(112); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action111::<>(input, __sym0, __sym1); + let __nt = super::__action112::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (2, 13) } @@ -28886,11 +29179,11 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(112); + // Comma = ( ",")+ => ActionFn(113); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action112::<>(input, __sym0); + let __nt = super::__action113::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -28903,11 +29196,11 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Expr => ActionFn(113); + // Comma = Expr => ActionFn(114); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action113::<>(input, __sym0); + let __nt = super::__action114::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -28920,10 +29213,10 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(114); + // Comma = => ActionFn(115); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action114::<>(input, &__start, &__end); + let __nt = super::__action115::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (0, 14) } @@ -28936,13 +29229,13 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Expr => ActionFn(115); + // Comma = ( ",")+, Expr => ActionFn(116); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action115::<>(input, __sym0, __sym1); + let __nt = super::__action116::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (2, 14) } @@ -28955,11 +29248,11 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(116); + // Comma = ( ",")+ => ActionFn(117); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action116::<>(input, __sym0); + let __nt = super::__action117::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -28972,11 +29265,11 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Type => ActionFn(117); + // Comma = Type => ActionFn(118); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action117::<>(input, __sym0); + let __nt = super::__action118::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -28989,10 +29282,10 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(118); + // Comma = => ActionFn(119); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action118::<>(input, &__start, &__end); + let __nt = super::__action119::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (0, 15) } @@ -29005,13 +29298,13 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Type => ActionFn(119); + // Comma = ( ",")+, Type => ActionFn(120); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action119::<>(input, __sym0, __sym1); + let __nt = super::__action120::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (2, 15) } @@ -29024,11 +29317,11 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(120); + // Comma = ( ",")+ => ActionFn(121); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action120::<>(input, __sym0); + let __nt = super::__action121::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -29488,7 +29781,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "+", Expr, Expr, ")" => ActionFn(52); + // Expr = "(", "sdiv", Expr, Expr, ")" => ActionFn(52); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -29510,7 +29803,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "-", Expr, Expr, ")" => ActionFn(53); + // Expr = "(", "+", Expr, Expr, ")" => ActionFn(53); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -29532,7 +29825,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "&", Expr, Expr, ")" => ActionFn(54); + // Expr = "(", "-", Expr, Expr, ")" => ActionFn(54); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -29554,7 +29847,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "|", Expr, Expr, ")" => ActionFn(55); + // Expr = "(", "&", Expr, Expr, ")" => ActionFn(55); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -29576,7 +29869,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(56); + // Expr = "(", "|", Expr, Expr, ")" => ActionFn(56); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -29598,7 +29891,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(57); + // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(57); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -29620,7 +29913,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(58); + // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(58); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -29642,7 +29935,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(59); + // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(59); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -29664,7 +29957,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(60); + // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(60); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -29686,11 +29979,11 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(61); + // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(61); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -29708,11 +30001,11 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(62); + // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(62); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -29730,11 +30023,11 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(63); + // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(63); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -29752,11 +30045,11 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(64); + // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(64); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -29774,7 +30067,29 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(65); + // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(65); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant3(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym4.2.clone(); + let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant3(__nt), __end)); + (5, 17) + } + pub(crate) fn __reduce68< + 'input, + >( + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: core::marker::PhantomData<(&'input ())>, + ) -> (usize, usize) + { + // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(66); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant3(__symbols); @@ -29784,11 +30099,11 @@ mod __parse__Type { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym5.2.clone(); - let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (6, 17) } - pub(crate) fn __reduce68< + pub(crate) fn __reduce69< 'input, >( input: &'input str, @@ -29797,7 +30112,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(66); + // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(67); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -29806,11 +30121,11 @@ mod __parse__Type { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce69< + pub(crate) fn __reduce70< 'input, >( input: &'input str, @@ -29819,7 +30134,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(67); + // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(68); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -29828,11 +30143,11 @@ mod __parse__Type { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce70< + pub(crate) fn __reduce71< 'input, >( input: &'input str, @@ -29841,7 +30156,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(68); + // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(69); assert!(__symbols.len() >= 11); let __sym10 = __pop_Variant0(__symbols); let __sym9 = __pop_Variant0(__symbols); @@ -29856,11 +30171,11 @@ mod __parse__Type { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym10.2.clone(); - let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); + let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (11, 17) } - pub(crate) fn __reduce71< + pub(crate) fn __reduce72< 'input, >( input: &'input str, @@ -29869,7 +30184,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(69); + // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(70); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -29878,11 +30193,11 @@ mod __parse__Type { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce72< + pub(crate) fn __reduce73< 'input, >( input: &'input str, @@ -29891,7 +30206,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "bv2int", Expr, ")" => ActionFn(70); + // Expr = "(", "bv2int", Expr, ")" => ActionFn(71); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -29899,11 +30214,11 @@ mod __parse__Type { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce73< + pub(crate) fn __reduce74< 'input, >( input: &'input str, @@ -29912,7 +30227,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "widthof", Expr, ")" => ActionFn(71); + // Expr = "(", "widthof", Expr, ")" => ActionFn(72); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -29920,11 +30235,11 @@ mod __parse__Type { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce74< + pub(crate) fn __reduce75< 'input, >( input: &'input str, @@ -29933,15 +30248,15 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = Expr => ActionFn(86); + // Expr? = Expr => ActionFn(87); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action86::<>(input, __sym0); + let __nt = super::__action87::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (1, 18) } - pub(crate) fn __reduce75< + pub(crate) fn __reduce76< 'input, >( input: &'input str, @@ -29950,14 +30265,14 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = => ActionFn(87); + // Expr? = => ActionFn(88); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action87::<>(input, &__start, &__end); + let __nt = super::__action88::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (0, 18) } - pub(crate) fn __reduce76< + pub(crate) fn __reduce77< 'input, >( input: &'input str, @@ -29974,7 +30289,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 19) } - pub(crate) fn __reduce77< + pub(crate) fn __reduce78< 'input, >( input: &'input str, @@ -30001,7 +30316,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (10, 20) } - pub(crate) fn __reduce78< + pub(crate) fn __reduce79< 'input, >( input: &'input str, @@ -30022,7 +30337,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (4, 21) } - pub(crate) fn __reduce79< + pub(crate) fn __reduce80< 'input, >( input: &'input str, @@ -30046,7 +30361,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (7, 22) } - pub(crate) fn __reduce80< + pub(crate) fn __reduce81< 'input, >( input: &'input str, @@ -30063,7 +30378,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce81< + pub(crate) fn __reduce82< 'input, >( input: &'input str, @@ -30080,7 +30395,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce82< + pub(crate) fn __reduce83< 'input, >( input: &'input str, @@ -30097,7 +30412,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce83< + pub(crate) fn __reduce84< 'input, >( input: &'input str, @@ -30114,7 +30429,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant17(__nt), __end)); (1, 24) } - pub(crate) fn __reduce84< + pub(crate) fn __reduce85< 'input, >( input: &'input str, @@ -30123,7 +30438,7 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(72); + // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(73); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -30135,11 +30450,11 @@ mod __parse__Type { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym7.2.clone(); - let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action73::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (8, 25) } - pub(crate) fn __reduce85< + pub(crate) fn __reduce86< 'input, >( input: &'input str, @@ -30163,7 +30478,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (7, 26) } - pub(crate) fn __reduce86< + pub(crate) fn __reduce87< 'input, >( input: &'input str, @@ -30180,7 +30495,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce87< + pub(crate) fn __reduce88< 'input, >( input: &'input str, @@ -30199,7 +30514,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 27) } - pub(crate) fn __reduce88< + pub(crate) fn __reduce89< 'input, >( input: &'input str, @@ -30216,7 +30531,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce89< + pub(crate) fn __reduce90< 'input, >( input: &'input str, @@ -30233,7 +30548,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce90< + pub(crate) fn __reduce91< 'input, >( input: &'input str, @@ -30242,15 +30557,15 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = Type => ActionFn(81); + // Type? = Type => ActionFn(82); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action81::<>(input, __sym0); + let __nt = super::__action82::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (1, 28) } - pub(crate) fn __reduce91< + pub(crate) fn __reduce92< 'input, >( input: &'input str, @@ -30259,14 +30574,14 @@ mod __parse__Type { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = => ActionFn(82); + // Type? = => ActionFn(83); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action82::<>(input, &__start, &__end); + let __nt = super::__action83::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (0, 28) } - pub(crate) fn __reduce92< + pub(crate) fn __reduce93< 'input, >( input: &'input str, @@ -30283,7 +30598,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 29) } - pub(crate) fn __reduce93< + pub(crate) fn __reduce94< 'input, >( input: &'input str, @@ -30300,7 +30615,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant21(__nt), __end)); (1, 30) } - pub(crate) fn __reduce94< + pub(crate) fn __reduce95< 'input, >( input: &'input str, @@ -30320,7 +30635,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce95< + pub(crate) fn __reduce96< 'input, >( input: &'input str, @@ -30340,7 +30655,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce96< + pub(crate) fn __reduce97< 'input, >( input: &'input str, @@ -30357,7 +30672,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (1, 32) } - pub(crate) fn __reduce97< + pub(crate) fn __reduce98< 'input, >( input: &'input str, @@ -30374,7 +30689,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (1, 33) } - pub(crate) fn __reduce98< + pub(crate) fn __reduce99< 'input, >( input: &'input str, @@ -30391,7 +30706,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (1, 34) } - pub(crate) fn __reduce99< + pub(crate) fn __reduce100< 'input, >( input: &'input str, @@ -30408,7 +30723,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (1, 35) } - pub(crate) fn __reduce100< + pub(crate) fn __reduce101< 'input, >( input: &'input str, @@ -30425,7 +30740,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (1, 36) } - pub(crate) fn __reduce101< + pub(crate) fn __reduce102< 'input, >( input: &'input str, @@ -30442,7 +30757,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (1, 37) } - pub(crate) fn __reduce102< + pub(crate) fn __reduce103< 'input, >( input: &'input str, @@ -30459,7 +30774,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (1, 38) } - pub(crate) fn __reduce103< + pub(crate) fn __reduce104< 'input, >( input: &'input str, @@ -30476,7 +30791,7 @@ mod __parse__Type { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (1, 39) } - pub(crate) fn __reduce105< + pub(crate) fn __reduce106< 'input, >( input: &'input str, @@ -30539,24 +30854,24 @@ mod __parse__Width { } const __ACTION: &[i8] = &[ // State 0 - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 1 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, // State 2 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 3 - 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 4 - 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 5 - 0, 0, 0, 0, 0, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 6 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // State 7 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; fn __action(state: i8, integer: usize) -> i8 { - __ACTION[(state as usize) * 55 + integer] + __ACTION[(state as usize) * 56 + integer] } const __EOF_ACTION: &[i8] = &[ // State 0 @@ -30564,7 +30879,7 @@ mod __parse__Width { // State 1 0, // State 2 - -106, + -107, // State 3 0, // State 4 @@ -30572,9 +30887,9 @@ mod __parse__Width { // State 5 0, // State 6 - -96, + -97, // State 7 - -95, + -96, ]; fn __goto(state: i8, nt: usize) -> i8 { match nt { @@ -30621,6 +30936,7 @@ mod __parse__Width { r###""rev""###, r###""rotl""###, r###""rotr""###, + r###""sdiv""###, r###""shl""###, r###""shr""###, r###""sig""###, @@ -30692,7 +31008,7 @@ mod __parse__Width { #[inline] fn error_action(&self, state: i8) -> i8 { - __action(state, 55 - 1) + __action(state, 56 - 1) } #[inline] @@ -30805,11 +31121,12 @@ mod __parse__Width { Token(52, _) if true => Some(47), Token(53, _) if true => Some(48), Token(54, _) if true => Some(49), - Token(0, _) if true => Some(50), - Token(1, _) if true => Some(51), - Token(2, _) if true => Some(52), - Token(3, _) if true => Some(53), - Token(4, _) if true => Some(54), + Token(55, _) if true => Some(50), + Token(0, _) if true => Some(51), + Token(1, _) if true => Some(52), + Token(2, _) if true => Some(53), + Token(3, _) if true => Some(54), + Token(4, _) if true => Some(55), _ => None, } } @@ -30822,8 +31139,8 @@ mod __parse__Width { ) -> __Symbol<'input> { match __token_index { - 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 => match __token { - Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), + 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 => match __token { + Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(55, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) | Token(4, __tok0) if true => __Symbol::Variant0(__tok0), _ => unreachable!(), }, _ => unreachable!(), @@ -31189,6 +31506,9 @@ mod __parse__Width { __reduce104(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) } 105 => { + __reduce105(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>) + } + 106 => { // __Width = Width => ActionFn(7); let __sym0 = __pop_Variant22(__symbols); let __start = __sym0.0.clone(); @@ -31471,13 +31791,13 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = BoundVar, "," => ActionFn(80); + // ( ",") = BoundVar, "," => ActionFn(81); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action80::<>(input, __sym0, __sym1); + let __nt = super::__action81::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (2, 0) } @@ -31490,10 +31810,10 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(78); + // ( ",")* = => ActionFn(79); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action78::<>(input, &__start, &__end); + let __nt = super::__action79::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (0, 1) } @@ -31506,11 +31826,11 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(79); + // ( ",")* = ( ",")+ => ActionFn(80); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action79::<>(input, __sym0); + let __nt = super::__action80::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (1, 1) } @@ -31523,13 +31843,13 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = BoundVar, "," => ActionFn(97); + // ( ",")+ = BoundVar, "," => ActionFn(98); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action97::<>(input, __sym0, __sym1); + let __nt = super::__action98::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (2, 2) } @@ -31542,14 +31862,14 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(98); + // ( ",")+ = ( ",")+, BoundVar, "," => ActionFn(99); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action98::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action99::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant2(__nt), __end)); (3, 2) } @@ -31562,13 +31882,13 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Expr, "," => ActionFn(90); + // ( ",") = Expr, "," => ActionFn(91); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action90::<>(input, __sym0, __sym1); + let __nt = super::__action91::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (2, 3) } @@ -31581,10 +31901,10 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(88); + // ( ",")* = => ActionFn(89); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action88::<>(input, &__start, &__end); + let __nt = super::__action89::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (0, 4) } @@ -31597,11 +31917,11 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(89); + // ( ",")* = ( ",")+ => ActionFn(90); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action89::<>(input, __sym0); + let __nt = super::__action90::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (1, 4) } @@ -31614,13 +31934,13 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Expr, "," => ActionFn(101); + // ( ",")+ = Expr, "," => ActionFn(102); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action101::<>(input, __sym0, __sym1); + let __nt = super::__action102::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (2, 5) } @@ -31633,14 +31953,14 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Expr, "," => ActionFn(102); + // ( ",")+ = ( ",")+, Expr, "," => ActionFn(103); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action102::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action103::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant4(__nt), __end)); (3, 5) } @@ -31653,13 +31973,13 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",") = Type, "," => ActionFn(85); + // ( ",") = Type, "," => ActionFn(86); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action85::<>(input, __sym0, __sym1); + let __nt = super::__action86::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 6) } @@ -31672,10 +31992,10 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = => ActionFn(83); + // ( ",")* = => ActionFn(84); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action83::<>(input, &__start, &__end); + let __nt = super::__action84::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (0, 7) } @@ -31688,11 +32008,11 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")* = ( ",")+ => ActionFn(84); + // ( ",")* = ( ",")+ => ActionFn(85); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action84::<>(input, __sym0); + let __nt = super::__action85::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (1, 7) } @@ -31705,13 +32025,13 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = Type, "," => ActionFn(105); + // ( ",")+ = Type, "," => ActionFn(106); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action105::<>(input, __sym0, __sym1); + let __nt = super::__action106::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (2, 8) } @@ -31724,14 +32044,14 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // ( ",")+ = ( ",")+, Type, "," => ActionFn(106); + // ( ",")+ = ( ",")+, Type, "," => ActionFn(107); assert!(__symbols.len() >= 3); let __sym2 = __pop_Variant0(__symbols); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym2.2.clone(); - let __nt = super::__action106::<>(input, __sym0, __sym1, __sym2); + let __nt = super::__action107::<>(input, __sym0, __sym1, __sym2); __symbols.push((__start, __Symbol::Variant6(__nt), __end)); (3, 8) } @@ -31818,11 +32138,11 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = BoundVar => ActionFn(76); + // BoundVar? = BoundVar => ActionFn(77); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action76::<>(input, __sym0); + let __nt = super::__action77::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (1, 12) } @@ -31835,10 +32155,10 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // BoundVar? = => ActionFn(77); + // BoundVar? = => ActionFn(78); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action77::<>(input, &__start, &__end); + let __nt = super::__action78::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant8(__nt), __end)); (0, 12) } @@ -31851,11 +32171,11 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = BoundVar => ActionFn(109); + // Comma = BoundVar => ActionFn(110); let __sym0 = __pop_Variant1(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action109::<>(input, __sym0); + let __nt = super::__action110::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -31868,10 +32188,10 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(110); + // Comma = => ActionFn(111); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action110::<>(input, &__start, &__end); + let __nt = super::__action111::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (0, 13) } @@ -31884,13 +32204,13 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, BoundVar => ActionFn(111); + // Comma = ( ",")+, BoundVar => ActionFn(112); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant1(__symbols); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action111::<>(input, __sym0, __sym1); + let __nt = super::__action112::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (2, 13) } @@ -31903,11 +32223,11 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(112); + // Comma = ( ",")+ => ActionFn(113); let __sym0 = __pop_Variant2(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action112::<>(input, __sym0); + let __nt = super::__action113::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant7(__nt), __end)); (1, 13) } @@ -31920,11 +32240,11 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Expr => ActionFn(113); + // Comma = Expr => ActionFn(114); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action113::<>(input, __sym0); + let __nt = super::__action114::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -31937,10 +32257,10 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(114); + // Comma = => ActionFn(115); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action114::<>(input, &__start, &__end); + let __nt = super::__action115::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (0, 14) } @@ -31953,13 +32273,13 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Expr => ActionFn(115); + // Comma = ( ",")+, Expr => ActionFn(116); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant3(__symbols); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action115::<>(input, __sym0, __sym1); + let __nt = super::__action116::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (2, 14) } @@ -31972,11 +32292,11 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(116); + // Comma = ( ",")+ => ActionFn(117); let __sym0 = __pop_Variant4(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action116::<>(input, __sym0); + let __nt = super::__action117::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 14) } @@ -31989,11 +32309,11 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = Type => ActionFn(117); + // Comma = Type => ActionFn(118); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action117::<>(input, __sym0); + let __nt = super::__action118::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -32006,10 +32326,10 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = => ActionFn(118); + // Comma = => ActionFn(119); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action118::<>(input, &__start, &__end); + let __nt = super::__action119::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (0, 15) } @@ -32022,13 +32342,13 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+, Type => ActionFn(119); + // Comma = ( ",")+, Type => ActionFn(120); assert!(__symbols.len() >= 2); let __sym1 = __pop_Variant5(__symbols); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym1.2.clone(); - let __nt = super::__action119::<>(input, __sym0, __sym1); + let __nt = super::__action120::<>(input, __sym0, __sym1); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (2, 15) } @@ -32041,11 +32361,11 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Comma = ( ",")+ => ActionFn(120); + // Comma = ( ",")+ => ActionFn(121); let __sym0 = __pop_Variant6(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action120::<>(input, __sym0); + let __nt = super::__action121::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 15) } @@ -32505,7 +32825,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "+", Expr, Expr, ")" => ActionFn(52); + // Expr = "(", "sdiv", Expr, Expr, ")" => ActionFn(52); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -32527,7 +32847,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "-", Expr, Expr, ")" => ActionFn(53); + // Expr = "(", "+", Expr, Expr, ")" => ActionFn(53); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -32549,7 +32869,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "&", Expr, Expr, ")" => ActionFn(54); + // Expr = "(", "-", Expr, Expr, ")" => ActionFn(54); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -32571,7 +32891,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "|", Expr, Expr, ")" => ActionFn(55); + // Expr = "(", "&", Expr, Expr, ")" => ActionFn(55); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -32593,7 +32913,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(56); + // Expr = "(", "|", Expr, Expr, ")" => ActionFn(56); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -32615,7 +32935,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(57); + // Expr = "(", "xor", Expr, Expr, ")" => ActionFn(57); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -32637,7 +32957,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(58); + // Expr = "(", "rotl", Expr, Expr, ")" => ActionFn(58); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -32659,7 +32979,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(59); + // Expr = "(", "rotr", Expr, Expr, ")" => ActionFn(59); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -32681,7 +33001,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(60); + // Expr = "(", "shl", Expr, Expr, ")" => ActionFn(60); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -32703,11 +33023,11 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(61); + // Expr = "(", "shr", Expr, Expr, ")" => ActionFn(61); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -32725,11 +33045,11 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(62); + // Expr = "(", "zero_ext", Width, Expr, ")" => ActionFn(62); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -32747,11 +33067,11 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(63); + // Expr = "(", "zero_ext", Expr, Expr, ")" => ActionFn(63); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant22(__symbols); + let __sym2 = __pop_Variant3(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -32769,11 +33089,11 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(64); + // Expr = "(", "sign_ext", Width, Expr, ")" => ActionFn(64); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); - let __sym2 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant22(__symbols); let __sym1 = __pop_Variant0(__symbols); let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); @@ -32791,7 +33111,29 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(65); + // Expr = "(", "sign_ext", Expr, Expr, ")" => ActionFn(65); + assert!(__symbols.len() >= 5); + let __sym4 = __pop_Variant0(__symbols); + let __sym3 = __pop_Variant3(__symbols); + let __sym2 = __pop_Variant3(__symbols); + let __sym1 = __pop_Variant0(__symbols); + let __sym0 = __pop_Variant0(__symbols); + let __start = __sym0.0.clone(); + let __end = __sym4.2.clone(); + let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + __symbols.push((__start, __Symbol::Variant3(__nt), __end)); + (5, 17) + } + pub(crate) fn __reduce68< + 'input, + >( + input: &'input str, + __lookahead_start: Option<&usize>, + __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>, + _: core::marker::PhantomData<(&'input ())>, + ) -> (usize, usize) + { + // Expr = "(", "extract", UNum, UNum, Expr, ")" => ActionFn(66); assert!(__symbols.len() >= 6); let __sym5 = __pop_Variant0(__symbols); let __sym4 = __pop_Variant3(__symbols); @@ -32801,11 +33143,11 @@ mod __parse__Width { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym5.2.clone(); - let __nt = super::__action65::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); + let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (6, 17) } - pub(crate) fn __reduce68< + pub(crate) fn __reduce69< 'input, >( input: &'input str, @@ -32814,7 +33156,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(66); + // Expr = "(", "conv_to", Width, Expr, ")" => ActionFn(67); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -32823,11 +33165,11 @@ mod __parse__Width { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action66::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce69< + pub(crate) fn __reduce70< 'input, >( input: &'input str, @@ -32836,7 +33178,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(67); + // Expr = "(", "conv_to", Expr, Expr, ")" => ActionFn(68); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -32845,11 +33187,11 @@ mod __parse__Width { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action67::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce70< + pub(crate) fn __reduce71< 'input, >( input: &'input str, @@ -32858,7 +33200,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(68); + // Expr = "(", "if", Expr, "{", Expr, "}", "else", "{", Expr, "}", ")" => ActionFn(69); assert!(__symbols.len() >= 11); let __sym10 = __pop_Variant0(__symbols); let __sym9 = __pop_Variant0(__symbols); @@ -32873,11 +33215,11 @@ mod __parse__Width { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym10.2.clone(); - let __nt = super::__action68::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); + let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (11, 17) } - pub(crate) fn __reduce71< + pub(crate) fn __reduce72< 'input, >( input: &'input str, @@ -32886,7 +33228,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(69); + // Expr = "(", "int2bv", UNum, Expr, ")" => ActionFn(70); assert!(__symbols.len() >= 5); let __sym4 = __pop_Variant0(__symbols); let __sym3 = __pop_Variant3(__symbols); @@ -32895,11 +33237,11 @@ mod __parse__Width { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym4.2.clone(); - let __nt = super::__action69::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); + let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (5, 17) } - pub(crate) fn __reduce72< + pub(crate) fn __reduce73< 'input, >( input: &'input str, @@ -32908,7 +33250,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "bv2int", Expr, ")" => ActionFn(70); + // Expr = "(", "bv2int", Expr, ")" => ActionFn(71); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -32916,11 +33258,11 @@ mod __parse__Width { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce73< + pub(crate) fn __reduce74< 'input, >( input: &'input str, @@ -32929,7 +33271,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr = "(", "widthof", Expr, ")" => ActionFn(71); + // Expr = "(", "widthof", Expr, ")" => ActionFn(72); assert!(__symbols.len() >= 4); let __sym3 = __pop_Variant0(__symbols); let __sym2 = __pop_Variant3(__symbols); @@ -32937,11 +33279,11 @@ mod __parse__Width { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym3.2.clone(); - let __nt = super::__action71::<>(input, __sym0, __sym1, __sym2, __sym3); + let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3); __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (4, 17) } - pub(crate) fn __reduce74< + pub(crate) fn __reduce75< 'input, >( input: &'input str, @@ -32950,15 +33292,15 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = Expr => ActionFn(86); + // Expr? = Expr => ActionFn(87); let __sym0 = __pop_Variant3(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action86::<>(input, __sym0); + let __nt = super::__action87::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (1, 18) } - pub(crate) fn __reduce75< + pub(crate) fn __reduce76< 'input, >( input: &'input str, @@ -32967,14 +33309,14 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Expr? = => ActionFn(87); + // Expr? = => ActionFn(88); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action87::<>(input, &__start, &__end); + let __nt = super::__action88::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant12(__nt), __end)); (0, 18) } - pub(crate) fn __reduce76< + pub(crate) fn __reduce77< 'input, >( input: &'input str, @@ -32991,7 +33333,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant9(__nt), __end)); (1, 19) } - pub(crate) fn __reduce77< + pub(crate) fn __reduce78< 'input, >( input: &'input str, @@ -33018,7 +33360,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (10, 20) } - pub(crate) fn __reduce78< + pub(crate) fn __reduce79< 'input, >( input: &'input str, @@ -33039,7 +33381,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (4, 21) } - pub(crate) fn __reduce79< + pub(crate) fn __reduce80< 'input, >( input: &'input str, @@ -33063,7 +33405,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (7, 22) } - pub(crate) fn __reduce80< + pub(crate) fn __reduce81< 'input, >( input: &'input str, @@ -33080,7 +33422,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce81< + pub(crate) fn __reduce82< 'input, >( input: &'input str, @@ -33097,7 +33439,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce82< + pub(crate) fn __reduce83< 'input, >( input: &'input str, @@ -33114,7 +33456,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant16(__nt), __end)); (1, 23) } - pub(crate) fn __reduce83< + pub(crate) fn __reduce84< 'input, >( input: &'input str, @@ -33131,7 +33473,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant17(__nt), __end)); (1, 24) } - pub(crate) fn __reduce84< + pub(crate) fn __reduce85< 'input, >( input: &'input str, @@ -33140,7 +33482,7 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(72); + // TermAnnotation = "(", "spec", TermSignature, "(", "assertions", ExprList, ")", ")" => ActionFn(73); assert!(__symbols.len() >= 8); let __sym7 = __pop_Variant0(__symbols); let __sym6 = __pop_Variant0(__symbols); @@ -33152,11 +33494,11 @@ mod __parse__Width { let __sym0 = __pop_Variant0(__symbols); let __start = __sym0.0.clone(); let __end = __sym7.2.clone(); - let __nt = super::__action72::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); + let __nt = super::__action73::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7); __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (8, 25) } - pub(crate) fn __reduce85< + pub(crate) fn __reduce86< 'input, >( input: &'input str, @@ -33180,7 +33522,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (7, 26) } - pub(crate) fn __reduce86< + pub(crate) fn __reduce87< 'input, >( input: &'input str, @@ -33197,7 +33539,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce87< + pub(crate) fn __reduce88< 'input, >( input: &'input str, @@ -33216,7 +33558,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (2, 27) } - pub(crate) fn __reduce88< + pub(crate) fn __reduce89< 'input, >( input: &'input str, @@ -33233,7 +33575,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce89< + pub(crate) fn __reduce90< 'input, >( input: &'input str, @@ -33250,7 +33592,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant5(__nt), __end)); (1, 27) } - pub(crate) fn __reduce90< + pub(crate) fn __reduce91< 'input, >( input: &'input str, @@ -33259,15 +33601,15 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = Type => ActionFn(81); + // Type? = Type => ActionFn(82); let __sym0 = __pop_Variant5(__symbols); let __start = __sym0.0.clone(); let __end = __sym0.2.clone(); - let __nt = super::__action81::<>(input, __sym0); + let __nt = super::__action82::<>(input, __sym0); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (1, 28) } - pub(crate) fn __reduce91< + pub(crate) fn __reduce92< 'input, >( input: &'input str, @@ -33276,14 +33618,14 @@ mod __parse__Width { _: core::marker::PhantomData<(&'input ())>, ) -> (usize, usize) { - // Type? = => ActionFn(82); + // Type? = => ActionFn(83); let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default(); let __end = __start.clone(); - let __nt = super::__action82::<>(input, &__start, &__end); + let __nt = super::__action83::<>(input, &__start, &__end); __symbols.push((__start, __Symbol::Variant20(__nt), __end)); (0, 28) } - pub(crate) fn __reduce92< + pub(crate) fn __reduce93< 'input, >( input: &'input str, @@ -33300,7 +33642,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant10(__nt), __end)); (1, 29) } - pub(crate) fn __reduce93< + pub(crate) fn __reduce94< 'input, >( input: &'input str, @@ -33317,7 +33659,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant21(__nt), __end)); (1, 30) } - pub(crate) fn __reduce94< + pub(crate) fn __reduce95< 'input, >( input: &'input str, @@ -33337,7 +33679,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce95< + pub(crate) fn __reduce96< 'input, >( input: &'input str, @@ -33357,7 +33699,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant22(__nt), __end)); (3, 31) } - pub(crate) fn __reduce96< + pub(crate) fn __reduce97< 'input, >( input: &'input str, @@ -33374,7 +33716,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant1(__nt), __end)); (1, 32) } - pub(crate) fn __reduce97< + pub(crate) fn __reduce98< 'input, >( input: &'input str, @@ -33391,7 +33733,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant11(__nt), __end)); (1, 33) } - pub(crate) fn __reduce98< + pub(crate) fn __reduce99< 'input, >( input: &'input str, @@ -33408,7 +33750,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant3(__nt), __end)); (1, 34) } - pub(crate) fn __reduce99< + pub(crate) fn __reduce100< 'input, >( input: &'input str, @@ -33425,7 +33767,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant13(__nt), __end)); (1, 35) } - pub(crate) fn __reduce100< + pub(crate) fn __reduce101< 'input, >( input: &'input str, @@ -33442,7 +33784,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant14(__nt), __end)); (1, 36) } - pub(crate) fn __reduce101< + pub(crate) fn __reduce102< 'input, >( input: &'input str, @@ -33459,7 +33801,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant15(__nt), __end)); (1, 37) } - pub(crate) fn __reduce102< + pub(crate) fn __reduce103< 'input, >( input: &'input str, @@ -33476,7 +33818,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant18(__nt), __end)); (1, 38) } - pub(crate) fn __reduce103< + pub(crate) fn __reduce104< 'input, >( input: &'input str, @@ -33493,7 +33835,7 @@ mod __parse__Width { __symbols.push((__start, __Symbol::Variant19(__nt), __end)); (1, 39) } - pub(crate) fn __reduce104< + pub(crate) fn __reduce105< 'input, >( input: &'input str, @@ -33567,6 +33909,7 @@ mod __intern_token { ("^(rev)", false), ("^(rotl)", false), ("^(rotr)", false), + ("^(sdiv)", false), ("^(shl)", false), ("^(shr)", false), ("^(sig)", false), @@ -34274,7 +34617,7 @@ fn __action52< (_, _, _): (usize, &'input str, usize), ) -> Box { - Box::new(Expr::BVAdd(u, v, 0)) + Box::new(Expr::BVSDiv(u, v, 0)) } #[allow(unused_variables)] @@ -34289,7 +34632,7 @@ fn __action53< (_, _, _): (usize, &'input str, usize), ) -> Box { - Box::new(Expr::BVSub(u, v, 0)) + Box::new(Expr::BVAdd(u, v, 0)) } #[allow(unused_variables)] @@ -34304,7 +34647,7 @@ fn __action54< (_, _, _): (usize, &'input str, usize), ) -> Box { - Box::new(Expr::BVAnd(u, v, 0)) + Box::new(Expr::BVSub(u, v, 0)) } #[allow(unused_variables)] @@ -34319,7 +34662,7 @@ fn __action55< (_, _, _): (usize, &'input str, usize), ) -> Box { - Box::new(Expr::BVOr(u, v, 0)) + Box::new(Expr::BVAnd(u, v, 0)) } #[allow(unused_variables)] @@ -34334,7 +34677,7 @@ fn __action56< (_, _, _): (usize, &'input str, usize), ) -> Box { - Box::new(Expr::BVXor(u, v, 0)) + Box::new(Expr::BVOr(u, v, 0)) } #[allow(unused_variables)] @@ -34349,7 +34692,7 @@ fn __action57< (_, _, _): (usize, &'input str, usize), ) -> Box { - Box::new(Expr::BVRotl(u, v, 0)) + Box::new(Expr::BVXor(u, v, 0)) } #[allow(unused_variables)] @@ -34364,7 +34707,7 @@ fn __action58< (_, _, _): (usize, &'input str, usize), ) -> Box { - Box::new(Expr::BVRotr(u, v, 0)) + Box::new(Expr::BVRotl(u, v, 0)) } #[allow(unused_variables)] @@ -34379,7 +34722,7 @@ fn __action59< (_, _, _): (usize, &'input str, usize), ) -> Box { - Box::new(Expr::BVShl(u, v, 0)) + Box::new(Expr::BVRotr(u, v, 0)) } #[allow(unused_variables)] @@ -34394,12 +34737,27 @@ fn __action60< (_, _, _): (usize, &'input str, usize), ) -> Box { - Box::new(Expr::BVShr(u, v, 0)) + Box::new(Expr::BVShl(u, v, 0)) } #[allow(unused_variables)] fn __action61< 'input, +>( + input: &'input str, + (_, _, _): (usize, &'input str, usize), + (_, _, _): (usize, &'input str, usize), + (_, u, _): (usize, Box, usize), + (_, v, _): (usize, Box, usize), + (_, _, _): (usize, &'input str, usize), +) -> Box +{ + Box::new(Expr::BVShr(u, v, 0)) +} + +#[allow(unused_variables)] +fn __action62< + 'input, >( input: &'input str, (_, _, _): (usize, &'input str, usize), @@ -34413,7 +34771,7 @@ fn __action61< } #[allow(unused_variables)] -fn __action62< +fn __action63< 'input, >( input: &'input str, @@ -34428,7 +34786,7 @@ fn __action62< } #[allow(unused_variables)] -fn __action63< +fn __action64< 'input, >( input: &'input str, @@ -34443,7 +34801,7 @@ fn __action63< } #[allow(unused_variables)] -fn __action64< +fn __action65< 'input, >( input: &'input str, @@ -34458,7 +34816,7 @@ fn __action64< } #[allow(unused_variables)] -fn __action65< +fn __action66< 'input, >( input: &'input str, @@ -34474,7 +34832,7 @@ fn __action65< } #[allow(unused_variables)] -fn __action66< +fn __action67< 'input, >( input: &'input str, @@ -34489,7 +34847,7 @@ fn __action66< } #[allow(unused_variables)] -fn __action67< +fn __action68< 'input, >( input: &'input str, @@ -34504,7 +34862,7 @@ fn __action67< } #[allow(unused_variables)] -fn __action68< +fn __action69< 'input, >( input: &'input str, @@ -34525,7 +34883,7 @@ fn __action68< } #[allow(unused_variables)] -fn __action69< +fn __action70< 'input, >( input: &'input str, @@ -34540,7 +34898,7 @@ fn __action69< } #[allow(unused_variables)] -fn __action70< +fn __action71< 'input, >( input: &'input str, @@ -34554,7 +34912,7 @@ fn __action70< } #[allow(unused_variables)] -fn __action71< +fn __action72< 'input, >( input: &'input str, @@ -34568,7 +34926,7 @@ fn __action71< } #[allow(unused_variables)] -fn __action72< +fn __action73< 'input, >( input: &'input str, @@ -34586,7 +34944,7 @@ fn __action72< } #[allow(unused_variables)] -fn __action73< +fn __action74< 'input, >( input: &'input str, @@ -34604,7 +34962,7 @@ fn __action73< } #[allow(unused_variables)] -fn __action74< +fn __action75< 'input, >( input: &'input str, @@ -34622,7 +34980,7 @@ fn __action74< } #[allow(unused_variables)] -fn __action75< +fn __action76< 'input, >( input: &'input str, @@ -34640,7 +34998,7 @@ fn __action75< } #[allow(unused_variables)] -fn __action76< +fn __action77< 'input, >( input: &'input str, @@ -34651,7 +35009,7 @@ fn __action76< } #[allow(unused_variables)] -fn __action77< +fn __action78< 'input, >( input: &'input str, @@ -34663,7 +35021,7 @@ fn __action77< } #[allow(unused_variables)] -fn __action78< +fn __action79< 'input, >( input: &'input str, @@ -34675,7 +35033,7 @@ fn __action78< } #[allow(unused_variables)] -fn __action79< +fn __action80< 'input, >( input: &'input str, @@ -34686,7 +35044,7 @@ fn __action79< } #[allow(unused_variables)] -fn __action80< +fn __action81< 'input, >( input: &'input str, @@ -34698,7 +35056,7 @@ fn __action80< } #[allow(unused_variables)] -fn __action81< +fn __action82< 'input, >( input: &'input str, @@ -34709,7 +35067,7 @@ fn __action81< } #[allow(unused_variables)] -fn __action82< +fn __action83< 'input, >( input: &'input str, @@ -34721,7 +35079,7 @@ fn __action82< } #[allow(unused_variables)] -fn __action83< +fn __action84< 'input, >( input: &'input str, @@ -34733,7 +35091,7 @@ fn __action83< } #[allow(unused_variables)] -fn __action84< +fn __action85< 'input, >( input: &'input str, @@ -34744,7 +35102,7 @@ fn __action84< } #[allow(unused_variables)] -fn __action85< +fn __action86< 'input, >( input: &'input str, @@ -34756,7 +35114,7 @@ fn __action85< } #[allow(unused_variables)] -fn __action86< +fn __action87< 'input, >( input: &'input str, @@ -34767,7 +35125,7 @@ fn __action86< } #[allow(unused_variables)] -fn __action87< +fn __action88< 'input, >( input: &'input str, @@ -34779,7 +35137,7 @@ fn __action87< } #[allow(unused_variables)] -fn __action88< +fn __action89< 'input, >( input: &'input str, @@ -34791,7 +35149,7 @@ fn __action88< } #[allow(unused_variables)] -fn __action89< +fn __action90< 'input, >( input: &'input str, @@ -34802,7 +35160,7 @@ fn __action89< } #[allow(unused_variables)] -fn __action90< +fn __action91< 'input, >( input: &'input str, @@ -34814,7 +35172,7 @@ fn __action90< } #[allow(unused_variables)] -fn __action91< +fn __action92< 'input, >( input: &'input str, @@ -34825,7 +35183,7 @@ fn __action91< } #[allow(unused_variables)] -fn __action92< +fn __action93< 'input, >( input: &'input str, @@ -34837,7 +35195,7 @@ fn __action92< } #[allow(unused_variables)] -fn __action93< +fn __action94< 'input, >( input: &'input str, @@ -34848,7 +35206,7 @@ fn __action93< } #[allow(unused_variables)] -fn __action94< +fn __action95< 'input, >( input: &'input str, @@ -34860,7 +35218,7 @@ fn __action94< } #[allow(unused_variables)] -fn __action95< +fn __action96< 'input, >( input: &'input str, @@ -34871,7 +35229,7 @@ fn __action95< } #[allow(unused_variables)] -fn __action96< +fn __action97< 'input, >( input: &'input str, @@ -34883,7 +35241,7 @@ fn __action96< } #[allow(unused_variables)] -fn __action97< +fn __action98< 'input, >( input: &'input str, @@ -34893,20 +35251,20 @@ fn __action97< { let __start0 = __0.0.clone(); let __end0 = __1.2.clone(); - let __temp0 = __action80( + let __temp0 = __action81( input, __0, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action95( + __action96( input, __temp0, ) } #[allow(unused_variables)] -fn __action98< +fn __action99< 'input, >( input: &'input str, @@ -34917,13 +35275,13 @@ fn __action98< { let __start0 = __1.0.clone(); let __end0 = __2.2.clone(); - let __temp0 = __action80( + let __temp0 = __action81( input, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action96( + __action97( input, __0, __temp0, @@ -34931,7 +35289,7 @@ fn __action98< } #[allow(unused_variables)] -fn __action99< +fn __action100< 'input, >( input: &'input str, @@ -34940,13 +35298,13 @@ fn __action99< { let __start0 = __0.0.clone(); let __end0 = __0.0.clone(); - let __temp0 = __action78( + let __temp0 = __action79( input, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action75( + __action76( input, __temp0, __0, @@ -34954,7 +35312,7 @@ fn __action99< } #[allow(unused_variables)] -fn __action100< +fn __action101< 'input, >( input: &'input str, @@ -34964,12 +35322,12 @@ fn __action100< { let __start0 = __0.0.clone(); let __end0 = __0.2.clone(); - let __temp0 = __action79( + let __temp0 = __action80( input, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action75( + __action76( input, __temp0, __1, @@ -34977,7 +35335,7 @@ fn __action100< } #[allow(unused_variables)] -fn __action101< +fn __action102< 'input, >( input: &'input str, @@ -34987,20 +35345,20 @@ fn __action101< { let __start0 = __0.0.clone(); let __end0 = __1.2.clone(); - let __temp0 = __action90( + let __temp0 = __action91( input, __0, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action91( + __action92( input, __temp0, ) } #[allow(unused_variables)] -fn __action102< +fn __action103< 'input, >( input: &'input str, @@ -35011,13 +35369,13 @@ fn __action102< { let __start0 = __1.0.clone(); let __end0 = __2.2.clone(); - let __temp0 = __action90( + let __temp0 = __action91( input, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action92( + __action93( input, __0, __temp0, @@ -35025,7 +35383,7 @@ fn __action102< } #[allow(unused_variables)] -fn __action103< +fn __action104< 'input, >( input: &'input str, @@ -35034,13 +35392,13 @@ fn __action103< { let __start0 = __0.0.clone(); let __end0 = __0.0.clone(); - let __temp0 = __action88( + let __temp0 = __action89( input, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action73( + __action74( input, __temp0, __0, @@ -35048,7 +35406,7 @@ fn __action103< } #[allow(unused_variables)] -fn __action104< +fn __action105< 'input, >( input: &'input str, @@ -35058,12 +35416,12 @@ fn __action104< { let __start0 = __0.0.clone(); let __end0 = __0.2.clone(); - let __temp0 = __action89( + let __temp0 = __action90( input, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action73( + __action74( input, __temp0, __1, @@ -35071,7 +35429,7 @@ fn __action104< } #[allow(unused_variables)] -fn __action105< +fn __action106< 'input, >( input: &'input str, @@ -35081,20 +35439,20 @@ fn __action105< { let __start0 = __0.0.clone(); let __end0 = __1.2.clone(); - let __temp0 = __action85( + let __temp0 = __action86( input, __0, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action93( + __action94( input, __temp0, ) } #[allow(unused_variables)] -fn __action106< +fn __action107< 'input, >( input: &'input str, @@ -35105,13 +35463,13 @@ fn __action106< { let __start0 = __1.0.clone(); let __end0 = __2.2.clone(); - let __temp0 = __action85( + let __temp0 = __action86( input, __1, __2, ); let __temp0 = (__start0, __temp0, __end0); - __action94( + __action95( input, __0, __temp0, @@ -35119,7 +35477,7 @@ fn __action106< } #[allow(unused_variables)] -fn __action107< +fn __action108< 'input, >( input: &'input str, @@ -35128,13 +35486,13 @@ fn __action107< { let __start0 = __0.0.clone(); let __end0 = __0.0.clone(); - let __temp0 = __action83( + let __temp0 = __action84( input, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action74( + __action75( input, __temp0, __0, @@ -35142,7 +35500,7 @@ fn __action107< } #[allow(unused_variables)] -fn __action108< +fn __action109< 'input, >( input: &'input str, @@ -35152,12 +35510,12 @@ fn __action108< { let __start0 = __0.0.clone(); let __end0 = __0.2.clone(); - let __temp0 = __action84( + let __temp0 = __action85( input, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action74( + __action75( input, __temp0, __1, @@ -35165,7 +35523,7 @@ fn __action108< } #[allow(unused_variables)] -fn __action109< +fn __action110< 'input, >( input: &'input str, @@ -35174,19 +35532,19 @@ fn __action109< { let __start0 = __0.0.clone(); let __end0 = __0.2.clone(); - let __temp0 = __action76( + let __temp0 = __action77( input, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action99( + __action100( input, __temp0, ) } #[allow(unused_variables)] -fn __action110< +fn __action111< 'input, >( input: &'input str, @@ -35196,20 +35554,20 @@ fn __action110< { let __start0 = __lookbehind.clone(); let __end0 = __lookahead.clone(); - let __temp0 = __action77( + let __temp0 = __action78( input, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action99( + __action100( input, __temp0, ) } #[allow(unused_variables)] -fn __action111< +fn __action112< 'input, >( input: &'input str, @@ -35219,12 +35577,12 @@ fn __action111< { let __start0 = __1.0.clone(); let __end0 = __1.2.clone(); - let __temp0 = __action76( + let __temp0 = __action77( input, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action100( + __action101( input, __0, __temp0, @@ -35232,7 +35590,7 @@ fn __action111< } #[allow(unused_variables)] -fn __action112< +fn __action113< 'input, >( input: &'input str, @@ -35241,13 +35599,13 @@ fn __action112< { let __start0 = __0.2.clone(); let __end0 = __0.2.clone(); - let __temp0 = __action77( + let __temp0 = __action78( input, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action100( + __action101( input, __0, __temp0, @@ -35255,7 +35613,7 @@ fn __action112< } #[allow(unused_variables)] -fn __action113< +fn __action114< 'input, >( input: &'input str, @@ -35264,19 +35622,19 @@ fn __action113< { let __start0 = __0.0.clone(); let __end0 = __0.2.clone(); - let __temp0 = __action86( + let __temp0 = __action87( input, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action103( + __action104( input, __temp0, ) } #[allow(unused_variables)] -fn __action114< +fn __action115< 'input, >( input: &'input str, @@ -35286,20 +35644,20 @@ fn __action114< { let __start0 = __lookbehind.clone(); let __end0 = __lookahead.clone(); - let __temp0 = __action87( + let __temp0 = __action88( input, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action103( + __action104( input, __temp0, ) } #[allow(unused_variables)] -fn __action115< +fn __action116< 'input, >( input: &'input str, @@ -35309,12 +35667,12 @@ fn __action115< { let __start0 = __1.0.clone(); let __end0 = __1.2.clone(); - let __temp0 = __action86( + let __temp0 = __action87( input, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action104( + __action105( input, __0, __temp0, @@ -35322,7 +35680,7 @@ fn __action115< } #[allow(unused_variables)] -fn __action116< +fn __action117< 'input, >( input: &'input str, @@ -35331,13 +35689,13 @@ fn __action116< { let __start0 = __0.2.clone(); let __end0 = __0.2.clone(); - let __temp0 = __action87( + let __temp0 = __action88( input, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action104( + __action105( input, __0, __temp0, @@ -35345,7 +35703,7 @@ fn __action116< } #[allow(unused_variables)] -fn __action117< +fn __action118< 'input, >( input: &'input str, @@ -35354,19 +35712,19 @@ fn __action117< { let __start0 = __0.0.clone(); let __end0 = __0.2.clone(); - let __temp0 = __action81( + let __temp0 = __action82( input, __0, ); let __temp0 = (__start0, __temp0, __end0); - __action107( + __action108( input, __temp0, ) } #[allow(unused_variables)] -fn __action118< +fn __action119< 'input, >( input: &'input str, @@ -35376,20 +35734,20 @@ fn __action118< { let __start0 = __lookbehind.clone(); let __end0 = __lookahead.clone(); - let __temp0 = __action82( + let __temp0 = __action83( input, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action107( + __action108( input, __temp0, ) } #[allow(unused_variables)] -fn __action119< +fn __action120< 'input, >( input: &'input str, @@ -35399,12 +35757,12 @@ fn __action119< { let __start0 = __1.0.clone(); let __end0 = __1.2.clone(); - let __temp0 = __action81( + let __temp0 = __action82( input, __1, ); let __temp0 = (__start0, __temp0, __end0); - __action108( + __action109( input, __0, __temp0, @@ -35412,7 +35770,7 @@ fn __action119< } #[allow(unused_variables)] -fn __action120< +fn __action121< 'input, >( input: &'input str, @@ -35421,13 +35779,13 @@ fn __action120< { let __start0 = __0.2.clone(); let __end0 = __0.2.clone(); - let __temp0 = __action82( + let __temp0 = __action83( input, &__start0, &__end0, ); let __temp0 = (__start0, __temp0, __end0); - __action108( + __action109( input, __0, __temp0, diff --git a/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle b/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle new file mode 100644 index 000000000000..38195d0ae57e --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle @@ -0,0 +1,72 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst (enum)) + +(type ALUOp + (enum + (SDiv) +)) + +(type ImmExtend + (enum + ;; (Sign) + (Zero))) + +(decl alu_rrr (ALUOp Type Reg Reg) Reg) +(extern constructor alu_rrr alu_rrr) + +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (= (sdiv (x) (y)) (ret)), +;;@ (= (ty) (64i0: isleType)) +;;@ )) +(decl a64_sdiv (Type Reg Reg) Reg) +(rule (a64_sdiv ty x y) (alu_rrr (ALUOp.SDiv) ty x y)) + +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (64) (x)) (ret)))) +(decl imm (Type ImmExtend u64) Reg) +(extern constructor imm imm) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i0: isleType) (ret)))) +(decl ImmExtend.Sign () ImmExtend) +(extern constructor ImmExtend.Sign ImmExtend.Sign) + +;; Place a `Value` into a register, sign extending it to 64-bits +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (64) (x)) (ret)))) +(decl put_in_reg_sext64 (Value) Reg) +(extern constructor put_in_reg_sext64 put_in_reg_sext64) +;; (rule 1 (put_in_reg_sext64 val @ (value_type (fits_in_32 ty))) +;; (extend val $true (ty_bits ty) 64)) + +;; Helper for placing a `Value` into a `Reg` and validating that it's nonzero. +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (64) (x)) (ret)), +;;@ (! (= (0i64:bv) (ret))))) +(decl put_nonzero_in_reg_sext64 (Value) Reg) +(extern constructor put_nonzero_in_reg_sext64 put_nonzero_in_reg_sext64) +;; (rule -1 (put_nonzero_in_reg_sext64 val) +;; (trap_if_zero_divisor (put_in_reg_sext64 val))) + +;; Helper for extracting an immediate that's not 0 and not -1 from an imm64. +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (64) (x)) (ret)), +;;@ (! (= (0i64:bv) (ret))), +;;@ (! (= (-1i64:bv) (ret))) +;;@ )) +(decl safe_divisor_from_imm64 (u64) Imm64) +(extern extractor safe_divisor_from_imm64 safe_divisor_from_imm64) + +;; Note that this has a special case where if the `Value` is a constant that's +;; not zero we can skip the zero check. +;;(rule (put_nonzero_in_reg_sext64 (and (value_type ty) +;; (iconst (nonzero_u64_from_imm64 n)))) +;; (imm ty (ImmExtend.Sign) n)) + +;; Special case for `sdiv` where no checks are needed due to division by a +;; constant meaning the checks are always passed. +(rule 1 (lower (has_type (fits_in_64 ty) (sdiv x (iconst (safe_divisor_from_imm64 y))))) + (a64_sdiv $I64 (put_in_reg_sext64 x) (imm ty (ImmExtend.Sign) y))) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv32.isle b/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv32.isle new file mode 100644 index 000000000000..c6f3a23a1f4f --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv32.isle @@ -0,0 +1,91 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst (enum)) + +(type ALUOp + (enum + (SDiv) +)) + +(decl alu_rrr (ALUOp Type Reg Reg) Reg) +(extern constructor alu_rrr alu_rrr) + +;; Place a `Value` into a register, sign extending it to 64-bits +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (64) (x)) (ret)))) +(decl put_in_reg_sext64 (Value) Reg) +(extern constructor put_in_reg_sext64 put_in_reg_sext64) +;; (rule 1 (put_in_reg_sext64 val @ (value_type (fits_in_32 ty))) +;; (extend val $true (ty_bits ty) 64)) +;; + +;; Helper for placing a `Value` into a `Reg` and validating that it's nonzero. +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (64) (x)) (ret)), +;;@ (! (= (0i64:bv) (ret))))) +(decl put_nonzero_in_reg_sext64 (Value) Reg) +(extern constructor put_nonzero_in_reg_sext64 put_nonzero_in_reg_sext64) + +;; (rule -1 (put_nonzero_in_reg_sext64 val) +;; (trap_if_zero_divisor (put_in_reg_sext64 val))) +;; +;; Note that this has a special case where if the `Value` is a constant that's +;; not zero we can skip the zero check. +;;(rule (put_nonzero_in_reg_sext64 (and (value_type ty) +;; (iconst (nonzero_u64_from_imm64 n)))) +;; (imm ty (ImmExtend.Sign) n)) +;; Note that this has a special case where if the `Value` is a constant that's +;; not zero we can skip the zero check. +;;(rule (put_nonzero_in_reg_sext64 (and (value_type ty) +;; (iconst (nonzero_u64_from_imm64 n)))) +;; (imm ty (ImmExtend.Sign) n)) + +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (= (sdiv (x) (y)) (ret)), +;;@ (= (ty) (64i0: isleType)) +;;@ )) +(decl a64_sdiv (Type Reg Reg) Reg) +(rule (a64_sdiv ty x y) (alu_rrr (ALUOp.SDiv) ty x y)) + +;; Check for signed overflow. The only case is min_value / -1. +;; The following checks must be done in 32-bit or 64-bit, depending +;; on the input type. +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (= (x) (ret)), +;;@ (|| (= (ty) (32i0:isleType)) (= (ty) (64i0:isleType))), +;;@ (if (= (ty) (32i0:isleType)) { +;;@ (&& (! (= (0i32:bv) (y))) +;;@ (! (= (2147483648i32:bv) (y)))) +;;@ } else { +;;@ (&& (! (= (0i64:bv) (y))) +;;@ (! (= (9223372036854775808i64:bv) (y)))) +;;@ }) +;;@ )) +(decl trap_if_div_overflow (Type Reg Reg) Reg) +(extern constructor trap_if_div_overflow trap_if_div_overflow) + +;; (rule (trap_if_div_overflow ty x y) +;; (let ( +;; ;; Check RHS is -1. +;; (_ Unit (emit (MInst.AluRRImm12 (ALUOp.AddS) (operand_size ty) (writable_zero_reg) y (u8_into_imm12 1)))) + +;; ;; Check LHS is min_value, by subtracting 1 and branching if +;; ;; there is overflow. +;; (_ Unit (emit (MInst.CCmpImm (size_from_ty ty) +;; x +;; (u8_into_uimm5 1) +;; (nzcv $false $false $false $false) +;; (Cond.Eq)))) +;; (_ Unit (emit (MInst.TrapIf (cond_br_cond (Cond.Vs)) +;; (trap_code_integer_overflow)))) +;; ) +;; x)) + +(rule (lower (has_type (fits_in_64 ty) (sdiv x y))) + (let ((x64 Reg (put_in_reg_sext64 x)) + (y64 Reg (put_nonzero_in_reg_sext64 y)) + (valid_x64 Reg (trap_if_div_overflow ty x64 y64)) + (result Reg (a64_sdiv $I64 valid_x64 y64))) + result)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/src/solver.rs b/cranelift/isle/veri/veri_engine/src/solver.rs index c704d3a3e8ca..43b4ab39d513 100644 --- a/cranelift/isle/veri/veri_engine/src/solver.rs +++ b/cranelift/isle/veri/veri_engine/src/solver.rs @@ -389,6 +389,7 @@ impl SolverCtx { match op { BinaryOp::BVMul | BinaryOp::BVUDiv + | BinaryOp::BVSDiv | BinaryOp::BVAdd | BinaryOp::BVSub | BinaryOp::BVAnd @@ -457,6 +458,7 @@ impl SolverCtx { BinaryOp::Lte => "<=", BinaryOp::BVMul => "bvmul", BinaryOp::BVUDiv => "bvudiv", + BinaryOp::BVSDiv => "bvsdiv", BinaryOp::BVAdd => "bvadd", BinaryOp::BVSub => "bvsub", BinaryOp::BVAnd => "bvand", diff --git a/cranelift/isle/veri/veri_engine/src/type_inference.rs b/cranelift/isle/veri/veri_engine/src/type_inference.rs index 1cd03d205679..1739c288bb39 100644 --- a/cranelift/isle/veri/veri_engine/src/type_inference.rs +++ b/cranelift/isle/veri/veri_engine/src/type_inference.rs @@ -398,6 +398,24 @@ fn add_annotation_constraints( t, ) } + annotation_ir::Expr::And(x, y, _) => { + let (e1, t1) = add_annotation_constraints(*x, tree, annotation_info); + let (e2, t2) = add_annotation_constraints(*y, tree, annotation_info); + let t = tree.next_type_var; + + tree.concrete_constraints + .insert(TypeExpr::Concrete(t, annotation_ir::Type::Bool)); + tree.concrete_constraints + .insert(TypeExpr::Concrete(t1, annotation_ir::Type::Bool)); + tree.concrete_constraints + .insert(TypeExpr::Concrete(t2, annotation_ir::Type::Bool)); + + tree.next_type_var += 1; + ( + veri_ir::Expr::Binary(veri_ir::BinaryOp::And, Box::new(e1), Box::new(e2)), + t, + ) + } annotation_ir::Expr::BVNeg(x, _) => { let (e1, t1) = add_annotation_constraints(*x, tree, annotation_info); @@ -415,7 +433,6 @@ fn add_annotation_constraints( t, ) } - annotation_ir::Expr::BVNot(x, _) => { let (e1, t1) = add_annotation_constraints(*x, tree, annotation_info); @@ -471,6 +488,27 @@ fn add_annotation_constraints( t, ) } + annotation_ir::Expr::BVSDiv(x, y, _) => { + let (e1, t1) = add_annotation_constraints(*x, tree, annotation_info); + let (e2, t2) = add_annotation_constraints(*y, tree, annotation_info); + let t = tree.next_type_var; + + tree.bv_constraints + .insert(TypeExpr::Concrete(t, annotation_ir::Type::BitVector)); + tree.bv_constraints + .insert(TypeExpr::Concrete(t1, annotation_ir::Type::BitVector)); + tree.bv_constraints + .insert(TypeExpr::Concrete(t2, annotation_ir::Type::BitVector)); + tree.var_constraints.insert(TypeExpr::Variable(t1, t2)); + tree.var_constraints.insert(TypeExpr::Variable(t, t1)); + tree.var_constraints.insert(TypeExpr::Variable(t, t2)); + + tree.next_type_var += 1; + ( + veri_ir::Expr::Binary(veri_ir::BinaryOp::BVSDiv, Box::new(e1), Box::new(e2)), + t, + ) + } annotation_ir::Expr::BVAdd(x, y, _) => { let (e1, t1) = add_annotation_constraints(*x, tree, annotation_info); let (e2, t2) = add_annotation_constraints(*y, tree, annotation_info); @@ -963,6 +1001,7 @@ fn add_isle_constraints( ("Value".to_owned(), annotation_ir::Type::BitVector), ("ValueRegs".to_owned(), annotation_ir::Type::BitVector), ("InstOutput".to_owned(), annotation_ir::Type::BitVector), + ("ImmExtend".to_owned(), annotation_ir::Type::Int), ]); let mut annotation_vars = vec![]; diff --git a/cranelift/isle/veri/veri_ir/src/annotation_ir.rs b/cranelift/isle/veri/veri_ir/src/annotation_ir.rs index 651ba5954df3..3f476afbb4c3 100644 --- a/cranelift/isle/veri/veri_ir/src/annotation_ir.rs +++ b/cranelift/isle/veri/veri_ir/src/annotation_ir.rs @@ -184,6 +184,7 @@ pub enum Expr { // Binary operators BVMul(Box, Box, u32), BVUDiv(Box, Box, u32), + BVSDiv(Box, Box, u32), BVAdd(Box, Box, u32), BVSub(Box, Box, u32), BVAnd(Box, Box, u32), @@ -258,6 +259,7 @@ impl Expr { | Expr::Lte(_, _, t) | Expr::BVMul(_, _, t) | Expr::BVUDiv(_, _, t) + | Expr::BVSDiv(_, _, t) | Expr::BVAdd(_, _, t) | Expr::BVSub(_, _, t) | Expr::BVAnd(_, _, t) diff --git a/cranelift/isle/veri/veri_ir/src/lib.rs b/cranelift/isle/veri/veri_ir/src/lib.rs index 89b9788d776e..f0fc164d779a 100644 --- a/cranelift/isle/veri/veri_ir/src/lib.rs +++ b/cranelift/isle/veri/veri_ir/src/lib.rs @@ -167,6 +167,7 @@ pub enum BinaryOp { // Bitvector operations BVMul, BVUDiv, + BVSDiv, BVAdd, BVSub, BVAnd, From 112cc4c12a82b168218b2926e2d8da1d6153b645 Mon Sep 17 00:00:00 2001 From: Monica pardeshi Date: Tue, 17 Jan 2023 15:34:17 -0500 Subject: [PATCH 02/11] fix trap if div overflow annotation --- cranelift/isle/veri/veri_engine/examples/sdiv/sdiv32.isle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv32.isle b/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv32.isle index c6f3a23a1f4f..ae2550604958 100644 --- a/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv32.isle +++ b/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv32.isle @@ -56,11 +56,11 @@ ;;@ (assertions (= (x) (ret)), ;;@ (|| (= (ty) (32i0:isleType)) (= (ty) (64i0:isleType))), ;;@ (if (= (ty) (32i0:isleType)) { -;;@ (&& (! (= (0i32:bv) (y))) -;;@ (! (= (2147483648i32:bv) (y)))) +;;@ (! (&& (= (0i32:bv) (y)) +;;@ (= (2147483648i32:bv) (y)))) ;;@ } else { -;;@ (&& (! (= (0i64:bv) (y))) -;;@ (! (= (9223372036854775808i64:bv) (y)))) +;;@ (! (&& (= (0i64:bv) (y)) +;;@ (= (9223372036854775808i64:bv) (y)))) ;;@ }) ;;@ )) (decl trap_if_div_overflow (Type Reg Reg) Reg) From 88cc41744fb54d90ae0a9c9f887937954ac0fc2b Mon Sep 17 00:00:00 2001 From: Monica pardeshi Date: Tue, 17 Jan 2023 23:28:00 -0500 Subject: [PATCH 03/11] fix sdiv rule --- .../examples/broken/sdiv/broken_sdiv.isle | 71 +++++++++++++++++++ .../examples/broken/sdiv/broken_sdiv32.isle | 57 +++++++++++++++ .../examples/broken/udiv/broken_udiv.isle | 36 ++++++++++ .../veri/veri_engine/examples/sdiv/sdiv.isle | 31 +++++--- cranelift/isle/veri/veri_engine/src/solver.rs | 2 +- cranelift/isle/veri/veri_engine/tests/veri.rs | 45 +++++++++++- 6 files changed, 228 insertions(+), 14 deletions(-) create mode 100644 cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv.isle create mode 100644 cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv32.isle create mode 100644 cranelift/isle/veri/veri_engine/examples/broken/udiv/broken_udiv.isle diff --git a/cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv.isle b/cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv.isle new file mode 100644 index 000000000000..cf44d8374983 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv.isle @@ -0,0 +1,71 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst (enum)) + +(type ALUOp + (enum + (UDiv) +)) + +;; Model ImmExtend as an Int, where +;; Sign == 1 and Zero == 0 +(type ImmExtend + (enum + (Zero) + ;;(Sign) +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i0: isleType) (ret)))) +(decl ImmExtend.Sign () ImmExtend) +(extern constructor ImmExtend.Sign ImmExtend.Sign) + +(decl alu_rrr (ALUOp Type Reg Reg) Reg) +(extern constructor alu_rrr alu_rrr) + +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (= (/ (x) (y)) (ret)), +;;@ (= (ty) (64i0: isleType)) +;;@ )) +(decl a64_udiv (Type Reg Reg) Reg) +(rule (a64_udiv ty x y) (alu_rrr (ALUOp.UDiv) ty x y)) + +;;@ (spec (sig (args ty, ext, x) (ret)) +;;@ (assertions (|| (= (ext) (0i0:isleType)) (= (ext) (1i0:isleType))), +;;@ (if (= (ext) (0i0:isleType)) { +;;@ (= (ret) (zero_ext (regwidth) (x))) +;;@ } else { +;;@ (= (ret) (sign_ext (regwidth) (x))) +;;@ }) +;;@ )) +(decl imm (Type ImmExtend u64) Reg) +(extern constructor imm imm) + +;; Place a `Value` into a register, sign extending it to 64-bits +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (64) (x)) (ret)))) +(decl put_in_reg_sext64 (Value) Reg) +(extern constructor put_in_reg_sext64 put_in_reg_sext64) + +;; Helper for placing a `Value` into a `Reg` and validating that it's nonzero. +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (64) (x)) (ret)), +;;@ (! (= (0i64:bv) (ret))))) +(decl put_nonzero_in_reg_sext64 (Value) Reg) +(extern constructor put_nonzero_in_reg_sext64 put_nonzero_in_reg_sext64) + +;; Helper for extracting an immediate that's not 0 and not -1 from an imm64. +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (x) (ret)), +;;@ (! (= (0i64:bv) (ret))), +;;@ (! (= (18446744073709551615i64:bv) (ret))) +;;@ )) +(decl safe_divisor_from_imm64 (u64) Imm64) +(extern extractor safe_divisor_from_imm64 safe_divisor_from_imm64) + +;; Special case for `sdiv` where no checks are needed due to division by a +;; constant meaning the checks are always passed. +(rule 1 (lower (has_type (fits_in_64 ty) (sdiv x (iconst (safe_divisor_from_imm64 y))))) + (a64_udiv $I64 (put_in_reg_sext64 x) (imm ty (ImmExtend.Sign) y))) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv32.isle b/cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv32.isle new file mode 100644 index 000000000000..46efefa953be --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv32.isle @@ -0,0 +1,57 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst (enum)) + +(type ALUOp + (enum + (SDiv) +)) + +(decl alu_rrr (ALUOp Type Reg Reg) Reg) +(extern constructor alu_rrr alu_rrr) + +;; Place a `Value` into a register, sign extending it to 64-bits +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (zero_ext (64) (x)) (ret)))) +(decl put_in_reg_sext64 (Value) Reg) +(extern constructor put_in_reg_sext64 put_in_reg_sext64) + +;; Helper for placing a `Value` into a `Reg` and validating that it's nonzero. +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (64) (x)) (ret)), +;;@ (! (= (0i64:bv) (ret))))) +(decl put_nonzero_in_reg_sext64 (Value) Reg) +(extern constructor put_nonzero_in_reg_sext64 put_nonzero_in_reg_sext64) + +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (= (sdiv (x) (y)) (ret)), +;;@ (= (ty) (64i0: isleType)) +;;@ )) +(decl a64_sdiv (Type Reg Reg) Reg) +(rule (a64_sdiv ty x y) (alu_rrr (ALUOp.SDiv) ty x y)) + +;; Check for signed overflow. The only case is min_value / -1. +;; The following checks must be done in 32-bit or 64-bit, depending +;; on the input type. +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (= (x) (ret)), +;;@ (|| (= (ty) (32i0:isleType)) (= (ty) (64i0:isleType))), +;;@ (if (= (ty) (32i0:isleType)) { +;;@ (! (&& (= (0i32:bv) (y)) +;;@ (= (2147483648i32:bv) (y)))) +;;@ } else { +;;@ (! (&& (= (0i64:bv) (y)) +;;@ (= (9223372036854775808i64:bv) (y)))) +;;@ }) +;;@ )) +(decl trap_if_div_overflow (Type Reg Reg) Reg) +(extern constructor trap_if_div_overflow trap_if_div_overflow) + +(rule (lower (has_type (fits_in_64 ty) (sdiv x y))) + (let ((x64 Reg (put_in_reg_sext64 x)) + (y64 Reg (put_nonzero_in_reg_sext64 y)) + (valid_x64 Reg (trap_if_div_overflow ty x64 y64)) + (result Reg (a64_sdiv $I64 valid_x64 y64))) + result)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/broken/udiv/broken_udiv.isle b/cranelift/isle/veri/veri_engine/examples/broken/udiv/broken_udiv.isle new file mode 100644 index 000000000000..e17fa95d1c57 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/broken/udiv/broken_udiv.isle @@ -0,0 +1,36 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst (enum)) + +(type ALUOp + (enum + (UDiv) +)) + +(decl alu_rrr (ALUOp Type Reg Reg) Reg) +(extern constructor alu_rrr alu_rrr) + +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (= (/ (x) (y)) (ret)), +;;@ (= (ty) (64i0: isleType)) +;;@ )) +(decl a64_udiv (Type Reg Reg) Reg) +(rule (a64_udiv ty x y) (alu_rrr (ALUOp.UDiv) ty x y)) + +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (zero_ext (64) (x)) (ret)), +;;@ (! (= (0i64:bv) (ret))))) +(decl put_nonzero_in_reg_zext64 (Value) Reg) +(extern constructor put_nonzero_in_reg_zext64 put_nonzero_in_reg_zext64) + +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (64) (x)) (ret)))) +(decl put_in_reg_sext64 (Value) Reg) +(extern constructor put_in_reg_sext64 put_in_reg_sext64) + +;; Note that aarch64's `udiv` doesn't trap so to respect the semantics of +;; CLIF's `udiv` the check for zero needs to be manually performed. +(rule (lower (has_type (fits_in_64 ty) (udiv x y))) + (a64_udiv $I64 (put_in_reg_sext64 x) (put_nonzero_in_reg_zext64 y))) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle b/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle index 38195d0ae57e..7c83cd87ebb5 100644 --- a/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle +++ b/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle @@ -9,10 +9,18 @@ (SDiv) )) +;; Model ImmExtend as an Int, where +;; Sign == 1 and Zero == 0 (type ImmExtend (enum - ;; (Sign) - (Zero))) + (Zero) + ;;(Sign) +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i0: isleType) (ret)))) +(decl ImmExtend.Sign () ImmExtend) +(extern constructor ImmExtend.Sign ImmExtend.Sign) (decl alu_rrr (ALUOp Type Reg Reg) Reg) (extern constructor alu_rrr alu_rrr) @@ -24,16 +32,17 @@ (decl a64_sdiv (Type Reg Reg) Reg) (rule (a64_sdiv ty x y) (alu_rrr (ALUOp.SDiv) ty x y)) -;;@ (spec (sig (args x) (ret)) -;;@ (assertions (= (sign_ext (64) (x)) (ret)))) +;;@ (spec (sig (args ty, ext, x) (ret)) +;;@ (assertions (|| (= (ext) (0i0:isleType)) (= (ext) (1i0:isleType))), +;;@ (if (= (ext) (0i0:isleType)) { +;;@ (= (ret) (zero_ext (regwidth) (x))) +;;@ } else { +;;@ (= (ret) (sign_ext (regwidth) (x))) +;;@ }) +;;@ )) (decl imm (Type ImmExtend u64) Reg) (extern constructor imm imm) -;;@ (spec (sig (args) (ret)) -;;@ (assertions (= (1i0: isleType) (ret)))) -(decl ImmExtend.Sign () ImmExtend) -(extern constructor ImmExtend.Sign ImmExtend.Sign) - ;; Place a `Value` into a register, sign extending it to 64-bits ;;@ (spec (sig (args x) (ret)) ;;@ (assertions (= (sign_ext (64) (x)) (ret)))) @@ -53,9 +62,9 @@ ;; Helper for extracting an immediate that's not 0 and not -1 from an imm64. ;;@ (spec (sig (args x) (ret)) -;;@ (assertions (= (sign_ext (64) (x)) (ret)), +;;@ (assertions (= (x) (ret)), ;;@ (! (= (0i64:bv) (ret))), -;;@ (! (= (-1i64:bv) (ret))) +;;@ (! (= (18446744073709551615i64:bv) (ret))) ;;@ )) (decl safe_divisor_from_imm64 (u64) Imm64) (extern extractor safe_divisor_from_imm64 safe_divisor_from_imm64) diff --git a/cranelift/isle/veri/veri_engine/src/solver.rs b/cranelift/isle/veri/veri_engine/src/solver.rs index 43b4ab39d513..190b25c0b099 100644 --- a/cranelift/isle/veri/veri_engine/src/solver.rs +++ b/cranelift/isle/veri/veri_engine/src/solver.rs @@ -779,7 +779,7 @@ pub fn run_solver(rule_sem: RuleSemantics, query_width: usize) -> VerificationRe } } if !query_width_used { - panic!("Query width unused, check rule!"); + //panic!("Query width unused, check rule!"); } for (_e, t) in &ctx.tyctx.tyvars { diff --git a/cranelift/isle/veri/veri_engine/tests/veri.rs b/cranelift/isle/veri/veri_engine/tests/veri.rs index 18e6c87832b1..e0f621f56644 100644 --- a/cranelift/isle/veri/veri_engine/tests/veri.rs +++ b/cranelift/isle/veri/veri_engine/tests/veri.rs @@ -4,7 +4,7 @@ use utils::{ }; use utils::{ test_from_file, test_from_file_custom_prelude, test_from_file_self_contained, - test_from_file_with_filter, test_from_files_with_lhs_termname, Bitwidth, + test_from_file_with_filter, Bitwidth, }; use veri_ir::{Counterexample, VerificationResult}; @@ -111,7 +111,48 @@ fn test_udiv() { // (Bitwidth::I16, VerificationResult::Success), // (Bitwidth::I32, VerificationResult::Success), (Bitwidth::I64, VerificationResult::Success), - ],) + ]) +} + +#[test] +fn test_broken_udiv() { + test_from_file("./examples/broken/udiv/broken_udiv.isle", + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + (Bitwidth::I16, VerificationResult::Failure(Counterexample {})), + (Bitwidth::I32, VerificationResult::Failure(Counterexample {})), + (Bitwidth::I64, VerificationResult::Success), + ]) +} + +#[test] +fn test_sdiv() { + test_from_file("./examples/sdiv/sdiv.isle", all_success_result()); + test_from_file("./examples/sdiv/sdiv32.isle", + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + // Too slow rn + // (Bitwidth::I32, VerificationResult::Success), + // (Bitwidth::I64, VerificationResult::Success), + ] + ) +} + +#[test] +fn test_broken_sdiv() { + test_from_file("./examples/broken/sdiv/broken_sdiv.isle", all_failure_result()); + test_from_file("./examples/broken/sdiv/broken_sdiv32.isle", + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + // (Bitwidth::I32, VerificationResult::Success), + // (Bitwidth::I64, VerificationResult::Success), + ] + ) } #[test] From de1dc3ec1d38bd82d2b147ea835ba81b6830f85d Mon Sep 17 00:00:00 2001 From: Alexa VanHattum Date: Wed, 18 Jan 2023 12:05:09 -0500 Subject: [PATCH 04/11] update annotations, reenable query width check --- cranelift/codegen/src/clif_lower.isle | 2 +- .../veri_engine/examples/broken/sdiv/broken_sdiv.isle | 4 ++-- .../isle/veri/veri_engine/examples/sdiv/sdiv.isle | 4 ++-- cranelift/isle/veri/veri_engine/src/solver.rs | 4 ++-- cranelift/isle/veri/veri_engine/tests/veri.rs | 10 +++++++++- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/cranelift/codegen/src/clif_lower.isle b/cranelift/codegen/src/clif_lower.isle index b3d5cb4f9713..8f22ba1c0e24 100644 --- a/cranelift/codegen/src/clif_lower.isle +++ b/cranelift/codegen/src/clif_lower.isle @@ -695,7 +695,7 @@ ) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (arg) (ret)))) +;;@ (assertions (= (zero_ext (widthof (arg)) (ret)) (arg)))) (decl iconst (Imm64) Inst) (extractor (iconst N) diff --git a/cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv.isle b/cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv.isle index cf44d8374983..8cf51782c46c 100644 --- a/cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv.isle +++ b/cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv.isle @@ -35,9 +35,9 @@ ;;@ (spec (sig (args ty, ext, x) (ret)) ;;@ (assertions (|| (= (ext) (0i0:isleType)) (= (ext) (1i0:isleType))), ;;@ (if (= (ext) (0i0:isleType)) { -;;@ (= (ret) (zero_ext (regwidth) (x))) +;;@ (= (ret) (zero_ext (regwidth) (conv_to (ty) (x)))) ;;@ } else { -;;@ (= (ret) (sign_ext (regwidth) (x))) +;;@ (= (ret) (sign_ext (regwidth) (conv_to (ty) (x)))) ;;@ }) ;;@ )) (decl imm (Type ImmExtend u64) Reg) diff --git a/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle b/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle index 7c83cd87ebb5..ac09ef454cb5 100644 --- a/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle +++ b/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle @@ -35,9 +35,9 @@ ;;@ (spec (sig (args ty, ext, x) (ret)) ;;@ (assertions (|| (= (ext) (0i0:isleType)) (= (ext) (1i0:isleType))), ;;@ (if (= (ext) (0i0:isleType)) { -;;@ (= (ret) (zero_ext (regwidth) (x))) +;;@ (= (ret) (zero_ext (regwidth) (conv_to (ty) (x)))) ;;@ } else { -;;@ (= (ret) (sign_ext (regwidth) (x))) +;;@ (= (ret) (sign_ext (regwidth) (conv_to (ty) (x)))) ;;@ }) ;;@ )) (decl imm (Type ImmExtend u64) Reg) diff --git a/cranelift/isle/veri/veri_engine/src/solver.rs b/cranelift/isle/veri/veri_engine/src/solver.rs index 190b25c0b099..d08046b2cf6c 100644 --- a/cranelift/isle/veri/veri_engine/src/solver.rs +++ b/cranelift/isle/veri/veri_engine/src/solver.rs @@ -698,7 +698,7 @@ impl SolverCtx { println!("Checking assumption feasibility"); solver.push(1).unwrap(); for a in assumptions { - // println!("{}", &a); + println!("{}", &a); solver.assert(a).unwrap(); // Uncomment to debug specific asserts @@ -779,7 +779,7 @@ pub fn run_solver(rule_sem: RuleSemantics, query_width: usize) -> VerificationRe } } if !query_width_used { - //panic!("Query width unused, check rule!"); + panic!("Query width unused, check rule!"); } for (_e, t) in &ctx.tyctx.tyvars { diff --git a/cranelift/isle/veri/veri_engine/tests/veri.rs b/cranelift/isle/veri/veri_engine/tests/veri.rs index e0f621f56644..782cc719eb2e 100644 --- a/cranelift/isle/veri/veri_engine/tests/veri.rs +++ b/cranelift/isle/veri/veri_engine/tests/veri.rs @@ -128,7 +128,15 @@ fn test_broken_udiv() { #[test] fn test_sdiv() { - test_from_file("./examples/sdiv/sdiv.isle", all_success_result()); + test_from_file("./examples/sdiv/sdiv.isle", + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + // Too slow rn + // (Bitwidth::I16, VerificationResult::Success), + // (Bitwidth::I32, VerificationResult::Success), + // (Bitwidth::I64, VerificationResult::Success), + ]); test_from_file("./examples/sdiv/sdiv32.isle", vec![ (Bitwidth::I1, VerificationResult::InapplicableRule), From bac5332354168b5ba7f57319b0386af05df15435 Mon Sep 17 00:00:00 2001 From: Alexa VanHattum Date: Tue, 31 Jan 2023 13:52:52 -0500 Subject: [PATCH 05/11] merge --- .github/workflows/veri.yml | 2 +- Cargo.lock | 61 +- cranelift/isle/veri/encodings/README.md | 15 + cranelift/isle/veri/encodings/a64cls32.smt2 | 118 + cranelift/isle/veri/encodings/a64clz32.smt2 | 59 + cranelift/isle/veri/encodings/cls.c | 83 + cranelift/isle/veri/encodings/cls1.smt2 | 2 + cranelift/isle/veri/encodings/cls16.smt2 | 105 + cranelift/isle/veri/encodings/cls32.smt2 | 123 + cranelift/isle/veri/encodings/cls64.smt2 | 141 + cranelift/isle/veri/encodings/cls8.smt2 | 87 + cranelift/isle/veri/encodings/clz1.smt2 | 2 + cranelift/isle/veri/encodings/clz16.smt2 | 43 + cranelift/isle/veri/encodings/clz32.smt2 | 52 + cranelift/isle/veri/encodings/clz64.smt2 | 61 + cranelift/isle/veri/encodings/clz8.smt2 | 34 + cranelift/isle/veri/encodings/convert.py | 136 + cranelift/isle/veri/encodings/rbit32.smt2 | 17 + cranelift/isle/veri/encodings/rev1.smt2 | 2 + cranelift/isle/veri/encodings/rev16.smt2 | 11 + cranelift/isle/veri/encodings/rev32.smt2 | 14 + cranelift/isle/veri/encodings/rev64.smt2 | 17 + cranelift/isle/veri/encodings/rev8.smt2 | 8 + cranelift/isle/veri/veri_engine/Cargo.toml | 5 +- .../veri_engine/examples/band/64_band.isle | 12 +- .../examples/band/fits_in_32_band.isle | 12 +- .../veri/veri_engine/examples/bor/64_bor.isle | 12 +- .../examples/bor/fits_in_32_bor.isle | 12 +- .../broken_fits_in_16_rotl_to_rotr.isle | 12 +- ...oken_fits_in_16_with_imm_rotl_to_rotr.isle | 14 +- .../broken/broken_fits_in_32_band.isle | 11 +- .../broken/broken_fits_in_32_bor.isle | 13 +- .../broken/broken_mask_small_rotr.isle | 12 +- .../broken/broken_rule_or_small_rotr.isle | 12 +- .../examples/broken/cls/broken_cls16.isle | 12 +- .../examples/broken/cls/broken_cls8.isle | 12 +- .../examples/broken/clz/broken_clz16.isle | 12 +- .../examples/broken/clz/broken_clz8.isle | 12 +- .../examples/broken/iadd/broken_imm12.isle | 44 + .../examples/broken/iadd/broken_imm12_2.isle | 45 + .../examples/broken/iadd/broken_imm12neg.isle | 44 + .../broken/iadd/broken_imm12neg2.isle | 44 + .../broken/isub/broken_base_case.isle | 18 +- .../examples/broken/isub/broken_imm12.isle | 44 + .../examples/broken/isub/broken_imm12neg.isle | 44 + .../examples/broken/isub/broken_shift.isle | 58 + .../veri_engine/examples/bxor/64_bxor.isle | 12 +- .../examples/bxor/fits_in_32_bxor.isle | 12 +- .../veri/veri_engine/examples/cls/cls16.isle | 12 +- .../veri/veri_engine/examples/cls/cls8.isle | 12 +- .../veri/veri_engine/examples/clz/clz16.isle | 12 +- .../veri/veri_engine/examples/clz/clz8.isle | 12 +- .../veri/veri_engine/examples/iadd/imm12.isle | 44 + .../veri_engine/examples/iadd/imm12_2.isle | 45 + .../examples/iadd/imm12_2_TODO.isle | 54 - .../veri_engine/examples/iadd/imm12_TODO.isle | 46 - .../veri_engine/examples/iadd/imm12neg.isle | 44 + .../veri_engine/examples/iadd/imm12neg2.isle | 44 + .../examples/iadd/imm12negated2_TODO.isle | 48 - .../examples/iadd/imm12negated_TODO.isle | 48 - .../veri/veri_engine/examples/imul/imul.isle | 28 +- .../veri_engine/examples/isub/base_case.isle | 20 +- .../veri/veri_engine/examples/isub/imm12.isle | 45 +- .../veri_engine/examples/isub/imm12neg.isle | 59 +- .../veri/veri_engine/examples/isub/isub.isle | 10 +- .../veri/veri_engine/examples/isub/shift.isle | 58 + .../rotl/32_with_imm_rotl_to_rotr.isle | 2 +- .../rotl/64_with_imm_rotl_to_rotr.isle | 4 +- .../rotl/fits_in_16_rotl_to_rotr.isle | 12 +- .../fits_in_16_with_imm_rotl_to_rotr.isle | 14 +- .../examples/rotr/32_with_imm_rotr.isle | 2 +- .../examples/rotr/64_with_imm_rotr.isle | 2 +- .../rotr/fits_in_16_with_imm_rotr.isle | 2 +- .../examples/rotr/small_rotr_to_shifts.isle | 12 +- cranelift/isle/veri/veri_engine/src/main.rs | 2 + .../isle/veri/veri_engine/src/rule_tree.rs | 4 +- cranelift/isle/veri/veri_engine/src/solver.rs | 694 ++- .../veri_engine/src/solver/encoded_ops/cls.rs | 5403 +++++++++++++---- .../veri_engine/src/solver/encoded_ops/clz.rs | 2078 +++++-- .../veri_engine/src/solver/encoded_ops/mod.rs | 367 ++ .../veri_engine/src/solver/encoded_ops/rev.rs | 668 +- .../veri/veri_engine/src/type_inference.rs | 27 +- .../isle/veri/veri_engine/tests/utils/mod.rs | 51 +- cranelift/isle/veri/veri_engine/tests/veri.rs | 1470 +++-- 84 files changed, 10019 insertions(+), 3169 deletions(-) create mode 100644 cranelift/isle/veri/encodings/README.md create mode 100644 cranelift/isle/veri/encodings/a64cls32.smt2 create mode 100644 cranelift/isle/veri/encodings/a64clz32.smt2 create mode 100644 cranelift/isle/veri/encodings/cls.c create mode 100644 cranelift/isle/veri/encodings/cls1.smt2 create mode 100644 cranelift/isle/veri/encodings/cls16.smt2 create mode 100644 cranelift/isle/veri/encodings/cls32.smt2 create mode 100644 cranelift/isle/veri/encodings/cls64.smt2 create mode 100644 cranelift/isle/veri/encodings/cls8.smt2 create mode 100644 cranelift/isle/veri/encodings/clz1.smt2 create mode 100644 cranelift/isle/veri/encodings/clz16.smt2 create mode 100644 cranelift/isle/veri/encodings/clz32.smt2 create mode 100644 cranelift/isle/veri/encodings/clz64.smt2 create mode 100644 cranelift/isle/veri/encodings/clz8.smt2 create mode 100644 cranelift/isle/veri/encodings/convert.py create mode 100644 cranelift/isle/veri/encodings/rbit32.smt2 create mode 100644 cranelift/isle/veri/encodings/rev1.smt2 create mode 100644 cranelift/isle/veri/encodings/rev16.smt2 create mode 100644 cranelift/isle/veri/encodings/rev32.smt2 create mode 100644 cranelift/isle/veri/encodings/rev64.smt2 create mode 100644 cranelift/isle/veri/encodings/rev8.smt2 create mode 100644 cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12.isle create mode 100644 cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12_2.isle create mode 100644 cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12neg.isle create mode 100644 cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12neg2.isle create mode 100644 cranelift/isle/veri/veri_engine/examples/broken/isub/broken_imm12.isle create mode 100644 cranelift/isle/veri/veri_engine/examples/broken/isub/broken_imm12neg.isle create mode 100644 cranelift/isle/veri/veri_engine/examples/broken/isub/broken_shift.isle create mode 100644 cranelift/isle/veri/veri_engine/examples/iadd/imm12.isle create mode 100644 cranelift/isle/veri/veri_engine/examples/iadd/imm12_2.isle delete mode 100644 cranelift/isle/veri/veri_engine/examples/iadd/imm12_2_TODO.isle delete mode 100644 cranelift/isle/veri/veri_engine/examples/iadd/imm12_TODO.isle create mode 100644 cranelift/isle/veri/veri_engine/examples/iadd/imm12neg.isle create mode 100644 cranelift/isle/veri/veri_engine/examples/iadd/imm12neg2.isle delete mode 100644 cranelift/isle/veri/veri_engine/examples/iadd/imm12negated2_TODO.isle delete mode 100644 cranelift/isle/veri/veri_engine/examples/iadd/imm12negated_TODO.isle create mode 100644 cranelift/isle/veri/veri_engine/examples/isub/shift.isle diff --git a/.github/workflows/veri.yml b/.github/workflows/veri.yml index a8ccef188456..49b3d04b5203 100644 --- a/.github/workflows/veri.yml +++ b/.github/workflows/veri.yml @@ -35,4 +35,4 @@ jobs: run: cargo build --verbose -p veri_ir -p veri_engine -p veri_annotation - name: Test # Single thread because Z3 is a memory hog - run: cargo test -j 1 --verbose -p veri_ir -p veri_engine -p veri_annotation + run: cargo test --verbose -p veri_ir -p veri_engine -p veri_annotation -- --test-threads 1 diff --git a/Cargo.lock b/Cargo.lock index b087b5d9aff9..323302621370 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1078,6 +1078,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "453440c271cf5577fd2a40e4942540cb7d0d2f85e27c8d07dd0023c925a67541" +[[package]] +name = "easy-smt" +version = "0.1.0" +source = "git+https://github.com/elliottt/easy-smt.git#14b0c2f03465f8c07768b59e7c5d128290c9bad3" +dependencies = [ + "log", + "unicode-segmentation", +] + [[package]] name = "ecdsa" version = "0.12.4" @@ -1199,6 +1208,19 @@ dependencies = [ "termcolor", ] +[[package]] +name = "env_logger" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +dependencies = [ + "humantime 2.1.0", + "is-terminal", + "log", + "regex", + "termcolor", +] + [[package]] name = "errno" version = "0.2.8" @@ -1220,16 +1242,6 @@ dependencies = [ "libc", ] -[[package]] -name = "error-chain" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" -dependencies = [ - "backtrace", - "version_check", -] - [[package]] name = "example-fib-debug-wasm" version = "0.0.0" @@ -2596,6 +2608,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "retry" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9166d72162de3575f950507683fac47e30f6f2c3836b71b7fbc61aa517c9c5f4" +dependencies = [ + "rand 0.8.5", +] + [[package]] name = "rsa" version = "0.5.0" @@ -2617,15 +2638,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rsmt2" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4affc8a99241732d2e214728974bd002bf3aa1d114760cf5c3ac6c1fd5650c7d" -dependencies = [ - "error-chain", -] - [[package]] name = "rustc-demangle" version = "0.1.21" @@ -3219,6 +3231,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" + [[package]] name = "unicode-width" version = "0.1.9" @@ -3296,8 +3314,11 @@ version = "0.1.0" dependencies = [ "clap 3.2.8", "cranelift-isle", + "easy-smt", + "env_logger 0.10.0", "itertools", - "rsmt2", + "log", + "retry", "strum", "strum_macros", "veri_annotation", diff --git a/cranelift/isle/veri/encodings/README.md b/cranelift/isle/veri/encodings/README.md new file mode 100644 index 000000000000..e49bac56936e --- /dev/null +++ b/cranelift/isle/veri/encodings/README.md @@ -0,0 +1,15 @@ +Encodings Generation +==================== + +This directory contains some templatized SMT-LIBv2 code that encodes some operations we need in the verifier. +The way this works is that the `*.smt2` file contains something close to usable SMT-LIBv2 code that can be developed independently, modulo some Rust template expressions like `{this}`. +Then, `convert.py` translates these files into Rust code that can *generate* these S-expressions for the `easy-smt` library. + +Using this code is not yet a fully automated process. +If you make changes to an encoding, do this: + +* Run `python3 convert.py rev8.smt2 | pbcopy` or similar to copy the new Rust code. +* Find the appropriate Rust function in `veri_engine/src/solver/encoded_ops`. + Delete the old stanza of generated code and replace it with your new code. +* Be careful to preserve the extraction and padding expressions at the top and bottom of the function, respectively. + Adjust them to match the variable names from the generated code, if necessary. diff --git a/cranelift/isle/veri/encodings/a64cls32.smt2 b/cranelift/isle/veri/encodings/a64cls32.smt2 new file mode 100644 index 000000000000..aaca7897b55f --- /dev/null +++ b/cranelift/isle/veri/encodings/a64cls32.smt2 @@ -0,0 +1,118 @@ +; extract to ensure we have a 32 bit input +(declare-fun a64x_{id} () (_ BitVec 32)) +(assert (= a64x_{id} ((_ extract 31 0) {x}))) + +; total zeros counter +(declare-fun zret0_{id} () (_ BitVec 64)) +(assert (= zret0_{id} (_ bv0 64))) + +; round 1 +(declare-fun zret2_{id} () (_ BitVec 64)) +(declare-fun zy16_{id} () (_ BitVec 32)) +(declare-fun zx16_{id} () (_ BitVec 32)) + +(assert (= zy16_{id} (bvlshr a64x_{id} #x00000010))) +(assert (ite (not (= zy16_{id} (_ bv0 32))) (= zret2_{id} zret0_{id}) (= zret2_{id} (bvadd zret0_{id} (_ bv16 64))))) +(assert (ite (not (= zy16_{id} (_ bv0 32))) (= zx16_{id} zy16_{id}) (= zx16_{id} a64x_{id}))) + +; round 2 +(declare-fun zret3_{id} () (_ BitVec 64)) +(declare-fun zy8_{id} () (_ BitVec 32)) +(declare-fun zx8_{id} () (_ BitVec 32)) + +(assert (= zy8_{id} (bvlshr zx16_{id} #x00000008))) +(assert (ite (not (= zy8_{id} (_ bv0 32))) (= zret3_{id} zret2_{id}) (= zret3_{id} (bvadd zret2_{id} (_ bv8 64))))) +(assert (ite (not (= zy8_{id} (_ bv0 32))) (= zx8_{id} zy8_{id}) (= zx8_{id} zx16_{id}))) + +; round 3 +(declare-fun zret4_{id} () (_ BitVec 64)) +(declare-fun zy4_{id} () (_ BitVec 32)) +(declare-fun zx4_{id} () (_ BitVec 32)) + +(assert (= zy4_{id} (bvlshr zx8_{id} #x00000004))) +(assert (ite (not (= zy4_{id} (_ bv0 32))) (= zret4_{id} zret3_{id}) (= zret4_{id} (bvadd zret3_{id} (_ bv4 64))))) +(assert (ite (not (= zy4_{id} (_ bv0 32))) (= zx4_{id} zy4_{id}) (= zx4_{id} zx8_{id}))) + +; round 4 +(declare-fun zret5_{id} () (_ BitVec 64)) +(declare-fun zy2_{id} () (_ BitVec 32)) +(declare-fun zx2_{id} () (_ BitVec 32)) + +(assert (= zy2_{id} (bvlshr zx4_{id} #x00000002))) +(assert (ite (not (= zy2_{id} (_ bv0 32))) (= zret5_{id} zret4_{id}) (= zret5_{id} (bvadd zret4_{id} (_ bv2 64))))) +(assert (ite (not (= zy2_{id} (_ bv0 32))) (= zx2_{id} zy2_{id}) (= zx2_{id} zx4_{id}))) + +; round 5 +(declare-fun zret6_{id} () (_ BitVec 64)) +(declare-fun zy1_{id} () (_ BitVec 32)) +(declare-fun zx1_{id} () (_ BitVec 32)) + +(assert (= zy1_{id} (bvlshr zx2_{id} #x00000001))) +(assert (ite (not (= zy1_{id} (_ bv0 32))) (= zret6_{id} zret5_{id}) (= zret6_{id} (bvadd zret5_{id} (_ bv1 64))))) +(assert (ite (not (= zy1_{id} (_ bv0 32))) (= zx1_{id} zy1_{id}) (= zx1_{id} zx2_{id}))) + +; last round +(declare-fun zret7_{id} () (_ BitVec 64)) +(assert (ite (not (= zx1_{id} (_ bv0 32))) (= zret7_{id} zret6_{id}) (= zret7_{id} (bvadd zret6_{id} (_ bv1 64))))) + +(declare-fun clzret_{id} () (_ BitVec 64)) +(assert (ite (= zret7_{id} (_ bv0 64)) (= clzret_{id} zret7_{id}) (= clzret_{id} (bvsub zret7_{id} (_ bv1 64))))) + +; total zeros counter +(declare-fun sret0_{id} () (_ BitVec 64)) +(assert (= sret0_{id} (_ bv0 64))) + +; round 1 +(declare-fun sret2_{id} () (_ BitVec 64)) +(declare-fun sy16_{id} () (_ BitVec 32)) +(declare-fun sx16_{id} () (_ BitVec 32)) + +(assert (= sy16_{id} (bvashr a64x_{id} #x00000010))) +(assert (ite (not (= sy16_{id} (_ bv4294967295 32))) (= sret2_{id} sret0_{id}) (= sret2_{id} (bvadd sret0_{id} (_ bv16 64))))) +(assert (ite (not (= sy16_{id} (_ bv4294967295 32))) (= sx16_{id} sy16_{id}) (= sx16_{id} a64x_{id}))) + +; round 2 +(declare-fun sret3_{id} () (_ BitVec 64)) +(declare-fun sy8_{id} () (_ BitVec 32)) +(declare-fun sx8_{id} () (_ BitVec 32)) + +(assert (= sy8_{id} (bvashr sx16_{id} #x00000008))) +(assert (ite (not (= sy8_{id} (_ bv4294967295 32))) (= sret3_{id} sret2_{id}) (= sret3_{id} (bvadd sret2_{id} (_ bv8 64))))) +(assert (ite (not (= sy8_{id} (_ bv4294967295 32))) (= sx8_{id} sy8_{id}) (= sx8_{id} sx16_{id}))) + +; round 3 +(declare-fun sret4_{id} () (_ BitVec 64)) +(declare-fun sy4_{id} () (_ BitVec 32)) +(declare-fun sx4_{id} () (_ BitVec 32)) + +(assert (= sy4_{id} (bvashr sx8_{id} #x00000004))) +(assert (ite (not (= sy4_{id} (_ bv4294967295 32))) (= sret4_{id} sret3_{id}) (= sret4_{id} (bvadd sret3_{id} (_ bv4 64))))) +(assert (ite (not (= sy4_{id} (_ bv4294967295 32))) (= sx4_{id} sy4_{id}) (= sx4_{id} sx8_{id}))) + +; round 4 +(declare-fun sret5_{id} () (_ BitVec 64)) +(declare-fun sy2_{id} () (_ BitVec 32)) +(declare-fun sx2_{id} () (_ BitVec 32)) + +(assert (= sy2_{id} (bvashr sx4_{id} #x00000002))) +(assert (ite (not (= sy2_{id} (_ bv4294967295 32))) (= sret5_{id} sret4_{id}) (= sret5_{id} (bvadd sret4_{id} (_ bv2 64))))) +(assert (ite (not (= sy2_{id} (_ bv4294967295 32))) (= sx2_{id} sy2_{id}) (= sx2_{id} sx4_{id}))) + +; round 5 +(declare-fun sret6_{id} () (_ BitVec 64)) +(declare-fun sy1_{id} () (_ BitVec 32)) +(declare-fun sx1_{id} () (_ BitVec 32)) + +(assert (= sy1_{id} (bvashr sx2_{id} #x00000001))) +(assert (ite (not (= sy1_{id} (_ bv4294967295 32))) (= sret6_{id} sret5_{id}) (= sret6_{id} (bvadd sret5_{id} (_ bv1 64))))) +(assert (ite (not (= sy1_{id} (_ bv4294967295 32))) (= sx1_{id} sy1_{id}) (= sx1_{id} sx2_{id}))) + +; last round +(declare-fun sret7_{id} () (_ BitVec 64)) +(assert (ite (not (= sx1_{id} (_ bv4294967295 32))) (= sret7_{id} sret6_{id}) (= sret7_{id} (bvadd sret6_{id} (_ bv1 64))))) + +(declare-fun clsret_{id} () (_ BitVec 64)) +(assert (ite (= sret7_{id} (_ bv0 64)) (= clsret_{id} sret7_{id}) (= clsret_{id} (bvsub sret7_{id} (_ bv1 64))))) + +(declare-fun a64cls32ret_{id} () (_ BitVec 64)) +(assert (ite (bvsle (_ bv0 32) a64x_{id}) (= a64cls32ret_{id} clzret_{id}) (= a64cls32ret_{id} clsret_{id}))) diff --git a/cranelift/isle/veri/encodings/a64clz32.smt2 b/cranelift/isle/veri/encodings/a64clz32.smt2 new file mode 100644 index 000000000000..ce1ffd3cfbc5 --- /dev/null +++ b/cranelift/isle/veri/encodings/a64clz32.smt2 @@ -0,0 +1,59 @@ +; extract to ensure we have a 32 bit input +(declare-fun a64x_{id} () (_ BitVec 32)) +(assert (= a64x_{id} ((_ extract 31 0) {x}))) + +; total zeros counter +(declare-fun ret0_{id} () (_ BitVec 64)) +(assert (= ret0_{id} (_ bv0 64))) + +; round 1 +(declare-fun ret2_{id} () (_ BitVec 64)) +(declare-fun y16_{id} () (_ BitVec 32)) +(declare-fun x16_{id} () (_ BitVec 32)) + +(assert (= y16_{id} (bvlshr a64x_{id} #x00000010))) +(assert (ite (not (= y16_{id} (_ bv0 32))) (= ret2_{id} ret0_{id}) (= ret2_{id} (bvadd ret0_{id} (_ bv16 64))))) +(assert (ite (not (= y16_{id} (_ bv0 32))) (= x16_{id} y16_{id}) (= x16_{id} a64x_{id}))) + +; round 2 +(declare-fun ret3_{id} () (_ BitVec 64)) +(declare-fun y8_{id} () (_ BitVec 32)) +(declare-fun x8_{id} () (_ BitVec 32)) + +(assert (= y8_{id} (bvlshr x16_{id} #x00000008))) +(assert (ite (not (= y8_{id} (_ bv0 32))) (= ret3_{id} ret2_{id}) (= ret3_{id} (bvadd ret2_{id} (_ bv8 64))))) +(assert (ite (not (= y8_{id} (_ bv0 32))) (= x8_{id} y8_{id}) (= x8_{id} x16_{id}))) + +; round 3 +(declare-fun ret4_{id} () (_ BitVec 64)) +(declare-fun y4_{id} () (_ BitVec 32)) +(declare-fun x4_{id} () (_ BitVec 32)) + +(assert (= y4_{id} (bvlshr x8_{id} #x00000004))) +(assert (ite (not (= y4_{id} (_ bv0 32))) (= ret4_{id} ret3_{id}) (= ret4_{id} (bvadd ret3_{id} (_ bv4 64))))) +(assert (ite (not (= y4_{id} (_ bv0 32))) (= x4_{id} y4_{id}) (= x4_{id} x8_{id}))) + +; round 4 +(declare-fun ret5_{id} () (_ BitVec 64)) +(declare-fun y2_{id} () (_ BitVec 32)) +(declare-fun x2_{id} () (_ BitVec 32)) + +(assert (= y2_{id} (bvlshr x4_{id} #x00000002))) +(assert (ite (not (= y2_{id} (_ bv0 32))) (= ret5_{id} ret4_{id}) (= ret5_{id} (bvadd ret4_{id} (_ bv2 64))))) +(assert (ite (not (= y2_{id} (_ bv0 32))) (= x2_{id} y2_{id}) (= x2_{id} x4_{id}))) + +; round 5 +(declare-fun ret6_{id} () (_ BitVec 64)) +(declare-fun y1_{id} () (_ BitVec 32)) +(declare-fun x1_{id} () (_ BitVec 32)) + +(assert (= y1_{id} (bvlshr x2_{id} #x00000001))) +(assert (ite (not (= y1_{id} (_ bv0 32))) (= ret6_{id} ret5_{id}) (= ret6_{id} (bvadd ret5_{id} (_ bv1 64))))) +(assert (ite (not (= y1_{id} (_ bv0 32))) (= x1_{id} y1_{id}) (= x1_{id} x2_{id}))) + +; last round +(declare-fun ret7_{id} () (_ BitVec 64)) +(assert (ite (not (= x1_{id} (_ bv0 32))) (= ret7_{id} ret6_{id}) (= ret7_{id} (bvadd ret6_{id} (_ bv1 64))))) + +(declare-fun clret_{id} () (_ BitVec 64)) +(assert (ite (= ret7_{id} (_ bv0 64)) (= clret_{id} ret7_{id}) (= clret_{id} (bvsub ret7_{id} (_ bv1 64))))) diff --git a/cranelift/isle/veri/encodings/cls.c b/cranelift/isle/veri/encodings/cls.c new file mode 100644 index 000000000000..3da0899c4aca --- /dev/null +++ b/cranelift/isle/veri/encodings/cls.c @@ -0,0 +1,83 @@ +#include +#include + +uint8_t clz(int64_t x); +uint8_t cls(int64_t x); + +uint8_t clz(int64_t x) { + int64_t y; + uint8_t num_zeros = 0; + + y = x >> 32; + if (y != 0) x = y; else num_zeros += 32; + + y = x >> 16; + if (y != 0) x = y; else num_zeros += 16; + + y = x >> 8; + if (y != 0) x = y; else num_zeros += 8; + + y = x >> 4; + if (y != 0) x = y; else num_zeros += 4; + + y = x >> 2; + if (y != 0) x = y; else num_zeros += 2; + + y = x >> 1; + if (y != 0) x = y; else num_zeros += 1; + + if (x == 0) num_zeros += 1; + + return num_zeros; +} + +uint8_t cls(int64_t x) { + uint8_t sign_bits = 0; + + if (x >= 0) { + if (0 <= x) + sign_bits = clz(x); + return sign_bits == 0 ? sign_bits : sign_bits - 1; + } + + int64_t y; + + y = x >> 32; + if (y != -1) x = y; else sign_bits += 32; + + y = x >> 16; + if (y != -1) x = y; else sign_bits += 16; + + y = x >> 8; + if (y != -1) x = y; else sign_bits += 8; + + y = x >> 4; + if (y != -1) x = y; else sign_bits += 4; + + y = x >> 2; + if (y != -1) x = y; else sign_bits += 2; + + y = x >> 1; + if (y != -1) x = y; else sign_bits += 1; + + if (x == -1) sign_bits += 1; + + return sign_bits == 0 ? sign_bits : sign_bits - 1; +} + +int main() +{ + printf("cls(0) = %d\n", cls(0)); + for (uint64_t i = 0; i < 64; i++) { + printf("cls(%#llx) = %d\n", 1ULL << i, cls(1ULL << i)); + } + + printf("\n"); + + printf("cls(-1) = %d\n", cls(-1)); + for (int i = 0; i < 64; i++) { + printf("cls(%#llx) = %d\n", ~(1ULL << i), cls(~(1ULL << i))); + } + + return 0; +} \ No newline at end of file diff --git a/cranelift/isle/veri/encodings/cls1.smt2 b/cranelift/isle/veri/encodings/cls1.smt2 new file mode 100644 index 000000000000..0919b6403e79 --- /dev/null +++ b/cranelift/isle/veri/encodings/cls1.smt2 @@ -0,0 +1,2 @@ +(declare-fun cls1ret_{id} () (_ BitVec 1)) +(assert (= cls1ret_{id} (_ bv0 1))) diff --git a/cranelift/isle/veri/encodings/cls16.smt2 b/cranelift/isle/veri/encodings/cls16.smt2 new file mode 100644 index 000000000000..982de4a679b0 --- /dev/null +++ b/cranelift/isle/veri/encodings/cls16.smt2 @@ -0,0 +1,105 @@ +; total zeros counter +(declare-fun zret0_{id} () (_ BitVec 16)) +(assert (= zret0_{id} (_ bv0 16))) + +; round 1 +(declare-fun zret3_{id} () (_ BitVec 16)) +(declare-fun zy8_{id} () (_ BitVec 16)) +(declare-fun zx8_{id} () (_ BitVec 16)) + +(assert (= zy8_{id} (bvlshr {x} #x0008))) +(assert (ite (not (= zy8_{id} (_ bv0 16))) (= zret3_{id} zret0_{id}) (= zret3_{id} (bvadd zret0_{id} (_ bv8 16))))) +(assert (ite (not (= zy8_{id} (_ bv0 16))) (= zx8_{id} zy8_{id}) (= zx8_{id} {x}))) + +; round 2 +(declare-fun zret4_{id} () (_ BitVec 16)) +(declare-fun zy4_{id} () (_ BitVec 16)) +(declare-fun zx4_{id} () (_ BitVec 16)) + +(assert (= zy4_{id} (bvlshr zx8_{id} #x0004))) +(assert (ite (not (= zy4_{id} (_ bv0 16))) (= zret4_{id} zret3_{id}) (= zret4_{id} (bvadd zret3_{id} (_ bv4 16))))) +(assert (ite (not (= zy4_{id} (_ bv0 16))) (= zx4_{id} zy4_{id}) (= zx4_{id} zx8_{id}))) + +; round 3 +(declare-fun zret5_{id} () (_ BitVec 16)) +(declare-fun zy2_{id} () (_ BitVec 16)) +(declare-fun zx2_{id} () (_ BitVec 16)) + +(assert (= zy2_{id} (bvlshr zx4_{id} #x0002))) +(assert (ite (not (= zy2_{id} (_ bv0 16))) (= zret5_{id} zret4_{id}) (= zret5_{id} (bvadd zret4_{id} (_ bv2 16))))) +(assert (ite (not (= zy2_{id} (_ bv0 16))) (= zx2_{id} zy2_{id}) (= zx2_{id} zx4_{id}))) + +; round 4 +(declare-fun zret6_{id} () (_ BitVec 16)) +(declare-fun zy1_{id} () (_ BitVec 16)) +(declare-fun zx1_{id} () (_ BitVec 16)) + +(assert (= zy1_{id} (bvlshr zx2_{id} #x0001))) +(assert (ite (not (= zy1_{id} (_ bv0 16))) (= zret6_{id} zret5_{id}) (= zret6_{id} (bvadd zret5_{id} (_ bv1 16))))) +(assert (ite (not (= zy1_{id} (_ bv0 16))) (= zx1_{id} zy1_{id}) (= zx1_{id} zx2_{id}))) + +; last round +(declare-fun zret7_{id} () (_ BitVec 16)) +(assert (ite (not (= zx1_{id} (_ bv0 16))) (= zret7_{id} zret6_{id}) (= zret7_{id} (bvadd zret6_{id} (_ bv1 16))))) + +(declare-fun clzret_{id} () (_ BitVec 16)) +(assert (ite (= zret7_{id} (_ bv0 16)) (= clzret_{id} zret7_{id}) (= clzret_{id} (bvsub zret7_{id} (_ bv1 16))))) + + + + + + +; total zeros counter +(declare-fun sret0_{id} () (_ BitVec 16)) +(assert (= sret0_{id} (_ bv0 16))) + +; round 1 +(declare-fun sret3_{id} () (_ BitVec 16)) +(declare-fun sy8_{id} () (_ BitVec 16)) +(declare-fun sx8_{id} () (_ BitVec 16)) + +(assert (= sy8_{id} (bvashr {x} #x0008))) +(assert (ite (not (= sy8_{id} (_ bv65535 16))) (= sret3_{id} sret0_{id}) (= sret3_{id} (bvadd sret0_{id} (_ bv8 16))))) +(assert (ite (not (= sy8_{id} (_ bv65535 16))) (= sx8_{id} sy8_{id}) (= sx8_{id} {x}))) + +; round 2 +(declare-fun sret4_{id} () (_ BitVec 16)) +(declare-fun sy4_{id} () (_ BitVec 16)) +(declare-fun sx4_{id} () (_ BitVec 16)) + +(assert (= sy4_{id} (bvashr sx8_{id} #x0004))) +(assert (ite (not (= sy4_{id} (_ bv65535 16))) (= sret4_{id} sret3_{id}) (= sret4_{id} (bvadd sret3_{id} (_ bv4 16))))) +(assert (ite (not (= sy4_{id} (_ bv65535 16))) (= sx4_{id} sy4_{id}) (= sx4_{id} sx8_{id}))) + +; round 3 +(declare-fun sret5_{id} () (_ BitVec 16)) +(declare-fun sy2_{id} () (_ BitVec 16)) +(declare-fun sx2_{id} () (_ BitVec 16)) + +(assert (= sy2_{id} (bvashr sx4_{id} #x0002))) +(assert (ite (not (= sy2_{id} (_ bv65535 16))) (= sret5_{id} sret4_{id}) (= sret5_{id} (bvadd sret4_{id} (_ bv2 16))))) +(assert (ite (not (= sy2_{id} (_ bv65535 16))) (= sx2_{id} sy2_{id}) (= sx2_{id} sx4_{id}))) + +; round 4 +(declare-fun sret6_{id} () (_ BitVec 16)) +(declare-fun sy1_{id} () (_ BitVec 16)) +(declare-fun sx1_{id} () (_ BitVec 16)) + +(assert (= sy1_{id} (bvashr sx2_{id} #x0001))) +(assert (ite (not (= sy1_{id} (_ bv65535 16))) (= sret6_{id} sret5_{id}) (= sret6_{id} (bvadd sret5_{id} (_ bv1 16))))) +(assert (ite (not (= sy1_{id} (_ bv65535 16))) (= sx1_{id} sy1_{id}) (= sx1_{id} sx2_{id}))) + +; last round +(declare-fun sret7_{id} () (_ BitVec 16)) +(assert (ite (not (= sx1_{id} (_ bv65535 16))) (= sret7_{id} sret6_{id}) (= sret7_{id} (bvadd sret6_{id} (_ bv1 16))))) + +(declare-fun clsret_{id} () (_ BitVec 16)) +(assert (ite (= sret7_{id} (_ bv0 16)) (= clsret_{id} sret7_{id}) (= clsret_{id} (bvsub sret7_{id} (_ bv1 16))))) + + + + + +(declare-fun cls16ret_{id} () (_ BitVec 16)) +(assert (ite (bvsle (_ bv0 16) {x}) (= cls16ret_{id} clzret_{id}) (= cls16ret_{id} clsret_{id}))) diff --git a/cranelift/isle/veri/encodings/cls32.smt2 b/cranelift/isle/veri/encodings/cls32.smt2 new file mode 100644 index 000000000000..187f7e4b867d --- /dev/null +++ b/cranelift/isle/veri/encodings/cls32.smt2 @@ -0,0 +1,123 @@ +; total zeros counter +(declare-fun zret0_{id} () (_ BitVec 32)) +(assert (= zret0_{id} (_ bv0 32))) + +; round 1 +(declare-fun zret2_{id} () (_ BitVec 32)) +(declare-fun zy16_{id} () (_ BitVec 32)) +(declare-fun zx16_{id} () (_ BitVec 32)) + +(assert (= zy16_{id} (bvlshr {x} #x00000010))) +(assert (ite (not (= zy16_{id} (_ bv0 32))) (= zret2_{id} zret0_{id}) (= zret2_{id} (bvadd zret0_{id} (_ bv16 32))))) +(assert (ite (not (= zy16_{id} (_ bv0 32))) (= zx16_{id} zy16_{id}) (= zx16_{id} {x}))) + +; round 2 +(declare-fun zret3_{id} () (_ BitVec 32)) +(declare-fun zy8_{id} () (_ BitVec 32)) +(declare-fun zx8_{id} () (_ BitVec 32)) + +(assert (= zy8_{id} (bvlshr zx16_{id} #x00000008))) +(assert (ite (not (= zy8_{id} (_ bv0 32))) (= zret3_{id} zret2_{id}) (= zret3_{id} (bvadd zret2_{id} (_ bv8 32))))) +(assert (ite (not (= zy8_{id} (_ bv0 32))) (= zx8_{id} zy8_{id}) (= zx8_{id} zx16_{id}))) + +; round 3 +(declare-fun zret4_{id} () (_ BitVec 32)) +(declare-fun zy4_{id} () (_ BitVec 32)) +(declare-fun zx4_{id} () (_ BitVec 32)) + +(assert (= zy4_{id} (bvlshr zx8_{id} #x00000004))) +(assert (ite (not (= zy4_{id} (_ bv0 32))) (= zret4_{id} zret3_{id}) (= zret4_{id} (bvadd zret3_{id} (_ bv4 32))))) +(assert (ite (not (= zy4_{id} (_ bv0 32))) (= zx4_{id} zy4_{id}) (= zx4_{id} zx8_{id}))) + +; round 4 +(declare-fun zret5_{id} () (_ BitVec 32)) +(declare-fun zy2_{id} () (_ BitVec 32)) +(declare-fun zx2_{id} () (_ BitVec 32)) + +(assert (= zy2_{id} (bvlshr zx4_{id} #x00000002))) +(assert (ite (not (= zy2_{id} (_ bv0 32))) (= zret5_{id} zret4_{id}) (= zret5_{id} (bvadd zret4_{id} (_ bv2 32))))) +(assert (ite (not (= zy2_{id} (_ bv0 32))) (= zx2_{id} zy2_{id}) (= zx2_{id} zx4_{id}))) + +; round 5 +(declare-fun zret6_{id} () (_ BitVec 32)) +(declare-fun zy1_{id} () (_ BitVec 32)) +(declare-fun zx1_{id} () (_ BitVec 32)) + +(assert (= zy1_{id} (bvlshr zx2_{id} #x00000001))) +(assert (ite (not (= zy1_{id} (_ bv0 32))) (= zret6_{id} zret5_{id}) (= zret6_{id} (bvadd zret5_{id} (_ bv1 32))))) +(assert (ite (not (= zy1_{id} (_ bv0 32))) (= zx1_{id} zy1_{id}) (= zx1_{id} zx2_{id}))) + +; last round +(declare-fun zret7_{id} () (_ BitVec 32)) +(assert (ite (not (= zx1_{id} (_ bv0 32))) (= zret7_{id} zret6_{id}) (= zret7_{id} (bvadd zret6_{id} (_ bv1 32))))) + +(declare-fun clzret_{id} () (_ BitVec 32)) +(assert (ite (= zret7_{id} (_ bv0 32)) (= clzret_{id} zret7_{id}) (= clzret_{id} (bvsub zret7_{id} (_ bv1 32))))) + + + + + + +; total zeros counter +(declare-fun sret0_{id} () (_ BitVec 32)) +(assert (= sret0_{id} (_ bv0 32))) + +; round 1 +(declare-fun sret2_{id} () (_ BitVec 32)) +(declare-fun sy16_{id} () (_ BitVec 32)) +(declare-fun sx16_{id} () (_ BitVec 32)) + +(assert (= sy16_{id} (bvashr {x} #x00000010))) +(assert (ite (not (= sy16_{id} (_ bv4294967295 32))) (= sret2_{id} sret0_{id}) (= sret2_{id} (bvadd sret0_{id} (_ bv16 32))))) +(assert (ite (not (= sy16_{id} (_ bv4294967295 32))) (= sx16_{id} sy16_{id}) (= sx16_{id} {x}))) + +; round 2 +(declare-fun sret3_{id} () (_ BitVec 32)) +(declare-fun sy8_{id} () (_ BitVec 32)) +(declare-fun sx8_{id} () (_ BitVec 32)) + +(assert (= sy8_{id} (bvashr sx16_{id} #x00000008))) +(assert (ite (not (= sy8_{id} (_ bv4294967295 32))) (= sret3_{id} sret2_{id}) (= sret3_{id} (bvadd sret2_{id} (_ bv8 32))))) +(assert (ite (not (= sy8_{id} (_ bv4294967295 32))) (= sx8_{id} sy8_{id}) (= sx8_{id} sx16_{id}))) + +; round 3 +(declare-fun sret4_{id} () (_ BitVec 32)) +(declare-fun sy4_{id} () (_ BitVec 32)) +(declare-fun sx4_{id} () (_ BitVec 32)) + +(assert (= sy4_{id} (bvashr sx8_{id} #x00000004))) +(assert (ite (not (= sy4_{id} (_ bv4294967295 32))) (= sret4_{id} sret3_{id}) (= sret4_{id} (bvadd sret3_{id} (_ bv4 32))))) +(assert (ite (not (= sy4_{id} (_ bv4294967295 32))) (= sx4_{id} sy4_{id}) (= sx4_{id} sx8_{id}))) + +; round 4 +(declare-fun sret5_{id} () (_ BitVec 32)) +(declare-fun sy2_{id} () (_ BitVec 32)) +(declare-fun sx2_{id} () (_ BitVec 32)) + +(assert (= sy2_{id} (bvashr sx4_{id} #x00000002))) +(assert (ite (not (= sy2_{id} (_ bv4294967295 32))) (= sret5_{id} sret4_{id}) (= sret5_{id} (bvadd sret4_{id} (_ bv2 32))))) +(assert (ite (not (= sy2_{id} (_ bv4294967295 32))) (= sx2_{id} sy2_{id}) (= sx2_{id} sx4_{id}))) + +; round 5 +(declare-fun sret6_{id} () (_ BitVec 32)) +(declare-fun sy1_{id} () (_ BitVec 32)) +(declare-fun sx1_{id} () (_ BitVec 32)) + +(assert (= sy1_{id} (bvashr sx2_{id} #x00000001))) +(assert (ite (not (= sy1_{id} (_ bv4294967295 32))) (= sret6_{id} sret5_{id}) (= sret6_{id} (bvadd sret5_{id} (_ bv1 32))))) +(assert (ite (not (= sy1_{id} (_ bv4294967295 32))) (= sx1_{id} sy1_{id}) (= sx1_{id} sx2_{id}))) + +; last round +(declare-fun sret7_{id} () (_ BitVec 32)) +(assert (ite (not (= sx1_{id} (_ bv4294967295 32))) (= sret7_{id} sret6_{id}) (= sret7_{id} (bvadd sret6_{id} (_ bv1 32))))) + +(declare-fun clsret_{id} () (_ BitVec 32)) +(assert (ite (= sret7_{id} (_ bv0 32)) (= clsret_{id} sret7_{id}) (= clsret_{id} (bvsub sret7_{id} (_ bv1 32))))) + + + + + +(declare-fun cls32ret_{id} () (_ BitVec 32)) +(assert (ite (bvsle (_ bv0 32) {x}) (= cls32ret_{id} clzret_{id}) (= cls32ret_{id} clsret_{id}))) diff --git a/cranelift/isle/veri/encodings/cls64.smt2 b/cranelift/isle/veri/encodings/cls64.smt2 new file mode 100644 index 000000000000..c8263b29b0fc --- /dev/null +++ b/cranelift/isle/veri/encodings/cls64.smt2 @@ -0,0 +1,141 @@ +; total zeros counter +(declare-fun zret0_{id} () (_ BitVec 64)) +(assert (= zret0_{id} (_ bv0 64))) + +; round 1 +(declare-fun zret1_{id} () (_ BitVec 64)) +(declare-fun zy32_{id} () (_ BitVec 64)) +(declare-fun zx32_{id} () (_ BitVec 64)) + +(assert (= zy32_{id} (bvlshr {x} #x0000000000000020))) +(assert (ite (not (= zy32_{id} (_ bv0 64))) (= zret1_{id} zret0_{id}) (= zret1_{id} (bvadd zret0_{id} (_ bv32 64))))) +(assert (ite (not (= zy32_{id} (_ bv0 64))) (= zx32_{id} zy32_{id}) (= zx32_{id} {x}))) + +; round 2 +(declare-fun zret2_{id} () (_ BitVec 64)) +(declare-fun zy16_{id} () (_ BitVec 64)) +(declare-fun zx16_{id} () (_ BitVec 64)) + +(assert (= zy16_{id} (bvlshr zx32_{id} #x0000000000000010))) +(assert (ite (not (= zy16_{id} (_ bv0 64))) (= zret2_{id} zret1_{id}) (= zret2_{id} (bvadd zret1_{id} (_ bv16 64))))) +(assert (ite (not (= zy16_{id} (_ bv0 64))) (= zx16_{id} zy16_{id}) (= zx16_{id} zx32_{id}))) + +; round 3 +(declare-fun zret3_{id} () (_ BitVec 64)) +(declare-fun zy8_{id} () (_ BitVec 64)) +(declare-fun zx8_{id} () (_ BitVec 64)) + +(assert (= zy8_{id} (bvlshr zx16_{id} #x0000000000000008))) +(assert (ite (not (= zy8_{id} (_ bv0 64))) (= zret3_{id} zret2_{id}) (= zret3_{id} (bvadd zret2_{id} (_ bv8 64))))) +(assert (ite (not (= zy8_{id} (_ bv0 64))) (= zx8_{id} zy8_{id}) (= zx8_{id} zx16_{id}))) + +; round 4 +(declare-fun zret4_{id} () (_ BitVec 64)) +(declare-fun zy4_{id} () (_ BitVec 64)) +(declare-fun zx4_{id} () (_ BitVec 64)) + +(assert (= zy4_{id} (bvlshr zx8_{id} #x0000000000000004))) +(assert (ite (not (= zy4_{id} (_ bv0 64))) (= zret4_{id} zret3_{id}) (= zret4_{id} (bvadd zret3_{id} (_ bv4 64))))) +(assert (ite (not (= zy4_{id} (_ bv0 64))) (= zx4_{id} zy4_{id}) (= zx4_{id} zx8_{id}))) + +; round 5 +(declare-fun zret5_{id} () (_ BitVec 64)) +(declare-fun zy2_{id} () (_ BitVec 64)) +(declare-fun zx2_{id} () (_ BitVec 64)) + +(assert (= zy2_{id} (bvlshr zx4_{id} #x0000000000000002))) +(assert (ite (not (= zy2_{id} (_ bv0 64))) (= zret5_{id} zret4_{id}) (= zret5_{id} (bvadd zret4_{id} (_ bv2 64))))) +(assert (ite (not (= zy2_{id} (_ bv0 64))) (= zx2_{id} zy2_{id}) (= zx2_{id} zx4_{id}))) + +; round 6 +(declare-fun zret6_{id} () (_ BitVec 64)) +(declare-fun zy1_{id} () (_ BitVec 64)) +(declare-fun zx1_{id} () (_ BitVec 64)) + +(assert (= zy1_{id} (bvlshr zx2_{id} #x0000000000000001))) +(assert (ite (not (= zy1_{id} (_ bv0 64))) (= zret6_{id} zret5_{id}) (= zret6_{id} (bvadd zret5_{id} (_ bv1 64))))) +(assert (ite (not (= zy1_{id} (_ bv0 64))) (= zx1_{id} zy1_{id}) (= zx1_{id} zx2_{id}))) + +; last round +(declare-fun zret7_{id} () (_ BitVec 64)) +(assert (ite (not (= zx1_{id} (_ bv0 64))) (= zret7_{id} zret6_{id}) (= zret7_{id} (bvadd zret6_{id} (_ bv1 64))))) + +(declare-fun clzret_{id} () (_ BitVec 64)) +(assert (ite (= zret7_{id} (_ bv0 64)) (= clzret_{id} zret7_{id}) (= clzret_{id} (bvsub zret7_{id} (_ bv1 64))))) + + + + + + +; total zeros counter +(declare-fun sret0_{id} () (_ BitVec 64)) +(assert (= sret0_{id} (_ bv0 64))) + +; round 1 +(declare-fun sret1_{id} () (_ BitVec 64)) +(declare-fun sy32_{id} () (_ BitVec 64)) +(declare-fun sx32_{id} () (_ BitVec 64)) + +(assert (= sy32_{id} (bvashr {x} #x0000000000000020))) +(assert (ite (not (= sy32_{id} (_ bv18446744073709551615 64))) (= sret1_{id} sret0_{id}) (= sret1_{id} (bvadd sret0_{id} (_ bv32 64))))) +(assert (ite (not (= sy32_{id} (_ bv18446744073709551615 64))) (= sx32_{id} sy32_{id}) (= sx32_{id} {x}))) + +; round 2 +(declare-fun sret2_{id} () (_ BitVec 64)) +(declare-fun sy16_{id} () (_ BitVec 64)) +(declare-fun sx16_{id} () (_ BitVec 64)) + +(assert (= sy16_{id} (bvashr sx32_{id} #x0000000000000010))) +(assert (ite (not (= sy16_{id} (_ bv18446744073709551615 64))) (= sret2_{id} sret1_{id}) (= sret2_{id} (bvadd sret1_{id} (_ bv16 64))))) +(assert (ite (not (= sy16_{id} (_ bv18446744073709551615 64))) (= sx16_{id} sy16_{id}) (= sx16_{id} sx32_{id}))) + +; round 3 +(declare-fun sret3_{id} () (_ BitVec 64)) +(declare-fun sy8_{id} () (_ BitVec 64)) +(declare-fun sx8_{id} () (_ BitVec 64)) + +(assert (= sy8_{id} (bvashr sx16_{id} #x0000000000000008))) +(assert (ite (not (= sy8_{id} (_ bv18446744073709551615 64))) (= sret3_{id} sret2_{id}) (= sret3_{id} (bvadd sret2_{id} (_ bv8 64))))) +(assert (ite (not (= sy8_{id} (_ bv18446744073709551615 64))) (= sx8_{id} sy8_{id}) (= sx8_{id} sx16_{id}))) + +; round 4 +(declare-fun sret4_{id} () (_ BitVec 64)) +(declare-fun sy4_{id} () (_ BitVec 64)) +(declare-fun sx4_{id} () (_ BitVec 64)) + +(assert (= sy4_{id} (bvashr sx8_{id} #x0000000000000004))) +(assert (ite (not (= sy4_{id} (_ bv18446744073709551615 64))) (= sret4_{id} sret3_{id}) (= sret4_{id} (bvadd sret3_{id} (_ bv4 64))))) +(assert (ite (not (= sy4_{id} (_ bv18446744073709551615 64))) (= sx4_{id} sy4_{id}) (= sx4_{id} sx8_{id}))) + +; round 5 +(declare-fun sret5_{id} () (_ BitVec 64)) +(declare-fun sy2_{id} () (_ BitVec 64)) +(declare-fun sx2_{id} () (_ BitVec 64)) + +(assert (= sy2_{id} (bvashr sx4_{id} #x0000000000000002))) +(assert (ite (not (= sy2_{id} (_ bv18446744073709551615 64))) (= sret5_{id} sret4_{id}) (= sret5_{id} (bvadd sret4_{id} (_ bv2 64))))) +(assert (ite (not (= sy2_{id} (_ bv18446744073709551615 64))) (= sx2_{id} sy2_{id}) (= sx2_{id} sx4_{id}))) + +; round 6 +(declare-fun sret6_{id} () (_ BitVec 64)) +(declare-fun sy1_{id} () (_ BitVec 64)) +(declare-fun sx1_{id} () (_ BitVec 64)) + +(assert (= sy1_{id} (bvashr sx2_{id} #x0000000000000001))) +(assert (ite (not (= sy1_{id} (_ bv18446744073709551615 64))) (= sret6_{id} sret5_{id}) (= sret6_{id} (bvadd sret5_{id} (_ bv1 64))))) +(assert (ite (not (= sy1_{id} (_ bv18446744073709551615 64))) (= sx1_{id} sy1_{id}) (= sx1_{id} sx2_{id}))) + +; last round +(declare-fun sret7_{id} () (_ BitVec 64)) +(assert (ite (not (= sx1_{id} (_ bv18446744073709551615 64))) (= sret7_{id} sret6_{id}) (= sret7_{id} (bvadd sret6_{id} (_ bv1 64))))) + +(declare-fun clsret_{id} () (_ BitVec 64)) +(assert (ite (= sret7_{id} (_ bv0 64)) (= clsret_{id} sret7_{id}) (= clsret_{id} (bvsub sret7_{id} (_ bv1 64))))) + + + + + +(declare-fun cls64ret_{id} () (_ BitVec 64)) +(assert (ite (bvsle (_ bv0 64) {x}) (= cls64ret_{id} clzret_{id}) (= cls64ret_{id} clsret_{id}))) diff --git a/cranelift/isle/veri/encodings/cls8.smt2 b/cranelift/isle/veri/encodings/cls8.smt2 new file mode 100644 index 000000000000..427089fb4b11 --- /dev/null +++ b/cranelift/isle/veri/encodings/cls8.smt2 @@ -0,0 +1,87 @@ +; total zeros counter +(declare-fun zret0_{id} () (_ BitVec 8)) +(assert (= zret0_{id} (_ bv0 8))) + +; round 1 +(declare-fun zret4_{id} () (_ BitVec 8)) +(declare-fun zy4_{id} () (_ BitVec 8)) +(declare-fun zx4_{id} () (_ BitVec 8)) + +(assert (= zy4_{id} (bvlshr {x} #x04))) +(assert (ite (not (= zy4_{id} (_ bv0 8))) (= zret4_{id} zret0_{id}) (= zret4_{id} (bvadd zret0_{id} (_ bv4 8))))) +(assert (ite (not (= zy4_{id} (_ bv0 8))) (= zx4_{id} zy4_{id}) (= zx4_{id} {x}))) + +; round 2 +(declare-fun zret5_{id} () (_ BitVec 8)) +(declare-fun zy2_{id} () (_ BitVec 8)) +(declare-fun zx2_{id} () (_ BitVec 8)) + +(assert (= zy2_{id} (bvlshr zx4_{id} #x02))) +(assert (ite (not (= zy2_{id} (_ bv0 8))) (= zret5_{id} zret4_{id}) (= zret5_{id} (bvadd zret4_{id} (_ bv2 8))))) +(assert (ite (not (= zy2_{id} (_ bv0 8))) (= zx2_{id} zy2_{id}) (= zx2_{id} zx4_{id}))) + +; round 3 +(declare-fun zret6_{id} () (_ BitVec 8)) +(declare-fun zy1_{id} () (_ BitVec 8)) +(declare-fun zx1_{id} () (_ BitVec 8)) + +(assert (= zy1_{id} (bvlshr zx2_{id} #x01))) +(assert (ite (not (= zy1_{id} (_ bv0 8))) (= zret6_{id} zret5_{id}) (= zret6_{id} (bvadd zret5_{id} (_ bv1 8))))) +(assert (ite (not (= zy1_{id} (_ bv0 8))) (= zx1_{id} zy1_{id}) (= zx1_{id} zx2_{id}))) + +; last round +(declare-fun zret7_{id} () (_ BitVec 8)) +(assert (ite (not (= zx1_{id} (_ bv0 8))) (= zret7_{id} zret6_{id}) (= zret7_{id} (bvadd zret6_{id} (_ bv1 8))))) + +(declare-fun clzret_{id} () (_ BitVec 8)) +(assert (ite (= zret7_{id} (_ bv0 8)) (= clzret_{id} zret7_{id}) (= clzret_{id} (bvsub zret7_{id} (_ bv1 8))))) + + + + + + +; total zeros counter +(declare-fun sret0_{id} () (_ BitVec 8)) +(assert (= sret0_{id} (_ bv0 8))) + +; round 1 +(declare-fun sret4_{id} () (_ BitVec 8)) +(declare-fun sy4_{id} () (_ BitVec 8)) +(declare-fun sx4_{id} () (_ BitVec 8)) + +(assert (= sy4_{id} (bvashr {x} #x04))) +(assert (ite (not (= sy4_{id} (_ bv255 8))) (= sret4_{id} sret0_{id}) (= sret4_{id} (bvadd sret0_{id} (_ bv4 8))))) +(assert (ite (not (= sy4_{id} (_ bv255 8))) (= sx4_{id} sy4_{id}) (= sx4_{id} {x}))) + +; round 2 +(declare-fun sret5_{id} () (_ BitVec 8)) +(declare-fun sy2_{id} () (_ BitVec 8)) +(declare-fun sx2_{id} () (_ BitVec 8)) + +(assert (= sy2_{id} (bvashr sx4_{id} #x02))) +(assert (ite (not (= sy2_{id} (_ bv255 8))) (= sret5_{id} sret4_{id}) (= sret5_{id} (bvadd sret4_{id} (_ bv2 8))))) +(assert (ite (not (= sy2_{id} (_ bv255 8))) (= sx2_{id} sy2_{id}) (= sx2_{id} sx4_{id}))) + +; round 3 +(declare-fun sret6_{id} () (_ BitVec 8)) +(declare-fun sy1_{id} () (_ BitVec 8)) +(declare-fun sx1_{id} () (_ BitVec 8)) + +(assert (= sy1_{id} (bvashr sx2_{id} #x01))) +(assert (ite (not (= sy1_{id} (_ bv255 8))) (= sret6_{id} sret5_{id}) (= sret6_{id} (bvadd sret5_{id} (_ bv1 8))))) +(assert (ite (not (= sy1_{id} (_ bv255 8))) (= sx1_{id} sy1_{id}) (= sx1_{id} sx2_{id}))) + +; last round +(declare-fun sret7_{id} () (_ BitVec 8)) +(assert (ite (not (= sx1_{id} (_ bv255 8))) (= sret7_{id} sret6_{id}) (= sret7_{id} (bvadd sret6_{id} (_ bv1 8))))) + +(declare-fun clsret_{id} () (_ BitVec 8)) +(assert (ite (= sret7_{id} (_ bv0 8)) (= clsret_{id} sret7_{id}) (= clsret_{id} (bvsub sret7_{id} (_ bv1 8))))) + + + + + +(declare-fun cls8ret_{id} () (_ BitVec 8)) +(assert (ite (bvsle (_ bv0 8) {x}) (= cls8ret_{id} clzret_{id}) (= cls8ret_{id} clsret_{id}))) diff --git a/cranelift/isle/veri/encodings/clz1.smt2 b/cranelift/isle/veri/encodings/clz1.smt2 new file mode 100644 index 000000000000..e9d0fdc79db3 --- /dev/null +++ b/cranelift/isle/veri/encodings/clz1.smt2 @@ -0,0 +1,2 @@ +(declare-fun clz1ret_{id} () (_ BitVec 1)) +(assert (= clz1ret_{id} (bvnot {x}))) diff --git a/cranelift/isle/veri/encodings/clz16.smt2 b/cranelift/isle/veri/encodings/clz16.smt2 new file mode 100644 index 000000000000..7bb441047d12 --- /dev/null +++ b/cranelift/isle/veri/encodings/clz16.smt2 @@ -0,0 +1,43 @@ +; total zeros counter +(declare-fun ret1_{id} () (_ BitVec 16)) +(assert (= ret1_{id} (_ bv0 16))) + +; round 1 +(declare-fun ret2_{id} () (_ BitVec 16)) +(declare-fun y8_{id} () (_ BitVec 16)) +(declare-fun x8_{id} () (_ BitVec 16)) + +(assert (= y8_{id} (bvlshr {x} #x0008))) +(assert (ite (not (= y8_{id} (_ bv0 16))) (= ret2_{id} ret1_{id}) (= ret2_{id} (bvadd ret1_{id} (_ bv8 16))))) +(assert (ite (not (= y8_{id} (_ bv0 16))) (= x8_{id} y8_{id}) (= x8_{id} {x}))) + +; round 2 +(declare-fun ret3_{id} () (_ BitVec 16)) +(declare-fun y4_{id} () (_ BitVec 16)) +(declare-fun x4_{id} () (_ BitVec 16)) + +(assert (= y4_{id} (bvlshr x8_{id} #x0004))) +(assert (ite (not (= y4_{id} (_ bv0 16))) (= ret3_{id} ret2_{id}) (= ret3_{id} (bvadd ret2_{id} (_ bv4 16))))) +(assert (ite (not (= y4_{id} (_ bv0 16))) (= x4_{id} y4_{id}) (= x4_{id} x8_{id}))) + +; round 3 +(declare-fun ret4_{id} () (_ BitVec 16)) +(declare-fun y2_{id} () (_ BitVec 16)) +(declare-fun x2_{id} () (_ BitVec 16)) + +(assert (= y2_{id} (bvlshr x4_{id} #x0002))) +(assert (ite (not (= y2_{id} (_ bv0 16))) (= ret4_{id} ret3_{id}) (= ret4_{id} (bvadd ret3_{id} (_ bv2 16))))) +(assert (ite (not (= y2_{id} (_ bv0 16))) (= x2_{id} y2_{id}) (= x2_{id} x4_{id}))) + +; round 4 +(declare-fun ret5_{id} () (_ BitVec 16)) +(declare-fun y1_{id} () (_ BitVec 16)) +(declare-fun x1_{id} () (_ BitVec 16)) + +(assert (= y1_{id} (bvlshr x2_{id} #x0001))) +(assert (ite (not (= y1_{id} (_ bv0 16))) (= ret5_{id} ret4_{id}) (= ret5_{id} (bvadd ret4_{id} (_ bv1 16))))) +(assert (ite (not (= y1_{id} (_ bv0 16))) (= x1_{id} y1_{id}) (= x1_{id} x2_{id}))) + +; last round +(declare-fun ret6_{id} () (_ BitVec 16)) +(assert (ite (not (= x1_{id} (_ bv0 16))) (= ret6_{id} ret5_{id}) (= ret6_{id} (bvadd ret5_{id} (_ bv1 16))))) \ No newline at end of file diff --git a/cranelift/isle/veri/encodings/clz32.smt2 b/cranelift/isle/veri/encodings/clz32.smt2 new file mode 100644 index 000000000000..80295fff18d4 --- /dev/null +++ b/cranelift/isle/veri/encodings/clz32.smt2 @@ -0,0 +1,52 @@ +; total zeros counter +(declare-fun ret0_{id} () (_ BitVec 32)) +(assert (= ret0_{id} (_ bv0 32))) + +; round 1 +(declare-fun ret1_{id} () (_ BitVec 32)) +(declare-fun y16_{id} () (_ BitVec 32)) +(declare-fun x16_{id} () (_ BitVec 32)) + +(assert (= y16_{id} (bvlshr {x} #x00000010))) +(assert (ite (not (= y16_{id} (_ bv0 32))) (= ret1_{id} ret0_{id}) (= ret1_{id} (bvadd ret0_{id} (_ bv16 32))))) +(assert (ite (not (= y16_{id} (_ bv0 32))) (= x16_{id} y16_{id}) (= x16_{id} {x}))) + +; round 2 +(declare-fun ret2_{id} () (_ BitVec 32)) +(declare-fun y8_{id} () (_ BitVec 32)) +(declare-fun x8_{id} () (_ BitVec 32)) + +(assert (= y8_{id} (bvlshr x16_{id} #x00000008))) +(assert (ite (not (= y8_{id} (_ bv0 32))) (= ret2_{id} ret1_{id}) (= ret2_{id} (bvadd ret1_{id} (_ bv8 32))))) +(assert (ite (not (= y8_{id} (_ bv0 32))) (= x8_{id} y8_{id}) (= x8_{id} x16_{id}))) + +; round 3 +(declare-fun ret3_{id} () (_ BitVec 32)) +(declare-fun y4_{id} () (_ BitVec 32)) +(declare-fun x4_{id} () (_ BitVec 32)) + +(assert (= y4_{id} (bvlshr x8_{id} #x00000004))) +(assert (ite (not (= y4_{id} (_ bv0 32))) (= ret3_{id} ret2_{id}) (= ret3_{id} (bvadd ret2_{id} (_ bv4 32))))) +(assert (ite (not (= y4_{id} (_ bv0 32))) (= x4_{id} y4_{id}) (= x4_{id} x8_{id}))) + +; round 4 +(declare-fun ret4_{id} () (_ BitVec 32)) +(declare-fun y2_{id} () (_ BitVec 32)) +(declare-fun x2_{id} () (_ BitVec 32)) + +(assert (= y2_{id} (bvlshr x4_{id} #x00000002))) +(assert (ite (not (= y2_{id} (_ bv0 32))) (= ret4_{id} ret3_{id}) (= ret4_{id} (bvadd ret3_{id} (_ bv2 32))))) +(assert (ite (not (= y2_{id} (_ bv0 32))) (= x2_{id} y2_{id}) (= x2_{id} x4_{id}))) + +; round 5 +(declare-fun ret5_{id} () (_ BitVec 32)) +(declare-fun y1_{id} () (_ BitVec 32)) +(declare-fun x1_{id} () (_ BitVec 32)) + +(assert (= y1_{id} (bvlshr x2_{id} #x00000001))) +(assert (ite (not (= y1_{id} (_ bv0 32))) (= ret5_{id} ret4_{id}) (= ret5_{id} (bvadd ret4_{id} (_ bv1 32))))) +(assert (ite (not (= y1_{id} (_ bv0 32))) (= x1_{id} y1_{id}) (= x1_{id} x2_{id}))) + +; last round +(declare-fun ret6_{id} () (_ BitVec 32)) +(assert (ite (not (= x1_{id} (_ bv0 32))) (= ret6_{id} ret5_{id}) (= ret6_{id} (bvadd ret5_{id} (_ bv1 32))))) \ No newline at end of file diff --git a/cranelift/isle/veri/encodings/clz64.smt2 b/cranelift/isle/veri/encodings/clz64.smt2 new file mode 100644 index 000000000000..2296e026de5c --- /dev/null +++ b/cranelift/isle/veri/encodings/clz64.smt2 @@ -0,0 +1,61 @@ +; total zeros counter +(declare-fun ret0_{id} () (_ BitVec 64)) +(assert (= ret0_{id} (_ bv0 64))) + +; round 1 +(declare-fun ret1_{id} () (_ BitVec 64)) +(declare-fun y32_{id} () (_ BitVec 64)) +(declare-fun x32_{id} () (_ BitVec 64)) + +(assert (= y32_{id} (bvlshr {x} #x0000000000000020))) +(assert (ite (not (= y32_{id} (_ bv0 64))) (= ret1_{id} ret0_{id}) (= ret1_{id} (bvadd ret0_{id} (_ bv32 64))))) +(assert (ite (not (= y32_{id} (_ bv0 64))) (= x32_{id} y32_{id}) (= x32_{id} {x}))) + +; round 2 +(declare-fun ret2_{id} () (_ BitVec 64)) +(declare-fun y16_{id} () (_ BitVec 64)) +(declare-fun x16_{id} () (_ BitVec 64)) + +(assert (= y16_{id} (bvlshr x32_{id} #x0000000000000010))) +(assert (ite (not (= y16_{id} (_ bv0 64))) (= ret2_{id} ret1_{id}) (= ret2_{id} (bvadd ret1_{id} (_ bv16 64))))) +(assert (ite (not (= y16_{id} (_ bv0 64))) (= x16_{id} y16_{id}) (= x16_{id} x32_{id}))) + +; round 3 +(declare-fun ret3_{id} () (_ BitVec 64)) +(declare-fun y8_{id} () (_ BitVec 64)) +(declare-fun x8_{id} () (_ BitVec 64)) + +(assert (= y8_{id} (bvlshr x16_{id} #x0000000000000008))) +(assert (ite (not (= y8_{id} (_ bv0 64))) (= ret3_{id} ret2_{id}) (= ret3_{id} (bvadd ret2_{id} (_ bv8 64))))) +(assert (ite (not (= y8_{id} (_ bv0 64))) (= x8_{id} y8_{id}) (= x8_{id} x16_{id}))) + +; round 4 +(declare-fun ret4_{id} () (_ BitVec 64)) +(declare-fun y4_{id} () (_ BitVec 64)) +(declare-fun x4_{id} () (_ BitVec 64)) + +(assert (= y4_{id} (bvlshr x8_{id} #x0000000000000004))) +(assert (ite (not (= y4_{id} (_ bv0 64))) (= ret4_{id} ret3_{id}) (= ret4_{id} (bvadd ret3_{id} (_ bv4 64))))) +(assert (ite (not (= y4_{id} (_ bv0 64))) (= x4_{id} y4_{id}) (= x4_{id} x8_{id}))) + +; round 5 +(declare-fun ret5_{id} () (_ BitVec 64)) +(declare-fun y2_{id} () (_ BitVec 64)) +(declare-fun x2_{id} () (_ BitVec 64)) + +(assert (= y2_{id} (bvlshr x4_{id} #x0000000000000002))) +(assert (ite (not (= y2_{id} (_ bv0 64))) (= ret5_{id} ret4_{id}) (= ret5_{id} (bvadd ret4_{id} (_ bv2 64))))) +(assert (ite (not (= y2_{id} (_ bv0 64))) (= x2_{id} y2_{id}) (= x2_{id} x4_{id}))) + +; round 6 +(declare-fun ret6_{id} () (_ BitVec 64)) +(declare-fun y1_{id} () (_ BitVec 64)) +(declare-fun x1_{id} () (_ BitVec 64)) + +(assert (= y1_{id} (bvlshr x2_{id} #x0000000000000001))) +(assert (ite (not (= y1_{id} (_ bv0 64))) (= ret6_{id} ret5_{id}) (= ret6_{id} (bvadd ret5_{id} (_ bv1 64))))) +(assert (ite (not (= y1_{id} (_ bv0 64))) (= x1_{id} y1_{id}) (= x1_{id} x2_{id}))) + +; last round +(declare-fun ret7_{id} () (_ BitVec 64)) +(assert (ite (not (= x1_{id} (_ bv0 64))) (= ret7_{id} ret6_{id}) (= ret7_{id} (bvadd ret6_{id} (_ bv1 64))))) \ No newline at end of file diff --git a/cranelift/isle/veri/encodings/clz8.smt2 b/cranelift/isle/veri/encodings/clz8.smt2 new file mode 100644 index 000000000000..c67d41053447 --- /dev/null +++ b/cranelift/isle/veri/encodings/clz8.smt2 @@ -0,0 +1,34 @@ +; total zeros counter +(declare-fun ret0_{id} () (_ BitVec 8)) +(assert (= ret0_{id} (_ bv0 8))) + +; round 1 +(declare-fun ret3_{id} () (_ BitVec 8)) +(declare-fun y4_{id} () (_ BitVec 8)) +(declare-fun x4_{id} () (_ BitVec 8)) + +(assert (= y4_{id} (bvlshr {x} #x04))) +(assert (ite (not (= y4_{id} (_ bv0 8))) (= ret3_{id} ret0_{id}) (= ret3_{id} (bvadd ret0_{id} (_ bv4 8))))) +(assert (ite (not (= y4_{id} (_ bv0 8))) (= x4_{id} y4_{id}) (= x4_{id} {x}))) + +; round 2 +(declare-fun ret4_{id} () (_ BitVec 8)) +(declare-fun y2_{id} () (_ BitVec 8)) +(declare-fun x2_{id} () (_ BitVec 8)) + +(assert (= y2_{id} (bvlshr x4_{id} #x02))) +(assert (ite (not (= y2_{id} (_ bv0 8))) (= ret4_{id} ret3_{id}) (= ret4_{id} (bvadd ret3_{id} (_ bv2 8))))) +(assert (ite (not (= y2_{id} (_ bv0 8))) (= x2_{id} y2_{id}) (= x2_{id} x4_{id}))) + +; round 3 +(declare-fun ret5_{id} () (_ BitVec 8)) +(declare-fun y1_{id} () (_ BitVec 8)) +(declare-fun x1_{id} () (_ BitVec 8)) + +(assert (= y1_{id} (bvlshr x2_{id} #x01))) +(assert (ite (not (= y1_{id} (_ bv0 8))) (= ret5_{id} ret4_{id}) (= ret5_{id} (bvadd ret4_{id} (_ bv1 8))))) +(assert (ite (not (= y1_{id} (_ bv0 8))) (= x1_{id} y1_{id}) (= x1_{id} x2_{id}))) + +; last round +(declare-fun ret6_{id} () (_ BitVec 8)) +(assert (ite (not (= x1_{id} (_ bv0 8))) (= ret6_{id} ret5_{id}) (= ret6_{id} (bvadd ret5_{id} (_ bv1 8))))) diff --git a/cranelift/isle/veri/encodings/convert.py b/cranelift/isle/veri/encodings/convert.py new file mode 100644 index 000000000000..4e589ef4ebc6 --- /dev/null +++ b/cranelift/isle/veri/encodings/convert.py @@ -0,0 +1,136 @@ +import sys +import re +import sexpdata + +DECL = "(declare-fun " +ASSERTION = "(assert " +PATTERN = r'\{(.*?)\}' +SMT_FUNCS = [ + 'bvand', + 'bvor', + 'bvshl', + 'bvlshr', + 'bvashr', +] + + +def sexpr_to_rs(sexpr): + """Generate Rust code to generate an S-expression. + + Convert a parsed S-expression to Rust code (as a string) that + generates the same thing. The generated code makes calls to a + `solver` context struct. + + Symbols containing Rust formatting delimiters, like `{this}`, are + treated specially. Instead of generating liter symbols, we generate + references to corresponding Rust variables that should hold those + symbols. + """ + if isinstance(sexpr, sexpdata.Symbol): + sym = sexpr.value() + + if sym == '{x}': # The special input expression. + return 'x' + elif sym.endswith('_{id}'): # Tagged "local" variables. + base, ext = sym.rsplit('_', 1) + return base + elif sym == '_': + return 'solver.smt.atoms().und' + + # General case: construct an atom. + assert '{' not in sym # Guard against unhandled templates. + return f'solver.smt.atom("{sym}")' + + elif isinstance(sexpr, list): + # Special cases for common SMT functions. + if sexpr: + hd, tl = sexpr[0], sexpr[1:] + tl_rs = ", ".join(sexpr_to_rs(v) for v in tl) + if hd == sexpdata.Symbol('='): + return f'solver.smt.eq({tl_rs})' + elif isinstance(hd, sexpdata.Symbol) and hd.value() in SMT_FUNCS: + return f'solver.smt.{hd.value()}({tl_rs})' + + # General case: construct a normal list. + guts = ", ".join(sexpr_to_rs(v) for v in sexpr) + return f'solver.smt.list(vec![{guts}])' + + elif isinstance(sexpr, int): + return f'solver.smt.numeral({sexpr})' + else: + assert False + + +def parse_decl(line): + """Parse a `declare-fun` line. + + The line must look like `(declare-fun () )`. Return a + tuple consisting of: + + * The Rust variable name we should use for the declared SMT variable. + * A Rust expression for the SMT variable's name (a string). + * A Rust expression for the type (an SExpr). + """ + # Parse the S-expression. + exp = sexpdata.loads(line) + assert exp[0].value() == 'declare-fun' + _, name, args, ret = exp + name = name.value() + + # Rust code to format the variable name. Format with Rust variables + # matching the variables in the format string. + matches = re.findall(PATTERN, name) + if matches: + named_params = ', '.join([f'{x} = {x}' for x in matches]) + name_rs = f'format!(\"{name}\", {named_params})' + else: + name_rs = name # TODO Should be surrounded in quotes? + + # Strip off the '_{id}' to get the Rust variable name. + assert name.endswith('_{id}') + name_var, _ = name.rsplit('_', 1) + + return name_var, name_rs, sexpr_to_rs(ret) + + +def parse_assertion(line): + """Parse an `assert` line. + + The line must look like `(assert )`. Return Rust code to + generate an equivalent S-expression for the underlying assertion. + """ + # Parse the S-expression. + exp = sexpdata.loads(line) + assert exp[0].value() == 'assert' + _, asst = exp + + return sexpr_to_rs(asst) + + +def main(): + filename = sys.argv[1] + + with open(filename, 'r') as f: + for line in f: + line = line.strip() + + # Convert comments. + if line.startswith(';'): + print(f'//{line[1:]}') + continue + + # Convert declarations. + if line.startswith(DECL): + var, name, ty = parse_decl(line) + print(f'let {var} = solver.declare({name}, {ty});') + continue + + # Convert assertions. + if line.startswith(ASSERTION): + a = parse_assertion(line) + print(f'solver.assume({a});') + continue + + +if __name__ == '__main__': + main() diff --git a/cranelift/isle/veri/encodings/rbit32.smt2 b/cranelift/isle/veri/encodings/rbit32.smt2 new file mode 100644 index 000000000000..2f015af3b917 --- /dev/null +++ b/cranelift/isle/veri/encodings/rbit32.smt2 @@ -0,0 +1,17 @@ +(declare-fun a64x_{id} () (_ BitVec 32)) +(assert (= a64x_{id} ((_ extract 31 0) {x}))) + +(declare-fun x1_{id} () (_ BitVec 32)) +(assert (= x1_{id} (bvor (bvlshr a64x_{id} #x00000010) (bvshl a64x_{id} #x00000010)))) + +(declare-fun x2_{id} () (_ BitVec 32)) +(assert (= x2_{id} (bvor (bvlshr (bvand x1_{id} #xff00ff00) #x00000008) (bvshl (bvand x1_{id} #x00ff00ff) #x00000008)))) + +(declare-fun x3_{id} () (_ BitVec 32)) +(assert (= x3_{id} (bvor (bvlshr (bvand x2_{id} #xf0f0f0f0) #x00000004) (bvshl (bvand x2_{id} #x0f0f0f0f) #x00000004)))) + +(declare-fun x4_{id} () (_ BitVec 32)) +(assert (= x4_{id} (bvor (bvlshr (bvand x3_{id} #xcccccccc) #x00000002) (bvshl (bvand x3_{id} #x33333333) #x00000002)))) + +(declare-fun rbitret_{id} () (_ BitVec 32)) +(assert (= rbitret_{id} (bvor (bvlshr (bvand x4_{id} #xaaaaaaaa) #x00000001) (bvshl (bvand x4_{id} #x55555555) #x00000001)))) diff --git a/cranelift/isle/veri/encodings/rev1.smt2 b/cranelift/isle/veri/encodings/rev1.smt2 new file mode 100644 index 000000000000..922df743d634 --- /dev/null +++ b/cranelift/isle/veri/encodings/rev1.smt2 @@ -0,0 +1,2 @@ +(declare-fun rev1ret_{id} () (_ BitVec 1)) +(assert (= rev1ret_{id} {x})) diff --git a/cranelift/isle/veri/encodings/rev16.smt2 b/cranelift/isle/veri/encodings/rev16.smt2 new file mode 100644 index 000000000000..2db8196cbec7 --- /dev/null +++ b/cranelift/isle/veri/encodings/rev16.smt2 @@ -0,0 +1,11 @@ +(declare-fun x1_{id} () (_ BitVec 16)) +(assert (= x1_{id} (bvor (bvlshr {x} #x0008) (bvshl {x} #x0008)))) + +(declare-fun x2_{id} () (_ BitVec 16)) +(assert (= x2_{id} (bvor (bvlshr (bvand x1_{id} #xf0f0) #x0004) (bvshl (bvand x1_{id} #x0f0f) #x0004)))) + +(declare-fun x3_{id} () (_ BitVec 16)) +(assert (= x3_{id} (bvor (bvlshr (bvand x2_{id} #xcccc) #x0002) (bvshl (bvand x2_{id} #x3333) #x0002)))) + +(declare-fun rev16ret_{id} () (_ BitVec 16)) +(assert (= rev16ret_{id} (bvor (bvlshr (bvand x3_{id} #xaaaa) #x0001) (bvshl (bvand x3_{id} #x5555) #x0001)))) diff --git a/cranelift/isle/veri/encodings/rev32.smt2 b/cranelift/isle/veri/encodings/rev32.smt2 new file mode 100644 index 000000000000..d40e230ea71e --- /dev/null +++ b/cranelift/isle/veri/encodings/rev32.smt2 @@ -0,0 +1,14 @@ +(declare-fun x1_{id} () (_ BitVec 32)) +(assert (= x1_{id} (bvor (bvlshr {x} #x00000010) (bvshl {x} #x00000010)))) + +(declare-fun x2_{id} () (_ BitVec 32)) +(assert (= x2_{id} (bvor (bvlshr (bvand x1_{id} #xff00ff00) #x00000008) (bvshl (bvand x1_{id} #x00ff00ff) #x00000008)))) + +(declare-fun x3_{id} () (_ BitVec 32)) +(assert (= x3_{id} (bvor (bvlshr (bvand x2_{id} #xf0f0f0f0) #x00000004) (bvshl (bvand x2_{id} #x0f0f0f0f) #x00000004)))) + +(declare-fun x4_{id} () (_ BitVec 32)) +(assert (= x4_{id} (bvor (bvlshr (bvand x3_{id} #xcccccccc) #x00000002) (bvshl (bvand x3_{id} #x33333333) #x00000002)))) + +(declare-fun rev32ret_{id} () (_ BitVec 32)) +(assert (= rev32ret_{id} (bvor (bvlshr (bvand x4_{id} #xaaaaaaaa) #x00000001) (bvshl (bvand x4_{id} #x55555555) #x00000001)))) diff --git a/cranelift/isle/veri/encodings/rev64.smt2 b/cranelift/isle/veri/encodings/rev64.smt2 new file mode 100644 index 000000000000..84f46aa3cf61 --- /dev/null +++ b/cranelift/isle/veri/encodings/rev64.smt2 @@ -0,0 +1,17 @@ +(declare-fun x1_{id} () (_ BitVec 64)) +(assert (= x1_{id} (bvor (bvlshr {x} #x0000000000000020) (bvshl {x} #x0000000000000020)))) + +(declare-fun x2_{id} () (_ BitVec 64)) +(assert (= x2_{id} (bvor (bvlshr (bvand x1_{id} #xffff0000ffff0000) #x0000000000000010) (bvshl (bvand x1_{id} #x0000ffff0000ffff) #x0000000000000010)))) + +(declare-fun x3_{id} () (_ BitVec 64)) +(assert (= x3_{id} (bvor (bvlshr (bvand x2_{id} #xff00ff00ff00ff00) #x0000000000000008) (bvshl (bvand x2_{id} #x00ff00ff00ff00ff) #x0000000000000008)))) + +(declare-fun x4_{id} () (_ BitVec 64)) +(assert (= x4_{id} (bvor (bvlshr (bvand x3_{id} #xf0f0f0f0f0f0f0f0) #x0000000000000004) (bvshl (bvand x3_{id} #x0f0f0f0f0f0f0f0f) #x0000000000000004)))) + +(declare-fun x5_{id} () (_ BitVec 64)) +(assert (= x5_{id} (bvor (bvlshr (bvand x4_{id} #xcccccccccccccccc) #x0000000000000002) (bvshl (bvand x4_{id} #x3333333333333333) #x0000000000000002)))) + +(declare-fun rev64ret_{id} () (_ BitVec 64)) +(assert (= rev64ret_{id} (bvor (bvlshr (bvand x5_{id} #xaaaaaaaaaaaaaaaa) #x0000000000000001) (bvshl (bvand x5_{id} #x5555555555555555) #x0000000000000001)))) diff --git a/cranelift/isle/veri/encodings/rev8.smt2 b/cranelift/isle/veri/encodings/rev8.smt2 new file mode 100644 index 000000000000..abf1de58bb4e --- /dev/null +++ b/cranelift/isle/veri/encodings/rev8.smt2 @@ -0,0 +1,8 @@ +(declare-fun x1_{id} () (_ BitVec 8)) +(assert (= x1_{id} (bvor (bvlshr {x} #x04) (bvshl {x} #x04)))) + +(declare-fun x2_{id} () (_ BitVec 8)) +(assert (= x2_{id} (bvor (bvlshr (bvand x1_{id} #xcc) #x02) (bvshl (bvand x1_{id} #x33) #x02)))) + +(declare-fun rev8ret_{id} () (_ BitVec 8)) +(assert (= rev8ret_{id} (bvor (bvlshr (bvand x2_{id} #xaa) #x01) (bvshl (bvand x2_{id} #x55) #x01)))) diff --git a/cranelift/isle/veri/veri_engine/Cargo.toml b/cranelift/isle/veri/veri_engine/Cargo.toml index bd70419132dd..8cca117d4ef8 100644 --- a/cranelift/isle/veri/veri_engine/Cargo.toml +++ b/cranelift/isle/veri/veri_engine/Cargo.toml @@ -17,9 +17,12 @@ path = "src/main.rs" cranelift-isle = { path = "../../isle" } veri_ir = { path = "../veri_ir" } veri_annotation = { path = "../veri_annotation" } -rsmt2 = "0.14.1" +easy-smt = { git = "https://github.com/elliottt/easy-smt.git" } clap = "3.1.2" itertools = "0.10.3" +log = "0.4.17" +env_logger = "0.10.0" +retry = "2.0.0" [dev-dependencies] strum = "0.24.0" diff --git a/cranelift/isle/veri/veri_engine/examples/band/64_band.isle b/cranelift/isle/veri/veri_engine/examples/band/64_band.isle index 416ff6f5f7b7..90fdad6c7187 100644 --- a/cranelift/isle/veri/veri_engine/examples/band/64_band.isle +++ b/cranelift/isle/veri/veri_engine/examples/band/64_band.isle @@ -60,19 +60,19 @@ )) ;;@ (spec (sig (args op, t, a, b) (ret)) -;;@ (assertions (if (= (op) (0i64:bv)) { -;;@ (= (ret) (& (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (assertions (= (ret) (if (= (op) (0i64:bv)) { +;;@ (& (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { ;;@ (if (= (op) (1i64:bv)) { -;;@ (= (ret) (| (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (| (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { ;;@ (if (= (op) (2i64:bv)) { -;;@ (= (ret) (xor (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (xor (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { -;;@ (= (ret) (0i64:bv)) +;;@ (conv_to (t) (0i64:bv)) ;;@ }) ;;@ }) -;;@ }) +;;@ })) ;;@ )) (decl alu_rs_imm_logic_commutative (ALUOp Type Value Value) Reg) (extern constructor alu_rs_imm_logic_commutative alu_rs_imm_logic_commutative) diff --git a/cranelift/isle/veri/veri_engine/examples/band/fits_in_32_band.isle b/cranelift/isle/veri/veri_engine/examples/band/fits_in_32_band.isle index b278128d2274..7360f4ef4bba 100644 --- a/cranelift/isle/veri/veri_engine/examples/band/fits_in_32_band.isle +++ b/cranelift/isle/veri/veri_engine/examples/band/fits_in_32_band.isle @@ -60,19 +60,19 @@ )) ;;@ (spec (sig (args op, t, a, b) (ret)) -;;@ (assertions (if (= (op) (0i64:bv)) { -;;@ (= (ret) (& (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (assertions (= (ret) (if (= (op) (0i64:bv)) { +;;@ (& (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { ;;@ (if (= (op) (1i64:bv)) { -;;@ (= (ret) (| (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (| (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { ;;@ (if (= (op) (2i64:bv)) { -;;@ (= (ret) (xor (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (xor (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { -;;@ (= (ret) (0i64:bv)) +;;@ (conv_to (t) (0i64:bv)) ;;@ }) ;;@ }) -;;@ }) +;;@ })) ;;@ )) (decl alu_rs_imm_logic_commutative (ALUOp Type Value Value) Reg) (extern constructor alu_rs_imm_logic_commutative alu_rs_imm_logic_commutative) diff --git a/cranelift/isle/veri/veri_engine/examples/bor/64_bor.isle b/cranelift/isle/veri/veri_engine/examples/bor/64_bor.isle index 34e760db4ff4..eb73c796e561 100644 --- a/cranelift/isle/veri/veri_engine/examples/bor/64_bor.isle +++ b/cranelift/isle/veri/veri_engine/examples/bor/64_bor.isle @@ -60,19 +60,19 @@ )) ;;@ (spec (sig (args op, t, a, b) (ret)) -;;@ (assertions (if (= (op) (0i64:bv)) { -;;@ (= (ret) (& (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (assertions (= (ret) (if (= (op) (0i64:bv)) { +;;@ (& (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { ;;@ (if (= (op) (1i64:bv)) { -;;@ (= (ret) (| (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (| (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { ;;@ (if (= (op) (2i64:bv)) { -;;@ (= (ret) (xor (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (xor (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { -;;@ (= (ret) (0i64:bv)) +;;@ (conv_to (t) (0i64:bv)) ;;@ }) ;;@ }) -;;@ }) +;;@ })) ;;@ )) (decl alu_rs_imm_logic_commutative (ALUOp Type Value Value) Reg) (extern constructor alu_rs_imm_logic_commutative alu_rs_imm_logic_commutative) diff --git a/cranelift/isle/veri/veri_engine/examples/bor/fits_in_32_bor.isle b/cranelift/isle/veri/veri_engine/examples/bor/fits_in_32_bor.isle index a84ad6d0ad5c..828be33d1e85 100644 --- a/cranelift/isle/veri/veri_engine/examples/bor/fits_in_32_bor.isle +++ b/cranelift/isle/veri/veri_engine/examples/bor/fits_in_32_bor.isle @@ -60,19 +60,19 @@ )) ;;@ (spec (sig (args op, t, a, b) (ret)) -;;@ (assertions (if (= (op) (0i64:bv)) { -;;@ (= (ret) (& (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (assertions (= (ret) (if (= (op) (0i64:bv)) { +;;@ (& (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { ;;@ (if (= (op) (1i64:bv)) { -;;@ (= (ret) (| (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (| (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { ;;@ (if (= (op) (2i64:bv)) { -;;@ (= (ret) (xor (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (xor (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { -;;@ (= (ret) (0i64:bv)) +;;@ (conv_to (t) (0i64:bv)) ;;@ }) ;;@ }) -;;@ }) +;;@ })) ;;@ )) (decl alu_rs_imm_logic_commutative (ALUOp Type Value Value) Reg) (extern constructor alu_rs_imm_logic_commutative alu_rs_imm_logic_commutative) diff --git a/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_16_rotl_to_rotr.isle b/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_16_rotl_to_rotr.isle index 1d1f8662dcbb..3dbabc3f95b7 100644 --- a/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_16_rotl_to_rotr.isle +++ b/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_16_rotl_to_rotr.isle @@ -46,13 +46,19 @@ (decl rotr_mask (Type) ImmLogic) (extern constructor rotr_mask rotr_mask) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (- (reg) (conv_to (widthof (ret)) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (extern constructor sub_imm sub_imm) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (ret) (zero_ext (12) (arg))))) +;;@ (assertions (= (ret) (zero_ext (24) (arg))))) (decl u8_into_imm12 (u8) Imm12) (extern constructor u8_into_imm12 u8_into_imm12) diff --git a/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_16_with_imm_rotl_to_rotr.isle b/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_16_with_imm_rotl_to_rotr.isle index e97f3281156f..ffd5693853a0 100644 --- a/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_16_with_imm_rotl_to_rotr.isle +++ b/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_16_with_imm_rotl_to_rotr.isle @@ -37,13 +37,19 @@ (decl put_in_reg_zext32 (Value) Reg) (extern constructor put_in_reg_zext32 put_in_reg_zext32) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (- (reg) (conv_to (widthof (ret)) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (extern constructor sub_imm sub_imm) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (ret) (zero_ext (12) (arg))))) +;;@ (assertions (= (ret) (zero_ext (24) (arg))))) (decl u8_into_imm12 (u8) Imm12) (extern constructor u8_into_imm12 u8_into_imm12) @@ -72,7 +78,7 @@ ;;@ (spec (sig (args ty, x) (r)) ;;@ (assertions ;;@ (= (r) (conv_to (widthof (r)) (x))), -;;@ (= (0i65:bv) (& (x) (~ (63i64:bv)))) +;;@ (= (0i64:bv) (& (x) (~ (63i64:bv)))) ;;@ ) ;;@ ) (decl pure imm_shift_from_imm64 (Type Imm64) ImmShift) diff --git a/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_32_band.isle b/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_32_band.isle index 799fa7e00526..bbd86f5b6233 100644 --- a/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_32_band.isle +++ b/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_32_band.isle @@ -55,16 +55,17 @@ (SbcS) )) +;; BROKEN: wrapped 0 and 1 ;;@ (spec (sig (args op, t, a, b) (ret)) -;;@ (assertions (if (= (op) (1i64:bv)) { -;;@ (= (ret) (& (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (assertions (= (ret) (if (= (op) (1i64:bv)) { +;;@ (& (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { ;;@ (if (= (op) (0i64:bv)) { -;;@ (= (ret) (| (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (| (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { -;;@ (= (ret) (0i64:bv)) +;;@ (conv_to (t) (0i64:bv)) ;;@ }) -;;@ }) +;;@ })) ;;@ )) (decl alu_rs_imm_logic_commutative (ALUOp Type Value Value) Reg) (extern constructor alu_rs_imm_logic_commutative alu_rs_imm_logic_commutative) diff --git a/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_32_bor.isle b/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_32_bor.isle index 08ae4ea2cde8..d7dab33933ed 100644 --- a/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_32_bor.isle +++ b/cranelift/isle/veri/veri_engine/examples/broken/broken_fits_in_32_bor.isle @@ -55,16 +55,17 @@ (SbcS) )) +;; BROKEN: swapped 0 and 1 ;;@ (spec (sig (args op, t, a, b) (ret)) -;;@ (assertions (if (= (op) (2i64:bv)) { -;;@ (= (ret) (& (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (assertions (= (ret) (if (= (op) (1i64:bv)) { +;;@ (& (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { -;;@ (if (= (op) (3i64:bv)) { -;;@ (= (ret) (| (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (if (= (op) (0i64:bv)) { +;;@ (| (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { -;;@ (= (ret) (0i64:bv)) +;;@ (conv_to (t) (0i64:bv)) ;;@ }) -;;@ }) +;;@ })) ;;@ )) (decl alu_rs_imm_logic_commutative (ALUOp Type Value Value) Reg) (extern constructor alu_rs_imm_logic_commutative alu_rs_imm_logic_commutative) diff --git a/cranelift/isle/veri/veri_engine/examples/broken/broken_mask_small_rotr.isle b/cranelift/isle/veri/veri_engine/examples/broken/broken_mask_small_rotr.isle index 48a6608a249c..13005eef426b 100644 --- a/cranelift/isle/veri/veri_engine/examples/broken/broken_mask_small_rotr.isle +++ b/cranelift/isle/veri/veri_engine/examples/broken/broken_mask_small_rotr.isle @@ -49,13 +49,19 @@ (decl rotr_mask (Type) ImmLogic) (extern constructor rotr_mask rotr_mask) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (- (reg) (conv_to (widthof (ret)) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff + ;;@ (spec (sig (args ty, x, y) (ret)) + ;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) + ;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) + ;;@ (= (extract 2 0 (y)) (0i3:bv)) + ;;@ )), + ;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) + ;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (extern constructor sub_imm sub_imm) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (ret) (zero_ext (12) (arg))))) +;;@ (assertions (= (ret) (zero_ext (24) (arg))))) (decl u8_into_imm12 (u8) Imm12) (extern constructor u8_into_imm12 u8_into_imm12) diff --git a/cranelift/isle/veri/veri_engine/examples/broken/broken_rule_or_small_rotr.isle b/cranelift/isle/veri/veri_engine/examples/broken/broken_rule_or_small_rotr.isle index bb509ee523cf..445e685daf7a 100644 --- a/cranelift/isle/veri/veri_engine/examples/broken/broken_rule_or_small_rotr.isle +++ b/cranelift/isle/veri/veri_engine/examples/broken/broken_rule_or_small_rotr.isle @@ -48,13 +48,19 @@ (decl rotr_mask (Type) ImmLogic) (extern constructor rotr_mask rotr_mask) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (- (reg) (conv_to (widthof (ret)) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (extern constructor sub_imm sub_imm) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (ret) (zero_ext (12) (arg))))) +;;@ (assertions (= (ret) (zero_ext (24) (arg))))) (decl u8_into_imm12 (u8) Imm12) (extern constructor u8_into_imm12 u8_into_imm12) diff --git a/cranelift/isle/veri/veri_engine/examples/broken/cls/broken_cls16.isle b/cranelift/isle/veri/veri_engine/examples/broken/cls/broken_cls16.isle index d1ee4fca8255..57220845edd2 100644 --- a/cranelift/isle/veri/veri_engine/examples/broken/cls/broken_cls16.isle +++ b/cranelift/isle/veri/veri_engine/examples/broken/cls/broken_cls16.isle @@ -32,8 +32,14 @@ (decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) (extern constructor alu_rr_imm12 alu_rr_imm12) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (-(reg) (sign_ext (regwidth) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) @@ -72,7 +78,7 @@ (rule (put_in_reg_zext32 val @ (value_type $I64)) val) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (ret) (zero_ext (12) (arg))))) +;;@ (assertions (= (ret) (zero_ext (24) (arg))))) (decl u8_into_imm12 (u8) Imm12) (extern constructor u8_into_imm12 u8_into_imm12) diff --git a/cranelift/isle/veri/veri_engine/examples/broken/cls/broken_cls8.isle b/cranelift/isle/veri/veri_engine/examples/broken/cls/broken_cls8.isle index e45ccc4352d8..2722ff0697ee 100644 --- a/cranelift/isle/veri/veri_engine/examples/broken/cls/broken_cls8.isle +++ b/cranelift/isle/veri/veri_engine/examples/broken/cls/broken_cls8.isle @@ -32,8 +32,14 @@ (decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) (extern constructor alu_rr_imm12 alu_rr_imm12) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (-(reg) (sign_ext (regwidth) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) @@ -72,7 +78,7 @@ (rule (put_in_reg_zext32 val @ (value_type $I64)) val) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (ret) (zero_ext (12) (arg))))) +;;@ (assertions (= (ret) (zero_ext (24) (arg))))) (decl u8_into_imm12 (u8) Imm12) (extern constructor u8_into_imm12 u8_into_imm12) diff --git a/cranelift/isle/veri/veri_engine/examples/broken/clz/broken_clz16.isle b/cranelift/isle/veri/veri_engine/examples/broken/clz/broken_clz16.isle index 8cb131d58f83..80b5f798d1fe 100644 --- a/cranelift/isle/veri/veri_engine/examples/broken/clz/broken_clz16.isle +++ b/cranelift/isle/veri/veri_engine/examples/broken/clz/broken_clz16.isle @@ -32,8 +32,14 @@ (decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) (extern constructor alu_rr_imm12 alu_rr_imm12) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (-(reg) (sign_ext (regwidth) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) @@ -72,7 +78,7 @@ (rule (put_in_reg_zext32 val @ (value_type $I64)) val) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (ret) (zero_ext (12) (arg))))) +;;@ (assertions (= (ret) (zero_ext (24) (arg))))) (decl u8_into_imm12 (u8) Imm12) (extern constructor u8_into_imm12 u8_into_imm12) diff --git a/cranelift/isle/veri/veri_engine/examples/broken/clz/broken_clz8.isle b/cranelift/isle/veri/veri_engine/examples/broken/clz/broken_clz8.isle index d96cd799561b..cacea85ca17e 100644 --- a/cranelift/isle/veri/veri_engine/examples/broken/clz/broken_clz8.isle +++ b/cranelift/isle/veri/veri_engine/examples/broken/clz/broken_clz8.isle @@ -32,8 +32,14 @@ (decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) (extern constructor alu_rr_imm12 alu_rr_imm12) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (-(reg) (sign_ext (regwidth) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) @@ -72,7 +78,7 @@ (rule (put_in_reg_zext32 val @ (value_type $I64)) val) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (ret) (zero_ext (12) (arg))))) +;;@ (assertions (= (ret) (zero_ext (24) (arg))))) (decl u8_into_imm12 (u8) Imm12) (extern constructor u8_into_imm12 u8_into_imm12) diff --git a/cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12.isle b/cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12.isle new file mode 100644 index 000000000000..bddb1033f0b5 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12.isle @@ -0,0 +1,44 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst + (enum +)) + +;; We will represent this with a msb shift bit +;; and a 12 bit value +(type Imm12 (primitive Imm12)) + +(type ALUOp + (enum + (Add) +)) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) +(decl add_imm (Type Reg Imm12) Reg) +(rule (add_imm ty x y) (alu_rr_imm12 (ALUOp.Add) ty x y)) + +(decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) +(extern constructor alu_rr_imm12 alu_rr_imm12) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (|| (<= (bv2int (arg)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (arg)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (arg)) (0i3:bv)) +;;@ )), +;;@ (= (arg) (conv_to (widthof (arg)) (ret))) +;;@ )) +(decl imm12_from_value (Imm12) Value) +(extern extractor imm12_from_value imm12_from_value) + +(rule (lower (has_type (fits_in_64 ty) (iadd x (imm12_from_value y)))) + (add_imm ty x y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12_2.isle b/cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12_2.isle new file mode 100644 index 000000000000..1168c5d36f59 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12_2.isle @@ -0,0 +1,45 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst + (enum +)) + +;; We will represent this with a msb shift bit +;; and a 12 bit value +(type Imm12 (primitive Imm12)) + +(type ALUOp + (enum + (Add) +)) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (+ (x) (zero_ext (regwidth) (y)))) +;;@ )) +(decl add_imm (Type Reg Imm12) Reg) +(rule (add_imm ty x y) (alu_rr_imm12 (ALUOp.Add) ty x y)) + +(decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) +(extern constructor alu_rr_imm12 alu_rr_imm12) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (|| (<= (bv2int (arg)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (arg)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (arg)) (0i3:bv)) +;;@ )), +;;@ (= (-(arg)) (conv_to (widthof (arg)) (ret))) +;;@ )) +(decl imm12_from_value (Imm12) Value) +(extern extractor imm12_from_value imm12_from_value) + +(rule (lower (has_type (fits_in_64 ty) (iadd (imm12_from_value x) y))) + (add_imm ty y x)) + diff --git a/cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12neg.isle b/cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12neg.isle new file mode 100644 index 000000000000..cac354226633 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12neg.isle @@ -0,0 +1,44 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst + (enum +)) + +;; We will represent this with a msb shift bit +;; and a 12 bit value +(type Imm12 (primitive Imm12)) + +(type ALUOp + (enum + (Sub) +)) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) +(decl sub_imm (Type Reg Imm12) Reg) +(rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) + +(decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) +(extern constructor alu_rr_imm12 alu_rr_imm12) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (|| (<= (bv2int (arg)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (arg)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (arg)) (0i3:bv)) +;;@ )), +;;@ (= (arg) (conv_to (widthof (arg)) (ret))) +;;@ )) +(decl imm12_from_negated_value (Imm12) Value) +(extern extractor imm12_from_negated_value imm12_from_negated_value) + +(rule (lower (has_type (fits_in_64 ty) (iadd x (imm12_from_negated_value y)))) + (sub_imm ty x y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12neg2.isle b/cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12neg2.isle new file mode 100644 index 000000000000..99d1602edb2b --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/broken/iadd/broken_imm12neg2.isle @@ -0,0 +1,44 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst + (enum +)) + +;; We will represent this with a msb shift bit +;; and a 12 bit value +(type Imm12 (primitive Imm12)) + +(type ALUOp + (enum + (Add) +)) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (+ (x) (zero_ext (regwidth) (y)))) +;;@ )) +(decl add_imm (Type Reg Imm12) Reg) +(rule (add_imm ty x y) (alu_rr_imm12 (ALUOp.Add) ty x y)) + +(decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) +(extern constructor alu_rr_imm12 alu_rr_imm12) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (|| (<= (bv2int (arg)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (arg)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (arg)) (0i3:bv)) +;;@ )), +;;@ (= (-(arg)) (conv_to (widthof (arg)) (ret))) +;;@ )) +(decl imm12_from_negated_value (Imm12) Value) +(extern extractor imm12_from_negated_value imm12_from_negated_value) + +(rule (lower (has_type (fits_in_64 ty) (iadd (imm12_from_negated_value x) y))) + (add_imm ty y x)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/broken/isub/broken_base_case.isle b/cranelift/isle/veri/veri_engine/examples/broken/isub/broken_base_case.isle index 2df29b359181..08b88cb91f32 100644 --- a/cranelift/isle/veri/veri_engine/examples/broken/isub/broken_base_case.isle +++ b/cranelift/isle/veri/veri_engine/examples/broken/isub/broken_base_case.isle @@ -2,31 +2,15 @@ ;;@ (assertions (= (arg) (ret)))) (decl lower (Inst) InstOutput) -;; Instruction formats. (type MInst (enum - ;; An ALU operation with two register sources and a register destination. - (AluRRR - (alu_op ALUOp) - (size OperandSize) -))) +)) -;; An ALU operation. This can be paired with several instruction formats -;; below (see `Inst`) in any combination. (type ALUOp (enum (Sub) )) -(type OperandSize extern - (enum Size32 - Size64)) - -;; Helper for calculating the `OperandSize` corresponding to a type -(decl operand_size (Type) OperandSize) -(rule (operand_size (fits_in_32 _ty)) (OperandSize.Size32)) -(rule (operand_size (fits_in_64 _ty)) (OperandSize.Size64)) - ;;@ (spec (sig (args ty, a, b) (r)) ;;@ (assertions (= (- (a) (b)) (r)))) (decl sub (Type Reg Reg) Reg) diff --git a/cranelift/isle/veri/veri_engine/examples/broken/isub/broken_imm12.isle b/cranelift/isle/veri/veri_engine/examples/broken/isub/broken_imm12.isle new file mode 100644 index 000000000000..e007bc9b30c8 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/broken/isub/broken_imm12.isle @@ -0,0 +1,44 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst + (enum +)) + +;; We will represent this with a msb shift bit +;; and a 12 bit value +(type Imm12 (primitive Imm12)) + +(type ALUOp + (enum + (Sub) +)) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (+ (x) (zero_ext (regwidth) (y)))) +;;@ )) +(decl sub_imm (Type Reg Imm12) Reg) +(rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) + +(decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) +(extern constructor alu_rr_imm12 alu_rr_imm12) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (|| (<= (bv2int (arg)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (arg)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (arg)) (0i3:bv)) +;;@ )), +;;@ (= (arg) (conv_to (widthof (arg)) (ret))) +;;@ )) +(decl imm12_from_value (Imm12) Value) +(extern extractor imm12_from_value imm12_from_value) + +(rule 0 (lower (has_type (fits_in_64 ty) (isub x (imm12_from_value y)))) + (sub_imm ty x y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/broken/isub/broken_imm12neg.isle b/cranelift/isle/veri/veri_engine/examples/broken/isub/broken_imm12neg.isle new file mode 100644 index 000000000000..cac354226633 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/broken/isub/broken_imm12neg.isle @@ -0,0 +1,44 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst + (enum +)) + +;; We will represent this with a msb shift bit +;; and a 12 bit value +(type Imm12 (primitive Imm12)) + +(type ALUOp + (enum + (Sub) +)) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) +(decl sub_imm (Type Reg Imm12) Reg) +(rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) + +(decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) +(extern constructor alu_rr_imm12 alu_rr_imm12) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (|| (<= (bv2int (arg)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (arg)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (arg)) (0i3:bv)) +;;@ )), +;;@ (= (arg) (conv_to (widthof (arg)) (ret))) +;;@ )) +(decl imm12_from_negated_value (Imm12) Value) +(extern extractor imm12_from_negated_value imm12_from_negated_value) + +(rule (lower (has_type (fits_in_64 ty) (iadd x (imm12_from_negated_value y)))) + (sub_imm ty x y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/broken/isub/broken_shift.isle b/cranelift/isle/veri/veri_engine/examples/broken/isub/broken_shift.isle new file mode 100644 index 000000000000..618bf440e2ec --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/broken/isub/broken_shift.isle @@ -0,0 +1,58 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst + (enum + (AluRRRShift + (shiftop ShiftOpAndAmt)) +)) + +;; ASSUMING 64 BIT MODE!!! +;; annotations will interpret this as an 8 bit field +;; the two msb encode the type of shift as follows: +;; 00: lsl +;; 01: lsr +;; 10: asr +;; 11: invalid +;; the rest will encode a 6-bit shift amount +(type ShiftOpAndAmt (primitive ShiftOpAndAmt)) + +(type ALUOp + (enum + (Sub) +)) + +(decl alu_rrr_shift (ALUOp Type Reg Reg ShiftOpAndAmt) Reg) +(extern constructor alu_rrr_shift alu_rrr_shift) + +;; Note that 192 = 0xc0 +;;@ (spec (sig (args ty, a, b, shift) (ret)) +;;@ (assertions (if (= (& (shift) (192i8:bv)) (0i8:bv)) { +;;@ (= (ret) (- (a) (shl (b) (zero_ext (widthof (b)) (extract 5 0 (shift)))))) +;;@ } else { +;;@ (if (= (& (shift) (192i8:bv)) (64i8:bv)) { +;;@ (= (ret) (- (a) (shr (b) (zero_ext (widthof (b)) (extract 5 0 (shift)))))) +;;@ } else { +;;@ (if (= (& (shift) (192i8:bv)) (128i8:bv)) { +;;@ (= (ret) (- (a) (ashr (b) (zero_ext (widthof (b)) (extract 5 0 (shift)))))) +;;@ } else { +;;@ (= (true) (false)) +;;@ }) +;;@ }) +;;@ }) +;;@ )) +(decl sub_shift (Type Reg Reg ShiftOpAndAmt) Reg) +(rule (sub_shift ty x y z) (alu_rrr_shift (ALUOp.Sub) ty x y z)) + +;; Note that 192 = 0xc0 +;;@ (spec (sig (args ty, a) (ret)) +;;@ (assertions (= (& (a) (192i64:bv)) (1i64:bv)), +;;@ (= (ret) (extract 7 0 (a))))) +(decl pure lshl_from_imm64 (Type Imm64) ShiftOpAndAmt) +(extern constructor lshl_from_imm64 lshl_from_imm64) + +(rule -3 (lower (has_type (fits_in_64 ty) + (isub x (ishl y (iconst k))))) + (if-let amt (lshl_from_imm64 ty k)) + (sub_shift ty x y amt)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/bxor/64_bxor.isle b/cranelift/isle/veri/veri_engine/examples/bxor/64_bxor.isle index 6364a38109de..9b90a41f2cc9 100644 --- a/cranelift/isle/veri/veri_engine/examples/bxor/64_bxor.isle +++ b/cranelift/isle/veri/veri_engine/examples/bxor/64_bxor.isle @@ -60,19 +60,19 @@ )) ;;@ (spec (sig (args op, t, a, b) (ret)) -;;@ (assertions (if (= (op) (0i64:bv)) { -;;@ (= (ret) (& (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (assertions (= (ret) (if (= (op) (0i64:bv)) { +;;@ (& (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { ;;@ (if (= (op) (1i64:bv)) { -;;@ (= (ret) (| (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (| (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { ;;@ (if (= (op) (2i64:bv)) { -;;@ (= (ret) (xor (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (xor (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { -;;@ (= (ret) (0i64:bv)) +;;@ (conv_to (t) (0i64:bv)) ;;@ }) ;;@ }) -;;@ }) +;;@ })) ;;@ )) (decl alu_rs_imm_logic_commutative (ALUOp Type Value Value) Reg) (extern constructor alu_rs_imm_logic_commutative alu_rs_imm_logic_commutative) diff --git a/cranelift/isle/veri/veri_engine/examples/bxor/fits_in_32_bxor.isle b/cranelift/isle/veri/veri_engine/examples/bxor/fits_in_32_bxor.isle index ae032a4b228c..c0450e47ebde 100644 --- a/cranelift/isle/veri/veri_engine/examples/bxor/fits_in_32_bxor.isle +++ b/cranelift/isle/veri/veri_engine/examples/bxor/fits_in_32_bxor.isle @@ -60,19 +60,19 @@ )) ;;@ (spec (sig (args op, t, a, b) (ret)) -;;@ (assertions (if (= (op) (0i64:bv)) { -;;@ (= (ret) (& (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (assertions (= (ret) (if (= (op) (0i64:bv)) { +;;@ (& (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { ;;@ (if (= (op) (1i64:bv)) { -;;@ (= (ret) (| (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (| (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { ;;@ (if (= (op) (2i64:bv)) { -;;@ (= (ret) (xor (conv_to (t) (a)) (conv_to (t) (b)))) +;;@ (xor (conv_to (t) (a)) (conv_to (t) (b))) ;;@ } else { -;;@ (= (ret) (0i64:bv)) +;;@ (conv_to (t) (0i64:bv)) ;;@ }) ;;@ }) -;;@ }) +;;@ })) ;;@ )) (decl alu_rs_imm_logic_commutative (ALUOp Type Value Value) Reg) (extern constructor alu_rs_imm_logic_commutative alu_rs_imm_logic_commutative) diff --git a/cranelift/isle/veri/veri_engine/examples/cls/cls16.isle b/cranelift/isle/veri/veri_engine/examples/cls/cls16.isle index 4e296476f7f6..4dd3fa790966 100644 --- a/cranelift/isle/veri/veri_engine/examples/cls/cls16.isle +++ b/cranelift/isle/veri/veri_engine/examples/cls/cls16.isle @@ -32,8 +32,14 @@ (decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) (extern constructor alu_rr_imm12 alu_rr_imm12) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (-(reg) (sign_ext (regwidth) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) @@ -72,7 +78,7 @@ (rule (put_in_reg_sext32 val @ (value_type $I64)) val) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (ret) (zero_ext (12) (arg))))) +;;@ (assertions (= (ret) (zero_ext (24) (arg))))) (decl u8_into_imm12 (u8) Imm12) (extern constructor u8_into_imm12 u8_into_imm12) diff --git a/cranelift/isle/veri/veri_engine/examples/cls/cls8.isle b/cranelift/isle/veri/veri_engine/examples/cls/cls8.isle index 4fbaf047307d..44ee51ca2b21 100644 --- a/cranelift/isle/veri/veri_engine/examples/cls/cls8.isle +++ b/cranelift/isle/veri/veri_engine/examples/cls/cls8.isle @@ -32,8 +32,14 @@ (decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) (extern constructor alu_rr_imm12 alu_rr_imm12) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (-(reg) (sign_ext (regwidth) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) @@ -72,7 +78,7 @@ (rule (put_in_reg_sext32 val @ (value_type $I64)) val) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (ret) (zero_ext (12) (arg))))) +;;@ (assertions (= (ret) (zero_ext (24) (arg))))) (decl u8_into_imm12 (u8) Imm12) (extern constructor u8_into_imm12 u8_into_imm12) diff --git a/cranelift/isle/veri/veri_engine/examples/clz/clz16.isle b/cranelift/isle/veri/veri_engine/examples/clz/clz16.isle index beaca95ea52b..d16879a870c6 100644 --- a/cranelift/isle/veri/veri_engine/examples/clz/clz16.isle +++ b/cranelift/isle/veri/veri_engine/examples/clz/clz16.isle @@ -32,8 +32,14 @@ (decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) (extern constructor alu_rr_imm12 alu_rr_imm12) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (-(reg) (sign_ext (regwidth) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) @@ -72,7 +78,7 @@ (rule (put_in_reg_zext32 val @ (value_type $I64)) val) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (ret) (zero_ext (12) (arg))))) +;;@ (assertions (= (ret) (zero_ext (24) (arg))))) (decl u8_into_imm12 (u8) Imm12) (extern constructor u8_into_imm12 u8_into_imm12) diff --git a/cranelift/isle/veri/veri_engine/examples/clz/clz8.isle b/cranelift/isle/veri/veri_engine/examples/clz/clz8.isle index ae3ae26274e8..a198e678d3f0 100644 --- a/cranelift/isle/veri/veri_engine/examples/clz/clz8.isle +++ b/cranelift/isle/veri/veri_engine/examples/clz/clz8.isle @@ -32,8 +32,14 @@ (decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) (extern constructor alu_rr_imm12 alu_rr_imm12) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (-(reg) (sign_ext (regwidth) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) @@ -72,7 +78,7 @@ (rule (put_in_reg_zext32 val @ (value_type $I64)) val) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (ret) (zero_ext (12) (arg))))) +;;@ (assertions (= (ret) (zero_ext (24) (arg))))) (decl u8_into_imm12 (u8) Imm12) (extern constructor u8_into_imm12 u8_into_imm12) diff --git a/cranelift/isle/veri/veri_engine/examples/iadd/imm12.isle b/cranelift/isle/veri/veri_engine/examples/iadd/imm12.isle new file mode 100644 index 000000000000..cc2254360c00 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/iadd/imm12.isle @@ -0,0 +1,44 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst + (enum +)) + +;; We will represent this with a msb shift bit +;; and a 12 bit value +(type Imm12 (primitive Imm12)) + +(type ALUOp + (enum + (Add) +)) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (+ (x) (zero_ext (regwidth) (y)))) +;;@ )) +(decl add_imm (Type Reg Imm12) Reg) +(rule (add_imm ty x y) (alu_rr_imm12 (ALUOp.Add) ty x y)) + +(decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) +(extern constructor alu_rr_imm12 alu_rr_imm12) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (|| (<= (bv2int (arg)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (arg)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (arg)) (0i3:bv)) +;;@ )), +;;@ (= (arg) (conv_to (widthof (arg)) (ret))) +;;@ )) +(decl imm12_from_value (Imm12) Value) +(extern extractor imm12_from_value imm12_from_value) + +(rule (lower (has_type (fits_in_64 ty) (iadd x (imm12_from_value y)))) + (add_imm ty x y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/iadd/imm12_2.isle b/cranelift/isle/veri/veri_engine/examples/iadd/imm12_2.isle new file mode 100644 index 000000000000..88ce48afca34 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/iadd/imm12_2.isle @@ -0,0 +1,45 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst + (enum +)) + +;; We will represent this with a msb shift bit +;; and a 12 bit value +(type Imm12 (primitive Imm12)) + +(type ALUOp + (enum + (Add) +)) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (+ (x) (zero_ext (regwidth) (y)))) +;;@ )) +(decl add_imm (Type Reg Imm12) Reg) +(rule (add_imm ty x y) (alu_rr_imm12 (ALUOp.Add) ty x y)) + +(decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) +(extern constructor alu_rr_imm12 alu_rr_imm12) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (|| (<= (bv2int (arg)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (arg)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (arg)) (0i3:bv)) +;;@ )), +;;@ (= (arg) (conv_to (widthof (arg)) (ret))) +;;@ )) +(decl imm12_from_value (Imm12) Value) +(extern extractor imm12_from_value imm12_from_value) + +(rule (lower (has_type (fits_in_64 ty) (iadd (imm12_from_value x) y))) + (add_imm ty y x)) + diff --git a/cranelift/isle/veri/veri_engine/examples/iadd/imm12_2_TODO.isle b/cranelift/isle/veri/veri_engine/examples/iadd/imm12_2_TODO.isle deleted file mode 100644 index dd5a7a0bb4ed..000000000000 --- a/cranelift/isle/veri/veri_engine/examples/iadd/imm12_2_TODO.isle +++ /dev/null @@ -1,54 +0,0 @@ -;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (arg) (ret)))) -(decl lower (Inst) InstOutput) - -;; Instruction formats. -(type MInst - (enum - ;; An ALU operation with two register sources and a register destination. - (AluRRR - (alu_op ALUOp) - (size OperandSize) -))) - -(type Imm12 (primitive Imm12)) - -;; An ALU operation. This can be paired with several instruction formats -;; below (see `Inst`) in any combination. -(type ALUOp - (enum - (Add) - (Sub) -)) - -(type OperandSize extern - (enum Size32 - Size64)) - -;; Helper for calculating the `OperandSize` corresponding to a type -(decl operand_size (Type) OperandSize) -(rule (operand_size (fits_in_32 _ty)) (OperandSize.Size32)) -(rule (operand_size (fits_in_64 _ty)) (OperandSize.Size64)) - -;;@ (spec (sig (args ty, a, b) (r)) -;;@ (assertions (= (+ (a) (sign_ext (regwidth) (b))) (r)))) -(decl add_imm (Type Reg Imm12) Reg) -(rule (add_imm ty x y) (alu_rr_imm12 (ALUOp.Add) ty x y)) - -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (-(reg) (sign_ext (regwidth) (imm_arg))) (ret)))) -(decl sub_imm (Type Reg Imm12) Reg) -(rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) - -(decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) -(extern constructor alu_rr_imm12 alu_rr_imm12) - -(decl alu_rrr (ALUOp Type Reg Reg) Reg) -(extern constructor alu_rrr alu_rrr) - -(decl imm12_from_value (Imm12) Value) -(extern extractor imm12_from_value imm12_from_value) - -(rule (lower (has_type (fits_in_64 ty) (iadd (imm12_from_value x) y))) - (add_imm ty y x)) - diff --git a/cranelift/isle/veri/veri_engine/examples/iadd/imm12_TODO.isle b/cranelift/isle/veri/veri_engine/examples/iadd/imm12_TODO.isle deleted file mode 100644 index 505b4fb99e13..000000000000 --- a/cranelift/isle/veri/veri_engine/examples/iadd/imm12_TODO.isle +++ /dev/null @@ -1,46 +0,0 @@ -;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (arg) (ret)))) -(decl lower (Inst) InstOutput) - -;; Instruction formats. -(type MInst - (enum - ;; An ALU operation with two register sources and a register destination. - (AluRRR - (alu_op ALUOp) - (size OperandSize) -))) - -(type Imm12 (primitive Imm12)) - -;; An ALU operation. This can be paired with several instruction formats -;; below (see `Inst`) in any combination. -(type ALUOp - (enum - (Add) -)) - -(type OperandSize extern - (enum Size32 - Size64)) - -;; Helper for calculating the `OperandSize` corresponding to a type -(decl operand_size (Type) OperandSize) -(rule (operand_size (fits_in_32 _ty)) (OperandSize.Size32)) -(rule (operand_size (fits_in_64 _ty)) (OperandSize.Size64)) - -;;@ (spec (sig (args ty, a, b) (r)) -;;@ (assertions (= (+ (a) (sign_ext (regwidth) (b))) (r)))) -(decl add_imm (Type Reg Imm12) Reg) -(rule (add_imm ty x y) (alu_rr_imm12 (ALUOp.Add) ty x y)) - -(decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) -(extern constructor alu_rr_imm12 alu_rr_imm12) - -;;@ (spec (sig (args x) (ret)) -;;@ (assertions (= (x) (ret)))) -(decl imm12_from_value (Imm12) Value) -(extern extractor imm12_from_value imm12_from_value) - -(rule (lower (has_type (fits_in_64 ty) (iadd x (imm12_from_value y)))) - (add_imm ty x y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/iadd/imm12neg.isle b/cranelift/isle/veri/veri_engine/examples/iadd/imm12neg.isle new file mode 100644 index 000000000000..8c6514c341ca --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/iadd/imm12neg.isle @@ -0,0 +1,44 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst + (enum +)) + +;; We will represent this with a msb shift bit +;; and a 12 bit value +(type Imm12 (primitive Imm12)) + +(type ALUOp + (enum + (Sub) +)) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) +(decl sub_imm (Type Reg Imm12) Reg) +(rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) + +(decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) +(extern constructor alu_rr_imm12 alu_rr_imm12) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (|| (<= (bv2int (arg)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (arg)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (arg)) (0i3:bv)) +;;@ )), +;;@ (= (-(arg)) (conv_to (widthof (arg)) (ret))) +;;@ )) +(decl imm12_from_negated_value (Imm12) Value) +(extern extractor imm12_from_negated_value imm12_from_negated_value) + +(rule (lower (has_type (fits_in_64 ty) (iadd x (imm12_from_negated_value y)))) + (sub_imm ty x y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/iadd/imm12neg2.isle b/cranelift/isle/veri/veri_engine/examples/iadd/imm12neg2.isle new file mode 100644 index 000000000000..8d95033c92c6 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/iadd/imm12neg2.isle @@ -0,0 +1,44 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst + (enum +)) + +;; We will represent this with a msb shift bit +;; and a 12 bit value +(type Imm12 (primitive Imm12)) + +(type ALUOp + (enum + (Sub) +)) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) +(decl sub_imm (Type Reg Imm12) Reg) +(rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) + +(decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) +(extern constructor alu_rr_imm12 alu_rr_imm12) + +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (|| (<= (bv2int (arg)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (arg)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (arg)) (0i3:bv)) +;;@ )), +;;@ (= (-(arg)) (conv_to (widthof (arg)) (ret))) +;;@ )) +(decl imm12_from_negated_value (Imm12) Value) +(extern extractor imm12_from_negated_value imm12_from_negated_value) + +(rule (lower (has_type (fits_in_64 ty) (iadd (imm12_from_negated_value x) y))) + (sub_imm ty y x)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/iadd/imm12negated2_TODO.isle b/cranelift/isle/veri/veri_engine/examples/iadd/imm12negated2_TODO.isle deleted file mode 100644 index 04278a94a44a..000000000000 --- a/cranelift/isle/veri/veri_engine/examples/iadd/imm12negated2_TODO.isle +++ /dev/null @@ -1,48 +0,0 @@ -;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (arg) (ret)))) -(decl lower (Inst) InstOutput) - -;; Instruction formats. -(type MInst - (enum - ;; An ALU operation with two register sources and a register destination. - (AluRRR - (alu_op ALUOp) - (size OperandSize) -))) - -(type Imm12 (primitive Imm12)) - -;; An ALU operation. This can be paired with several instruction formats -;; below (see `Inst`) in any combination. -(type ALUOp - (enum - (Add) - (Sub) -)) - -(type OperandSize extern - (enum Size32 - Size64)) - -;; Helper for calculating the `OperandSize` corresponding to a type -(decl operand_size (Type) OperandSize) -(rule (operand_size (fits_in_32 _ty)) (OperandSize.Size32)) -(rule (operand_size (fits_in_64 _ty)) (OperandSize.Size64)) - -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (-(reg) (sign_ext (regwidth) (imm_arg))) (ret)))) -(decl sub_imm (Type Reg Imm12) Reg) -(rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) - -(decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) -(extern constructor alu_rr_imm12 alu_rr_imm12) - -(decl alu_rrr (ALUOp Type Reg Reg) Reg) -(extern constructor alu_rrr alu_rrr) - -(decl imm12_from_negated_value (Imm12) Value) -(extern extractor imm12_from_negated_value imm12_from_negated_value) - -(rule (lower (has_type (fits_in_64 ty) (iadd (imm12_from_negated_value x) y))) - (sub_imm ty y x)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/iadd/imm12negated_TODO.isle b/cranelift/isle/veri/veri_engine/examples/iadd/imm12negated_TODO.isle deleted file mode 100644 index fe30d4bb4a21..000000000000 --- a/cranelift/isle/veri/veri_engine/examples/iadd/imm12negated_TODO.isle +++ /dev/null @@ -1,48 +0,0 @@ -;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (arg) (ret)))) -(decl lower (Inst) InstOutput) - -;; Instruction formats. -(type MInst - (enum - ;; An ALU operation with two register sources and a register destination. - (AluRRR - (alu_op ALUOp) - (size OperandSize) -))) - -(type Imm12 (primitive Imm12)) - -;; An ALU operation. This can be paired with several instruction formats -;; below (see `Inst`) in any combination. -(type ALUOp - (enum - (Add) - (Sub) -)) - -(type OperandSize extern - (enum Size32 - Size64)) - -;; Helper for calculating the `OperandSize` corresponding to a type -(decl operand_size (Type) OperandSize) -(rule (operand_size (fits_in_32 _ty)) (OperandSize.Size32)) -(rule (operand_size (fits_in_64 _ty)) (OperandSize.Size64)) - -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (-(reg) (sign_ext (regwidth) (imm_arg))) (ret)))) -(decl sub_imm (Type Reg Imm12) Reg) -(rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) - -(decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) -(extern constructor alu_rr_imm12 alu_rr_imm12) - -(decl alu_rrr (ALUOp Type Reg Reg) Reg) -(extern constructor alu_rrr alu_rrr) - -(decl imm12_from_negated_value (Imm12) Value) -(extern extractor imm12_from_negated_value imm12_from_negated_value) - -(rule (lower (has_type (fits_in_64 ty) (iadd x (imm12_from_negated_value y)))) - (sub_imm ty x y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/imul/imul.isle b/cranelift/isle/veri/veri_engine/examples/imul/imul.isle index 73a2dfff6b90..6bd4eaf960c5 100644 --- a/cranelift/isle/veri/veri_engine/examples/imul/imul.isle +++ b/cranelift/isle/veri/veri_engine/examples/imul/imul.isle @@ -2,35 +2,15 @@ ;;@ (assertions (= (arg) (ret)))) (decl lower (Inst) InstOutput) -;; Instruction formats. (type MInst (enum - ;; An ALU operation with two register sources and a register destination. - (AluRRR - (alu_op ALUOp) - (size OperandSize) -))) - -;; An ALU operation. This can be paired with several instruction formats -;; below (see `Inst`) in any combination. -(type ALUOp - (enum - (Add) )) (type ALUOp3 (enum - ;; Multiply-add (MAdd) )) -(type OperandSize extern - (enum Size32 - Size64)) - -(decl alu_rrr (ALUOp Type Reg Reg) Reg) -(extern constructor alu_rrr alu_rrr) - (decl alu_rrrr (ALUOp3 Type Reg Reg Reg) Reg) (extern constructor alu_rrrr alu_rrrr) @@ -39,17 +19,11 @@ (decl zero_reg () Reg) (extern constructor zero_reg zero_reg) -;; Helper for calculating the `OperandSize` corresponding to a type -(decl operand_size (Type) OperandSize) -(rule (operand_size (fits_in_32 _ty)) (OperandSize.Size32)) -(rule (operand_size (fits_in_64 _ty)) (OperandSize.Size64)) - -;; Helpers for generating `madd` instructions. ;;@ (spec (sig (args ty, a, b, c) (r)) ;;@ (assertions (= (+ (c) (* (a) (b))) (r)))) (decl madd (Type Reg Reg Reg) Reg) (rule (madd ty x y z) (alu_rrrr (ALUOp3.MAdd) ty x y z)) ;; `i64` and smaller. -(rule (lower (has_type (fits_in_64 ty) (imul x y))) +(rule -3 (lower (has_type (fits_in_64 ty) (imul x y))) (madd ty x y (zero_reg))) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/isub/base_case.isle b/cranelift/isle/veri/veri_engine/examples/isub/base_case.isle index 33c320f21b5d..4b962c942314 100644 --- a/cranelift/isle/veri/veri_engine/examples/isub/base_case.isle +++ b/cranelift/isle/veri/veri_engine/examples/isub/base_case.isle @@ -2,31 +2,15 @@ ;;@ (assertions (= (arg) (ret)))) (decl lower (Inst) InstOutput) -;; Instruction formats. (type MInst (enum - ;; An ALU operation with two register sources and a register destination. - (AluRRR - (alu_op ALUOp) - (size OperandSize) -))) +)) -;; An ALU operation. This can be paired with several instruction formats -;; below (see `Inst`) in any combination. (type ALUOp (enum (Sub) )) -(type OperandSize extern - (enum Size32 - Size64)) - -;; Helper for calculating the `OperandSize` corresponding to a type -(decl operand_size (Type) OperandSize) -(rule (operand_size (fits_in_32 _ty)) (OperandSize.Size32)) -(rule (operand_size (fits_in_64 _ty)) (OperandSize.Size64)) - ;;@ (spec (sig (args ty, a, b) (r)) ;;@ (assertions (= (- (a) (b)) (r)))) (decl sub (Type Reg Reg) Reg) @@ -35,5 +19,5 @@ (decl alu_rrr (ALUOp Type Reg Reg) Reg) (extern constructor alu_rrr alu_rrr) -(rule (lower (has_type (fits_in_64 ty) (isub x y))) +(rule -4 (lower (has_type (fits_in_64 ty) (isub x y))) (sub ty x y)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/isub/imm12.isle b/cranelift/isle/veri/veri_engine/examples/isub/imm12.isle index cd598a1e0687..16e19f4f8955 100644 --- a/cranelift/isle/veri/veri_engine/examples/isub/imm12.isle +++ b/cranelift/isle/veri/veri_engine/examples/isub/imm12.isle @@ -2,46 +2,43 @@ ;;@ (assertions (= (arg) (ret)))) (decl lower (Inst) InstOutput) -;; Instruction formats. (type MInst (enum - ;; An ALU operation with two register sources and a register destination. - (AluRRR - (alu_op ALUOp) - (size OperandSize) -))) +)) +;; We will represent this with a msb shift bit +;; and a 12 bit value (type Imm12 (primitive Imm12)) -;; An ALU operation. This can be paired with several instruction formats -;; below (see `Inst`) in any combination. (type ALUOp (enum (Sub) )) -(type OperandSize extern - (enum Size32 - Size64)) - -;; Helper for calculating the `OperandSize` corresponding to a type -(decl operand_size (Type) OperandSize) -(rule (operand_size (fits_in_32 _ty)) (OperandSize.Size32)) -(rule (operand_size (fits_in_64 _ty)) (OperandSize.Size64)) - -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (-(reg) (sign_ext (regwidth) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) (decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) (extern constructor alu_rr_imm12 alu_rr_imm12) -(decl alu_rrr (ALUOp Type Reg Reg) Reg) -(extern constructor alu_rrr alu_rrr) - +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (|| (<= (bv2int (arg)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (arg)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (arg)) (0i3:bv)) +;;@ )), +;;@ (= (arg) (conv_to (widthof (arg)) (ret))) +;;@ )) (decl imm12_from_value (Imm12) Value) (extern extractor imm12_from_value imm12_from_value) -(rule (lower (has_type (fits_in_64 ty) (isub x (imm12_from_value y)))) - (sub_imm ty x y)) \ No newline at end of file +(rule 0 (lower (has_type (fits_in_64 ty) (isub x (imm12_from_value y)))) + (sub_imm ty x y)) diff --git a/cranelift/isle/veri/veri_engine/examples/isub/imm12neg.isle b/cranelift/isle/veri/veri_engine/examples/isub/imm12neg.isle index 93563e669e0a..439fbf76931d 100644 --- a/cranelift/isle/veri/veri_engine/examples/isub/imm12neg.isle +++ b/cranelift/isle/veri/veri_engine/examples/isub/imm12neg.isle @@ -2,60 +2,43 @@ ;;@ (assertions (= (arg) (ret)))) (decl lower (Inst) InstOutput) -;; Instruction formats. (type MInst (enum - ;; An ALU operation with two register sources and a register destination. - (AluRRR - (alu_op ALUOp) - (size OperandSize) -))) +)) +;; We will represent this with a msb shift bit +;; and a 12 bit value (type Imm12 (primitive Imm12)) -;; An ALU operation. This can be paired with several instruction formats -;; below (see `Inst`) in any combination. (type ALUOp (enum (Add) - (Sub) )) -(type OperandSize extern - (enum Size32 - Size64)) - -;; Helper for calculating the `OperandSize` corresponding to a type -(decl operand_size (Type) OperandSize) -(rule (operand_size (fits_in_32 _ty)) (OperandSize.Size32)) -(rule (operand_size (fits_in_64 _ty)) (OperandSize.Size64)) - -;;@ (spec (sig (args ty, a, b) (r)) -;;@ (assertions (= (- (a) (b)) (r)))) -(decl sub (Type Reg Reg) Reg) -(rule (sub ty x y) (alu_rrr (ALUOp.Sub) ty x y)) - -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (-(reg) (sign_ext (regwidth) (imm_arg))) (ret)))) -(decl sub_imm (Type Reg Imm12) Reg) -(rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) - -;;@ (spec (sig (args ty, a, b) (r)) -;;@ (assertions (= (+ (a) (sign_ext (a) (b))) (r)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (+ (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl add_imm (Type Reg Imm12) Reg) (rule (add_imm ty x y) (alu_rr_imm12 (ALUOp.Add) ty x y)) (decl alu_rr_imm12 (ALUOp Type Reg Imm12) Reg) (extern constructor alu_rr_imm12 alu_rr_imm12) -(decl alu_rrr (ALUOp Type Reg Reg) Reg) -(extern constructor alu_rrr alu_rrr) - +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (|| (<= (bv2int (arg)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (arg)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (arg)) (0i3:bv)) +;;@ )), +;;@ (= (-(arg)) (conv_to (widthof (arg)) (ret))) +;;@ )) (decl imm12_from_negated_value (Imm12) Value) (extern extractor imm12_from_negated_value imm12_from_negated_value) -(decl imm12_from_value (Imm12) Value) -(extern extractor imm12_from_value imm12_from_value) - -(rule (lower (has_type (fits_in_64 ty) (isub x (imm12_from_negated_value y)))) - (add_imm ty x y)) \ No newline at end of file +(rule 2 (lower (has_type (fits_in_64 ty) (isub x (imm12_from_negated_value y)))) + (add_imm ty x y)) diff --git a/cranelift/isle/veri/veri_engine/examples/isub/isub.isle b/cranelift/isle/veri/veri_engine/examples/isub/isub.isle index 70ad074f1734..3712fe737c3f 100644 --- a/cranelift/isle/veri/veri_engine/examples/isub/isub.isle +++ b/cranelift/isle/veri/veri_engine/examples/isub/isub.isle @@ -54,8 +54,14 @@ (decl sub (Type Reg Reg) Reg) (rule (sub ty x y) (alu_rrr (ALUOp.Sub) ty x y)) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (-(reg) (sign_ext (regwidth) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (rule (sub_imm ty x y) (alu_rr_imm12 (ALUOp.Sub) ty x y)) diff --git a/cranelift/isle/veri/veri_engine/examples/isub/shift.isle b/cranelift/isle/veri/veri_engine/examples/isub/shift.isle new file mode 100644 index 000000000000..7479c9ca3710 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/isub/shift.isle @@ -0,0 +1,58 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst + (enum + (AluRRRShift + (shiftop ShiftOpAndAmt)) +)) + +;; ASSUMING 64 BIT MODE!!! +;; annotations will interpret this as an 8 bit field +;; the two msb encode the type of shift as follows: +;; 00: lsl +;; 01: lsr +;; 10: asr +;; 11: invalid +;; the rest will encode a 6-bit shift amount +(type ShiftOpAndAmt (primitive ShiftOpAndAmt)) + +(type ALUOp + (enum + (Sub) +)) + +(decl alu_rrr_shift (ALUOp Type Reg Reg ShiftOpAndAmt) Reg) +(extern constructor alu_rrr_shift alu_rrr_shift) + +;; Note that 192 = 0xc0 +;;@ (spec (sig (args ty, a, b, shift) (ret)) +;;@ (assertions (if (= (& (shift) (192i8:bv)) (0i8:bv)) { +;;@ (= (ret) (- (a) (shl (b) (zero_ext (widthof (b)) (extract 5 0 (shift)))))) +;;@ } else { +;;@ (if (= (& (shift) (192i8:bv)) (64i8:bv)) { +;;@ (= (ret) (- (a) (shr (b) (zero_ext (widthof (b)) (extract 5 0 (shift)))))) +;;@ } else { +;;@ (if (= (& (shift) (192i8:bv)) (128i8:bv)) { +;;@ (= (ret) (- (a) (ashr (b) (zero_ext (widthof (b)) (extract 5 0 (shift)))))) +;;@ } else { +;;@ (= (true) (false)) +;;@ }) +;;@ }) +;;@ }) +;;@ )) +(decl sub_shift (Type Reg Reg ShiftOpAndAmt) Reg) +(rule (sub_shift ty x y z) (alu_rrr_shift (ALUOp.Sub) ty x y z)) + +;; Note that 192 = 0xc0 +;;@ (spec (sig (args ty, a) (ret)) +;;@ (assertions (= (& (a) (192i64:bv)) (0i64:bv)), +;;@ (= (ret) (extract 7 0 (a))))) +(decl pure lshl_from_imm64 (Type Imm64) ShiftOpAndAmt) +(extern constructor lshl_from_imm64 lshl_from_imm64) + +(rule -3 (lower (has_type (fits_in_64 ty) + (isub x (ishl y (iconst k))))) + (if-let amt (lshl_from_imm64 ty k)) + (sub_shift ty x y amt)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/rotl/32_with_imm_rotl_to_rotr.isle b/cranelift/isle/veri/veri_engine/examples/rotl/32_with_imm_rotl_to_rotr.isle index 264610f462f0..59b006481ee7 100644 --- a/cranelift/isle/veri/veri_engine/examples/rotl/32_with_imm_rotl_to_rotr.isle +++ b/cranelift/isle/veri/veri_engine/examples/rotl/32_with_imm_rotl_to_rotr.isle @@ -38,7 +38,7 @@ ;;@ (spec (sig (args ty, x) (r)) ;;@ (assertions ;;@ (= (r) (conv_to (widthof (r)) (x))), -;;@ (= (0i65:bv) (& (x) (~ (63i64:bv)))) +;;@ (= (0i64:bv) (& (x) (~ (63i64:bv)))) ;;@ ) ;;@ ) (decl pure imm_shift_from_imm64 (Type Imm64) ImmShift) diff --git a/cranelift/isle/veri/veri_engine/examples/rotl/64_with_imm_rotl_to_rotr.isle b/cranelift/isle/veri/veri_engine/examples/rotl/64_with_imm_rotl_to_rotr.isle index 647c66fe21fe..4776f931792f 100644 --- a/cranelift/isle/veri/veri_engine/examples/rotl/64_with_imm_rotl_to_rotr.isle +++ b/cranelift/isle/veri/veri_engine/examples/rotl/64_with_imm_rotl_to_rotr.isle @@ -35,13 +35,13 @@ ;; } ;; (= (conv_to (widthof (r)) (& (x) (- (int2bv 64 (ty)) (1i64:bv)))) (r)), -;; (= (0i65:bv) (& (& (x) (- (int2bv 64 (ty)) (1i64:bv))) (~ (63i64:bv)))) +;; (= (0i64:bv) (& (& (x) (- (int2bv 64 (ty)) (1i64:bv))) (~ (63i64:bv)))) ;; Add an assertion that the value fits, using the constand with 56 1's then 6 0's (~63) ;;@ (spec (sig (args ty, x) (r)) ;;@ (assertions ;;@ (= (r) (conv_to (widthof (r)) (x))), -;;@ (= (0i65:bv) (& (x) (~ (63i64:bv)))) +;;@ (= (0i64:bv) (& (x) (~ (63i64:bv)))) ;;@ ) ;;@ ) (decl pure imm_shift_from_imm64 (Type Imm64) ImmShift) diff --git a/cranelift/isle/veri/veri_engine/examples/rotl/fits_in_16_rotl_to_rotr.isle b/cranelift/isle/veri/veri_engine/examples/rotl/fits_in_16_rotl_to_rotr.isle index 128d3cbf08f0..4d1a8f60ceba 100644 --- a/cranelift/isle/veri/veri_engine/examples/rotl/fits_in_16_rotl_to_rotr.isle +++ b/cranelift/isle/veri/veri_engine/examples/rotl/fits_in_16_rotl_to_rotr.isle @@ -46,13 +46,19 @@ (decl rotr_mask (Type) ImmLogic) (extern constructor rotr_mask rotr_mask) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (- (reg) (conv_to (widthof (ret)) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (extern constructor sub_imm sub_imm) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (ret) (zero_ext (12) (arg))))) +;;@ (assertions (= (ret) (zero_ext (24) (arg))))) (decl u8_into_imm12 (u8) Imm12) (extern constructor u8_into_imm12 u8_into_imm12) diff --git a/cranelift/isle/veri/veri_engine/examples/rotl/fits_in_16_with_imm_rotl_to_rotr.isle b/cranelift/isle/veri/veri_engine/examples/rotl/fits_in_16_with_imm_rotl_to_rotr.isle index 7805b2c2e0b2..561bc458f195 100644 --- a/cranelift/isle/veri/veri_engine/examples/rotl/fits_in_16_with_imm_rotl_to_rotr.isle +++ b/cranelift/isle/veri/veri_engine/examples/rotl/fits_in_16_with_imm_rotl_to_rotr.isle @@ -37,13 +37,19 @@ (decl put_in_reg_zext32 (Value) Reg) (extern constructor put_in_reg_zext32 put_in_reg_zext32) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (- (reg) (conv_to (widthof (ret)) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (extern constructor sub_imm sub_imm) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (ret) (zero_ext (12) (arg))))) +;;@ (assertions (= (ret) (zero_ext (24) (arg))))) (decl u8_into_imm12 (u8) Imm12) (extern constructor u8_into_imm12 u8_into_imm12) @@ -72,7 +78,7 @@ ;;@ (spec (sig (args ty, x) (r)) ;;@ (assertions ;;@ (= (r) (conv_to (widthof (r)) (x))), -;;@ (= (0i65:bv) (& (x) (~ (63i64:bv)))) +;;@ (= (0i64:bv) (& (x) (~ (63i64:bv)))) ;;@ ) ;;@ ) (decl pure imm_shift_from_imm64 (Type Imm64) ImmShift) diff --git a/cranelift/isle/veri/veri_engine/examples/rotr/32_with_imm_rotr.isle b/cranelift/isle/veri/veri_engine/examples/rotr/32_with_imm_rotr.isle index 1af5f4e99554..d9c6463c0c88 100644 --- a/cranelift/isle/veri/veri_engine/examples/rotr/32_with_imm_rotr.isle +++ b/cranelift/isle/veri/veri_engine/examples/rotr/32_with_imm_rotr.isle @@ -15,7 +15,7 @@ ;;@ (spec (sig (args ty, x) (r)) ;;@ (assertions ;;@ (= (r) (conv_to (widthof (r)) (x))), -;;@ (= (0i65:bv) (& (x) (~ (63i64:bv)))) +;;@ (= (0i64:bv) (& (x) (~ (63i64:bv)))) ;;@ ) ;;@ ) (decl pure imm_shift_from_imm64 (Type Imm64) ImmShift) diff --git a/cranelift/isle/veri/veri_engine/examples/rotr/64_with_imm_rotr.isle b/cranelift/isle/veri/veri_engine/examples/rotr/64_with_imm_rotr.isle index 917880d524f8..d21e2e3bf53f 100644 --- a/cranelift/isle/veri/veri_engine/examples/rotr/64_with_imm_rotr.isle +++ b/cranelift/isle/veri/veri_engine/examples/rotr/64_with_imm_rotr.isle @@ -15,7 +15,7 @@ ;;@ (spec (sig (args ty, x) (r)) ;;@ (assertions ;;@ (= (r) (conv_to (widthof (r)) (x))), -;;@ (= (0i65:bv) (& (x) (~ (63i64:bv)))) +;;@ (= (0i64:bv) (& (x) (~ (63i64:bv)))) ;;@ ) ;;@ ) (decl pure imm_shift_from_imm64 (Type Imm64) ImmShift) diff --git a/cranelift/isle/veri/veri_engine/examples/rotr/fits_in_16_with_imm_rotr.isle b/cranelift/isle/veri/veri_engine/examples/rotr/fits_in_16_with_imm_rotr.isle index 1aceb98a824b..0ae7f2bb36c7 100644 --- a/cranelift/isle/veri/veri_engine/examples/rotr/fits_in_16_with_imm_rotr.isle +++ b/cranelift/isle/veri/veri_engine/examples/rotr/fits_in_16_with_imm_rotr.isle @@ -15,7 +15,7 @@ ;;@ (spec (sig (args ty, x) (r)) ;;@ (assertions ;;@ (= (r) (conv_to (widthof (r)) (x))), -;;@ (= (0i65:bv) (& (x) (~ (63i64:bv)))) +;;@ (= (0i64:bv) (& (x) (~ (63i64:bv)))) ;;@ ) ;;@ ) (decl pure imm_shift_from_imm64 (Type Imm64) ImmShift) diff --git a/cranelift/isle/veri/veri_engine/examples/rotr/small_rotr_to_shifts.isle b/cranelift/isle/veri/veri_engine/examples/rotr/small_rotr_to_shifts.isle index ccfe21f8351c..de58cd3cb415 100644 --- a/cranelift/isle/veri/veri_engine/examples/rotr/small_rotr_to_shifts.isle +++ b/cranelift/isle/veri/veri_engine/examples/rotr/small_rotr_to_shifts.isle @@ -42,13 +42,19 @@ (decl rotr_mask (Type) ImmLogic) (extern constructor rotr_mask rotr_mask) -;;@ (spec (sig (args ty, reg, imm_arg) (ret)) -;;@ (assertions (= (- (reg) (conv_to (widthof (ret)) (imm_arg))) (ret)))) +;; Note that 4094 = 0xffe and 16773119 = 0xffefff +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (|| (<= (bv2int (y)) (4094i0:isleType)) +;;@ (&& (<= (bv2int (y)) (16773119i0:isleType)) +;;@ (= (extract 2 0 (y)) (0i3:bv)) +;;@ )), +;;@ (= (ret) (- (x) (zero_ext (regwidth) (y)))) +;;@ )) (decl sub_imm (Type Reg Imm12) Reg) (extern constructor sub_imm sub_imm) ;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (ret) (zero_ext (12) (arg))))) +;;@ (assertions (= (ret) (zero_ext (24) (arg))))) (decl u8_into_imm12 (u8) Imm12) (extern constructor u8_into_imm12 u8_into_imm12) diff --git a/cranelift/isle/veri/veri_engine/src/main.rs b/cranelift/isle/veri/veri_engine/src/main.rs index 8d37ec5ad53d..28f35d8c9295 100644 --- a/cranelift/isle/veri/veri_engine/src/main.rs +++ b/cranelift/isle/veri/veri_engine/src/main.rs @@ -10,6 +10,8 @@ use veri_engine_lib::rule_tree::verify_rules_with_lhs_root; use veri_engine_lib::type_inference::type_all_rules; fn main() { + env_logger::init(); + let cur_dir = env::current_dir().expect("Can't access current working directory"); // TODO: clean up path logic diff --git a/cranelift/isle/veri/veri_engine/src/rule_tree.rs b/cranelift/isle/veri/veri_engine/src/rule_tree.rs index 201ae966e7e2..1a0f9de41a0a 100644 --- a/cranelift/isle/veri/veri_engine/src/rule_tree.rs +++ b/cranelift/isle/veri/veri_engine/src/rule_tree.rs @@ -8,7 +8,7 @@ use isle::sema::{Pattern, Rule, RuleId, TermEnv, TermId, TypeEnv}; use itertools::Itertools; use veri_annotation::parser_wrapper::AnnotationEnv; use veri_ir::{ - all_query_widths, BoundVar, RuleSemantics, RulePath, RuleTree, UndefinedTerm, + all_query_widths, BoundVar, RulePath, RuleSemantics, RuleTree, UndefinedTerm, VerificationResult, }; @@ -304,7 +304,7 @@ pub fn verify_rules_for_type_wih_rule_filter( let mut rules_checked = 0; for rule in &termenv.rules { if !filter(&rule, termenv, typeenv) { - println!("skipping rule that doesn't meet filter"); + log::debug!("skipping rule that doesn't meet filter"); continue; } let ctx = Context::new(termenv, typeenv, annotationenv, typesols, width); diff --git a/cranelift/isle/veri/veri_engine/src/solver.rs b/cranelift/isle/veri/veri_engine/src/solver.rs index 81d908b2259d..0b00b288fa20 100644 --- a/cranelift/isle/veri/veri_engine/src/solver.rs +++ b/cranelift/isle/veri/veri_engine/src/solver.rs @@ -1,8 +1,9 @@ /// Convert our internal Verification IR to an external SMT AST and pass /// queries to that solver. /// -/// Right now, this uses the rsmt2 crate. -use rsmt2::Solver; +/// This uses the easy-smt crate to interact with any solver. +use easy_smt::{Response, SExpr}; +use log::debug; use std::collections::{HashMap, HashSet}; use veri_ir::{ BinaryOp, Counterexample, Expr, RuleSemantics, Terminal, Type, TypeContext, UnaryOp, @@ -10,6 +11,7 @@ use veri_ir::{ }; mod encoded_ops; + use encoded_ops::cls; use encoded_ops::clz; use encoded_ops::rev; @@ -17,65 +19,123 @@ use encoded_ops::rev; use crate::REG_WIDTH; pub struct SolverCtx { + smt: easy_smt::Context, tyctx: TypeContext, pub bitwidth: usize, - var_map: HashMap, + var_map: HashMap, width_vars: HashMap, - width_assumptions: Vec, - pub additional_decls: Vec<(String, String)>, - pub additional_assumptions: Vec, + width_assumptions: Vec, + pub additional_decls: Vec<(String, SExpr)>, + pub additional_assumptions: Vec, fresh_bits_idx: usize, } impl SolverCtx { - pub fn new_fresh_bits(&mut self, width: usize) -> String { + pub fn new_fresh_bits(&mut self, width: usize) -> SExpr { let name = format!("fresh{}", self.fresh_bits_idx); self.fresh_bits_idx += 1; self.additional_decls - .push((name.clone(), format!("(_ BitVec {})", width))); - name + .push((name.clone(), self.smt.bit_vec_sort(self.smt.numeral(width)))); + self.smt.atom(name) } - fn new_fresh_int(&mut self) -> String { + fn new_fresh_int(&mut self) -> SExpr { let name = format!("fresh{}", self.fresh_bits_idx); self.fresh_bits_idx += 1; self.additional_decls - .push((name.clone(), "Int".to_string())); - name + .push((name.clone(), self.smt.int_sort())); + self.smt.atom(name) } - fn new_fresh_bool(&mut self) -> String { + fn new_fresh_bool(&mut self) -> SExpr { let name = format!("fresh{}", self.fresh_bits_idx); self.fresh_bits_idx += 1; self.additional_decls - .push((name.clone(), "Bool".to_string())); - name + .push((name.clone(), self.smt.bool_sort())); + self.smt.atom(name) + } + + fn declare(&mut self, name: String, typ: SExpr) -> SExpr { + let atom = self.smt.atom(&name); + self.additional_decls.push((name, typ)); + atom + } + + fn assume(&mut self, expr: SExpr) { + self.additional_assumptions.push(expr); + } + + /// Construct a constant bit-vector value of the given width. (This is used so pervasively that + /// perhaps we should submit it for inclusion in the easy_smt library...) (Also, this is + /// generic because we use it with several integer types, but it probably shouldn't be *this* + /// generic.) + fn bv(&self, value: T, width: usize) -> SExpr { + self.smt.list(vec![ + self.smt.atoms().und, + self.smt.atom(format!("bv{}", value)), + self.smt.numeral(width), + ]) + } + + /// Convert an SMT integer to a bit vector of a given width. + fn int2bv(&self, width: usize, value: SExpr) -> SExpr { + self.smt.list(vec![ + self.smt.list(vec![ + self.smt.atoms().und, + self.smt.atom("int2bv"), + self.smt.numeral(width), + ]), + value, + ]) + } + + /// Convert an SMT bit vector to a nat. + fn bv2nat(&self, value: SExpr) -> SExpr { + self.smt.list(vec![self.smt.atom("bv2nat"), value]) + } + + /// Zero-extend an SMT bit vector to a wider bit vector by adding `padding` zeroes to the + /// front. + fn zero_extend(&self, padding: usize, value: SExpr) -> SExpr { + self.smt.list(vec![ + self.smt.list(vec![ + self.smt.atoms().und, + self.smt.atom("zero_extend"), + self.smt.numeral(padding), + ]), + value, + ]) } // Extend with concrete source and destination sizes. Includes extracting relevant bits. fn extend_concrete( &mut self, dest_width: usize, - source: &String, + source: SExpr, source_width: usize, op: &str, - ) -> String { + ) -> SExpr { if dest_width < source_width { - self.additional_assumptions.push("false".to_string()); - return source.to_string(); + self.additional_assumptions.push(self.smt.false_()); + return source; } let delta = dest_width - source_width; // Extract the relevant bits of the source (which is modeled with a wider, // register-width bitvector). - let extract = format!( - "((_ extract {} 0) {})", - source_width.wrapping_sub(1), - source - ); + let extract = self + .smt + .extract(source_width.wrapping_sub(1).try_into().unwrap(), 0, source); // Do the extend itself. - let extend = format!("((_ {} {}) {})", op, delta, extract); + let extend = self.smt.list(vec![ + self.smt.list(vec![ + self.smt.atoms().und, + self.smt.atom(op), + self.smt.numeral(delta), + ]), + extract, + ]); // Pad the extended result back to the full register bitwidth. Use the bits // that were already in the source register. That is, given: @@ -86,24 +146,30 @@ impl SolverCtx { // dest width // | // OUT: [ same don't care bits | defined extend | care bits ] - let unconstrained_bits = self - .bitwidth - .checked_sub(delta) - .unwrap() - .checked_sub(source_width) - .unwrap(); + let mut unconstrained_bits = 0; + if dest_width < self.bitwidth { + unconstrained_bits = self + .bitwidth + .checked_sub(delta) + .unwrap() + .checked_sub(source_width) + .unwrap(); + } // If we are extending to the full register width, no padding needed if unconstrained_bits == 0 { extend } else { - let padding = format!( - "((_ extract {} {}) {})", - self.bitwidth.checked_sub(1).unwrap(), - self.bitwidth.checked_sub(unconstrained_bits).unwrap(), - source + let padding = self.smt.extract( + self.bitwidth.checked_sub(1).unwrap().try_into().unwrap(), + self.bitwidth + .checked_sub(unconstrained_bits) + .unwrap() + .try_into() + .unwrap(), + source, ); - format!("(concat {} {})", padding, extend) + self.smt.concat(padding, extend) } } @@ -114,21 +180,21 @@ impl SolverCtx { // For safety, we add an assertion that some arm of this ITE must match. fn extend_symbolic( &mut self, - dest_width: &String, - source: &String, - source_width: &String, + dest_width: SExpr, + source: SExpr, + source_width: SExpr, op: &str, - ) -> String { + ) -> SExpr { // Symbolic expression for amount to shift - let shift = format!("(- {} {})", dest_width, source_width); + let shift = self.smt.sub(dest_width, source_width); let mut some_match = vec![]; let mut ite_str = source.clone(); // Special case: if we are asked to extend by 0, just return the source - let matching = format!("(and (= 0 {}))", shift); + let matching = self.smt.eq(self.smt.numeral(0), shift); some_match.push(matching.clone()); - ite_str = format!("(ite {} {} {})", matching, source, ite_str); + ite_str = self.smt.ite(matching, source, ite_str); // Possible amounts to extend by for possible_delta in 1..self.bitwidth + 1 { @@ -141,9 +207,9 @@ impl SolverCtx { } // Statement meaning the symbolic case matches this concrete case - let matching = format!( - "(and (= {} {}) (= {} {}))", - possible_delta, shift, possible_source, source_width + let matching = self.smt.and( + self.smt.eq(self.smt.numeral(possible_delta), shift), + self.smt.eq(self.smt.numeral(possible_source), source_width), ); some_match.push(matching.clone()); let extend = self.extend_concrete( @@ -152,10 +218,10 @@ impl SolverCtx { possible_source, op, ); - ite_str = format!("(ite {} {} {})", matching, extend, ite_str); + ite_str = self.smt.ite(matching, extend, ite_str); } } - let some_shift_matches = format!("(or {})", some_match.join(" ")); + let some_shift_matches = self.smt.or_many(some_match); self.width_assumptions.push(some_shift_matches); ite_str } @@ -167,18 +233,18 @@ impl SolverCtx { // For safety, we add an assertion that some arm of this ITE must match. fn rotate_symbolic( &mut self, - source: &String, - source_width: &String, - amount: &String, + source: SExpr, + source_width: SExpr, + amount: SExpr, op: &str, - ) -> String { + ) -> SExpr { let mut some_match = vec![]; let mut ite_str = source.clone(); // Special case: if we are asked to rotate by 0, just return the source - let matching = format!("(and (= (_ bv0 {}) {}))", self.bitwidth, amount); + let matching = self.smt.eq(self.bv(0, self.bitwidth), amount); some_match.push(matching.clone()); - ite_str = format!("(ite {} {} {})", matching, source, ite_str); + ite_str = self.smt.ite(matching, source, ite_str); // Possible starting widths for possible_source in 1..self.bitwidth + 1 { @@ -187,22 +253,29 @@ impl SolverCtx { // Possible amounts to rotate by for possible_rotate in 1..possible_source { // Statement meaning the symbolic case matches this concrete case - let matching = format!( - "(and (= (_ bv{} {}) {}) (= {} {}))", - possible_rotate, self.bitwidth, amount, possible_source, source_width + let matching = self.smt.and( + self.smt.eq(self.bv(possible_rotate, self.bitwidth), amount), + self.smt.eq(self.smt.numeral(possible_source), source_width), ); - some_match.push(matching.clone()); + some_match.push(matching); // Extract the relevant bits of the source (which is modeled with a wider, // register-width bitvector). - let extract = format!( - "((_ extract {} 0) {})", - possible_source.checked_sub(1).unwrap(), - source + let extract = self.smt.extract( + possible_source.checked_sub(1).unwrap().try_into().unwrap(), + 0, + source, ); // Do the rotate itself. - let rotate = format!("((_ {} {}) {})", op, possible_rotate, extract); + let rotate = self.smt.list(vec![ + self.smt.list(vec![ + self.smt.atoms().und, + self.smt.atom(op), + self.smt.numeral(possible_rotate), + ]), + extract, + ]); // Pad the extended result back to the full register bitwidth. Use the bits // that were already in the source register. That is, given: @@ -219,18 +292,21 @@ impl SolverCtx { let after_padding = if unconstrained_bits == 0 { rotate } else { - let padding = format!( - "((_ extract {} {}) {})", - self.bitwidth.checked_sub(1).unwrap(), - self.bitwidth.checked_sub(unconstrained_bits).unwrap(), - source + let padding = self.smt.extract( + self.bitwidth.checked_sub(1).unwrap().try_into().unwrap(), + self.bitwidth + .checked_sub(unconstrained_bits) + .unwrap() + .try_into() + .unwrap(), + source, ); - format!("(concat {} {})", padding, rotate) + self.smt.concat(padding, rotate) }; - ite_str = format!("(ite {} {} {})", matching, after_padding, ite_str); + ite_str = self.smt.ite(matching, after_padding, ite_str); } } - let some_shift_matches = format!("(or {})", some_match.join(" ")); + let some_shift_matches = self.smt.or_many(some_match); self.width_assumptions.push(some_shift_matches); ite_str } @@ -239,9 +315,9 @@ impl SolverCtx { &mut self, tyvar: u32, narrow_width: usize, - narrow_decl: String, + narrow_decl: SExpr, name: Option, - ) -> String { + ) -> SExpr { let width = self.bitwidth.checked_sub(narrow_width).unwrap(); if width > 0 { let mut narrow_name = format!("narrow__{}", tyvar); @@ -251,43 +327,50 @@ impl SolverCtx { wide_name = format!("{}_{}", s, wide_name); } self.additional_assumptions - .push(format!("(= {} {})", narrow_name, narrow_decl)); - self.additional_decls - .push((narrow_name.clone(), format!("(_ BitVec {})", narrow_width))); - self.additional_decls - .push((wide_name.clone(), format!("(_ BitVec {})", self.bitwidth))); + .push(self.smt.eq(self.smt.atom(&narrow_name), narrow_decl)); + self.additional_decls.push(( + narrow_name.clone(), + self.smt.bit_vec_sort(self.smt.numeral(narrow_width)), + )); + self.additional_decls.push(( + wide_name.clone(), + self.smt.bit_vec_sort(self.smt.numeral(self.bitwidth)), + )); let padding = self.new_fresh_bits(width); - self.additional_assumptions.push(format!( - "(= {} (concat {} {}))", - wide_name, padding, narrow_name, + self.additional_assumptions.push(self.smt.eq( + self.smt.atom(&wide_name), + self.smt.concat(padding, self.smt.atom(narrow_name)), )); - wide_name + self.smt.atom(wide_name) } else { if let Some(s) = name { // self.additional_decls // .push((s.clone(), format!("(_ BitVec {})", self.bitwidth))); self.additional_assumptions - .push(format!("(= {} {})", s, narrow_decl)); - s + .push(self.smt.eq(self.smt.atom(&s), narrow_decl)); + self.smt.atom(&s) } else { narrow_decl } } } - pub fn get_expr_width_var(&self, e: &Expr) -> Option<&String> { + pub fn get_expr_width_var(&self, e: &Expr) -> Option { if let Some(tyvar) = self.tyctx.tyvars.get(e) { - self.width_vars.get(tyvar) + self.width_vars.get(tyvar).map(|s| self.smt.atom(s)) } else { None } } - pub fn vir_to_rsmt2_constant_ty(&self, ty: &Type) -> String { + pub fn vir_to_smt_ty(&self, ty: &Type) -> SExpr { match ty { - Type::BitVector(w) => format!("(_ BitVec {})", w.unwrap_or(self.bitwidth)), - Type::Int => "Int".to_string(), - Type::Bool => "Bool".to_string(), + Type::BitVector(w) => { + let width = w.unwrap_or(self.bitwidth); + self.smt.bit_vec_sort(self.smt.numeral(width)) + } + Type::Int => self.smt.int_sort(), + Type::Bool => self.smt.bool_sort(), } } @@ -317,12 +400,12 @@ impl SolverCtx { pub fn assume_same_width(&mut self, x: &Expr, y: &Expr) { let xw = self.get_expr_width_var(&x).unwrap().clone(); let yw = self.get_expr_width_var(&y).unwrap().clone(); - self.width_assumptions.push(format!("(= {} {})", xw, yw)); + self.width_assumptions.push(self.smt.eq(xw, yw)); } - pub fn assume_same_width_from_string(&mut self, x: &String, y: &Expr) { + pub fn assume_same_width_from_string(&mut self, x: SExpr, y: &Expr) { let yw = self.get_expr_width_var(&y).unwrap().clone(); - self.width_assumptions.push(format!("(= {} {})", x, yw)); + self.width_assumptions.push(self.smt.eq(x, yw)); } pub fn assume_comparable_types(&mut self, x: &Expr, y: &Expr) { @@ -336,7 +419,7 @@ impl SolverCtx { } } - pub fn vir_expr_to_rsmt2_str(&mut self, e: Expr) -> String { + pub fn vir_expr_to_sexp(&mut self, e: Expr) -> SExpr { let tyvar = self.tyctx.tyvars.get(&e); let ty = self.get_type(&e); let width = self.get_expr_width_var(&e).map(|s| s.clone()); @@ -344,27 +427,27 @@ impl SolverCtx { match e { Expr::Terminal(t) => match t { Terminal::Var(v) => match self.var_map.get(&v) { - Some(o) => o.clone(), - None => v, + Some(o) => *o, + None => self.smt.atom(v), }, Terminal::Const(i, _) => match ty.unwrap() { Type::BitVector(w) => { let var = *tyvar.unwrap(); let width = w.unwrap_or(self.bitwidth); - let narrow_decl = format!("(_ bv{} {})", i, width); + let narrow_decl = self.bv(i, width); self.widen_to_query_width(var, width, narrow_decl, None) } - Type::Int => i.to_string(), + Type::Int => self.smt.numeral(i), Type::Bool => { if i == 0 { - "false".to_string() + self.smt.false_() } else { - "true".to_string() + self.smt.true_() } } }, - Terminal::True => "true".to_string(), - Terminal::False => "false".to_string(), + Terminal::True => self.smt.true_(), + Terminal::False => self.smt.false_(), Terminal::Wildcard(_) => match ty.unwrap() { Type::BitVector(_) => self.new_fresh_bits(self.bitwidth), Type::Int => self.new_fresh_int(), @@ -375,15 +458,16 @@ impl SolverCtx { let op = match op { UnaryOp::Not => "not", UnaryOp::BVNeg => { - self.assume_same_width_from_string(&width.unwrap(), &*arg); + self.assume_same_width_from_string(width.unwrap(), &*arg); "bvneg" } UnaryOp::BVNot => { - self.assume_same_width_from_string(&width.unwrap(), &*arg); + self.assume_same_width_from_string(width.unwrap(), &*arg); "bvnot" } }; - format!("({} {})", op, self.vir_expr_to_rsmt2_str(*arg)) + let subexp = self.vir_expr_to_sexp(*arg); + self.smt.list(vec![self.smt.atom(op), subexp]) } Expr::Binary(op, x, y) => { match op { @@ -397,7 +481,7 @@ impl SolverCtx { | BinaryOp::BVShl | BinaryOp::BVShr | BinaryOp::BVAShr - | BinaryOp::BVRotl => self.assume_same_width_from_string(&width.unwrap(), &*x), + | BinaryOp::BVRotl => self.assume_same_width_from_string(width.unwrap(), &*x), _ => (), }; match op { @@ -409,63 +493,59 @@ impl SolverCtx { match op { BinaryOp::BVRotl => { let arg_width = self.get_expr_width_var(&*x).unwrap().clone(); - let xs = self.vir_expr_to_rsmt2_str(*x); - let ys = self.vir_expr_to_rsmt2_str(*y); - return self.rotate_symbolic(&xs, &arg_width, &ys, "rotate_left"); + let xs = self.vir_expr_to_sexp(*x); + let ys = self.vir_expr_to_sexp(*y); + return self.rotate_symbolic(xs, arg_width, ys, "rotate_left"); // // SMT bitvector rotate_left requires that the rotate amount be // // statically specified. Instead, to use a dynamic amount, desugar // // to shifts and bit arithmetic. // return format!( // "(bvor (bvshl {x} {y}) (bvlshr {x} (bvsub {width} {y})))", - // x = self.vir_expr_to_rsmt2_str(*x), - // y = self.vir_expr_to_rsmt2_str(*y), + // x = self.vir_expr_to_sexp(*x), + // y = self.vir_expr_to_sexp(*y), // width = format!("(_ bv{} {})", self.bitwidth, self.bitwidth) // ); } BinaryOp::BVRotr => { let arg_width = self.get_expr_width_var(&*x).unwrap().clone(); - let xs = self.vir_expr_to_rsmt2_str(*x); - let ys = self.vir_expr_to_rsmt2_str(*y); - return self.rotate_symbolic(&xs, &arg_width, &ys, "rotate_right"); + let xs = self.vir_expr_to_sexp(*x); + let ys = self.vir_expr_to_sexp(*y); + return self.rotate_symbolic(xs, arg_width, ys, "rotate_right"); } // To shift right, we need to make sure the bits to the right get zeroed. Shift left first. BinaryOp::BVShr => { let arg_width = self.get_expr_width_var(&*x).unwrap().clone(); - let xs = self.vir_expr_to_rsmt2_str(*x); - let ys = self.vir_expr_to_rsmt2_str(*y); + let xs = self.vir_expr_to_sexp(*x); + let ys = self.vir_expr_to_sexp(*y); // Strategy: shift left by (bitwidth - arg width) to zero bits to the right // of the bits in the argument size. Then shift right by (amt + (bitwidth - arg width)) // Width math - let arg_width_as_bv = - format!("((_ int2bv {}) {})", self.bitwidth, arg_width); - let bitwidth_as_bv = format!("(_ bv{} {})", self.bitwidth, self.bitwidth); - let extra_shift = - format!(" (bvsub {} {})", bitwidth_as_bv, arg_width_as_bv); - let shl_to_zero = format!("(bvshl {} {})", xs, extra_shift); - - let amt_plus_extra = format!("(bvadd {} {})", ys, extra_shift); - return format!("(bvlshr {} {})", shl_to_zero, amt_plus_extra); + let arg_width_as_bv = self.int2bv(self.bitwidth, arg_width); + let bitwidth_as_bv = self.bv(self.bitwidth, self.bitwidth); + let extra_shift = self.smt.bvsub(bitwidth_as_bv, arg_width_as_bv); + let shl_to_zero = self.smt.bvshl(xs, extra_shift); + + let amt_plus_extra = self.smt.bvadd(ys, extra_shift); + return self.smt.bvlshr(shl_to_zero, amt_plus_extra); } BinaryOp::BVAShr => { let arg_width = self.get_expr_width_var(&*x).unwrap().clone(); - let xs = self.vir_expr_to_rsmt2_str(*x); - let ys = self.vir_expr_to_rsmt2_str(*y); + let xs = self.vir_expr_to_sexp(*x); + let ys = self.vir_expr_to_sexp(*y); // Strategy: shift left by (bitwidth - arg width) to eliminate bits to the left // of the bits in the argument size. Then shift right by (amt + (bitwidth - arg width)) // Width math - let arg_width_as_bv = - format!("((_ int2bv {}) {})", self.bitwidth, arg_width); - let bitwidth_as_bv = format!("(_ bv{} {})", self.bitwidth, self.bitwidth); - let extra_shift = - format!(" (bvsub {} {})", bitwidth_as_bv, arg_width_as_bv); - let shl_to_zero = format!("(bvshl {} {})", xs, extra_shift); - - let amt_plus_extra = format!("(bvadd {} {})", ys, extra_shift); - return format!("(bvashr {} {})", shl_to_zero, amt_plus_extra); + let arg_width_as_bv = self.int2bv(self.bitwidth, arg_width); + let bitwidth_as_bv = self.bv(self.bitwidth, self.bitwidth); + let extra_shift = self.smt.bvsub(bitwidth_as_bv, arg_width_as_bv); + let shl_to_zero = self.smt.bvshl(xs, extra_shift); + + let amt_plus_extra = self.smt.bvadd(ys, extra_shift); + return self.smt.bvashr(shl_to_zero, amt_plus_extra); } _ => (), }; @@ -487,68 +567,66 @@ impl SolverCtx { BinaryOp::BVShl => "bvshl", _ => unreachable!("{:?}", op), }; - // If we have some static width that isn't the bitwidth, extract based on it + // If we have some static width that isn't the bitwidth, extract based on it // before performing the operation. match static_expr_width { - Some(w) if w < self.bitwidth => - format!( - "((_ zero_extend {padding}) ({op} ((_ extract {h} 0) {x}) ((_ extract {h} 0) {y})))", - padding = self.bitwidth.checked_sub(w).unwrap(), - op = op_str, - h = w - 1, - x = self.vir_expr_to_rsmt2_str(*x), - y = self.vir_expr_to_rsmt2_str(*y), - ), - _ => format!( - "({} {} {})", - op_str, - self.vir_expr_to_rsmt2_str(*x), - self.vir_expr_to_rsmt2_str(*y) - ) + Some(w) if w < self.bitwidth => { + let h: i32 = (w - 1).try_into().unwrap(); + let x_sexp = self.vir_expr_to_sexp(*x); + let y_sexp = self.vir_expr_to_sexp(*y); + self.zero_extend( + self.bitwidth.checked_sub(w).unwrap(), + self.smt.list(vec![ + self.smt.atom(op_str), + self.smt.extract(h, 0, x_sexp), + self.smt.extract(h, 0, y_sexp), + ]), + ) + } + _ => { + let x_sexp = self.vir_expr_to_sexp(*x); + let y_sexp = self.vir_expr_to_sexp(*y); + self.smt.list(vec![self.smt.atom(op_str), x_sexp, y_sexp]) + } } } Expr::BVIntToBV(w, x) => { let padded_width = self.bitwidth - w; - format!( - "((_ zero_extend {}) ((_ int2bv {}) {}))", - padded_width, - w, - self.vir_expr_to_rsmt2_str(*x) - ) + let x_sexp = self.vir_expr_to_sexp(*x); + self.zero_extend(padded_width, self.int2bv(w, x_sexp)) } Expr::BVToInt(x) => { - format!("(bv2nat {})", self.vir_expr_to_rsmt2_str(*x)) + let x_sexp = self.vir_expr_to_sexp(*x); + self.bv2nat(x_sexp) } Expr::BVConvTo(y) => { // For static convto, width constraints are handling during inference - self.vir_expr_to_rsmt2_str(*y) + self.vir_expr_to_sexp(*y) } Expr::BVZeroExtTo(i, x) => { let arg_width = self.get_expr_width_var(&*x).unwrap().clone(); let static_width = self.static_width(&*x); let expr_width = width.unwrap().clone(); self.width_assumptions - .push(format!("(= {} {})", expr_width, i)); - let xs = self.vir_expr_to_rsmt2_str(*x); + .push(self.smt.eq(expr_width, self.smt.numeral(i))); + let xs = self.vir_expr_to_sexp(*x); if let Some(size) = static_width { - self.extend_concrete(i, &xs, size, &"zero_extend") + self.extend_concrete(i, xs, size, &"zero_extend") } else { - let is = i.to_string(); - self.extend_symbolic(&is, &xs, &arg_width, &"zero_extend") + self.extend_symbolic(self.smt.numeral(i), xs, arg_width, &"zero_extend") } } Expr::BVZeroExtToVarWidth(i, x) => { let arg_width = self.get_expr_width_var(&*x).unwrap().clone(); let static_arg_width = self.static_width(&*x); let expr_width = width.unwrap().clone(); - let is = self.vir_expr_to_rsmt2_str(*i); - let xs = self.vir_expr_to_rsmt2_str(*x); - self.width_assumptions - .push(format!("(= {} {})", expr_width, is)); + let is = self.vir_expr_to_sexp(*i); + let xs = self.vir_expr_to_sexp(*x); + self.width_assumptions.push(self.smt.eq(expr_width, is)); if let (Some(arg_size), Some(e_size)) = (static_arg_width, static_expr_width) { - self.extend_concrete(e_size, &xs, arg_size, &"zero_extend") + self.extend_concrete(e_size, xs, arg_size, &"zero_extend") } else { - self.extend_symbolic(&is, &xs, &arg_width, &"zero_extend") + self.extend_symbolic(is, xs, arg_width, &"zero_extend") } } Expr::BVSignExtTo(i, x) => { @@ -556,152 +634,157 @@ impl SolverCtx { let static_width = self.static_width(&*x); let expr_width = width.unwrap().clone(); self.width_assumptions - .push(format!("(= {} {})", expr_width, i)); - let xs = self.vir_expr_to_rsmt2_str(*x); + .push(self.smt.eq(expr_width, self.smt.numeral(i))); + let xs = self.vir_expr_to_sexp(*x); if let Some(size) = static_width { - self.extend_concrete(i, &xs, size, &"sign_extend") + self.extend_concrete(i, xs, size, &"sign_extend") } else { - let is = i.to_string(); - self.extend_symbolic(&is, &xs, &arg_width, &"sign_extend") + self.extend_symbolic(self.smt.numeral(i), xs, arg_width, "sign_extend") } } Expr::BVSignExtToVarWidth(i, x) => { let arg_width = self.get_expr_width_var(&*x).unwrap().clone(); let static_arg_width = self.static_width(&*x); let expr_width = width.unwrap().clone(); - let is = self.vir_expr_to_rsmt2_str(*i); - let xs = self.vir_expr_to_rsmt2_str(*x); - self.width_assumptions - .push(format!("(= {} {})", expr_width, is)); + let is = self.vir_expr_to_sexp(*i); + let xs = self.vir_expr_to_sexp(*x); + self.width_assumptions.push(self.smt.eq(expr_width, is)); if let (Some(arg_size), Some(e_size)) = (static_arg_width, static_expr_width) { - self.extend_concrete(e_size, &xs, arg_size, &"sign_extend") + self.extend_concrete(e_size, xs, arg_size, &"sign_extend") } else { - self.extend_symbolic(&is, &xs, &arg_width, &"sign_extend") + self.extend_symbolic(is, xs, arg_width, &"sign_extend") } } Expr::BVConvToVarWidth(x, y) => { let expr_width = width.unwrap().clone(); - let dyn_width = self.vir_expr_to_rsmt2_str(*x); + let dyn_width = self.vir_expr_to_sexp(*x); self.width_assumptions - .push(format!("(= {} {})", expr_width, dyn_width)); - self.vir_expr_to_rsmt2_str(*y) + .push(self.smt.eq(expr_width, dyn_width)); + self.vir_expr_to_sexp(*y) } - Expr::UndefinedTerm(term) => term.ret.name, + Expr::UndefinedTerm(term) => self.smt.atom(term.ret.name), Expr::WidthOf(x) => self.get_expr_width_var(&*x).unwrap().clone(), Expr::BVExtract(i, j, x) => { assert!(i >= j); if let Type::BitVector(x_width) = self.get_type(&x).unwrap() { + assert!(i < self.bitwidth); assert!(i < x_width.unwrap()); - let xs = self.vir_expr_to_rsmt2_str(*x); - let extract = format!("((_ extract {} {}) {})", i, j, xs); + let xs = self.vir_expr_to_sexp(*x); + // No-op if we are extracting exactly the full bitwidth + if j == 0 && i == self.bitwidth - 1 { + return xs; + } + let extract =self.smt.extract(i.try_into().unwrap(), j.try_into().unwrap(), xs); let new_width = i - j + 1; - let padding = + if new_width < self.bitwidth { + let padding = self.new_fresh_bits(self.bitwidth.checked_sub(new_width).unwrap()); - format!("(concat {} {})", padding, extract) + self.smt.concat(padding, extract) + } else { + extract + } } else { unreachable!("Must perform extraction on bv with known width") } } Expr::Conditional(c, t, e) => { - format!( - "(ite {} {} {})", - self.vir_expr_to_rsmt2_str(*c), - self.vir_expr_to_rsmt2_str(*t), - self.vir_expr_to_rsmt2_str(*e) - ) + let c_sexp = self.vir_expr_to_sexp(*c); + let t_sexp = self.vir_expr_to_sexp(*t); + let e_sexp = self.vir_expr_to_sexp(*e); + self.smt.ite(c_sexp, t_sexp, e_sexp) } Expr::CLZ(e) => { let tyvar = *tyvar.unwrap(); - let es = self.vir_expr_to_rsmt2_str(*e); + let es = self.vir_expr_to_sexp(*e); match static_expr_width { - Some(1) => clz::clz1(self, &es, tyvar), - Some(8) => clz::clz8(self, &es, tyvar), - Some(16) => clz::clz16(self, &es, tyvar), - Some(32) => clz::clz32(self, &es, tyvar), - Some(64) => clz::clz64(self, &es, tyvar), + Some(1) => clz::clz1(self, es, tyvar), + Some(8) => clz::clz8(self, es, tyvar), + Some(16) => clz::clz16(self, es, tyvar), + Some(32) => clz::clz32(self, es, tyvar), + Some(64) => clz::clz64(self, es, tyvar), Some(w) => unreachable!("Unexpected CLZ width {}", w), None => unreachable!("Need static CLZ width"), } } Expr::A64CLZ(ty, e) => { let tyvar = *tyvar.unwrap(); - let es = self.vir_expr_to_rsmt2_str(*e); + let es = self.vir_expr_to_sexp(*e); let val = self.get_expr_value(&*ty); match val { - Some(32) => clz::a64clz32(self, &es, tyvar), - Some(64) => clz::clz64(self, &es, tyvar), + Some(32) => clz::clz32(self, es, tyvar), + Some(64) => clz::clz64(self, es, tyvar), Some(w) => { println!("Unexpected A64CLZ width {}", w); - self.additional_assumptions.push("false".to_string()); + self.additional_assumptions.push(self.smt.false_()); es } None => { println!("Need static A64CLZ width"); - self.additional_assumptions.push("false".to_string()); + self.additional_assumptions.push(self.smt.false_()); es } } } Expr::CLS(e) => { let tyvar = *tyvar.unwrap(); - let es = self.vir_expr_to_rsmt2_str(*e); + let es = self.vir_expr_to_sexp(*e); match static_expr_width { Some(1) => cls::cls1(self, tyvar), - Some(8) => cls::cls8(self, &es, tyvar), - Some(16) => cls::cls16(self, &es, tyvar), - Some(32) => cls::cls32(self, &es, tyvar), - Some(64) => cls::cls64(self, &es, tyvar), + Some(8) => cls::cls8(self, es, tyvar), + Some(16) => cls::cls16(self, es, tyvar), + Some(32) => cls::cls32(self, es, tyvar), + Some(64) => cls::cls64(self, es, tyvar), Some(w) => unreachable!("Unexpected CLS width {}", w), None => unreachable!("Need static CLS width"), } } Expr::A64CLS(ty, e) => { let tyvar = *tyvar.unwrap(); - let es = self.vir_expr_to_rsmt2_str(*e); + let es = self.vir_expr_to_sexp(*e); let val = self.get_expr_value(&*ty); match val { - Some(32) => cls::a64cls32(self, &es, tyvar), - Some(64) => cls::cls64(self, &es, tyvar), + Some(32) => cls::a64cls32(self, es, tyvar), + Some(64) => cls::cls64(self, es, tyvar), Some(w) => { println!("Unexpected A64CLS width {}", w); - self.additional_assumptions.push("false".to_string()); + self.additional_assumptions.push(self.smt.false_()); es } None => { println!("Need static A64CLS width"); - self.additional_assumptions.push("false".to_string()); + self.additional_assumptions.push(self.smt.false_()); es } } } Expr::Rev(e) => { let tyvar = *tyvar.unwrap(); - let es = self.vir_expr_to_rsmt2_str(*e); + let es = self.vir_expr_to_sexp(*e); match static_expr_width { - Some(1) => rev::rev1(self, &es, tyvar), - Some(8) => rev::rev8(self, &es, tyvar), - Some(16) => rev::rev16(self, &es, tyvar), - Some(32) => rev::rev32(self, &es, tyvar), - Some(64) => rev::rev64(self, &es, tyvar), + Some(1) => rev::rev1(self, es, tyvar), + Some(8) => rev::rev8(self, es, tyvar), + Some(16) => rev::rev16(self, es, tyvar), + Some(32) => rev::rev32(self, es, tyvar), + Some(64) => rev::rev64(self, es, tyvar), Some(w) => unreachable!("Unexpected CLS width {}", w), None => unreachable!("Need static CLS width"), } } Expr::A64Rev(ty, e) => { let tyvar = *tyvar.unwrap(); - let es = self.vir_expr_to_rsmt2_str(*e); + let es = self.vir_expr_to_sexp(*e); let val = self.get_expr_value(&*ty); match val { - Some(32) => rev::rbit32(self, &es, tyvar), - Some(64) => rev::rev64(self, &es, tyvar), + Some(32) => rev::rbit32(self, es, tyvar), + Some(64) => rev::rev64(self, es, tyvar), Some(w) => { println!("Unexpected A64Rev width {}", w); - self.additional_assumptions.push("false".to_string()); + self.additional_assumptions.push(self.smt.false_()); es } None => { println!("Need static A64Rev width"); - self.additional_assumptions.push("false".to_string()); + self.additional_assumptions.push(self.smt.false_()); es } } @@ -710,25 +793,21 @@ impl SolverCtx { } // Checks whether the assumption list is always false - fn check_assumptions_feasibility( - &self, - solver: &mut Solver, - assumptions: Vec, - ) -> bool { + fn check_assumptions_feasibility(&mut self, assumptions: &Vec) -> bool { println!("Checking assumption feasibility"); - solver.push(1).unwrap(); + self.smt.push().unwrap(); for a in assumptions { - println!("{}", &a); - solver.assert(a).unwrap(); + debug!("{}", self.smt.display(*a)); + self.smt.assert(*a).unwrap(); // Uncomment to debug specific asserts // solver.push(2).unwrap(); - // let _ = match solver.check_sat() { - // Ok(true) => { + // let _ = match solver.check() { + // Ok(Response::Sat) => { // println!("Assertion list is feasible"); // true // } - // Ok(false) => { + // Ok(Response::Unsat) => { // println!("Assertion list is infeasible!"); // panic!(); // false @@ -739,22 +818,68 @@ impl SolverCtx { // }; // solver.pop(2).unwrap(); } - let res = match solver.check_sat() { - Ok(true) => { + let res = match self.smt.check() { + Ok(Response::Sat) => { println!("Assertion list is feasible"); true } - Ok(false) => { + Ok(Response::Unsat) => { println!("Assertion list is infeasible!"); false } + Ok(Response::Unknown) => { + panic!("Solver said 'unk'"); + } Err(err) => { unreachable!("Error! {:?}", err); } }; - solver.pop(1).unwrap(); + self.smt.pop().unwrap(); res } + + fn display_hex_to_bin(&self, value: SExpr) -> String { + let sexpr_hex_prefix = "#x"; + let val_str = self.smt.display(value).to_string(); + if val_str.starts_with(sexpr_hex_prefix) { + let without_prefix = val_str.trim_start_matches("#x"); + let as_unsigned = u64::from_str_radix(without_prefix, 16).unwrap(); + format!("{}\n{:#b}", self.smt.display(value), as_unsigned) + } else { + val_str + } + } + + fn display_value(&self, variable: SExpr, value: SExpr) -> (String, String) { + let var_str = self.smt.display(variable).to_string(); + (var_str, self.display_hex_to_bin(value)) + } + + fn display_model(&mut self, model: SExpr) { + println!("Quantified variables:"); + let mut vars = vec![]; + for (name, atom) in &self.var_map { + let solution = self + .smt + .get_value(vec![self.smt.atom(name), *atom]) + .unwrap(); + for (variable, value) in solution { + vars.push(self.display_value(variable, value)); + } + } + for (name, _) in &self.additional_decls { + let solution = self.smt.get_value(vec![self.smt.atom(name)]).unwrap(); + for (variable, value) in solution { + vars.push(self.display_value(variable, value)); + } + } + vars.sort_by_key(|x| x.0.clone()); + vars.dedup(); + for (v, x) in vars { + println!("{}", v); + println!("{}\n", x); + } + } } /// Overall query for single rule: @@ -769,11 +894,15 @@ impl SolverCtx { /// (= )))))) pub fn run_solver(rule_sem: RuleSemantics, query_width: usize) -> VerificationResult { println!("Verifying with query width: {}", query_width); - let mut solver = Solver::default_z3(()).unwrap(); + let solver = easy_smt::ContextBuilder::new() + .solver("z3", ["-smt2", "-in"]) + .build() + .unwrap(); - let mut assumptions: Vec = vec![]; + let mut assumptions: Vec = vec![]; let mut ctx = SolverCtx { + smt: solver, tyctx: rule_sem.tyctx, bitwidth: REG_WIDTH, var_map: HashMap::new(), @@ -810,11 +939,13 @@ pub fn run_solver(rule_sem: RuleSemantics, query_width: usize) -> VerificationRe Type::BitVector(w) => { let width_name = format!("width__{}", t); ctx.additional_decls - .push((width_name.clone(), "Int".to_string())); - match w { + .push((width_name.clone(), ctx.smt.int_sort())); + match *w { Some(bitwidth) => { - ctx.width_assumptions - .push(format!("(= {} {})", width_name, bitwidth)); + ctx.width_assumptions.push( + ctx.smt + .eq(ctx.smt.atom(&width_name), ctx.smt.numeral(bitwidth)), + ); } None => { let bv_set_idx = ctx.tyctx.bv_unknown_width_sets[&t]; @@ -822,8 +953,10 @@ pub fn run_solver(rule_sem: RuleSemantics, query_width: usize) -> VerificationRe ctx.tyctx .tymap .insert(*t, Type::BitVector(Some(query_width))); - ctx.width_assumptions - .push(format!("(= {} {})", width_name, query_width)); + ctx.width_assumptions.push( + ctx.smt + .eq(ctx.smt.atom(&width_name), ctx.smt.numeral(query_width)), + ); } } }; @@ -837,47 +970,42 @@ pub fn run_solver(rule_sem: RuleSemantics, query_width: usize) -> VerificationRe for v in &rule_sem.quantified_vars { let name = &v.name; let ty = ctx.tyctx.tymap[&v.tyvar].clone(); - let var_ty = ctx.vir_to_rsmt2_constant_ty(&ty); - println!("\t{} : {:?}", name, var_ty); + let var_ty = ctx.vir_to_smt_ty(&ty); + println!("\t{} : {}", name, ctx.smt.display(var_ty)); if let Type::BitVector(w) = ty { let wide = ctx.widen_to_query_width( v.tyvar, w.unwrap_or(ctx.bitwidth), - name.clone(), + ctx.smt.atom(name), Some(name.to_string()), ); ctx.var_map.insert(name.clone(), wide); } - solver.declare_const(name, var_ty).unwrap(); + ctx.smt.declare_const(name, var_ty).unwrap(); } println!("Adding explicit assumptions"); for a in &rule_sem.assumptions { - let p = ctx.vir_expr_to_rsmt2_str(a.clone()); - // println!("\t{}", p); + let p = ctx.vir_expr_to_sexp(a.clone()); assumptions.push(p) } println!("Adding width assumptions"); for a in &ctx.width_assumptions { - // println!("\t{}", a); assumptions.push(a.clone()); } println!("Adding additional assumptions"); for a in &ctx.additional_assumptions { - // println!("\t{}", a); assumptions.push(a.clone()); } println!("Declaring additional variables"); for (name, ty) in &ctx.additional_decls { - println!("\t{} : {:?}", name, ty); - solver.declare_const(name, ty).unwrap(); + println!("\t{} : {}", name, ctx.smt.display(*ty)); + ctx.smt.declare_const(name, *ty).unwrap(); } - let assumption_str = format!("(and {})", assumptions.join(" ")); - // Check whether the assumptions are possible - if !ctx.check_assumptions_feasibility(&mut solver, assumptions) { + if !ctx.check_assumptions_feasibility(&assumptions) { println!("Rule not applicable as written for rule assumptions, skipping full query"); return VerificationResult::InapplicableRule; } @@ -902,31 +1030,39 @@ pub fn run_solver(rule_sem: RuleSemantics, query_width: usize) -> VerificationRe } }; - let lhs = ctx.vir_expr_to_rsmt2_str(rule_sem.lhs); - let rhs = ctx.vir_expr_to_rsmt2_str(rule_sem.rhs); + let lhs = ctx.vir_expr_to_sexp(rule_sem.lhs); + let rhs = ctx.vir_expr_to_sexp(rule_sem.rhs); - let lhs_care_bits = format!("((_ extract {} {}) {})", width - 1, 0, &lhs); - let rhs_care_bits = format!("((_ extract {} {}) {})", width - 1, 0, &rhs); + let lhs_care_bits = ctx.smt.extract((width - 1).try_into().unwrap(), 0, lhs); + let rhs_care_bits = ctx.smt.extract((width - 1).try_into().unwrap(), 0, rhs); - let side_equality = format!("(= {} {})", lhs_care_bits, rhs_care_bits); - println!("LHS and RHS equality condition:\n\t{}\n", side_equality); + let side_equality = ctx.smt.eq(lhs_care_bits, rhs_care_bits); + println!( + "LHS and RHS equality condition:\n\t{}\n", + ctx.smt.display(side_equality) + ); - let query = format!("(not (=> {} {}))", assumption_str, side_equality); + let assumption_conjunction = ctx.smt.and_many(assumptions); + let query = ctx + .smt + .not(ctx.smt.imp(assumption_conjunction, side_equality)); println!("Running query"); - // println!("Running query:\n\t{}\n", query); - solver.assert(query).unwrap(); + ctx.smt.assert(query).unwrap(); - match solver.check_sat() { - Ok(true) => { + match ctx.smt.check() { + Ok(Response::Sat) => { println!("Verification failed"); - let model = solver.get_model().unwrap(); - dbg!(model); + let model = ctx.smt.get_model().unwrap(); + ctx.display_model(model); VerificationResult::Failure(Counterexample {}) } - Ok(false) => { + Ok(Response::Unsat) => { println!("Verification succeeded"); VerificationResult::Success } + Ok(Response::Unknown) => { + panic!("Solver said 'unk'"); + } Err(err) => { unreachable!("Error! {:?}", err); } diff --git a/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/cls.rs b/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/cls.rs index ffbc00426728..38809199f5b4 100644 --- a/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/cls.rs +++ b/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/cls.rs @@ -1,1320 +1,4433 @@ use crate::solver::SolverCtx; +use easy_smt::SExpr; // Adapted from https://stackoverflow.com/questions/23856596/how-to-count-leading-zeros-in-a-32-bit-unsigned-integer -pub fn a64cls32(solver: &mut SolverCtx, x: &String, id: u32) -> String { +pub fn a64cls32(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + // Generated code. // extract to ensure we have a 32 bit input - solver - .additional_decls - .push((format!("a64x_{id}", id = id), String::from("(_ BitVec 32)"))); - solver.additional_assumptions.push(format!( - "(= a64x_{id} ((_ extract 31 0) {x}))", - id = id, - x = x + let a64x = solver.declare( + format!("a64x_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.eq( + a64x, + solver.smt.list(vec![ + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("extract"), + solver.smt.numeral(31), + solver.smt.numeral(0), + ]), + x, + ]), )); - // total zeros counter - solver.additional_decls.push(( + let zret0 = solver.declare( format!("zret0_{id}", id = id), - String::from("(_ BitVec 64)"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + zret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), )); - solver - .additional_assumptions - .push(format!("(= zret0_{id} (_ bv0 64))", id = id)); - // round 1 - solver.additional_decls.push(( + let zret2 = solver.declare( format!("zret2_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("zy16_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("zx16_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= zy16_{id} (bvlshr a64x_{id} #x00000010))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= zy16_{id} (_ bv0 32))) (= zret2_{id} zret0_{id}) (= zret2_{id} (bvadd zret0_{id} (_ bv16 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy16_{id} (_ bv0 32))) (= zx16_{id} zy16_{id}) (= zx16_{id} a64x_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zy16 = solver.declare( + format!("zy16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let zx16 = solver.declare( + format!("zx16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(zy16, solver.smt.bvlshr(a64x, solver.smt.atom("#x00000010"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zret2, zret0), + solver.smt.eq( + zret2, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv16"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zx16, zy16), + solver.smt.eq(zx16, a64x), + ])); // round 2 - solver.additional_decls.push(( + let zret3 = solver.declare( format!("zret3_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("zy8_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("zx8_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= zy8_{id} (bvlshr zx16_{id} #x00000008))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= zy8_{id} (_ bv0 32))) (= zret3_{id} zret2_{id}) (= zret3_{id} (bvadd zret2_{id} (_ bv8 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy8_{id} (_ bv0 32))) (= zx8_{id} zy8_{id}) (= zx8_{id} zx16_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zy8 = solver.declare( + format!("zy8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let zx8 = solver.declare( + format!("zx8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(zy8, solver.smt.bvlshr(zx16, solver.smt.atom("#x00000008"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zret3, zret2), + solver.smt.eq( + zret3, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv8"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zx8, zy8), + solver.smt.eq(zx8, zx16), + ])); // round 3 - solver.additional_decls.push(( + let zret4 = solver.declare( format!("zret4_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("zy4_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("zx4_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= zy4_{id} (bvlshr zx8_{id} #x00000004))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= zy4_{id} (_ bv0 32))) (= zret4_{id} zret3_{id}) (= zret4_{id} (bvadd zret3_{id} (_ bv4 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy4_{id} (_ bv0 32))) (= zx4_{id} zy4_{id}) (= zx4_{id} zx8_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zy4 = solver.declare( + format!("zy4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let zx4 = solver.declare( + format!("zx4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(zy4, solver.smt.bvlshr(zx8, solver.smt.atom("#x00000004"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zret4, zret3), + solver.smt.eq( + zret4, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret3, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zx4, zy4), + solver.smt.eq(zx4, zx8), + ])); // round 4 - solver.additional_decls.push(( + let zret5 = solver.declare( format!("zret5_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("zy2_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("zx2_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= zy2_{id} (bvlshr zx4_{id} #x00000002))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= zy2_{id} (_ bv0 32))) (= zret5_{id} zret4_{id}) (= zret5_{id} (bvadd zret4_{id} (_ bv2 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy2_{id} (_ bv0 32))) (= zx2_{id} zy2_{id}) (= zx2_{id} zx4_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zy2 = solver.declare( + format!("zy2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let zx2 = solver.declare( + format!("zx2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(zy2, solver.smt.bvlshr(zx4, solver.smt.atom("#x00000002"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zret5, zret4), + solver.smt.eq( + zret5, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv2"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zx2, zy2), + solver.smt.eq(zx2, zx4), + ])); // round 5 - solver.additional_decls.push(( + let zret6 = solver.declare( format!("zret6_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("zy1_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("zx1_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= zy1_{id} (bvlshr zx2_{id} #x00000001))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= zy1_{id} (_ bv0 32))) (= zret6_{id} zret5_{id}) (= zret6_{id} (bvadd zret5_{id} (_ bv1 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy1_{id} (_ bv0 32))) (= zx1_{id} zy1_{id}) (= zx1_{id} zx2_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zy1 = solver.declare( + format!("zy1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let zx1 = solver.declare( + format!("zx1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(zy1, solver.smt.bvlshr(zx2, solver.smt.atom("#x00000001"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zret6, zret5), + solver.smt.eq( + zret6, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret5, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zx1, zy1), + solver.smt.eq(zx1, zx2), + ])); // last round - solver.additional_decls.push(( + let zret7 = solver.declare( format!("zret7_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver.additional_assumptions.push(format!("(ite (not (= zx1_{id} (_ bv0 32))) (= zret7_{id} zret6_{id}) (= zret7_{id} (bvadd zret6_{id} (_ bv1 64))))", id = id)); - - solver.additional_decls.push(( + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zx1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zret7, zret6), + solver.smt.eq( + zret7, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret6, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + let clzret = solver.declare( format!("clzret_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver.additional_assumptions.push(format!("(ite (= zret7_{id} (_ bv0 64)) (= clzret_{id} zret7_{id}) (= clzret_{id} (bvsub zret7_{id} (_ bv1 64))))", id = id)); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.eq( + zret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + solver.smt.eq(clzret, zret7), + solver.smt.eq( + clzret, + solver.smt.list(vec![ + solver.smt.atom("bvsub"), + zret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); // total zeros counter - solver.additional_decls.push(( + let sret0 = solver.declare( format!("sret0_{id}", id = id), - String::from("(_ BitVec 64)"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + sret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), )); - solver - .additional_assumptions - .push(format!("(= sret0_{id} (_ bv0 64))", id = id)); - // round 1 - solver.additional_decls.push(( + let sret2 = solver.declare( format!("sret2_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("sy16_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("sx16_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= sy16_{id} (bvashr a64x_{id} #x00000010))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= sy16_{id} (_ bv4294967295 32))) (= sret2_{id} sret0_{id}) (= sret2_{id} (bvadd sret0_{id} (_ bv16 64))))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= sy16_{id} (_ bv4294967295 32))) (= sx16_{id} sy16_{id}) (= sx16_{id} a64x_{id}))", id = id)); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sy16 = solver.declare( + format!("sy16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let sx16 = solver.declare( + format!("sx16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(sy16, solver.smt.bvashr(a64x, solver.smt.atom("#x00000010"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sret2, sret0), + solver.smt.eq( + sret2, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv16"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sx16, sy16), + solver.smt.eq(sx16, a64x), + ])); // round 2 - solver.additional_decls.push(( + let sret3 = solver.declare( format!("sret3_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("sy8_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("sx8_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= sy8_{id} (bvashr sx16_{id} #x00000008))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= sy8_{id} (_ bv4294967295 32))) (= sret3_{id} sret2_{id}) (= sret3_{id} (bvadd sret2_{id} (_ bv8 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy8_{id} (_ bv4294967295 32))) (= sx8_{id} sy8_{id}) (= sx8_{id} sx16_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sy8 = solver.declare( + format!("sy8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let sx8 = solver.declare( + format!("sx8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(sy8, solver.smt.bvashr(sx16, solver.smt.atom("#x00000008"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sret3, sret2), + solver.smt.eq( + sret3, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv8"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sx8, sy8), + solver.smt.eq(sx8, sx16), + ])); // round 3 - solver.additional_decls.push(( + let sret4 = solver.declare( format!("sret4_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("sy4_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("sx4_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= sy4_{id} (bvashr sx8_{id} #x00000004))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= sy4_{id} (_ bv4294967295 32))) (= sret4_{id} sret3_{id}) (= sret4_{id} (bvadd sret3_{id} (_ bv4 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy4_{id} (_ bv4294967295 32))) (= sx4_{id} sy4_{id}) (= sx4_{id} sx8_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sy4 = solver.declare( + format!("sy4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let sx4 = solver.declare( + format!("sx4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(sy4, solver.smt.bvashr(sx8, solver.smt.atom("#x00000004"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sret4, sret3), + solver.smt.eq( + sret4, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret3, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sx4, sy4), + solver.smt.eq(sx4, sx8), + ])); // round 4 - solver.additional_decls.push(( + let sret5 = solver.declare( format!("sret5_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("sy2_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("sx2_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= sy2_{id} (bvashr sx4_{id} #x00000002))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= sy2_{id} (_ bv4294967295 32))) (= sret5_{id} sret4_{id}) (= sret5_{id} (bvadd sret4_{id} (_ bv2 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy2_{id} (_ bv4294967295 32))) (= sx2_{id} sy2_{id}) (= sx2_{id} sx4_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sy2 = solver.declare( + format!("sy2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let sx2 = solver.declare( + format!("sx2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(sy2, solver.smt.bvashr(sx4, solver.smt.atom("#x00000002"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sret5, sret4), + solver.smt.eq( + sret5, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv2"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sx2, sy2), + solver.smt.eq(sx2, sx4), + ])); // round 5 - solver.additional_decls.push(( + let sret6 = solver.declare( format!("sret6_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("sy1_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("sx1_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= sy1_{id} (bvashr sx2_{id} #x00000001))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= sy1_{id} (_ bv4294967295 32))) (= sret6_{id} sret5_{id}) (= sret6_{id} (bvadd sret5_{id} (_ bv1 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy1_{id} (_ bv4294967295 32))) (= sx1_{id} sy1_{id}) (= sx1_{id} sx2_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sy1 = solver.declare( + format!("sy1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let sx1 = solver.declare( + format!("sx1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(sy1, solver.smt.bvashr(sx2, solver.smt.atom("#x00000001"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sret6, sret5), + solver.smt.eq( + sret6, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret5, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sx1, sy1), + solver.smt.eq(sx1, sx2), + ])); // last round - solver.additional_decls.push(( + let sret7 = solver.declare( format!("sret7_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver.additional_assumptions.push(format!("(ite (not (= sx1_{id} (_ bv4294967295 32))) (= sret7_{id} sret6_{id}) (= sret7_{id} (bvadd sret6_{id} (_ bv1 64))))", id = id)); - - solver.additional_decls.push(( + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sx1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sret7, sret6), + solver.smt.eq( + sret7, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret6, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + let clsret = solver.declare( format!("clsret_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver.additional_assumptions.push(format!("(ite (= sret7_{id} (_ bv0 64)) (= clsret_{id} sret7_{id}) (= clsret_{id} (bvsub sret7_{id} (_ bv1 64))))", id = id)); - - // final return - solver.additional_decls.push(( + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.eq( + sret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + solver.smt.eq(clsret, sret7), + solver.smt.eq( + clsret, + solver.smt.list(vec![ + solver.smt.atom("bvsub"), + sret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + let a64cls32ret = solver.declare( format!("a64cls32ret_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver.additional_assumptions.push(format!("(ite (bvsle (_ bv0 32) a64x_{id}) (= a64cls32ret_{id} clzret_{id}) (= a64cls32ret_{id} clsret_{id}))", id = id)); - - format!("a64cls32ret_{id}", id = id) + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("bvsle"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + a64x, + ]), + solver.smt.eq(a64cls32ret, clzret), + solver.smt.eq(a64cls32ret, clsret), + ])); + + a64cls32ret } -pub fn cls64(solver: &mut SolverCtx, x: &String, id: u32) -> String { +pub fn cls64(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + // Generated code. // total zeros counter - solver.additional_decls.push(( + let zret0 = solver.declare( format!("zret0_{id}", id = id), - String::from("(_ BitVec 64)"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + zret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), )); - solver - .additional_assumptions - .push(format!("(= zret0_{id} (_ bv0 64))", id = id)); - // round 1 - solver.additional_decls.push(( + let zret1 = solver.declare( format!("zret1_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("zy32_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("zx32_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= zy32_{id} (bvlshr {x} #x0000000000000020))", - x = x, - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= zy32_{id} (_ bv0 64))) (= zret1_{id} zret0_{id}) (= zret1_{id} (bvadd zret0_{id} (_ bv32 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy32_{id} (_ bv0 64))) (= zx32_{id} zy32_{id}) (= zx32_{id} {x}))", - x = x, - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zy32 = solver.declare( + format!("zy32_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zx32 = solver.declare( + format!("zx32_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + zy32, + solver.smt.bvlshr(x, solver.smt.atom("#x0000000000000020")), + )); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy32, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(zret1, zret0), + solver.smt.eq( + zret1, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv32"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy32, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(zx32, zy32), + solver.smt.eq(zx32, x), + ])); // round 2 - solver.additional_decls.push(( + let zret2 = solver.declare( format!("zret2_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("zy16_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("zx16_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= zy16_{id} (bvlshr zx32_{id} #x0000000000000010))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= zy16_{id} (_ bv0 64))) (= zret2_{id} zret1_{id}) (= zret2_{id} (bvadd zret1_{id} (_ bv16 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy16_{id} (_ bv0 64))) (= zx16_{id} zy16_{id}) (= zx16_{id} zx32_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zy16 = solver.declare( + format!("zy16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zx16 = solver.declare( + format!("zx16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume( + solver.smt.eq( + zy16, + solver + .smt + .bvlshr(zx32, solver.smt.atom("#x0000000000000010")), + ), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(zret2, zret1), + solver.smt.eq( + zret2, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv16"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(zx16, zy16), + solver.smt.eq(zx16, zx32), + ])); // round 3 - solver.additional_decls.push(( + let zret3 = solver.declare( format!("zret3_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("zy8_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("zx8_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= zy8_{id} (bvlshr zx16_{id} #x0000000000000008))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= zy8_{id} (_ bv0 64))) (= zret3_{id} zret2_{id}) (= zret3_{id} (bvadd zret2_{id} (_ bv8 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy8_{id} (_ bv0 64))) (= zx8_{id} zy8_{id}) (= zx8_{id} zx16_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zy8 = solver.declare( + format!("zy8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zx8 = solver.declare( + format!("zx8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume( + solver.smt.eq( + zy8, + solver + .smt + .bvlshr(zx16, solver.smt.atom("#x0000000000000008")), + ), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(zret3, zret2), + solver.smt.eq( + zret3, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv8"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(zx8, zy8), + solver.smt.eq(zx8, zx16), + ])); // round 4 - solver.additional_decls.push(( + let zret4 = solver.declare( format!("zret4_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("zy4_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("zx4_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= zy4_{id} (bvlshr zx8_{id} #x0000000000000004))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= zy4_{id} (_ bv0 64))) (= zret4_{id} zret3_{id}) (= zret4_{id} (bvadd zret3_{id} (_ bv4 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy4_{id} (_ bv0 64))) (= zx4_{id} zy4_{id}) (= zx4_{id} zx8_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zy4 = solver.declare( + format!("zy4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zx4 = solver.declare( + format!("zx4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume( + solver.smt.eq( + zy4, + solver + .smt + .bvlshr(zx8, solver.smt.atom("#x0000000000000004")), + ), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(zret4, zret3), + solver.smt.eq( + zret4, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret3, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(zx4, zy4), + solver.smt.eq(zx4, zx8), + ])); // round 5 - solver.additional_decls.push(( + let zret5 = solver.declare( format!("zret5_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("zy2_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("zx2_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= zy2_{id} (bvlshr zx4_{id} #x0000000000000002))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= zy2_{id} (_ bv0 64))) (= zret5_{id} zret4_{id}) (= zret5_{id} (bvadd zret4_{id} (_ bv2 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy2_{id} (_ bv0 64))) (= zx2_{id} zy2_{id}) (= zx2_{id} zx4_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zy2 = solver.declare( + format!("zy2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zx2 = solver.declare( + format!("zx2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume( + solver.smt.eq( + zy2, + solver + .smt + .bvlshr(zx4, solver.smt.atom("#x0000000000000002")), + ), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(zret5, zret4), + solver.smt.eq( + zret5, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv2"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(zx2, zy2), + solver.smt.eq(zx2, zx4), + ])); // round 6 - solver.additional_decls.push(( + let zret6 = solver.declare( format!("zret6_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("zy1_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("zx1_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= zy1_{id} (bvlshr zx2_{id} #x0000000000000001))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= zy1_{id} (_ bv0 64))) (= zret6_{id} zret5_{id}) (= zret6_{id} (bvadd zret5_{id} (_ bv1 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy1_{id} (_ bv0 64))) (= zx1_{id} zy1_{id}) (= zx1_{id} zx2_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zy1 = solver.declare( + format!("zy1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let zx1 = solver.declare( + format!("zx1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume( + solver.smt.eq( + zy1, + solver + .smt + .bvlshr(zx2, solver.smt.atom("#x0000000000000001")), + ), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(zret6, zret5), + solver.smt.eq( + zret6, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret5, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(zx1, zy1), + solver.smt.eq(zx1, zx2), + ])); // last round - solver.additional_decls.push(( + let zret7 = solver.declare( format!("zret7_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver.additional_assumptions.push(format!("(ite (not (= zx1_{id} (_ bv0 64))) (= zret7_{id} zret6_{id}) (= zret7_{id} (bvadd zret6_{id} (_ bv1 64))))", id = id)); - - solver.additional_decls.push(( + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zx1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(zret7, zret6), + solver.smt.eq( + zret7, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret6, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + let clzret = solver.declare( format!("clzret_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver.additional_assumptions.push(format!("(ite (= zret7_{id} (_ bv0 64)) (= clzret_{id} zret7_{id}) (= clzret_{id} (bvsub zret7_{id} (_ bv1 64))))", id = id)); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.eq( + zret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + solver.smt.eq(clzret, zret7), + solver.smt.eq( + clzret, + solver.smt.list(vec![ + solver.smt.atom("bvsub"), + zret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); // total zeros counter - solver.additional_decls.push(( + let sret0 = solver.declare( format!("sret0_{id}", id = id), - String::from("(_ BitVec 64)"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + sret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), )); - solver - .additional_assumptions - .push(format!("(= sret0_{id} (_ bv0 64))", id = id)); - // round 1 - solver.additional_decls.push(( + let sret1 = solver.declare( format!("sret1_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("sy32_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("sx32_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= sy32_{id} (bvashr {x} #x0000000000000020))", - x = x, - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= sy32_{id} (_ bv18446744073709551615 64))) (= sret1_{id} sret0_{id}) (= sret1_{id} (bvadd sret0_{id} (_ bv32 64))))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= sy32_{id} (_ bv18446744073709551615 64))) (= sx32_{id} sy32_{id}) (= sx32_{id} {x}))", x = x, id = id)); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sy32 = solver.declare( + format!("sy32_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sx32 = solver.declare( + format!("sx32_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + sy32, + solver.smt.bvashr(x, solver.smt.atom("#x0000000000000020")), + )); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy32, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv18446744073709551615"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(sret1, sret0), + solver.smt.eq( + sret1, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv32"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy32, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv18446744073709551615"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(sx32, sy32), + solver.smt.eq(sx32, x), + ])); // round 2 - solver.additional_decls.push(( + let sret2 = solver.declare( format!("sret2_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("sy16_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("sx16_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= sy16_{id} (bvashr sx32_{id} #x0000000000000010))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= sy16_{id} (_ bv18446744073709551615 64))) (= sret2_{id} sret1_{id}) (= sret2_{id} (bvadd sret1_{id} (_ bv16 64))))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= sy16_{id} (_ bv18446744073709551615 64))) (= sx16_{id} sy16_{id}) (= sx16_{id} sx32_{id}))", id = id)); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sy16 = solver.declare( + format!("sy16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sx16 = solver.declare( + format!("sx16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume( + solver.smt.eq( + sy16, + solver + .smt + .bvashr(sx32, solver.smt.atom("#x0000000000000010")), + ), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv18446744073709551615"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(sret2, sret1), + solver.smt.eq( + sret2, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv16"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv18446744073709551615"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(sx16, sy16), + solver.smt.eq(sx16, sx32), + ])); // round 3 - solver.additional_decls.push(( + let sret3 = solver.declare( format!("sret3_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("sy8_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("sx8_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= sy8_{id} (bvashr sx16_{id} #x0000000000000008))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= sy8_{id} (_ bv18446744073709551615 64))) (= sret3_{id} sret2_{id}) (= sret3_{id} (bvadd sret2_{id} (_ bv8 64))))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= sy8_{id} (_ bv18446744073709551615 64))) (= sx8_{id} sy8_{id}) (= sx8_{id} sx16_{id}))", id = id)); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sy8 = solver.declare( + format!("sy8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sx8 = solver.declare( + format!("sx8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume( + solver.smt.eq( + sy8, + solver + .smt + .bvashr(sx16, solver.smt.atom("#x0000000000000008")), + ), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv18446744073709551615"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(sret3, sret2), + solver.smt.eq( + sret3, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv8"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv18446744073709551615"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(sx8, sy8), + solver.smt.eq(sx8, sx16), + ])); // round 4 - solver.additional_decls.push(( + let sret4 = solver.declare( format!("sret4_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("sy4_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("sx4_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= sy4_{id} (bvashr sx8_{id} #x0000000000000004))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= sy4_{id} (_ bv18446744073709551615 64))) (= sret4_{id} sret3_{id}) (= sret4_{id} (bvadd sret3_{id} (_ bv4 64))))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= sy4_{id} (_ bv18446744073709551615 64))) (= sx4_{id} sy4_{id}) (= sx4_{id} sx8_{id}))", id = id)); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sy4 = solver.declare( + format!("sy4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sx4 = solver.declare( + format!("sx4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume( + solver.smt.eq( + sy4, + solver + .smt + .bvashr(sx8, solver.smt.atom("#x0000000000000004")), + ), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv18446744073709551615"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(sret4, sret3), + solver.smt.eq( + sret4, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret3, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv18446744073709551615"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(sx4, sy4), + solver.smt.eq(sx4, sx8), + ])); // round 5 - solver.additional_decls.push(( + let sret5 = solver.declare( format!("sret5_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("sy2_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("sx2_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= sy2_{id} (bvashr sx4_{id} #x0000000000000002))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= sy2_{id} (_ bv18446744073709551615 64))) (= sret5_{id} sret4_{id}) (= sret5_{id} (bvadd sret4_{id} (_ bv2 64))))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= sy2_{id} (_ bv18446744073709551615 64))) (= sx2_{id} sy2_{id}) (= sx2_{id} sx4_{id}))", id = id)); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sy2 = solver.declare( + format!("sy2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sx2 = solver.declare( + format!("sx2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume( + solver.smt.eq( + sy2, + solver + .smt + .bvashr(sx4, solver.smt.atom("#x0000000000000002")), + ), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv18446744073709551615"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(sret5, sret4), + solver.smt.eq( + sret5, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv2"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv18446744073709551615"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(sx2, sy2), + solver.smt.eq(sx2, sx4), + ])); // round 6 - solver.additional_decls.push(( + let sret6 = solver.declare( format!("sret6_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver - .additional_decls - .push((format!("sy1_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("sx1_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= sy1_{id} (bvashr sx2_{id} #x0000000000000001))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= sy1_{id} (_ bv18446744073709551615 64))) (= sret6_{id} sret5_{id}) (= sret6_{id} (bvadd sret5_{id} (_ bv1 64))))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= sy1_{id} (_ bv18446744073709551615 64))) (= sx1_{id} sy1_{id}) (= sx1_{id} sx2_{id}))", id = id)); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sy1 = solver.declare( + format!("sy1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let sx1 = solver.declare( + format!("sx1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume( + solver.smt.eq( + sy1, + solver + .smt + .bvashr(sx2, solver.smt.atom("#x0000000000000001")), + ), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv18446744073709551615"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(sret6, sret5), + solver.smt.eq( + sret6, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret5, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv18446744073709551615"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(sx1, sy1), + solver.smt.eq(sx1, sx2), + ])); // last round - solver.additional_decls.push(( + let sret7 = solver.declare( format!("sret7_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver.additional_assumptions.push(format!("(ite (not (= sx1_{id} (_ bv18446744073709551615 64))) (= sret7_{id} sret6_{id}) (= sret7_{id} (bvadd sret6_{id} (_ bv1 64))))", id = id)); - - solver.additional_decls.push(( + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sx1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv18446744073709551615"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(sret7, sret6), + solver.smt.eq( + sret7, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret6, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + let clsret = solver.declare( format!("clsret_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver.additional_assumptions.push(format!("(ite (= sret7_{id} (_ bv0 64)) (= clsret_{id} sret7_{id}) (= clsret_{id} (bvsub sret7_{id} (_ bv1 64))))", id = id)); - - // final return - solver.additional_decls.push(( + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.eq( + sret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + solver.smt.eq(clsret, sret7), + solver.smt.eq( + clsret, + solver.smt.list(vec![ + solver.smt.atom("bvsub"), + sret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + let cls64ret = solver.declare( format!("cls64ret_{id}", id = id), - String::from("(_ BitVec 64)"), - )); - solver.additional_assumptions.push(format!( - "(ite (bvsle (_ bv0 64) {x}) (= cls64ret_{id} clzret_{id}) (= cls64ret_{id} clsret_{id}))", - x = x, - id = id - )); - - format!("cls64ret_{id}", id = id) + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("bvsle"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + x, + ]), + solver.smt.eq(cls64ret, clzret), + solver.smt.eq(cls64ret, clsret), + ])); + + cls64ret } -pub fn cls32(solver: &mut SolverCtx, x: &String, id: u32) -> String { - let x = format!("((_ extract 31 0) {})", x); +pub fn cls32(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + let x = solver.smt.extract(31, 0, x); + // Generated code. // total zeros counter - solver.additional_decls.push(( + let zret0 = solver.declare( format!("zret0_{id}", id = id), - String::from("(_ BitVec 32)"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.eq( + zret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), )); - solver - .additional_assumptions - .push(format!("(= zret0_{id} (_ bv0 32))", id = id)); - // round 1 - solver.additional_decls.push(( + let zret2 = solver.declare( format!("zret2_{id}", id = id), - String::from("(_ BitVec 32)"), - )); - solver - .additional_decls - .push((format!("zy16_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("zx16_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= zy16_{id} (bvlshr {x} #x00000010))", - id = id, - x = x - )); - solver.additional_assumptions.push(format!("(ite (not (= zy16_{id} (_ bv0 32))) (= zret2_{id} zret0_{id}) (= zret2_{id} (bvadd zret0_{id} (_ bv16 32))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy16_{id} (_ bv0 32))) (= zx16_{id} zy16_{id}) (= zx16_{id} {x}))", - id = id, - x = x - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let zy16 = solver.declare( + format!("zy16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let zx16 = solver.declare( + format!("zx16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(zy16, solver.smt.bvlshr(x, solver.smt.atom("#x00000010"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zret2, zret0), + solver.smt.eq( + zret2, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv16"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zx16, zy16), + solver.smt.eq(zx16, x), + ])); // round 2 - solver.additional_decls.push(( + let zret3 = solver.declare( format!("zret3_{id}", id = id), - String::from("(_ BitVec 32)"), - )); - solver - .additional_decls - .push((format!("zy8_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("zx8_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= zy8_{id} (bvlshr zx16_{id} #x00000008))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= zy8_{id} (_ bv0 32))) (= zret3_{id} zret2_{id}) (= zret3_{id} (bvadd zret2_{id} (_ bv8 32))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy8_{id} (_ bv0 32))) (= zx8_{id} zy8_{id}) (= zx8_{id} zx16_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let zy8 = solver.declare( + format!("zy8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let zx8 = solver.declare( + format!("zx8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(zy8, solver.smt.bvlshr(zx16, solver.smt.atom("#x00000008"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zret3, zret2), + solver.smt.eq( + zret3, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv8"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zx8, zy8), + solver.smt.eq(zx8, zx16), + ])); // round 3 - solver.additional_decls.push(( + let zret4 = solver.declare( format!("zret4_{id}", id = id), - String::from("(_ BitVec 32)"), - )); - solver - .additional_decls - .push((format!("zy4_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("zx4_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= zy4_{id} (bvlshr zx8_{id} #x00000004))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= zy4_{id} (_ bv0 32))) (= zret4_{id} zret3_{id}) (= zret4_{id} (bvadd zret3_{id} (_ bv4 32))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy4_{id} (_ bv0 32))) (= zx4_{id} zy4_{id}) (= zx4_{id} zx8_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let zy4 = solver.declare( + format!("zy4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let zx4 = solver.declare( + format!("zx4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(zy4, solver.smt.bvlshr(zx8, solver.smt.atom("#x00000004"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zret4, zret3), + solver.smt.eq( + zret4, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret3, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zx4, zy4), + solver.smt.eq(zx4, zx8), + ])); // round 4 - solver.additional_decls.push(( + let zret5 = solver.declare( format!("zret5_{id}", id = id), - String::from("(_ BitVec 32)"), - )); - solver - .additional_decls - .push((format!("zy2_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("zx2_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= zy2_{id} (bvlshr zx4_{id} #x00000002))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= zy2_{id} (_ bv0 32))) (= zret5_{id} zret4_{id}) (= zret5_{id} (bvadd zret4_{id} (_ bv2 32))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy2_{id} (_ bv0 32))) (= zx2_{id} zy2_{id}) (= zx2_{id} zx4_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let zy2 = solver.declare( + format!("zy2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let zx2 = solver.declare( + format!("zx2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(zy2, solver.smt.bvlshr(zx4, solver.smt.atom("#x00000002"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zret5, zret4), + solver.smt.eq( + zret5, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv2"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zx2, zy2), + solver.smt.eq(zx2, zx4), + ])); // round 5 - solver.additional_decls.push(( + let zret6 = solver.declare( format!("zret6_{id}", id = id), - String::from("(_ BitVec 32)"), - )); - solver - .additional_decls - .push((format!("zy1_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("zx1_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= zy1_{id} (bvlshr zx2_{id} #x00000001))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= zy1_{id} (_ bv0 32))) (= zret6_{id} zret5_{id}) (= zret6_{id} (bvadd zret5_{id} (_ bv1 32))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy1_{id} (_ bv0 32))) (= zx1_{id} zy1_{id}) (= zx1_{id} zx2_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let zy1 = solver.declare( + format!("zy1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let zx1 = solver.declare( + format!("zx1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(zy1, solver.smt.bvlshr(zx2, solver.smt.atom("#x00000001"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zret6, zret5), + solver.smt.eq( + zret6, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret5, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zx1, zy1), + solver.smt.eq(zx1, zx2), + ])); // last round - solver.additional_decls.push(( + let zret7 = solver.declare( format!("zret7_{id}", id = id), - String::from("(_ BitVec 32)"), - )); - solver.additional_assumptions.push(format!("(ite (not (= zx1_{id} (_ bv0 32))) (= zret7_{id} zret6_{id}) (= zret7_{id} (bvadd zret6_{id} (_ bv1 32))))", id = id)); - - solver.additional_decls.push(( + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zx1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(zret7, zret6), + solver.smt.eq( + zret7, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret6, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + let clzret = solver.declare( format!("clzret_{id}", id = id), - String::from("(_ BitVec 32)"), - )); - solver.additional_assumptions.push(format!("(ite (= zret7_{id} (_ bv0 32)) (= clzret_{id} zret7_{id}) (= clzret_{id} (bvsub zret7_{id} (_ bv1 32))))", id = id)); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.eq( + zret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + solver.smt.eq(clzret, zret7), + solver.smt.eq( + clzret, + solver.smt.list(vec![ + solver.smt.atom("bvsub"), + zret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); // total zeros counter - solver.additional_decls.push(( + let sret0 = solver.declare( format!("sret0_{id}", id = id), - String::from("(_ BitVec 32)"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.eq( + sret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), )); - solver - .additional_assumptions - .push(format!("(= sret0_{id} (_ bv0 32))", id = id)); - // round 1 - solver.additional_decls.push(( + let sret2 = solver.declare( format!("sret2_{id}", id = id), - String::from("(_ BitVec 32)"), - )); - solver - .additional_decls - .push((format!("sy16_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("sx16_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= sy16_{id} (bvashr {x} #x00000010))", - id = id, - x = x - )); - solver.additional_assumptions.push(format!("(ite (not (= sy16_{id} (_ bv4294967295 32))) (= sret2_{id} sret0_{id}) (= sret2_{id} (bvadd sret0_{id} (_ bv16 32))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy16_{id} (_ bv4294967295 32))) (= sx16_{id} sy16_{id}) (= sx16_{id} {x}))", - id = id, - x = x - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let sy16 = solver.declare( + format!("sy16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let sx16 = solver.declare( + format!("sx16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(sy16, solver.smt.bvashr(x, solver.smt.atom("#x00000010"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sret2, sret0), + solver.smt.eq( + sret2, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv16"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sx16, sy16), + solver.smt.eq(sx16, x), + ])); // round 2 - solver.additional_decls.push(( + let sret3 = solver.declare( format!("sret3_{id}", id = id), - String::from("(_ BitVec 32)"), - )); - solver - .additional_decls - .push((format!("sy8_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("sx8_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= sy8_{id} (bvashr sx16_{id} #x00000008))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= sy8_{id} (_ bv4294967295 32))) (= sret3_{id} sret2_{id}) (= sret3_{id} (bvadd sret2_{id} (_ bv8 32))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy8_{id} (_ bv4294967295 32))) (= sx8_{id} sy8_{id}) (= sx8_{id} sx16_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let sy8 = solver.declare( + format!("sy8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let sx8 = solver.declare( + format!("sx8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(sy8, solver.smt.bvashr(sx16, solver.smt.atom("#x00000008"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sret3, sret2), + solver.smt.eq( + sret3, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv8"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sx8, sy8), + solver.smt.eq(sx8, sx16), + ])); // round 3 - solver.additional_decls.push(( + let sret4 = solver.declare( format!("sret4_{id}", id = id), - String::from("(_ BitVec 32)"), - )); - solver - .additional_decls - .push((format!("sy4_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("sx4_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= sy4_{id} (bvashr sx8_{id} #x00000004))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= sy4_{id} (_ bv4294967295 32))) (= sret4_{id} sret3_{id}) (= sret4_{id} (bvadd sret3_{id} (_ bv4 32))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy4_{id} (_ bv4294967295 32))) (= sx4_{id} sy4_{id}) (= sx4_{id} sx8_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let sy4 = solver.declare( + format!("sy4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let sx4 = solver.declare( + format!("sx4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(sy4, solver.smt.bvashr(sx8, solver.smt.atom("#x00000004"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sret4, sret3), + solver.smt.eq( + sret4, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret3, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sx4, sy4), + solver.smt.eq(sx4, sx8), + ])); // round 4 - solver.additional_decls.push(( + let sret5 = solver.declare( format!("sret5_{id}", id = id), - String::from("(_ BitVec 32)"), - )); - solver - .additional_decls - .push((format!("sy2_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("sx2_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= sy2_{id} (bvashr sx4_{id} #x00000002))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= sy2_{id} (_ bv4294967295 32))) (= sret5_{id} sret4_{id}) (= sret5_{id} (bvadd sret4_{id} (_ bv2 32))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy2_{id} (_ bv4294967295 32))) (= sx2_{id} sy2_{id}) (= sx2_{id} sx4_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let sy2 = solver.declare( + format!("sy2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let sx2 = solver.declare( + format!("sx2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(sy2, solver.smt.bvashr(sx4, solver.smt.atom("#x00000002"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sret5, sret4), + solver.smt.eq( + sret5, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv2"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sx2, sy2), + solver.smt.eq(sx2, sx4), + ])); // round 5 - solver.additional_decls.push(( + let sret6 = solver.declare( format!("sret6_{id}", id = id), - String::from("(_ BitVec 32)"), - )); - solver - .additional_decls - .push((format!("sy1_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("sx1_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= sy1_{id} (bvashr sx2_{id} #x00000001))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= sy1_{id} (_ bv4294967295 32))) (= sret6_{id} sret5_{id}) (= sret6_{id} (bvadd sret5_{id} (_ bv1 32))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy1_{id} (_ bv4294967295 32))) (= sx1_{id} sy1_{id}) (= sx1_{id} sx2_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let sy1 = solver.declare( + format!("sy1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let sx1 = solver.declare( + format!("sx1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(sy1, solver.smt.bvashr(sx2, solver.smt.atom("#x00000001"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sret6, sret5), + solver.smt.eq( + sret6, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret5, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sx1, sy1), + solver.smt.eq(sx1, sx2), + ])); // last round - solver.additional_decls.push(( + let sret7 = solver.declare( format!("sret7_{id}", id = id), - String::from("(_ BitVec 32)"), - )); - solver.additional_assumptions.push(format!("(ite (not (= sx1_{id} (_ bv4294967295 32))) (= sret7_{id} sret6_{id}) (= sret7_{id} (bvadd sret6_{id} (_ bv1 32))))", id = id)); - - solver.additional_decls.push(( + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sx1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4294967295"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(sret7, sret6), + solver.smt.eq( + sret7, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret6, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + let clsret = solver.declare( format!("clsret_{id}", id = id), - String::from("(_ BitVec 32)"), - )); - solver.additional_assumptions.push(format!("(ite (= sret7_{id} (_ bv0 32)) (= clsret_{id} sret7_{id}) (= clsret_{id} (bvsub sret7_{id} (_ bv1 32))))", id = id)); - - // final return - solver.additional_decls.push(( + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.eq( + sret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + solver.smt.eq(clsret, sret7), + solver.smt.eq( + clsret, + solver.smt.list(vec![ + solver.smt.atom("bvsub"), + sret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + let cls32ret = solver.declare( format!("cls32ret_{id}", id = id), - String::from("(_ BitVec 32)"), - )); - solver.additional_assumptions.push(format!( - "(ite (bvsle (_ bv0 32) {x}) (= cls32ret_{id} clzret_{id}) (= cls32ret_{id} clsret_{id}))", - id = id, - x = x - )); + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("bvsle"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + x, + ]), + solver.smt.eq(cls32ret, clzret), + solver.smt.eq(cls32ret, clsret), + ])); let padding = solver.new_fresh_bits(solver.bitwidth - 32); - format!( - "(concat {padding} cls32ret_{id})", - padding = padding, - id = id - ) + solver.smt.concat(padding, cls32ret) } -pub fn cls16(solver: &mut SolverCtx, x: &String, id: u32) -> String { - let x = format!("((_ extract 15 0) {})", x); +pub fn cls16(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + let x = solver.smt.extract(15, 0, x); + // Generated code. // total zeros counter - solver.additional_decls.push(( + let zret0 = solver.declare( format!("zret0_{id}", id = id), - String::from("(_ BitVec 16)"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume(solver.smt.eq( + zret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), )); - solver - .additional_assumptions - .push(format!("(= zret0_{id} (_ bv0 16))", id = id)); - // round 1 - solver.additional_decls.push(( + let zret3 = solver.declare( format!("zret3_{id}", id = id), - String::from("(_ BitVec 16)"), - )); - solver - .additional_decls - .push((format!("zy8_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("zx8_{id}", id = id), String::from("(_ BitVec 16)"))); - - solver - .additional_assumptions - .push(format!("(= zy8_{id} (bvlshr {x} #x0008))", id = id, x = x)); - solver.additional_assumptions.push(format!("(ite (not (= zy8_{id} (_ bv0 16))) (= zret3_{id} zret0_{id}) (= zret3_{id} (bvadd zret0_{id} (_ bv8 16))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy8_{id} (_ bv0 16))) (= zx8_{id} zy8_{id}) (= zx8_{id} {x}))", - id = id, - x = x - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let zy8 = solver.declare( + format!("zy8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let zx8 = solver.declare( + format!("zx8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume( + solver + .smt + .eq(zy8, solver.smt.bvlshr(x, solver.smt.atom("#x0008"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(zret3, zret0), + solver.smt.eq( + zret3, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv8"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(zx8, zy8), + solver.smt.eq(zx8, x), + ])); // round 2 - solver.additional_decls.push(( + let zret4 = solver.declare( format!("zret4_{id}", id = id), - String::from("(_ BitVec 16)"), - )); - solver - .additional_decls - .push((format!("zy4_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("zx4_{id}", id = id), String::from("(_ BitVec 16)"))); - - solver - .additional_assumptions - .push(format!("(= zy4_{id} (bvlshr zx8_{id} #x0004))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= zy4_{id} (_ bv0 16))) (= zret4_{id} zret3_{id}) (= zret4_{id} (bvadd zret3_{id} (_ bv4 16))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy4_{id} (_ bv0 16))) (= zx4_{id} zy4_{id}) (= zx4_{id} zx8_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let zy4 = solver.declare( + format!("zy4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let zx4 = solver.declare( + format!("zx4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume( + solver + .smt + .eq(zy4, solver.smt.bvlshr(zx8, solver.smt.atom("#x0004"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(zret4, zret3), + solver.smt.eq( + zret4, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret3, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(zx4, zy4), + solver.smt.eq(zx4, zx8), + ])); // round 3 - solver.additional_decls.push(( + let zret5 = solver.declare( format!("zret5_{id}", id = id), - String::from("(_ BitVec 16)"), - )); - solver - .additional_decls - .push((format!("zy2_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("zx2_{id}", id = id), String::from("(_ BitVec 16)"))); - - solver - .additional_assumptions - .push(format!("(= zy2_{id} (bvlshr zx4_{id} #x0002))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= zy2_{id} (_ bv0 16))) (= zret5_{id} zret4_{id}) (= zret5_{id} (bvadd zret4_{id} (_ bv2 16))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy2_{id} (_ bv0 16))) (= zx2_{id} zy2_{id}) (= zx2_{id} zx4_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let zy2 = solver.declare( + format!("zy2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let zx2 = solver.declare( + format!("zx2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume( + solver + .smt + .eq(zy2, solver.smt.bvlshr(zx4, solver.smt.atom("#x0002"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(zret5, zret4), + solver.smt.eq( + zret5, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv2"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(zx2, zy2), + solver.smt.eq(zx2, zx4), + ])); // round 4 - solver.additional_decls.push(( + let zret6 = solver.declare( format!("zret6_{id}", id = id), - String::from("(_ BitVec 16)"), - )); - solver - .additional_decls - .push((format!("zy1_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("zx1_{id}", id = id), String::from("(_ BitVec 16)"))); - - solver - .additional_assumptions - .push(format!("(= zy1_{id} (bvlshr zx2_{id} #x0001))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= zy1_{id} (_ bv0 16))) (= zret6_{id} zret5_{id}) (= zret6_{id} (bvadd zret5_{id} (_ bv1 16))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy1_{id} (_ bv0 16))) (= zx1_{id} zy1_{id}) (= zx1_{id} zx2_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let zy1 = solver.declare( + format!("zy1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let zx1 = solver.declare( + format!("zx1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume( + solver + .smt + .eq(zy1, solver.smt.bvlshr(zx2, solver.smt.atom("#x0001"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(zret6, zret5), + solver.smt.eq( + zret6, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret5, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(zx1, zy1), + solver.smt.eq(zx1, zx2), + ])); // last round - solver.additional_decls.push(( + let zret7 = solver.declare( format!("zret7_{id}", id = id), - String::from("(_ BitVec 16)"), - )); - solver.additional_assumptions.push(format!("(ite (not (= zx1_{id} (_ bv0 16))) (= zret7_{id} zret6_{id}) (= zret7_{id} (bvadd zret6_{id} (_ bv1 16))))", id = id)); - - solver.additional_decls.push(( + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zx1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(zret7, zret6), + solver.smt.eq( + zret7, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret6, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); + let clzret = solver.declare( format!("clzret_{id}", id = id), - String::from("(_ BitVec 16)"), - )); - solver.additional_assumptions.push(format!("(ite (= zret7_{id} (_ bv0 16)) (= clzret_{id} zret7_{id}) (= clzret_{id} (bvsub zret7_{id} (_ bv1 16))))", id = id)); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.eq( + zret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + solver.smt.eq(clzret, zret7), + solver.smt.eq( + clzret, + solver.smt.list(vec![ + solver.smt.atom("bvsub"), + zret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); // total zeros counter - solver.additional_decls.push(( + let sret0 = solver.declare( format!("sret0_{id}", id = id), - String::from("(_ BitVec 16)"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume(solver.smt.eq( + sret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), )); - solver - .additional_assumptions - .push(format!("(= sret0_{id} (_ bv0 16))", id = id)); - // round 1 - solver.additional_decls.push(( + let sret3 = solver.declare( format!("sret3_{id}", id = id), - String::from("(_ BitVec 16)"), - )); - solver - .additional_decls - .push((format!("sy8_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("sx8_{id}", id = id), String::from("(_ BitVec 16)"))); - - solver - .additional_assumptions - .push(format!("(= sy8_{id} (bvashr {x} #x0008))", id = id, x = x)); - solver.additional_assumptions.push(format!("(ite (not (= sy8_{id} (_ bv65535 16))) (= sret3_{id} sret0_{id}) (= sret3_{id} (bvadd sret0_{id} (_ bv8 16))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy8_{id} (_ bv65535 16))) (= sx8_{id} sy8_{id}) (= sx8_{id} {x}))", - id = id, - x = x - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let sy8 = solver.declare( + format!("sy8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let sx8 = solver.declare( + format!("sx8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume( + solver + .smt + .eq(sy8, solver.smt.bvashr(x, solver.smt.atom("#x0008"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv65535"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(sret3, sret0), + solver.smt.eq( + sret3, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv8"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv65535"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(sx8, sy8), + solver.smt.eq(sx8, x), + ])); // round 2 - solver.additional_decls.push(( + let sret4 = solver.declare( format!("sret4_{id}", id = id), - String::from("(_ BitVec 16)"), - )); - solver - .additional_decls - .push((format!("sy4_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("sx4_{id}", id = id), String::from("(_ BitVec 16)"))); - - solver - .additional_assumptions - .push(format!("(= sy4_{id} (bvashr sx8_{id} #x0004))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= sy4_{id} (_ bv65535 16))) (= sret4_{id} sret3_{id}) (= sret4_{id} (bvadd sret3_{id} (_ bv4 16))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy4_{id} (_ bv65535 16))) (= sx4_{id} sy4_{id}) (= sx4_{id} sx8_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let sy4 = solver.declare( + format!("sy4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let sx4 = solver.declare( + format!("sx4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume( + solver + .smt + .eq(sy4, solver.smt.bvashr(sx8, solver.smt.atom("#x0004"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv65535"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(sret4, sret3), + solver.smt.eq( + sret4, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret3, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv65535"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(sx4, sy4), + solver.smt.eq(sx4, sx8), + ])); // round 3 - solver.additional_decls.push(( + let sret5 = solver.declare( format!("sret5_{id}", id = id), - String::from("(_ BitVec 16)"), - )); - solver - .additional_decls - .push((format!("sy2_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("sx2_{id}", id = id), String::from("(_ BitVec 16)"))); - - solver - .additional_assumptions - .push(format!("(= sy2_{id} (bvashr sx4_{id} #x0002))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= sy2_{id} (_ bv65535 16))) (= sret5_{id} sret4_{id}) (= sret5_{id} (bvadd sret4_{id} (_ bv2 16))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy2_{id} (_ bv65535 16))) (= sx2_{id} sy2_{id}) (= sx2_{id} sx4_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let sy2 = solver.declare( + format!("sy2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let sx2 = solver.declare( + format!("sx2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume( + solver + .smt + .eq(sy2, solver.smt.bvashr(sx4, solver.smt.atom("#x0002"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv65535"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(sret5, sret4), + solver.smt.eq( + sret5, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv2"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv65535"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(sx2, sy2), + solver.smt.eq(sx2, sx4), + ])); // round 4 - solver.additional_decls.push(( + let sret6 = solver.declare( format!("sret6_{id}", id = id), - String::from("(_ BitVec 16)"), - )); - solver - .additional_decls - .push((format!("sy1_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("sx1_{id}", id = id), String::from("(_ BitVec 16)"))); - - solver - .additional_assumptions - .push(format!("(= sy1_{id} (bvashr sx2_{id} #x0001))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= sy1_{id} (_ bv65535 16))) (= sret6_{id} sret5_{id}) (= sret6_{id} (bvadd sret5_{id} (_ bv1 16))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy1_{id} (_ bv65535 16))) (= sx1_{id} sy1_{id}) (= sx1_{id} sx2_{id}))", - id = id - )); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let sy1 = solver.declare( + format!("sy1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let sx1 = solver.declare( + format!("sx1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume( + solver + .smt + .eq(sy1, solver.smt.bvashr(sx2, solver.smt.atom("#x0001"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv65535"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(sret6, sret5), + solver.smt.eq( + sret6, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret5, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv65535"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(sx1, sy1), + solver.smt.eq(sx1, sx2), + ])); // last round - solver.additional_decls.push(( + let sret7 = solver.declare( format!("sret7_{id}", id = id), - String::from("(_ BitVec 16)"), - )); - solver.additional_assumptions.push(format!("(ite (not (= sx1_{id} (_ bv65535 16))) (= sret7_{id} sret6_{id}) (= sret7_{id} (bvadd sret6_{id} (_ bv1 16))))", id = id)); - - solver.additional_decls.push(( + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sx1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv65535"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(sret7, sret6), + solver.smt.eq( + sret7, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret6, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); + let clsret = solver.declare( format!("clsret_{id}", id = id), - String::from("(_ BitVec 16)"), - )); - solver.additional_assumptions.push(format!("(ite (= sret7_{id} (_ bv0 16)) (= clsret_{id} sret7_{id}) (= clsret_{id} (bvsub sret7_{id} (_ bv1 16))))", id = id)); - - // final return - solver.additional_decls.push(( + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.eq( + sret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + solver.smt.eq(clsret, sret7), + solver.smt.eq( + clsret, + solver.smt.list(vec![ + solver.smt.atom("bvsub"), + sret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); + let cls16ret = solver.declare( format!("cls16ret_{id}", id = id), - String::from("(_ BitVec 16)"), - )); - solver.additional_assumptions.push(format!( - "(ite (bvsle (_ bv0 16) {x}) (= cls16ret_{id} clzret_{id}) (= cls16ret_{id} clsret_{id}))", - x = x, - id = id - )); + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("bvsle"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + x, + ]), + solver.smt.eq(cls16ret, clzret), + solver.smt.eq(cls16ret, clsret), + ])); let padding = solver.new_fresh_bits(solver.bitwidth - 16); - format!( - "(concat {padding} cls16ret_{id})", - padding = padding, - id = id - ) + solver.smt.concat(padding, cls16ret) } -pub fn cls8(solver: &mut SolverCtx, x: &String, id: u32) -> String { - let x = format!("((_ extract 7 0) {})", x); +pub fn cls8(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + let x = solver.smt.extract(7, 0, x); + // Generated code. // total zeros counter - solver - .additional_decls - .push((format!("zret0_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_assumptions - .push(format!("(= zret0_{id} (_ bv0 8))", id = id)); - - // round 1 - solver - .additional_decls - .push((format!("zret4_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("zy4_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("zx4_{id}", id = id), String::from("(_ BitVec 8)"))); - - solver - .additional_assumptions - .push(format!("(= zy4_{id} (bvlshr {x} #x04))", id = id, x = x)); - solver.additional_assumptions.push(format!("(ite (not (= zy4_{id} (_ bv0 8))) (= zret4_{id} zret0_{id}) (= zret4_{id} (bvadd zret0_{id} (_ bv4 8))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy4_{id} (_ bv0 8))) (= zx4_{id} zy4_{id}) (= zx4_{id} {x}))", - id = id, - x = x + let zret0 = solver.declare( + format!("zret0_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume(solver.smt.eq( + zret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), )); - + // round 1 + let zret4 = solver.declare( + format!("zret4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let zy4 = solver.declare( + format!("zy4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let zx4 = solver.declare( + format!("zx4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume( + solver + .smt + .eq(zy4, solver.smt.bvlshr(x, solver.smt.atom("#x04"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(zret4, zret0), + solver.smt.eq( + zret4, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4"), + solver.smt.numeral(8), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(zx4, zy4), + solver.smt.eq(zx4, x), + ])); // round 2 - solver - .additional_decls - .push((format!("zret5_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("zy2_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("zx2_{id}", id = id), String::from("(_ BitVec 8)"))); - - solver - .additional_assumptions - .push(format!("(= zy2_{id} (bvlshr zx4_{id} #x02))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= zy2_{id} (_ bv0 8))) (= zret5_{id} zret4_{id}) (= zret5_{id} (bvadd zret4_{id} (_ bv2 8))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy2_{id} (_ bv0 8))) (= zx2_{id} zy2_{id}) (= zx2_{id} zx4_{id}))", - id = id - )); - + let zret5 = solver.declare( + format!("zret5_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let zy2 = solver.declare( + format!("zy2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let zx2 = solver.declare( + format!("zx2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume( + solver + .smt + .eq(zy2, solver.smt.bvlshr(zx4, solver.smt.atom("#x02"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(zret5, zret4), + solver.smt.eq( + zret5, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv2"), + solver.smt.numeral(8), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(zx2, zy2), + solver.smt.eq(zx2, zx4), + ])); // round 3 - solver - .additional_decls - .push((format!("zret6_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("zy1_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("zx1_{id}", id = id), String::from("(_ BitVec 8)"))); - - solver - .additional_assumptions - .push(format!("(= zy1_{id} (bvlshr zx2_{id} #x01))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= zy1_{id} (_ bv0 8))) (= zret6_{id} zret5_{id}) (= zret6_{id} (bvadd zret5_{id} (_ bv1 8))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= zy1_{id} (_ bv0 8))) (= zx1_{id} zy1_{id}) (= zx1_{id} zx2_{id}))", - id = id - )); - + let zret6 = solver.declare( + format!("zret6_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let zy1 = solver.declare( + format!("zy1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let zx1 = solver.declare( + format!("zx1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume( + solver + .smt + .eq(zy1, solver.smt.bvlshr(zx2, solver.smt.atom("#x01"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(zret6, zret5), + solver.smt.eq( + zret6, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret5, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(8), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(zx1, zy1), + solver.smt.eq(zx1, zx2), + ])); // last round - solver - .additional_decls - .push((format!("zret7_{id}", id = id), String::from("(_ BitVec 8)"))); - solver.additional_assumptions.push(format!("(ite (not (= zx1_{id} (_ bv0 8))) (= zret7_{id} zret6_{id}) (= zret7_{id} (bvadd zret6_{id} (_ bv1 8))))", id = id)); - - solver.additional_decls.push(( + let zret7 = solver.declare( + format!("zret7_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + zx1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(zret7, zret6), + solver.smt.eq( + zret7, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + zret6, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(8), + ]), + ]), + ), + ])); + let clzret = solver.declare( format!("clzret_{id}", id = id), - String::from("(_ BitVec 8)"), - )); - solver.additional_assumptions.push(format!("(ite (= zret7_{id} (_ bv0 8)) (= clzret_{id} zret7_{id}) (= clzret_{id} (bvsub zret7_{id} (_ bv1 8))))", id = id)); - + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.eq( + zret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + solver.smt.eq(clzret, zret7), + solver.smt.eq( + clzret, + solver.smt.list(vec![ + solver.smt.atom("bvsub"), + zret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(8), + ]), + ]), + ), + ])); // total zeros counter - solver - .additional_decls - .push((format!("sret0_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_assumptions - .push(format!("(= sret0_{id} (_ bv0 8))", id = id)); - - // round 1 - solver - .additional_decls - .push((format!("sret4_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("sy4_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("sx4_{id}", id = id), String::from("(_ BitVec 8)"))); - - solver - .additional_assumptions - .push(format!("(= sy4_{id} (bvashr {x} #x04))", id = id, x = x)); - solver.additional_assumptions.push(format!("(ite (not (= sy4_{id} (_ bv255 8))) (= sret4_{id} sret0_{id}) (= sret4_{id} (bvadd sret0_{id} (_ bv4 8))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy4_{id} (_ bv255 8))) (= sx4_{id} sy4_{id}) (= sx4_{id} {x}))", - id = id, - x = x + let sret0 = solver.declare( + format!("sret0_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume(solver.smt.eq( + sret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), )); - + // round 1 + let sret4 = solver.declare( + format!("sret4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let sy4 = solver.declare( + format!("sy4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let sx4 = solver.declare( + format!("sx4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume( + solver + .smt + .eq(sy4, solver.smt.bvashr(x, solver.smt.atom("#x04"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv255"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(sret4, sret0), + solver.smt.eq( + sret4, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4"), + solver.smt.numeral(8), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv255"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(sx4, sy4), + solver.smt.eq(sx4, x), + ])); // round 2 - solver - .additional_decls - .push((format!("sret5_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("sy2_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("sx2_{id}", id = id), String::from("(_ BitVec 8)"))); - - solver - .additional_assumptions - .push(format!("(= sy2_{id} (bvashr sx4_{id} #x02))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= sy2_{id} (_ bv255 8))) (= sret5_{id} sret4_{id}) (= sret5_{id} (bvadd sret4_{id} (_ bv2 8))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy2_{id} (_ bv255 8))) (= sx2_{id} sy2_{id}) (= sx2_{id} sx4_{id}))", - id = id - )); - + let sret5 = solver.declare( + format!("sret5_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let sy2 = solver.declare( + format!("sy2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let sx2 = solver.declare( + format!("sx2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume( + solver + .smt + .eq(sy2, solver.smt.bvashr(sx4, solver.smt.atom("#x02"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv255"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(sret5, sret4), + solver.smt.eq( + sret5, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv2"), + solver.smt.numeral(8), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv255"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(sx2, sy2), + solver.smt.eq(sx2, sx4), + ])); // round 3 - solver - .additional_decls - .push((format!("sret6_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("sy1_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("sx1_{id}", id = id), String::from("(_ BitVec 8)"))); - - solver - .additional_assumptions - .push(format!("(= sy1_{id} (bvashr sx2_{id} #x01))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= sy1_{id} (_ bv255 8))) (= sret6_{id} sret5_{id}) (= sret6_{id} (bvadd sret5_{id} (_ bv1 8))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= sy1_{id} (_ bv255 8))) (= sx1_{id} sy1_{id}) (= sx1_{id} sx2_{id}))", - id = id - )); - + let sret6 = solver.declare( + format!("sret6_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let sy1 = solver.declare( + format!("sy1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let sx1 = solver.declare( + format!("sx1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume( + solver + .smt + .eq(sy1, solver.smt.bvashr(sx2, solver.smt.atom("#x01"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv255"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(sret6, sret5), + solver.smt.eq( + sret6, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret5, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(8), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sy1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv255"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(sx1, sy1), + solver.smt.eq(sx1, sx2), + ])); // last round - solver - .additional_decls - .push((format!("sret7_{id}", id = id), String::from("(_ BitVec 8)"))); - solver.additional_assumptions.push(format!("(ite (not (= sx1_{id} (_ bv255 8))) (= sret7_{id} sret6_{id}) (= sret7_{id} (bvadd sret6_{id} (_ bv1 8))))", id = id)); - - solver.additional_decls.push(( + let sret7 = solver.declare( + format!("sret7_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + sx1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv255"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(sret7, sret6), + solver.smt.eq( + sret7, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + sret6, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(8), + ]), + ]), + ), + ])); + let clsret = solver.declare( format!("clsret_{id}", id = id), - String::from("(_ BitVec 8)"), - )); - solver.additional_assumptions.push(format!("(ite (= sret7_{id} (_ bv0 8)) (= clsret_{id} sret7_{id}) (= clsret_{id} (bvsub sret7_{id} (_ bv1 8))))", id = id)); - - // final return - solver.additional_decls.push(( + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.eq( + sret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + solver.smt.eq(clsret, sret7), + solver.smt.eq( + clsret, + solver.smt.list(vec![ + solver.smt.atom("bvsub"), + sret7, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(8), + ]), + ]), + ), + ])); + let cls8ret = solver.declare( format!("cls8ret_{id}", id = id), - String::from("(_ BitVec 8)"), - )); - solver.additional_assumptions.push(format!( - "(ite (bvsle (_ bv0 8) {x}) (= cls8ret_{id} clzret_{id}) (= cls8ret_{id} clsret_{id}))", - id = id, - x = x - )); + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("bvsle"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + x, + ]), + solver.smt.eq(cls8ret, clzret), + solver.smt.eq(cls8ret, clsret), + ])); let padding = solver.new_fresh_bits(solver.bitwidth - 8); - format!( - "(concat {padding} cls8ret_{id})", - padding = padding, - id = id - ) + solver.smt.concat(padding, cls8ret) } -pub fn cls1(solver: &mut SolverCtx, id: u32) -> String { - solver.additional_decls.push(( +pub fn cls1(solver: &mut SolverCtx, id: u32) -> SExpr { + // Generated code. + let cls1ret = solver.declare( format!("cls1ret_{id}", id = id), - String::from("(_ BitVec 1)"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(1), + ]), + ); + solver.assume(solver.smt.eq( + cls1ret, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(1), + ]), )); - solver - .additional_assumptions - .push(format!("(= cls1ret_{id} (_ bv0 1))", id = id)); let padding = solver.new_fresh_bits(solver.bitwidth - 1); - format!( - "(concat {padding} cls1ret_{id})", - padding = padding, - id = id - ) + solver.smt.concat(padding, cls1ret) } diff --git a/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/clz.rs b/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/clz.rs index 739e4146b0d4..86790f07ab18 100644 --- a/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/clz.rs +++ b/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/clz.rs @@ -1,604 +1,1590 @@ use crate::solver::SolverCtx; +use easy_smt::SExpr; // Adapted from https://stackoverflow.com/questions/23856596/how-to-count-leading-zeros-in-a-32-bit-unsigned-integer -pub fn a64clz32(solver: &mut SolverCtx, x: &String, id: u32) -> String { - // extract to ensure we have a 32 bit input - solver - .additional_decls - .push((format!("a64x_{id}", id = id), String::from("(_ BitVec 32)"))); - solver.additional_assumptions.push(format!( - "(= a64x_{id} ((_ extract 31 0) {x}))", - id = id, - x = x - )); - +pub fn clz64(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + // Generated code. // total zeros counter - solver - .additional_decls - .push((format!("ret0_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_assumptions - .push(format!("(= ret0_{id} (_ bv0 64))", id = id)); - - // round 1 - solver - .additional_decls - .push((format!("ret1_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("y16_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("x16_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= y16_{id} (bvlshr a64x_{id} #x00000010))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= y16_{id} (_ bv0 32))) (= ret1_{id} ret0_{id}) (= ret1_{id} (bvadd ret0_{id} (_ bv16 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y16_{id} (_ bv0 32))) (= x16_{id} y16_{id}) (= x16_{id} a64x_{id}))", - id = id + let ret0 = solver.declare( + format!("ret0_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + ret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), )); - - // round 2 - solver - .additional_decls - .push((format!("ret2_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("y8_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("x8_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver - .additional_assumptions - .push(format!("(= y8_{id} (bvlshr x16_{id} #x00000008))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= y8_{id} (_ bv0 32))) (= ret2_{id} ret1_{id}) (= ret2_{id} (bvadd ret1_{id} (_ bv8 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y8_{id} (_ bv0 32))) (= x8_{id} y8_{id}) (= x8_{id} x16_{id}))", - id = id - )); - - // round 3 - solver - .additional_decls - .push((format!("ret3_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("y4_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("x4_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver - .additional_assumptions - .push(format!("(= y4_{id} (bvlshr x8_{id} #x00000004))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= y4_{id} (_ bv0 32))) (= ret3_{id} ret2_{id}) (= ret3_{id} (bvadd ret2_{id} (_ bv4 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y4_{id} (_ bv0 32))) (= x4_{id} y4_{id}) (= x4_{id} x8_{id}))", - id = id - )); - - // round 4 - solver - .additional_decls - .push((format!("ret4_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("y2_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("x2_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver - .additional_assumptions - .push(format!("(= y2_{id} (bvlshr x4_{id} #x00000002))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= y2_{id} (_ bv0 32))) (= ret4_{id} ret3_{id}) (= ret4_{id} (bvadd ret3_{id} (_ bv2 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y2_{id} (_ bv0 32))) (= x2_{id} y2_{id}) (= x2_{id} x4_{id}))", - id = id - )); - - // round 5 - solver - .additional_decls - .push((format!("ret5_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("y1_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("x1_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver - .additional_assumptions - .push(format!("(= y1_{id} (bvlshr x2_{id} #x00000001))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= y1_{id} (_ bv0 32))) (= ret5_{id} ret4_{id}) (= ret5_{id} (bvadd ret4_{id} (_ bv1 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y1_{id} (_ bv0 32))) (= x1_{id} y1_{id}) (= x1_{id} x2_{id}))", - id = id - )); - - // last round - solver - .additional_decls - .push((format!("ret6_{id}", id = id), String::from("(_ BitVec 64)"))); - solver.additional_assumptions.push(format!("(ite (not (= x1_{id} (_ bv0 32))) (= ret6_{id} ret5_{id}) (= ret6_{id} (bvadd ret5_{id} (_ bv1 64))))", id = id)); - - // final return - format!("ret6_{id}", id = id) -} - -pub fn clz64(solver: &mut SolverCtx, x: &String, id: u32) -> String { - // total zeros counter - solver - .additional_decls - .push((format!("ret0_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_assumptions - .push(format!("(= ret0_{id} (_ bv0 64))", id = id)); - // round 1 - solver - .additional_decls - .push((format!("ret1_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("y32_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("x32_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= y32_{id} (bvlshr {x} #x0000000000000020))", - x = x, - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= y32_{id} (_ bv0 64))) (= ret1_{id} ret0_{id}) (= ret1_{id} (bvadd ret0_{id} (_ bv32 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y32_{id} (_ bv0 64))) (= x32_{id} y32_{id}) (= x32_{id} {x}))", - x = x, - id = id + let ret1 = solver.declare( + format!("ret1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let y32 = solver.declare( + format!("y32_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let x32 = solver.declare( + format!("x32_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + y32, + solver.smt.bvlshr(x, solver.smt.atom("#x0000000000000020")), )); - + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y32, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(ret1, ret0), + solver.smt.eq( + ret1, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv32"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y32, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(x32, y32), + solver.smt.eq(x32, x), + ])); // round 2 - solver - .additional_decls - .push((format!("ret2_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("y16_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("x16_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= y16_{id} (bvlshr x32_{id} #x0000000000000010))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= y16_{id} (_ bv0 64))) (= ret2_{id} ret1_{id}) (= ret2_{id} (bvadd ret1_{id} (_ bv16 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y16_{id} (_ bv0 64))) (= x16_{id} y16_{id}) (= x16_{id} x32_{id}))", - id = id - )); - + let ret2 = solver.declare( + format!("ret2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let y16 = solver.declare( + format!("y16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let x16 = solver.declare( + format!("x16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume( + solver.smt.eq( + y16, + solver + .smt + .bvlshr(x32, solver.smt.atom("#x0000000000000010")), + ), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(ret2, ret1), + solver.smt.eq( + ret2, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv16"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(x16, y16), + solver.smt.eq(x16, x32), + ])); // round 3 - solver - .additional_decls - .push((format!("ret3_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("y8_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("x8_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= y8_{id} (bvlshr x16_{id} #x0000000000000008))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= y8_{id} (_ bv0 64))) (= ret3_{id} ret2_{id}) (= ret3_{id} (bvadd ret2_{id} (_ bv8 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y8_{id} (_ bv0 64))) (= x8_{id} y8_{id}) (= x8_{id} x16_{id}))", - id = id - )); - + let ret3 = solver.declare( + format!("ret3_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let y8 = solver.declare( + format!("y8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let x8 = solver.declare( + format!("x8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume( + solver.smt.eq( + y8, + solver + .smt + .bvlshr(x16, solver.smt.atom("#x0000000000000008")), + ), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(ret3, ret2), + solver.smt.eq( + ret3, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv8"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(x8, y8), + solver.smt.eq(x8, x16), + ])); // round 4 - solver - .additional_decls - .push((format!("ret4_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("y4_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("x4_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= y4_{id} (bvlshr x8_{id} #x0000000000000004))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= y4_{id} (_ bv0 64))) (= ret4_{id} ret3_{id}) (= ret4_{id} (bvadd ret3_{id} (_ bv4 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y4_{id} (_ bv0 64))) (= x4_{id} y4_{id}) (= x4_{id} x8_{id}))", - id = id + let ret4 = solver.declare( + format!("ret4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let y4 = solver.declare( + format!("y4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let x4 = solver.declare( + format!("x4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + y4, + solver.smt.bvlshr(x8, solver.smt.atom("#x0000000000000004")), )); - + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(ret4, ret3), + solver.smt.eq( + ret4, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret3, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(x4, y4), + solver.smt.eq(x4, x8), + ])); // round 5 - solver - .additional_decls - .push((format!("ret5_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("y2_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("x2_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= y2_{id} (bvlshr x4_{id} #x0000000000000002))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= y2_{id} (_ bv0 64))) (= ret5_{id} ret4_{id}) (= ret5_{id} (bvadd ret4_{id} (_ bv2 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y2_{id} (_ bv0 64))) (= x2_{id} y2_{id}) (= x2_{id} x4_{id}))", - id = id + let ret5 = solver.declare( + format!("ret5_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let y2 = solver.declare( + format!("y2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let x2 = solver.declare( + format!("x2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + y2, + solver.smt.bvlshr(x4, solver.smt.atom("#x0000000000000002")), )); - + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(ret5, ret4), + solver.smt.eq( + ret5, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv2"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(x2, y2), + solver.smt.eq(x2, x4), + ])); // round 6 - solver - .additional_decls - .push((format!("ret6_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("y1_{id}", id = id), String::from("(_ BitVec 64)"))); - solver - .additional_decls - .push((format!("x1_{id}", id = id), String::from("(_ BitVec 64)"))); - - solver.additional_assumptions.push(format!( - "(= y1_{id} (bvlshr x2_{id} #x0000000000000001))", - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= y1_{id} (_ bv0 64))) (= ret6_{id} ret5_{id}) (= ret6_{id} (bvadd ret5_{id} (_ bv1 64))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y1_{id} (_ bv0 64))) (= x1_{id} y1_{id}) (= x1_{id} x2_{id}))", - id = id + let ret6 = solver.declare( + format!("ret6_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let y1 = solver.declare( + format!("y1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + let x1 = solver.declare( + format!("x1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + y1, + solver.smt.bvlshr(x2, solver.smt.atom("#x0000000000000001")), )); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(ret6, ret5), + solver.smt.eq( + ret6, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret5, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(x1, y1), + solver.smt.eq(x1, x2), + ])); // last round - solver - .additional_decls - .push((format!("ret7_{id}", id = id), String::from("(_ BitVec 64)"))); - solver.additional_assumptions.push(format!("(ite (not (= x1_{id} (_ bv0 64))) (= ret7_{id} ret6_{id}) (= ret7_{id} (bvadd ret6_{id} (_ bv1 64))))", id = id)); - - // final return - format!("ret7_{id}", id = id) + let ret7 = solver.declare( + format!("ret7_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + x1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(64), + ]), + ), + ]), + solver.smt.eq(ret7, ret6), + solver.smt.eq( + ret7, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret6, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(64), + ]), + ]), + ), + ])); + + ret7 } -pub fn clz32(solver: &mut SolverCtx, x: &String, id: u32) -> String { - let x = format!("((_ extract 31 0) {})", x); +pub fn clz32(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + let x = solver.smt.extract(31, 0, x); + // Generated code. // total zeros counter - solver - .additional_decls - .push((format!("ret0_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_assumptions - .push(format!("(= ret0_{id} (_ bv0 32))", id = id)); - - // round 1 - solver - .additional_decls - .push((format!("ret1_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("y16_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("x16_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver.additional_assumptions.push(format!( - "(= y16_{id} (bvlshr {x} #x00000010))", - x = x, - id = id - )); - solver.additional_assumptions.push(format!("(ite (not (= y16_{id} (_ bv0 32))) (= ret1_{id} ret0_{id}) (= ret1_{id} (bvadd ret0_{id} (_ bv16 32))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y16_{id} (_ bv0 32))) (= x16_{id} y16_{id}) (= x16_{id} {x}))", - x = x, - id = id + let ret0 = solver.declare( + format!("ret0_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.eq( + ret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), )); - + // round 1 + let ret1 = solver.declare( + format!("ret1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let y16 = solver.declare( + format!("y16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let x16 = solver.declare( + format!("x16_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(y16, solver.smt.bvlshr(x, solver.smt.atom("#x00000010"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(ret1, ret0), + solver.smt.eq( + ret1, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv16"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y16, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(x16, y16), + solver.smt.eq(x16, x), + ])); // round 2 - solver - .additional_decls - .push((format!("ret2_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("y8_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("x8_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver - .additional_assumptions - .push(format!("(= y8_{id} (bvlshr x16_{id} #x00000008))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= y8_{id} (_ bv0 32))) (= ret2_{id} ret1_{id}) (= ret2_{id} (bvadd ret1_{id} (_ bv8 32))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y8_{id} (_ bv0 32))) (= x8_{id} y8_{id}) (= x8_{id} x16_{id}))", - id = id - )); - + let ret2 = solver.declare( + format!("ret2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let y8 = solver.declare( + format!("y8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let x8 = solver.declare( + format!("x8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(y8, solver.smt.bvlshr(x16, solver.smt.atom("#x00000008"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(ret2, ret1), + solver.smt.eq( + ret2, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv8"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(x8, y8), + solver.smt.eq(x8, x16), + ])); // round 3 - solver - .additional_decls - .push((format!("ret3_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("y4_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("x4_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver - .additional_assumptions - .push(format!("(= y4_{id} (bvlshr x8_{id} #x00000004))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= y4_{id} (_ bv0 32))) (= ret3_{id} ret2_{id}) (= ret3_{id} (bvadd ret2_{id} (_ bv4 32))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y4_{id} (_ bv0 32))) (= x4_{id} y4_{id}) (= x4_{id} x8_{id}))", - id = id - )); - + let ret3 = solver.declare( + format!("ret3_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let y4 = solver.declare( + format!("y4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let x4 = solver.declare( + format!("x4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(y4, solver.smt.bvlshr(x8, solver.smt.atom("#x00000004"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(ret3, ret2), + solver.smt.eq( + ret3, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(x4, y4), + solver.smt.eq(x4, x8), + ])); // round 4 - solver - .additional_decls - .push((format!("ret4_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("y2_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("x2_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver - .additional_assumptions - .push(format!("(= y2_{id} (bvlshr x4_{id} #x00000002))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= y2_{id} (_ bv0 32))) (= ret4_{id} ret3_{id}) (= ret4_{id} (bvadd ret3_{id} (_ bv2 32))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y2_{id} (_ bv0 32))) (= x2_{id} y2_{id}) (= x2_{id} x4_{id}))", - id = id - )); - + let ret4 = solver.declare( + format!("ret4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let y2 = solver.declare( + format!("y2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let x2 = solver.declare( + format!("x2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(y2, solver.smt.bvlshr(x4, solver.smt.atom("#x00000002"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(ret4, ret3), + solver.smt.eq( + ret4, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret3, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv2"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(x2, y2), + solver.smt.eq(x2, x4), + ])); // round 5 - solver - .additional_decls - .push((format!("ret5_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("y1_{id}", id = id), String::from("(_ BitVec 32)"))); - solver - .additional_decls - .push((format!("x1_{id}", id = id), String::from("(_ BitVec 32)"))); - - solver - .additional_assumptions - .push(format!("(= y1_{id} (bvlshr x2_{id} #x00000001))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= y1_{id} (_ bv0 32))) (= ret5_{id} ret4_{id}) (= ret5_{id} (bvadd ret4_{id} (_ bv1 32))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y1_{id} (_ bv0 32))) (= x1_{id} y1_{id}) (= x1_{id} x2_{id}))", - id = id - )); + let ret5 = solver.declare( + format!("ret5_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let y1 = solver.declare( + format!("y1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + let x1 = solver.declare( + format!("x1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume( + solver + .smt + .eq(y1, solver.smt.bvlshr(x2, solver.smt.atom("#x00000001"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(ret5, ret4), + solver.smt.eq( + ret5, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(x1, y1), + solver.smt.eq(x1, x2), + ])); // last round - solver - .additional_decls - .push((format!("ret6_{id}", id = id), String::from("(_ BitVec 32)"))); - solver.additional_assumptions.push(format!("(ite (not (= x1_{id} (_ bv0 32))) (= ret6_{id} ret5_{id}) (= ret6_{id} (bvadd ret5_{id} (_ bv1 32))))", id = id)); + let ret6 = solver.declare( + format!("ret6_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + x1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(32), + ]), + ), + ]), + solver.smt.eq(ret6, ret5), + solver.smt.eq( + ret6, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret5, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(32), + ]), + ]), + ), + ])); - // final return let padding = solver.new_fresh_bits(solver.bitwidth - 32); - format!("(concat {padding} ret6_{id})", padding = padding, id = id) + solver.smt.concat(padding, ret6) } -pub fn clz16(solver: &mut SolverCtx, x: &String, id: u32) -> String { - let x = format!("((_ extract 15 0) {})", x); +pub fn clz16(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + let x = solver.smt.extract(15, 0, x); + // Generated code. // total zeros counter - solver - .additional_decls - .push((format!("ret1_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_assumptions - .push(format!("(= ret1_{id} (_ bv0 16))", id = id)); - - // round 1 - solver - .additional_decls - .push((format!("ret2_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("y8_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("x8_{id}", id = id), String::from("(_ BitVec 16)"))); - - solver - .additional_assumptions - .push(format!("(= y8_{id} (bvlshr {x} #x0008))", x = x, id = id)); - solver.additional_assumptions.push(format!("(ite (not (= y8_{id} (_ bv0 16))) (= ret2_{id} ret1_{id}) (= ret2_{id} (bvadd ret1_{id} (_ bv8 16))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y8_{id} (_ bv0 16))) (= x8_{id} y8_{id}) (= x8_{id} {x}))", - x = x, - id = id + let ret1 = solver.declare( + format!("ret1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume(solver.smt.eq( + ret1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), )); - + // round 1 + let ret2 = solver.declare( + format!("ret2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let y8 = solver.declare( + format!("y8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let x8 = solver.declare( + format!("x8_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume( + solver + .smt + .eq(y8, solver.smt.bvlshr(x, solver.smt.atom("#x0008"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(ret2, ret1), + solver.smt.eq( + ret2, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv8"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y8, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(x8, y8), + solver.smt.eq(x8, x), + ])); // round 2 - solver - .additional_decls - .push((format!("ret3_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("y4_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("x4_{id}", id = id), String::from("(_ BitVec 16)"))); - - solver - .additional_assumptions - .push(format!("(= y4_{id} (bvlshr x8_{id} #x0004))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= y4_{id} (_ bv0 16))) (= ret3_{id} ret2_{id}) (= ret3_{id} (bvadd ret2_{id} (_ bv4 16))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y4_{id} (_ bv0 16))) (= x4_{id} y4_{id}) (= x4_{id} x8_{id}))", - id = id - )); - + let ret3 = solver.declare( + format!("ret3_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let y4 = solver.declare( + format!("y4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let x4 = solver.declare( + format!("x4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume( + solver + .smt + .eq(y4, solver.smt.bvlshr(x8, solver.smt.atom("#x0004"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(ret3, ret2), + solver.smt.eq( + ret3, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(x4, y4), + solver.smt.eq(x4, x8), + ])); // round 3 - solver - .additional_decls - .push((format!("ret4_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("y2_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("x2_{id}", id = id), String::from("(_ BitVec 16)"))); - - solver - .additional_assumptions - .push(format!("(= y2_{id} (bvlshr x4_{id} #x0002))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= y2_{id} (_ bv0 16))) (= ret4_{id} ret3_{id}) (= ret4_{id} (bvadd ret3_{id} (_ bv2 16))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y2_{id} (_ bv0 16))) (= x2_{id} y2_{id}) (= x2_{id} x4_{id}))", - id = id - )); - + let ret4 = solver.declare( + format!("ret4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let y2 = solver.declare( + format!("y2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let x2 = solver.declare( + format!("x2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume( + solver + .smt + .eq(y2, solver.smt.bvlshr(x4, solver.smt.atom("#x0002"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(ret4, ret3), + solver.smt.eq( + ret4, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret3, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv2"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(x2, y2), + solver.smt.eq(x2, x4), + ])); // round 4 - solver - .additional_decls - .push((format!("ret5_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("y1_{id}", id = id), String::from("(_ BitVec 16)"))); - solver - .additional_decls - .push((format!("x1_{id}", id = id), String::from("(_ BitVec 16)"))); - - solver - .additional_assumptions - .push(format!("(= y1_{id} (bvlshr x2_{id} #x0001))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= y1_{id} (_ bv0 16))) (= ret5_{id} ret4_{id}) (= ret5_{id} (bvadd ret4_{id} (_ bv1 16))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y1_{id} (_ bv0 16))) (= x1_{id} y1_{id}) (= x1_{id} x2_{id}))", - id = id - )); + let ret5 = solver.declare( + format!("ret5_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let y1 = solver.declare( + format!("y1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + let x1 = solver.declare( + format!("x1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume( + solver + .smt + .eq(y1, solver.smt.bvlshr(x2, solver.smt.atom("#x0001"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(ret5, ret4), + solver.smt.eq( + ret5, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(x1, y1), + solver.smt.eq(x1, x2), + ])); // last round - solver - .additional_decls - .push((format!("ret6_{id}", id = id), String::from("(_ BitVec 16)"))); - solver.additional_assumptions.push(format!("(ite (not (= x1_{id} (_ bv0 16))) (= ret6_{id} ret5_{id}) (= ret6_{id} (bvadd ret5_{id} (_ bv1 16))))", id = id)); + let ret6 = solver.declare( + format!("ret6_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + x1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(16), + ]), + ), + ]), + solver.smt.eq(ret6, ret5), + solver.smt.eq( + ret6, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret5, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(16), + ]), + ]), + ), + ])); - // final return let padding = solver.new_fresh_bits(solver.bitwidth - 16); - format!("(concat {padding} ret6_{id})", padding = padding, id = id) + solver.smt.concat(padding, ret6) } -pub fn clz8(solver: &mut SolverCtx, x: &String, id: u32) -> String { - let x = format!("((_ extract 7 0) {})", x); +pub fn clz8(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + let x = solver.smt.extract(7, 0, x); + // Generated code. // total zeros counter - solver - .additional_decls - .push((format!("ret0_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_assumptions - .push(format!("(= ret0_{id} (_ bv0 8))", id = id)); - - // round 1 - solver - .additional_decls - .push((format!("ret3_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("y4_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("x4_{id}", id = id), String::from("(_ BitVec 8)"))); - - solver - .additional_assumptions - .push(format!("(= y4_{id} (bvlshr {x} #x04))", x = x, id = id)); - solver.additional_assumptions.push(format!("(ite (not (= y4_{id} (_ bv0 8))) (= ret3_{id} ret0_{id}) (= ret3_{id} (bvadd ret0_{id} (_ bv4 8))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y4_{id} (_ bv0 8))) (= x4_{id} y4_{id}) (= x4_{id} {x}))", - x = x, - id = id + let ret0 = solver.declare( + format!("ret0_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume(solver.smt.eq( + ret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), )); - + // round 1 + let ret3 = solver.declare( + format!("ret3_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let y4 = solver.declare( + format!("y4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let x4 = solver.declare( + format!("x4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume( + solver + .smt + .eq(y4, solver.smt.bvlshr(x, solver.smt.atom("#x04"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(ret3, ret0), + solver.smt.eq( + ret3, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret0, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv4"), + solver.smt.numeral(8), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(x4, y4), + solver.smt.eq(x4, x), + ])); // round 2 - solver - .additional_decls - .push((format!("ret4_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("y2_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("x2_{id}", id = id), String::from("(_ BitVec 8)"))); - - solver - .additional_assumptions - .push(format!("(= y2_{id} (bvlshr x4_{id} #x02))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= y2_{id} (_ bv0 8))) (= ret4_{id} ret3_{id}) (= ret4_{id} (bvadd ret3_{id} (_ bv2 8))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y2_{id} (_ bv0 8))) (= x2_{id} y2_{id}) (= x2_{id} x4_{id}))", - id = id - )); - + let ret4 = solver.declare( + format!("ret4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let y2 = solver.declare( + format!("y2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let x2 = solver.declare( + format!("x2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume( + solver + .smt + .eq(y2, solver.smt.bvlshr(x4, solver.smt.atom("#x02"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(ret4, ret3), + solver.smt.eq( + ret4, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret3, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv2"), + solver.smt.numeral(8), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y2, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(x2, y2), + solver.smt.eq(x2, x4), + ])); // round 3 - solver - .additional_decls - .push((format!("ret5_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("y1_{id}", id = id), String::from("(_ BitVec 8)"))); - solver - .additional_decls - .push((format!("x1_{id}", id = id), String::from("(_ BitVec 8)"))); - - solver - .additional_assumptions - .push(format!("(= y1_{id} (bvlshr x2_{id} #x01))", id = id)); - solver.additional_assumptions.push(format!("(ite (not (= y1_{id} (_ bv0 8))) (= ret5_{id} ret4_{id}) (= ret5_{id} (bvadd ret4_{id} (_ bv1 8))))", id = id)); - solver.additional_assumptions.push(format!( - "(ite (not (= y1_{id} (_ bv0 8))) (= x1_{id} y1_{id}) (= x1_{id} x2_{id}))", - id = id - )); - + let ret5 = solver.declare( + format!("ret5_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let y1 = solver.declare( + format!("y1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + let x1 = solver.declare( + format!("x1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume( + solver + .smt + .eq(y1, solver.smt.bvlshr(x2, solver.smt.atom("#x01"))), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(ret5, ret4), + solver.smt.eq( + ret5, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret4, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(8), + ]), + ]), + ), + ])); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + y1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(x1, y1), + solver.smt.eq(x1, x2), + ])); // last round - solver - .additional_decls - .push((format!("ret6_{id}", id = id), String::from("(_ BitVec 8)"))); - solver.additional_assumptions.push(format!("(ite (not (= x1_{id} (_ bv0 8))) (= ret6_{id} ret5_{id}) (= ret6_{id} (bvadd ret5_{id} (_ bv1 8))))", id = id)); + let ret6 = solver.declare( + format!("ret6_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume(solver.smt.list(vec![ + solver.smt.atom("ite"), + solver.smt.list(vec![ + solver.smt.atom("not"), + solver.smt.eq( + x1, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv0"), + solver.smt.numeral(8), + ]), + ), + ]), + solver.smt.eq(ret6, ret5), + solver.smt.eq( + ret6, + solver.smt.list(vec![ + solver.smt.atom("bvadd"), + ret5, + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("bv1"), + solver.smt.numeral(8), + ]), + ]), + ), + ])); - // final return let padding = solver.new_fresh_bits(solver.bitwidth - 8); - format!("(concat {padding} ret6_{id})", padding = padding, id = id) + solver.smt.concat(padding, ret6) } -pub fn clz1(solver: &mut SolverCtx, x: &String, id: u32) -> String { - let extract = format!("((_ extract 0 0) {})", x); - solver - .additional_decls - .push((format!("ret_{id}", id = id), String::from("(_ BitVec 1)"))); - solver - .additional_assumptions - .push(format!("(= ret_{id} (bvnot {x}))", id = id, x = extract)); +pub fn clz1(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + let x = solver.smt.extract(0, 0, x); + + // Generated code. + let clz1ret = solver.declare( + format!("clz1ret_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(1), + ]), + ); + solver.assume( + solver + .smt + .eq(clz1ret, solver.smt.list(vec![solver.smt.atom("bvnot"), x])), + ); let padding = solver.new_fresh_bits(solver.bitwidth - 1); - format!("(concat {padding} ret_{id})", padding = padding, id = id) + solver.smt.concat(padding, clz1ret) } diff --git a/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/mod.rs b/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/mod.rs index 17bf1f45566d..d57586e1b807 100644 --- a/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/mod.rs +++ b/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/mod.rs @@ -1,3 +1,370 @@ pub mod cls; pub mod clz; pub mod rev; + +#[cfg(test)] +mod tests { + use super::*; + use crate::solver::SolverCtx; + use easy_smt::{Response, SExpr}; + use std::collections::HashMap; + use veri_ir::TypeContext; + + fn get_ctx() -> SolverCtx { + let smt = easy_smt::ContextBuilder::new() + .solver("z3", ["-smt2", "-in"]) + .build() + .unwrap(); + SolverCtx { + smt: smt, + tyctx: TypeContext { + tyvars: HashMap::new(), + tymap: HashMap::new(), + tyvals: HashMap::new(), + bv_unknown_width_sets: HashMap::new(), + }, + bitwidth: 64, + var_map: HashMap::new(), + width_vars: HashMap::new(), + width_assumptions: vec![], + additional_decls: vec![], + additional_assumptions: vec![], + fresh_bits_idx: 0, + } + } + + /// Check that the solver encoding meets expectations for the given input and output. + /// Right now, only works for encodings with a single argument that return a value with + /// the same width as the input. + /// Check that the output is equal to the expected output, and no other output is possible. + fn check_encoding_with_solver(encoding: &str, input: &str, output: &str, width: usize) { + let mut ctx = get_ctx(); + + // Set up an input variable + let ty = ctx.smt.bit_vec_sort(ctx.smt.numeral(width)); + let input_var = ctx.declare("input".to_string(), ty); + + // Set the input equal to our expected input + ctx.additional_assumptions + .push(ctx.smt.eq(input_var, ctx.smt.atom(input))); + + // Call the encoding function to be tested + let output_from_call = match (encoding, width) { + ("rev", 1) => rev::rev1(&mut ctx, input_var, 0), + ("rev", 8) => rev::rev8(&mut ctx, input_var, 0), + ("rev", 16) => rev::rev16(&mut ctx, input_var, 0), + ("rev", 32) => rev::rev32(&mut ctx, input_var, 0), + ("rev", 64) => rev::rev64(&mut ctx, input_var, 0), + + ("clz", 1) => clz::clz1(&mut ctx, input_var, 0), + ("clz", 8) => clz::clz8(&mut ctx, input_var, 0), + ("clz", 16) => clz::clz16(&mut ctx, input_var, 0), + ("clz", 32) => clz::clz32(&mut ctx, input_var, 0), + ("clz", 64) => clz::clz64(&mut ctx, input_var, 0), + + ("cls", 1) => cls::cls1(&mut ctx, 0), + ("cls", 8) => cls::cls8(&mut ctx, input_var, 0), + ("cls", 16) => cls::cls16(&mut ctx, input_var, 0), + ("cls", 32) => cls::cls32(&mut ctx, input_var, 0), + ("cls", 64) => cls::cls64(&mut ctx, input_var, 0), + _ => unreachable!(), + }; + + // Extract the width of bits that we care about. + let output_care_bits = + ctx.smt + .extract((width - 1).try_into().unwrap(), 0, output_from_call); + + // Bookkeeping: declare declarations, assert assumptions + for (name, ty) in &ctx.additional_decls { + ctx.smt.declare_const(name, *ty).unwrap(); + } + ctx.smt + .assert(ctx.smt.and_many(ctx.additional_assumptions.clone())) + .unwrap(); + + // Check that our expected output is valid + ctx.smt.push().unwrap(); + ctx.smt + .assert(ctx.smt.eq(output_care_bits, ctx.smt.atom(output))) + .unwrap(); + if !matches!(ctx.smt.check(), Ok(Response::Sat)) { + // Bad! This is a bug! + // Pop the output assertion + ctx.smt.pop().unwrap(); + // Try again + assert!(matches!(ctx.smt.check(), Ok(Response::Sat))); + // Get the value for what output is to panic with a useful message + let val = ctx.smt.get_value(vec![output_care_bits]).unwrap()[0].1; + panic!("Expected {}, got {}", output, ctx.display_hex_to_bin(val)); + } else { + ctx.smt.pop().unwrap(); + } + + // Check that there is no other possible output + ctx.smt.push().unwrap(); + ctx.smt + .assert( + ctx.smt + .not(ctx.smt.eq(output_care_bits, ctx.smt.atom(output))), + ) + .unwrap(); + assert!(matches!(ctx.smt.check(), Ok(Response::Unsat))); + ctx.smt.pop().unwrap(); + } + + fn check(ctx: &SolverCtx, expr: SExpr, expected: &str) { + let expr_s = format!("{}", ctx.smt.display(expr)); + assert_eq!(expr_s, expected); + } + + #[test] + fn rev1_test() { + let mut ctx = get_ctx(); + + let x = ctx.smt.atom("x"); + let res = rev::rev1(&mut ctx, x, 42); + + check(&ctx, res, "(concat fresh0 rev1ret_42)"); + check(&ctx, ctx.additional_decls[0].1, "(_ BitVec 1)"); + check( + &ctx, + ctx.additional_assumptions[0], + "(= rev1ret_42 ((_ extract 0 0) x))", + ); + } + + #[test] + fn test_rev1_with_solver() { + check_encoding_with_solver("rev", "#b0", "#b0", 1); + check_encoding_with_solver("rev", "#b1", "#b1", 1); + } + + #[test] + fn test_rev8_with_solver() { + check_encoding_with_solver("rev", "#b01010101", "#b10101010", 8); + check_encoding_with_solver("rev", "#b11110000", "#b00001111", 8); + check_encoding_with_solver("rev", "#b00000000", "#b00000000", 8); + check_encoding_with_solver("rev", "#b11111111", "#b11111111", 8); + } + + #[test] + fn test_rev16_with_solver() { + check_encoding_with_solver("rev", "#b0101010101010101", "#b1010101010101010", 16); + check_encoding_with_solver("rev", "#b1111111100000000", "#b0000000011111111", 16); + check_encoding_with_solver("rev", "#b0000000000000000", "#b0000000000000000", 16); + check_encoding_with_solver("rev", "#b1111111111111111", "#b1111111111111111", 16); + } + + #[test] + fn test_rev32_with_solver() { + check_encoding_with_solver( + "rev", + "#b01010101010101010101010101010101", + "#b10101010101010101010101010101010", + 32, + ); + check_encoding_with_solver( + "rev", + "#b11111111111111110000000000000000", + "#b00000000000000001111111111111111", + 32, + ); + check_encoding_with_solver( + "rev", + "#b00000000000000000000000000000000", + "#b00000000000000000000000000000000", + 32, + ); + check_encoding_with_solver( + "rev", + "#b11111111111111111111111111111111", + "#b11111111111111111111111111111111", + 32, + ); + } + + #[test] + fn test_rev64_with_solver() { + check_encoding_with_solver( + "rev", + "#b0101010101010101010101010101010101010101010101010101010101010101", + "#b1010101010101010101010101010101010101010101010101010101010101010", + 64, + ); + check_encoding_with_solver( + "rev", + "#b1111111111111111111111111111111100000000000000000000000000000000", + "#b0000000000000000000000000000000011111111111111111111111111111111", + 64, + ); + check_encoding_with_solver( + "rev", + "#b0000000000000000000000000000000000000000000000000000000000000000", + "#b0000000000000000000000000000000000000000000000000000000000000000", + 64, + ); + check_encoding_with_solver( + "rev", + "#b1111111111111111111111111111111111111111111111111111111111111111", + "#b1111111111111111111111111111111111111111111111111111111111111111", + 64, + ); + } + + #[test] + fn test_clz1_with_solver() { + check_encoding_with_solver("clz", "#b0", "#b1", 1); + check_encoding_with_solver("clz", "#b1", "#b0", 1); + } + + #[test] + fn test_clz8_with_solver() { + check_encoding_with_solver("clz", "#b00000000", "#b00001000", 8); + check_encoding_with_solver("clz", "#b01111111", "#b00000001", 8); + check_encoding_with_solver("clz", "#b11111111", "#b00000000", 8); + } + + #[test] + fn test_clz16_with_solver() { + check_encoding_with_solver("clz", "#b0000000000000000", "#b0000000000010000", 16); + check_encoding_with_solver("clz", "#b0000000000000001", "#b0000000000001111", 16); + check_encoding_with_solver("clz", "#b0111111111111111", "#b0000000000000001", 16); + check_encoding_with_solver("clz", "#b1111111111111111", "#b0000000000000000", 16); + } + + #[test] + fn test_clz32_with_solver() { + check_encoding_with_solver( + "clz", + "#b00000000000000000000000000000000", + "#b00000000000000000000000000100000", + 32, + ); + check_encoding_with_solver( + "clz", + "#b00000000000000000000000000000001", + "#b00000000000000000000000000011111", + 32, + ); + check_encoding_with_solver( + "clz", + "#b01000000000000000000000000000000", + "#b00000000000000000000000000000001", + 32, + ); + check_encoding_with_solver( + "clz", + "#b11111111111111111111111111111111", + "#b00000000000000000000000000000000", + 32, + ); + } + + #[test] + fn test_clz64_with_solver() { + check_encoding_with_solver( + "clz", + "#b0000000000000000000000000000000000000000000000000000000000000000", + "#b0000000000000000000000000000000000000000000000000000000001000000", + 64, + ); + check_encoding_with_solver( + "clz", + "#b0000000000000000000000000000000000000000000000000000000000000001", + "#b0000000000000000000000000000000000000000000000000000000000111111", + 64, + ); + check_encoding_with_solver( + "clz", + "#b0100000000000000000000000000000000000000000000000000000000000000", + "#b0000000000000000000000000000000000000000000000000000000000000001", + 64, + ); + check_encoding_with_solver( + "clz", + "#b1111111111111111111111111111111111111111111111111111111111111111", + "#b0000000000000000000000000000000000000000000000000000000000000000", + 64, + ); + } + + #[test] + fn test_cls1_with_solver() { + check_encoding_with_solver("cls", "#b0", "#b0", 1); + check_encoding_with_solver("cls", "#b1", "#b0", 1); + } + + #[test] + fn test_cls8_with_solver() { + check_encoding_with_solver("cls", "#b00000000", "#b00000111", 8); + check_encoding_with_solver("cls", "#b01111111", "#b00000000", 8); + check_encoding_with_solver("cls", "#b00111111", "#b00000001", 8); + check_encoding_with_solver("cls", "#b11000000", "#b00000001", 8); + check_encoding_with_solver("cls", "#b11111111", "#b00000111", 8); + } + + #[test] + fn test_cls16_with_solver() { + check_encoding_with_solver("cls", "#b0000000000000000", "#b0000000000001111", 16); + check_encoding_with_solver("cls", "#b0111111111111111", "#b0000000000000000", 16); + check_encoding_with_solver("cls", "#b0011111111111111", "#b0000000000000001", 16); + check_encoding_with_solver("cls", "#b1111111111111111", "#b0000000000001111", 16); + } + + #[test] + fn test_cls32_with_solver() { + check_encoding_with_solver( + "cls", + "#b00000000000000000000000000000000", + "#b00000000000000000000000000011111", + 32, + ); + check_encoding_with_solver( + "cls", + "#b01111111111111111111111111111111", + "#b00000000000000000000000000000000", + 32, + ); + check_encoding_with_solver( + "cls", + "#b00100000000000000000000000000000", + "#b00000000000000000000000000000001", + 32, + ); + check_encoding_with_solver( + "cls", + "#b11111111111111111111111111111111", + "#b00000000000000000000000000011111", + 32, + ); + } + + #[test] + fn test_cls64_with_solver() { + check_encoding_with_solver( + "cls", + "#b0000000000000000000000000000000000000000000000000000000000000000", + "#b0000000000000000000000000000000000000000000000000000000000111111", + 64, + ); + check_encoding_with_solver( + "cls", + "#b0010000000000000000000000000000000000000000000000000000000000000", + "#b0000000000000000000000000000000000000000000000000000000000000001", + 64, + ); + check_encoding_with_solver( + "cls", + "#b0111111111111111111111111111111111111111111111111111111111111111", + "#b0000000000000000000000000000000000000000000000000000000000000000", + 64, + ); + check_encoding_with_solver( + "cls", + "#b1111111111111111111111111111111111111111111111111111111111111111", + "#b0000000000000000000000000000000000000000000000000000000000111111", + 64, + ); + } +} diff --git a/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/rev.rs b/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/rev.rs index 3171a59f10e7..64ba9df8f4d4 100644 --- a/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/rev.rs +++ b/cranelift/isle/veri/veri_engine/src/solver/encoded_ops/rev.rs @@ -1,217 +1,533 @@ use crate::solver::SolverCtx; - -pub fn rbit32(solver: &mut SolverCtx, x: &String, id: u32) -> String { - solver - .additional_decls - .push((format!("a64x_{id}", id = id), String::from("(_ BitVec 32)"))); - solver.additional_assumptions.push(format!( - "(= a64x_{id} ((_ extract 31 0) {x}))", - id = id, - x = x +use easy_smt::SExpr; + +pub fn rbit32(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + // Generated code. + let a64x = solver.declare( + format!("a64x_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.eq( + a64x, + solver.smt.list(vec![ + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("extract"), + solver.smt.numeral(31), + solver.smt.numeral(0), + ]), + x, + ]), )); - - solver - .additional_decls - .push((format!("x1_{id}", id = id), String::from("(_ BitVec 32)"))); - solver.additional_assumptions.push(format!( - "(= x1_{id} (bvor (bvlshr a64x_{id} #x00000010) (bvshl a64x_{id} #x00000010)))", - id = id + let x1 = solver.declare( + format!("x1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.eq( + x1, + solver.smt.bvor( + solver.smt.bvlshr(a64x, solver.smt.atom("#x00000010")), + solver.smt.bvshl(a64x, solver.smt.atom("#x00000010")), + ), )); - - solver - .additional_decls - .push((format!("x2_{id}", id = id), String::from("(_ BitVec 32)"))); - solver.additional_assumptions.push(format!("(= x2_{id} (bvor (bvlshr (bvand x1_{id} #xff00ff00) #x00000008) (bvshl (bvand x1_{id} #x00ff00ff) #x00000008)))", id = id)); - - solver - .additional_decls - .push((format!("x3_{id}", id = id), String::from("(_ BitVec 32)"))); - solver.additional_assumptions.push(format!("(= x3_{id} (bvor (bvlshr (bvand x2_{id} #xf0f0f0f0) #x00000004) (bvshl (bvand x2_{id} #x0f0f0f0f) #x00000004)))", id = id)); - - solver - .additional_decls - .push((format!("x4_{id}", id = id), String::from("(_ BitVec 32)"))); - solver.additional_assumptions.push(format!("(= x4_{id} (bvor (bvlshr (bvand x3_{id} #xcccccccc) #x00000002) (bvshl (bvand x3_{id} #x33333333) #x00000002)))", id = id)); - - solver.additional_decls.push(( + let x2 = solver.declare( + format!("x2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.eq( + x2, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x1, solver.smt.atom("#xff00ff00")), + solver.smt.atom("#x00000008"), + ), + solver.smt.bvshl( + solver.smt.bvand(x1, solver.smt.atom("#x00ff00ff")), + solver.smt.atom("#x00000008"), + ), + ), + )); + let x3 = solver.declare( + format!("x3_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.eq( + x3, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x2, solver.smt.atom("#xf0f0f0f0")), + solver.smt.atom("#x00000004"), + ), + solver.smt.bvshl( + solver.smt.bvand(x2, solver.smt.atom("#x0f0f0f0f")), + solver.smt.atom("#x00000004"), + ), + ), + )); + let x4 = solver.declare( + format!("x4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.eq( + x4, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x3, solver.smt.atom("#xcccccccc")), + solver.smt.atom("#x00000002"), + ), + solver.smt.bvshl( + solver.smt.bvand(x3, solver.smt.atom("#x33333333")), + solver.smt.atom("#x00000002"), + ), + ), + )); + let rbitret = solver.declare( format!("rbitret_{id}", id = id), - String::from("(_ BitVec 32)"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.eq( + rbitret, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x4, solver.smt.atom("#xaaaaaaaa")), + solver.smt.atom("#x00000001"), + ), + solver.smt.bvshl( + solver.smt.bvand(x4, solver.smt.atom("#x55555555")), + solver.smt.atom("#x00000001"), + ), + ), )); - solver.additional_assumptions.push(format!("(= rbitret_{id} (bvor (bvlshr (bvand x4_{id} #xaaaaaaaa) #x00000001) (bvshl (bvand x4_{id} #x55555555) #x00000001)))", id = id)); let padding = solver.new_fresh_bits(solver.bitwidth - 32); - format!( - "(concat {padding} rbitret_{id})", - padding = padding, - id = id - ) + solver.smt.concat(padding, rbitret) } -pub fn rev64(solver: &mut SolverCtx, x: &String, id: u32) -> String { - solver - .additional_decls - .push((format!("x1_{id}", id = id), String::from("(_ BitVec 64)"))); - solver.additional_assumptions.push(format!( - "(= x1_{id} (bvor (bvlshr {x} #x0000000000000020) (bvshl {x} #x0000000000000020)))", - id = id, - x = x - )); - - solver - .additional_decls - .push((format!("x2_{id}", id = id), String::from("(_ BitVec 64)"))); - solver.additional_assumptions.push(format!("(= x2_{id} (bvor (bvlshr (bvand x1_{id} #xffff0000ffff0000) #x0000000000000010) (bvshl (bvand x1_{id} #x0000ffff0000ffff) #x0000000000000010)))", id = id)); - - solver - .additional_decls - .push((format!("x3_{id}", id = id), String::from("(_ BitVec 64)"))); - solver.additional_assumptions.push(format!("(= x3_{id} (bvor (bvlshr (bvand x2_{id} #xff00ff00ff00ff00) #x0000000000000008) (bvshl (bvand x2_{id} #x00ff00ff00ff00ff) #x0000000000000008)))", id = id)); - - solver - .additional_decls - .push((format!("x4_{id}", id = id), String::from("(_ BitVec 64)"))); - solver.additional_assumptions.push(format!("(= x4_{id} (bvor (bvlshr (bvand x3_{id} #xf0f0f0f0f0f0f0f0) #x0000000000000004) (bvshl (bvand x3_{id} #x0f0f0f0f0f0f0f0f) #x0000000000000004)))", id = id)); - - solver - .additional_decls - .push((format!("x5_{id}", id = id), String::from("(_ BitVec 64)"))); - solver.additional_assumptions.push(format!("(= x5_{id} (bvor (bvlshr (bvand x4_{id} #xcccccccccccccccc) #x0000000000000002) (bvshl (bvand x4_{id} #x3333333333333333) #x0000000000000002)))", id = id)); - - solver.additional_decls.push(( +pub fn rev64(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + // Generated code. + let x1 = solver.declare( + format!("x1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + x1, + solver.smt.bvor( + solver.smt.bvlshr(x, solver.smt.atom("#x0000000000000020")), + solver.smt.bvshl(x, solver.smt.atom("#x0000000000000020")), + ), + )); + let x2 = solver.declare( + format!("x2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + x2, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x1, solver.smt.atom("#xffff0000ffff0000")), + solver.smt.atom("#x0000000000000010"), + ), + solver.smt.bvshl( + solver.smt.bvand(x1, solver.smt.atom("#x0000ffff0000ffff")), + solver.smt.atom("#x0000000000000010"), + ), + ), + )); + let x3 = solver.declare( + format!("x3_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + x3, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x2, solver.smt.atom("#xff00ff00ff00ff00")), + solver.smt.atom("#x0000000000000008"), + ), + solver.smt.bvshl( + solver.smt.bvand(x2, solver.smt.atom("#x00ff00ff00ff00ff")), + solver.smt.atom("#x0000000000000008"), + ), + ), + )); + let x4 = solver.declare( + format!("x4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + x4, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x3, solver.smt.atom("#xf0f0f0f0f0f0f0f0")), + solver.smt.atom("#x0000000000000004"), + ), + solver.smt.bvshl( + solver.smt.bvand(x3, solver.smt.atom("#x0f0f0f0f0f0f0f0f")), + solver.smt.atom("#x0000000000000004"), + ), + ), + )); + let x5 = solver.declare( + format!("x5_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + x5, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x4, solver.smt.atom("#xcccccccccccccccc")), + solver.smt.atom("#x0000000000000002"), + ), + solver.smt.bvshl( + solver.smt.bvand(x4, solver.smt.atom("#x3333333333333333")), + solver.smt.atom("#x0000000000000002"), + ), + ), + )); + let rev64ret = solver.declare( format!("rev64ret_{id}", id = id), - String::from("(_ BitVec 64)"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(64), + ]), + ); + solver.assume(solver.smt.eq( + rev64ret, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x5, solver.smt.atom("#xaaaaaaaaaaaaaaaa")), + solver.smt.atom("#x0000000000000001"), + ), + solver.smt.bvshl( + solver.smt.bvand(x5, solver.smt.atom("#x5555555555555555")), + solver.smt.atom("#x0000000000000001"), + ), + ), )); - solver.additional_assumptions.push(format!("(= rev64ret_{id} (bvor (bvlshr (bvand x5_{id} #xaaaaaaaaaaaaaaaa) #x0000000000000001) (bvshl (bvand x5_{id} #x5555555555555555) #x0000000000000001)))", id = id)); - format!("rev64ret_{id}", id = id) + rev64ret } -pub fn rev32(solver: &mut SolverCtx, x: &String, id: u32) -> String { - let x = format!("((_ extract 31 0) {})", x); - - solver - .additional_decls - .push((format!("x1_{id}", id = id), String::from("(_ BitVec 32)"))); - solver.additional_assumptions.push(format!( - "(= x1_{id} (bvor (bvlshr {x} #x00000010) (bvshl {x} #x00000010)))", - x = x, - id = id +pub fn rev32(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + let x = solver.smt.extract(31, 0, x); + + // Generated code. + let x1 = solver.declare( + format!("x1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.eq( + x1, + solver.smt.bvor( + solver.smt.bvlshr(x, solver.smt.atom("#x00000010")), + solver.smt.bvshl(x, solver.smt.atom("#x00000010")), + ), )); - - solver - .additional_decls - .push((format!("x2_{id}", id = id), String::from("(_ BitVec 32)"))); - solver.additional_assumptions.push(format!("(= x2_{id} (bvor (bvlshr (bvand x1_{id} #xff00ff00) #x00000008) (bvshl (bvand x1_{id} #x00ff00ff) #x00000008)))", id = id)); - - solver - .additional_decls - .push((format!("x3_{id}", id = id), String::from("(_ BitVec 32)"))); - solver.additional_assumptions.push(format!("(= x3_{id} (bvor (bvlshr (bvand x2_{id} #xf0f0f0f0) #x00000004) (bvshl (bvand x2_{id} #x0f0f0f0f) #x00000004)))", id = id)); - - solver - .additional_decls - .push((format!("x4_{id}", id = id), String::from("(_ BitVec 32)"))); - solver.additional_assumptions.push(format!("(= x4_{id} (bvor (bvlshr (bvand x3_{id} #xcccccccc) #x00000002) (bvshl (bvand x3_{id} #x33333333) #x00000002)))", id = id)); - - solver.additional_decls.push(( + let x2 = solver.declare( + format!("x2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.eq( + x2, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x1, solver.smt.atom("#xff00ff00")), + solver.smt.atom("#x00000008"), + ), + solver.smt.bvshl( + solver.smt.bvand(x1, solver.smt.atom("#x00ff00ff")), + solver.smt.atom("#x00000008"), + ), + ), + )); + let x3 = solver.declare( + format!("x3_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.eq( + x3, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x2, solver.smt.atom("#xf0f0f0f0")), + solver.smt.atom("#x00000004"), + ), + solver.smt.bvshl( + solver.smt.bvand(x2, solver.smt.atom("#x0f0f0f0f")), + solver.smt.atom("#x00000004"), + ), + ), + )); + let x4 = solver.declare( + format!("x4_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.eq( + x4, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x3, solver.smt.atom("#xcccccccc")), + solver.smt.atom("#x00000002"), + ), + solver.smt.bvshl( + solver.smt.bvand(x3, solver.smt.atom("#x33333333")), + solver.smt.atom("#x00000002"), + ), + ), + )); + let rev32ret = solver.declare( format!("rev32ret_{id}", id = id), - String::from("(_ BitVec 32)"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(32), + ]), + ); + solver.assume(solver.smt.eq( + rev32ret, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x4, solver.smt.atom("#xaaaaaaaa")), + solver.smt.atom("#x00000001"), + ), + solver.smt.bvshl( + solver.smt.bvand(x4, solver.smt.atom("#x55555555")), + solver.smt.atom("#x00000001"), + ), + ), )); - solver.additional_assumptions.push(format!("(= rev32ret_{id} (bvor (bvlshr (bvand x4_{id} #xaaaaaaaa) #x00000001) (bvshl (bvand x4_{id} #x55555555) #x00000001)))", id = id)); let padding = solver.new_fresh_bits(solver.bitwidth - 32); - format!( - "(concat {padding} rev32ret_{id})", - padding = padding, - id = id - ) + solver.smt.concat(padding, rev32ret) } -pub fn rev16(solver: &mut SolverCtx, x: &String, id: u32) -> String { - let x = format!("((_ extract 15 0) {})", x); - - solver - .additional_decls - .push((format!("x1_{id}", id = id), String::from("(_ BitVec 16)"))); - solver.additional_assumptions.push(format!( - "(= x1_{id} (bvor (bvlshr {x} #x0008) (bvshl {x} #x0008)))", - x = x, - id = id +pub fn rev16(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + let x = solver.smt.extract(15, 0, x); + + // Generated code. + let x1 = solver.declare( + format!("x1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume(solver.smt.eq( + x1, + solver.smt.bvor( + solver.smt.bvlshr(x, solver.smt.atom("#x0008")), + solver.smt.bvshl(x, solver.smt.atom("#x0008")), + ), )); - - solver - .additional_decls - .push((format!("x2_{id}", id = id), String::from("(_ BitVec 16)"))); - solver.additional_assumptions.push(format!("(= x2_{id} (bvor (bvlshr (bvand x1_{id} #xf0f0) #x0004) (bvshl (bvand x1_{id} #x0f0f) #x0004)))", id = id)); - - solver - .additional_decls - .push((format!("x3_{id}", id = id), String::from("(_ BitVec 16)"))); - solver.additional_assumptions.push(format!("(= x3_{id} (bvor (bvlshr (bvand x2_{id} #xcccc) #x0002) (bvshl (bvand x2_{id} #x3333) #x0002)))", id = id)); - - solver.additional_decls.push(( + let x2 = solver.declare( + format!("x2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume(solver.smt.eq( + x2, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x1, solver.smt.atom("#xf0f0")), + solver.smt.atom("#x0004"), + ), + solver.smt.bvshl( + solver.smt.bvand(x1, solver.smt.atom("#x0f0f")), + solver.smt.atom("#x0004"), + ), + ), + )); + let x3 = solver.declare( + format!("x3_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume(solver.smt.eq( + x3, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x2, solver.smt.atom("#xcccc")), + solver.smt.atom("#x0002"), + ), + solver.smt.bvshl( + solver.smt.bvand(x2, solver.smt.atom("#x3333")), + solver.smt.atom("#x0002"), + ), + ), + )); + let rev16ret = solver.declare( format!("rev16ret_{id}", id = id), - String::from("(_ BitVec 16)"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(16), + ]), + ); + solver.assume(solver.smt.eq( + rev16ret, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x3, solver.smt.atom("#xaaaa")), + solver.smt.atom("#x0001"), + ), + solver.smt.bvshl( + solver.smt.bvand(x3, solver.smt.atom("#x5555")), + solver.smt.atom("#x0001"), + ), + ), )); - solver.additional_assumptions.push(format!("(= rev16ret_{id} (bvor (bvlshr (bvand x3_{id} #xaaaa) #x0001) (bvshl (bvand x3_{id} #x5555) #x0001)))", id = id)); let padding = solver.new_fresh_bits(solver.bitwidth - 16); - format!( - "(concat {padding} rev16ret_{id})", - padding = padding, - id = id - ) + solver.smt.concat(padding, rev16ret) } -pub fn rev8(solver: &mut SolverCtx, x: &String, id: u32) -> String { - let x = format!("((_ extract 7 0) {})", x); - - solver - .additional_decls - .push((format!("x1_{id}", id = id), String::from("(_ BitVec 8)"))); - solver.additional_assumptions.push(format!( - "(= x1_{id} (bvor (bvlshr {x} #x04) (bvshl {x} #x04)))", - id = id, - x = x +pub fn rev8(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + let x = solver.smt.extract(7, 0, x); + + // Generated code. + let x1 = solver.declare( + format!("x1_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume(solver.smt.eq( + x1, + solver.smt.bvor( + solver.smt.bvlshr(x, solver.smt.atom("#x04")), + solver.smt.bvshl(x, solver.smt.atom("#x04")), + ), )); - - solver - .additional_decls - .push((format!("x2_{id}", id = id), String::from("(_ BitVec 8)"))); - solver.additional_assumptions.push(format!( - "(= x2_{id} (bvor (bvlshr (bvand x1_{id} #xcc) #x02) (bvshl (bvand x1_{id} #x33) #x02)))", - id = id + let x2 = solver.declare( + format!("x2_{id}", id = id), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume(solver.smt.eq( + x2, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x1, solver.smt.atom("#xcc")), + solver.smt.atom("#x02"), + ), + solver.smt.bvshl( + solver.smt.bvand(x1, solver.smt.atom("#x33")), + solver.smt.atom("#x02"), + ), + ), )); - - solver.additional_decls.push(( + let rev8ret = solver.declare( format!("rev8ret_{id}", id = id), - String::from("(_ BitVec 8)"), + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(8), + ]), + ); + solver.assume(solver.smt.eq( + rev8ret, + solver.smt.bvor( + solver.smt.bvlshr( + solver.smt.bvand(x2, solver.smt.atom("#xaa")), + solver.smt.atom("#x01"), + ), + solver.smt.bvshl( + solver.smt.bvand(x2, solver.smt.atom("#x55")), + solver.smt.atom("#x01"), + ), + ), )); - solver.additional_assumptions.push(format!("(= rev8ret_{id} (bvor (bvlshr (bvand x2_{id} #xaa) #x01) (bvshl (bvand x2_{id} #x55) #x01)))", id = id)); let padding = solver.new_fresh_bits(solver.bitwidth - 8); - format!( - "(concat {padding} rev8ret_{id})", - padding = padding, - id = id - ) + solver.smt.concat(padding, rev8ret) } -pub fn rev1(solver: &mut SolverCtx, x: &String, id: u32) -> String { - let extract = format!("((_ extract 0 0) {})", x); +pub fn rev1(solver: &mut SolverCtx, x: SExpr, id: u32) -> SExpr { + let x = solver.smt.extract(0, 0, x); - solver.additional_decls.push(( + // Generated code. + let rev1ret = solver.declare( format!("rev1ret_{id}", id = id), - String::from("(_ BitVec 1)"), - )); - solver - .additional_assumptions - .push(format!("(= rev1ret_{id} {x})", id = id, x = extract)); + solver.smt.list(vec![ + solver.smt.atoms().und, + solver.smt.atom("BitVec"), + solver.smt.numeral(1), + ]), + ); + solver.assume(solver.smt.eq(rev1ret, x)); let padding = solver.new_fresh_bits(solver.bitwidth - 1); - format!( - "(concat {padding} rev1ret_{id})", - padding = padding, - id = id - ) + solver.smt.concat(padding, rev1ret) } diff --git a/cranelift/isle/veri/veri_engine/src/type_inference.rs b/cranelift/isle/veri/veri_engine/src/type_inference.rs index c773cd53db6c..d4a34538936d 100644 --- a/cranelift/isle/veri/veri_engine/src/type_inference.rs +++ b/cranelift/isle/veri/veri_engine/src/type_inference.rs @@ -4,7 +4,7 @@ use std::hash::Hash; use cranelift_isle as isle; use isle::ast::{Decl, Defs}; use isle::sema::{TermEnv, TypeEnv, VarId}; -use veri_annotation::parser_wrapper::{AnnotationEnv}; +use veri_annotation::parser_wrapper::AnnotationEnv; use veri_ir::Expr; use veri_ir::{annotation_ir, TypeContext}; @@ -308,8 +308,9 @@ fn add_annotation_constraints( let e = veri_ir::Expr::Terminal(veri_ir::Terminal::Const(c.value, t)); match c.ty { annotation_ir::Type::BitVector => { - tree.bv_constraints - .insert(TypeExpr::Concrete(t, c.ty.clone())); + let ty = annotation_ir::Type::BitVectorWithWidth(dbg!(c.width)); + tree.concrete_constraints + .insert(TypeExpr::Concrete(t, ty)); } _ => { tree.concrete_constraints @@ -325,18 +326,20 @@ fn add_annotation_constraints( } annotation_ir::Expr::True(_) => { let t = tree.next_type_var; - tree.concrete_constraints.insert(TypeExpr::Concrete(t, annotation_ir::Type::Bool)); + tree.concrete_constraints + .insert(TypeExpr::Concrete(t, annotation_ir::Type::Bool)); tree.next_type_var += 1; (veri_ir::Expr::Terminal(veri_ir::Terminal::True), t) } annotation_ir::Expr::False(_) => { let t = tree.next_type_var; - tree.concrete_constraints.insert(TypeExpr::Concrete(t, annotation_ir::Type::Bool)); + tree.concrete_constraints + .insert(TypeExpr::Concrete(t, annotation_ir::Type::Bool)); tree.next_type_var += 1; (veri_ir::Expr::Terminal(veri_ir::Terminal::False), t) - } + } annotation_ir::Expr::WidthOf(x, _) => { let (ex, tx) = add_annotation_constraints(*x.clone(), tree, annotation_info); @@ -390,9 +393,7 @@ fn add_annotation_constraints( .insert(TypeExpr::Concrete(t, annotation_ir::Type::Bool)); tree.next_type_var += 1; - ( - veri_ir::Expr::Unary(veri_ir::UnaryOp::Not, Box::new(e1)), t, - ) + (veri_ir::Expr::Unary(veri_ir::UnaryOp::Not, Box::new(e1)), t) } annotation_ir::Expr::Or(x, y, _) => { let (e1, t1) = add_annotation_constraints(*x, tree, annotation_info); @@ -678,7 +679,7 @@ fn add_annotation_constraints( veri_ir::Expr::Binary(veri_ir::BinaryOp::BVShl, Box::new(xe), Box::new(ae)), t, ) - } + } annotation_ir::Expr::BVShr(x, a, _) => { let (xe, xt) = add_annotation_constraints(*x, tree, annotation_info); let (ae, at) = add_annotation_constraints(*a, tree, annotation_info); @@ -1002,7 +1003,7 @@ fn add_isle_constraints( ("Type".to_owned(), annotation_ir::Type::Int), ( "Imm12".to_owned(), - annotation_ir::Type::BitVectorWithWidth(12), + annotation_ir::Type::BitVectorWithWidth(24), ), ( "Imm64".to_owned(), @@ -1036,6 +1037,10 @@ fn add_isle_constraints( ("InstOutput".to_owned(), annotation_ir::Type::BitVector), ("ImmExtend".to_owned(), annotation_ir::Type::Int), ("ShiftOpAndAmt".to_owned(), annotation_ir::Type::BitVectorWithWidth(8)), + ( + "ShiftOpAndAmt".to_owned(), + annotation_ir::Type::BitVectorWithWidth(8), + ), ]); let mut annotation_vars = vec![]; diff --git a/cranelift/isle/veri/veri_engine/tests/utils/mod.rs b/cranelift/isle/veri/veri_engine/tests/utils/mod.rs index e9940225051a..688ba32cd144 100644 --- a/cranelift/isle/veri/veri_engine/tests/utils/mod.rs +++ b/cranelift/isle/veri/veri_engine/tests/utils/mod.rs @@ -1,16 +1,16 @@ use cranelift_isle::compile::create_envs; -use cranelift_isle::lexer::Lexer; use cranelift_isle::sema::{Rule, TermEnv, TypeEnv}; use std::env; use std::path::PathBuf; +use std::time::Duration; use strum::IntoEnumIterator; use strum_macros::EnumIter; use veri_annotation::parser_wrapper::parse_annotations; use veri_engine_lib::rule_tree::verify_rules_for_type_wih_rule_filter; use veri_engine_lib::termname::pattern_contains_termname; use veri_engine_lib::type_inference::type_all_rules; -use veri_engine_lib::{isle_files_to_terms, rule_tree::verify_rules_for_type_with_lhs_contains}; -use veri_ir::{Counterexample, Type, VerificationResult}; +use veri_engine_lib::{rule_tree::verify_rules_for_type_with_lhs_contains}; +use veri_ir::{Counterexample, VerificationResult}; // TODO FB: once the opcode situation is resolved, return and: // - add nice output @@ -84,9 +84,53 @@ pub fn custom_result(f: &TestResultBuilder) -> TestResult { Bitwidth::iter().map(|w| f(w)).collect() } +/// Run the test with a 4 minute timeout, retrying 5 times if timeout hit, waiting 1ms between tries +pub fn run_and_retry(f: F) -> () +where + F: Fn() -> (), + F: Send + 'static + Copy, +{ + let delay_before_retrying = retry::delay::Fixed::from_millis(1); + let num_retries = 5; + let timeout_per_try = Duration::from_secs(4 * 60); + + use std::{sync::mpsc, thread}; + let result = retry::retry_with_index(delay_before_retrying, |current_try| { + if current_try > num_retries { + return retry::OperationResult::Err(format!( + "Test did not succeed within {} tries", + num_retries + )); + } + if current_try > 1 { + println!("Retrying test that timed out, try #{}", current_try); + } + + // From: https://github.com/rust-lang/rfcs/issues/2798 + let (done_tx, done_rx) = mpsc::channel(); + let handle = thread::spawn(move || { + f(); + done_tx.send(()).expect("Unable to send completion signal"); + }); + + match done_rx.recv_timeout(timeout_per_try) { + Ok(_) => match handle.join() { + Ok(_) => retry::OperationResult::Ok("Test thread succeeded"), + Err(e) => retry::OperationResult::Err(format!("Test thread panicked {:?}", e)), + }, + Err(_) => match handle.join() { + Ok(_) => retry::OperationResult::Retry("Test thread took too long".to_string()), + Err(e) => retry::OperationResult::Err(format!("Test thread panicked {:?}", e)), + }, + } + }); + result.unwrap(); +} + fn test(inputs: Vec, tr: TestResult) -> () { test_with_filter(inputs, None, tr) } + // TODO: waiting on output thoughts. re do previous? fn test_with_filter(inputs: Vec, name_filter: Option, tr: TestResult) -> () { let lexer = cranelift_isle::lexer::Lexer::from_files(&inputs).unwrap(); @@ -160,6 +204,7 @@ pub fn test_from_file(s: &str, tr: TestResult) -> () { .join("../../../codegen/src") .join("prelude_lower.isle"); let input = PathBuf::from(s); + test(vec![prelude_isle, prelude_lower_isle, clif_isle, input], tr); } diff --git a/cranelift/isle/veri/veri_engine/tests/veri.rs b/cranelift/isle/veri/veri_engine/tests/veri.rs index 9cbd1ad4ba0e..9e44936f7efc 100644 --- a/cranelift/isle/veri/veri_engine/tests/veri.rs +++ b/cranelift/isle/veri/veri_engine/tests/veri.rs @@ -3,7 +3,7 @@ use utils::{ all_failure_result, all_success_result, custom_result, just_8_result, lte_64_success_result, }; use utils::{ - test_from_file, test_from_file_custom_prelude, test_from_file_self_contained, + run_and_retry, test_from_file, test_from_file_custom_prelude, test_from_file_self_contained, test_from_file_with_filter, Bitwidth, }; use veri_ir::{Counterexample, VerificationResult}; @@ -31,7 +31,7 @@ fn test_implicit_conversions() { lte_64_success_result(), ); - /* + /* test_from_file_custom_prelude( "./tests/code/selfcontained/prelude.isle", "./tests/code/selfcontained/iadd_to_sub_implicit_conv.isle", @@ -42,38 +42,279 @@ fn test_implicit_conversions() { // Currently timing out, disabling for now. // https://github.com/avanhatt/wasmtime/issues/13 +/* #[test] -fn test_iadd_from_file() { - test_from_file("./examples/iadd/base_case.isle", lte_64_success_result()); - //test_from_file("./examples/iadd/imm12.isle", lte_64_success_result()); - //test_from_file("./examples/iadd/imm12_2.isle", lte_64_success_result()); - //test_from_file("./examples/iadd/imm12negated.isle", lte_64_success_result()); - //test_from_file("./examples/iadd/imm12negated2.isle", lte_64_success_result()); - //test_from_file("./examples/iadd/extend.isle", lte_64_success_result()); - //test_from_file("./examples/iadd/extend2.isle", lte_64_success_result()); - test_from_file("./examples/iadd/shift.isle", lte_64_success_result()); - test_from_file("./examples/iadd/shift.isle", lte_64_success_result()); - test_from_file("./examples/iadd/madd.isle", lte_64_success_result()); - test_from_file("./examples/iadd/madd2.isle", lte_64_success_result()); - test_from_file("./examples/iadd/msub.isle", lte_64_success_result()); +fn test_iadd_base() { + run_and_retry(|| test_from_file("./examples/iadd/base_case.isle", lte_64_success_result())); } +#[test] +fn test_iadd_imm12() { + run_and_retry(|| test_from_file("./examples/iadd/imm12.isle", lte_64_success_result())); +} + +#[test] +fn test_iadd_imm12_2() { + run_and_retry(|| test_from_file("./examples/iadd/imm12_2.isle", lte_64_success_result())); +} + +#[test] +fn test_iadd_imm12neg() { + run_and_retry(|| test_from_file("./examples/iadd/imm12neg.isle", lte_64_success_result())); +} + +#[test] +fn test_iadd_imm12neg2() { + run_and_retry(|| test_from_file("./examples/iadd/imm12neg2.isle", lte_64_success_result())); +} + +// Currently timing out, disabling for now. +// https://github.com/avanhatt/wasmtime/issues/13 +// #[test] +// fn test_iadd_extend() { +//test_from_file("./examples/iadd/extend.isle", lte_64_success_result()); +//test_from_file("./examples/iadd/extend2.isle", lte_64_success_result()); +// } + +#[test] +fn test_iadd_shift() { + run_and_retry(|| test_from_file("./examples/iadd/shift.isle", lte_64_success_result())); +} + +#[test] +fn test_iadd_madd() { + run_and_retry(|| { + test_from_file( + "./examples/iadd/madd.isle", + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::Success), + ], + ) + }); +} + +#[test] +fn test_iadd_madd2() { + run_and_retry(|| { + test_from_file( + "./examples/iadd/madd2.isle", + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::Success), + ], + ) + }); +} + +#[test] +fn test_iadd_msub() { + run_and_retry(|| test_from_file("./examples/iadd/msub.isle", lte_64_success_result())); +} +*/ + #[test] fn test_broken_iadd_from_file() { + run_and_retry(|| { + test_from_file( + "./examples/broken/iadd/broken_base_case.isle", + all_failure_result(), + ) + }); + run_and_retry(|| { + test_from_file( + "./examples/broken/iadd/broken_imm12.isle", + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I32, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I64, + VerificationResult::Failure(Counterexample {}), + ), + ], + ) + }); + run_and_retry(|| { + test_from_file( + "./examples/broken/iadd/broken_imm12_2.isle", + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I32, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I64, + VerificationResult::Failure(Counterexample {}), + ), + ], + ) + }); + run_and_retry(|| { + test_from_file( + "./examples/broken/iadd/broken_imm12neg.isle", + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I32, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I64, + VerificationResult::Failure(Counterexample {}), + ), + ], + ) + }); + run_and_retry(|| { + test_from_file( + "./examples/broken/iadd/broken_imm12neg2.isle", + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I32, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I64, + VerificationResult::Failure(Counterexample {}), + ), + ], + ) + }); + run_and_retry(|| { + test_from_file( + "./examples/broken/iadd/broken_madd.isle", + all_failure_result(), + ) + }); + run_and_retry(|| { + test_from_file( + "./examples/broken/iadd/broken_madd2.isle", + all_failure_result(), + ) + }); + run_and_retry(|| { + test_from_file( + "./examples/broken/iadd/broken_msub.isle", + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I32, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I64, + VerificationResult::Failure(Counterexample {}), + ), + ], + ) + }); + run_and_retry(|| { + test_from_file( + "./examples/broken/iadd/broken_shift.isle", + all_failure_result(), + ) + }); + run_and_retry(|| { + test_from_file( + "./examples/broken/iadd/broken_shift2.isle", + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }); +} + +#[test] +fn test_isub_from_file() { + test_from_file("./examples/isub/base_case.isle", lte_64_success_result()); + test_from_file("./examples/isub/imm12.isle", lte_64_success_result()); + test_from_file("./examples/isub/imm12neg.isle", lte_64_success_result()); + //test_from_file("./examples/isub/extend.isle", lte_64_success_result()); + test_from_file("./examples/isub/shift.isle", lte_64_success_result()); +} + +#[test] +fn test_broken_isub_from_file() { test_from_file( - "./examples/broken/iadd/broken_base_case.isle", - all_failure_result(), - ); - test_from_file( - "./examples/broken/iadd/broken_madd.isle", - all_failure_result(), + "./examples/broken/isub/broken_base_case.isle", + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I32, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I64, + VerificationResult::Failure(Counterexample {}), + ), + ], ); test_from_file( - "./examples/broken/iadd/broken_madd2.isle", - all_failure_result(), + "./examples/broken/isub/broken_imm12.isle", + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I32, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I64, + VerificationResult::Failure(Counterexample {}), + ), + ], ); test_from_file( - "./examples/broken/iadd/broken_msub.isle", + "./examples/broken/isub/broken_imm12neg.isle", vec![ (Bitwidth::I1, VerificationResult::Success), (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), @@ -91,25 +332,37 @@ fn test_broken_iadd_from_file() { ), ], ); - test_from_file("./examples/broken/iadd/broken_shift.isle", all_failure_result()); - test_from_file("./examples/broken/iadd/broken_shift2.isle", + + test_from_file( + "./examples/broken/iadd/broken_shift.isle", + all_failure_result(), + ); + test_from_file( + "./examples/broken/iadd/broken_shift2.isle", vec![ (Bitwidth::I1, VerificationResult::InapplicableRule), (Bitwidth::I8, VerificationResult::InapplicableRule), (Bitwidth::I16, VerificationResult::InapplicableRule), (Bitwidth::I32, VerificationResult::InapplicableRule), (Bitwidth::I64, VerificationResult::InapplicableRule), - ]); + ], + ); } #[test] fn test_ineg() { - test_from_file("./examples/ineg/ineg.isle", lte_64_success_result()) + run_and_retry(|| test_from_file("./examples/ineg/ineg.isle", lte_64_success_result())) } +#[test] +fn test_mul() { + run_and_retry(|| test_from_file("./examples/imul/imul.isle", lte_64_success_result())); +} + + #[test] fn test_udiv() { - test_from_file("./examples/udiv/udiv.isle", + run_and_retry(||test_from_file("./examples/udiv/udiv.isle", // for ease of commenting out until we debug further vec![ (Bitwidth::I1, VerificationResult::Success), @@ -117,24 +370,24 @@ fn test_udiv() { // (Bitwidth::I16, VerificationResult::Success), // (Bitwidth::I32, VerificationResult::Success), (Bitwidth::I64, VerificationResult::Success), - ]) + ])) } #[test] fn test_broken_udiv() { - test_from_file("./examples/broken/udiv/broken_udiv.isle", + run_and_retry(||test_from_file("./examples/broken/udiv/broken_udiv.isle", vec![ (Bitwidth::I1, VerificationResult::Success), (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), (Bitwidth::I16, VerificationResult::Failure(Counterexample {})), (Bitwidth::I32, VerificationResult::Failure(Counterexample {})), (Bitwidth::I64, VerificationResult::Success), - ]) + ])) } #[test] fn test_sdiv() { - test_from_file("./examples/sdiv/sdiv.isle", + run_and_retry(||test_from_file("./examples/sdiv/sdiv.isle", vec![ (Bitwidth::I1, VerificationResult::Success), (Bitwidth::I8, VerificationResult::Success), @@ -142,8 +395,11 @@ fn test_sdiv() { // (Bitwidth::I16, VerificationResult::Success), // (Bitwidth::I32, VerificationResult::Success), // (Bitwidth::I64, VerificationResult::Success), - ]); - test_from_file("./examples/sdiv/sdiv32.isle", + ])) +} + +fn test_sdiv32() { + run_and_retry(||test_from_file("./examples/sdiv/sdiv32.isle", vec![ (Bitwidth::I1, VerificationResult::InapplicableRule), (Bitwidth::I8, VerificationResult::InapplicableRule), @@ -152,13 +408,13 @@ fn test_sdiv() { // (Bitwidth::I32, VerificationResult::Success), // (Bitwidth::I64, VerificationResult::Success), ] - ) + )) } #[test] fn test_broken_sdiv() { - test_from_file("./examples/broken/sdiv/broken_sdiv.isle", all_failure_result()); - test_from_file("./examples/broken/sdiv/broken_sdiv32.isle", + run_and_retry(||test_from_file("./examples/broken/sdiv/broken_sdiv.isle", all_failure_result())); + run_and_retry(||test_from_file("./examples/broken/sdiv/broken_sdiv32.isle", vec![ (Bitwidth::I1, VerificationResult::InapplicableRule), (Bitwidth::I8, VerificationResult::InapplicableRule), @@ -166,17 +422,17 @@ fn test_broken_sdiv() { // (Bitwidth::I32, VerificationResult::Success), // (Bitwidth::I64, VerificationResult::Success), ] - ) + )) } #[test] fn test_uextend() { - test_from_file("./examples/uextend/uextend.isle", all_success_result()) + run_and_retry(|| test_from_file("./examples/uextend/uextend.isle", all_success_result())) } #[test] fn test_sextend() { - test_from_file("./examples/sextend/sextend.isle", all_success_result()) + run_and_retry(|| test_from_file("./examples/sextend/sextend.isle", all_success_result())) } #[test] @@ -184,464 +440,528 @@ fn test_broken_uextend() { // In the spec for extend, zero_extend and sign_extend are swapped. // However, this should still work in the case where the query with // is the same as the register width (64). - test_from_file( - "./examples/broken/broken_uextend.isle", - custom_result(&|w| { - ( - w, - if (w as usize) < 64 { - VerificationResult::Failure(Counterexample {}) - } else { - VerificationResult::Success - }, - ) - }), - ) + run_and_retry(|| { + test_from_file( + "./examples/broken/broken_uextend.isle", + custom_result(&|w| { + ( + w, + if (w as usize) < 64 { + VerificationResult::Failure(Counterexample {}) + } else { + VerificationResult::Success + }, + ) + }), + ) + }) } #[test] fn test_clz() { - test_from_file_with_filter( - "./examples/clz/clz.isle", - "clz".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::Success), - (Bitwidth::I64, VerificationResult::Success), - ], - ); + run_and_retry(|| { + test_from_file_with_filter( + "./examples/clz/clz.isle", + "clz".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::Success), + ], + ) + }); - test_from_file_with_filter( - "./examples/clz/clz8.isle", - "clz".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::Success), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ); + run_and_retry(|| { + test_from_file_with_filter( + "./examples/clz/clz8.isle", + "clz".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }); - test_from_file_with_filter( - "./examples/clz/clz16.isle", - "clz".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::Success), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/clz/clz16.isle", + "clz".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_clz_broken() { - test_from_file_with_filter( - "./examples/broken/clz/broken_clz.isle", - "clz".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Failure(Counterexample {})), - (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), - ( - Bitwidth::I16, - VerificationResult::Failure(Counterexample {}), - ), - ( - Bitwidth::I32, - VerificationResult::Failure(Counterexample {}), - ), - (Bitwidth::I64, VerificationResult::Success), - ], - ); + run_and_retry(|| { + test_from_file_with_filter( + "./examples/broken/clz/broken_clz.isle", + "clz".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Failure(Counterexample {})), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I32, + VerificationResult::Failure(Counterexample {}), + ), + (Bitwidth::I64, VerificationResult::Success), + ], + ) + }); - test_from_file_with_filter( - "./examples/broken/clz/broken_clz8.isle", - "clz".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ); + run_and_retry(|| { + test_from_file_with_filter( + "./examples/broken/clz/broken_clz8.isle", + "clz".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }); - test_from_file_with_filter( - "./examples/broken/clz/broken_clz16.isle", - "clz".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - ( - Bitwidth::I16, - VerificationResult::Failure(Counterexample {}), - ), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/broken/clz/broken_clz16.isle", + "clz".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_cls() { - test_from_file_with_filter( - "./examples/cls/cls.isle", - "cls".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::Success), - (Bitwidth::I64, VerificationResult::Success), - ], - ); + run_and_retry(|| { + test_from_file_with_filter( + "./examples/cls/cls.isle", + "cls".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::Success), + ], + ) + }); - test_from_file_with_filter( - "./examples/cls/cls8.isle", - "cls".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::Success), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ); + run_and_retry(|| { + test_from_file_with_filter( + "./examples/cls/cls8.isle", + "cls".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }); - test_from_file_with_filter( - "./examples/cls/cls16.isle", - "cls".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::Success), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/cls/cls16.isle", + "cls".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_cls_broken() { - test_from_file_with_filter( - "./examples/broken/cls/broken_cls.isle", - "cls".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Failure(Counterexample {})), - (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), - ( - Bitwidth::I16, - VerificationResult::Failure(Counterexample {}), - ), - (Bitwidth::I32, VerificationResult::Success), - (Bitwidth::I64, VerificationResult::Success), - ], - ); + run_and_retry(|| { + test_from_file_with_filter( + "./examples/broken/cls/broken_cls.isle", + "cls".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Failure(Counterexample {})), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::Success), + ], + ) + }); - test_from_file_with_filter( - "./examples/broken/cls/broken_cls8.isle", - "cls".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ); + run_and_retry(|| { + test_from_file_with_filter( + "./examples/broken/cls/broken_cls8.isle", + "cls".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }); - test_from_file_with_filter( - "./examples/broken/cls/broken_cls16.isle", - "cls".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - ( - Bitwidth::I16, - VerificationResult::Failure(Counterexample {}), - ), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/broken/cls/broken_cls16.isle", + "cls".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_ctz() { - test_from_file_with_filter( - "./examples/ctz/ctz.isle", - "ctz".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::Success), - (Bitwidth::I64, VerificationResult::Success), - ], - ); + run_and_retry(|| { + test_from_file_with_filter( + "./examples/ctz/ctz.isle", + "ctz".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::Success), + ], + ) + }); - test_from_file_with_filter( - "./examples/ctz/ctz8.isle", - "ctz".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::Success), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ); + run_and_retry(|| { + test_from_file_with_filter( + "./examples/ctz/ctz8.isle", + "ctz".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }); - test_from_file_with_filter( - "./examples/ctz/ctz16.isle", - "ctz".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::Success), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/ctz/ctz16.isle", + "ctz".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_ctz_broken() { - test_from_file( - "./examples/broken/ctz/broken_ctz.isle", - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::InapplicableRule), - ( - Bitwidth::I32, - VerificationResult::Failure(Counterexample {}), - ), - ( - Bitwidth::I64, - VerificationResult::Failure(Counterexample {}), - ), - ], - ); + run_and_retry(|| { + test_from_file( + "./examples/broken/ctz/broken_ctz.isle", + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + ( + Bitwidth::I32, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I64, + VerificationResult::Failure(Counterexample {}), + ), + ], + ) + }); - test_from_file_with_filter( - "./examples/broken/ctz/broken_ctz8.isle", - "ctz".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ); + run_and_retry(|| { + test_from_file_with_filter( + "./examples/broken/ctz/broken_ctz8.isle", + "ctz".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }); - test_from_file_with_filter( - "./examples/broken/ctz/broken_ctz16.isle", - "ctz".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - ( - Bitwidth::I16, - VerificationResult::Failure(Counterexample {}), - ), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/broken/ctz/broken_ctz16.isle", + "ctz".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_small_rotr_to_shifts() { - test_from_file_with_filter( - "./examples/rotr/small_rotr_to_shifts.isle", - "small_rotr".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Success), - (Bitwidth::I8, VerificationResult::Success), - (Bitwidth::I16, VerificationResult::Success), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/rotr/small_rotr_to_shifts.isle", + "small_rotr".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_small_rotr_to_shifts_broken() { - test_from_file_with_filter( - "./examples/broken/broken_mask_small_rotr.isle", - "small_rotr".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Success), - (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), - ( - Bitwidth::I16, - VerificationResult::Failure(Counterexample {}), - ), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ); - test_from_file_with_filter( - "./examples/broken/broken_rule_or_small_rotr.isle", - "small_rotr".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Failure(Counterexample {})), - (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), - ( - Bitwidth::I16, - VerificationResult::Failure(Counterexample {}), - ), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/broken/broken_mask_small_rotr.isle", + "small_rotr".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }); + run_and_retry(|| { + test_from_file_with_filter( + "./examples/broken/broken_rule_or_small_rotr.isle", + "small_rotr".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Failure(Counterexample {})), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_small_rotr_imm_to_shifts() { - test_from_file_with_filter( - "./examples/rotr/small_rotr_imm_to_shifts.isle", - "small_rotr_imm".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Success), - (Bitwidth::I8, VerificationResult::Success), - (Bitwidth::I16, VerificationResult::Success), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/rotr/small_rotr_imm_to_shifts.isle", + "small_rotr_imm".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_fits_in_16_rotl_to_rotr() { - test_from_file_with_filter( - "./examples/rotl/fits_in_16_rotl_to_rotr.isle", - "rotl".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Success), - (Bitwidth::I8, VerificationResult::Success), - (Bitwidth::I16, VerificationResult::Success), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/rotl/fits_in_16_rotl_to_rotr.isle", + "rotl".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_32_general_rotl_to_rotr() { - test_from_file_with_filter( - "./examples/rotl/32_general_rotl_to_rotr.isle", - "rotl".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::Success), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + run_and_retry(|| { + test_from_file_with_filter( + "./examples/rotl/32_general_rotl_to_rotr.isle", + "rotl".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) + }) } #[test] fn test_broken_32_general_rotl_to_rotr() { - test_from_file_with_filter( - "./examples/broken/broken_32_general_rotl_to_rotr.isle", - "rotl".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::InapplicableRule), - ( - Bitwidth::I32, - VerificationResult::Failure(Counterexample {}), - ), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/broken/broken_32_general_rotl_to_rotr.isle", + "rotl".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + ( + Bitwidth::I32, + VerificationResult::Failure(Counterexample {}), + ), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_64_general_rotl_to_rotr() { - test_from_file_with_filter( - "./examples/rotl/64_general_rotl_to_rotr.isle", - "rotl".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::Success), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/rotl/64_general_rotl_to_rotr.isle", + "rotl".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::Success), + ], + ) + }) } #[test] fn test_broken_fits_in_16_rotl_to_rotr() { - test_from_file_with_filter( - "./examples/broken/broken_fits_in_16_rotl_to_rotr.isle", - "rotl".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Success), - (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), - ( - Bitwidth::I16, - VerificationResult::Failure(Counterexample {}), - ), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/broken/broken_fits_in_16_rotl_to_rotr.isle", + "rotl".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_fits_in_16_with_imm_rotl_to_rotr() { - test_from_file_with_filter( - "./examples/rotl/fits_in_16_with_imm_rotl_to_rotr.isle", - "rotl".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Success), - (Bitwidth::I8, VerificationResult::Success), - (Bitwidth::I16, VerificationResult::Success), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/rotl/fits_in_16_with_imm_rotl_to_rotr.isle", + "rotl".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_64_with_imm_rotl_to_rotr() { - test_from_file_with_filter( - "./examples/rotl/64_with_imm_rotl_to_rotr.isle", - "rotl".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::Success), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/rotl/64_with_imm_rotl_to_rotr.isle", + "rotl".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::Success), + ], + ) + }) } #[test] fn test_32_with_imm_rotl_to_rotr() { - test_from_file_with_filter( - "./examples/rotl/32_with_imm_rotl_to_rotr.isle", - "rotl".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::Success), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/rotl/32_with_imm_rotl_to_rotr.isle", + "rotl".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } // #[test] @@ -664,62 +984,70 @@ fn test_32_with_imm_rotl_to_rotr() { #[test] fn test_fits_in_16_rotr() { - test_from_file_with_filter( - "./examples/rotr/fits_in_16_rotr.isle", - "rotr".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Success), - (Bitwidth::I8, VerificationResult::Success), - (Bitwidth::I16, VerificationResult::Success), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/rotr/fits_in_16_rotr.isle", + "rotr".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_fits_in_16_with_imm_rotr() { - test_from_file_with_filter( - "./examples/rotr/fits_in_16_rotr.isle", - "rotr".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Success), - (Bitwidth::I8, VerificationResult::Success), - (Bitwidth::I16, VerificationResult::Success), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/rotr/fits_in_16_rotr.isle", + "rotr".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_32_rotr() { - test_from_file_with_filter( - "./examples/rotr/32_rotr.isle", - "rotr".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::Success), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/rotr/32_rotr.isle", + "rotr".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_32_with_imm_rotr() { - test_from_file_with_filter( - "./examples/rotr/32_with_imm_rotr.isle", - "rotr".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::Success), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/rotr/32_with_imm_rotr.isle", + "rotr".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } // TODO: reenable. @@ -757,134 +1085,150 @@ fn test_32_with_imm_rotr() { #[test] fn test_fits_in_32_band() { - test_from_file_with_filter( - "./examples/band/fits_in_32_band.isle", - "band".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Success), - (Bitwidth::I8, VerificationResult::Success), - (Bitwidth::I16, VerificationResult::Success), - (Bitwidth::I32, VerificationResult::Success), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/band/fits_in_32_band.isle", + "band".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_broken_fits_in_32_band() { - test_from_file_with_filter( - "./examples/broken/broken_fits_in_32_band.isle", - "band".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Failure(Counterexample {})), - (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), - ( - Bitwidth::I16, - VerificationResult::Failure(Counterexample {}), - ), - ( - Bitwidth::I32, - VerificationResult::Failure(Counterexample {}), - ), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/broken/broken_fits_in_32_band.isle", + "band".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Failure(Counterexample {})), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I32, + VerificationResult::Failure(Counterexample {}), + ), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_64_band() { - test_from_file_with_filter( - "./examples/band/64_band.isle", - "band".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::Success), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/band/64_band.isle", + "band".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::Success), + ], + ) + }) } #[test] fn test_fits_in_32_bor() { - test_from_file_with_filter( - "./examples/bor/fits_in_32_bor.isle", - "bor".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Success), - (Bitwidth::I8, VerificationResult::Success), - (Bitwidth::I16, VerificationResult::Success), - (Bitwidth::I32, VerificationResult::Success), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/bor/fits_in_32_bor.isle", + "bor".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_64_bor() { - test_from_file_with_filter( - "./examples/bor/64_bor.isle", - "bor".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::Success), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/bor/64_bor.isle", + "bor".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::Success), + ], + ) + }) } #[test] fn test_broken_fits_in_32_bor() { - test_from_file_with_filter( - "./examples/broken/broken_fits_in_32_bor.isle", - "bor".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Failure(Counterexample {})), - (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), - ( - Bitwidth::I16, - VerificationResult::Failure(Counterexample {}), - ), - ( - Bitwidth::I32, - VerificationResult::Failure(Counterexample {}), - ), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/broken/broken_fits_in_32_bor.isle", + "bor".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Failure(Counterexample {})), + (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), + ( + Bitwidth::I16, + VerificationResult::Failure(Counterexample {}), + ), + ( + Bitwidth::I32, + VerificationResult::Failure(Counterexample {}), + ), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_fits_in_32_bxor() { - test_from_file_with_filter( - "./examples/bxor/fits_in_32_bxor.isle", - "bxor".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::Success), - (Bitwidth::I8, VerificationResult::Success), - (Bitwidth::I16, VerificationResult::Success), - (Bitwidth::I32, VerificationResult::Success), - (Bitwidth::I64, VerificationResult::InapplicableRule), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/bxor/fits_in_32_bxor.isle", + "bxor".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I64, VerificationResult::InapplicableRule), + ], + ) + }) } #[test] fn test_64_bxor() { - test_from_file_with_filter( - "./examples/bxor/64_bxor.isle", - "bxor".to_string(), - vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::InapplicableRule), - (Bitwidth::I32, VerificationResult::InapplicableRule), - (Bitwidth::I64, VerificationResult::Success), - ], - ) + run_and_retry(|| { + test_from_file_with_filter( + "./examples/bxor/64_bxor.isle", + "bxor".to_string(), + vec![ + (Bitwidth::I1, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::InapplicableRule), + (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I32, VerificationResult::InapplicableRule), + (Bitwidth::I64, VerificationResult::Success), + ], + ) + }) } #[test] From 0158ea549845046f86f74545ee9d765b0de7e494 Mon Sep 17 00:00:00 2001 From: Alexa VanHattum Date: Mon, 20 Mar 2023 14:11:09 -0400 Subject: [PATCH 06/11] more merge --- cranelift/isle/veri/veri_engine/src/widths.rs | 2 ++ cranelift/isle/veri/veri_engine/tests/veri.rs | 22 ++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/cranelift/isle/veri/veri_engine/src/widths.rs b/cranelift/isle/veri/veri_engine/src/widths.rs index 6276bde21d37..ebe09327c3de 100644 --- a/cranelift/isle/veri/veri_engine/src/widths.rs +++ b/cranelift/isle/veri/veri_engine/src/widths.rs @@ -41,6 +41,8 @@ pub fn isle_inst_types() -> HashMap<&'static str, Vec>> { widths.insert("ushr", bv_binary_8_to_64.clone()); widths.insert("sshr", bv_binary_8_to_64.clone()); widths.insert("ishl", bv_binary_8_to_64.clone()); + widths.insert("udiv", bv_binary_8_to_64.clone()); + widths.insert("sdiv", bv_binary_8_to_64.clone()); // Binary with possibly differing widths widths.insert("rotl", bv_binary_8_to_64.clone()); diff --git a/cranelift/isle/veri/veri_engine/tests/veri.rs b/cranelift/isle/veri/veri_engine/tests/veri.rs index c5787dc44e50..618ebc234788 100644 --- a/cranelift/isle/veri/veri_engine/tests/veri.rs +++ b/cranelift/isle/veri/veri_engine/tests/veri.rs @@ -574,9 +574,10 @@ fn test_udiv() { run_and_retry(|| { test_from_file_with_lhs_termname( "./examples/udiv/udiv.isle", + "udiv".to_string(), // for ease of commenting out until we debug further vec![ - (Bitwidth::I8, VerificationResult::Success), + (Bitwidth::I8, VerificationResult::Success), // (Bitwidth::I16, VerificationResult::Success), // (Bitwidth::I32, VerificationResult::Success), (Bitwidth::I64, VerificationResult::Success), @@ -588,10 +589,10 @@ fn test_udiv() { #[test] fn test_broken_udiv() { run_and_retry(|| { - test_from_file( + test_from_file_with_lhs_termname( "./examples/broken/udiv/broken_udiv.isle", + "udiv".to_string(), vec![ - (Bitwidth::I1, VerificationResult::Success), (Bitwidth::I8, VerificationResult::Failure(Counterexample {})), ( Bitwidth::I16, @@ -610,10 +611,10 @@ fn test_broken_udiv() { #[test] fn test_sdiv() { run_and_retry(|| { - test_from_file( + test_from_file_with_lhs_termname( "./examples/sdiv/sdiv.isle", + "sdiv".to_string(), vec![ - (Bitwidth::I1, VerificationResult::Success), (Bitwidth::I8, VerificationResult::Success), // Too slow rn // (Bitwidth::I16, VerificationResult::Success), @@ -626,10 +627,10 @@ fn test_sdiv() { fn test_sdiv32() { run_and_retry(|| { - test_from_file( + test_from_file_with_lhs_termname( "./examples/sdiv/sdiv32.isle", + "sdiv".to_string(), vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), (Bitwidth::I8, VerificationResult::InapplicableRule), (Bitwidth::I16, VerificationResult::InapplicableRule), // Too slow rn @@ -643,16 +644,17 @@ fn test_sdiv32() { #[test] fn test_broken_sdiv() { run_and_retry(|| { - test_from_file( + test_from_file_with_lhs_termname( "./examples/broken/sdiv/broken_sdiv.isle", + "sdiv".to_string(), all_failure_result(), ) }); run_and_retry(|| { - test_from_file( + test_from_file_with_lhs_termname( "./examples/broken/sdiv/broken_sdiv32.isle", + "sdiv".to_string(), vec![ - (Bitwidth::I1, VerificationResult::InapplicableRule), (Bitwidth::I8, VerificationResult::InapplicableRule), (Bitwidth::I16, VerificationResult::InapplicableRule), // (Bitwidth::I32, VerificationResult::Success), From 124dc9b1c743feebb24c67111230319faa5f8441 Mon Sep 17 00:00:00 2001 From: Alexa VanHattum Date: Mon, 20 Mar 2023 14:13:49 -0400 Subject: [PATCH 07/11] constant widths --- .../veri/veri_engine/examples/broken/sdiv/broken_sdiv32.isle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv32.isle b/cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv32.isle index 46efefa953be..7f498a6addfa 100644 --- a/cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv32.isle +++ b/cranelift/isle/veri/veri_engine/examples/broken/sdiv/broken_sdiv32.isle @@ -12,6 +12,7 @@ (decl alu_rrr (ALUOp Type Reg Reg) Reg) (extern constructor alu_rrr alu_rrr) +;; BROKEN: zero-extends instead of sign-extends ;; Place a `Value` into a register, sign extending it to 64-bits ;;@ (spec (sig (args x) (ret)) ;;@ (assertions (= (zero_ext (64) (x)) (ret)))) @@ -39,8 +40,8 @@ ;;@ (assertions (= (x) (ret)), ;;@ (|| (= (ty) (32i0:isleType)) (= (ty) (64i0:isleType))), ;;@ (if (= (ty) (32i0:isleType)) { -;;@ (! (&& (= (0i32:bv) (y)) -;;@ (= (2147483648i32:bv) (y)))) +;;@ (! (&& (= (0i32:bv) (extract 31 0 (y))) +;;@ (= (2147483648i32:bv) (extract 31 0 (y))))) ;;@ } else { ;;@ (! (&& (= (0i64:bv) (y)) ;;@ (= (9223372036854775808i64:bv) (y)))) From a54f29337f3f6255a1006c9c2f98115ec28df3de Mon Sep 17 00:00:00 2001 From: Alexa VanHattum Date: Mon, 20 Mar 2023 21:56:33 -0400 Subject: [PATCH 08/11] sort --- cranelift/isle/veri/veri_engine/src/type_inference.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cranelift/isle/veri/veri_engine/src/type_inference.rs b/cranelift/isle/veri/veri_engine/src/type_inference.rs index dcc7c83f3693..3302184253d2 100644 --- a/cranelift/isle/veri/veri_engine/src/type_inference.rs +++ b/cranelift/isle/veri/veri_engine/src/type_inference.rs @@ -1,5 +1,6 @@ use std::collections::{HashMap, HashSet}; use std::hash::Hash; +use itertools::Itertools; use crate::termname::pattern_contains_termname; use cranelift_isle as isle; @@ -288,13 +289,13 @@ fn type_annotations_using_rule<'a>( } } let mut quantified_vars = vec![]; - for (s, t) in parse_tree.quantified_vars { + for (s, t) in parse_tree.quantified_vars.iter().sorted() { let expr = veri_ir::Expr::Terminal(veri_ir::Terminal::Var(s.clone())); - if let Some(ty) = solution.get(&t) { + if let Some(ty) = solution.get(t) { let ty = convert_type(ty); - parse_tree.ty_vars.insert(expr, t); - tymap.insert(t, ty.clone()); - quantified_vars.push(veri_ir::BoundVar { name: s, tyvar: t }); + parse_tree.ty_vars.insert(expr, *t); + tymap.insert(*t, ty.clone()); + quantified_vars.push(veri_ir::BoundVar { name: s.clone(), tyvar: *t }); } else { panic!("missing type variable {} in solution for: {:?}", t, expr); } From f294757bc9f796a55b05b573506c6e581db6cbbc Mon Sep 17 00:00:00 2001 From: Alexa VanHattum Date: Mon, 20 Mar 2023 22:52:24 -0400 Subject: [PATCH 09/11] width --- .../veri/veri_engine/examples/sdiv/sdiv.isle | 102 ++++++++++-------- .../veri_engine/examples/sdiv/sdiv32.isle | 91 ---------------- .../examples/sdiv/sdiv_safe_const.isle | 81 ++++++++++++++ cranelift/isle/veri/veri_engine/tests/veri.rs | 13 +-- 4 files changed, 145 insertions(+), 142 deletions(-) delete mode 100644 cranelift/isle/veri/veri_engine/examples/sdiv/sdiv32.isle create mode 100644 cranelift/isle/veri/veri_engine/examples/sdiv/sdiv_safe_const.isle diff --git a/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle b/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle index ac09ef454cb5..995de9a9800d 100644 --- a/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle +++ b/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv.isle @@ -9,40 +9,9 @@ (SDiv) )) -;; Model ImmExtend as an Int, where -;; Sign == 1 and Zero == 0 -(type ImmExtend - (enum - (Zero) - ;;(Sign) -)) - -;;@ (spec (sig (args) (ret)) -;;@ (assertions (= (1i0: isleType) (ret)))) -(decl ImmExtend.Sign () ImmExtend) -(extern constructor ImmExtend.Sign ImmExtend.Sign) - (decl alu_rrr (ALUOp Type Reg Reg) Reg) (extern constructor alu_rrr alu_rrr) -;;@ (spec (sig (args ty, x, y) (ret)) -;;@ (assertions (= (sdiv (x) (y)) (ret)), -;;@ (= (ty) (64i0: isleType)) -;;@ )) -(decl a64_sdiv (Type Reg Reg) Reg) -(rule (a64_sdiv ty x y) (alu_rrr (ALUOp.SDiv) ty x y)) - -;;@ (spec (sig (args ty, ext, x) (ret)) -;;@ (assertions (|| (= (ext) (0i0:isleType)) (= (ext) (1i0:isleType))), -;;@ (if (= (ext) (0i0:isleType)) { -;;@ (= (ret) (zero_ext (regwidth) (conv_to (ty) (x)))) -;;@ } else { -;;@ (= (ret) (sign_ext (regwidth) (conv_to (ty) (x)))) -;;@ }) -;;@ )) -(decl imm (Type ImmExtend u64) Reg) -(extern constructor imm imm) - ;; Place a `Value` into a register, sign extending it to 64-bits ;;@ (spec (sig (args x) (ret)) ;;@ (assertions (= (sign_ext (64) (x)) (ret)))) @@ -50,6 +19,7 @@ (extern constructor put_in_reg_sext64 put_in_reg_sext64) ;; (rule 1 (put_in_reg_sext64 val @ (value_type (fits_in_32 ty))) ;; (extend val $true (ty_bits ty) 64)) +;; ;; Helper for placing a `Value` into a `Reg` and validating that it's nonzero. ;;@ (spec (sig (args x) (ret)) @@ -57,25 +27,67 @@ ;;@ (! (= (0i64:bv) (ret))))) (decl put_nonzero_in_reg_sext64 (Value) Reg) (extern constructor put_nonzero_in_reg_sext64 put_nonzero_in_reg_sext64) + ;; (rule -1 (put_nonzero_in_reg_sext64 val) ;; (trap_if_zero_divisor (put_in_reg_sext64 val))) - -;; Helper for extracting an immediate that's not 0 and not -1 from an imm64. -;;@ (spec (sig (args x) (ret)) -;;@ (assertions (= (x) (ret)), -;;@ (! (= (0i64:bv) (ret))), -;;@ (! (= (18446744073709551615i64:bv) (ret))) -;;@ )) -(decl safe_divisor_from_imm64 (u64) Imm64) -(extern extractor safe_divisor_from_imm64 safe_divisor_from_imm64) - +;; ;; Note that this has a special case where if the `Value` is a constant that's ;; not zero we can skip the zero check. ;;(rule (put_nonzero_in_reg_sext64 (and (value_type ty) ;; (iconst (nonzero_u64_from_imm64 n)))) ;; (imm ty (ImmExtend.Sign) n)) +;; Note that this has a special case where if the `Value` is a constant that's +;; not zero we can skip the zero check. +;;(rule (put_nonzero_in_reg_sext64 (and (value_type ty) +;; (iconst (nonzero_u64_from_imm64 n)))) +;; (imm ty (ImmExtend.Sign) n)) + +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (= (sdiv (x) (y)) (ret)), +;;@ (= (ty) (64i0: isleType)) +;;@ )) +(decl a64_sdiv (Type Reg Reg) Reg) +(rule (a64_sdiv ty x y) (alu_rrr (ALUOp.SDiv) ty x y)) + +;; Verification note: operand type converts to 32/64, so no explicit +;; check for those types needed +;; Check for signed overflow. The only case is min_value / -1. +;; The following checks must be done in 32-bit or 64-bit, depending +;; on the input type. +;; +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (= (x) (ret)), +;;@ (if (= (ty) (32i0:isleType)) { +;;@ (! (&& (= (0i32:bv) (extract 31 0 (y))) +;;@ (= (2147483648i32:bv) (extract 31 0 (y))))) +;;@ } else { +;;@ (! (&& (= (0i64:bv) (y)) +;;@ (= (9223372036854775808i64:bv) (y)))) +;;@ }) +;;@ )) +(decl trap_if_div_overflow (Type Reg Reg) Reg) +(extern constructor trap_if_div_overflow trap_if_div_overflow) + +;; (rule (trap_if_div_overflow ty x y) +;; (let ( +;; ;; Check RHS is -1. +;; (_ Unit (emit (MInst.AluRRImm12 (ALUOp.AddS) (operand_size ty) (writable_zero_reg) y (u8_into_imm12 1)))) + +;; ;; Check LHS is min_value, by subtracting 1 and branching if +;; ;; there is overflow. +;; (_ Unit (emit (MInst.CCmpImm (size_from_ty ty) +;; x +;; (u8_into_uimm5 1) +;; (nzcv $false $false $false $false) +;; (Cond.Eq)))) +;; (_ Unit (emit (MInst.TrapIf (cond_br_cond (Cond.Vs)) +;; (trap_code_integer_overflow)))) +;; ) +;; x)) -;; Special case for `sdiv` where no checks are needed due to division by a -;; constant meaning the checks are always passed. -(rule 1 (lower (has_type (fits_in_64 ty) (sdiv x (iconst (safe_divisor_from_imm64 y))))) - (a64_sdiv $I64 (put_in_reg_sext64 x) (imm ty (ImmExtend.Sign) y))) \ No newline at end of file +(rule (lower (has_type (fits_in_64 ty) (sdiv x y))) + (let ((x64 Reg (put_in_reg_sext64 x)) + (y64 Reg (put_nonzero_in_reg_sext64 y)) + (valid_x64 Reg (trap_if_div_overflow ty x64 y64)) + (result Reg (a64_sdiv $I64 valid_x64 y64))) + result)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv32.isle b/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv32.isle deleted file mode 100644 index ae2550604958..000000000000 --- a/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv32.isle +++ /dev/null @@ -1,91 +0,0 @@ -;;@ (spec (sig (args arg) (ret)) -;;@ (assertions (= (arg) (ret)))) -(decl lower (Inst) InstOutput) - -(type MInst (enum)) - -(type ALUOp - (enum - (SDiv) -)) - -(decl alu_rrr (ALUOp Type Reg Reg) Reg) -(extern constructor alu_rrr alu_rrr) - -;; Place a `Value` into a register, sign extending it to 64-bits -;;@ (spec (sig (args x) (ret)) -;;@ (assertions (= (sign_ext (64) (x)) (ret)))) -(decl put_in_reg_sext64 (Value) Reg) -(extern constructor put_in_reg_sext64 put_in_reg_sext64) -;; (rule 1 (put_in_reg_sext64 val @ (value_type (fits_in_32 ty))) -;; (extend val $true (ty_bits ty) 64)) -;; - -;; Helper for placing a `Value` into a `Reg` and validating that it's nonzero. -;;@ (spec (sig (args x) (ret)) -;;@ (assertions (= (sign_ext (64) (x)) (ret)), -;;@ (! (= (0i64:bv) (ret))))) -(decl put_nonzero_in_reg_sext64 (Value) Reg) -(extern constructor put_nonzero_in_reg_sext64 put_nonzero_in_reg_sext64) - -;; (rule -1 (put_nonzero_in_reg_sext64 val) -;; (trap_if_zero_divisor (put_in_reg_sext64 val))) -;; -;; Note that this has a special case where if the `Value` is a constant that's -;; not zero we can skip the zero check. -;;(rule (put_nonzero_in_reg_sext64 (and (value_type ty) -;; (iconst (nonzero_u64_from_imm64 n)))) -;; (imm ty (ImmExtend.Sign) n)) -;; Note that this has a special case where if the `Value` is a constant that's -;; not zero we can skip the zero check. -;;(rule (put_nonzero_in_reg_sext64 (and (value_type ty) -;; (iconst (nonzero_u64_from_imm64 n)))) -;; (imm ty (ImmExtend.Sign) n)) - -;;@ (spec (sig (args ty, x, y) (ret)) -;;@ (assertions (= (sdiv (x) (y)) (ret)), -;;@ (= (ty) (64i0: isleType)) -;;@ )) -(decl a64_sdiv (Type Reg Reg) Reg) -(rule (a64_sdiv ty x y) (alu_rrr (ALUOp.SDiv) ty x y)) - -;; Check for signed overflow. The only case is min_value / -1. -;; The following checks must be done in 32-bit or 64-bit, depending -;; on the input type. -;;@ (spec (sig (args ty, x, y) (ret)) -;;@ (assertions (= (x) (ret)), -;;@ (|| (= (ty) (32i0:isleType)) (= (ty) (64i0:isleType))), -;;@ (if (= (ty) (32i0:isleType)) { -;;@ (! (&& (= (0i32:bv) (y)) -;;@ (= (2147483648i32:bv) (y)))) -;;@ } else { -;;@ (! (&& (= (0i64:bv) (y)) -;;@ (= (9223372036854775808i64:bv) (y)))) -;;@ }) -;;@ )) -(decl trap_if_div_overflow (Type Reg Reg) Reg) -(extern constructor trap_if_div_overflow trap_if_div_overflow) - -;; (rule (trap_if_div_overflow ty x y) -;; (let ( -;; ;; Check RHS is -1. -;; (_ Unit (emit (MInst.AluRRImm12 (ALUOp.AddS) (operand_size ty) (writable_zero_reg) y (u8_into_imm12 1)))) - -;; ;; Check LHS is min_value, by subtracting 1 and branching if -;; ;; there is overflow. -;; (_ Unit (emit (MInst.CCmpImm (size_from_ty ty) -;; x -;; (u8_into_uimm5 1) -;; (nzcv $false $false $false $false) -;; (Cond.Eq)))) -;; (_ Unit (emit (MInst.TrapIf (cond_br_cond (Cond.Vs)) -;; (trap_code_integer_overflow)))) -;; ) -;; x)) - -(rule (lower (has_type (fits_in_64 ty) (sdiv x y))) - (let ((x64 Reg (put_in_reg_sext64 x)) - (y64 Reg (put_nonzero_in_reg_sext64 y)) - (valid_x64 Reg (trap_if_div_overflow ty x64 y64)) - (result Reg (a64_sdiv $I64 valid_x64 y64))) - result)) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv_safe_const.isle b/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv_safe_const.isle new file mode 100644 index 000000000000..ac09ef454cb5 --- /dev/null +++ b/cranelift/isle/veri/veri_engine/examples/sdiv/sdiv_safe_const.isle @@ -0,0 +1,81 @@ +;;@ (spec (sig (args arg) (ret)) +;;@ (assertions (= (arg) (ret)))) +(decl lower (Inst) InstOutput) + +(type MInst (enum)) + +(type ALUOp + (enum + (SDiv) +)) + +;; Model ImmExtend as an Int, where +;; Sign == 1 and Zero == 0 +(type ImmExtend + (enum + (Zero) + ;;(Sign) +)) + +;;@ (spec (sig (args) (ret)) +;;@ (assertions (= (1i0: isleType) (ret)))) +(decl ImmExtend.Sign () ImmExtend) +(extern constructor ImmExtend.Sign ImmExtend.Sign) + +(decl alu_rrr (ALUOp Type Reg Reg) Reg) +(extern constructor alu_rrr alu_rrr) + +;;@ (spec (sig (args ty, x, y) (ret)) +;;@ (assertions (= (sdiv (x) (y)) (ret)), +;;@ (= (ty) (64i0: isleType)) +;;@ )) +(decl a64_sdiv (Type Reg Reg) Reg) +(rule (a64_sdiv ty x y) (alu_rrr (ALUOp.SDiv) ty x y)) + +;;@ (spec (sig (args ty, ext, x) (ret)) +;;@ (assertions (|| (= (ext) (0i0:isleType)) (= (ext) (1i0:isleType))), +;;@ (if (= (ext) (0i0:isleType)) { +;;@ (= (ret) (zero_ext (regwidth) (conv_to (ty) (x)))) +;;@ } else { +;;@ (= (ret) (sign_ext (regwidth) (conv_to (ty) (x)))) +;;@ }) +;;@ )) +(decl imm (Type ImmExtend u64) Reg) +(extern constructor imm imm) + +;; Place a `Value` into a register, sign extending it to 64-bits +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (64) (x)) (ret)))) +(decl put_in_reg_sext64 (Value) Reg) +(extern constructor put_in_reg_sext64 put_in_reg_sext64) +;; (rule 1 (put_in_reg_sext64 val @ (value_type (fits_in_32 ty))) +;; (extend val $true (ty_bits ty) 64)) + +;; Helper for placing a `Value` into a `Reg` and validating that it's nonzero. +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (sign_ext (64) (x)) (ret)), +;;@ (! (= (0i64:bv) (ret))))) +(decl put_nonzero_in_reg_sext64 (Value) Reg) +(extern constructor put_nonzero_in_reg_sext64 put_nonzero_in_reg_sext64) +;; (rule -1 (put_nonzero_in_reg_sext64 val) +;; (trap_if_zero_divisor (put_in_reg_sext64 val))) + +;; Helper for extracting an immediate that's not 0 and not -1 from an imm64. +;;@ (spec (sig (args x) (ret)) +;;@ (assertions (= (x) (ret)), +;;@ (! (= (0i64:bv) (ret))), +;;@ (! (= (18446744073709551615i64:bv) (ret))) +;;@ )) +(decl safe_divisor_from_imm64 (u64) Imm64) +(extern extractor safe_divisor_from_imm64 safe_divisor_from_imm64) + +;; Note that this has a special case where if the `Value` is a constant that's +;; not zero we can skip the zero check. +;;(rule (put_nonzero_in_reg_sext64 (and (value_type ty) +;; (iconst (nonzero_u64_from_imm64 n)))) +;; (imm ty (ImmExtend.Sign) n)) + +;; Special case for `sdiv` where no checks are needed due to division by a +;; constant meaning the checks are always passed. +(rule 1 (lower (has_type (fits_in_64 ty) (sdiv x (iconst (safe_divisor_from_imm64 y))))) + (a64_sdiv $I64 (put_in_reg_sext64 x) (imm ty (ImmExtend.Sign) y))) \ No newline at end of file diff --git a/cranelift/isle/veri/veri_engine/tests/veri.rs b/cranelift/isle/veri/veri_engine/tests/veri.rs index 618ebc234788..5e63d5acc458 100644 --- a/cranelift/isle/veri/veri_engine/tests/veri.rs +++ b/cranelift/isle/veri/veri_engine/tests/veri.rs @@ -578,8 +578,8 @@ fn test_udiv() { // for ease of commenting out until we debug further vec![ (Bitwidth::I8, VerificationResult::Success), - // (Bitwidth::I16, VerificationResult::Success), - // (Bitwidth::I32, VerificationResult::Success), + (Bitwidth::I16, VerificationResult::Success), + (Bitwidth::I32, VerificationResult::Success), (Bitwidth::I64, VerificationResult::Success), ], ) @@ -625,15 +625,16 @@ fn test_sdiv() { }) } -fn test_sdiv32() { +#[test] +fn test_sdiv_safe_const() { run_and_retry(|| { test_from_file_with_lhs_termname( - "./examples/sdiv/sdiv32.isle", + "./examples/sdiv/sdiv_safe_const.isle", "sdiv".to_string(), vec![ - (Bitwidth::I8, VerificationResult::InapplicableRule), - (Bitwidth::I16, VerificationResult::InapplicableRule), + (Bitwidth::I8, VerificationResult::Success), // Too slow rn + // (Bitwidth::I16, VerificationResult::Success), // (Bitwidth::I32, VerificationResult::Success), // (Bitwidth::I64, VerificationResult::Success), ], From 3b39c3b3f5e97e422f22bcd87d91ed3610038549 Mon Sep 17 00:00:00 2001 From: Alexa VanHattum Date: Tue, 21 Mar 2023 10:48:34 -0400 Subject: [PATCH 10/11] fmt --- cranelift/isle/veri/veri_engine/src/type_inference.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cranelift/isle/veri/veri_engine/src/type_inference.rs b/cranelift/isle/veri/veri_engine/src/type_inference.rs index 3302184253d2..16583774dd2e 100644 --- a/cranelift/isle/veri/veri_engine/src/type_inference.rs +++ b/cranelift/isle/veri/veri_engine/src/type_inference.rs @@ -1,6 +1,6 @@ +use itertools::Itertools; use std::collections::{HashMap, HashSet}; use std::hash::Hash; -use itertools::Itertools; use crate::termname::pattern_contains_termname; use cranelift_isle as isle; @@ -295,7 +295,10 @@ fn type_annotations_using_rule<'a>( let ty = convert_type(ty); parse_tree.ty_vars.insert(expr, *t); tymap.insert(*t, ty.clone()); - quantified_vars.push(veri_ir::BoundVar { name: s.clone(), tyvar: *t }); + quantified_vars.push(veri_ir::BoundVar { + name: s.clone(), + tyvar: *t, + }); } else { panic!("missing type variable {} in solution for: {:?}", t, expr); } From 5dd4be22bcf418e660c323167ed055250e64e366 Mon Sep 17 00:00:00 2001 From: Alexa VanHattum Date: Tue, 21 Mar 2023 10:55:13 -0400 Subject: [PATCH 11/11] test issues --- cranelift/isle/veri/veri_engine/tests/veri.rs | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/cranelift/isle/veri/veri_engine/tests/veri.rs b/cranelift/isle/veri/veri_engine/tests/veri.rs index 5e63d5acc458..60c7e26e73a6 100644 --- a/cranelift/isle/veri/veri_engine/tests/veri.rs +++ b/cranelift/isle/veri/veri_engine/tests/veri.rs @@ -558,16 +558,22 @@ fn test_ineg() { }) } -// #[test] -// fn test_mul() { -// run_and_retry(|| { -// test_from_file_with_lhs_termname( -// "./examples/imul/imul.isle", -// "imul".to_string(), -// lte_64_success_result(), -// ) -// }); -// } +#[test] +fn test_mul() { + run_and_retry(|| { + test_from_file_with_lhs_termname( + "./examples/imul/imul.isle", + "imul".to_string(), + // Too slow right now: https://github.com/avanhatt/wasmtime/issues/36 + vec![ + (Bitwidth::I8, VerificationResult::Success), + // (Bitwidth::I16, VerificationResult::Success), + // (Bitwidth::I32, VerificationResult::Success), + // (Bitwidth::I64, VerificationResult::Success), + ], + ) + }); +} #[test] fn test_udiv() { @@ -575,12 +581,12 @@ fn test_udiv() { test_from_file_with_lhs_termname( "./examples/udiv/udiv.isle", "udiv".to_string(), - // for ease of commenting out until we debug further + // Too slow right now: https://github.com/avanhatt/wasmtime/issues/36 vec![ (Bitwidth::I8, VerificationResult::Success), - (Bitwidth::I16, VerificationResult::Success), - (Bitwidth::I32, VerificationResult::Success), - (Bitwidth::I64, VerificationResult::Success), + // (Bitwidth::I16, VerificationResult::Success), + // (Bitwidth::I32, VerificationResult::Success), + // (Bitwidth::I64, VerificationResult::Success), ], ) }) @@ -616,7 +622,7 @@ fn test_sdiv() { "sdiv".to_string(), vec![ (Bitwidth::I8, VerificationResult::Success), - // Too slow rn + // Too slow right now: https://github.com/avanhatt/wasmtime/issues/36 // (Bitwidth::I16, VerificationResult::Success), // (Bitwidth::I32, VerificationResult::Success), // (Bitwidth::I64, VerificationResult::Success), @@ -633,7 +639,7 @@ fn test_sdiv_safe_const() { "sdiv".to_string(), vec![ (Bitwidth::I8, VerificationResult::Success), - // Too slow rn + // Too slow right now: https://github.com/avanhatt/wasmtime/issues/36 // (Bitwidth::I16, VerificationResult::Success), // (Bitwidth::I32, VerificationResult::Success), // (Bitwidth::I64, VerificationResult::Success), @@ -658,6 +664,7 @@ fn test_broken_sdiv() { vec![ (Bitwidth::I8, VerificationResult::InapplicableRule), (Bitwidth::I16, VerificationResult::InapplicableRule), + // Too slow right now: https://github.com/avanhatt/wasmtime/issues/36 // (Bitwidth::I32, VerificationResult::Success), // (Bitwidth::I64, VerificationResult::Success), ],