#pragma once #include #include #include #include #include "stmt_base.hpp" #include "stmt_ins.hpp" #include "ins.hpp" namespace dsp { namespace op { using op_t = std::variant; struct control_word_t : stmt_accept_t, ins_t { control_word_t(std::vector ops) : ops(ops) { } std::vector build_ops(uint32_t code) { std::vector ops; if (andl_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (orl_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (xorl_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (add_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (sub_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (ad2_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (sr_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (rr_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (sl_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (rl_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (rl8_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (mov_ram_x_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (mov_mul_p_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (mov_ram_p_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (mov_ram_y_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (clr_a_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (mov_alu_a_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (mov_ram_a_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (mov_imm_d1_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); if (mov_ram_d1_t::pred(code)) ops.emplace_back(op_t{std::in_place_type, code}); return ops; } control_word_t(uint32_t code) : ops(build_ops(code)) {} const std::vector ops; static constexpr uint32_t mask() { return 0b11 << 30; } static constexpr uint32_t code() { return 0b00 << 30; } static constexpr uint32_t bits() { return 0; } }; } }