diff options
Diffstat (limited to 'utils/regtools/lib/soc_desc.hpp')
-rw-r--r-- | utils/regtools/lib/soc_desc.hpp | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/utils/regtools/lib/soc_desc.hpp b/utils/regtools/lib/soc_desc.hpp index efaf813eb2..d9dbf0cc20 100644 --- a/utils/regtools/lib/soc_desc.hpp +++ b/utils/regtools/lib/soc_desc.hpp | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <vector> | 25 | #include <vector> |
26 | #include <list> | 26 | #include <list> |
27 | #include <string> | 27 | #include <string> |
28 | #include <map> | ||
28 | 29 | ||
29 | /** | 30 | /** |
30 | * These data structures represent the SoC register in a convenient way. | 31 | * These data structures represent the SoC register in a convenient way. |
@@ -50,6 +51,21 @@ typedef uint32_t soc_addr_t; | |||
50 | typedef uint32_t soc_word_t; | 51 | typedef uint32_t soc_word_t; |
51 | typedef uint32_t soc_reg_flags_t; | 52 | typedef uint32_t soc_reg_flags_t; |
52 | 53 | ||
54 | /** SoC error gravity level */ | ||
55 | enum soc_error_level_t | ||
56 | { | ||
57 | SOC_ERROR_WARNING, | ||
58 | SOC_ERROR_FATAL, | ||
59 | }; | ||
60 | |||
61 | /** SoC description error */ | ||
62 | struct soc_error_t | ||
63 | { | ||
64 | soc_error_level_t level; /// level (warning, fatal, ...) | ||
65 | std::string location; /// human description of the location | ||
66 | std::string message; /// message | ||
67 | }; | ||
68 | |||
53 | /** SoC register generic formula */ | 69 | /** SoC register generic formula */ |
54 | enum soc_reg_formula_type_t | 70 | enum soc_reg_formula_type_t |
55 | { | 71 | { |
@@ -66,6 +82,8 @@ struct soc_reg_field_value_t | |||
66 | std::string name; /// name of the value | 82 | std::string name; /// name of the value |
67 | soc_word_t value; /// numeric value | 83 | soc_word_t value; /// numeric value |
68 | std::string desc; /// human description | 84 | std::string desc; /// human description |
85 | |||
86 | std::vector< soc_error_t > errors(bool recursive); | ||
69 | }; | 87 | }; |
70 | 88 | ||
71 | /** SoC register field */ | 89 | /** SoC register field */ |
@@ -90,6 +108,8 @@ struct soc_reg_field_t | |||
90 | } | 108 | } |
91 | 109 | ||
92 | std::vector< soc_reg_field_value_t > value; | 110 | std::vector< soc_reg_field_value_t > value; |
111 | |||
112 | std::vector< soc_error_t > errors(bool recursive); | ||
93 | }; | 113 | }; |
94 | 114 | ||
95 | /** SoC register address */ | 115 | /** SoC register address */ |
@@ -97,6 +117,8 @@ struct soc_reg_addr_t | |||
97 | { | 117 | { |
98 | std::string name; /// actual register name | 118 | std::string name; /// actual register name |
99 | soc_addr_t addr; /// actual register address (relative to device) | 119 | soc_addr_t addr; /// actual register address (relative to device) |
120 | |||
121 | std::vector< soc_error_t > errors(bool recursive); | ||
100 | }; | 122 | }; |
101 | 123 | ||
102 | /** SoC register formula */ | 124 | /** SoC register formula */ |
@@ -104,6 +126,8 @@ struct soc_reg_formula_t | |||
104 | { | 126 | { |
105 | enum soc_reg_formula_type_t type; | 127 | enum soc_reg_formula_type_t type; |
106 | std::string string; /// for STRING | 128 | std::string string; /// for STRING |
129 | |||
130 | std::vector< soc_error_t > errors(bool recursive); | ||
107 | }; | 131 | }; |
108 | 132 | ||
109 | /** SoC register */ | 133 | /** SoC register */ |
@@ -116,6 +140,8 @@ struct soc_reg_t | |||
116 | soc_reg_flags_t flags; /// ORed value | 140 | soc_reg_flags_t flags; /// ORed value |
117 | 141 | ||
118 | std::vector< soc_reg_field_t > field; | 142 | std::vector< soc_reg_field_t > field; |
143 | |||
144 | std::vector< soc_error_t > errors(bool recursive); | ||
119 | }; | 145 | }; |
120 | 146 | ||
121 | /** Soc device address */ | 147 | /** Soc device address */ |
@@ -123,6 +149,8 @@ struct soc_dev_addr_t | |||
123 | { | 149 | { |
124 | std::string name; /// actual device name | 150 | std::string name; /// actual device name |
125 | soc_addr_t addr; | 151 | soc_addr_t addr; |
152 | |||
153 | std::vector< soc_error_t > errors(bool recursive); | ||
126 | }; | 154 | }; |
127 | 155 | ||
128 | /** SoC device */ | 156 | /** SoC device */ |
@@ -135,6 +163,8 @@ struct soc_dev_t | |||
135 | std::vector< soc_dev_addr_t > addr; | 163 | std::vector< soc_dev_addr_t > addr; |
136 | 164 | ||
137 | std::vector< soc_reg_t > reg; | 165 | std::vector< soc_reg_t > reg; |
166 | |||
167 | std::vector< soc_error_t > errors(bool recursive); | ||
138 | }; | 168 | }; |
139 | 169 | ||
140 | /** SoC */ | 170 | /** SoC */ |
@@ -144,10 +174,23 @@ struct soc_t | |||
144 | std::string desc; /// SoC name | 174 | std::string desc; /// SoC name |
145 | 175 | ||
146 | std::vector< soc_dev_t > dev; | 176 | std::vector< soc_dev_t > dev; |
177 | |||
178 | std::vector< soc_error_t > errors(bool recursive); | ||
147 | }; | 179 | }; |
148 | 180 | ||
149 | /** Parse a SoC description from a XML file, append it to <soc>. A file | 181 | /** Parse a SoC description from a XML file, append it to <soc>. */ |
150 | * can contain multiple SoC descriptions */ | 182 | bool soc_desc_parse_xml(const std::string& filename, soc_t& soc); |
151 | bool soc_desc_parse_xml(const std::string& filename, std::vector< soc_t >& soc); | 183 | /** Write a SoC description to a XML file, overwriting it. A file can contain |
184 | * multiple Soc descriptions */ | ||
185 | bool soc_desc_produce_xml(const std::string& filename, const soc_t& soc); | ||
186 | /** Normalise a soc description by reordering elemnts so that: | ||
187 | * - devices are sorted by first name | ||
188 | * - registers are sorted by first address | ||
189 | * - fields are sorted by last bit | ||
190 | * - values are sorted by value */ | ||
191 | void soc_desc_normalize(soc_t& soc); | ||
192 | /** Formula parser: try to parse and evaluate a formula to a specific value of 'n' */ | ||
193 | bool soc_desc_evaluate_formula(const std::string& formula, | ||
194 | const std::map< std::string, soc_word_t>& var, soc_word_t& result, std::string& error); | ||
152 | 195 | ||
153 | #endif /* __SOC_DESC__ */ \ No newline at end of file | 196 | #endif /* __SOC_DESC__ */ \ No newline at end of file |