blob: 1ce045d92d97e8cd2ff35ecef2460fdd0b327546 [file] [log] [blame]
Zane Shelley93b61ad2019-10-16 20:41:03 -05001#pragma once
2
Zane Shelley3a02e242020-05-08 16:25:36 -05003#include <hei_chip.hpp>
4#include <hei_types.hpp>
Zane Shelley93b61ad2019-10-16 20:41:03 -05005
6namespace libhei
7{
8
9/**
Zane Shelley6722b5b2020-05-12 22:09:04 -050010 * @brief A signature represents an active attention from a single bit position
11 * from an isolation node within a chip.
Zane Shelley93b61ad2019-10-16 20:41:03 -050012 *
13 * The isolator will gather a list of all active attentions on a chip and return
14 * a list of signatures to the user application. The user application should be
15 * able to determine what actions to take based on these signatures.
16 */
17class Signature
18{
19 public: // Constructors, destructor, assignment, etc.
Zane Shelley84533532020-06-11 15:20:50 -050020 /**
21 * @brief Default contructor.
22 *
23 * In general the default constructor should not be used, but it is needed
24 * for some STL functions.
25 */
Zane Shelleydc7baeb2020-06-11 14:28:46 -050026 Signature() = default;
27
Zane Shelley93b61ad2019-10-16 20:41:03 -050028 /**
29 * @brief Constructor from components.
30 * @param i_chip The chip containing this register.
Zane Shelley6722b5b2020-05-12 22:09:04 -050031 * @param i_id The node ID.
Zane Shelley93b61ad2019-10-16 20:41:03 -050032 * @param i_instance The instance of this register.
33 * @param i_bit The target bit within this register.
34 * @param i_attnType The attention type reported by this bit.
35 */
Zane Shelley6722b5b2020-05-12 22:09:04 -050036 Signature(const Chip& i_chip, NodeId_t i_id, Instance_t i_instance,
Zane Shelley13b182b2020-05-07 20:23:45 -050037 BitPosition_t i_bit, AttentionType_t i_attnType) :
Patrick Williams8db65db2024-08-16 15:22:30 -040038 iv_chip(i_chip), iv_id(i_id), iv_instance(i_instance), iv_bit(i_bit),
Zane Shelley7f7a42d2019-10-28 13:28:31 -050039 iv_attnType(i_attnType)
Zane Shelley93b61ad2019-10-16 20:41:03 -050040 {}
41
42 /** @brief Destructor. */
43 ~Signature() = default;
44
45 /** @brief Copy constructor. */
Zane Shelleyfe27b652019-10-28 11:33:07 -050046 Signature(const Signature&) = default;
Zane Shelley93b61ad2019-10-16 20:41:03 -050047
48 /** @brief Assignment operator. */
Zane Shelleyfe27b652019-10-28 11:33:07 -050049 Signature& operator=(const Signature&) = default;
Zane Shelley93b61ad2019-10-16 20:41:03 -050050
Zane Shelley7c8faa12019-10-28 22:26:28 -050051 private:
Zane Shelley5a78fa82022-09-16 16:49:58 -050052 Chip iv_chip; ///< Chip containing this register.
Patrick Williams2f7537d2023-05-10 07:51:39 -050053 NodeId_t iv_id = 0; ///< Node ID.
Zane Shelley5a78fa82022-09-16 16:49:58 -050054 Instance_t iv_instance = 0; ///< Instance of this register.
Patrick Williams2f7537d2023-05-10 07:51:39 -050055 BitPosition_t iv_bit = 0; ///< Target bit within this register.
Zane Shelley5a78fa82022-09-16 16:49:58 -050056
57 /** Attention type reported by this bit. */
Zane Shelleyb7005ca2023-03-24 15:23:59 -050058 AttentionType_t iv_attnType = ATTN_TYPE_CHIP_CS;
Zane Shelley93b61ad2019-10-16 20:41:03 -050059
60 public: // Member functions
Zane Shelley93b61ad2019-10-16 20:41:03 -050061 /** @return The chip containing this register. */
Zane Shelley7f7a42d2019-10-28 13:28:31 -050062 const Chip& getChip() const
63 {
64 return iv_chip;
65 }
Zane Shelley93b61ad2019-10-16 20:41:03 -050066
Zane Shelleyd280cca2020-11-13 17:08:24 -060067 /** @return The node ID. */
Zane Shelley6722b5b2020-05-12 22:09:04 -050068 NodeId_t getId() const
Zane Shelley7f7a42d2019-10-28 13:28:31 -050069 {
70 return iv_id;
71 }
Zane Shelley93b61ad2019-10-16 20:41:03 -050072
73 /** @return The instance of this register. */
Zane Shelley13b182b2020-05-07 20:23:45 -050074 Instance_t getInstance() const
Zane Shelley7f7a42d2019-10-28 13:28:31 -050075 {
76 return iv_instance;
77 }
Zane Shelley93b61ad2019-10-16 20:41:03 -050078
79 /** @return The target bit within this register. */
Zane Shelley13b182b2020-05-07 20:23:45 -050080 BitPosition_t getBit() const
Zane Shelley7f7a42d2019-10-28 13:28:31 -050081 {
82 return iv_bit;
83 }
Zane Shelley93b61ad2019-10-16 20:41:03 -050084
85 /** @return The attention type reported by this bit. */
Zane Shelley7f7a42d2019-10-28 13:28:31 -050086 AttentionType_t getAttnType() const
87 {
88 return iv_attnType;
89 }
Zane Shelley11b89942019-11-07 11:07:28 -060090
Zane Shelleyd280cca2020-11-13 17:08:24 -060091 /** @return A 32-bit integer containing the node ID, instance, and bit. This
92 * should be helpful for consistent logging and tracing. */
93 uint32_t toUint32() const
94 {
95 return getId() << 16 | getInstance() << 8 | getBit();
96 }
97
Zane Shelley11b89942019-11-07 11:07:28 -060098 public: // Operators
99 /** @brief Equals operator. */
100 bool operator==(const Signature& i_r) const
101 {
102 return (getChip() == i_r.getChip() && getId() == i_r.getId() &&
103 getInstance() == i_r.getInstance() &&
104 getBit() == i_r.getBit() && getAttnType() == i_r.getAttnType());
105 }
106
107 /** @brief Less than operator. */
108 bool operator<(const Signature& i_r) const
109 {
110 if (getChip() < i_r.getChip())
111 {
112 return true;
113 }
114 else if (getChip() == i_r.getChip())
115 {
116 if (getId() < i_r.getId())
117 {
118 return true;
119 }
120 else if (getId() == i_r.getId())
121 {
122 if (getInstance() < i_r.getInstance())
123 {
124 return true;
125 }
126 else if (getInstance() == i_r.getInstance())
127 {
128 if (getBit() < i_r.getBit())
129 {
130 return true;
131 }
132 else if (getBit() == i_r.getBit())
133 {
134 return (getAttnType() < i_r.getAttnType());
135 }
136 }
137 }
138 }
139
140 return false;
141 }
Zane Shelley93b61ad2019-10-16 20:41:03 -0500142};
143
144} // end namespace libhei