From bfa41b693018a17aa07975f8d2d63f28724faab0 Mon Sep 17 00:00:00 2001 From: kheradmandG Date: Fri, 18 Nov 2022 12:30:47 -0800 Subject: [PATCH] [p4_symbolic] Add control flow graph analysis. --- p4_symbolic/ir/BUILD.bazel | 44 +- p4_symbolic/ir/cfg.cc | 317 +++ p4_symbolic/ir/cfg.h | 194 ++ p4_symbolic/ir/cfg_test.cc | 501 ++++ p4_symbolic/ir/expected/basic.txt | 7 + .../ir/expected/complex_conditional.txt | 90 + p4_symbolic/ir/expected/conditional.txt | 14 + .../ir/expected/conditional_sequence.txt | 84 + p4_symbolic/ir/expected/hardcoded.txt | 10 + p4_symbolic/ir/expected/reflector.txt | 4 + p4_symbolic/ir/expected/set_invalid.txt | 14 + p4_symbolic/ir/expected/table.txt | 4 + p4_symbolic/ir/expected/table_hit_1.txt | 7 + p4_symbolic/ir/expected/table_hit_2.txt | 14 + p4_symbolic/ir/ir.cc | 37 +- p4_symbolic/ir/ir.h | 3 +- p4_symbolic/ir/ir.proto | 18 + p4_symbolic/symbolic/BUILD.bazel | 1 + p4_symbolic/symbolic/conditional.cc | 57 +- .../symbolic/expected/conditional.smt2 | 166 +- .../expected/conditional_sequence.smt2 | 2295 ++--------------- p4_symbolic/symbolic/table.cc | 39 +- p4_symbolic/symbolic/util.cc | 32 +- p4_symbolic/symbolic/util.h | 4 +- 24 files changed, 1696 insertions(+), 2260 deletions(-) create mode 100644 p4_symbolic/ir/cfg.cc create mode 100644 p4_symbolic/ir/cfg.h create mode 100644 p4_symbolic/ir/cfg_test.cc diff --git a/p4_symbolic/ir/BUILD.bazel b/p4_symbolic/ir/BUILD.bazel index c60fd320..21875e54 100644 --- a/p4_symbolic/ir/BUILD.bazel +++ b/p4_symbolic/ir/BUILD.bazel @@ -79,13 +79,53 @@ cc_library( "ir.h", ], deps = [ + ":cfg", ":ir_cc_proto", - ":table_entries", "//gutil:status", "//p4_symbolic/bmv2:bmv2_cc_proto", "@com_github_p4lang_p4runtime//:p4info_cc_proto", + "@com_google_absl//absl/container:flat_hash_map", + "@com_google_absl//absl/container:flat_hash_set", + "@com_google_absl//absl/container:node_hash_map", + "@com_google_absl//absl/status", + "@com_google_absl//absl/status:statusor", + "@com_google_absl//absl/strings", + ], +) + +cc_library( + name = "cfg", + srcs = [ + "cfg.cc", + "ir.h", # needed for the definition of EndOfPipeline + ], + hdrs = ["cfg.h"], + deps = [ + ":ir_cc_proto", + "//gutil:status", + "//p4_symbolic/bmv2:bmv2_cc_proto", + "@com_google_absl//absl/container:btree", + "@com_google_absl//absl/container:flat_hash_set", + "@com_google_absl//absl/container:node_hash_map", + "@com_google_absl//absl/status", + "@com_google_absl//absl/status:statusor", + "@com_google_absl//absl/strings", + ], +) + +cc_test( + name = "cfg_test", + srcs = ["cfg_test.cc"], + deps = [ + ":cfg", + ":ir", + ":ir_cc_proto", + "//gutil:proto", + "//gutil:status_matchers", + "@com_google_absl//absl/container:btree", + "@com_google_absl//absl/status", "@com_google_absl//absl/strings", - "@com_google_protobuf//:protobuf", + "@com_google_googletest//:gtest_main", ], ) diff --git a/p4_symbolic/ir/cfg.cc b/p4_symbolic/ir/cfg.cc new file mode 100644 index 00000000..b610221a --- /dev/null +++ b/p4_symbolic/ir/cfg.cc @@ -0,0 +1,317 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "p4_symbolic/ir/cfg.h" + +#include +#include +#include +#include + +#include "absl/container/flat_hash_set.h" +#include "absl/status/status.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/str_join.h" +#include "absl/strings/substitute.h" +#include "gutil/status.h" +#include "p4_symbolic/ir/ir.h" + +namespace p4_symbolic::ir { + +namespace { + +// Returns the set of the children of the given `control_name` in the given +// `program`. +absl::StatusOr> GetChildren( + const P4Program &program, const std::string &control_name) { + absl::btree_set children; + + if (control_name == EndOfPipeline()) return children; + + if (auto it = program.conditionals().find(control_name); + it != program.conditionals().end()) { + for (const auto &branch : + {it->second.if_branch(), it->second.else_branch()}) { + children.insert(branch); + } + + } else if (auto it = program.tables().find(control_name); + it != program.tables().end()) { + for (const auto &[_, next_control] : + it->second.table_implementation().action_to_next_control()) { + children.insert(next_control); + } + } else { + return absl::InvalidArgumentError( + absl::Substitute("Unrecognized control '$0'", control_name)); + } + + return children; +} + +// Returns the LCP of two control paths. +ControlPath LongestCommonPrefix(const ControlPath &l, const ControlPath &r) { + ControlPath result; + int index = 0; + while (index < l.size() && index < r.size() && l[index] == r[index]) { + result.push_back(l[index]); + index++; + } + return result; +} + +} // namespace + +std::string ToString(const CfgNode &node) { + return absl::Substitute( + "node: $0\n\tchildren: [$1]\n\tparents: [$2]\n\tpath_from_root: " + "$3\n\trev_path_from_leaf: $4\n\tmerge_point: $5\n\tcontinue: $6\n", + node.control_name, absl::StrJoin(node.children, ","), + absl::StrJoin(node.parents, ","), + absl::StrJoin(node.contracted_path_from_root, "->"), + absl::StrJoin(node.contracted_reverse_path_from_leaf, "<-"), + node.merge_point.has_value() ? node.merge_point.value() : "nullopt", + node.continue_to_merge_point ? "true" : "false"); +} + +std::string ControlFlowGraph::ToString() { + std::string out; + absl::StrAppend(&out, node_by_name_.size(), " nodes\n"); + for (const auto &[name, cfg_node] : node_by_name_) { + absl::StrAppend(&out, "[", name, "] ", + ::p4_symbolic::ir::ToString(cfg_node)); + } + return out; +} + +absl::StatusOr +ControlFlowGraph::GetOptimizedSymbolicExecutionInfo( + absl::string_view control_name) { + absl::StatusOr cfg_node_ptr_or_status = + GetNode(control_name); + RETURN_IF_ERROR(cfg_node_ptr_or_status.status()); + const CfgNode &cfg_node = **cfg_node_ptr_or_status; + + if (!cfg_node.merge_point.has_value()) + return absl::InvalidArgumentError( + absl::Substitute("Control node '$0' does not have a merge point", + cfg_node.control_name)); + + OptimizedSymbolicExecutionInfo info; + info.set_merge_point(*cfg_node.merge_point); + info.set_continue_to_merge_point(cfg_node.continue_to_merge_point); + return info; +} + +absl::StatusOr ControlFlowGraph::GetNode( + absl::string_view control_name) { + return GetMutableNode(control_name); +} + +absl::StatusOr ControlFlowGraph::GetMutableNode( + absl::string_view control_name) { + auto it = node_by_name_.find(control_name); + if (it == node_by_name_.end()) { + return absl::NotFoundError(absl::Substitute( + "Control name '$0' does not correspond to any node in the CFG", + control_name)); + } + + return &(it->second); +} + +CfgNode &ControlFlowGraph::GetOrAddNode(absl::string_view control_name) { + CfgNode &node = node_by_name_[control_name]; + node.control_name = control_name; + return node; +} + +absl::Status ControlFlowGraph::ConstructSubgraph( + const P4Program &program, const std::string &control_name) { + CfgNode &cfg_node = GetOrAddNode(control_name); + ASSIGN_OR_RETURN(absl::btree_set children, + GetChildren(program, control_name)); + for (const std::string &child_control_name : children) { + CfgNode &child_cfg_node = GetOrAddNode(child_control_name); + bool new_node = child_cfg_node.parents.empty(); + cfg_node.children.insert(child_control_name); + child_cfg_node.parents.insert(control_name); + if (new_node) { + // The child_cfg_node is a new node. + RETURN_IF_ERROR(ConstructSubgraph(program, child_control_name)); + } + } + + return absl::OkStatus(); +} + +absl::Status ControlFlowGraph::SetContractedReversePathFromLeaf( + CfgNode &cfg_node) { + ControlPath &reverse_path_from_leaf = + cfg_node.contracted_reverse_path_from_leaf; + + for (const auto &child : cfg_node.children) { + // Compute or get child's contracted reverse path from leaf. + ASSIGN_OR_RETURN(CfgNode * child_cfg_node, GetMutableNode(child)); + const ControlPath &child_reverse_path_from_leaf = + child_cfg_node->contracted_reverse_path_from_leaf; + if (child_reverse_path_from_leaf.empty()) { + RETURN_IF_ERROR(SetContractedReversePathFromLeaf(*child_cfg_node)); + RET_CHECK(!child_reverse_path_from_leaf.empty()) << absl::Substitute( + "Contracted reverse path from leaf of '$0' is empty", + child_cfg_node->control_name); + } + + // Set current node's reverse path from leaf to the longest common + // prefix of childrens'. + if (reverse_path_from_leaf.empty()) { + reverse_path_from_leaf = child_reverse_path_from_leaf; + } else { + // This could lead to O(n^3) complexity across graphs with O(n) branching + // factor. In practice we expect only constant branching, and thus O(n^2) + // complexity. + reverse_path_from_leaf = LongestCommonPrefix( + reverse_path_from_leaf, child_reverse_path_from_leaf); + } + } + + // Add self to the end of the reverse path from leaf. + reverse_path_from_leaf.push_back(cfg_node.control_name); + + return absl::OkStatus(); +} + +absl::Status ControlFlowGraph::SetContractedPathFromRoot(CfgNode &cfg_node) { + ControlPath &path_from_root = cfg_node.contracted_path_from_root; + + for (const auto &parent : cfg_node.parents) { + // Compute or get parent's contracted path from root. + ASSIGN_OR_RETURN(CfgNode * parent_cfg_node, GetMutableNode(parent)); + const ControlPath &parent_path_from_root = + parent_cfg_node->contracted_path_from_root; + if (parent_path_from_root.empty()) { + RETURN_IF_ERROR(SetContractedPathFromRoot(*parent_cfg_node)); + RET_CHECK(!parent_path_from_root.empty()) + << absl::Substitute("Contracted path from root of '$0' is empty", + parent_cfg_node->control_name); + } + + // Set current node's path from root to the longest common + // prefix of parents'. + if (path_from_root.empty()) { + path_from_root = parent_path_from_root; + } else { + path_from_root = + LongestCommonPrefix(path_from_root, parent_path_from_root); + } + } + + // Add self to the end of the path from root. + path_from_root.push_back(cfg_node.control_name); + + return absl::OkStatus(); +} + +absl::StatusOr> ControlFlowGraph::Create( + const P4Program &program) { + // Using `new` to access a non-public constructor. + auto cfg = absl::WrapUnique(new ControlFlowGraph()); + + // Build the basic CFG. + for (const auto &[name, pipeline] : program.pipeline()) { + RETURN_IF_ERROR( + cfg->ConstructSubgraph(program, pipeline.initial_control())); + } + + // Compute contracted paths from root and leaf for each node. + for (auto &[_, cfg_node] : cfg->node_by_name_) { + if (cfg_node.contracted_reverse_path_from_leaf.empty()) { + RETURN_IF_ERROR(cfg->SetContractedReversePathFromLeaf(cfg_node)); + RET_CHECK(!cfg_node.contracted_reverse_path_from_leaf.empty()) + << absl::Substitute( + "contracted_reverse_path_from_leaf of '$0' is empty", + cfg_node.control_name); + } + if (cfg_node.contracted_path_from_root.empty()) { + RETURN_IF_ERROR(cfg->SetContractedPathFromRoot(cfg_node)); + RET_CHECK(!cfg_node.contracted_path_from_root.empty()) + << absl::Substitute("contracted_path_from_root of '$0' is empty", + cfg_node.control_name); + } + } + + auto get_merge_point = + [](const ControlPath &contracted_path) -> std::optional { + // For any contracted path (or reverse path) [root/leaf, ..., n_{k-1}, + // n_k] ending in n_{k}, n_{k-1} is the merge point (or reverse merge + // point) of n_{k} since n_{k-1}. For example, in + // c1 - implicit source + // / \ + // c2 t3 + // / \ / + // t1 t2 / + // \ / / + // t4 - implicit sink + // Contracted reverse path from leaf of c2 is [t4, c2] and the merge point + // of c2 is t4. Also contracted path from root of t2 is [c1, c2, t2] and the + // reverse merge point of t2 c2. + // The merge point / rever merge point of nodes with out-degree / in-degree + // 0 is the implicit sink / source node. We denote that with nullopt (see + // the assumptions in cfg.h). E.g. the merge point of t4 above is nullopt. + return contracted_path.size() > 1 + ? std::optional(contracted_path.rbegin()[1]) + : std::nullopt; + }; + + // Compute continuation (for optimized symbolic execution) for each node. + for (auto &[_, cfg_node] : cfg->node_by_name_) { + // Compute the merge point. + cfg_node.merge_point = + get_merge_point(cfg_node.contracted_reverse_path_from_leaf); + + // Determine continue_to_merge_point. + cfg_node.continue_to_merge_point = false; + if (cfg_node.merge_point.has_value()) { + ASSIGN_OR_RETURN(const CfgNode *merge_point_cfg_node, + cfg->GetNode(*cfg_node.merge_point)); + std::optional merge_point_reverse_merge_point = + get_merge_point(merge_point_cfg_node->contracted_path_from_root); + + // May continue to the merge point iff the reverse merge point (i.e. merge + // point in reverse direction) of the merge point (if any) of the node is + // the node itself (i.e. the given node is the latest node + // prior to the merge point such that all execution paths going through + // the merge point also go through the current node). + // This is to prevent executing shared merge points more than once. + // For example, in the following graph + // c1 - implicit source + // / \ + // c2 t3 + // / \ / + // t1 t2 / + // \ / / + // t4 - implicit sink + // The merge points of c1, c2, t1, t2, t3 are t4. We must only continue to + // t4 from c1 because the revesrse merge point of t4 is c1. + if (merge_point_reverse_merge_point.has_value() && + *merge_point_reverse_merge_point == cfg_node.control_name) { + cfg_node.continue_to_merge_point = true; + } + } + } + + return std::move(cfg); +} + +} // namespace p4_symbolic::ir diff --git a/p4_symbolic/ir/cfg.h b/p4_symbolic/ir/cfg.h new file mode 100644 index 00000000..f5c1c519 --- /dev/null +++ b/p4_symbolic/ir/cfg.h @@ -0,0 +1,194 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Defines APIs for constructing control flow graph of a P4 program and +// performing analysis useful for optimized symbolic execution. +// See go/optimized-symbolic-execution. + +#ifndef PINS_P4_SYMBOLIC_IR_CFG_H_ +#define PINS_P4_SYMBOLIC_IR_CFG_H_ + +#include +#include +#include + +#include "absl/container/btree_set.h" +#include "absl/container/flat_hash_set.h" +#include "absl/container/node_hash_map.h" +#include "absl/status/statusor.h" +#include "p4_symbolic/ir/ir.pb.h" + +namespace p4_symbolic::ir { + +// A subsequence of an execution path in a P4 program. Each element is a control +// name along the path. +using ControlPath = std::vector; + +// A single node in the control flow graph along with various computed metadata. +// We make the following assuptions in the descriptions and definitions below. +// 1. The collection of CfgNodes form a non-empty DAG. +// 2. The DAG has an implicit and unique root/source node implicitly connected +// to all nodes with (explicit) in-degree 0. +// 3. The DAG has an implicit and unique leaf/sink node that all nodes with +// (explicit) out-degree 0 are implicitly connected to. +// 4. We do not explicitly refer to these two implicit nodes in the code. E.g. +// do not include them in paths that start from or end in them. +struct CfgNode { + // Same as a the name of the control node in the IR. + std::string control_name; + + // The children of the current node. + // Using btree_set (here and below) for deterministic order, though not a + // necessary condition (e.g. a flat_hash_set would work too). + absl::btree_set children; + + // The parents of the current node. + absl::btree_set parents; + + // A path from the beginning of the execution (root) to the current node in + // which only nodes common to *all* possible execution paths between the two + // points are included. In other words, for any branching along the path, only + // its "merge point" (see the precise definition below) is included. + // For example, in the following graph + // -> n3 -> n4 + // / \ + // n1 -> n2 -> n6 -> n7 + // \ / + // ---> n5 --- + // The contracted path from root for n4 is n1->n2->n3->n4 and for n7 is + // n1->n2->n6->n7. + // We call such paths "contrated" because intuitively branches along the path + // are contracted. This is related to the notion of "edge contraction" from + // graph theory: given any path from ni to nj, the contracted path is obtained + // by contracting all edges along the path that are not shared among all ni -> + // nj paths. All pairs of nodes in any DAG are guaranteed to have a unique + // contracted path. + ControlPath contracted_path_from_root; + + // Same as `contracted_path_from_root` but the path is from the end of + // execution to the current node (in the reverse direction). + // In the example above, the contracted reverse path from leaf for n5 is + // n7<-n6<-n5 and for n1 is n7<-n6<-n2<-n1. + ControlPath contracted_reverse_path_from_leaf; + + // The name of the first (i.e. closest in topological order) control point + // where all paths starting from the children ("branches") of the + // current node to the sink meet. In the example above, the merge point of n1 + // is n2, for n2 it is n6, and for n3 it is n4. In any DAG with a sink node, + // any node except the sink node is guaranteed to have exactly one merge + // point. + // Note: The merge point of nodes with explicit out-degree 0 is the + // implicit sink node which is not displayed (assumptions 3 and 4 above), + // hence we use nullopt in that case. + // Concept of merge point defined here is equivalent to the concept of + // "immediate post-dominator" in graph theory literature + // (https://en.wikipedia.org/wiki/Dominator_(graph_theory)). + // TODO: Rename everything with familiar graph theory concepts. + std::optional merge_point; + + // Whether or not (optimized) symbolic execution should continue to the merge + // point after executing the subgraph of the current node (up to the merge + // point). This must be set in a way that each node in the graph is guaranteed + // to be executed exactly once: true iff the reverse merge point (i.e. merge + // point in reverse direction) of the merge point (if any) of the node is the + // node itself (see go/optimized-symbolic-execution for details). + bool continue_to_merge_point; +}; + +// Returns a string represting the information stored in the given `cfg_node`. +// Useful for debugging purposes. +std::string ToString(const CfgNode &cfg_node); + +// Control Flow Graph (CFG) of a P4 program created from its P4-Symbolic's IR +// representation along with various CFG analyses useful for optimized +// symbolic execution (go/optimized-symbolic-execution). +// Assumption: The CFG of the input P4 program forms a DAG (this is guaranteed +// in BMv2). Also there is at least one node in the DAG (this is guaranteed by +// `EndOfPipeline` node in IR). +class ControlFlowGraph { + public: + // Creates a ControlFlowGraph from an input P4 program and perform analysis + // for optimized symbolic execution. + // Runtime complexity: O(N*E) where N is the number of CFG + // nodes and E is the number of edges between the nodes. + // Note: Our most complex program at the moment has only 44 nodes, so the + // current complexity is good enough for our purposes (i.e. CFG + // analysis is not a bottleneck). We can revisit the algorithm if this becomes + // a bottleneck. + static absl::StatusOr> Create( + const P4Program &program); + + // Returns information used in optimized symbolic execution for the node + // correspnding to the given `control_name` in the graph, or error if no such + // node exists. Expects input to correspond to a node with an (explicit) + // merge point (i.e. a node with non-zero out-degree), otherwise returns + // error. + absl::StatusOr + GetOptimizedSymbolicExecutionInfo(absl::string_view control_name); + + // Returns a string represting the constructred CFG. Useful for debugging + // purposes. + std::string ToString(); + + // Disallow copy and move (for pointer stability during and after Create. + // Useful for debugging but not a necessary condition). + ControlFlowGraph(const ControlFlowGraph &) = delete; + ControlFlowGraph(ControlFlowGraph &&) = delete; + ControlFlowGraph &operator=(const ControlFlowGraph &) = delete; + ControlFlowGraph &operator=(ControlFlowGraph &&) = delete; + + private: + // Map of each control name to its correspodning CfgNode. + // Must use node_hash_map for pointer stability. + // Note: Pointer stability is a necessariy condition in this case, otherwise + // ConstructSubgraph as well as any code depending on pointers/references to + // CfgNodes in node_by_name_ would break. + absl::node_hash_map node_by_name_; + + // Can only be constructed through a call to Create. + ControlFlowGraph() = default; + + // Returns a non-null immutable pointer to the node correspnding to the given + // `control_name` in the graph, or error if no such node exists. + absl::StatusOr GetNode(absl::string_view control_name); + + // Returns a reference to the node correspnding to the given `control_name` in + // the graph. If such a node does not exist, creates and returns a new node + // with the given name. + CfgNode &GetOrAddNode(absl::string_view control_name); + + // Returns a non-null mutable pointer to the node correspnding to the given + // `control_name` in the graph, or error if no such node exists. + absl::StatusOr GetMutableNode(absl::string_view control_name); + + // Recursively constructs the subgraph corresponding to the given + // `control_name`. Updates the children and parents of the involved + // nodes. + absl::Status ConstructSubgraph(const P4Program &program, + const std::string &control_name); + + // Recursively computes the contracted reverse path from the (implicit) leaf + // to the given `cfg_node`. Sets the `contracted_reverse_path_from_leaf` field + // in the involved nodes (if not already set). + absl::Status SetContractedReversePathFromLeaf(CfgNode &cfg_node); + + // Recursively computes the contracted path from the (implicit) root to the + // given `cfg_node`. Sets the `contracted_path_from_root` field in the + // involved nodes (if not already set). + absl::Status SetContractedPathFromRoot(CfgNode &cfg_node); +}; + +} // namespace p4_symbolic::ir + +#endif // PINS_P4_SYMBOLIC_IR_CFG_H_ diff --git a/p4_symbolic/ir/cfg_test.cc b/p4_symbolic/ir/cfg_test.cc new file mode 100644 index 00000000..d57d089e --- /dev/null +++ b/p4_symbolic/ir/cfg_test.cc @@ -0,0 +1,501 @@ +#include "p4_symbolic/ir/cfg.h" + +#include + +#include "absl/container/btree_map.h" +#include "absl/status/status.h" +#include "absl/strings/str_cat.h" +#include "absl/strings/str_replace.h" +#include "absl/strings/string_view.h" +#include "absl/strings/substitute.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "gutil/proto.h" +#include "gutil/status_matchers.h" +#include "p4_symbolic/ir/ir.h" +#include "p4_symbolic/ir/ir.pb.h" + +namespace p4_symbolic::ir { +namespace { + +using gutil::StatusIs; +using testing::ValuesIn; + +struct CfgTestParam { + // Expected field values in OptimizedSymbolicExecutionInfo for a certain + // control point. + struct ExpectedInfo { + std::string merge_point; + bool continue_to_merge_point; + }; + + std::string test_name; + // The map of control_name to expected symbolic execution info only for + // control points that we care about. + absl::btree_map control_to_expected_info; + // Text proto representing the input IR P4Program. A full program is not + // necessary. It only needs to contain enough information to build the CFG. + std::string ir_program_text_proto; +}; + +absl::StatusOr ReplaceEopAndParseProgramTextProto( + absl::string_view ir_program_text_proto) { + return gutil::ParseTextProto(absl::StrReplaceAll( + ir_program_text_proto, + {{"$eop", absl::Substitute("\"$0\"", EndOfPipeline())}})); +} + +using CfgTest = ::testing::TestWithParam; +std::vector GetCfgTestInstances() { + return { + { + /* t1 - ingress + * | + * t2 - eop + */ + .test_name = "ProgramWithSequentialTables", + .control_to_expected_info = + { + {"t1", {"t2", true}}, + {"t2", {EndOfPipeline(), true}}, + }, + .ir_program_text_proto = R"pb( + pipeline { + key: "ingress" + value { name: "ingress" initial_control: "t1" } + } + tables { + key: "t1" + value { + table_implementation { action_to_next_control { value: "t2" } } + } + } + tables { + key: "t2" + value { + table_implementation { action_to_next_control { value: $eop } } + } + } + )pb", + }, + { + /* c1 - ingress + * / \ + * t1 t2 + * \ / + * t3 - eop + */ + .test_name = "ProgramWithTableAfterConditional", + .control_to_expected_info = + { + {"c1", {"t3", true}}, + {"t1", {"t3", false}}, + {"t2", {"t3", false}}, + {"t3", {EndOfPipeline(), true}}, + }, + .ir_program_text_proto = R"pb( + pipeline { + key: "ingress" + value { name: "ingress" initial_control: "c1" } + } + conditionals { + key: "c1" + value { name: "c1" if_branch: "t1" else_branch: "t2" } + } + tables { + key: "t1" + value { + table_implementation { action_to_next_control { value: "t3" } } + } + } + tables { + key: "t2" + value { + table_implementation { action_to_next_control { value: "t3" } } + } + } + tables { + key: "t3" + value { + table_implementation { action_to_next_control { value: $eop } } + } + } + )pb", + }, + { + /* c1 - ingress + * / | + * t1 | + * \ | + * t2 - eop + */ + .test_name = "ProgramWithConditionalWithoutElse", + .control_to_expected_info = + { + {"c1", {"t2", true}}, + {"t1", {"t2", false}}, + {"t2", {EndOfPipeline(), true}}, + }, + .ir_program_text_proto = R"pb( + pipeline { + key: "ingress" + value { name: "ingress" initial_control: "c1" } + } + conditionals { + key: "c1" + value { name: "c1" if_branch: "t1" else_branch: "t2" } + } + tables { + key: "t1" + value { + table_implementation { action_to_next_control { value: "t2" } } + } + } + tables { + key: "t2" + value { + table_implementation { action_to_next_control { value: $eop } } + } + } + )pb", + }, + { + /* t1 - ingress + * | + * c1 + * / \ + * t2 t3 + * | / + * t4 / + * \ / + * t5 - eop + */ + .test_name = "ProgramWithCombinationOfSequentialTablesAndBranching", + .control_to_expected_info = + { + {"t1", {"c1", true}}, + {"c1", {"t5", true}}, + {"t2", {"t4", true}}, + {"t3", {"t5", false}}, + {"t4", {"t5", false}}, + {"t5", {EndOfPipeline(), true}}, + }, + .ir_program_text_proto = R"pb( + pipeline { + key: "ingress" + value { name: "ingress" initial_control: "t1" } + } + tables { + key: "t1" + value { + table_implementation { action_to_next_control { value: "c1" } } + } + } + conditionals { + key: "c1" + value { name: "c1" if_branch: "t2" else_branch: "t3" } + } + tables { + key: "t2" + value { + table_implementation { action_to_next_control { value: "t4" } } + } + } + tables { + key: "t3" + value { + table_implementation { action_to_next_control { value: "t5" } } + } + } + tables { + key: "t4" + value { + table_implementation { action_to_next_control { value: "t5" } } + } + } + tables { + key: "t5" + value { + table_implementation { action_to_next_control { value: $eop } } + } + } + )pb", + }, + { + /* c1 - ingress + * / \ + * c2 t3 + * / \ / + * t1 t2 / + * \ / / + * t4 / + * \/ + * t5 - eop + */ + .test_name = "ProgramWithNestedBranching", + .control_to_expected_info = + { + {"c1", {"t5", true}}, + {"c2", {"t4", true}}, + {"t1", {"t4", false}}, + {"t2", {"t4", false}}, + {"t3", {"t5", false}}, + {"t4", {"t5", false}}, + {"t5", {EndOfPipeline(), true}}, + }, + .ir_program_text_proto = R"pb( + pipeline { + key: "ingress" + value { name: "ingress" initial_control: "c1" } + } + conditionals { + key: "c1" + value { name: "c1" if_branch: "c2" else_branch: "t3" } + } + conditionals { + key: "c2" + value { name: "c2" if_branch: "t1" else_branch: "t2" } + } + tables { + key: "t1" + value { + table_implementation { action_to_next_control { value: "t4" } } + } + } + tables { + key: "t2" + value { + table_implementation { action_to_next_control { value: "t4" } } + } + } + tables { + key: "t3" + value { + table_implementation { action_to_next_control { value: "t5" } } + } + } + tables { + key: "t4" + value { + table_implementation { action_to_next_control { value: "t5" } } + } + } + tables { + key: "t5" + value { + table_implementation { action_to_next_control { value: $eop } } + } + } + )pb", + }, + { + /* c1 - ingress + * / \ + * c2 t3 + * / \ / + * t1 t2 / + * \ / / + * t4 - eop + */ + .test_name = "ProgramWithSharedMergePoint", + .control_to_expected_info = + { + {"c1", {"t4", true}}, + {"c2", {"t4", false}}, + {"t1", {"t4", false}}, + {"t2", {"t4", false}}, + {"t3", {"t4", false}}, + {"t4", {EndOfPipeline(), true}}, + }, + .ir_program_text_proto = R"pb( + pipeline { + key: "ingress" + value { name: "ingress" initial_control: "c1" } + } + conditionals { + key: "c1" + value { name: "c1" if_branch: "c2" else_branch: "t3" } + } + conditionals { + key: "c2" + value { name: "c2" if_branch: "t1" else_branch: "t2" } + } + tables { + key: "t1" + value { + table_implementation { action_to_next_control { value: "t4" } } + } + } + tables { + key: "t2" + value { + table_implementation { action_to_next_control { value: "t4" } } + } + } + tables { + key: "t3" + value { + table_implementation { action_to_next_control { value: "t4" } } + } + } + tables { + key: "t4" + value { + table_implementation { action_to_next_control { value: $eop } } + } + } + )pb", + }, + { + /* c1 - ingress + * / \ + * t1 t2 + * \ / + * c2 + * / \ + * t3 t4 + * \ / + * t5 - eop + */ + .test_name = "ProgramWithBranchOnMergePoint", + .control_to_expected_info = + { + {"c1", {"c2", true}}, + {"t1", {"c2", false}}, + {"t2", {"c2", false}}, + {"c2", {"t5", true}}, + {"t3", {"t5", false}}, + {"t3", {"t5", false}}, + {"t5", {EndOfPipeline(), true}}, + }, + .ir_program_text_proto = R"pb( + pipeline { + key: "ingress" + value { name: "ingress" initial_control: "c1" } + } + conditionals { + key: "c1" + value { name: "c1" if_branch: "t1" else_branch: "t2" } + } + tables { + key: "t1" + value { + table_implementation { action_to_next_control { value: "c2" } } + } + } + tables { + key: "t2" + value { + table_implementation { action_to_next_control { value: "c2" } } + } + } + conditionals { + key: "c2" + value { name: "c2" if_branch: "t3" else_branch: "t4" } + } + tables { + key: "t3" + value { + table_implementation { action_to_next_control { value: "t5" } } + } + } + tables { + key: "t4" + value { + table_implementation { action_to_next_control { value: "t5" } } + } + } + tables { + key: "t5" + value { + table_implementation { action_to_next_control { value: $eop } } + } + } + )pb", + }, + }; +} + +constexpr absl::string_view kMinimalProgram = R"pb( + pipeline { + key: "ingress" + value { name: "ingress" initial_control: "c1" } + } + conditionals { + key: "c1" + value { name: "c1" if_branch: "t1" else_branch: "t1" } + } + tables { + key: "t1" + value { table_implementation { action_to_next_control { value: $eop } } } + } +)pb"; + +TEST(GetOptimizedSymbolicExecutionInfoTest, ReturnsErrorForEndOfPipeline) { + ASSERT_OK_AND_ASSIGN(const P4Program program, + ReplaceEopAndParseProgramTextProto(kMinimalProgram)); + ASSERT_OK_AND_ASSIGN(std::unique_ptr cfg, + ControlFlowGraph::Create(program)); + + ASSERT_THAT(cfg->GetOptimizedSymbolicExecutionInfo(EndOfPipeline()), + StatusIs(absl::StatusCode::kInvalidArgument)); +} + +TEST(GetOptimizedSymbolicExecutionInfoTest, ReturnsErrorForNonExistingNode) { + ASSERT_OK_AND_ASSIGN(const P4Program program, + ReplaceEopAndParseProgramTextProto(kMinimalProgram)); + ASSERT_OK_AND_ASSIGN(std::unique_ptr cfg, + ControlFlowGraph::Create(program)); + + ASSERT_THAT(cfg->GetOptimizedSymbolicExecutionInfo("non_existing_node"), + StatusIs(absl::StatusCode::kNotFound)); +} + +TEST(GetOptimizedSymbolicExecutionInfoTest, SucceedsForExistingControlNode) { + ASSERT_OK_AND_ASSIGN(const P4Program program, + ReplaceEopAndParseProgramTextProto(kMinimalProgram)); + ASSERT_OK_AND_ASSIGN(std::unique_ptr cfg, + ControlFlowGraph::Create(program)); + + ASSERT_THAT(cfg->GetOptimizedSymbolicExecutionInfo("c1"), + StatusIs(absl::StatusCode::kOk)); +} + +TEST(GetOptimizedSymbolicExecutionInfoTest, SucceedsForExistingTableNode) { + ASSERT_OK_AND_ASSIGN(const P4Program program, + ReplaceEopAndParseProgramTextProto(kMinimalProgram)); + ASSERT_OK_AND_ASSIGN(std::unique_ptr cfg, + ControlFlowGraph::Create(program)); + + ASSERT_THAT(cfg->GetOptimizedSymbolicExecutionInfo("t1"), + StatusIs(absl::StatusCode::kOk)); +} + +TEST_P(CfgTest, GetOptimizedSymbolicExecutionInfoReturnsExpectedInfo) { + const CfgTestParam& param = GetParam(); + + ASSERT_OK_AND_ASSIGN( + const P4Program program, + ReplaceEopAndParseProgramTextProto(param.ir_program_text_proto)); + ASSERT_OK_AND_ASSIGN(std::unique_ptr cfg, + ControlFlowGraph::Create(program)); + + for (const auto& [control_name, expected_output] : + param.control_to_expected_info) { + SCOPED_TRACE(absl::StrCat("control node: ", control_name)); + ASSERT_OK_AND_ASSIGN(auto info, + cfg->GetOptimizedSymbolicExecutionInfo(control_name)); + EXPECT_EQ(info.merge_point(), expected_output.merge_point); + EXPECT_EQ(info.continue_to_merge_point(), + expected_output.continue_to_merge_point); + } +} + +INSTANTIATE_TEST_SUITE_P( + CfgTests, CfgTest, ValuesIn(GetCfgTestInstances()), + [](const testing::TestParamInfo& info) { + return info.param.test_name; + }); + +} // namespace +} // namespace p4_symbolic::ir diff --git a/p4_symbolic/ir/expected/basic.txt b/p4_symbolic/ir/expected/basic.txt index fa3921ac..7a48ed5f 100644 --- a/p4_symbolic/ir/expected/basic.txt +++ b/p4_symbolic/ir/expected/basic.txt @@ -598,6 +598,9 @@ tables { field_name: "dstAddr" } } + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + } } } } @@ -620,6 +623,10 @@ conditionals { } if_branch: "MyIngress.ipv4_lpm" else_branch: "__END_OF_PIPELINE__" + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + continue_to_merge_point: true + } } } pipeline { diff --git a/p4_symbolic/ir/expected/complex_conditional.txt b/p4_symbolic/ir/expected/complex_conditional.txt index 27d984e4..57adf136 100644 --- a/p4_symbolic/ir/expected/complex_conditional.txt +++ b/p4_symbolic/ir/expected/complex_conditional.txt @@ -306,6 +306,10 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "node_27" + continue_to_merge_point: true + } } } } @@ -388,6 +392,9 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "MyEgress.n25" + } } } } @@ -470,6 +477,9 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + } } } } @@ -552,6 +562,9 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.n13" + } } } } @@ -634,6 +647,9 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.n13" + } } } } @@ -716,6 +732,9 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "node_16" + } } } } @@ -798,6 +817,9 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "node_16" + } } } } @@ -880,6 +902,10 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.n18" + continue_to_merge_point: true + } } } } @@ -962,6 +988,9 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.n21" + } } } } @@ -1044,6 +1073,9 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.n21" + } } } } @@ -1126,6 +1158,10 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.n3" + continue_to_merge_point: true + } } } } @@ -1208,6 +1244,9 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.n21" + } } } } @@ -1290,6 +1329,10 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.n22" + continue_to_merge_point: true + } } } } @@ -1372,6 +1415,9 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + } } } } @@ -1454,6 +1500,10 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "node_6" + continue_to_merge_point: true + } } } } @@ -1536,6 +1586,9 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.n9" + } } } } @@ -1618,6 +1671,10 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.n8" + continue_to_merge_point: true + } } } } @@ -1700,6 +1757,9 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.n9" + } } } } @@ -1782,6 +1842,10 @@ tables { field_name: "f1" } } + optimized_symbolic_execution_info { + merge_point: "node_16" + continue_to_merge_point: true + } } } } @@ -1809,6 +1873,10 @@ conditionals { } if_branch: "MyIngress.n11" else_branch: "MyIngress.n12" + optimized_symbolic_execution_info { + merge_point: "MyIngress.n13" + continue_to_merge_point: true + } } } conditionals { @@ -1835,6 +1903,10 @@ conditionals { } if_branch: "node_17" else_branch: "MyIngress.n17" + optimized_symbolic_execution_info { + merge_point: "MyIngress.n21" + continue_to_merge_point: true + } } } conditionals { @@ -1861,6 +1933,9 @@ conditionals { } if_branch: "MyIngress.n19" else_branch: "MyIngress.n20" + optimized_symbolic_execution_info { + merge_point: "MyIngress.n21" + } } } conditionals { @@ -1887,6 +1962,10 @@ conditionals { } if_branch: "MyIngress.n2" else_branch: "MyIngress.n2" + optimized_symbolic_execution_info { + merge_point: "MyIngress.n2" + continue_to_merge_point: true + } } } conditionals { @@ -1913,6 +1992,10 @@ conditionals { } if_branch: "node_28" else_branch: "MyEgress.n25" + optimized_symbolic_execution_info { + merge_point: "MyEgress.n25" + continue_to_merge_point: true + } } } conditionals { @@ -1939,6 +2022,9 @@ conditionals { } if_branch: "MyEgress.n24" else_branch: "MyEgress.n25" + optimized_symbolic_execution_info { + merge_point: "MyEgress.n25" + } } } conditionals { @@ -1965,6 +2051,10 @@ conditionals { } if_branch: "MyIngress.n6" else_branch: "MyIngress.n7" + optimized_symbolic_execution_info { + merge_point: "MyIngress.n9" + continue_to_merge_point: true + } } } pipeline { diff --git a/p4_symbolic/ir/expected/conditional.txt b/p4_symbolic/ir/expected/conditional.txt index 53c01e7b..c7c7db71 100644 --- a/p4_symbolic/ir/expected/conditional.txt +++ b/p4_symbolic/ir/expected/conditional.txt @@ -404,6 +404,9 @@ tables { field_name: "ether_type" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.t_3" + } } } } @@ -525,6 +528,9 @@ tables { field_name: "src_addr" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.t_3" + } } } } @@ -646,6 +652,10 @@ tables { field_name: "dst_addr" } } + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + continue_to_merge_point: true + } } } } @@ -673,6 +683,10 @@ conditionals { } if_branch: "MyIngress.t_1" else_branch: "MyIngress.t_2" + optimized_symbolic_execution_info { + merge_point: "MyIngress.t_3" + continue_to_merge_point: true + } } } pipeline { diff --git a/p4_symbolic/ir/expected/conditional_sequence.txt b/p4_symbolic/ir/expected/conditional_sequence.txt index 32b5c9ab..4c033e97 100644 --- a/p4_symbolic/ir/expected/conditional_sequence.txt +++ b/p4_symbolic/ir/expected/conditional_sequence.txt @@ -399,6 +399,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "node_5" + } } } } @@ -501,6 +504,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "node_8" + } } } } @@ -603,6 +609,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "node_11" + } } } } @@ -705,6 +714,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "node_14" + } } } } @@ -807,6 +819,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "node_17" + } } } } @@ -909,6 +924,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "node_20" + } } } } @@ -1011,6 +1029,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "node_23" + } } } } @@ -1113,6 +1134,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.t" + } } } } @@ -1215,6 +1239,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "node_5" + } } } } @@ -1317,6 +1344,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "node_8" + } } } } @@ -1419,6 +1449,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "node_11" + } } } } @@ -1521,6 +1554,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "node_14" + } } } } @@ -1623,6 +1659,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "node_17" + } } } } @@ -1725,6 +1764,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "node_20" + } } } } @@ -1827,6 +1869,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "node_23" + } } } } @@ -1929,6 +1974,9 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.t" + } } } } @@ -2031,6 +2079,10 @@ tables { field_name: "fr" } } + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + continue_to_merge_point: true + } } } } @@ -2058,6 +2110,10 @@ conditionals { } if_branch: "MyIngress.i4" else_branch: "MyIngress.e4" + optimized_symbolic_execution_info { + merge_point: "node_14" + continue_to_merge_point: true + } } } conditionals { @@ -2084,6 +2140,10 @@ conditionals { } if_branch: "MyIngress.i5" else_branch: "MyIngress.e5" + optimized_symbolic_execution_info { + merge_point: "node_17" + continue_to_merge_point: true + } } } conditionals { @@ -2110,6 +2170,10 @@ conditionals { } if_branch: "MyIngress.i6" else_branch: "MyIngress.e6" + optimized_symbolic_execution_info { + merge_point: "node_20" + continue_to_merge_point: true + } } } conditionals { @@ -2136,6 +2200,10 @@ conditionals { } if_branch: "MyIngress.i1" else_branch: "MyIngress.e1" + optimized_symbolic_execution_info { + merge_point: "node_5" + continue_to_merge_point: true + } } } conditionals { @@ -2162,6 +2230,10 @@ conditionals { } if_branch: "MyIngress.i7" else_branch: "MyIngress.e7" + optimized_symbolic_execution_info { + merge_point: "node_23" + continue_to_merge_point: true + } } } conditionals { @@ -2188,6 +2260,10 @@ conditionals { } if_branch: "MyIngress.i8" else_branch: "MyIngress.e8" + optimized_symbolic_execution_info { + merge_point: "MyIngress.t" + continue_to_merge_point: true + } } } conditionals { @@ -2214,6 +2290,10 @@ conditionals { } if_branch: "MyIngress.i2" else_branch: "MyIngress.e2" + optimized_symbolic_execution_info { + merge_point: "node_8" + continue_to_merge_point: true + } } } conditionals { @@ -2240,6 +2320,10 @@ conditionals { } if_branch: "MyIngress.i3" else_branch: "MyIngress.e3" + optimized_symbolic_execution_info { + merge_point: "node_11" + continue_to_merge_point: true + } } } pipeline { diff --git a/p4_symbolic/ir/expected/hardcoded.txt b/p4_symbolic/ir/expected/hardcoded.txt index 929a608e..f0fc90fd 100644 --- a/p4_symbolic/ir/expected/hardcoded.txt +++ b/p4_symbolic/ir/expected/hardcoded.txt @@ -209,6 +209,9 @@ tables { key: "hardcoded55" value: "__END_OF_PIPELINE__" } + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + } } } } @@ -226,6 +229,9 @@ tables { key: "hardcoded57" value: "__END_OF_PIPELINE__" } + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + } } } } @@ -253,6 +259,10 @@ conditionals { } if_branch: "tbl_hardcoded55" else_branch: "tbl_hardcoded57" + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + continue_to_merge_point: true + } } } pipeline { diff --git a/p4_symbolic/ir/expected/reflector.txt b/p4_symbolic/ir/expected/reflector.txt index 0f443815..6c4289e8 100644 --- a/p4_symbolic/ir/expected/reflector.txt +++ b/p4_symbolic/ir/expected/reflector.txt @@ -177,6 +177,10 @@ tables { key: "reflector54" value: "__END_OF_PIPELINE__" } + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + continue_to_merge_point: true + } } } } diff --git a/p4_symbolic/ir/expected/set_invalid.txt b/p4_symbolic/ir/expected/set_invalid.txt index 39ac613b..1090835e 100644 --- a/p4_symbolic/ir/expected/set_invalid.txt +++ b/p4_symbolic/ir/expected/set_invalid.txt @@ -255,6 +255,10 @@ tables { key: "set_invalid61" value: "node_3" } + optimized_symbolic_execution_info { + merge_point: "node_3" + continue_to_merge_point: true + } } } } @@ -272,6 +276,9 @@ tables { key: "set_invalid63" value: "__END_OF_PIPELINE__" } + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + } } } } @@ -289,6 +296,9 @@ tables { key: "set_invalid65" value: "__END_OF_PIPELINE__" } + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + } } } } @@ -316,6 +326,10 @@ conditionals { } if_branch: "tbl_set_invalid63" else_branch: "tbl_set_invalid65" + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + continue_to_merge_point: true + } } } pipeline { diff --git a/p4_symbolic/ir/expected/table.txt b/p4_symbolic/ir/expected/table.txt index 053a91cb..70eccfa3 100644 --- a/p4_symbolic/ir/expected/table.txt +++ b/p4_symbolic/ir/expected/table.txt @@ -302,6 +302,10 @@ tables { field_name: "ingress_port" } } + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + continue_to_merge_point: true + } } } } diff --git a/p4_symbolic/ir/expected/table_hit_1.txt b/p4_symbolic/ir/expected/table_hit_1.txt index 32b283d3..1b45a1f2 100644 --- a/p4_symbolic/ir/expected/table_hit_1.txt +++ b/p4_symbolic/ir/expected/table_hit_1.txt @@ -404,6 +404,10 @@ tables { field_name: "ether_type" } } + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + continue_to_merge_point: true + } } } } @@ -525,6 +529,9 @@ tables { field_name: "src_addr" } } + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + } } } } diff --git a/p4_symbolic/ir/expected/table_hit_2.txt b/p4_symbolic/ir/expected/table_hit_2.txt index 9cfb785b..2c26be5d 100644 --- a/p4_symbolic/ir/expected/table_hit_2.txt +++ b/p4_symbolic/ir/expected/table_hit_2.txt @@ -404,6 +404,10 @@ tables { field_name: "ether_type" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.t_3" + continue_to_merge_point: true + } } } } @@ -525,6 +529,9 @@ tables { field_name: "ether_type" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.t_3" + } } } } @@ -646,6 +653,9 @@ tables { field_name: "src_addr" } } + optimized_symbolic_execution_info { + merge_point: "MyIngress.t_3" + } } } } @@ -767,6 +777,10 @@ tables { field_name: "dst_addr" } } + optimized_symbolic_execution_info { + merge_point: "__END_OF_PIPELINE__" + continue_to_merge_point: true + } } } } diff --git a/p4_symbolic/ir/ir.cc b/p4_symbolic/ir/ir.cc index 61292f43..9e0f9f1d 100644 --- a/p4_symbolic/ir/ir.cc +++ b/p4_symbolic/ir/ir.cc @@ -14,16 +14,27 @@ #include "p4_symbolic/ir/ir.h" +#include +#include +#include #include #include #include #include +#include "absl/container/flat_hash_map.h" +#include "absl/container/flat_hash_set.h" +#include "absl/container/node_hash_map.h" +#include "absl/status/status.h" +#include "absl/status/statusor.h" #include "absl/strings/match.h" #include "absl/strings/str_cat.h" +#include "absl/strings/string_view.h" #include "absl/strings/strip.h" -#include "google/protobuf/struct.pb.h" +#include "gutil/status.h" #include "p4/config/v1/p4info.pb.h" +#include "p4_symbolic/ir/cfg.h" +#include "p4_symbolic/ir/ir.pb.h" namespace p4_symbolic { namespace ir { @@ -452,10 +463,10 @@ absl::StatusOr ExtractRValue( // where an expression may have its value be a single other expression // which value may also be another single expression, etc, until // finally the actual value of the expression is reached. - // This is the bmv2 format analogous case to having an expression wrapped - // in many useless paranthesis. - // An example of this can be found at //p4-samples/ipv4-routing/basic.json - // after `make build` is run in that directory. + // This is the bmv2 format analogous case to having an expression + // wrapped in many useless paranthesis. An example of this can be found + // at //p4-samples/ipv4-routing/basic.json after `make build` is run in + // that directory. while (expression->fields().count("op") != 1) { if (expression->fields().count("type") != 1 || expression->fields().at("type").string_value() != "expression" || @@ -875,6 +886,22 @@ absl::StatusOr Bmv2AndP4infoToIr(const bmv2::P4Program &bmv2, } } + // Create the Control Flow Graph (CFG) of the program and perform analysis for + // optimized symbolic execution. + ASSIGN_OR_RETURN(std::unique_ptr cfg, + ControlFlowGraph::Create(output)); + // Set the optimized symbolic execution information in the IR program using + // the result of CFG analysis. + for (auto &[name, conditional] : *output.mutable_conditionals()) { + ASSIGN_OR_RETURN(*conditional.mutable_optimized_symbolic_execution_info(), + cfg->GetOptimizedSymbolicExecutionInfo(name)); + } + for (auto &[name, table] : *output.mutable_tables()) { + ASSIGN_OR_RETURN(*table.mutable_table_implementation() + ->mutable_optimized_symbolic_execution_info(), + cfg->GetOptimizedSymbolicExecutionInfo(name)); + } + return output; } diff --git a/p4_symbolic/ir/ir.h b/p4_symbolic/ir/ir.h index 5780c9e4..c02b55a5 100644 --- a/p4_symbolic/ir/ir.h +++ b/p4_symbolic/ir/ir.h @@ -19,11 +19,10 @@ #ifndef P4_SYMBOLIC_IR_IR_H_ #define P4_SYMBOLIC_IR_IR_H_ +#include "absl/status/statusor.h" #include "absl/strings/string_view.h" -#include "gutil/status.h" #include "p4_symbolic/bmv2/bmv2.pb.h" #include "p4_symbolic/ir/ir.pb.h" -#include "p4_symbolic/ir/table_entries.h" namespace p4_symbolic { namespace ir { diff --git a/p4_symbolic/ir/ir.proto b/p4_symbolic/ir/ir.proto index 6f22bec7..9abc03fc 100644 --- a/p4_symbolic/ir/ir.proto +++ b/p4_symbolic/ir/ir.proto @@ -84,6 +84,19 @@ message ActionImplementation { repeated Statement action_body = 3; } +// Control flow information used during optimized symbolic execution +// (go/optimized-symbolic-execution) for each control point. +message OptimizedSymbolicExecutionInfo { + // The name of the first control point where all execution paths branched + // from the current control point will converge (refer to the respective field + // in `CfgNode` for precise definition). + string merge_point = 1; + // Whether symbolic execution must continue (to the merge point) after + // traversing the subgraph of the current control point (refer to the + // respective field in `CfgNode` for details). + bool continue_to_merge_point = 2; +} + // Overall table structure, combining definition with implementation. message Table { // This contains the name, id, action list, field matches, and max size. @@ -121,6 +134,9 @@ message TableImplementation { // Maps the name of a match (identical to the name used in p4 info), to // that match's target field. map match_name_to_field = 5; + + // Control flow information for optimized symbolic execution. + OptimizedSymbolicExecutionInfo optimized_symbolic_execution_info = 6; } // A conditional statement. @@ -139,6 +155,8 @@ message Conditional { // present). string if_branch = 3; string else_branch = 4; + // Control flow information for optimized symbolic execution. + OptimizedSymbolicExecutionInfo optimized_symbolic_execution_info = 5; } message Pipeline { diff --git a/p4_symbolic/symbolic/BUILD.bazel b/p4_symbolic/symbolic/BUILD.bazel index ad8b4908..084398c6 100644 --- a/p4_symbolic/symbolic/BUILD.bazel +++ b/p4_symbolic/symbolic/BUILD.bazel @@ -54,6 +54,7 @@ cc_library( "//p4_pdpi/utils:ir", "//p4_symbolic:z3_util", "//p4_symbolic/ir", + "//p4_symbolic/ir:cfg", "//p4_symbolic/ir:ir_cc_proto", "//p4_symbolic/ir:table_entries", "@com_github_google_glog//:glog", diff --git a/p4_symbolic/symbolic/conditional.cc b/p4_symbolic/symbolic/conditional.cc index aa2c8681..c9edc709 100644 --- a/p4_symbolic/symbolic/conditional.cc +++ b/p4_symbolic/symbolic/conditional.cc @@ -17,7 +17,11 @@ #include "p4_symbolic/symbolic/conditional.h" +#include "absl/status/status.h" +#include "absl/strings/string_view.h" +#include "absl/strings/substitute.h" #include "gutil/status.h" +#include "p4_symbolic/ir/ir.h" #include "p4_symbolic/symbolic/action.h" #include "p4_symbolic/symbolic/operators.h" #include "p4_symbolic/symbolic/util.h" @@ -43,20 +47,61 @@ absl::StatusOr EvaluateConditional( ASSIGN_OR_RETURN(z3::expr else_guard, operators::And(guard, negated_condition)); + auto get_next_control_for_branch = [&](const std::string &branch) { + return branch == + conditional.optimized_symbolic_execution_info().merge_point() + ? ir::EndOfPipeline() // Do not jump to the merge point (yet). + : branch; + }; + // Evaluate both branches. - ASSIGN_OR_RETURN(SymbolicTableMatches if_matches, - control::EvaluateControl(data_plane, conditional.if_branch(), - state, translator, if_guard)); + ASSIGN_OR_RETURN( + SymbolicTableMatches if_matches, + control::EvaluateControl( + data_plane, get_next_control_for_branch(conditional.if_branch()), + state, translator, if_guard)); ASSIGN_OR_RETURN( SymbolicTableMatches else_matches, - control::EvaluateControl(data_plane, conditional.else_branch(), state, - translator, else_guard)); + control::EvaluateControl( + data_plane, get_next_control_for_branch(conditional.else_branch()), + state, translator, else_guard)); // Now we have two traces that need merging. // We should merge in a way such that the value of a field in the trace is // the one from the if branch if the condition is true, and the else branch // otherwise. - return util::MergeMatchesOnCondition(condition, if_matches, else_matches); + ASSIGN_OR_RETURN( + SymbolicTableMatches merged_matches, + util::MergeMatchesOnCondition(condition, if_matches, else_matches)); + + if (!conditional.optimized_symbolic_execution_info() + .continue_to_merge_point()) { + // The merge point is guaranteed to be evaluated through a different path + // (see go/optimized-symbolic-execution). + return merged_matches; + } else { + // Jump to the merge point and continue the execution from there. + ASSIGN_OR_RETURN( + SymbolicTableMatches result, + control::EvaluateControl( + data_plane, + conditional.optimized_symbolic_execution_info().merge_point(), + state, translator, guard)); + + // Merge the result of execution from the merge point with the result of + // merged if/else branches. + for (const auto &[table_name, match] : merged_matches) { + auto [_, inserted] = result.insert({table_name, std::move(match)}); + if (!inserted) { + return absl::InternalError( + absl::Substitute("Table '$0' is encountered in branches and after " + "the merge point of '$1'", + table_name, conditional.name())); + } + } + + return result; + } } } // namespace conditional diff --git a/p4_symbolic/symbolic/expected/conditional.smt2 b/p4_symbolic/symbolic/expected/conditional.smt2 index 563e1c38..b971879e 100644 --- a/p4_symbolic/symbolic/expected/conditional.smt2 +++ b/p4_symbolic/symbolic/expected/conditional.smt2 @@ -4,37 +4,31 @@ (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun ethernet.dst_addr () (_ BitVec 48)) (assert - (let (($x72 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x72)))) + (let (($x61 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x61)))) (assert (let (($x31 (= standard_metadata.ingress_port (concat (_ bv0 8) (_ bv0 1))))) (let (($x33 (and true $x31))) - (let ((?x44 (ite (and $x33 (not (and true (= ethernet.dst_addr (_ bv1 48))))) (_ bv511 9) (ite $x33 (_ bv511 9) standard_metadata.egress_spec)))) - (let (($x39 (= ethernet.dst_addr (_ bv1 48)))) - (let (($x40 (and true $x39))) - (let (($x41 (and $x33 $x40))) (let (($x34 (and true (not $x31)))) - (let (($x56 (and $x34 (not (and true (= (ite $x41 (_ bv2 48) ethernet.dst_addr) (_ bv1 48))))))) - (let (($x53 (and true (= (ite $x41 (_ bv2 48) ethernet.dst_addr) (_ bv1 48))))) - (let (($x54 (and $x34 $x53))) - (let ((?x59 (ite $x54 (_ bv1 9) (ite $x56 (_ bv511 9) (ite $x34 (_ bv511 9) (ite $x41 (_ bv1 9) ?x44)))))) - (let (($x65 (= ?x59 (_ bv511 9)))) - (or $x65 (or (or false (= ?x59 (_ bv0 9))) (= ?x59 (_ bv1 9))))))))))))))))) + (let ((?x47 (ite (and true (not (and true (= ethernet.dst_addr (_ bv1 48))))) (_ bv511 9) (ite $x34 (_ bv511 9) (ite $x33 (_ bv511 9) standard_metadata.egress_spec))))) + (let (($x42 (= ethernet.dst_addr (_ bv1 48)))) + (let (($x43 (and true $x42))) + (let (($x44 (and true $x43))) + (let ((?x52 (ite $x44 (_ bv1 9) ?x47))) + (let (($x54 (= ?x52 (_ bv511 9)))) + (or $x54 (or (or false (= ?x52 (_ bv0 9))) (= ?x52 (_ bv1 9)))))))))))))) (assert (let (($x31 (= standard_metadata.ingress_port (concat (_ bv0 8) (_ bv0 1))))) (let (($x33 (and true $x31))) - (let (($x61 (ite $x31 $x33 false))) - (let ((?x44 (ite (and $x33 (not (and true (= ethernet.dst_addr (_ bv1 48))))) (_ bv511 9) (ite $x33 (_ bv511 9) standard_metadata.egress_spec)))) - (let (($x39 (= ethernet.dst_addr (_ bv1 48)))) - (let (($x40 (and true $x39))) - (let (($x41 (and $x33 $x40))) + (let (($x39 (ite $x31 $x33 false))) (let (($x34 (and true (not $x31)))) - (let (($x56 (and $x34 (not (and true (= (ite $x41 (_ bv2 48) ethernet.dst_addr) (_ bv1 48))))))) - (let (($x53 (and true (= (ite $x41 (_ bv2 48) ethernet.dst_addr) (_ bv1 48))))) - (let (($x54 (and $x34 $x53))) - (let ((?x59 (ite $x54 (_ bv1 9) (ite $x56 (_ bv511 9) (ite $x34 (_ bv511 9) (ite $x41 (_ bv1 9) ?x44)))))) - (let (($x65 (= ?x59 (_ bv511 9)))) - (and (and (not $x65) $x61) (= (- 1) (- 1))))))))))))))))) + (let ((?x47 (ite (and true (not (and true (= ethernet.dst_addr (_ bv1 48))))) (_ bv511 9) (ite $x34 (_ bv511 9) (ite $x33 (_ bv511 9) standard_metadata.egress_spec))))) + (let (($x42 (= ethernet.dst_addr (_ bv1 48)))) + (let (($x43 (and true $x42))) + (let (($x44 (and true $x43))) + (let ((?x52 (ite $x44 (_ bv1 9) ?x47))) + (let (($x54 (= ?x52 (_ bv511 9)))) + (and (and (not $x54) $x39) (= (- 1) (- 1)))))))))))))) (check-sat) ; @@ -43,37 +37,31 @@ (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun ethernet.dst_addr () (_ BitVec 48)) (assert - (let (($x72 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x72)))) + (let (($x61 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x61)))) (assert (let (($x31 (= standard_metadata.ingress_port (concat (_ bv0 8) (_ bv0 1))))) (let (($x33 (and true $x31))) - (let ((?x44 (ite (and $x33 (not (and true (= ethernet.dst_addr (_ bv1 48))))) (_ bv511 9) (ite $x33 (_ bv511 9) standard_metadata.egress_spec)))) - (let (($x39 (= ethernet.dst_addr (_ bv1 48)))) - (let (($x40 (and true $x39))) - (let (($x41 (and $x33 $x40))) (let (($x34 (and true (not $x31)))) - (let (($x56 (and $x34 (not (and true (= (ite $x41 (_ bv2 48) ethernet.dst_addr) (_ bv1 48))))))) - (let (($x53 (and true (= (ite $x41 (_ bv2 48) ethernet.dst_addr) (_ bv1 48))))) - (let (($x54 (and $x34 $x53))) - (let ((?x59 (ite $x54 (_ bv1 9) (ite $x56 (_ bv511 9) (ite $x34 (_ bv511 9) (ite $x41 (_ bv1 9) ?x44)))))) - (let (($x65 (= ?x59 (_ bv511 9)))) - (or $x65 (or (or false (= ?x59 (_ bv0 9))) (= ?x59 (_ bv1 9))))))))))))))))) + (let ((?x47 (ite (and true (not (and true (= ethernet.dst_addr (_ bv1 48))))) (_ bv511 9) (ite $x34 (_ bv511 9) (ite $x33 (_ bv511 9) standard_metadata.egress_spec))))) + (let (($x42 (= ethernet.dst_addr (_ bv1 48)))) + (let (($x43 (and true $x42))) + (let (($x44 (and true $x43))) + (let ((?x52 (ite $x44 (_ bv1 9) ?x47))) + (let (($x54 (= ?x52 (_ bv511 9)))) + (or $x54 (or (or false (= ?x52 (_ bv0 9))) (= ?x52 (_ bv1 9)))))))))))))) (assert (let (($x34 (and true (not (= standard_metadata.ingress_port (concat (_ bv0 8) (_ bv0 1))))))) (let (($x31 (= standard_metadata.ingress_port (concat (_ bv0 8) (_ bv0 1))))) - (let (($x64 (ite $x31 false $x34))) - (let (($x33 (and true $x31))) - (let ((?x44 (ite (and $x33 (not (and true (= ethernet.dst_addr (_ bv1 48))))) (_ bv511 9) (ite $x33 (_ bv511 9) standard_metadata.egress_spec)))) - (let (($x39 (= ethernet.dst_addr (_ bv1 48)))) - (let (($x40 (and true $x39))) - (let (($x41 (and $x33 $x40))) - (let (($x56 (and $x34 (not (and true (= (ite $x41 (_ bv2 48) ethernet.dst_addr) (_ bv1 48))))))) - (let (($x53 (and true (= (ite $x41 (_ bv2 48) ethernet.dst_addr) (_ bv1 48))))) - (let (($x54 (and $x34 $x53))) - (let ((?x59 (ite $x54 (_ bv1 9) (ite $x56 (_ bv511 9) (ite $x34 (_ bv511 9) (ite $x41 (_ bv1 9) ?x44)))))) - (let (($x65 (= ?x59 (_ bv511 9)))) - (and (and (not $x65) $x64) (= (- 1) (- 1))))))))))))))))) + (let (($x40 (ite $x31 false $x34))) + (let ((?x38 (ite $x34 (_ bv511 9) (ite (and true $x31) (_ bv511 9) standard_metadata.egress_spec)))) + (let ((?x47 (ite (and true (not (and true (= ethernet.dst_addr (_ bv1 48))))) (_ bv511 9) ?x38))) + (let (($x42 (= ethernet.dst_addr (_ bv1 48)))) + (let (($x43 (and true $x42))) + (let (($x44 (and true $x43))) + (let ((?x52 (ite $x44 (_ bv1 9) ?x47))) + (let (($x54 (= ?x52 (_ bv511 9)))) + (and (and (not $x54) $x40) (= (- 1) (- 1)))))))))))))) (check-sat) ; @@ -82,38 +70,31 @@ (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun ethernet.dst_addr () (_ BitVec 48)) (assert - (let (($x72 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x72)))) + (let (($x61 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x61)))) (assert (let (($x31 (= standard_metadata.ingress_port (concat (_ bv0 8) (_ bv0 1))))) (let (($x33 (and true $x31))) - (let ((?x44 (ite (and $x33 (not (and true (= ethernet.dst_addr (_ bv1 48))))) (_ bv511 9) (ite $x33 (_ bv511 9) standard_metadata.egress_spec)))) - (let (($x39 (= ethernet.dst_addr (_ bv1 48)))) - (let (($x40 (and true $x39))) - (let (($x41 (and $x33 $x40))) (let (($x34 (and true (not $x31)))) - (let (($x56 (and $x34 (not (and true (= (ite $x41 (_ bv2 48) ethernet.dst_addr) (_ bv1 48))))))) - (let (($x53 (and true (= (ite $x41 (_ bv2 48) ethernet.dst_addr) (_ bv1 48))))) - (let (($x54 (and $x34 $x53))) - (let ((?x59 (ite $x54 (_ bv1 9) (ite $x56 (_ bv511 9) (ite $x34 (_ bv511 9) (ite $x41 (_ bv1 9) ?x44)))))) - (let (($x65 (= ?x59 (_ bv511 9)))) - (or $x65 (or (or false (= ?x59 (_ bv0 9))) (= ?x59 (_ bv1 9))))))))))))))))) + (let ((?x47 (ite (and true (not (and true (= ethernet.dst_addr (_ bv1 48))))) (_ bv511 9) (ite $x34 (_ bv511 9) (ite $x33 (_ bv511 9) standard_metadata.egress_spec))))) + (let (($x42 (= ethernet.dst_addr (_ bv1 48)))) + (let (($x43 (and true $x42))) + (let (($x44 (and true $x43))) + (let ((?x52 (ite $x44 (_ bv1 9) ?x47))) + (let (($x54 (= ?x52 (_ bv511 9)))) + (or $x54 (or (or false (= ?x52 (_ bv0 9))) (= ?x52 (_ bv1 9)))))))))))))) (assert - (let (($x39 (= ethernet.dst_addr (_ bv1 48)))) - (let (($x40 (and true $x39))) + (let (($x42 (= ethernet.dst_addr (_ bv1 48)))) + (let (($x43 (and true $x42))) + (let (($x44 (and true $x43))) + (let ((?x49 (ite $x44 0 (- 1)))) (let (($x31 (= standard_metadata.ingress_port (concat (_ bv0 8) (_ bv0 1))))) (let (($x33 (and true $x31))) - (let (($x41 (and $x33 $x40))) - (let ((?x50 (ite $x41 (_ bv2 48) ethernet.dst_addr))) - (let (($x53 (and true (= ?x50 (_ bv1 48))))) (let (($x34 (and true (not $x31)))) - (let (($x54 (and $x34 $x53))) - (let ((?x63 (ite $x31 (ite $x41 0 (- 1)) (ite $x54 0 (- 1))))) - (let (($x62 (ite $x31 $x33 $x34))) - (let ((?x44 (ite (and $x33 (not $x40)) (_ bv511 9) (ite $x33 (_ bv511 9) standard_metadata.egress_spec)))) - (let ((?x59 (ite $x54 (_ bv1 9) (ite (and $x34 (not $x53)) (_ bv511 9) (ite $x34 (_ bv511 9) (ite $x41 (_ bv1 9) ?x44)))))) - (let (($x65 (= ?x59 (_ bv511 9)))) - (and (and (not $x65) $x62) (= ?x63 (- 1)))))))))))))))))) + (let ((?x47 (ite (and true (not $x43)) (_ bv511 9) (ite $x34 (_ bv511 9) (ite $x33 (_ bv511 9) standard_metadata.egress_spec))))) + (let ((?x52 (ite $x44 (_ bv1 9) ?x47))) + (let (($x54 (= ?x52 (_ bv511 9)))) + (and (and (not $x54) true) (= ?x49 (- 1)))))))))))))) (check-sat) ; @@ -122,38 +103,31 @@ (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun ethernet.dst_addr () (_ BitVec 48)) (assert - (let (($x72 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x72)))) + (let (($x61 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x61)))) (assert (let (($x31 (= standard_metadata.ingress_port (concat (_ bv0 8) (_ bv0 1))))) (let (($x33 (and true $x31))) - (let ((?x44 (ite (and $x33 (not (and true (= ethernet.dst_addr (_ bv1 48))))) (_ bv511 9) (ite $x33 (_ bv511 9) standard_metadata.egress_spec)))) - (let (($x39 (= ethernet.dst_addr (_ bv1 48)))) - (let (($x40 (and true $x39))) - (let (($x41 (and $x33 $x40))) (let (($x34 (and true (not $x31)))) - (let (($x56 (and $x34 (not (and true (= (ite $x41 (_ bv2 48) ethernet.dst_addr) (_ bv1 48))))))) - (let (($x53 (and true (= (ite $x41 (_ bv2 48) ethernet.dst_addr) (_ bv1 48))))) - (let (($x54 (and $x34 $x53))) - (let ((?x59 (ite $x54 (_ bv1 9) (ite $x56 (_ bv511 9) (ite $x34 (_ bv511 9) (ite $x41 (_ bv1 9) ?x44)))))) - (let (($x65 (= ?x59 (_ bv511 9)))) - (or $x65 (or (or false (= ?x59 (_ bv0 9))) (= ?x59 (_ bv1 9))))))))))))))))) + (let ((?x47 (ite (and true (not (and true (= ethernet.dst_addr (_ bv1 48))))) (_ bv511 9) (ite $x34 (_ bv511 9) (ite $x33 (_ bv511 9) standard_metadata.egress_spec))))) + (let (($x42 (= ethernet.dst_addr (_ bv1 48)))) + (let (($x43 (and true $x42))) + (let (($x44 (and true $x43))) + (let ((?x52 (ite $x44 (_ bv1 9) ?x47))) + (let (($x54 (= ?x52 (_ bv511 9)))) + (or $x54 (or (or false (= ?x52 (_ bv0 9))) (= ?x52 (_ bv1 9)))))))))))))) (assert - (let (($x39 (= ethernet.dst_addr (_ bv1 48)))) - (let (($x40 (and true $x39))) + (let (($x42 (= ethernet.dst_addr (_ bv1 48)))) + (let (($x43 (and true $x42))) + (let (($x44 (and true $x43))) + (let ((?x49 (ite $x44 0 (- 1)))) (let (($x31 (= standard_metadata.ingress_port (concat (_ bv0 8) (_ bv0 1))))) (let (($x33 (and true $x31))) - (let (($x41 (and $x33 $x40))) - (let ((?x50 (ite $x41 (_ bv2 48) ethernet.dst_addr))) - (let (($x53 (and true (= ?x50 (_ bv1 48))))) (let (($x34 (and true (not $x31)))) - (let (($x54 (and $x34 $x53))) - (let ((?x63 (ite $x31 (ite $x41 0 (- 1)) (ite $x54 0 (- 1))))) - (let (($x62 (ite $x31 $x33 $x34))) - (let ((?x44 (ite (and $x33 (not $x40)) (_ bv511 9) (ite $x33 (_ bv511 9) standard_metadata.egress_spec)))) - (let ((?x59 (ite $x54 (_ bv1 9) (ite (and $x34 (not $x53)) (_ bv511 9) (ite $x34 (_ bv511 9) (ite $x41 (_ bv1 9) ?x44)))))) - (let (($x65 (= ?x59 (_ bv511 9)))) - (let (($x205 (and (not $x65) $x62))) - (and $x205 (= ?x63 0)))))))))))))))))) + (let ((?x47 (ite (and true (not $x43)) (_ bv511 9) (ite $x34 (_ bv511 9) (ite $x33 (_ bv511 9) standard_metadata.egress_spec))))) + (let ((?x52 (ite $x44 (_ bv1 9) ?x47))) + (let (($x54 (= ?x52 (_ bv511 9)))) + (let (($x159 (and (not $x54) true))) + (and $x159 (= ?x49 0)))))))))))))) (check-sat) diff --git a/p4_symbolic/symbolic/expected/conditional_sequence.smt2 b/p4_symbolic/symbolic/expected/conditional_sequence.smt2 index f845b91a..20d19229 100644 --- a/p4_symbolic/symbolic/expected/conditional_sequence.smt2 +++ b/p4_symbolic/symbolic/expected/conditional_sequence.smt2 @@ -4,20 +4,19 @@ (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert - (let (($x41 (and true (not (= h1.f1 (concat (_ bv0 7) (_ bv0 1))))))) (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) (let (($x38 (= h1.f1 ?x37))) - (let (($x3109 (ite $x38 false $x41))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3109) (= (- 1) (- 1)))))))))) + (let (($x44 (ite $x38 false (and true (not $x38))))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x44) (= (- 1) (- 1))))))))) (check-sat) ; @@ -25,25 +24,20 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x44 (not $x43))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1579 (and $x41 $x44))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x3092 (ite $x38 (ite $x43 false (and (and true $x38) $x44)) (ite $x43 false $x1579)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3092) (= (- 1) (- 1))))))))))))) + (let (($x45 (= h1.f2 ?x37))) + (let (($x50 (ite $x45 false (and true (not $x45))))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x50) (= (- 1) (- 1))))))))) (check-sat) ; @@ -51,34 +45,20 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f3 () (_ BitVec 8)) -(declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x47 (= h1.f3 ?x37))) - (let (($x48 (not $x47))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x44 (not $x43))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1579 (and $x41 $x44))) - (let (($x2329 (and $x1579 $x48))) - (let (($x3076 (ite $x43 (ite $x47 false (and (and $x41 $x43) $x48)) (ite $x47 false $x2329)))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x40 (and true $x38))) - (let (($x46 (and $x40 $x44))) - (let (($x815 (and $x46 $x48))) - (let (($x1562 (ite $x43 (ite $x47 false (and (and $x40 $x43) $x48)) (ite $x47 false $x815)))) - (let (($x3093 (ite $x38 $x1562 $x3076))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3093) (= (- 1) (- 1))))))))))))))))))))) + (let (($x51 (= h1.f3 ?x37))) + (let (($x56 (ite $x51 false (and true (not $x51))))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x56) (= (- 1) (- 1))))))))) (check-sat) ; @@ -86,41 +66,20 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f4 () (_ BitVec 8)) -(declare-fun h1.f3 () (_ BitVec 8)) -(declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x51 (= h1.f4 ?x37))) - (let (($x52 (not $x51))) - (let (($x47 (= h1.f3 ?x37))) - (let (($x48 (not $x47))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x44 (not $x43))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1579 (and $x41 $x44))) - (let (($x2329 (and $x1579 $x48))) - (let (($x2697 (and $x2329 $x52))) - (let (($x3062 (ite $x47 (ite $x51 false (and (and $x1579 $x47) $x52)) (ite $x51 false $x2697)))) - (let (($x2314 (ite $x47 (ite $x51 false (and (and (and $x41 $x43) $x47) $x52)) (ite $x51 false (and (and (and $x41 $x43) $x48) $x52))))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x40 (and true $x38))) - (let (($x46 (and $x40 $x44))) - (let (($x815 (and $x46 $x48))) - (let (($x1183 (and $x815 $x52))) - (let (($x1548 (ite $x47 (ite $x51 false (and (and $x46 $x47) $x52)) (ite $x51 false $x1183)))) - (let (($x800 (ite $x47 (ite $x51 false (and (and (and $x40 $x43) $x47) $x52)) (ite $x51 false (and (and (and $x40 $x43) $x48) $x52))))) - (let (($x3094 (ite $x38 (ite $x43 $x800 $x1548) (ite $x43 $x2314 $x3062)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3094) (= (- 1) (- 1))))))))))))))))))))))))))) + (let (($x57 (= h1.f4 ?x37))) + (let (($x62 (ite $x57 false (and true (not $x57))))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x62) (= (- 1) (- 1))))))))) (check-sat) ; @@ -128,50 +87,20 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f5 () (_ BitVec 8)) -(declare-fun h1.f4 () (_ BitVec 8)) -(declare-fun h1.f3 () (_ BitVec 8)) -(declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x55 (= h1.f5 ?x37))) - (let (($x56 (not $x55))) - (let (($x51 (= h1.f4 ?x37))) - (let (($x52 (not $x51))) - (let (($x47 (= h1.f3 ?x37))) - (let (($x48 (not $x47))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x44 (not $x43))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1579 (and $x41 $x44))) - (let (($x2329 (and $x1579 $x48))) - (let (($x2697 (and $x2329 $x52))) - (let (($x2875 (and $x2697 $x56))) - (let (($x3050 (ite $x51 (ite $x55 false (and (and $x2329 $x51) $x56)) (ite $x55 false $x2875)))) - (let (($x2684 (ite $x51 (ite $x55 false (and (and (and $x1579 $x47) $x51) $x56)) (ite $x55 false (and (and (and $x1579 $x47) $x52) $x56))))) - (let (($x2302 (ite $x51 (ite $x55 false (and (and (and (and $x41 $x43) $x48) $x51) $x56)) (ite $x55 false (and (and (and (and $x41 $x43) $x48) $x52) $x56))))) - (let (($x1936 (ite $x51 (ite $x55 false (and (and (and (and $x41 $x43) $x47) $x51) $x56)) (ite $x55 false (and (and (and (and $x41 $x43) $x47) $x52) $x56))))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x40 (and true $x38))) - (let (($x46 (and $x40 $x44))) - (let (($x815 (and $x46 $x48))) - (let (($x1183 (and $x815 $x52))) - (let (($x1361 (and $x1183 $x56))) - (let (($x1536 (ite $x51 (ite $x55 false (and (and $x815 $x51) $x56)) (ite $x55 false $x1361)))) - (let (($x1170 (ite $x51 (ite $x55 false (and (and (and $x46 $x47) $x51) $x56)) (ite $x55 false (and (and (and $x46 $x47) $x52) $x56))))) - (let (($x788 (ite $x51 (ite $x55 false (and (and (and (and $x40 $x43) $x48) $x51) $x56)) (ite $x55 false (and (and (and (and $x40 $x43) $x48) $x52) $x56))))) - (let (($x422 (ite $x51 (ite $x55 false (and (and (and (and $x40 $x43) $x47) $x51) $x56)) (ite $x55 false (and (and (and (and $x40 $x43) $x47) $x52) $x56))))) - (let (($x3095 (ite $x38 (ite $x43 (ite $x47 $x422 $x788) (ite $x47 $x1170 $x1536)) (ite $x43 (ite $x47 $x1936 $x2302) (ite $x47 $x2684 $x3050))))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3095) (= (- 1) (- 1))))))))))))))))))))))))))))))))))) + (let (($x63 (= h1.f5 ?x37))) + (let (($x68 (ite $x63 false (and true (not $x63))))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x68) (= (- 1) (- 1))))))))) (check-sat) ; @@ -179,75 +108,20 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f6 () (_ BitVec 8)) -(declare-fun h1.f5 () (_ BitVec 8)) -(declare-fun h1.f4 () (_ BitVec 8)) -(declare-fun h1.f3 () (_ BitVec 8)) -(declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x59 (= h1.f6 ?x37))) - (let (($x60 (not $x59))) - (let (($x55 (= h1.f5 ?x37))) - (let (($x56 (not $x55))) - (let (($x51 (= h1.f4 ?x37))) - (let (($x52 (not $x51))) - (let (($x47 (= h1.f3 ?x37))) - (let (($x48 (not $x47))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x44 (not $x43))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1579 (and $x41 $x44))) - (let (($x2329 (and $x1579 $x48))) - (let (($x2697 (and $x2329 $x52))) - (let (($x2875 (and $x2697 $x56))) - (let (($x2959 (and $x2875 $x60))) - (let (($x3040 (ite $x55 (ite $x59 false (and (and $x2697 $x55) $x60)) (ite $x59 false $x2959)))) - (let (($x2864 (ite $x55 (ite $x59 false (and (and (and $x2329 $x51) $x55) $x60)) (ite $x59 false (and (and (and $x2329 $x51) $x56) $x60))))) - (let (($x2674 (ite $x55 (ite $x59 false (and (and (and (and $x1579 $x47) $x52) $x55) $x60)) (ite $x59 false (and (and (and (and $x1579 $x47) $x52) $x56) $x60))))) - (let (($x2498 (ite $x55 (ite $x59 false (and (and (and (and $x1579 $x47) $x51) $x55) $x60)) (ite $x59 false (and (and (and (and $x1579 $x47) $x51) $x56) $x60))))) - (let (($x1578 (and $x41 $x43))) - (let (($x1581 (and $x1578 $x48))) - (let (($x1949 (and $x1581 $x52))) - (let (($x2127 (and $x1949 $x56))) - (let (($x2211 (and $x2127 $x60))) - (let (($x2292 (ite $x55 (ite $x59 false (and (and $x1949 $x55) $x60)) (ite $x59 false $x2211)))) - (let (($x2116 (ite $x55 (ite $x59 false (and (and (and $x1581 $x51) $x55) $x60)) (ite $x59 false (and (and (and $x1581 $x51) $x56) $x60))))) - (let (($x1926 (ite $x55 (ite $x59 false (and (and (and (and $x1578 $x47) $x52) $x55) $x60)) (ite $x59 false (and (and (and (and $x1578 $x47) $x52) $x56) $x60))))) - (let (($x1750 (ite $x55 (ite $x59 false (and (and (and (and $x1578 $x47) $x51) $x55) $x60)) (ite $x59 false (and (and (and (and $x1578 $x47) $x51) $x56) $x60))))) - (let (($x3079 (ite $x43 (ite $x47 (ite $x51 $x1750 $x1926) (ite $x51 $x2116 $x2292)) (ite $x47 (ite $x51 $x2498 $x2674) (ite $x51 $x2864 $x3040))))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x40 (and true $x38))) - (let (($x46 (and $x40 $x44))) - (let (($x815 (and $x46 $x48))) - (let (($x1183 (and $x815 $x52))) - (let (($x1361 (and $x1183 $x56))) - (let (($x1445 (and $x1361 $x60))) - (let (($x1526 (ite $x55 (ite $x59 false (and (and $x1183 $x55) $x60)) (ite $x59 false $x1445)))) - (let (($x1350 (ite $x55 (ite $x59 false (and (and (and $x815 $x51) $x55) $x60)) (ite $x59 false (and (and (and $x815 $x51) $x56) $x60))))) - (let (($x1160 (ite $x55 (ite $x59 false (and (and (and (and $x46 $x47) $x52) $x55) $x60)) (ite $x59 false (and (and (and (and $x46 $x47) $x52) $x56) $x60))))) - (let (($x984 (ite $x55 (ite $x59 false (and (and (and (and $x46 $x47) $x51) $x55) $x60)) (ite $x59 false (and (and (and (and $x46 $x47) $x51) $x56) $x60))))) - (let (($x45 (and $x40 $x43))) - (let (($x50 (and $x45 $x48))) - (let (($x435 (and $x50 $x52))) - (let (($x613 (and $x435 $x56))) - (let (($x697 (and $x613 $x60))) - (let (($x778 (ite $x55 (ite $x59 false (and (and $x435 $x55) $x60)) (ite $x59 false $x697)))) - (let (($x602 (ite $x55 (ite $x59 false (and (and (and $x50 $x51) $x55) $x60)) (ite $x59 false (and (and (and $x50 $x51) $x56) $x60))))) - (let (($x412 (ite $x55 (ite $x59 false (and (and (and (and $x45 $x47) $x52) $x55) $x60)) (ite $x59 false (and (and (and (and $x45 $x47) $x52) $x56) $x60))))) - (let (($x236 (ite $x55 (ite $x59 false (and (and (and (and $x45 $x47) $x51) $x55) $x60)) (ite $x59 false (and (and (and (and $x45 $x47) $x51) $x56) $x60))))) - (let (($x1565 (ite $x43 (ite $x47 (ite $x51 $x236 $x412) (ite $x51 $x602 $x778)) (ite $x47 (ite $x51 $x984 $x1160) (ite $x51 $x1350 $x1526))))) - (let (($x3096 (ite $x38 $x1565 $x3079))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3096) (= (- 1) (- 1))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) + (let (($x69 (= h1.f6 ?x37))) + (let (($x74 (ite $x69 false (and true (not $x69))))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x74) (= (- 1) (- 1))))))))) (check-sat) ; @@ -255,120 +129,20 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f7 () (_ BitVec 8)) -(declare-fun h1.f6 () (_ BitVec 8)) -(declare-fun h1.f5 () (_ BitVec 8)) -(declare-fun h1.f4 () (_ BitVec 8)) -(declare-fun h1.f3 () (_ BitVec 8)) -(declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x63 (= h1.f7 ?x37))) - (let (($x64 (not $x63))) - (let (($x59 (= h1.f6 ?x37))) - (let (($x60 (not $x59))) - (let (($x55 (= h1.f5 ?x37))) - (let (($x56 (not $x55))) - (let (($x51 (= h1.f4 ?x37))) - (let (($x52 (not $x51))) - (let (($x47 (= h1.f3 ?x37))) - (let (($x48 (not $x47))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x44 (not $x43))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1579 (and $x41 $x44))) - (let (($x2329 (and $x1579 $x48))) - (let (($x2697 (and $x2329 $x52))) - (let (($x2875 (and $x2697 $x56))) - (let (($x2959 (and $x2875 $x60))) - (let (($x2997 (and $x2959 $x64))) - (let (($x3032 (ite $x59 (ite $x63 false (and (and $x2875 $x59) $x64)) (ite $x63 false $x2997)))) - (let (($x2950 (ite $x59 (ite $x63 false (and (and (and $x2697 $x55) $x59) $x64)) (ite $x63 false (and (and (and $x2697 $x55) $x60) $x64))))) - (let (($x2856 (ite $x59 (ite $x63 false (and (and (and (and $x2329 $x51) $x56) $x59) $x64)) (ite $x63 false (and (and (and (and $x2329 $x51) $x56) $x60) $x64))))) - (let (($x2774 (ite $x59 (ite $x63 false (and (and (and (and $x2329 $x51) $x55) $x59) $x64)) (ite $x63 false (and (and (and (and $x2329 $x51) $x55) $x60) $x64))))) - (let (($x2328 (and $x1579 $x47))) - (let (($x2331 (and $x2328 $x52))) - (let (($x2509 (and $x2331 $x56))) - (let (($x2593 (and $x2509 $x60))) - (let (($x2631 (and $x2593 $x64))) - (let (($x2666 (ite $x59 (ite $x63 false (and (and $x2509 $x59) $x64)) (ite $x63 false $x2631)))) - (let (($x2584 (ite $x59 (ite $x63 false (and (and (and $x2331 $x55) $x59) $x64)) (ite $x63 false (and (and (and $x2331 $x55) $x60) $x64))))) - (let (($x2490 (ite $x59 (ite $x63 false (and (and (and (and $x2328 $x51) $x56) $x59) $x64)) (ite $x63 false (and (and (and (and $x2328 $x51) $x56) $x60) $x64))))) - (let (($x2408 (ite $x59 (ite $x63 false (and (and (and (and $x2328 $x51) $x55) $x59) $x64)) (ite $x63 false (and (and (and (and $x2328 $x51) $x55) $x60) $x64))))) - (let (($x3065 (ite $x47 (ite $x51 (ite $x55 $x2408 $x2490) (ite $x55 $x2584 $x2666)) (ite $x51 (ite $x55 $x2774 $x2856) (ite $x55 $x2950 $x3032))))) - (let (($x1578 (and $x41 $x43))) - (let (($x1581 (and $x1578 $x48))) - (let (($x1949 (and $x1581 $x52))) - (let (($x2127 (and $x1949 $x56))) - (let (($x2211 (and $x2127 $x60))) - (let (($x2249 (and $x2211 $x64))) - (let (($x2284 (ite $x59 (ite $x63 false (and (and $x2127 $x59) $x64)) (ite $x63 false $x2249)))) - (let (($x2202 (ite $x59 (ite $x63 false (and (and (and $x1949 $x55) $x59) $x64)) (ite $x63 false (and (and (and $x1949 $x55) $x60) $x64))))) - (let (($x2108 (ite $x59 (ite $x63 false (and (and (and (and $x1581 $x51) $x56) $x59) $x64)) (ite $x63 false (and (and (and (and $x1581 $x51) $x56) $x60) $x64))))) - (let (($x2026 (ite $x59 (ite $x63 false (and (and (and (and $x1581 $x51) $x55) $x59) $x64)) (ite $x63 false (and (and (and (and $x1581 $x51) $x55) $x60) $x64))))) - (let (($x1580 (and $x1578 $x47))) - (let (($x1583 (and $x1580 $x52))) - (let (($x1761 (and $x1583 $x56))) - (let (($x1845 (and $x1761 $x60))) - (let (($x1883 (and $x1845 $x64))) - (let (($x1918 (ite $x59 (ite $x63 false (and (and $x1761 $x59) $x64)) (ite $x63 false $x1883)))) - (let (($x1836 (ite $x59 (ite $x63 false (and (and (and $x1583 $x55) $x59) $x64)) (ite $x63 false (and (and (and $x1583 $x55) $x60) $x64))))) - (let (($x1742 (ite $x59 (ite $x63 false (and (and (and (and $x1580 $x51) $x56) $x59) $x64)) (ite $x63 false (and (and (and (and $x1580 $x51) $x56) $x60) $x64))))) - (let (($x1660 (ite $x59 (ite $x63 false (and (and (and (and $x1580 $x51) $x55) $x59) $x64)) (ite $x63 false (and (and (and (and $x1580 $x51) $x55) $x60) $x64))))) - (let (($x2317 (ite $x47 (ite $x51 (ite $x55 $x1660 $x1742) (ite $x55 $x1836 $x1918)) (ite $x51 (ite $x55 $x2026 $x2108) (ite $x55 $x2202 $x2284))))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x40 (and true $x38))) - (let (($x46 (and $x40 $x44))) - (let (($x815 (and $x46 $x48))) - (let (($x1183 (and $x815 $x52))) - (let (($x1361 (and $x1183 $x56))) - (let (($x1445 (and $x1361 $x60))) - (let (($x1483 (and $x1445 $x64))) - (let (($x1518 (ite $x59 (ite $x63 false (and (and $x1361 $x59) $x64)) (ite $x63 false $x1483)))) - (let (($x1436 (ite $x59 (ite $x63 false (and (and (and $x1183 $x55) $x59) $x64)) (ite $x63 false (and (and (and $x1183 $x55) $x60) $x64))))) - (let (($x1342 (ite $x59 (ite $x63 false (and (and (and (and $x815 $x51) $x56) $x59) $x64)) (ite $x63 false (and (and (and (and $x815 $x51) $x56) $x60) $x64))))) - (let (($x1260 (ite $x59 (ite $x63 false (and (and (and (and $x815 $x51) $x55) $x59) $x64)) (ite $x63 false (and (and (and (and $x815 $x51) $x55) $x60) $x64))))) - (let (($x814 (and $x46 $x47))) - (let (($x817 (and $x814 $x52))) - (let (($x995 (and $x817 $x56))) - (let (($x1079 (and $x995 $x60))) - (let (($x1117 (and $x1079 $x64))) - (let (($x1152 (ite $x59 (ite $x63 false (and (and $x995 $x59) $x64)) (ite $x63 false $x1117)))) - (let (($x1070 (ite $x59 (ite $x63 false (and (and (and $x817 $x55) $x59) $x64)) (ite $x63 false (and (and (and $x817 $x55) $x60) $x64))))) - (let (($x976 (ite $x59 (ite $x63 false (and (and (and (and $x814 $x51) $x56) $x59) $x64)) (ite $x63 false (and (and (and (and $x814 $x51) $x56) $x60) $x64))))) - (let (($x894 (ite $x59 (ite $x63 false (and (and (and (and $x814 $x51) $x55) $x59) $x64)) (ite $x63 false (and (and (and (and $x814 $x51) $x55) $x60) $x64))))) - (let (($x1551 (ite $x47 (ite $x51 (ite $x55 $x894 $x976) (ite $x55 $x1070 $x1152)) (ite $x51 (ite $x55 $x1260 $x1342) (ite $x55 $x1436 $x1518))))) - (let (($x45 (and $x40 $x43))) - (let (($x50 (and $x45 $x48))) - (let (($x435 (and $x50 $x52))) - (let (($x613 (and $x435 $x56))) - (let (($x697 (and $x613 $x60))) - (let (($x735 (and $x697 $x64))) - (let (($x770 (ite $x59 (ite $x63 false (and (and $x613 $x59) $x64)) (ite $x63 false $x735)))) - (let (($x688 (ite $x59 (ite $x63 false (and (and (and $x435 $x55) $x59) $x64)) (ite $x63 false (and (and (and $x435 $x55) $x60) $x64))))) - (let (($x594 (ite $x59 (ite $x63 false (and (and (and (and $x50 $x51) $x56) $x59) $x64)) (ite $x63 false (and (and (and (and $x50 $x51) $x56) $x60) $x64))))) - (let (($x512 (ite $x59 (ite $x63 false (and (and (and (and $x50 $x51) $x55) $x59) $x64)) (ite $x63 false (and (and (and (and $x50 $x51) $x55) $x60) $x64))))) - (let (($x49 (and $x45 $x47))) - (let (($x54 (and $x49 $x52))) - (let (($x247 (and $x54 $x56))) - (let (($x331 (and $x247 $x60))) - (let (($x369 (and $x331 $x64))) - (let (($x404 (ite $x59 (ite $x63 false (and (and $x247 $x59) $x64)) (ite $x63 false $x369)))) - (let (($x322 (ite $x59 (ite $x63 false (and (and (and $x54 $x55) $x59) $x64)) (ite $x63 false (and (and (and $x54 $x55) $x60) $x64))))) - (let (($x228 (ite $x59 (ite $x63 false (and (and (and (and $x49 $x51) $x56) $x59) $x64)) (ite $x63 false (and (and (and (and $x49 $x51) $x56) $x60) $x64))))) - (let (($x146 (ite $x59 (ite $x63 false (and (and (and (and $x49 $x51) $x55) $x59) $x64)) (ite $x63 false (and (and (and (and $x49 $x51) $x55) $x60) $x64))))) - (let (($x803 (ite $x47 (ite $x51 (ite $x55 $x146 $x228) (ite $x55 $x322 $x404)) (ite $x51 (ite $x55 $x512 $x594) (ite $x55 $x688 $x770))))) - (let (($x3097 (ite $x38 (ite $x43 $x803 $x1551) (ite $x43 $x2317 $x3065)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3097) (= (- 1) (- 1))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) + (let (($x75 (= h1.f7 ?x37))) + (let (($x80 (ite $x75 false (and true (not $x75))))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x80) (= (- 1) (- 1))))))))) (check-sat) ; @@ -376,207 +150,20 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f8 () (_ BitVec 8)) -(declare-fun h1.f7 () (_ BitVec 8)) -(declare-fun h1.f6 () (_ BitVec 8)) -(declare-fun h1.f5 () (_ BitVec 8)) -(declare-fun h1.f4 () (_ BitVec 8)) -(declare-fun h1.f3 () (_ BitVec 8)) -(declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x67 (= h1.f8 ?x37))) - (let (($x68 (not $x67))) - (let (($x63 (= h1.f7 ?x37))) - (let (($x64 (not $x63))) - (let (($x59 (= h1.f6 ?x37))) - (let (($x60 (not $x59))) - (let (($x55 (= h1.f5 ?x37))) - (let (($x56 (not $x55))) - (let (($x51 (= h1.f4 ?x37))) - (let (($x52 (not $x51))) - (let (($x47 (= h1.f3 ?x37))) - (let (($x48 (not $x47))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x44 (not $x43))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1579 (and $x41 $x44))) - (let (($x2329 (and $x1579 $x48))) - (let (($x2697 (and $x2329 $x52))) - (let (($x2875 (and $x2697 $x56))) - (let (($x2959 (and $x2875 $x60))) - (let (($x2997 (and $x2959 $x64))) - (let (($x3013 (and $x2997 $x68))) - (let (($x3026 (ite $x63 (ite $x67 false (and (and $x2959 $x63) $x68)) (ite $x67 false $x3013)))) - (let (($x2990 (ite $x63 (ite $x67 false (and (and (and $x2875 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x2875 $x59) $x64) $x68))))) - (let (($x2944 (ite $x63 (ite $x67 false (and (and (and (and $x2697 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x2697 $x55) $x60) $x64) $x68))))) - (let (($x2908 (ite $x63 (ite $x67 false (and (and (and (and $x2697 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x2697 $x55) $x59) $x64) $x68))))) - (let (($x2696 (and $x2329 $x51))) - (let (($x2699 (and $x2696 $x56))) - (let (($x2783 (and $x2699 $x60))) - (let (($x2821 (and $x2783 $x64))) - (let (($x2837 (and $x2821 $x68))) - (let (($x2850 (ite $x63 (ite $x67 false (and (and $x2783 $x63) $x68)) (ite $x67 false $x2837)))) - (let (($x2814 (ite $x63 (ite $x67 false (and (and (and $x2699 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x2699 $x59) $x64) $x68))))) - (let (($x2768 (ite $x63 (ite $x67 false (and (and (and (and $x2696 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x2696 $x55) $x60) $x64) $x68))))) - (let (($x2732 (ite $x63 (ite $x67 false (and (and (and (and $x2696 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x2696 $x55) $x59) $x64) $x68))))) - (let (($x3053 (ite $x51 (ite $x55 (ite $x59 $x2732 $x2768) (ite $x59 $x2814 $x2850)) (ite $x55 (ite $x59 $x2908 $x2944) (ite $x59 $x2990 $x3026))))) - (let (($x2328 (and $x1579 $x47))) - (let (($x2331 (and $x2328 $x52))) - (let (($x2509 (and $x2331 $x56))) - (let (($x2593 (and $x2509 $x60))) - (let (($x2631 (and $x2593 $x64))) - (let (($x2647 (and $x2631 $x68))) - (let (($x2660 (ite $x63 (ite $x67 false (and (and $x2593 $x63) $x68)) (ite $x67 false $x2647)))) - (let (($x2624 (ite $x63 (ite $x67 false (and (and (and $x2509 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x2509 $x59) $x64) $x68))))) - (let (($x2578 (ite $x63 (ite $x67 false (and (and (and (and $x2331 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x2331 $x55) $x60) $x64) $x68))))) - (let (($x2542 (ite $x63 (ite $x67 false (and (and (and (and $x2331 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x2331 $x55) $x59) $x64) $x68))))) - (let (($x2330 (and $x2328 $x51))) - (let (($x2333 (and $x2330 $x56))) - (let (($x2417 (and $x2333 $x60))) - (let (($x2455 (and $x2417 $x64))) - (let (($x2471 (and $x2455 $x68))) - (let (($x2484 (ite $x63 (ite $x67 false (and (and $x2417 $x63) $x68)) (ite $x67 false $x2471)))) - (let (($x2448 (ite $x63 (ite $x67 false (and (and (and $x2333 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x2333 $x59) $x64) $x68))))) - (let (($x2402 (ite $x63 (ite $x67 false (and (and (and (and $x2330 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x2330 $x55) $x60) $x64) $x68))))) - (let (($x2366 (ite $x63 (ite $x67 false (and (and (and (and $x2330 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x2330 $x55) $x59) $x64) $x68))))) - (let (($x2687 (ite $x51 (ite $x55 (ite $x59 $x2366 $x2402) (ite $x59 $x2448 $x2484)) (ite $x55 (ite $x59 $x2542 $x2578) (ite $x59 $x2624 $x2660))))) - (let (($x1578 (and $x41 $x43))) - (let (($x1581 (and $x1578 $x48))) - (let (($x1949 (and $x1581 $x52))) - (let (($x2127 (and $x1949 $x56))) - (let (($x2211 (and $x2127 $x60))) - (let (($x2249 (and $x2211 $x64))) - (let (($x2265 (and $x2249 $x68))) - (let (($x2278 (ite $x63 (ite $x67 false (and (and $x2211 $x63) $x68)) (ite $x67 false $x2265)))) - (let (($x2242 (ite $x63 (ite $x67 false (and (and (and $x2127 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x2127 $x59) $x64) $x68))))) - (let (($x2196 (ite $x63 (ite $x67 false (and (and (and (and $x1949 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x1949 $x55) $x60) $x64) $x68))))) - (let (($x2160 (ite $x63 (ite $x67 false (and (and (and (and $x1949 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x1949 $x55) $x59) $x64) $x68))))) - (let (($x1948 (and $x1581 $x51))) - (let (($x1951 (and $x1948 $x56))) - (let (($x2035 (and $x1951 $x60))) - (let (($x2073 (and $x2035 $x64))) - (let (($x2089 (and $x2073 $x68))) - (let (($x2102 (ite $x63 (ite $x67 false (and (and $x2035 $x63) $x68)) (ite $x67 false $x2089)))) - (let (($x2066 (ite $x63 (ite $x67 false (and (and (and $x1951 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x1951 $x59) $x64) $x68))))) - (let (($x2020 (ite $x63 (ite $x67 false (and (and (and (and $x1948 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x1948 $x55) $x60) $x64) $x68))))) - (let (($x1984 (ite $x63 (ite $x67 false (and (and (and (and $x1948 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x1948 $x55) $x59) $x64) $x68))))) - (let (($x2305 (ite $x51 (ite $x55 (ite $x59 $x1984 $x2020) (ite $x59 $x2066 $x2102)) (ite $x55 (ite $x59 $x2160 $x2196) (ite $x59 $x2242 $x2278))))) - (let (($x1580 (and $x1578 $x47))) - (let (($x1583 (and $x1580 $x52))) - (let (($x1761 (and $x1583 $x56))) - (let (($x1845 (and $x1761 $x60))) - (let (($x1883 (and $x1845 $x64))) - (let (($x1899 (and $x1883 $x68))) - (let (($x1912 (ite $x63 (ite $x67 false (and (and $x1845 $x63) $x68)) (ite $x67 false $x1899)))) - (let (($x1876 (ite $x63 (ite $x67 false (and (and (and $x1761 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x1761 $x59) $x64) $x68))))) - (let (($x1830 (ite $x63 (ite $x67 false (and (and (and (and $x1583 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x1583 $x55) $x60) $x64) $x68))))) - (let (($x1794 (ite $x63 (ite $x67 false (and (and (and (and $x1583 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x1583 $x55) $x59) $x64) $x68))))) - (let (($x1582 (and $x1580 $x51))) - (let (($x1585 (and $x1582 $x56))) - (let (($x1669 (and $x1585 $x60))) - (let (($x1707 (and $x1669 $x64))) - (let (($x1723 (and $x1707 $x68))) - (let (($x1736 (ite $x63 (ite $x67 false (and (and $x1669 $x63) $x68)) (ite $x67 false $x1723)))) - (let (($x1700 (ite $x63 (ite $x67 false (and (and (and $x1585 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x1585 $x59) $x64) $x68))))) - (let (($x1654 (ite $x63 (ite $x67 false (and (and (and (and $x1582 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x1582 $x55) $x60) $x64) $x68))))) - (let (($x1618 (ite $x63 (ite $x67 false (and (and (and (and $x1582 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x1582 $x55) $x59) $x64) $x68))))) - (let (($x1939 (ite $x51 (ite $x55 (ite $x59 $x1618 $x1654) (ite $x59 $x1700 $x1736)) (ite $x55 (ite $x59 $x1794 $x1830) (ite $x59 $x1876 $x1912))))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x40 (and true $x38))) - (let (($x46 (and $x40 $x44))) - (let (($x815 (and $x46 $x48))) - (let (($x1183 (and $x815 $x52))) - (let (($x1361 (and $x1183 $x56))) - (let (($x1445 (and $x1361 $x60))) - (let (($x1483 (and $x1445 $x64))) - (let (($x1499 (and $x1483 $x68))) - (let (($x1512 (ite $x63 (ite $x67 false (and (and $x1445 $x63) $x68)) (ite $x67 false $x1499)))) - (let (($x1476 (ite $x63 (ite $x67 false (and (and (and $x1361 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x1361 $x59) $x64) $x68))))) - (let (($x1430 (ite $x63 (ite $x67 false (and (and (and (and $x1183 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x1183 $x55) $x60) $x64) $x68))))) - (let (($x1394 (ite $x63 (ite $x67 false (and (and (and (and $x1183 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x1183 $x55) $x59) $x64) $x68))))) - (let (($x1182 (and $x815 $x51))) - (let (($x1185 (and $x1182 $x56))) - (let (($x1269 (and $x1185 $x60))) - (let (($x1307 (and $x1269 $x64))) - (let (($x1323 (and $x1307 $x68))) - (let (($x1336 (ite $x63 (ite $x67 false (and (and $x1269 $x63) $x68)) (ite $x67 false $x1323)))) - (let (($x1300 (ite $x63 (ite $x67 false (and (and (and $x1185 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x1185 $x59) $x64) $x68))))) - (let (($x1254 (ite $x63 (ite $x67 false (and (and (and (and $x1182 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x1182 $x55) $x60) $x64) $x68))))) - (let (($x1218 (ite $x63 (ite $x67 false (and (and (and (and $x1182 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x1182 $x55) $x59) $x64) $x68))))) - (let (($x1539 (ite $x51 (ite $x55 (ite $x59 $x1218 $x1254) (ite $x59 $x1300 $x1336)) (ite $x55 (ite $x59 $x1394 $x1430) (ite $x59 $x1476 $x1512))))) - (let (($x814 (and $x46 $x47))) - (let (($x817 (and $x814 $x52))) - (let (($x995 (and $x817 $x56))) - (let (($x1079 (and $x995 $x60))) - (let (($x1117 (and $x1079 $x64))) - (let (($x1133 (and $x1117 $x68))) - (let (($x1146 (ite $x63 (ite $x67 false (and (and $x1079 $x63) $x68)) (ite $x67 false $x1133)))) - (let (($x1110 (ite $x63 (ite $x67 false (and (and (and $x995 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x995 $x59) $x64) $x68))))) - (let (($x1064 (ite $x63 (ite $x67 false (and (and (and (and $x817 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x817 $x55) $x60) $x64) $x68))))) - (let (($x1028 (ite $x63 (ite $x67 false (and (and (and (and $x817 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x817 $x55) $x59) $x64) $x68))))) - (let (($x816 (and $x814 $x51))) - (let (($x819 (and $x816 $x56))) - (let (($x903 (and $x819 $x60))) - (let (($x941 (and $x903 $x64))) - (let (($x957 (and $x941 $x68))) - (let (($x970 (ite $x63 (ite $x67 false (and (and $x903 $x63) $x68)) (ite $x67 false $x957)))) - (let (($x934 (ite $x63 (ite $x67 false (and (and (and $x819 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x819 $x59) $x64) $x68))))) - (let (($x888 (ite $x63 (ite $x67 false (and (and (and (and $x816 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x816 $x55) $x60) $x64) $x68))))) - (let (($x852 (ite $x63 (ite $x67 false (and (and (and (and $x816 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x816 $x55) $x59) $x64) $x68))))) - (let (($x1173 (ite $x51 (ite $x55 (ite $x59 $x852 $x888) (ite $x59 $x934 $x970)) (ite $x55 (ite $x59 $x1028 $x1064) (ite $x59 $x1110 $x1146))))) - (let (($x45 (and $x40 $x43))) - (let (($x50 (and $x45 $x48))) - (let (($x435 (and $x50 $x52))) - (let (($x613 (and $x435 $x56))) - (let (($x697 (and $x613 $x60))) - (let (($x735 (and $x697 $x64))) - (let (($x751 (and $x735 $x68))) - (let (($x764 (ite $x63 (ite $x67 false (and (and $x697 $x63) $x68)) (ite $x67 false $x751)))) - (let (($x728 (ite $x63 (ite $x67 false (and (and (and $x613 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x613 $x59) $x64) $x68))))) - (let (($x682 (ite $x63 (ite $x67 false (and (and (and (and $x435 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x435 $x55) $x60) $x64) $x68))))) - (let (($x646 (ite $x63 (ite $x67 false (and (and (and (and $x435 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x435 $x55) $x59) $x64) $x68))))) - (let (($x434 (and $x50 $x51))) - (let (($x437 (and $x434 $x56))) - (let (($x521 (and $x437 $x60))) - (let (($x559 (and $x521 $x64))) - (let (($x575 (and $x559 $x68))) - (let (($x588 (ite $x63 (ite $x67 false (and (and $x521 $x63) $x68)) (ite $x67 false $x575)))) - (let (($x552 (ite $x63 (ite $x67 false (and (and (and $x437 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x437 $x59) $x64) $x68))))) - (let (($x506 (ite $x63 (ite $x67 false (and (and (and (and $x434 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x434 $x55) $x60) $x64) $x68))))) - (let (($x470 (ite $x63 (ite $x67 false (and (and (and (and $x434 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x434 $x55) $x59) $x64) $x68))))) - (let (($x791 (ite $x51 (ite $x55 (ite $x59 $x470 $x506) (ite $x59 $x552 $x588)) (ite $x55 (ite $x59 $x646 $x682) (ite $x59 $x728 $x764))))) - (let (($x49 (and $x45 $x47))) - (let (($x54 (and $x49 $x52))) - (let (($x247 (and $x54 $x56))) - (let (($x331 (and $x247 $x60))) - (let (($x369 (and $x331 $x64))) - (let (($x385 (and $x369 $x68))) - (let (($x398 (ite $x63 (ite $x67 false (and (and $x331 $x63) $x68)) (ite $x67 false $x385)))) - (let (($x362 (ite $x63 (ite $x67 false (and (and (and $x247 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x247 $x59) $x64) $x68))))) - (let (($x316 (ite $x63 (ite $x67 false (and (and (and (and $x54 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x54 $x55) $x60) $x64) $x68))))) - (let (($x280 (ite $x63 (ite $x67 false (and (and (and (and $x54 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x54 $x55) $x59) $x64) $x68))))) - (let (($x53 (and $x49 $x51))) - (let (($x58 (and $x53 $x56))) - (let (($x155 (and $x58 $x60))) - (let (($x193 (and $x155 $x64))) - (let (($x209 (and $x193 $x68))) - (let (($x222 (ite $x63 (ite $x67 false (and (and $x155 $x63) $x68)) (ite $x67 false $x209)))) - (let (($x186 (ite $x63 (ite $x67 false (and (and (and $x58 $x59) $x63) $x68)) (ite $x67 false (and (and (and $x58 $x59) $x64) $x68))))) - (let (($x140 (ite $x63 (ite $x67 false (and (and (and (and $x53 $x55) $x60) $x63) $x68)) (ite $x67 false (and (and (and (and $x53 $x55) $x60) $x64) $x68))))) - (let (($x104 (ite $x63 (ite $x67 false (and (and (and (and $x53 $x55) $x59) $x63) $x68)) (ite $x67 false (and (and (and (and $x53 $x55) $x59) $x64) $x68))))) - (let (($x425 (ite $x51 (ite $x55 (ite $x59 $x104 $x140) (ite $x59 $x186 $x222)) (ite $x55 (ite $x59 $x280 $x316) (ite $x59 $x362 $x398))))) - (let (($x3098 (ite $x38 (ite $x43 (ite $x47 $x425 $x791) (ite $x47 $x1173 $x1539)) (ite $x43 (ite $x47 $x1939 $x2305) (ite $x47 $x2687 $x3053))))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3098) (= (- 1) (- 1))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) + (let (($x81 (= h1.f8 ?x37))) + (let (($x86 (ite $x81 false (and true (not $x81))))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x86) (= (- 1) (- 1))))))))) (check-sat) ; @@ -585,20 +172,19 @@ (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) (let (($x38 (= h1.f1 ?x37))) - (let (($x40 (and true $x38))) - (let (($x3099 (ite $x38 $x40 false))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3099) (= (- 1) (- 1)))))))))) + (let (($x43 (ite $x38 (and true $x38) false))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x43) (= (- 1) (- 1))))))))) (check-sat) ; @@ -606,24 +192,20 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1578 (and $x41 $x43))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x3100 (ite $x38 (ite $x43 (and (and true $x38) $x43) false) (ite $x43 $x1578 false)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3100) (= (- 1) (- 1)))))))))))) + (let (($x45 (= h1.f2 ?x37))) + (let (($x49 (ite $x45 (and true $x45) false))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x49) (= (- 1) (- 1))))))))) (check-sat) ; @@ -631,33 +213,20 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f3 () (_ BitVec 8)) -(declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x47 (= h1.f3 ?x37))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x44 (not $x43))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1579 (and $x41 $x44))) - (let (($x2328 (and $x1579 $x47))) - (let (($x3083 (ite $x43 (ite $x47 (and (and $x41 $x43) $x47) false) (ite $x47 $x2328 false)))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x40 (and true $x38))) - (let (($x46 (and $x40 $x44))) - (let (($x814 (and $x46 $x47))) - (let (($x1569 (ite $x43 (ite $x47 (and (and $x40 $x43) $x47) false) (ite $x47 $x814 false)))) - (let (($x3101 (ite $x38 $x1569 $x3083))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3101) (= (- 1) (- 1)))))))))))))))))))) + (let (($x51 (= h1.f3 ?x37))) + (let (($x55 (ite $x51 (and true $x51) false))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x55) (= (- 1) (- 1))))))))) (check-sat) ; @@ -665,40 +234,20 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f4 () (_ BitVec 8)) -(declare-fun h1.f3 () (_ BitVec 8)) -(declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x51 (= h1.f4 ?x37))) - (let (($x47 (= h1.f3 ?x37))) - (let (($x48 (not $x47))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x44 (not $x43))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1579 (and $x41 $x44))) - (let (($x2329 (and $x1579 $x48))) - (let (($x2696 (and $x2329 $x51))) - (let (($x3068 (ite $x47 (ite $x51 (and (and $x1579 $x47) $x51) false) (ite $x51 $x2696 false)))) - (let (($x2320 (ite $x47 (ite $x51 (and (and (and $x41 $x43) $x47) $x51) false) (ite $x51 (and (and (and $x41 $x43) $x48) $x51) false)))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x40 (and true $x38))) - (let (($x46 (and $x40 $x44))) - (let (($x815 (and $x46 $x48))) - (let (($x1182 (and $x815 $x51))) - (let (($x1554 (ite $x47 (ite $x51 (and (and $x46 $x47) $x51) false) (ite $x51 $x1182 false)))) - (let (($x806 (ite $x47 (ite $x51 (and (and (and $x40 $x43) $x47) $x51) false) (ite $x51 (and (and (and $x40 $x43) $x48) $x51) false)))) - (let (($x3102 (ite $x38 (ite $x43 $x806 $x1554) (ite $x43 $x2320 $x3068)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3102) (= (- 1) (- 1)))))))))))))))))))))))))) + (let (($x57 (= h1.f4 ?x37))) + (let (($x61 (ite $x57 (and true $x57) false))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x61) (= (- 1) (- 1))))))))) (check-sat) ; @@ -706,49 +255,20 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f5 () (_ BitVec 8)) -(declare-fun h1.f4 () (_ BitVec 8)) -(declare-fun h1.f3 () (_ BitVec 8)) -(declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x55 (= h1.f5 ?x37))) - (let (($x51 (= h1.f4 ?x37))) - (let (($x52 (not $x51))) - (let (($x47 (= h1.f3 ?x37))) - (let (($x48 (not $x47))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x44 (not $x43))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1579 (and $x41 $x44))) - (let (($x2329 (and $x1579 $x48))) - (let (($x2697 (and $x2329 $x52))) - (let (($x2874 (and $x2697 $x55))) - (let (($x3055 (ite $x51 (ite $x55 (and (and $x2329 $x51) $x55) false) (ite $x55 $x2874 false)))) - (let (($x2689 (ite $x51 (ite $x55 (and (and (and $x1579 $x47) $x51) $x55) false) (ite $x55 (and (and (and $x1579 $x47) $x52) $x55) false)))) - (let (($x2307 (ite $x51 (ite $x55 (and (and (and (and $x41 $x43) $x48) $x51) $x55) false) (ite $x55 (and (and (and (and $x41 $x43) $x48) $x52) $x55) false)))) - (let (($x1941 (ite $x51 (ite $x55 (and (and (and (and $x41 $x43) $x47) $x51) $x55) false) (ite $x55 (and (and (and (and $x41 $x43) $x47) $x52) $x55) false)))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x40 (and true $x38))) - (let (($x46 (and $x40 $x44))) - (let (($x815 (and $x46 $x48))) - (let (($x1183 (and $x815 $x52))) - (let (($x1360 (and $x1183 $x55))) - (let (($x1541 (ite $x51 (ite $x55 (and (and $x815 $x51) $x55) false) (ite $x55 $x1360 false)))) - (let (($x1175 (ite $x51 (ite $x55 (and (and (and $x46 $x47) $x51) $x55) false) (ite $x55 (and (and (and $x46 $x47) $x52) $x55) false)))) - (let (($x793 (ite $x51 (ite $x55 (and (and (and (and $x40 $x43) $x48) $x51) $x55) false) (ite $x55 (and (and (and (and $x40 $x43) $x48) $x52) $x55) false)))) - (let (($x427 (ite $x51 (ite $x55 (and (and (and (and $x40 $x43) $x47) $x51) $x55) false) (ite $x55 (and (and (and (and $x40 $x43) $x47) $x52) $x55) false)))) - (let (($x3103 (ite $x38 (ite $x43 (ite $x47 $x427 $x793) (ite $x47 $x1175 $x1541)) (ite $x43 (ite $x47 $x1941 $x2307) (ite $x47 $x2689 $x3055))))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3103) (= (- 1) (- 1)))))))))))))))))))))))))))))))))) + (let (($x63 (= h1.f5 ?x37))) + (let (($x67 (ite $x63 (and true $x63) false))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x67) (= (- 1) (- 1))))))))) (check-sat) ; @@ -756,74 +276,20 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f6 () (_ BitVec 8)) -(declare-fun h1.f5 () (_ BitVec 8)) -(declare-fun h1.f4 () (_ BitVec 8)) -(declare-fun h1.f3 () (_ BitVec 8)) -(declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x59 (= h1.f6 ?x37))) - (let (($x55 (= h1.f5 ?x37))) - (let (($x56 (not $x55))) - (let (($x51 (= h1.f4 ?x37))) - (let (($x52 (not $x51))) - (let (($x47 (= h1.f3 ?x37))) - (let (($x48 (not $x47))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x44 (not $x43))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1579 (and $x41 $x44))) - (let (($x2329 (and $x1579 $x48))) - (let (($x2697 (and $x2329 $x52))) - (let (($x2875 (and $x2697 $x56))) - (let (($x2958 (and $x2875 $x59))) - (let (($x3044 (ite $x55 (ite $x59 (and (and $x2697 $x55) $x59) false) (ite $x59 $x2958 false)))) - (let (($x2868 (ite $x55 (ite $x59 (and (and (and $x2329 $x51) $x55) $x59) false) (ite $x59 (and (and (and $x2329 $x51) $x56) $x59) false)))) - (let (($x2678 (ite $x55 (ite $x59 (and (and (and (and $x1579 $x47) $x52) $x55) $x59) false) (ite $x59 (and (and (and (and $x1579 $x47) $x52) $x56) $x59) false)))) - (let (($x2502 (ite $x55 (ite $x59 (and (and (and (and $x1579 $x47) $x51) $x55) $x59) false) (ite $x59 (and (and (and (and $x1579 $x47) $x51) $x56) $x59) false)))) - (let (($x1578 (and $x41 $x43))) - (let (($x1581 (and $x1578 $x48))) - (let (($x1949 (and $x1581 $x52))) - (let (($x2127 (and $x1949 $x56))) - (let (($x2210 (and $x2127 $x59))) - (let (($x2296 (ite $x55 (ite $x59 (and (and $x1949 $x55) $x59) false) (ite $x59 $x2210 false)))) - (let (($x2120 (ite $x55 (ite $x59 (and (and (and $x1581 $x51) $x55) $x59) false) (ite $x59 (and (and (and $x1581 $x51) $x56) $x59) false)))) - (let (($x1930 (ite $x55 (ite $x59 (and (and (and (and $x1578 $x47) $x52) $x55) $x59) false) (ite $x59 (and (and (and (and $x1578 $x47) $x52) $x56) $x59) false)))) - (let (($x1754 (ite $x55 (ite $x59 (and (and (and (and $x1578 $x47) $x51) $x55) $x59) false) (ite $x59 (and (and (and (and $x1578 $x47) $x51) $x56) $x59) false)))) - (let (($x3086 (ite $x43 (ite $x47 (ite $x51 $x1754 $x1930) (ite $x51 $x2120 $x2296)) (ite $x47 (ite $x51 $x2502 $x2678) (ite $x51 $x2868 $x3044))))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x40 (and true $x38))) - (let (($x46 (and $x40 $x44))) - (let (($x815 (and $x46 $x48))) - (let (($x1183 (and $x815 $x52))) - (let (($x1361 (and $x1183 $x56))) - (let (($x1444 (and $x1361 $x59))) - (let (($x1530 (ite $x55 (ite $x59 (and (and $x1183 $x55) $x59) false) (ite $x59 $x1444 false)))) - (let (($x1354 (ite $x55 (ite $x59 (and (and (and $x815 $x51) $x55) $x59) false) (ite $x59 (and (and (and $x815 $x51) $x56) $x59) false)))) - (let (($x1164 (ite $x55 (ite $x59 (and (and (and (and $x46 $x47) $x52) $x55) $x59) false) (ite $x59 (and (and (and (and $x46 $x47) $x52) $x56) $x59) false)))) - (let (($x988 (ite $x55 (ite $x59 (and (and (and (and $x46 $x47) $x51) $x55) $x59) false) (ite $x59 (and (and (and (and $x46 $x47) $x51) $x56) $x59) false)))) - (let (($x45 (and $x40 $x43))) - (let (($x50 (and $x45 $x48))) - (let (($x435 (and $x50 $x52))) - (let (($x613 (and $x435 $x56))) - (let (($x696 (and $x613 $x59))) - (let (($x782 (ite $x55 (ite $x59 (and (and $x435 $x55) $x59) false) (ite $x59 $x696 false)))) - (let (($x606 (ite $x55 (ite $x59 (and (and (and $x50 $x51) $x55) $x59) false) (ite $x59 (and (and (and $x50 $x51) $x56) $x59) false)))) - (let (($x416 (ite $x55 (ite $x59 (and (and (and (and $x45 $x47) $x52) $x55) $x59) false) (ite $x59 (and (and (and (and $x45 $x47) $x52) $x56) $x59) false)))) - (let (($x240 (ite $x55 (ite $x59 (and (and (and (and $x45 $x47) $x51) $x55) $x59) false) (ite $x59 (and (and (and (and $x45 $x47) $x51) $x56) $x59) false)))) - (let (($x1572 (ite $x43 (ite $x47 (ite $x51 $x240 $x416) (ite $x51 $x606 $x782)) (ite $x47 (ite $x51 $x988 $x1164) (ite $x51 $x1354 $x1530))))) - (let (($x3104 (ite $x38 $x1572 $x3086))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3104) (= (- 1) (- 1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))) + (let (($x69 (= h1.f6 ?x37))) + (let (($x73 (ite $x69 (and true $x69) false))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x73) (= (- 1) (- 1))))))))) (check-sat) ; @@ -831,119 +297,20 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f7 () (_ BitVec 8)) -(declare-fun h1.f6 () (_ BitVec 8)) -(declare-fun h1.f5 () (_ BitVec 8)) -(declare-fun h1.f4 () (_ BitVec 8)) -(declare-fun h1.f3 () (_ BitVec 8)) -(declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x63 (= h1.f7 ?x37))) - (let (($x59 (= h1.f6 ?x37))) - (let (($x60 (not $x59))) - (let (($x55 (= h1.f5 ?x37))) - (let (($x56 (not $x55))) - (let (($x51 (= h1.f4 ?x37))) - (let (($x52 (not $x51))) - (let (($x47 (= h1.f3 ?x37))) - (let (($x48 (not $x47))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x44 (not $x43))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1579 (and $x41 $x44))) - (let (($x2329 (and $x1579 $x48))) - (let (($x2697 (and $x2329 $x52))) - (let (($x2875 (and $x2697 $x56))) - (let (($x2959 (and $x2875 $x60))) - (let (($x2996 (and $x2959 $x63))) - (let (($x3035 (ite $x59 (ite $x63 (and (and $x2875 $x59) $x63) false) (ite $x63 $x2996 false)))) - (let (($x2953 (ite $x59 (ite $x63 (and (and (and $x2697 $x55) $x59) $x63) false) (ite $x63 (and (and (and $x2697 $x55) $x60) $x63) false)))) - (let (($x2859 (ite $x59 (ite $x63 (and (and (and (and $x2329 $x51) $x56) $x59) $x63) false) (ite $x63 (and (and (and (and $x2329 $x51) $x56) $x60) $x63) false)))) - (let (($x2777 (ite $x59 (ite $x63 (and (and (and (and $x2329 $x51) $x55) $x59) $x63) false) (ite $x63 (and (and (and (and $x2329 $x51) $x55) $x60) $x63) false)))) - (let (($x2328 (and $x1579 $x47))) - (let (($x2331 (and $x2328 $x52))) - (let (($x2509 (and $x2331 $x56))) - (let (($x2593 (and $x2509 $x60))) - (let (($x2630 (and $x2593 $x63))) - (let (($x2669 (ite $x59 (ite $x63 (and (and $x2509 $x59) $x63) false) (ite $x63 $x2630 false)))) - (let (($x2587 (ite $x59 (ite $x63 (and (and (and $x2331 $x55) $x59) $x63) false) (ite $x63 (and (and (and $x2331 $x55) $x60) $x63) false)))) - (let (($x2493 (ite $x59 (ite $x63 (and (and (and (and $x2328 $x51) $x56) $x59) $x63) false) (ite $x63 (and (and (and (and $x2328 $x51) $x56) $x60) $x63) false)))) - (let (($x2411 (ite $x59 (ite $x63 (and (and (and (and $x2328 $x51) $x55) $x59) $x63) false) (ite $x63 (and (and (and (and $x2328 $x51) $x55) $x60) $x63) false)))) - (let (($x3071 (ite $x47 (ite $x51 (ite $x55 $x2411 $x2493) (ite $x55 $x2587 $x2669)) (ite $x51 (ite $x55 $x2777 $x2859) (ite $x55 $x2953 $x3035))))) - (let (($x1578 (and $x41 $x43))) - (let (($x1581 (and $x1578 $x48))) - (let (($x1949 (and $x1581 $x52))) - (let (($x2127 (and $x1949 $x56))) - (let (($x2211 (and $x2127 $x60))) - (let (($x2248 (and $x2211 $x63))) - (let (($x2287 (ite $x59 (ite $x63 (and (and $x2127 $x59) $x63) false) (ite $x63 $x2248 false)))) - (let (($x2205 (ite $x59 (ite $x63 (and (and (and $x1949 $x55) $x59) $x63) false) (ite $x63 (and (and (and $x1949 $x55) $x60) $x63) false)))) - (let (($x2111 (ite $x59 (ite $x63 (and (and (and (and $x1581 $x51) $x56) $x59) $x63) false) (ite $x63 (and (and (and (and $x1581 $x51) $x56) $x60) $x63) false)))) - (let (($x2029 (ite $x59 (ite $x63 (and (and (and (and $x1581 $x51) $x55) $x59) $x63) false) (ite $x63 (and (and (and (and $x1581 $x51) $x55) $x60) $x63) false)))) - (let (($x1580 (and $x1578 $x47))) - (let (($x1583 (and $x1580 $x52))) - (let (($x1761 (and $x1583 $x56))) - (let (($x1845 (and $x1761 $x60))) - (let (($x1882 (and $x1845 $x63))) - (let (($x1921 (ite $x59 (ite $x63 (and (and $x1761 $x59) $x63) false) (ite $x63 $x1882 false)))) - (let (($x1839 (ite $x59 (ite $x63 (and (and (and $x1583 $x55) $x59) $x63) false) (ite $x63 (and (and (and $x1583 $x55) $x60) $x63) false)))) - (let (($x1745 (ite $x59 (ite $x63 (and (and (and (and $x1580 $x51) $x56) $x59) $x63) false) (ite $x63 (and (and (and (and $x1580 $x51) $x56) $x60) $x63) false)))) - (let (($x1663 (ite $x59 (ite $x63 (and (and (and (and $x1580 $x51) $x55) $x59) $x63) false) (ite $x63 (and (and (and (and $x1580 $x51) $x55) $x60) $x63) false)))) - (let (($x2323 (ite $x47 (ite $x51 (ite $x55 $x1663 $x1745) (ite $x55 $x1839 $x1921)) (ite $x51 (ite $x55 $x2029 $x2111) (ite $x55 $x2205 $x2287))))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x40 (and true $x38))) - (let (($x46 (and $x40 $x44))) - (let (($x815 (and $x46 $x48))) - (let (($x1183 (and $x815 $x52))) - (let (($x1361 (and $x1183 $x56))) - (let (($x1445 (and $x1361 $x60))) - (let (($x1482 (and $x1445 $x63))) - (let (($x1521 (ite $x59 (ite $x63 (and (and $x1361 $x59) $x63) false) (ite $x63 $x1482 false)))) - (let (($x1439 (ite $x59 (ite $x63 (and (and (and $x1183 $x55) $x59) $x63) false) (ite $x63 (and (and (and $x1183 $x55) $x60) $x63) false)))) - (let (($x1345 (ite $x59 (ite $x63 (and (and (and (and $x815 $x51) $x56) $x59) $x63) false) (ite $x63 (and (and (and (and $x815 $x51) $x56) $x60) $x63) false)))) - (let (($x1263 (ite $x59 (ite $x63 (and (and (and (and $x815 $x51) $x55) $x59) $x63) false) (ite $x63 (and (and (and (and $x815 $x51) $x55) $x60) $x63) false)))) - (let (($x814 (and $x46 $x47))) - (let (($x817 (and $x814 $x52))) - (let (($x995 (and $x817 $x56))) - (let (($x1079 (and $x995 $x60))) - (let (($x1116 (and $x1079 $x63))) - (let (($x1155 (ite $x59 (ite $x63 (and (and $x995 $x59) $x63) false) (ite $x63 $x1116 false)))) - (let (($x1073 (ite $x59 (ite $x63 (and (and (and $x817 $x55) $x59) $x63) false) (ite $x63 (and (and (and $x817 $x55) $x60) $x63) false)))) - (let (($x979 (ite $x59 (ite $x63 (and (and (and (and $x814 $x51) $x56) $x59) $x63) false) (ite $x63 (and (and (and (and $x814 $x51) $x56) $x60) $x63) false)))) - (let (($x897 (ite $x59 (ite $x63 (and (and (and (and $x814 $x51) $x55) $x59) $x63) false) (ite $x63 (and (and (and (and $x814 $x51) $x55) $x60) $x63) false)))) - (let (($x1557 (ite $x47 (ite $x51 (ite $x55 $x897 $x979) (ite $x55 $x1073 $x1155)) (ite $x51 (ite $x55 $x1263 $x1345) (ite $x55 $x1439 $x1521))))) - (let (($x45 (and $x40 $x43))) - (let (($x50 (and $x45 $x48))) - (let (($x435 (and $x50 $x52))) - (let (($x613 (and $x435 $x56))) - (let (($x697 (and $x613 $x60))) - (let (($x734 (and $x697 $x63))) - (let (($x773 (ite $x59 (ite $x63 (and (and $x613 $x59) $x63) false) (ite $x63 $x734 false)))) - (let (($x691 (ite $x59 (ite $x63 (and (and (and $x435 $x55) $x59) $x63) false) (ite $x63 (and (and (and $x435 $x55) $x60) $x63) false)))) - (let (($x597 (ite $x59 (ite $x63 (and (and (and (and $x50 $x51) $x56) $x59) $x63) false) (ite $x63 (and (and (and (and $x50 $x51) $x56) $x60) $x63) false)))) - (let (($x515 (ite $x59 (ite $x63 (and (and (and (and $x50 $x51) $x55) $x59) $x63) false) (ite $x63 (and (and (and (and $x50 $x51) $x55) $x60) $x63) false)))) - (let (($x49 (and $x45 $x47))) - (let (($x54 (and $x49 $x52))) - (let (($x247 (and $x54 $x56))) - (let (($x331 (and $x247 $x60))) - (let (($x368 (and $x331 $x63))) - (let (($x407 (ite $x59 (ite $x63 (and (and $x247 $x59) $x63) false) (ite $x63 $x368 false)))) - (let (($x325 (ite $x59 (ite $x63 (and (and (and $x54 $x55) $x59) $x63) false) (ite $x63 (and (and (and $x54 $x55) $x60) $x63) false)))) - (let (($x231 (ite $x59 (ite $x63 (and (and (and (and $x49 $x51) $x56) $x59) $x63) false) (ite $x63 (and (and (and (and $x49 $x51) $x56) $x60) $x63) false)))) - (let (($x149 (ite $x59 (ite $x63 (and (and (and (and $x49 $x51) $x55) $x59) $x63) false) (ite $x63 (and (and (and (and $x49 $x51) $x55) $x60) $x63) false)))) - (let (($x809 (ite $x47 (ite $x51 (ite $x55 $x149 $x231) (ite $x55 $x325 $x407)) (ite $x51 (ite $x55 $x515 $x597) (ite $x55 $x691 $x773))))) - (let (($x3105 (ite $x38 (ite $x43 $x809 $x1557) (ite $x43 $x2323 $x3071)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3105) (= (- 1) (- 1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) + (let (($x75 (= h1.f7 ?x37))) + (let (($x79 (ite $x75 (and true $x75) false))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x79) (= (- 1) (- 1))))))))) (check-sat) ; @@ -951,206 +318,20 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.f8 () (_ BitVec 8)) -(declare-fun h1.f7 () (_ BitVec 8)) -(declare-fun h1.f6 () (_ BitVec 8)) -(declare-fun h1.f5 () (_ BitVec 8)) -(declare-fun h1.f4 () (_ BitVec 8)) -(declare-fun h1.f3 () (_ BitVec 8)) -(declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x67 (= h1.f8 ?x37))) - (let (($x63 (= h1.f7 ?x37))) - (let (($x64 (not $x63))) - (let (($x59 (= h1.f6 ?x37))) - (let (($x60 (not $x59))) - (let (($x55 (= h1.f5 ?x37))) - (let (($x56 (not $x55))) - (let (($x51 (= h1.f4 ?x37))) - (let (($x52 (not $x51))) - (let (($x47 (= h1.f3 ?x37))) - (let (($x48 (not $x47))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x44 (not $x43))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1579 (and $x41 $x44))) - (let (($x2329 (and $x1579 $x48))) - (let (($x2697 (and $x2329 $x52))) - (let (($x2875 (and $x2697 $x56))) - (let (($x2959 (and $x2875 $x60))) - (let (($x2997 (and $x2959 $x64))) - (let (($x3012 (and $x2997 $x67))) - (let (($x3028 (ite $x63 (ite $x67 (and (and $x2959 $x63) $x67) false) (ite $x67 $x3012 false)))) - (let (($x2992 (ite $x63 (ite $x67 (and (and (and $x2875 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x2875 $x59) $x64) $x67) false)))) - (let (($x2946 (ite $x63 (ite $x67 (and (and (and (and $x2697 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x2697 $x55) $x60) $x64) $x67) false)))) - (let (($x2910 (ite $x63 (ite $x67 (and (and (and (and $x2697 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x2697 $x55) $x59) $x64) $x67) false)))) - (let (($x2696 (and $x2329 $x51))) - (let (($x2699 (and $x2696 $x56))) - (let (($x2783 (and $x2699 $x60))) - (let (($x2821 (and $x2783 $x64))) - (let (($x2836 (and $x2821 $x67))) - (let (($x2852 (ite $x63 (ite $x67 (and (and $x2783 $x63) $x67) false) (ite $x67 $x2836 false)))) - (let (($x2816 (ite $x63 (ite $x67 (and (and (and $x2699 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x2699 $x59) $x64) $x67) false)))) - (let (($x2770 (ite $x63 (ite $x67 (and (and (and (and $x2696 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x2696 $x55) $x60) $x64) $x67) false)))) - (let (($x2734 (ite $x63 (ite $x67 (and (and (and (and $x2696 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x2696 $x55) $x59) $x64) $x67) false)))) - (let (($x3058 (ite $x51 (ite $x55 (ite $x59 $x2734 $x2770) (ite $x59 $x2816 $x2852)) (ite $x55 (ite $x59 $x2910 $x2946) (ite $x59 $x2992 $x3028))))) - (let (($x2328 (and $x1579 $x47))) - (let (($x2331 (and $x2328 $x52))) - (let (($x2509 (and $x2331 $x56))) - (let (($x2593 (and $x2509 $x60))) - (let (($x2631 (and $x2593 $x64))) - (let (($x2646 (and $x2631 $x67))) - (let (($x2662 (ite $x63 (ite $x67 (and (and $x2593 $x63) $x67) false) (ite $x67 $x2646 false)))) - (let (($x2626 (ite $x63 (ite $x67 (and (and (and $x2509 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x2509 $x59) $x64) $x67) false)))) - (let (($x2580 (ite $x63 (ite $x67 (and (and (and (and $x2331 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x2331 $x55) $x60) $x64) $x67) false)))) - (let (($x2544 (ite $x63 (ite $x67 (and (and (and (and $x2331 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x2331 $x55) $x59) $x64) $x67) false)))) - (let (($x2330 (and $x2328 $x51))) - (let (($x2333 (and $x2330 $x56))) - (let (($x2417 (and $x2333 $x60))) - (let (($x2455 (and $x2417 $x64))) - (let (($x2470 (and $x2455 $x67))) - (let (($x2486 (ite $x63 (ite $x67 (and (and $x2417 $x63) $x67) false) (ite $x67 $x2470 false)))) - (let (($x2450 (ite $x63 (ite $x67 (and (and (and $x2333 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x2333 $x59) $x64) $x67) false)))) - (let (($x2404 (ite $x63 (ite $x67 (and (and (and (and $x2330 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x2330 $x55) $x60) $x64) $x67) false)))) - (let (($x2368 (ite $x63 (ite $x67 (and (and (and (and $x2330 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x2330 $x55) $x59) $x64) $x67) false)))) - (let (($x2692 (ite $x51 (ite $x55 (ite $x59 $x2368 $x2404) (ite $x59 $x2450 $x2486)) (ite $x55 (ite $x59 $x2544 $x2580) (ite $x59 $x2626 $x2662))))) - (let (($x1578 (and $x41 $x43))) - (let (($x1581 (and $x1578 $x48))) - (let (($x1949 (and $x1581 $x52))) - (let (($x2127 (and $x1949 $x56))) - (let (($x2211 (and $x2127 $x60))) - (let (($x2249 (and $x2211 $x64))) - (let (($x2264 (and $x2249 $x67))) - (let (($x2280 (ite $x63 (ite $x67 (and (and $x2211 $x63) $x67) false) (ite $x67 $x2264 false)))) - (let (($x2244 (ite $x63 (ite $x67 (and (and (and $x2127 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x2127 $x59) $x64) $x67) false)))) - (let (($x2198 (ite $x63 (ite $x67 (and (and (and (and $x1949 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x1949 $x55) $x60) $x64) $x67) false)))) - (let (($x2162 (ite $x63 (ite $x67 (and (and (and (and $x1949 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x1949 $x55) $x59) $x64) $x67) false)))) - (let (($x1948 (and $x1581 $x51))) - (let (($x1951 (and $x1948 $x56))) - (let (($x2035 (and $x1951 $x60))) - (let (($x2073 (and $x2035 $x64))) - (let (($x2088 (and $x2073 $x67))) - (let (($x2104 (ite $x63 (ite $x67 (and (and $x2035 $x63) $x67) false) (ite $x67 $x2088 false)))) - (let (($x2068 (ite $x63 (ite $x67 (and (and (and $x1951 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x1951 $x59) $x64) $x67) false)))) - (let (($x2022 (ite $x63 (ite $x67 (and (and (and (and $x1948 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x1948 $x55) $x60) $x64) $x67) false)))) - (let (($x1986 (ite $x63 (ite $x67 (and (and (and (and $x1948 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x1948 $x55) $x59) $x64) $x67) false)))) - (let (($x2310 (ite $x51 (ite $x55 (ite $x59 $x1986 $x2022) (ite $x59 $x2068 $x2104)) (ite $x55 (ite $x59 $x2162 $x2198) (ite $x59 $x2244 $x2280))))) - (let (($x1580 (and $x1578 $x47))) - (let (($x1583 (and $x1580 $x52))) - (let (($x1761 (and $x1583 $x56))) - (let (($x1845 (and $x1761 $x60))) - (let (($x1883 (and $x1845 $x64))) - (let (($x1898 (and $x1883 $x67))) - (let (($x1914 (ite $x63 (ite $x67 (and (and $x1845 $x63) $x67) false) (ite $x67 $x1898 false)))) - (let (($x1878 (ite $x63 (ite $x67 (and (and (and $x1761 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x1761 $x59) $x64) $x67) false)))) - (let (($x1832 (ite $x63 (ite $x67 (and (and (and (and $x1583 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x1583 $x55) $x60) $x64) $x67) false)))) - (let (($x1796 (ite $x63 (ite $x67 (and (and (and (and $x1583 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x1583 $x55) $x59) $x64) $x67) false)))) - (let (($x1582 (and $x1580 $x51))) - (let (($x1585 (and $x1582 $x56))) - (let (($x1669 (and $x1585 $x60))) - (let (($x1707 (and $x1669 $x64))) - (let (($x1722 (and $x1707 $x67))) - (let (($x1738 (ite $x63 (ite $x67 (and (and $x1669 $x63) $x67) false) (ite $x67 $x1722 false)))) - (let (($x1702 (ite $x63 (ite $x67 (and (and (and $x1585 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x1585 $x59) $x64) $x67) false)))) - (let (($x1656 (ite $x63 (ite $x67 (and (and (and (and $x1582 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x1582 $x55) $x60) $x64) $x67) false)))) - (let (($x1620 (ite $x63 (ite $x67 (and (and (and (and $x1582 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x1582 $x55) $x59) $x64) $x67) false)))) - (let (($x1944 (ite $x51 (ite $x55 (ite $x59 $x1620 $x1656) (ite $x59 $x1702 $x1738)) (ite $x55 (ite $x59 $x1796 $x1832) (ite $x59 $x1878 $x1914))))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x40 (and true $x38))) - (let (($x46 (and $x40 $x44))) - (let (($x815 (and $x46 $x48))) - (let (($x1183 (and $x815 $x52))) - (let (($x1361 (and $x1183 $x56))) - (let (($x1445 (and $x1361 $x60))) - (let (($x1483 (and $x1445 $x64))) - (let (($x1498 (and $x1483 $x67))) - (let (($x1514 (ite $x63 (ite $x67 (and (and $x1445 $x63) $x67) false) (ite $x67 $x1498 false)))) - (let (($x1478 (ite $x63 (ite $x67 (and (and (and $x1361 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x1361 $x59) $x64) $x67) false)))) - (let (($x1432 (ite $x63 (ite $x67 (and (and (and (and $x1183 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x1183 $x55) $x60) $x64) $x67) false)))) - (let (($x1396 (ite $x63 (ite $x67 (and (and (and (and $x1183 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x1183 $x55) $x59) $x64) $x67) false)))) - (let (($x1182 (and $x815 $x51))) - (let (($x1185 (and $x1182 $x56))) - (let (($x1269 (and $x1185 $x60))) - (let (($x1307 (and $x1269 $x64))) - (let (($x1322 (and $x1307 $x67))) - (let (($x1338 (ite $x63 (ite $x67 (and (and $x1269 $x63) $x67) false) (ite $x67 $x1322 false)))) - (let (($x1302 (ite $x63 (ite $x67 (and (and (and $x1185 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x1185 $x59) $x64) $x67) false)))) - (let (($x1256 (ite $x63 (ite $x67 (and (and (and (and $x1182 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x1182 $x55) $x60) $x64) $x67) false)))) - (let (($x1220 (ite $x63 (ite $x67 (and (and (and (and $x1182 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x1182 $x55) $x59) $x64) $x67) false)))) - (let (($x1544 (ite $x51 (ite $x55 (ite $x59 $x1220 $x1256) (ite $x59 $x1302 $x1338)) (ite $x55 (ite $x59 $x1396 $x1432) (ite $x59 $x1478 $x1514))))) - (let (($x814 (and $x46 $x47))) - (let (($x817 (and $x814 $x52))) - (let (($x995 (and $x817 $x56))) - (let (($x1079 (and $x995 $x60))) - (let (($x1117 (and $x1079 $x64))) - (let (($x1132 (and $x1117 $x67))) - (let (($x1148 (ite $x63 (ite $x67 (and (and $x1079 $x63) $x67) false) (ite $x67 $x1132 false)))) - (let (($x1112 (ite $x63 (ite $x67 (and (and (and $x995 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x995 $x59) $x64) $x67) false)))) - (let (($x1066 (ite $x63 (ite $x67 (and (and (and (and $x817 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x817 $x55) $x60) $x64) $x67) false)))) - (let (($x1030 (ite $x63 (ite $x67 (and (and (and (and $x817 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x817 $x55) $x59) $x64) $x67) false)))) - (let (($x816 (and $x814 $x51))) - (let (($x819 (and $x816 $x56))) - (let (($x903 (and $x819 $x60))) - (let (($x941 (and $x903 $x64))) - (let (($x956 (and $x941 $x67))) - (let (($x972 (ite $x63 (ite $x67 (and (and $x903 $x63) $x67) false) (ite $x67 $x956 false)))) - (let (($x936 (ite $x63 (ite $x67 (and (and (and $x819 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x819 $x59) $x64) $x67) false)))) - (let (($x890 (ite $x63 (ite $x67 (and (and (and (and $x816 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x816 $x55) $x60) $x64) $x67) false)))) - (let (($x854 (ite $x63 (ite $x67 (and (and (and (and $x816 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x816 $x55) $x59) $x64) $x67) false)))) - (let (($x1178 (ite $x51 (ite $x55 (ite $x59 $x854 $x890) (ite $x59 $x936 $x972)) (ite $x55 (ite $x59 $x1030 $x1066) (ite $x59 $x1112 $x1148))))) - (let (($x45 (and $x40 $x43))) - (let (($x50 (and $x45 $x48))) - (let (($x435 (and $x50 $x52))) - (let (($x613 (and $x435 $x56))) - (let (($x697 (and $x613 $x60))) - (let (($x735 (and $x697 $x64))) - (let (($x750 (and $x735 $x67))) - (let (($x766 (ite $x63 (ite $x67 (and (and $x697 $x63) $x67) false) (ite $x67 $x750 false)))) - (let (($x730 (ite $x63 (ite $x67 (and (and (and $x613 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x613 $x59) $x64) $x67) false)))) - (let (($x684 (ite $x63 (ite $x67 (and (and (and (and $x435 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x435 $x55) $x60) $x64) $x67) false)))) - (let (($x648 (ite $x63 (ite $x67 (and (and (and (and $x435 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x435 $x55) $x59) $x64) $x67) false)))) - (let (($x434 (and $x50 $x51))) - (let (($x437 (and $x434 $x56))) - (let (($x521 (and $x437 $x60))) - (let (($x559 (and $x521 $x64))) - (let (($x574 (and $x559 $x67))) - (let (($x590 (ite $x63 (ite $x67 (and (and $x521 $x63) $x67) false) (ite $x67 $x574 false)))) - (let (($x554 (ite $x63 (ite $x67 (and (and (and $x437 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x437 $x59) $x64) $x67) false)))) - (let (($x508 (ite $x63 (ite $x67 (and (and (and (and $x434 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x434 $x55) $x60) $x64) $x67) false)))) - (let (($x472 (ite $x63 (ite $x67 (and (and (and (and $x434 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x434 $x55) $x59) $x64) $x67) false)))) - (let (($x796 (ite $x51 (ite $x55 (ite $x59 $x472 $x508) (ite $x59 $x554 $x590)) (ite $x55 (ite $x59 $x648 $x684) (ite $x59 $x730 $x766))))) - (let (($x49 (and $x45 $x47))) - (let (($x54 (and $x49 $x52))) - (let (($x247 (and $x54 $x56))) - (let (($x331 (and $x247 $x60))) - (let (($x369 (and $x331 $x64))) - (let (($x384 (and $x369 $x67))) - (let (($x400 (ite $x63 (ite $x67 (and (and $x331 $x63) $x67) false) (ite $x67 $x384 false)))) - (let (($x364 (ite $x63 (ite $x67 (and (and (and $x247 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x247 $x59) $x64) $x67) false)))) - (let (($x318 (ite $x63 (ite $x67 (and (and (and (and $x54 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x54 $x55) $x60) $x64) $x67) false)))) - (let (($x282 (ite $x63 (ite $x67 (and (and (and (and $x54 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x54 $x55) $x59) $x64) $x67) false)))) - (let (($x53 (and $x49 $x51))) - (let (($x58 (and $x53 $x56))) - (let (($x155 (and $x58 $x60))) - (let (($x193 (and $x155 $x64))) - (let (($x208 (and $x193 $x67))) - (let (($x224 (ite $x63 (ite $x67 (and (and $x155 $x63) $x67) false) (ite $x67 $x208 false)))) - (let (($x188 (ite $x63 (ite $x67 (and (and (and $x58 $x59) $x63) $x67) false) (ite $x67 (and (and (and $x58 $x59) $x64) $x67) false)))) - (let (($x142 (ite $x63 (ite $x67 (and (and (and (and $x53 $x55) $x60) $x63) $x67) false) (ite $x67 (and (and (and (and $x53 $x55) $x60) $x64) $x67) false)))) - (let (($x106 (ite $x63 (ite $x67 (and (and (and (and $x53 $x55) $x59) $x63) $x67) false) (ite $x67 (and (and (and (and $x53 $x55) $x59) $x64) $x67) false)))) - (let (($x430 (ite $x51 (ite $x55 (ite $x59 $x106 $x142) (ite $x59 $x188 $x224)) (ite $x55 (ite $x59 $x282 $x318) (ite $x59 $x364 $x400))))) - (let (($x3106 (ite $x38 (ite $x43 (ite $x47 $x430 $x796) (ite $x47 $x1178 $x1544)) (ite $x43 (ite $x47 $x1944 $x2310) (ite $x47 $x2692 $x3058))))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3106) (= (- 1) (- 1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) + (let (($x81 (= h1.f8 ?x37))) + (let (($x85 (ite $x81 (and true $x81) false))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (let (($x159 (not $x92))) + (and (and $x159 $x85) (= (- 1) (- 1))))))))) (check-sat) ; @@ -1158,581 +339,17 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.fr () (_ BitVec 8)) -(declare-fun h1.f8 () (_ BitVec 8)) -(declare-fun h1.f7 () (_ BitVec 8)) -(declare-fun h1.f6 () (_ BitVec 8)) -(declare-fun h1.f5 () (_ BitVec 8)) -(declare-fun h1.f4 () (_ BitVec 8)) -(declare-fun h1.f3 () (_ BitVec 8)) -(declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert - (let (($x72 (= h1.fr (_ bv255 8)))) - (let (($x73 (and true $x72))) - (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x67 (= h1.f8 ?x37))) - (let (($x68 (not $x67))) - (let (($x63 (= h1.f7 ?x37))) - (let (($x64 (not $x63))) - (let (($x59 (= h1.f6 ?x37))) - (let (($x60 (not $x59))) - (let (($x55 (= h1.f5 ?x37))) - (let (($x56 (not $x55))) - (let (($x51 (= h1.f4 ?x37))) - (let (($x52 (not $x51))) - (let (($x47 (= h1.f3 ?x37))) - (let (($x48 (not $x47))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x44 (not $x43))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1579 (and $x41 $x44))) - (let (($x2329 (and $x1579 $x48))) - (let (($x2697 (and $x2329 $x52))) - (let (($x2875 (and $x2697 $x56))) - (let (($x2959 (and $x2875 $x60))) - (let (($x2997 (and $x2959 $x64))) - (let (($x3013 (and $x2997 $x68))) - (let (($x3015 (and $x3013 $x73))) - (let ((?x3024 (ite $x67 (ite (and (and $x2997 $x67) $x73) 0 (- 1)) (ite $x3015 0 (- 1))))) - (let ((?x3010 (ite $x67 (ite (and (and (and $x2959 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2959 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2988 (ite $x67 (ite (and (and (and (and $x2875 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2875 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2974 (ite $x67 (ite (and (and (and (and $x2875 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2875 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x2874 (and $x2697 $x55))) - (let (($x2877 (and $x2874 $x60))) - (let (($x2915 (and $x2877 $x64))) - (let (($x2931 (and $x2915 $x68))) - (let (($x2933 (and $x2931 $x73))) - (let ((?x2942 (ite $x67 (ite (and (and $x2915 $x67) $x73) 0 (- 1)) (ite $x2933 0 (- 1))))) - (let ((?x2928 (ite $x67 (ite (and (and (and $x2877 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2877 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2906 (ite $x67 (ite (and (and (and (and $x2874 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2874 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2892 (ite $x67 (ite (and (and (and (and $x2874 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2874 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x3048 (ite $x55 (ite $x59 (ite $x63 ?x2892 ?x2906) (ite $x63 ?x2928 ?x2942)) (ite $x59 (ite $x63 ?x2974 ?x2988) (ite $x63 ?x3010 ?x3024))))) - (let (($x2696 (and $x2329 $x51))) - (let (($x2699 (and $x2696 $x56))) - (let (($x2783 (and $x2699 $x60))) - (let (($x2821 (and $x2783 $x64))) - (let (($x2837 (and $x2821 $x68))) - (let (($x2839 (and $x2837 $x73))) - (let ((?x2848 (ite $x67 (ite (and (and $x2821 $x67) $x73) 0 (- 1)) (ite $x2839 0 (- 1))))) - (let ((?x2834 (ite $x67 (ite (and (and (and $x2783 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2783 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2812 (ite $x67 (ite (and (and (and (and $x2699 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2699 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2798 (ite $x67 (ite (and (and (and (and $x2699 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2699 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x2698 (and $x2696 $x55))) - (let (($x2701 (and $x2698 $x60))) - (let (($x2739 (and $x2701 $x64))) - (let (($x2755 (and $x2739 $x68))) - (let (($x2757 (and $x2755 $x73))) - (let ((?x2766 (ite $x67 (ite (and (and $x2739 $x67) $x73) 0 (- 1)) (ite $x2757 0 (- 1))))) - (let ((?x2752 (ite $x67 (ite (and (and (and $x2701 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2701 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2730 (ite $x67 (ite (and (and (and (and $x2698 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2698 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2716 (ite $x67 (ite (and (and (and (and $x2698 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2698 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2872 (ite $x55 (ite $x59 (ite $x63 ?x2716 ?x2730) (ite $x63 ?x2752 ?x2766)) (ite $x59 (ite $x63 ?x2798 ?x2812) (ite $x63 ?x2834 ?x2848))))) - (let (($x2328 (and $x1579 $x47))) - (let (($x2331 (and $x2328 $x52))) - (let (($x2509 (and $x2331 $x56))) - (let (($x2593 (and $x2509 $x60))) - (let (($x2631 (and $x2593 $x64))) - (let (($x2647 (and $x2631 $x68))) - (let (($x2649 (and $x2647 $x73))) - (let ((?x2658 (ite $x67 (ite (and (and $x2631 $x67) $x73) 0 (- 1)) (ite $x2649 0 (- 1))))) - (let ((?x2644 (ite $x67 (ite (and (and (and $x2593 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2593 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2622 (ite $x67 (ite (and (and (and (and $x2509 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2509 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2608 (ite $x67 (ite (and (and (and (and $x2509 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2509 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x2508 (and $x2331 $x55))) - (let (($x2511 (and $x2508 $x60))) - (let (($x2549 (and $x2511 $x64))) - (let (($x2565 (and $x2549 $x68))) - (let (($x2567 (and $x2565 $x73))) - (let ((?x2576 (ite $x67 (ite (and (and $x2549 $x67) $x73) 0 (- 1)) (ite $x2567 0 (- 1))))) - (let ((?x2562 (ite $x67 (ite (and (and (and $x2511 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2511 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2540 (ite $x67 (ite (and (and (and (and $x2508 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2508 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2526 (ite $x67 (ite (and (and (and (and $x2508 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2508 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2682 (ite $x55 (ite $x59 (ite $x63 ?x2526 ?x2540) (ite $x63 ?x2562 ?x2576)) (ite $x59 (ite $x63 ?x2608 ?x2622) (ite $x63 ?x2644 ?x2658))))) - (let (($x2330 (and $x2328 $x51))) - (let (($x2333 (and $x2330 $x56))) - (let (($x2417 (and $x2333 $x60))) - (let (($x2455 (and $x2417 $x64))) - (let (($x2471 (and $x2455 $x68))) - (let (($x2473 (and $x2471 $x73))) - (let ((?x2482 (ite $x67 (ite (and (and $x2455 $x67) $x73) 0 (- 1)) (ite $x2473 0 (- 1))))) - (let ((?x2468 (ite $x67 (ite (and (and (and $x2417 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2417 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2446 (ite $x67 (ite (and (and (and (and $x2333 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2333 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2432 (ite $x67 (ite (and (and (and (and $x2333 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2333 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x2332 (and $x2330 $x55))) - (let (($x2335 (and $x2332 $x60))) - (let (($x2373 (and $x2335 $x64))) - (let (($x2389 (and $x2373 $x68))) - (let (($x2391 (and $x2389 $x73))) - (let ((?x2400 (ite $x67 (ite (and (and $x2373 $x67) $x73) 0 (- 1)) (ite $x2391 0 (- 1))))) - (let ((?x2386 (ite $x67 (ite (and (and (and $x2335 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2335 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2364 (ite $x67 (ite (and (and (and (and $x2332 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2332 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2350 (ite $x67 (ite (and (and (and (and $x2332 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2332 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2506 (ite $x55 (ite $x59 (ite $x63 ?x2350 ?x2364) (ite $x63 ?x2386 ?x2400)) (ite $x59 (ite $x63 ?x2432 ?x2446) (ite $x63 ?x2468 ?x2482))))) - (let (($x1578 (and $x41 $x43))) - (let (($x1581 (and $x1578 $x48))) - (let (($x1949 (and $x1581 $x52))) - (let (($x2127 (and $x1949 $x56))) - (let (($x2211 (and $x2127 $x60))) - (let (($x2249 (and $x2211 $x64))) - (let (($x2265 (and $x2249 $x68))) - (let (($x2267 (and $x2265 $x73))) - (let ((?x2276 (ite $x67 (ite (and (and $x2249 $x67) $x73) 0 (- 1)) (ite $x2267 0 (- 1))))) - (let ((?x2262 (ite $x67 (ite (and (and (and $x2211 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2211 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2240 (ite $x67 (ite (and (and (and (and $x2127 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2127 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2226 (ite $x67 (ite (and (and (and (and $x2127 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2127 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x2126 (and $x1949 $x55))) - (let (($x2129 (and $x2126 $x60))) - (let (($x2167 (and $x2129 $x64))) - (let (($x2183 (and $x2167 $x68))) - (let (($x2185 (and $x2183 $x73))) - (let ((?x2194 (ite $x67 (ite (and (and $x2167 $x67) $x73) 0 (- 1)) (ite $x2185 0 (- 1))))) - (let ((?x2180 (ite $x67 (ite (and (and (and $x2129 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2129 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2158 (ite $x67 (ite (and (and (and (and $x2126 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2126 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2144 (ite $x67 (ite (and (and (and (and $x2126 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2126 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2300 (ite $x55 (ite $x59 (ite $x63 ?x2144 ?x2158) (ite $x63 ?x2180 ?x2194)) (ite $x59 (ite $x63 ?x2226 ?x2240) (ite $x63 ?x2262 ?x2276))))) - (let (($x1948 (and $x1581 $x51))) - (let (($x1951 (and $x1948 $x56))) - (let (($x2035 (and $x1951 $x60))) - (let (($x2073 (and $x2035 $x64))) - (let (($x2089 (and $x2073 $x68))) - (let (($x2091 (and $x2089 $x73))) - (let ((?x2100 (ite $x67 (ite (and (and $x2073 $x67) $x73) 0 (- 1)) (ite $x2091 0 (- 1))))) - (let ((?x2086 (ite $x67 (ite (and (and (and $x2035 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2035 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2064 (ite $x67 (ite (and (and (and (and $x1951 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1951 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2050 (ite $x67 (ite (and (and (and (and $x1951 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1951 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x1950 (and $x1948 $x55))) - (let (($x1953 (and $x1950 $x60))) - (let (($x1991 (and $x1953 $x64))) - (let (($x2007 (and $x1991 $x68))) - (let (($x2009 (and $x2007 $x73))) - (let ((?x2018 (ite $x67 (ite (and (and $x1991 $x67) $x73) 0 (- 1)) (ite $x2009 0 (- 1))))) - (let ((?x2004 (ite $x67 (ite (and (and (and $x1953 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1953 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1982 (ite $x67 (ite (and (and (and (and $x1950 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1950 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1968 (ite $x67 (ite (and (and (and (and $x1950 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1950 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2124 (ite $x55 (ite $x59 (ite $x63 ?x1968 ?x1982) (ite $x63 ?x2004 ?x2018)) (ite $x59 (ite $x63 ?x2050 ?x2064) (ite $x63 ?x2086 ?x2100))))) - (let (($x1580 (and $x1578 $x47))) - (let (($x1583 (and $x1580 $x52))) - (let (($x1761 (and $x1583 $x56))) - (let (($x1845 (and $x1761 $x60))) - (let (($x1883 (and $x1845 $x64))) - (let (($x1899 (and $x1883 $x68))) - (let (($x1901 (and $x1899 $x73))) - (let ((?x1910 (ite $x67 (ite (and (and $x1883 $x67) $x73) 0 (- 1)) (ite $x1901 0 (- 1))))) - (let ((?x1896 (ite $x67 (ite (and (and (and $x1845 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1845 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1874 (ite $x67 (ite (and (and (and (and $x1761 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1761 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1860 (ite $x67 (ite (and (and (and (and $x1761 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1761 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x1760 (and $x1583 $x55))) - (let (($x1763 (and $x1760 $x60))) - (let (($x1801 (and $x1763 $x64))) - (let (($x1817 (and $x1801 $x68))) - (let (($x1819 (and $x1817 $x73))) - (let ((?x1828 (ite $x67 (ite (and (and $x1801 $x67) $x73) 0 (- 1)) (ite $x1819 0 (- 1))))) - (let ((?x1814 (ite $x67 (ite (and (and (and $x1763 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1763 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1792 (ite $x67 (ite (and (and (and (and $x1760 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1760 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1778 (ite $x67 (ite (and (and (and (and $x1760 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1760 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1934 (ite $x55 (ite $x59 (ite $x63 ?x1778 ?x1792) (ite $x63 ?x1814 ?x1828)) (ite $x59 (ite $x63 ?x1860 ?x1874) (ite $x63 ?x1896 ?x1910))))) - (let (($x1582 (and $x1580 $x51))) - (let (($x1585 (and $x1582 $x56))) - (let (($x1669 (and $x1585 $x60))) - (let (($x1707 (and $x1669 $x64))) - (let (($x1723 (and $x1707 $x68))) - (let (($x1725 (and $x1723 $x73))) - (let ((?x1734 (ite $x67 (ite (and (and $x1707 $x67) $x73) 0 (- 1)) (ite $x1725 0 (- 1))))) - (let ((?x1720 (ite $x67 (ite (and (and (and $x1669 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1669 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1698 (ite $x67 (ite (and (and (and (and $x1585 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1585 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1684 (ite $x67 (ite (and (and (and (and $x1585 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1585 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x1584 (and $x1582 $x55))) - (let (($x1587 (and $x1584 $x60))) - (let (($x1625 (and $x1587 $x64))) - (let (($x1641 (and $x1625 $x68))) - (let (($x1643 (and $x1641 $x73))) - (let ((?x1652 (ite $x67 (ite (and (and $x1625 $x67) $x73) 0 (- 1)) (ite $x1643 0 (- 1))))) - (let ((?x1638 (ite $x67 (ite (and (and (and $x1587 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1587 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1616 (ite $x67 (ite (and (and (and (and $x1584 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1584 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1602 (ite $x67 (ite (and (and (and (and $x1584 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1584 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1758 (ite $x55 (ite $x59 (ite $x63 ?x1602 ?x1616) (ite $x63 ?x1638 ?x1652)) (ite $x59 (ite $x63 ?x1684 ?x1698) (ite $x63 ?x1720 ?x1734))))) - (let ((?x3090 (ite $x43 (ite $x47 (ite $x51 ?x1758 ?x1934) (ite $x51 ?x2124 ?x2300)) (ite $x47 (ite $x51 ?x2506 ?x2682) (ite $x51 ?x2872 ?x3048))))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x40 (and true $x38))) - (let (($x46 (and $x40 $x44))) - (let (($x815 (and $x46 $x48))) - (let (($x1183 (and $x815 $x52))) - (let (($x1361 (and $x1183 $x56))) - (let (($x1445 (and $x1361 $x60))) - (let (($x1483 (and $x1445 $x64))) - (let (($x1499 (and $x1483 $x68))) - (let (($x1501 (and $x1499 $x73))) - (let ((?x1510 (ite $x67 (ite (and (and $x1483 $x67) $x73) 0 (- 1)) (ite $x1501 0 (- 1))))) - (let ((?x1496 (ite $x67 (ite (and (and (and $x1445 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1445 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1474 (ite $x67 (ite (and (and (and (and $x1361 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1361 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1460 (ite $x67 (ite (and (and (and (and $x1361 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1361 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x1360 (and $x1183 $x55))) - (let (($x1363 (and $x1360 $x60))) - (let (($x1401 (and $x1363 $x64))) - (let (($x1417 (and $x1401 $x68))) - (let (($x1419 (and $x1417 $x73))) - (let ((?x1428 (ite $x67 (ite (and (and $x1401 $x67) $x73) 0 (- 1)) (ite $x1419 0 (- 1))))) - (let ((?x1414 (ite $x67 (ite (and (and (and $x1363 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1363 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1392 (ite $x67 (ite (and (and (and (and $x1360 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1360 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1378 (ite $x67 (ite (and (and (and (and $x1360 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1360 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1534 (ite $x55 (ite $x59 (ite $x63 ?x1378 ?x1392) (ite $x63 ?x1414 ?x1428)) (ite $x59 (ite $x63 ?x1460 ?x1474) (ite $x63 ?x1496 ?x1510))))) - (let (($x1182 (and $x815 $x51))) - (let (($x1185 (and $x1182 $x56))) - (let (($x1269 (and $x1185 $x60))) - (let (($x1307 (and $x1269 $x64))) - (let (($x1323 (and $x1307 $x68))) - (let (($x1325 (and $x1323 $x73))) - (let ((?x1334 (ite $x67 (ite (and (and $x1307 $x67) $x73) 0 (- 1)) (ite $x1325 0 (- 1))))) - (let ((?x1320 (ite $x67 (ite (and (and (and $x1269 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1269 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1298 (ite $x67 (ite (and (and (and (and $x1185 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1185 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1284 (ite $x67 (ite (and (and (and (and $x1185 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1185 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x1184 (and $x1182 $x55))) - (let (($x1187 (and $x1184 $x60))) - (let (($x1225 (and $x1187 $x64))) - (let (($x1241 (and $x1225 $x68))) - (let (($x1243 (and $x1241 $x73))) - (let ((?x1252 (ite $x67 (ite (and (and $x1225 $x67) $x73) 0 (- 1)) (ite $x1243 0 (- 1))))) - (let ((?x1238 (ite $x67 (ite (and (and (and $x1187 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1187 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1216 (ite $x67 (ite (and (and (and (and $x1184 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1184 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1202 (ite $x67 (ite (and (and (and (and $x1184 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1184 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1358 (ite $x55 (ite $x59 (ite $x63 ?x1202 ?x1216) (ite $x63 ?x1238 ?x1252)) (ite $x59 (ite $x63 ?x1284 ?x1298) (ite $x63 ?x1320 ?x1334))))) - (let (($x814 (and $x46 $x47))) - (let (($x817 (and $x814 $x52))) - (let (($x995 (and $x817 $x56))) - (let (($x1079 (and $x995 $x60))) - (let (($x1117 (and $x1079 $x64))) - (let (($x1133 (and $x1117 $x68))) - (let (($x1135 (and $x1133 $x73))) - (let ((?x1144 (ite $x67 (ite (and (and $x1117 $x67) $x73) 0 (- 1)) (ite $x1135 0 (- 1))))) - (let ((?x1130 (ite $x67 (ite (and (and (and $x1079 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1079 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1108 (ite $x67 (ite (and (and (and (and $x995 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x995 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1094 (ite $x67 (ite (and (and (and (and $x995 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x995 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x994 (and $x817 $x55))) - (let (($x997 (and $x994 $x60))) - (let (($x1035 (and $x997 $x64))) - (let (($x1051 (and $x1035 $x68))) - (let (($x1053 (and $x1051 $x73))) - (let ((?x1062 (ite $x67 (ite (and (and $x1035 $x67) $x73) 0 (- 1)) (ite $x1053 0 (- 1))))) - (let ((?x1048 (ite $x67 (ite (and (and (and $x997 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x997 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1026 (ite $x67 (ite (and (and (and (and $x994 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x994 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1012 (ite $x67 (ite (and (and (and (and $x994 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x994 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1168 (ite $x55 (ite $x59 (ite $x63 ?x1012 ?x1026) (ite $x63 ?x1048 ?x1062)) (ite $x59 (ite $x63 ?x1094 ?x1108) (ite $x63 ?x1130 ?x1144))))) - (let (($x816 (and $x814 $x51))) - (let (($x819 (and $x816 $x56))) - (let (($x903 (and $x819 $x60))) - (let (($x941 (and $x903 $x64))) - (let (($x957 (and $x941 $x68))) - (let (($x959 (and $x957 $x73))) - (let ((?x968 (ite $x67 (ite (and (and $x941 $x67) $x73) 0 (- 1)) (ite $x959 0 (- 1))))) - (let ((?x954 (ite $x67 (ite (and (and (and $x903 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x903 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x932 (ite $x67 (ite (and (and (and (and $x819 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x819 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x918 (ite $x67 (ite (and (and (and (and $x819 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x819 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x818 (and $x816 $x55))) - (let (($x821 (and $x818 $x60))) - (let (($x859 (and $x821 $x64))) - (let (($x875 (and $x859 $x68))) - (let (($x877 (and $x875 $x73))) - (let ((?x886 (ite $x67 (ite (and (and $x859 $x67) $x73) 0 (- 1)) (ite $x877 0 (- 1))))) - (let ((?x872 (ite $x67 (ite (and (and (and $x821 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x821 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x850 (ite $x67 (ite (and (and (and (and $x818 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x818 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x836 (ite $x67 (ite (and (and (and (and $x818 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x818 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x992 (ite $x55 (ite $x59 (ite $x63 ?x836 ?x850) (ite $x63 ?x872 ?x886)) (ite $x59 (ite $x63 ?x918 ?x932) (ite $x63 ?x954 ?x968))))) - (let (($x45 (and $x40 $x43))) - (let (($x50 (and $x45 $x48))) - (let (($x435 (and $x50 $x52))) - (let (($x613 (and $x435 $x56))) - (let (($x697 (and $x613 $x60))) - (let (($x735 (and $x697 $x64))) - (let (($x751 (and $x735 $x68))) - (let (($x753 (and $x751 $x73))) - (let ((?x762 (ite $x67 (ite (and (and $x735 $x67) $x73) 0 (- 1)) (ite $x753 0 (- 1))))) - (let ((?x748 (ite $x67 (ite (and (and (and $x697 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x697 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x726 (ite $x67 (ite (and (and (and (and $x613 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x613 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x712 (ite $x67 (ite (and (and (and (and $x613 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x613 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x612 (and $x435 $x55))) - (let (($x615 (and $x612 $x60))) - (let (($x653 (and $x615 $x64))) - (let (($x669 (and $x653 $x68))) - (let (($x671 (and $x669 $x73))) - (let ((?x680 (ite $x67 (ite (and (and $x653 $x67) $x73) 0 (- 1)) (ite $x671 0 (- 1))))) - (let ((?x666 (ite $x67 (ite (and (and (and $x615 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x615 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x644 (ite $x67 (ite (and (and (and (and $x612 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x612 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x630 (ite $x67 (ite (and (and (and (and $x612 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x612 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x786 (ite $x55 (ite $x59 (ite $x63 ?x630 ?x644) (ite $x63 ?x666 ?x680)) (ite $x59 (ite $x63 ?x712 ?x726) (ite $x63 ?x748 ?x762))))) - (let (($x434 (and $x50 $x51))) - (let (($x437 (and $x434 $x56))) - (let (($x521 (and $x437 $x60))) - (let (($x559 (and $x521 $x64))) - (let (($x575 (and $x559 $x68))) - (let (($x577 (and $x575 $x73))) - (let ((?x586 (ite $x67 (ite (and (and $x559 $x67) $x73) 0 (- 1)) (ite $x577 0 (- 1))))) - (let ((?x572 (ite $x67 (ite (and (and (and $x521 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x521 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x550 (ite $x67 (ite (and (and (and (and $x437 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x437 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x536 (ite $x67 (ite (and (and (and (and $x437 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x437 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x436 (and $x434 $x55))) - (let (($x439 (and $x436 $x60))) - (let (($x477 (and $x439 $x64))) - (let (($x493 (and $x477 $x68))) - (let (($x495 (and $x493 $x73))) - (let ((?x504 (ite $x67 (ite (and (and $x477 $x67) $x73) 0 (- 1)) (ite $x495 0 (- 1))))) - (let ((?x490 (ite $x67 (ite (and (and (and $x439 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x439 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x468 (ite $x67 (ite (and (and (and (and $x436 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x436 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x454 (ite $x67 (ite (and (and (and (and $x436 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x436 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x610 (ite $x55 (ite $x59 (ite $x63 ?x454 ?x468) (ite $x63 ?x490 ?x504)) (ite $x59 (ite $x63 ?x536 ?x550) (ite $x63 ?x572 ?x586))))) - (let (($x49 (and $x45 $x47))) - (let (($x54 (and $x49 $x52))) - (let (($x247 (and $x54 $x56))) - (let (($x331 (and $x247 $x60))) - (let (($x369 (and $x331 $x64))) - (let (($x385 (and $x369 $x68))) - (let (($x387 (and $x385 $x73))) - (let ((?x396 (ite $x67 (ite (and (and $x369 $x67) $x73) 0 (- 1)) (ite $x387 0 (- 1))))) - (let ((?x382 (ite $x67 (ite (and (and (and $x331 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x331 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x360 (ite $x67 (ite (and (and (and (and $x247 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x247 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x346 (ite $x67 (ite (and (and (and (and $x247 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x247 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x246 (and $x54 $x55))) - (let (($x249 (and $x246 $x60))) - (let (($x287 (and $x249 $x64))) - (let (($x303 (and $x287 $x68))) - (let (($x305 (and $x303 $x73))) - (let ((?x314 (ite $x67 (ite (and (and $x287 $x67) $x73) 0 (- 1)) (ite $x305 0 (- 1))))) - (let ((?x300 (ite $x67 (ite (and (and (and $x249 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x249 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x278 (ite $x67 (ite (and (and (and (and $x246 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x246 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x264 (ite $x67 (ite (and (and (and (and $x246 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x246 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x420 (ite $x55 (ite $x59 (ite $x63 ?x264 ?x278) (ite $x63 ?x300 ?x314)) (ite $x59 (ite $x63 ?x346 ?x360) (ite $x63 ?x382 ?x396))))) - (let (($x53 (and $x49 $x51))) - (let (($x58 (and $x53 $x56))) - (let (($x155 (and $x58 $x60))) - (let (($x193 (and $x155 $x64))) - (let (($x209 (and $x193 $x68))) - (let (($x211 (and $x209 $x73))) - (let ((?x220 (ite $x67 (ite (and (and $x193 $x67) $x73) 0 (- 1)) (ite $x211 0 (- 1))))) - (let ((?x206 (ite $x67 (ite (and (and (and $x155 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x155 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x184 (ite $x67 (ite (and (and (and (and $x58 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x58 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x170 (ite $x67 (ite (and (and (and (and $x58 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x58 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x57 (and $x53 $x55))) - (let (($x62 (and $x57 $x60))) - (let (($x111 (and $x62 $x64))) - (let (($x127 (and $x111 $x68))) - (let (($x129 (and $x127 $x73))) - (let ((?x138 (ite $x67 (ite (and (and $x111 $x67) $x73) 0 (- 1)) (ite $x129 0 (- 1))))) - (let ((?x124 (ite $x67 (ite (and (and (and $x62 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x62 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x102 (ite $x67 (ite (and (and (and (and $x57 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x57 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x88 (ite $x67 (ite (and (and (and (and $x57 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x57 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x244 (ite $x55 (ite $x59 (ite $x63 ?x88 ?x102) (ite $x63 ?x124 ?x138)) (ite $x59 (ite $x63 ?x170 ?x184) (ite $x63 ?x206 ?x220))))) - (let ((?x1576 (ite $x43 (ite $x47 (ite $x51 ?x244 ?x420) (ite $x51 ?x610 ?x786)) (ite $x47 (ite $x51 ?x992 ?x1168) (ite $x51 ?x1358 ?x1534))))) - (let ((?x3108 (ite $x38 ?x1576 ?x3090))) - (let (($x3029 (ite $x63 (ite $x67 (and (and $x2959 $x63) $x67) (and (and $x2959 $x63) $x68)) (ite $x67 (and $x2997 $x67) $x3013)))) - (let (($x2958 (and $x2875 $x59))) - (let (($x2961 (and $x2958 $x64))) - (let (($x2977 (and $x2961 $x68))) - (let (($x2976 (and $x2961 $x67))) - (let (($x2993 (ite $x63 (ite $x67 (and (and $x2958 $x63) $x67) (and (and $x2958 $x63) $x68)) (ite $x67 $x2976 $x2977)))) - (let (($x2947 (ite $x63 (ite $x67 (and (and $x2877 $x63) $x67) (and (and $x2877 $x63) $x68)) (ite $x67 (and $x2915 $x67) $x2931)))) - (let (($x2876 (and $x2874 $x59))) - (let (($x2879 (and $x2876 $x64))) - (let (($x2895 (and $x2879 $x68))) - (let (($x2894 (and $x2879 $x67))) - (let (($x2911 (ite $x63 (ite $x67 (and (and $x2876 $x63) $x67) (and (and $x2876 $x63) $x68)) (ite $x67 $x2894 $x2895)))) - (let (($x2853 (ite $x63 (ite $x67 (and (and $x2783 $x63) $x67) (and (and $x2783 $x63) $x68)) (ite $x67 (and $x2821 $x67) $x2837)))) - (let (($x2782 (and $x2699 $x59))) - (let (($x2785 (and $x2782 $x64))) - (let (($x2801 (and $x2785 $x68))) - (let (($x2800 (and $x2785 $x67))) - (let (($x2817 (ite $x63 (ite $x67 (and (and $x2782 $x63) $x67) (and (and $x2782 $x63) $x68)) (ite $x67 $x2800 $x2801)))) - (let (($x2771 (ite $x63 (ite $x67 (and (and $x2701 $x63) $x67) (and (and $x2701 $x63) $x68)) (ite $x67 (and $x2739 $x67) $x2755)))) - (let (($x2700 (and $x2698 $x59))) - (let (($x2703 (and $x2700 $x64))) - (let (($x2719 (and $x2703 $x68))) - (let (($x2718 (and $x2703 $x67))) - (let (($x2735 (ite $x63 (ite $x67 (and (and $x2700 $x63) $x67) (and (and $x2700 $x63) $x68)) (ite $x67 $x2718 $x2719)))) - (let (($x3059 (ite $x51 (ite $x55 (ite $x59 $x2735 $x2771) (ite $x59 $x2817 $x2853)) (ite $x55 (ite $x59 $x2911 $x2947) (ite $x59 $x2993 $x3029))))) - (let (($x2663 (ite $x63 (ite $x67 (and (and $x2593 $x63) $x67) (and (and $x2593 $x63) $x68)) (ite $x67 (and $x2631 $x67) $x2647)))) - (let (($x2592 (and $x2509 $x59))) - (let (($x2595 (and $x2592 $x64))) - (let (($x2611 (and $x2595 $x68))) - (let (($x2610 (and $x2595 $x67))) - (let (($x2627 (ite $x63 (ite $x67 (and (and $x2592 $x63) $x67) (and (and $x2592 $x63) $x68)) (ite $x67 $x2610 $x2611)))) - (let (($x2581 (ite $x63 (ite $x67 (and (and $x2511 $x63) $x67) (and (and $x2511 $x63) $x68)) (ite $x67 (and $x2549 $x67) $x2565)))) - (let (($x2510 (and $x2508 $x59))) - (let (($x2513 (and $x2510 $x64))) - (let (($x2529 (and $x2513 $x68))) - (let (($x2528 (and $x2513 $x67))) - (let (($x2545 (ite $x63 (ite $x67 (and (and $x2510 $x63) $x67) (and (and $x2510 $x63) $x68)) (ite $x67 $x2528 $x2529)))) - (let (($x2487 (ite $x63 (ite $x67 (and (and $x2417 $x63) $x67) (and (and $x2417 $x63) $x68)) (ite $x67 (and $x2455 $x67) $x2471)))) - (let (($x2416 (and $x2333 $x59))) - (let (($x2419 (and $x2416 $x64))) - (let (($x2435 (and $x2419 $x68))) - (let (($x2434 (and $x2419 $x67))) - (let (($x2451 (ite $x63 (ite $x67 (and (and $x2416 $x63) $x67) (and (and $x2416 $x63) $x68)) (ite $x67 $x2434 $x2435)))) - (let (($x2405 (ite $x63 (ite $x67 (and (and $x2335 $x63) $x67) (and (and $x2335 $x63) $x68)) (ite $x67 (and $x2373 $x67) $x2389)))) - (let (($x2334 (and $x2332 $x59))) - (let (($x2337 (and $x2334 $x64))) - (let (($x2353 (and $x2337 $x68))) - (let (($x2352 (and $x2337 $x67))) - (let (($x2369 (ite $x63 (ite $x67 (and (and $x2334 $x63) $x67) (and (and $x2334 $x63) $x68)) (ite $x67 $x2352 $x2353)))) - (let (($x2693 (ite $x51 (ite $x55 (ite $x59 $x2369 $x2405) (ite $x59 $x2451 $x2487)) (ite $x55 (ite $x59 $x2545 $x2581) (ite $x59 $x2627 $x2663))))) - (let (($x2281 (ite $x63 (ite $x67 (and (and $x2211 $x63) $x67) (and (and $x2211 $x63) $x68)) (ite $x67 (and $x2249 $x67) $x2265)))) - (let (($x2210 (and $x2127 $x59))) - (let (($x2213 (and $x2210 $x64))) - (let (($x2229 (and $x2213 $x68))) - (let (($x2228 (and $x2213 $x67))) - (let (($x2245 (ite $x63 (ite $x67 (and (and $x2210 $x63) $x67) (and (and $x2210 $x63) $x68)) (ite $x67 $x2228 $x2229)))) - (let (($x2199 (ite $x63 (ite $x67 (and (and $x2129 $x63) $x67) (and (and $x2129 $x63) $x68)) (ite $x67 (and $x2167 $x67) $x2183)))) - (let (($x2128 (and $x2126 $x59))) - (let (($x2131 (and $x2128 $x64))) - (let (($x2147 (and $x2131 $x68))) - (let (($x2146 (and $x2131 $x67))) - (let (($x2163 (ite $x63 (ite $x67 (and (and $x2128 $x63) $x67) (and (and $x2128 $x63) $x68)) (ite $x67 $x2146 $x2147)))) - (let (($x2105 (ite $x63 (ite $x67 (and (and $x2035 $x63) $x67) (and (and $x2035 $x63) $x68)) (ite $x67 (and $x2073 $x67) $x2089)))) - (let (($x2034 (and $x1951 $x59))) - (let (($x2037 (and $x2034 $x64))) - (let (($x2053 (and $x2037 $x68))) - (let (($x2052 (and $x2037 $x67))) - (let (($x2069 (ite $x63 (ite $x67 (and (and $x2034 $x63) $x67) (and (and $x2034 $x63) $x68)) (ite $x67 $x2052 $x2053)))) - (let (($x2023 (ite $x63 (ite $x67 (and (and $x1953 $x63) $x67) (and (and $x1953 $x63) $x68)) (ite $x67 (and $x1991 $x67) $x2007)))) - (let (($x1952 (and $x1950 $x59))) - (let (($x1955 (and $x1952 $x64))) - (let (($x1971 (and $x1955 $x68))) - (let (($x1970 (and $x1955 $x67))) - (let (($x1987 (ite $x63 (ite $x67 (and (and $x1952 $x63) $x67) (and (and $x1952 $x63) $x68)) (ite $x67 $x1970 $x1971)))) - (let (($x2311 (ite $x51 (ite $x55 (ite $x59 $x1987 $x2023) (ite $x59 $x2069 $x2105)) (ite $x55 (ite $x59 $x2163 $x2199) (ite $x59 $x2245 $x2281))))) - (let (($x1915 (ite $x63 (ite $x67 (and (and $x1845 $x63) $x67) (and (and $x1845 $x63) $x68)) (ite $x67 (and $x1883 $x67) $x1899)))) - (let (($x1844 (and $x1761 $x59))) - (let (($x1847 (and $x1844 $x64))) - (let (($x1863 (and $x1847 $x68))) - (let (($x1862 (and $x1847 $x67))) - (let (($x1879 (ite $x63 (ite $x67 (and (and $x1844 $x63) $x67) (and (and $x1844 $x63) $x68)) (ite $x67 $x1862 $x1863)))) - (let (($x1833 (ite $x63 (ite $x67 (and (and $x1763 $x63) $x67) (and (and $x1763 $x63) $x68)) (ite $x67 (and $x1801 $x67) $x1817)))) - (let (($x1762 (and $x1760 $x59))) - (let (($x1765 (and $x1762 $x64))) - (let (($x1781 (and $x1765 $x68))) - (let (($x1780 (and $x1765 $x67))) - (let (($x1797 (ite $x63 (ite $x67 (and (and $x1762 $x63) $x67) (and (and $x1762 $x63) $x68)) (ite $x67 $x1780 $x1781)))) - (let (($x1739 (ite $x63 (ite $x67 (and (and $x1669 $x63) $x67) (and (and $x1669 $x63) $x68)) (ite $x67 (and $x1707 $x67) $x1723)))) - (let (($x1668 (and $x1585 $x59))) - (let (($x1671 (and $x1668 $x64))) - (let (($x1687 (and $x1671 $x68))) - (let (($x1686 (and $x1671 $x67))) - (let (($x1703 (ite $x63 (ite $x67 (and (and $x1668 $x63) $x67) (and (and $x1668 $x63) $x68)) (ite $x67 $x1686 $x1687)))) - (let (($x1657 (ite $x63 (ite $x67 (and (and $x1587 $x63) $x67) (and (and $x1587 $x63) $x68)) (ite $x67 (and $x1625 $x67) $x1641)))) - (let (($x1586 (and $x1584 $x59))) - (let (($x1589 (and $x1586 $x64))) - (let (($x1605 (and $x1589 $x68))) - (let (($x1604 (and $x1589 $x67))) - (let (($x1621 (ite $x63 (ite $x67 (and (and $x1586 $x63) $x67) (and (and $x1586 $x63) $x68)) (ite $x67 $x1604 $x1605)))) - (let (($x1945 (ite $x51 (ite $x55 (ite $x59 $x1621 $x1657) (ite $x59 $x1703 $x1739)) (ite $x55 (ite $x59 $x1797 $x1833) (ite $x59 $x1879 $x1915))))) - (let (($x1515 (ite $x63 (ite $x67 (and (and $x1445 $x63) $x67) (and (and $x1445 $x63) $x68)) (ite $x67 (and $x1483 $x67) $x1499)))) - (let (($x1444 (and $x1361 $x59))) - (let (($x1447 (and $x1444 $x64))) - (let (($x1463 (and $x1447 $x68))) - (let (($x1462 (and $x1447 $x67))) - (let (($x1479 (ite $x63 (ite $x67 (and (and $x1444 $x63) $x67) (and (and $x1444 $x63) $x68)) (ite $x67 $x1462 $x1463)))) - (let (($x1433 (ite $x63 (ite $x67 (and (and $x1363 $x63) $x67) (and (and $x1363 $x63) $x68)) (ite $x67 (and $x1401 $x67) $x1417)))) - (let (($x1362 (and $x1360 $x59))) - (let (($x1365 (and $x1362 $x64))) - (let (($x1381 (and $x1365 $x68))) - (let (($x1380 (and $x1365 $x67))) - (let (($x1397 (ite $x63 (ite $x67 (and (and $x1362 $x63) $x67) (and (and $x1362 $x63) $x68)) (ite $x67 $x1380 $x1381)))) - (let (($x1339 (ite $x63 (ite $x67 (and (and $x1269 $x63) $x67) (and (and $x1269 $x63) $x68)) (ite $x67 (and $x1307 $x67) $x1323)))) - (let (($x1268 (and $x1185 $x59))) - (let (($x1271 (and $x1268 $x64))) - (let (($x1287 (and $x1271 $x68))) - (let (($x1286 (and $x1271 $x67))) - (let (($x1303 (ite $x63 (ite $x67 (and (and $x1268 $x63) $x67) (and (and $x1268 $x63) $x68)) (ite $x67 $x1286 $x1287)))) - (let (($x1257 (ite $x63 (ite $x67 (and (and $x1187 $x63) $x67) (and (and $x1187 $x63) $x68)) (ite $x67 (and $x1225 $x67) $x1241)))) - (let (($x1186 (and $x1184 $x59))) - (let (($x1189 (and $x1186 $x64))) - (let (($x1205 (and $x1189 $x68))) - (let (($x1204 (and $x1189 $x67))) - (let (($x1221 (ite $x63 (ite $x67 (and (and $x1186 $x63) $x67) (and (and $x1186 $x63) $x68)) (ite $x67 $x1204 $x1205)))) - (let (($x1545 (ite $x51 (ite $x55 (ite $x59 $x1221 $x1257) (ite $x59 $x1303 $x1339)) (ite $x55 (ite $x59 $x1397 $x1433) (ite $x59 $x1479 $x1515))))) - (let (($x1149 (ite $x63 (ite $x67 (and (and $x1079 $x63) $x67) (and (and $x1079 $x63) $x68)) (ite $x67 (and $x1117 $x67) $x1133)))) - (let (($x1078 (and $x995 $x59))) - (let (($x1081 (and $x1078 $x64))) - (let (($x1097 (and $x1081 $x68))) - (let (($x1096 (and $x1081 $x67))) - (let (($x1113 (ite $x63 (ite $x67 (and (and $x1078 $x63) $x67) (and (and $x1078 $x63) $x68)) (ite $x67 $x1096 $x1097)))) - (let (($x1067 (ite $x63 (ite $x67 (and (and $x997 $x63) $x67) (and (and $x997 $x63) $x68)) (ite $x67 (and $x1035 $x67) $x1051)))) - (let (($x996 (and $x994 $x59))) - (let (($x999 (and $x996 $x64))) - (let (($x1015 (and $x999 $x68))) - (let (($x1014 (and $x999 $x67))) - (let (($x1031 (ite $x63 (ite $x67 (and (and $x996 $x63) $x67) (and (and $x996 $x63) $x68)) (ite $x67 $x1014 $x1015)))) - (let (($x973 (ite $x63 (ite $x67 (and (and $x903 $x63) $x67) (and (and $x903 $x63) $x68)) (ite $x67 (and $x941 $x67) $x957)))) - (let (($x902 (and $x819 $x59))) - (let (($x905 (and $x902 $x64))) - (let (($x921 (and $x905 $x68))) - (let (($x920 (and $x905 $x67))) - (let (($x937 (ite $x63 (ite $x67 (and (and $x902 $x63) $x67) (and (and $x902 $x63) $x68)) (ite $x67 $x920 $x921)))) - (let (($x891 (ite $x63 (ite $x67 (and (and $x821 $x63) $x67) (and (and $x821 $x63) $x68)) (ite $x67 (and $x859 $x67) $x875)))) - (let (($x820 (and $x818 $x59))) - (let (($x823 (and $x820 $x64))) - (let (($x839 (and $x823 $x68))) - (let (($x838 (and $x823 $x67))) - (let (($x855 (ite $x63 (ite $x67 (and (and $x820 $x63) $x67) (and (and $x820 $x63) $x68)) (ite $x67 $x838 $x839)))) - (let (($x1179 (ite $x51 (ite $x55 (ite $x59 $x855 $x891) (ite $x59 $x937 $x973)) (ite $x55 (ite $x59 $x1031 $x1067) (ite $x59 $x1113 $x1149))))) - (let (($x767 (ite $x63 (ite $x67 (and (and $x697 $x63) $x67) (and (and $x697 $x63) $x68)) (ite $x67 (and $x735 $x67) $x751)))) - (let (($x696 (and $x613 $x59))) - (let (($x699 (and $x696 $x64))) - (let (($x715 (and $x699 $x68))) - (let (($x714 (and $x699 $x67))) - (let (($x731 (ite $x63 (ite $x67 (and (and $x696 $x63) $x67) (and (and $x696 $x63) $x68)) (ite $x67 $x714 $x715)))) - (let (($x685 (ite $x63 (ite $x67 (and (and $x615 $x63) $x67) (and (and $x615 $x63) $x68)) (ite $x67 (and $x653 $x67) $x669)))) - (let (($x614 (and $x612 $x59))) - (let (($x617 (and $x614 $x64))) - (let (($x633 (and $x617 $x68))) - (let (($x632 (and $x617 $x67))) - (let (($x649 (ite $x63 (ite $x67 (and (and $x614 $x63) $x67) (and (and $x614 $x63) $x68)) (ite $x67 $x632 $x633)))) - (let (($x591 (ite $x63 (ite $x67 (and (and $x521 $x63) $x67) (and (and $x521 $x63) $x68)) (ite $x67 (and $x559 $x67) $x575)))) - (let (($x520 (and $x437 $x59))) - (let (($x523 (and $x520 $x64))) - (let (($x539 (and $x523 $x68))) - (let (($x538 (and $x523 $x67))) - (let (($x555 (ite $x63 (ite $x67 (and (and $x520 $x63) $x67) (and (and $x520 $x63) $x68)) (ite $x67 $x538 $x539)))) - (let (($x509 (ite $x63 (ite $x67 (and (and $x439 $x63) $x67) (and (and $x439 $x63) $x68)) (ite $x67 (and $x477 $x67) $x493)))) - (let (($x438 (and $x436 $x59))) - (let (($x441 (and $x438 $x64))) - (let (($x457 (and $x441 $x68))) - (let (($x456 (and $x441 $x67))) - (let (($x473 (ite $x63 (ite $x67 (and (and $x438 $x63) $x67) (and (and $x438 $x63) $x68)) (ite $x67 $x456 $x457)))) - (let (($x797 (ite $x51 (ite $x55 (ite $x59 $x473 $x509) (ite $x59 $x555 $x591)) (ite $x55 (ite $x59 $x649 $x685) (ite $x59 $x731 $x767))))) - (let (($x401 (ite $x63 (ite $x67 (and (and $x331 $x63) $x67) (and (and $x331 $x63) $x68)) (ite $x67 (and $x369 $x67) $x385)))) - (let (($x330 (and $x247 $x59))) - (let (($x333 (and $x330 $x64))) - (let (($x349 (and $x333 $x68))) - (let (($x348 (and $x333 $x67))) - (let (($x365 (ite $x63 (ite $x67 (and (and $x330 $x63) $x67) (and (and $x330 $x63) $x68)) (ite $x67 $x348 $x349)))) - (let (($x319 (ite $x63 (ite $x67 (and (and $x249 $x63) $x67) (and (and $x249 $x63) $x68)) (ite $x67 (and $x287 $x67) $x303)))) - (let (($x248 (and $x246 $x59))) - (let (($x251 (and $x248 $x64))) - (let (($x267 (and $x251 $x68))) - (let (($x266 (and $x251 $x67))) - (let (($x283 (ite $x63 (ite $x67 (and (and $x248 $x63) $x67) (and (and $x248 $x63) $x68)) (ite $x67 $x266 $x267)))) - (let (($x225 (ite $x63 (ite $x67 (and (and $x155 $x63) $x67) (and (and $x155 $x63) $x68)) (ite $x67 (and $x193 $x67) $x209)))) - (let (($x154 (and $x58 $x59))) - (let (($x157 (and $x154 $x64))) - (let (($x173 (and $x157 $x68))) - (let (($x172 (and $x157 $x67))) - (let (($x189 (ite $x63 (ite $x67 (and (and $x154 $x63) $x67) (and (and $x154 $x63) $x68)) (ite $x67 $x172 $x173)))) - (let (($x143 (ite $x63 (ite $x67 (and (and $x62 $x63) $x67) (and (and $x62 $x63) $x68)) (ite $x67 (and $x111 $x67) $x127)))) - (let (($x61 (and $x57 $x59))) - (let (($x66 (and $x61 $x64))) - (let (($x91 (and $x66 $x68))) - (let (($x90 (and $x66 $x67))) - (let (($x107 (ite $x63 (ite $x67 (and (and $x61 $x63) $x67) (and (and $x61 $x63) $x68)) (ite $x67 $x90 $x91)))) - (let (($x431 (ite $x51 (ite $x55 (ite $x59 $x107 $x143) (ite $x59 $x189 $x225)) (ite $x55 (ite $x59 $x283 $x319) (ite $x59 $x365 $x401))))) - (let (($x3107 (ite $x38 (ite $x43 (ite $x47 $x431 $x797) (ite $x47 $x1179 $x1545)) (ite $x43 (ite $x47 $x1945 $x2311) (ite $x47 $x2693 $x3059))))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3107) (= ?x3108 (- 1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) + (let (($x90 (and true (and true (= h1.fr (_ bv255 8)))))) + (let ((?x94 (ite $x90 0 (- 1)))) + (and (and (not (= standard_metadata.egress_spec (_ bv511 9))) true) (= ?x94 (- 1)))))) (check-sat) ; @@ -1740,580 +357,16 @@ (declare-fun standard_metadata.ingress_port () (_ BitVec 9)) (declare-fun standard_metadata.egress_spec () (_ BitVec 9)) (declare-fun h1.fr () (_ BitVec 8)) -(declare-fun h1.f8 () (_ BitVec 8)) -(declare-fun h1.f7 () (_ BitVec 8)) -(declare-fun h1.f6 () (_ BitVec 8)) -(declare-fun h1.f5 () (_ BitVec 8)) -(declare-fun h1.f4 () (_ BitVec 8)) -(declare-fun h1.f3 () (_ BitVec 8)) -(declare-fun h1.f2 () (_ BitVec 8)) -(declare-fun h1.f1 () (_ BitVec 8)) (assert - (let (($x3118 (= standard_metadata.ingress_port (_ bv1 9)))) - (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x3118)))) + (let (($x106 (= standard_metadata.ingress_port (_ bv1 9)))) + (and (and (distinct standard_metadata.ingress_port (_ bv511 9)) true) (or (or false (= standard_metadata.ingress_port (_ bv0 9))) $x106)))) (assert - (let (($x3120 (= standard_metadata.egress_spec (_ bv1 9)))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (or $x3111 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x3120))))) + (let (($x108 (= standard_metadata.egress_spec (_ bv1 9)))) + (let (($x92 (= standard_metadata.egress_spec (_ bv511 9)))) + (or $x92 (or (or false (= standard_metadata.egress_spec (_ bv0 9))) $x108))))) (assert - (let (($x72 (= h1.fr (_ bv255 8)))) - (let (($x73 (and true $x72))) - (let ((?x37 (concat (_ bv0 7) (_ bv0 1)))) - (let (($x67 (= h1.f8 ?x37))) - (let (($x68 (not $x67))) - (let (($x63 (= h1.f7 ?x37))) - (let (($x64 (not $x63))) - (let (($x59 (= h1.f6 ?x37))) - (let (($x60 (not $x59))) - (let (($x55 (= h1.f5 ?x37))) - (let (($x56 (not $x55))) - (let (($x51 (= h1.f4 ?x37))) - (let (($x52 (not $x51))) - (let (($x47 (= h1.f3 ?x37))) - (let (($x48 (not $x47))) - (let (($x43 (= h1.f2 ?x37))) - (let (($x44 (not $x43))) - (let (($x41 (and true (not (= h1.f1 ?x37))))) - (let (($x1579 (and $x41 $x44))) - (let (($x2329 (and $x1579 $x48))) - (let (($x2697 (and $x2329 $x52))) - (let (($x2875 (and $x2697 $x56))) - (let (($x2959 (and $x2875 $x60))) - (let (($x2997 (and $x2959 $x64))) - (let (($x3013 (and $x2997 $x68))) - (let (($x3015 (and $x3013 $x73))) - (let ((?x3024 (ite $x67 (ite (and (and $x2997 $x67) $x73) 0 (- 1)) (ite $x3015 0 (- 1))))) - (let ((?x3010 (ite $x67 (ite (and (and (and $x2959 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2959 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2988 (ite $x67 (ite (and (and (and (and $x2875 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2875 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2974 (ite $x67 (ite (and (and (and (and $x2875 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2875 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x2874 (and $x2697 $x55))) - (let (($x2877 (and $x2874 $x60))) - (let (($x2915 (and $x2877 $x64))) - (let (($x2931 (and $x2915 $x68))) - (let (($x2933 (and $x2931 $x73))) - (let ((?x2942 (ite $x67 (ite (and (and $x2915 $x67) $x73) 0 (- 1)) (ite $x2933 0 (- 1))))) - (let ((?x2928 (ite $x67 (ite (and (and (and $x2877 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2877 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2906 (ite $x67 (ite (and (and (and (and $x2874 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2874 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2892 (ite $x67 (ite (and (and (and (and $x2874 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2874 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x3048 (ite $x55 (ite $x59 (ite $x63 ?x2892 ?x2906) (ite $x63 ?x2928 ?x2942)) (ite $x59 (ite $x63 ?x2974 ?x2988) (ite $x63 ?x3010 ?x3024))))) - (let (($x2696 (and $x2329 $x51))) - (let (($x2699 (and $x2696 $x56))) - (let (($x2783 (and $x2699 $x60))) - (let (($x2821 (and $x2783 $x64))) - (let (($x2837 (and $x2821 $x68))) - (let (($x2839 (and $x2837 $x73))) - (let ((?x2848 (ite $x67 (ite (and (and $x2821 $x67) $x73) 0 (- 1)) (ite $x2839 0 (- 1))))) - (let ((?x2834 (ite $x67 (ite (and (and (and $x2783 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2783 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2812 (ite $x67 (ite (and (and (and (and $x2699 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2699 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2798 (ite $x67 (ite (and (and (and (and $x2699 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2699 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x2698 (and $x2696 $x55))) - (let (($x2701 (and $x2698 $x60))) - (let (($x2739 (and $x2701 $x64))) - (let (($x2755 (and $x2739 $x68))) - (let (($x2757 (and $x2755 $x73))) - (let ((?x2766 (ite $x67 (ite (and (and $x2739 $x67) $x73) 0 (- 1)) (ite $x2757 0 (- 1))))) - (let ((?x2752 (ite $x67 (ite (and (and (and $x2701 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2701 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2730 (ite $x67 (ite (and (and (and (and $x2698 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2698 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2716 (ite $x67 (ite (and (and (and (and $x2698 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2698 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2872 (ite $x55 (ite $x59 (ite $x63 ?x2716 ?x2730) (ite $x63 ?x2752 ?x2766)) (ite $x59 (ite $x63 ?x2798 ?x2812) (ite $x63 ?x2834 ?x2848))))) - (let (($x2328 (and $x1579 $x47))) - (let (($x2331 (and $x2328 $x52))) - (let (($x2509 (and $x2331 $x56))) - (let (($x2593 (and $x2509 $x60))) - (let (($x2631 (and $x2593 $x64))) - (let (($x2647 (and $x2631 $x68))) - (let (($x2649 (and $x2647 $x73))) - (let ((?x2658 (ite $x67 (ite (and (and $x2631 $x67) $x73) 0 (- 1)) (ite $x2649 0 (- 1))))) - (let ((?x2644 (ite $x67 (ite (and (and (and $x2593 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2593 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2622 (ite $x67 (ite (and (and (and (and $x2509 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2509 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2608 (ite $x67 (ite (and (and (and (and $x2509 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2509 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x2508 (and $x2331 $x55))) - (let (($x2511 (and $x2508 $x60))) - (let (($x2549 (and $x2511 $x64))) - (let (($x2565 (and $x2549 $x68))) - (let (($x2567 (and $x2565 $x73))) - (let ((?x2576 (ite $x67 (ite (and (and $x2549 $x67) $x73) 0 (- 1)) (ite $x2567 0 (- 1))))) - (let ((?x2562 (ite $x67 (ite (and (and (and $x2511 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2511 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2540 (ite $x67 (ite (and (and (and (and $x2508 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2508 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2526 (ite $x67 (ite (and (and (and (and $x2508 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2508 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2682 (ite $x55 (ite $x59 (ite $x63 ?x2526 ?x2540) (ite $x63 ?x2562 ?x2576)) (ite $x59 (ite $x63 ?x2608 ?x2622) (ite $x63 ?x2644 ?x2658))))) - (let (($x2330 (and $x2328 $x51))) - (let (($x2333 (and $x2330 $x56))) - (let (($x2417 (and $x2333 $x60))) - (let (($x2455 (and $x2417 $x64))) - (let (($x2471 (and $x2455 $x68))) - (let (($x2473 (and $x2471 $x73))) - (let ((?x2482 (ite $x67 (ite (and (and $x2455 $x67) $x73) 0 (- 1)) (ite $x2473 0 (- 1))))) - (let ((?x2468 (ite $x67 (ite (and (and (and $x2417 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2417 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2446 (ite $x67 (ite (and (and (and (and $x2333 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2333 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2432 (ite $x67 (ite (and (and (and (and $x2333 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2333 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x2332 (and $x2330 $x55))) - (let (($x2335 (and $x2332 $x60))) - (let (($x2373 (and $x2335 $x64))) - (let (($x2389 (and $x2373 $x68))) - (let (($x2391 (and $x2389 $x73))) - (let ((?x2400 (ite $x67 (ite (and (and $x2373 $x67) $x73) 0 (- 1)) (ite $x2391 0 (- 1))))) - (let ((?x2386 (ite $x67 (ite (and (and (and $x2335 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2335 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2364 (ite $x67 (ite (and (and (and (and $x2332 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2332 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2350 (ite $x67 (ite (and (and (and (and $x2332 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2332 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2506 (ite $x55 (ite $x59 (ite $x63 ?x2350 ?x2364) (ite $x63 ?x2386 ?x2400)) (ite $x59 (ite $x63 ?x2432 ?x2446) (ite $x63 ?x2468 ?x2482))))) - (let (($x1578 (and $x41 $x43))) - (let (($x1581 (and $x1578 $x48))) - (let (($x1949 (and $x1581 $x52))) - (let (($x2127 (and $x1949 $x56))) - (let (($x2211 (and $x2127 $x60))) - (let (($x2249 (and $x2211 $x64))) - (let (($x2265 (and $x2249 $x68))) - (let (($x2267 (and $x2265 $x73))) - (let ((?x2276 (ite $x67 (ite (and (and $x2249 $x67) $x73) 0 (- 1)) (ite $x2267 0 (- 1))))) - (let ((?x2262 (ite $x67 (ite (and (and (and $x2211 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2211 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2240 (ite $x67 (ite (and (and (and (and $x2127 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2127 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2226 (ite $x67 (ite (and (and (and (and $x2127 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2127 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x2126 (and $x1949 $x55))) - (let (($x2129 (and $x2126 $x60))) - (let (($x2167 (and $x2129 $x64))) - (let (($x2183 (and $x2167 $x68))) - (let (($x2185 (and $x2183 $x73))) - (let ((?x2194 (ite $x67 (ite (and (and $x2167 $x67) $x73) 0 (- 1)) (ite $x2185 0 (- 1))))) - (let ((?x2180 (ite $x67 (ite (and (and (and $x2129 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2129 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2158 (ite $x67 (ite (and (and (and (and $x2126 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2126 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2144 (ite $x67 (ite (and (and (and (and $x2126 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x2126 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2300 (ite $x55 (ite $x59 (ite $x63 ?x2144 ?x2158) (ite $x63 ?x2180 ?x2194)) (ite $x59 (ite $x63 ?x2226 ?x2240) (ite $x63 ?x2262 ?x2276))))) - (let (($x1948 (and $x1581 $x51))) - (let (($x1951 (and $x1948 $x56))) - (let (($x2035 (and $x1951 $x60))) - (let (($x2073 (and $x2035 $x64))) - (let (($x2089 (and $x2073 $x68))) - (let (($x2091 (and $x2089 $x73))) - (let ((?x2100 (ite $x67 (ite (and (and $x2073 $x67) $x73) 0 (- 1)) (ite $x2091 0 (- 1))))) - (let ((?x2086 (ite $x67 (ite (and (and (and $x2035 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x2035 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2064 (ite $x67 (ite (and (and (and (and $x1951 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1951 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x2050 (ite $x67 (ite (and (and (and (and $x1951 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1951 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x1950 (and $x1948 $x55))) - (let (($x1953 (and $x1950 $x60))) - (let (($x1991 (and $x1953 $x64))) - (let (($x2007 (and $x1991 $x68))) - (let (($x2009 (and $x2007 $x73))) - (let ((?x2018 (ite $x67 (ite (and (and $x1991 $x67) $x73) 0 (- 1)) (ite $x2009 0 (- 1))))) - (let ((?x2004 (ite $x67 (ite (and (and (and $x1953 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1953 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1982 (ite $x67 (ite (and (and (and (and $x1950 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1950 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1968 (ite $x67 (ite (and (and (and (and $x1950 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1950 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x2124 (ite $x55 (ite $x59 (ite $x63 ?x1968 ?x1982) (ite $x63 ?x2004 ?x2018)) (ite $x59 (ite $x63 ?x2050 ?x2064) (ite $x63 ?x2086 ?x2100))))) - (let (($x1580 (and $x1578 $x47))) - (let (($x1583 (and $x1580 $x52))) - (let (($x1761 (and $x1583 $x56))) - (let (($x1845 (and $x1761 $x60))) - (let (($x1883 (and $x1845 $x64))) - (let (($x1899 (and $x1883 $x68))) - (let (($x1901 (and $x1899 $x73))) - (let ((?x1910 (ite $x67 (ite (and (and $x1883 $x67) $x73) 0 (- 1)) (ite $x1901 0 (- 1))))) - (let ((?x1896 (ite $x67 (ite (and (and (and $x1845 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1845 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1874 (ite $x67 (ite (and (and (and (and $x1761 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1761 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1860 (ite $x67 (ite (and (and (and (and $x1761 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1761 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x1760 (and $x1583 $x55))) - (let (($x1763 (and $x1760 $x60))) - (let (($x1801 (and $x1763 $x64))) - (let (($x1817 (and $x1801 $x68))) - (let (($x1819 (and $x1817 $x73))) - (let ((?x1828 (ite $x67 (ite (and (and $x1801 $x67) $x73) 0 (- 1)) (ite $x1819 0 (- 1))))) - (let ((?x1814 (ite $x67 (ite (and (and (and $x1763 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1763 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1792 (ite $x67 (ite (and (and (and (and $x1760 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1760 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1778 (ite $x67 (ite (and (and (and (and $x1760 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1760 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1934 (ite $x55 (ite $x59 (ite $x63 ?x1778 ?x1792) (ite $x63 ?x1814 ?x1828)) (ite $x59 (ite $x63 ?x1860 ?x1874) (ite $x63 ?x1896 ?x1910))))) - (let (($x1582 (and $x1580 $x51))) - (let (($x1585 (and $x1582 $x56))) - (let (($x1669 (and $x1585 $x60))) - (let (($x1707 (and $x1669 $x64))) - (let (($x1723 (and $x1707 $x68))) - (let (($x1725 (and $x1723 $x73))) - (let ((?x1734 (ite $x67 (ite (and (and $x1707 $x67) $x73) 0 (- 1)) (ite $x1725 0 (- 1))))) - (let ((?x1720 (ite $x67 (ite (and (and (and $x1669 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1669 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1698 (ite $x67 (ite (and (and (and (and $x1585 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1585 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1684 (ite $x67 (ite (and (and (and (and $x1585 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1585 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x1584 (and $x1582 $x55))) - (let (($x1587 (and $x1584 $x60))) - (let (($x1625 (and $x1587 $x64))) - (let (($x1641 (and $x1625 $x68))) - (let (($x1643 (and $x1641 $x73))) - (let ((?x1652 (ite $x67 (ite (and (and $x1625 $x67) $x73) 0 (- 1)) (ite $x1643 0 (- 1))))) - (let ((?x1638 (ite $x67 (ite (and (and (and $x1587 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1587 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1616 (ite $x67 (ite (and (and (and (and $x1584 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1584 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1602 (ite $x67 (ite (and (and (and (and $x1584 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1584 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1758 (ite $x55 (ite $x59 (ite $x63 ?x1602 ?x1616) (ite $x63 ?x1638 ?x1652)) (ite $x59 (ite $x63 ?x1684 ?x1698) (ite $x63 ?x1720 ?x1734))))) - (let ((?x3090 (ite $x43 (ite $x47 (ite $x51 ?x1758 ?x1934) (ite $x51 ?x2124 ?x2300)) (ite $x47 (ite $x51 ?x2506 ?x2682) (ite $x51 ?x2872 ?x3048))))) - (let (($x38 (= h1.f1 ?x37))) - (let (($x40 (and true $x38))) - (let (($x46 (and $x40 $x44))) - (let (($x815 (and $x46 $x48))) - (let (($x1183 (and $x815 $x52))) - (let (($x1361 (and $x1183 $x56))) - (let (($x1445 (and $x1361 $x60))) - (let (($x1483 (and $x1445 $x64))) - (let (($x1499 (and $x1483 $x68))) - (let (($x1501 (and $x1499 $x73))) - (let ((?x1510 (ite $x67 (ite (and (and $x1483 $x67) $x73) 0 (- 1)) (ite $x1501 0 (- 1))))) - (let ((?x1496 (ite $x67 (ite (and (and (and $x1445 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1445 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1474 (ite $x67 (ite (and (and (and (and $x1361 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1361 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1460 (ite $x67 (ite (and (and (and (and $x1361 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1361 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x1360 (and $x1183 $x55))) - (let (($x1363 (and $x1360 $x60))) - (let (($x1401 (and $x1363 $x64))) - (let (($x1417 (and $x1401 $x68))) - (let (($x1419 (and $x1417 $x73))) - (let ((?x1428 (ite $x67 (ite (and (and $x1401 $x67) $x73) 0 (- 1)) (ite $x1419 0 (- 1))))) - (let ((?x1414 (ite $x67 (ite (and (and (and $x1363 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1363 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1392 (ite $x67 (ite (and (and (and (and $x1360 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1360 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1378 (ite $x67 (ite (and (and (and (and $x1360 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1360 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1534 (ite $x55 (ite $x59 (ite $x63 ?x1378 ?x1392) (ite $x63 ?x1414 ?x1428)) (ite $x59 (ite $x63 ?x1460 ?x1474) (ite $x63 ?x1496 ?x1510))))) - (let (($x1182 (and $x815 $x51))) - (let (($x1185 (and $x1182 $x56))) - (let (($x1269 (and $x1185 $x60))) - (let (($x1307 (and $x1269 $x64))) - (let (($x1323 (and $x1307 $x68))) - (let (($x1325 (and $x1323 $x73))) - (let ((?x1334 (ite $x67 (ite (and (and $x1307 $x67) $x73) 0 (- 1)) (ite $x1325 0 (- 1))))) - (let ((?x1320 (ite $x67 (ite (and (and (and $x1269 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1269 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1298 (ite $x67 (ite (and (and (and (and $x1185 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1185 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1284 (ite $x67 (ite (and (and (and (and $x1185 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1185 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x1184 (and $x1182 $x55))) - (let (($x1187 (and $x1184 $x60))) - (let (($x1225 (and $x1187 $x64))) - (let (($x1241 (and $x1225 $x68))) - (let (($x1243 (and $x1241 $x73))) - (let ((?x1252 (ite $x67 (ite (and (and $x1225 $x67) $x73) 0 (- 1)) (ite $x1243 0 (- 1))))) - (let ((?x1238 (ite $x67 (ite (and (and (and $x1187 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1187 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1216 (ite $x67 (ite (and (and (and (and $x1184 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1184 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1202 (ite $x67 (ite (and (and (and (and $x1184 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x1184 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1358 (ite $x55 (ite $x59 (ite $x63 ?x1202 ?x1216) (ite $x63 ?x1238 ?x1252)) (ite $x59 (ite $x63 ?x1284 ?x1298) (ite $x63 ?x1320 ?x1334))))) - (let (($x814 (and $x46 $x47))) - (let (($x817 (and $x814 $x52))) - (let (($x995 (and $x817 $x56))) - (let (($x1079 (and $x995 $x60))) - (let (($x1117 (and $x1079 $x64))) - (let (($x1133 (and $x1117 $x68))) - (let (($x1135 (and $x1133 $x73))) - (let ((?x1144 (ite $x67 (ite (and (and $x1117 $x67) $x73) 0 (- 1)) (ite $x1135 0 (- 1))))) - (let ((?x1130 (ite $x67 (ite (and (and (and $x1079 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x1079 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1108 (ite $x67 (ite (and (and (and (and $x995 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x995 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1094 (ite $x67 (ite (and (and (and (and $x995 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x995 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x994 (and $x817 $x55))) - (let (($x997 (and $x994 $x60))) - (let (($x1035 (and $x997 $x64))) - (let (($x1051 (and $x1035 $x68))) - (let (($x1053 (and $x1051 $x73))) - (let ((?x1062 (ite $x67 (ite (and (and $x1035 $x67) $x73) 0 (- 1)) (ite $x1053 0 (- 1))))) - (let ((?x1048 (ite $x67 (ite (and (and (and $x997 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x997 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1026 (ite $x67 (ite (and (and (and (and $x994 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x994 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x1012 (ite $x67 (ite (and (and (and (and $x994 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x994 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x1168 (ite $x55 (ite $x59 (ite $x63 ?x1012 ?x1026) (ite $x63 ?x1048 ?x1062)) (ite $x59 (ite $x63 ?x1094 ?x1108) (ite $x63 ?x1130 ?x1144))))) - (let (($x816 (and $x814 $x51))) - (let (($x819 (and $x816 $x56))) - (let (($x903 (and $x819 $x60))) - (let (($x941 (and $x903 $x64))) - (let (($x957 (and $x941 $x68))) - (let (($x959 (and $x957 $x73))) - (let ((?x968 (ite $x67 (ite (and (and $x941 $x67) $x73) 0 (- 1)) (ite $x959 0 (- 1))))) - (let ((?x954 (ite $x67 (ite (and (and (and $x903 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x903 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x932 (ite $x67 (ite (and (and (and (and $x819 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x819 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x918 (ite $x67 (ite (and (and (and (and $x819 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x819 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x818 (and $x816 $x55))) - (let (($x821 (and $x818 $x60))) - (let (($x859 (and $x821 $x64))) - (let (($x875 (and $x859 $x68))) - (let (($x877 (and $x875 $x73))) - (let ((?x886 (ite $x67 (ite (and (and $x859 $x67) $x73) 0 (- 1)) (ite $x877 0 (- 1))))) - (let ((?x872 (ite $x67 (ite (and (and (and $x821 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x821 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x850 (ite $x67 (ite (and (and (and (and $x818 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x818 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x836 (ite $x67 (ite (and (and (and (and $x818 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x818 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x992 (ite $x55 (ite $x59 (ite $x63 ?x836 ?x850) (ite $x63 ?x872 ?x886)) (ite $x59 (ite $x63 ?x918 ?x932) (ite $x63 ?x954 ?x968))))) - (let (($x45 (and $x40 $x43))) - (let (($x50 (and $x45 $x48))) - (let (($x435 (and $x50 $x52))) - (let (($x613 (and $x435 $x56))) - (let (($x697 (and $x613 $x60))) - (let (($x735 (and $x697 $x64))) - (let (($x751 (and $x735 $x68))) - (let (($x753 (and $x751 $x73))) - (let ((?x762 (ite $x67 (ite (and (and $x735 $x67) $x73) 0 (- 1)) (ite $x753 0 (- 1))))) - (let ((?x748 (ite $x67 (ite (and (and (and $x697 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x697 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x726 (ite $x67 (ite (and (and (and (and $x613 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x613 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x712 (ite $x67 (ite (and (and (and (and $x613 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x613 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x612 (and $x435 $x55))) - (let (($x615 (and $x612 $x60))) - (let (($x653 (and $x615 $x64))) - (let (($x669 (and $x653 $x68))) - (let (($x671 (and $x669 $x73))) - (let ((?x680 (ite $x67 (ite (and (and $x653 $x67) $x73) 0 (- 1)) (ite $x671 0 (- 1))))) - (let ((?x666 (ite $x67 (ite (and (and (and $x615 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x615 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x644 (ite $x67 (ite (and (and (and (and $x612 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x612 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x630 (ite $x67 (ite (and (and (and (and $x612 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x612 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x786 (ite $x55 (ite $x59 (ite $x63 ?x630 ?x644) (ite $x63 ?x666 ?x680)) (ite $x59 (ite $x63 ?x712 ?x726) (ite $x63 ?x748 ?x762))))) - (let (($x434 (and $x50 $x51))) - (let (($x437 (and $x434 $x56))) - (let (($x521 (and $x437 $x60))) - (let (($x559 (and $x521 $x64))) - (let (($x575 (and $x559 $x68))) - (let (($x577 (and $x575 $x73))) - (let ((?x586 (ite $x67 (ite (and (and $x559 $x67) $x73) 0 (- 1)) (ite $x577 0 (- 1))))) - (let ((?x572 (ite $x67 (ite (and (and (and $x521 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x521 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x550 (ite $x67 (ite (and (and (and (and $x437 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x437 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x536 (ite $x67 (ite (and (and (and (and $x437 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x437 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x436 (and $x434 $x55))) - (let (($x439 (and $x436 $x60))) - (let (($x477 (and $x439 $x64))) - (let (($x493 (and $x477 $x68))) - (let (($x495 (and $x493 $x73))) - (let ((?x504 (ite $x67 (ite (and (and $x477 $x67) $x73) 0 (- 1)) (ite $x495 0 (- 1))))) - (let ((?x490 (ite $x67 (ite (and (and (and $x439 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x439 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x468 (ite $x67 (ite (and (and (and (and $x436 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x436 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x454 (ite $x67 (ite (and (and (and (and $x436 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x436 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x610 (ite $x55 (ite $x59 (ite $x63 ?x454 ?x468) (ite $x63 ?x490 ?x504)) (ite $x59 (ite $x63 ?x536 ?x550) (ite $x63 ?x572 ?x586))))) - (let (($x49 (and $x45 $x47))) - (let (($x54 (and $x49 $x52))) - (let (($x247 (and $x54 $x56))) - (let (($x331 (and $x247 $x60))) - (let (($x369 (and $x331 $x64))) - (let (($x385 (and $x369 $x68))) - (let (($x387 (and $x385 $x73))) - (let ((?x396 (ite $x67 (ite (and (and $x369 $x67) $x73) 0 (- 1)) (ite $x387 0 (- 1))))) - (let ((?x382 (ite $x67 (ite (and (and (and $x331 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x331 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x360 (ite $x67 (ite (and (and (and (and $x247 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x247 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x346 (ite $x67 (ite (and (and (and (and $x247 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x247 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x246 (and $x54 $x55))) - (let (($x249 (and $x246 $x60))) - (let (($x287 (and $x249 $x64))) - (let (($x303 (and $x287 $x68))) - (let (($x305 (and $x303 $x73))) - (let ((?x314 (ite $x67 (ite (and (and $x287 $x67) $x73) 0 (- 1)) (ite $x305 0 (- 1))))) - (let ((?x300 (ite $x67 (ite (and (and (and $x249 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x249 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x278 (ite $x67 (ite (and (and (and (and $x246 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x246 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x264 (ite $x67 (ite (and (and (and (and $x246 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x246 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x420 (ite $x55 (ite $x59 (ite $x63 ?x264 ?x278) (ite $x63 ?x300 ?x314)) (ite $x59 (ite $x63 ?x346 ?x360) (ite $x63 ?x382 ?x396))))) - (let (($x53 (and $x49 $x51))) - (let (($x58 (and $x53 $x56))) - (let (($x155 (and $x58 $x60))) - (let (($x193 (and $x155 $x64))) - (let (($x209 (and $x193 $x68))) - (let (($x211 (and $x209 $x73))) - (let ((?x220 (ite $x67 (ite (and (and $x193 $x67) $x73) 0 (- 1)) (ite $x211 0 (- 1))))) - (let ((?x206 (ite $x67 (ite (and (and (and $x155 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x155 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x184 (ite $x67 (ite (and (and (and (and $x58 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x58 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x170 (ite $x67 (ite (and (and (and (and $x58 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x58 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let (($x57 (and $x53 $x55))) - (let (($x62 (and $x57 $x60))) - (let (($x111 (and $x62 $x64))) - (let (($x127 (and $x111 $x68))) - (let (($x129 (and $x127 $x73))) - (let ((?x138 (ite $x67 (ite (and (and $x111 $x67) $x73) 0 (- 1)) (ite $x129 0 (- 1))))) - (let ((?x124 (ite $x67 (ite (and (and (and $x62 $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and $x62 $x63) $x68) $x73) 0 (- 1))))) - (let ((?x102 (ite $x67 (ite (and (and (and (and $x57 $x59) $x64) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x57 $x59) $x64) $x68) $x73) 0 (- 1))))) - (let ((?x88 (ite $x67 (ite (and (and (and (and $x57 $x59) $x63) $x67) $x73) 0 (- 1)) (ite (and (and (and (and $x57 $x59) $x63) $x68) $x73) 0 (- 1))))) - (let ((?x244 (ite $x55 (ite $x59 (ite $x63 ?x88 ?x102) (ite $x63 ?x124 ?x138)) (ite $x59 (ite $x63 ?x170 ?x184) (ite $x63 ?x206 ?x220))))) - (let ((?x1576 (ite $x43 (ite $x47 (ite $x51 ?x244 ?x420) (ite $x51 ?x610 ?x786)) (ite $x47 (ite $x51 ?x992 ?x1168) (ite $x51 ?x1358 ?x1534))))) - (let ((?x3108 (ite $x38 ?x1576 ?x3090))) - (let (($x3029 (ite $x63 (ite $x67 (and (and $x2959 $x63) $x67) (and (and $x2959 $x63) $x68)) (ite $x67 (and $x2997 $x67) $x3013)))) - (let (($x2958 (and $x2875 $x59))) - (let (($x2961 (and $x2958 $x64))) - (let (($x2977 (and $x2961 $x68))) - (let (($x2976 (and $x2961 $x67))) - (let (($x2993 (ite $x63 (ite $x67 (and (and $x2958 $x63) $x67) (and (and $x2958 $x63) $x68)) (ite $x67 $x2976 $x2977)))) - (let (($x2947 (ite $x63 (ite $x67 (and (and $x2877 $x63) $x67) (and (and $x2877 $x63) $x68)) (ite $x67 (and $x2915 $x67) $x2931)))) - (let (($x2876 (and $x2874 $x59))) - (let (($x2879 (and $x2876 $x64))) - (let (($x2895 (and $x2879 $x68))) - (let (($x2894 (and $x2879 $x67))) - (let (($x2911 (ite $x63 (ite $x67 (and (and $x2876 $x63) $x67) (and (and $x2876 $x63) $x68)) (ite $x67 $x2894 $x2895)))) - (let (($x2853 (ite $x63 (ite $x67 (and (and $x2783 $x63) $x67) (and (and $x2783 $x63) $x68)) (ite $x67 (and $x2821 $x67) $x2837)))) - (let (($x2782 (and $x2699 $x59))) - (let (($x2785 (and $x2782 $x64))) - (let (($x2801 (and $x2785 $x68))) - (let (($x2800 (and $x2785 $x67))) - (let (($x2817 (ite $x63 (ite $x67 (and (and $x2782 $x63) $x67) (and (and $x2782 $x63) $x68)) (ite $x67 $x2800 $x2801)))) - (let (($x2771 (ite $x63 (ite $x67 (and (and $x2701 $x63) $x67) (and (and $x2701 $x63) $x68)) (ite $x67 (and $x2739 $x67) $x2755)))) - (let (($x2700 (and $x2698 $x59))) - (let (($x2703 (and $x2700 $x64))) - (let (($x2719 (and $x2703 $x68))) - (let (($x2718 (and $x2703 $x67))) - (let (($x2735 (ite $x63 (ite $x67 (and (and $x2700 $x63) $x67) (and (and $x2700 $x63) $x68)) (ite $x67 $x2718 $x2719)))) - (let (($x3059 (ite $x51 (ite $x55 (ite $x59 $x2735 $x2771) (ite $x59 $x2817 $x2853)) (ite $x55 (ite $x59 $x2911 $x2947) (ite $x59 $x2993 $x3029))))) - (let (($x2663 (ite $x63 (ite $x67 (and (and $x2593 $x63) $x67) (and (and $x2593 $x63) $x68)) (ite $x67 (and $x2631 $x67) $x2647)))) - (let (($x2592 (and $x2509 $x59))) - (let (($x2595 (and $x2592 $x64))) - (let (($x2611 (and $x2595 $x68))) - (let (($x2610 (and $x2595 $x67))) - (let (($x2627 (ite $x63 (ite $x67 (and (and $x2592 $x63) $x67) (and (and $x2592 $x63) $x68)) (ite $x67 $x2610 $x2611)))) - (let (($x2581 (ite $x63 (ite $x67 (and (and $x2511 $x63) $x67) (and (and $x2511 $x63) $x68)) (ite $x67 (and $x2549 $x67) $x2565)))) - (let (($x2510 (and $x2508 $x59))) - (let (($x2513 (and $x2510 $x64))) - (let (($x2529 (and $x2513 $x68))) - (let (($x2528 (and $x2513 $x67))) - (let (($x2545 (ite $x63 (ite $x67 (and (and $x2510 $x63) $x67) (and (and $x2510 $x63) $x68)) (ite $x67 $x2528 $x2529)))) - (let (($x2487 (ite $x63 (ite $x67 (and (and $x2417 $x63) $x67) (and (and $x2417 $x63) $x68)) (ite $x67 (and $x2455 $x67) $x2471)))) - (let (($x2416 (and $x2333 $x59))) - (let (($x2419 (and $x2416 $x64))) - (let (($x2435 (and $x2419 $x68))) - (let (($x2434 (and $x2419 $x67))) - (let (($x2451 (ite $x63 (ite $x67 (and (and $x2416 $x63) $x67) (and (and $x2416 $x63) $x68)) (ite $x67 $x2434 $x2435)))) - (let (($x2405 (ite $x63 (ite $x67 (and (and $x2335 $x63) $x67) (and (and $x2335 $x63) $x68)) (ite $x67 (and $x2373 $x67) $x2389)))) - (let (($x2334 (and $x2332 $x59))) - (let (($x2337 (and $x2334 $x64))) - (let (($x2353 (and $x2337 $x68))) - (let (($x2352 (and $x2337 $x67))) - (let (($x2369 (ite $x63 (ite $x67 (and (and $x2334 $x63) $x67) (and (and $x2334 $x63) $x68)) (ite $x67 $x2352 $x2353)))) - (let (($x2693 (ite $x51 (ite $x55 (ite $x59 $x2369 $x2405) (ite $x59 $x2451 $x2487)) (ite $x55 (ite $x59 $x2545 $x2581) (ite $x59 $x2627 $x2663))))) - (let (($x2281 (ite $x63 (ite $x67 (and (and $x2211 $x63) $x67) (and (and $x2211 $x63) $x68)) (ite $x67 (and $x2249 $x67) $x2265)))) - (let (($x2210 (and $x2127 $x59))) - (let (($x2213 (and $x2210 $x64))) - (let (($x2229 (and $x2213 $x68))) - (let (($x2228 (and $x2213 $x67))) - (let (($x2245 (ite $x63 (ite $x67 (and (and $x2210 $x63) $x67) (and (and $x2210 $x63) $x68)) (ite $x67 $x2228 $x2229)))) - (let (($x2199 (ite $x63 (ite $x67 (and (and $x2129 $x63) $x67) (and (and $x2129 $x63) $x68)) (ite $x67 (and $x2167 $x67) $x2183)))) - (let (($x2128 (and $x2126 $x59))) - (let (($x2131 (and $x2128 $x64))) - (let (($x2147 (and $x2131 $x68))) - (let (($x2146 (and $x2131 $x67))) - (let (($x2163 (ite $x63 (ite $x67 (and (and $x2128 $x63) $x67) (and (and $x2128 $x63) $x68)) (ite $x67 $x2146 $x2147)))) - (let (($x2105 (ite $x63 (ite $x67 (and (and $x2035 $x63) $x67) (and (and $x2035 $x63) $x68)) (ite $x67 (and $x2073 $x67) $x2089)))) - (let (($x2034 (and $x1951 $x59))) - (let (($x2037 (and $x2034 $x64))) - (let (($x2053 (and $x2037 $x68))) - (let (($x2052 (and $x2037 $x67))) - (let (($x2069 (ite $x63 (ite $x67 (and (and $x2034 $x63) $x67) (and (and $x2034 $x63) $x68)) (ite $x67 $x2052 $x2053)))) - (let (($x2023 (ite $x63 (ite $x67 (and (and $x1953 $x63) $x67) (and (and $x1953 $x63) $x68)) (ite $x67 (and $x1991 $x67) $x2007)))) - (let (($x1952 (and $x1950 $x59))) - (let (($x1955 (and $x1952 $x64))) - (let (($x1971 (and $x1955 $x68))) - (let (($x1970 (and $x1955 $x67))) - (let (($x1987 (ite $x63 (ite $x67 (and (and $x1952 $x63) $x67) (and (and $x1952 $x63) $x68)) (ite $x67 $x1970 $x1971)))) - (let (($x2311 (ite $x51 (ite $x55 (ite $x59 $x1987 $x2023) (ite $x59 $x2069 $x2105)) (ite $x55 (ite $x59 $x2163 $x2199) (ite $x59 $x2245 $x2281))))) - (let (($x1915 (ite $x63 (ite $x67 (and (and $x1845 $x63) $x67) (and (and $x1845 $x63) $x68)) (ite $x67 (and $x1883 $x67) $x1899)))) - (let (($x1844 (and $x1761 $x59))) - (let (($x1847 (and $x1844 $x64))) - (let (($x1863 (and $x1847 $x68))) - (let (($x1862 (and $x1847 $x67))) - (let (($x1879 (ite $x63 (ite $x67 (and (and $x1844 $x63) $x67) (and (and $x1844 $x63) $x68)) (ite $x67 $x1862 $x1863)))) - (let (($x1833 (ite $x63 (ite $x67 (and (and $x1763 $x63) $x67) (and (and $x1763 $x63) $x68)) (ite $x67 (and $x1801 $x67) $x1817)))) - (let (($x1762 (and $x1760 $x59))) - (let (($x1765 (and $x1762 $x64))) - (let (($x1781 (and $x1765 $x68))) - (let (($x1780 (and $x1765 $x67))) - (let (($x1797 (ite $x63 (ite $x67 (and (and $x1762 $x63) $x67) (and (and $x1762 $x63) $x68)) (ite $x67 $x1780 $x1781)))) - (let (($x1739 (ite $x63 (ite $x67 (and (and $x1669 $x63) $x67) (and (and $x1669 $x63) $x68)) (ite $x67 (and $x1707 $x67) $x1723)))) - (let (($x1668 (and $x1585 $x59))) - (let (($x1671 (and $x1668 $x64))) - (let (($x1687 (and $x1671 $x68))) - (let (($x1686 (and $x1671 $x67))) - (let (($x1703 (ite $x63 (ite $x67 (and (and $x1668 $x63) $x67) (and (and $x1668 $x63) $x68)) (ite $x67 $x1686 $x1687)))) - (let (($x1657 (ite $x63 (ite $x67 (and (and $x1587 $x63) $x67) (and (and $x1587 $x63) $x68)) (ite $x67 (and $x1625 $x67) $x1641)))) - (let (($x1586 (and $x1584 $x59))) - (let (($x1589 (and $x1586 $x64))) - (let (($x1605 (and $x1589 $x68))) - (let (($x1604 (and $x1589 $x67))) - (let (($x1621 (ite $x63 (ite $x67 (and (and $x1586 $x63) $x67) (and (and $x1586 $x63) $x68)) (ite $x67 $x1604 $x1605)))) - (let (($x1945 (ite $x51 (ite $x55 (ite $x59 $x1621 $x1657) (ite $x59 $x1703 $x1739)) (ite $x55 (ite $x59 $x1797 $x1833) (ite $x59 $x1879 $x1915))))) - (let (($x1515 (ite $x63 (ite $x67 (and (and $x1445 $x63) $x67) (and (and $x1445 $x63) $x68)) (ite $x67 (and $x1483 $x67) $x1499)))) - (let (($x1444 (and $x1361 $x59))) - (let (($x1447 (and $x1444 $x64))) - (let (($x1463 (and $x1447 $x68))) - (let (($x1462 (and $x1447 $x67))) - (let (($x1479 (ite $x63 (ite $x67 (and (and $x1444 $x63) $x67) (and (and $x1444 $x63) $x68)) (ite $x67 $x1462 $x1463)))) - (let (($x1433 (ite $x63 (ite $x67 (and (and $x1363 $x63) $x67) (and (and $x1363 $x63) $x68)) (ite $x67 (and $x1401 $x67) $x1417)))) - (let (($x1362 (and $x1360 $x59))) - (let (($x1365 (and $x1362 $x64))) - (let (($x1381 (and $x1365 $x68))) - (let (($x1380 (and $x1365 $x67))) - (let (($x1397 (ite $x63 (ite $x67 (and (and $x1362 $x63) $x67) (and (and $x1362 $x63) $x68)) (ite $x67 $x1380 $x1381)))) - (let (($x1339 (ite $x63 (ite $x67 (and (and $x1269 $x63) $x67) (and (and $x1269 $x63) $x68)) (ite $x67 (and $x1307 $x67) $x1323)))) - (let (($x1268 (and $x1185 $x59))) - (let (($x1271 (and $x1268 $x64))) - (let (($x1287 (and $x1271 $x68))) - (let (($x1286 (and $x1271 $x67))) - (let (($x1303 (ite $x63 (ite $x67 (and (and $x1268 $x63) $x67) (and (and $x1268 $x63) $x68)) (ite $x67 $x1286 $x1287)))) - (let (($x1257 (ite $x63 (ite $x67 (and (and $x1187 $x63) $x67) (and (and $x1187 $x63) $x68)) (ite $x67 (and $x1225 $x67) $x1241)))) - (let (($x1186 (and $x1184 $x59))) - (let (($x1189 (and $x1186 $x64))) - (let (($x1205 (and $x1189 $x68))) - (let (($x1204 (and $x1189 $x67))) - (let (($x1221 (ite $x63 (ite $x67 (and (and $x1186 $x63) $x67) (and (and $x1186 $x63) $x68)) (ite $x67 $x1204 $x1205)))) - (let (($x1545 (ite $x51 (ite $x55 (ite $x59 $x1221 $x1257) (ite $x59 $x1303 $x1339)) (ite $x55 (ite $x59 $x1397 $x1433) (ite $x59 $x1479 $x1515))))) - (let (($x1149 (ite $x63 (ite $x67 (and (and $x1079 $x63) $x67) (and (and $x1079 $x63) $x68)) (ite $x67 (and $x1117 $x67) $x1133)))) - (let (($x1078 (and $x995 $x59))) - (let (($x1081 (and $x1078 $x64))) - (let (($x1097 (and $x1081 $x68))) - (let (($x1096 (and $x1081 $x67))) - (let (($x1113 (ite $x63 (ite $x67 (and (and $x1078 $x63) $x67) (and (and $x1078 $x63) $x68)) (ite $x67 $x1096 $x1097)))) - (let (($x1067 (ite $x63 (ite $x67 (and (and $x997 $x63) $x67) (and (and $x997 $x63) $x68)) (ite $x67 (and $x1035 $x67) $x1051)))) - (let (($x996 (and $x994 $x59))) - (let (($x999 (and $x996 $x64))) - (let (($x1015 (and $x999 $x68))) - (let (($x1014 (and $x999 $x67))) - (let (($x1031 (ite $x63 (ite $x67 (and (and $x996 $x63) $x67) (and (and $x996 $x63) $x68)) (ite $x67 $x1014 $x1015)))) - (let (($x973 (ite $x63 (ite $x67 (and (and $x903 $x63) $x67) (and (and $x903 $x63) $x68)) (ite $x67 (and $x941 $x67) $x957)))) - (let (($x902 (and $x819 $x59))) - (let (($x905 (and $x902 $x64))) - (let (($x921 (and $x905 $x68))) - (let (($x920 (and $x905 $x67))) - (let (($x937 (ite $x63 (ite $x67 (and (and $x902 $x63) $x67) (and (and $x902 $x63) $x68)) (ite $x67 $x920 $x921)))) - (let (($x891 (ite $x63 (ite $x67 (and (and $x821 $x63) $x67) (and (and $x821 $x63) $x68)) (ite $x67 (and $x859 $x67) $x875)))) - (let (($x820 (and $x818 $x59))) - (let (($x823 (and $x820 $x64))) - (let (($x839 (and $x823 $x68))) - (let (($x838 (and $x823 $x67))) - (let (($x855 (ite $x63 (ite $x67 (and (and $x820 $x63) $x67) (and (and $x820 $x63) $x68)) (ite $x67 $x838 $x839)))) - (let (($x1179 (ite $x51 (ite $x55 (ite $x59 $x855 $x891) (ite $x59 $x937 $x973)) (ite $x55 (ite $x59 $x1031 $x1067) (ite $x59 $x1113 $x1149))))) - (let (($x767 (ite $x63 (ite $x67 (and (and $x697 $x63) $x67) (and (and $x697 $x63) $x68)) (ite $x67 (and $x735 $x67) $x751)))) - (let (($x696 (and $x613 $x59))) - (let (($x699 (and $x696 $x64))) - (let (($x715 (and $x699 $x68))) - (let (($x714 (and $x699 $x67))) - (let (($x731 (ite $x63 (ite $x67 (and (and $x696 $x63) $x67) (and (and $x696 $x63) $x68)) (ite $x67 $x714 $x715)))) - (let (($x685 (ite $x63 (ite $x67 (and (and $x615 $x63) $x67) (and (and $x615 $x63) $x68)) (ite $x67 (and $x653 $x67) $x669)))) - (let (($x614 (and $x612 $x59))) - (let (($x617 (and $x614 $x64))) - (let (($x633 (and $x617 $x68))) - (let (($x632 (and $x617 $x67))) - (let (($x649 (ite $x63 (ite $x67 (and (and $x614 $x63) $x67) (and (and $x614 $x63) $x68)) (ite $x67 $x632 $x633)))) - (let (($x591 (ite $x63 (ite $x67 (and (and $x521 $x63) $x67) (and (and $x521 $x63) $x68)) (ite $x67 (and $x559 $x67) $x575)))) - (let (($x520 (and $x437 $x59))) - (let (($x523 (and $x520 $x64))) - (let (($x539 (and $x523 $x68))) - (let (($x538 (and $x523 $x67))) - (let (($x555 (ite $x63 (ite $x67 (and (and $x520 $x63) $x67) (and (and $x520 $x63) $x68)) (ite $x67 $x538 $x539)))) - (let (($x509 (ite $x63 (ite $x67 (and (and $x439 $x63) $x67) (and (and $x439 $x63) $x68)) (ite $x67 (and $x477 $x67) $x493)))) - (let (($x438 (and $x436 $x59))) - (let (($x441 (and $x438 $x64))) - (let (($x457 (and $x441 $x68))) - (let (($x456 (and $x441 $x67))) - (let (($x473 (ite $x63 (ite $x67 (and (and $x438 $x63) $x67) (and (and $x438 $x63) $x68)) (ite $x67 $x456 $x457)))) - (let (($x797 (ite $x51 (ite $x55 (ite $x59 $x473 $x509) (ite $x59 $x555 $x591)) (ite $x55 (ite $x59 $x649 $x685) (ite $x59 $x731 $x767))))) - (let (($x401 (ite $x63 (ite $x67 (and (and $x331 $x63) $x67) (and (and $x331 $x63) $x68)) (ite $x67 (and $x369 $x67) $x385)))) - (let (($x330 (and $x247 $x59))) - (let (($x333 (and $x330 $x64))) - (let (($x349 (and $x333 $x68))) - (let (($x348 (and $x333 $x67))) - (let (($x365 (ite $x63 (ite $x67 (and (and $x330 $x63) $x67) (and (and $x330 $x63) $x68)) (ite $x67 $x348 $x349)))) - (let (($x319 (ite $x63 (ite $x67 (and (and $x249 $x63) $x67) (and (and $x249 $x63) $x68)) (ite $x67 (and $x287 $x67) $x303)))) - (let (($x248 (and $x246 $x59))) - (let (($x251 (and $x248 $x64))) - (let (($x267 (and $x251 $x68))) - (let (($x266 (and $x251 $x67))) - (let (($x283 (ite $x63 (ite $x67 (and (and $x248 $x63) $x67) (and (and $x248 $x63) $x68)) (ite $x67 $x266 $x267)))) - (let (($x225 (ite $x63 (ite $x67 (and (and $x155 $x63) $x67) (and (and $x155 $x63) $x68)) (ite $x67 (and $x193 $x67) $x209)))) - (let (($x154 (and $x58 $x59))) - (let (($x157 (and $x154 $x64))) - (let (($x173 (and $x157 $x68))) - (let (($x172 (and $x157 $x67))) - (let (($x189 (ite $x63 (ite $x67 (and (and $x154 $x63) $x67) (and (and $x154 $x63) $x68)) (ite $x67 $x172 $x173)))) - (let (($x143 (ite $x63 (ite $x67 (and (and $x62 $x63) $x67) (and (and $x62 $x63) $x68)) (ite $x67 (and $x111 $x67) $x127)))) - (let (($x61 (and $x57 $x59))) - (let (($x66 (and $x61 $x64))) - (let (($x91 (and $x66 $x68))) - (let (($x90 (and $x66 $x67))) - (let (($x107 (ite $x63 (ite $x67 (and (and $x61 $x63) $x67) (and (and $x61 $x63) $x68)) (ite $x67 $x90 $x91)))) - (let (($x431 (ite $x51 (ite $x55 (ite $x59 $x107 $x143) (ite $x59 $x189 $x225)) (ite $x55 (ite $x59 $x283 $x319) (ite $x59 $x365 $x401))))) - (let (($x3107 (ite $x38 (ite $x43 (ite $x47 $x431 $x797) (ite $x47 $x1179 $x1545)) (ite $x43 (ite $x47 $x1945 $x2311) (ite $x47 $x2693 $x3059))))) - (let (($x3111 (= standard_metadata.egress_spec (_ bv511 9)))) - (let (($x3171 (not $x3111))) - (and (and $x3171 $x3107) (= ?x3108 0))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) + (let (($x90 (and true (and true (= h1.fr (_ bv255 8)))))) + (let ((?x94 (ite $x90 0 (- 1)))) + (and (and (not (= standard_metadata.egress_spec (_ bv511 9))) true) (= ?x94 0))))) (check-sat) diff --git a/p4_symbolic/symbolic/table.cc b/p4_symbolic/symbolic/table.cc index 847e3e12..c4faeeb1 100644 --- a/p4_symbolic/symbolic/table.cc +++ b/p4_symbolic/symbolic/table.cc @@ -26,12 +26,14 @@ #include "absl/status/status.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" +#include "absl/strings/substitute.h" #include "absl/types/optional.h" #include "absl/types/span.h" #include "gutil/status.h" #include "p4/config/v1/p4info.pb.h" #include "p4_pdpi/internal/ordered_map.h" #include "p4_pdpi/ir.pb.h" +#include "p4_symbolic/ir/ir.h" #include "p4_symbolic/symbolic/action.h" #include "p4_symbolic/symbolic/operators.h" #include "p4_symbolic/symbolic/symbolic.h" @@ -464,13 +466,12 @@ absl::StatusOr EvaluateTable( translator, entry_assignment_guard)); } - // This table has been completely evaluated, the result of the evaluation - // is now in "state" and "match_index". - // Time to evaluate the next control construct. - std::string next_control; + const std::string &merge_point = table.table_implementation() + .optimized_symbolic_execution_info() + .merge_point(); - // We only support tables that always have the same next control construct - // regardless of the table's matches. + // We currenlt only support tables that always have the same next control + // construct regardless of the table's matches. // // This can be supported by calling EvaluateControl(...) // inside the above for loop for control found at @@ -480,29 +481,31 @@ absl::StatusOr EvaluateTable( // As an optimization, the loop should not call EvaluateControl // when all actions have the same next_control, and should instead // execute the call once outside the loop as below. - bool first = true; - for (const auto &[_, control] : + for (const auto &[_, next_control] : table.table_implementation().action_to_next_control()) { - if (first) { - next_control = control; - first = false; - } else if (next_control != control) { - return absl::UnimplementedError(absl::StrCat( - "Table \"", table_name, - "\" invokes different control constructs based on matched actions.")); + if (next_control != merge_point) { + return absl::UnimplementedError(absl::Substitute( + "Table '$0' invokes different control constructs based on matched", + table_name)); } } + const std::string continuation = table.table_implementation() + .optimized_symbolic_execution_info() + .continue_to_merge_point() + ? merge_point + : ir::EndOfPipeline(); + // Evaluate the next control. ASSIGN_OR_RETURN(SymbolicTableMatches result, - control::EvaluateControl(data_plane, next_control, state, + control::EvaluateControl(data_plane, continuation, state, translator, guard)); // The trace should not contain information for this table, otherwise, it // means we visited the table twice in the same execution path! if (result.contains(table_name)) { - return absl::InvalidArgumentError(absl::StrCat( - "Table \"", table_name, "\" was executed twice in the same path.")); + return absl::InternalError(absl::Substitute( + "Table '$0' was executed twice in the same path.", table_name)); } // Add this table's match to the trace, and return it. diff --git a/p4_symbolic/symbolic/util.cc b/p4_symbolic/symbolic/util.cc index cc5c1861..740e0816 100644 --- a/p4_symbolic/symbolic/util.cc +++ b/p4_symbolic/symbolic/util.cc @@ -18,7 +18,9 @@ #include +#include "absl/status/status.h" #include "absl/strings/str_format.h" +#include "absl/strings/substitute.h" #include "p4_pdpi/utils/ir.h" #include "p4_symbolic/symbolic/operators.h" #include "p4_symbolic/z3_util.h" @@ -137,12 +139,18 @@ absl::StatusOr MergeMatchesOnCondition( const SymbolicTableMatches &false_matches) { SymbolicTableMatches merged; - // Merge all tables matches in true_trace (including ones in both traces). + // Add all tables matches in true_trace. for (const auto &[name, true_match] : true_matches) { - // Find match in other trace (or use default). - SymbolicTableMatch false_match = false_matches.contains(name) - ? false_matches.at(name) - : DefaultTableMatch(); + // The table should not be applied in the other branch. + if (false_matches.contains(name)) { + return absl::InternalError( + absl::Substitute("Table '$0' was symbolically executed both in true " + "and false branches, this is not expected", + name)); + } + + // Get the default match for the false branch. + const SymbolicTableMatch false_match = DefaultTableMatch(); // Merge this match. ASSIGN_OR_RETURN( @@ -157,10 +165,18 @@ absl::StatusOr MergeMatchesOnCondition( }}); } - // Merge all tables matches in false_matches only. + // Add all tables matches in false_matches. for (const auto &[name, false_match] : false_matches) { - if (true_matches.contains(name)) continue; // Already covered. - SymbolicTableMatch true_match = DefaultTableMatch(); + // The table should not be applied in the other branch. + if (true_matches.contains(name)) { + return absl::InternalError( + absl::Substitute("Table '$0' was symbolically executed both in true " + "and false branches, this is not expected", + name)); + } + + // Get the default match for the true branch. + const SymbolicTableMatch true_match = DefaultTableMatch(); // Merge this match. ASSIGN_OR_RETURN( diff --git a/p4_symbolic/symbolic/util.h b/p4_symbolic/symbolic/util.h index 87a932cb..01eff0ba 100644 --- a/p4_symbolic/symbolic/util.h +++ b/p4_symbolic/symbolic/util.h @@ -50,8 +50,8 @@ absl::StatusOr ExtractFromModel( // Merges two maps of table matches into a single map. A field in the returned // map has the value of `true_matches` if the condition is true, and the -// value of `false_matches` otherwise. Assertion: both maps must contain -// matches for the same set of table names. +// value of `false_matches` otherwise. +// The two maps must contain disjoint keys, otherwise an error is returned. absl::StatusOr MergeMatchesOnCondition( const z3::expr &condition, const SymbolicTableMatches &true_matches, const SymbolicTableMatches &false_matches);