diff options
Diffstat (limited to 'utils/regtools/lib/soc_desc.hpp')
-rw-r--r-- | utils/regtools/lib/soc_desc.hpp | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/utils/regtools/lib/soc_desc.hpp b/utils/regtools/lib/soc_desc.hpp index 1b4985529c..bb8eb4ba8d 100644 --- a/utils/regtools/lib/soc_desc.hpp +++ b/utils/regtools/lib/soc_desc.hpp | |||
@@ -46,7 +46,7 @@ | |||
46 | */ | 46 | */ |
47 | 47 | ||
48 | #define SOCDESC_VERSION_MAJOR 1 | 48 | #define SOCDESC_VERSION_MAJOR 1 |
49 | #define SOCDESC_VERSION_MINOR 1 | 49 | #define SOCDESC_VERSION_MINOR 4 |
50 | #define SOCDESC_VERSION_REV 1 | 50 | #define SOCDESC_VERSION_REV 1 |
51 | 51 | ||
52 | #define SOCDESC_VERSION__(maj,min,rev) #maj"."#min"."#rev | 52 | #define SOCDESC_VERSION__(maj,min,rev) #maj"."#min"."#rev |
@@ -103,6 +103,7 @@ struct soc_reg_field_t | |||
103 | 103 | ||
104 | soc_reg_field_t():first_bit(0), last_bit(31) {} | 104 | soc_reg_field_t():first_bit(0), last_bit(31) {} |
105 | 105 | ||
106 | /** Return field bitmask in register */ | ||
106 | soc_word_t bitmask() const | 107 | soc_word_t bitmask() const |
107 | { | 108 | { |
108 | // WARNING beware of the case where first_bit=0 and last_bit=31 | 109 | // WARNING beware of the case where first_bit=0 and last_bit=31 |
@@ -112,11 +113,32 @@ struct soc_reg_field_t | |||
112 | return ((1 << (last_bit - first_bit + 1)) - 1) << first_bit; | 113 | return ((1 << (last_bit - first_bit + 1)) - 1) << first_bit; |
113 | } | 114 | } |
114 | 115 | ||
116 | /** Extract field value from register value */ | ||
117 | soc_word_t extract(soc_word_t reg_val) const | ||
118 | { | ||
119 | return (reg_val & bitmask()) >> first_bit; | ||
120 | } | ||
121 | |||
122 | /** Replace the field value in a register value */ | ||
123 | soc_word_t replace(soc_word_t reg_val, soc_word_t field_val) const | ||
124 | { | ||
125 | return (reg_val & ~bitmask()) | ((field_val << first_bit) & bitmask()); | ||
126 | } | ||
127 | |||
115 | bool is_reserved() const | 128 | bool is_reserved() const |
116 | { | 129 | { |
117 | return name.substr(0, 4) == "RSVD" || name.substr(0, 5) == "RSRVD"; | 130 | return name.substr(0, 4) == "RSVD" || name.substr(0, 5) == "RSRVD"; |
118 | } | 131 | } |
119 | 132 | ||
133 | /** Return field value index, or -1 if none */ | ||
134 | int find_value(soc_word_t v) const | ||
135 | { | ||
136 | for(size_t i = 0; i < value.size(); i++) | ||
137 | if(value[i].value == v) | ||
138 | return i; | ||
139 | return -1; | ||
140 | } | ||
141 | |||
120 | std::vector< soc_reg_field_value_t > value; | 142 | std::vector< soc_reg_field_value_t > value; |
121 | 143 | ||
122 | std::vector< soc_error_t > errors(bool recursive); | 144 | std::vector< soc_error_t > errors(bool recursive); |