#ifndef INSTRUCTION_H #define INSTRUCTION_H #include #include namespace machine { class Instruction { public: Instruction(); Instruction(std::uint32_t inst); Instruction(std::uint8_t opcode, std::uint8_t rs, std::uint8_t rt, std::uint8_t rd, std::uint8_t shamt, std::uint8_t funct); // Type R Instruction(std::uint8_t opcode, std::uint8_t rs, std::uint8_t rt, std::uint16_t immediate); // Type I Instruction(std::uint8_t opcode, std::uint32_t address); // Type J Instruction(const Instruction&); enum Type { T_R, T_I, T_J, T_UNKNOWN }; std::uint8_t opcode() const; std::uint8_t rs() const; std::uint8_t rt() const; std::uint8_t rd() const; std::uint8_t shamt() const; std::uint8_t funct() const; std::uint16_t immediate() const; std::uint32_t address() const; std::uint32_t data() const; enum Type type() const; bool is_store() const; // Store instructions requires some additional handling so identify them bool operator==(const Instruction &c) const; bool operator!=(const Instruction &c) const; Instruction &operator=(const Instruction &c); QString to_str() const; private: std::uint32_t dt; }; } Q_DECLARE_METATYPE(machine::Instruction) #endif // INSTRUCTION_H