#pragma once #include #include #include #include namespace aisa { using regnum_t = std::uint_fast64_t; using regval_t = std::uint64_t; struct Step { std::optional> predicate; std::vector source_regs; std::vector destination_regs; std::optional predicate_reg() const { if (predicate.has_value()) return predicate->first; return {}; } std::optional expected_predicate_val() const { if (predicate.has_value()) return predicate->second; return {}; } virtual std::vector compute_destinations(const std::vector &source_vals) const = 0; }; }