| #pragma once |
| |
| #include <hei_chip.hpp> |
| #include <hei_types.hpp> |
| |
| namespace libhei |
| { |
| |
| /** |
| * @brief A signature represents an active attention from a single bit position |
| * from an isolation node within a chip. |
| * |
| * The isolator will gather a list of all active attentions on a chip and return |
| * a list of signatures to the user application. The user application should be |
| * able to determine what actions to take based on these signatures. |
| */ |
| class Signature |
| { |
| public: // Constructors, destructor, assignment, etc. |
| /** |
| * @brief Default contructor. |
| * |
| * In general the default constructor should not be used, but it is needed |
| * for some STL functions. |
| */ |
| Signature() = default; |
| |
| /** |
| * @brief Constructor from components. |
| * @param i_chip The chip containing this register. |
| * @param i_id The node ID. |
| * @param i_instance The instance of this register. |
| * @param i_bit The target bit within this register. |
| * @param i_attnType The attention type reported by this bit. |
| */ |
| Signature(const Chip& i_chip, NodeId_t i_id, Instance_t i_instance, |
| BitPosition_t i_bit, AttentionType_t i_attnType) : |
| iv_chip(i_chip), iv_id(i_id), iv_instance(i_instance), iv_bit(i_bit), |
| iv_attnType(i_attnType) |
| {} |
| |
| /** @brief Destructor. */ |
| ~Signature() = default; |
| |
| /** @brief Copy constructor. */ |
| Signature(const Signature&) = default; |
| |
| /** @brief Assignment operator. */ |
| Signature& operator=(const Signature&) = default; |
| |
| private: |
| Chip iv_chip; ///< Chip containing this register. |
| NodeId_t iv_id = 0; ///< Node ID. |
| Instance_t iv_instance = 0; ///< Instance of this register. |
| BitPosition_t iv_bit = 0; ///< Target bit within this register. |
| |
| /** Attention type reported by this bit. */ |
| AttentionType_t iv_attnType = ATTN_TYPE_CHIP_CS; |
| |
| public: // Member functions |
| /** @return The chip containing this register. */ |
| const Chip& getChip() const |
| { |
| return iv_chip; |
| } |
| |
| /** @return The node ID. */ |
| NodeId_t getId() const |
| { |
| return iv_id; |
| } |
| |
| /** @return The instance of this register. */ |
| Instance_t getInstance() const |
| { |
| return iv_instance; |
| } |
| |
| /** @return The target bit within this register. */ |
| BitPosition_t getBit() const |
| { |
| return iv_bit; |
| } |
| |
| /** @return The attention type reported by this bit. */ |
| AttentionType_t getAttnType() const |
| { |
| return iv_attnType; |
| } |
| |
| /** @return A 32-bit integer containing the node ID, instance, and bit. This |
| * should be helpful for consistent logging and tracing. */ |
| uint32_t toUint32() const |
| { |
| return getId() << 16 | getInstance() << 8 | getBit(); |
| } |
| |
| public: // Operators |
| /** @brief Equals operator. */ |
| bool operator==(const Signature& i_r) const |
| { |
| return (getChip() == i_r.getChip() && getId() == i_r.getId() && |
| getInstance() == i_r.getInstance() && |
| getBit() == i_r.getBit() && getAttnType() == i_r.getAttnType()); |
| } |
| |
| /** @brief Less than operator. */ |
| bool operator<(const Signature& i_r) const |
| { |
| if (getChip() < i_r.getChip()) |
| { |
| return true; |
| } |
| else if (getChip() == i_r.getChip()) |
| { |
| if (getId() < i_r.getId()) |
| { |
| return true; |
| } |
| else if (getId() == i_r.getId()) |
| { |
| if (getInstance() < i_r.getInstance()) |
| { |
| return true; |
| } |
| else if (getInstance() == i_r.getInstance()) |
| { |
| if (getBit() < i_r.getBit()) |
| { |
| return true; |
| } |
| else if (getBit() == i_r.getBit()) |
| { |
| return (getAttnType() < i_r.getAttnType()); |
| } |
| } |
| } |
| } |
| |
| return false; |
| } |
| }; |
| |
| } // end namespace libhei |