1use serde::{Deserialize, Serialize};
18use std::collections::BTreeMap;
19
20#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
21#[serde(tag = "_type")]
22pub enum RegisterEntry {
23 Register(Register),
24 RegisterArray(RegisterArray),
25 RegisterBlock(RegisterBlock),
26}
27
28#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
29pub struct Register {
30 #[serde(rename = "_meta")]
31 pub meta: Option<Meta>,
32 pub access_text: Option<String>,
33 pub accessors: Vec<Accessor>,
34 pub condition: Condition,
35 pub configuration: Option<String>,
36 pub fieldsets: Vec<Fieldset>,
37 pub groups: Option<()>,
38 pub instances: Instances,
39 pub mapset: Vec<()>,
40 pub name: String,
41 pub purpose: Option<String>,
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub state: Option<ExecutionState>,
44 pub title: Option<String>,
45}
46
47#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
48pub struct Meta {
49 pub license: License,
50 pub version: Version,
51}
52
53#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
54pub struct License {
55 pub copyright: String,
56 pub info: String,
57}
58
59#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
60pub struct Version {
61 pub architecture: String,
62 pub build: String,
63 #[serde(rename = "ref")]
64 pub ref_: String,
65 pub schema: String,
66 pub timestamp: String,
67}
68
69#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
70pub enum ExecutionState {
71 AArch32,
72 AArch64,
73 #[serde(rename = "ext")]
74 External,
75}
76
77#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
78pub struct Accessor {}
79
80#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
81pub struct Condition {}
82
83#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
84pub struct Fieldset {
85 pub condition: Condition,
86 pub description: Description,
87 pub display: Option<String>,
88 pub name: Option<String>,
89 pub values: Vec<FieldEntry>,
90 pub width: u32,
91}
92
93#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
94#[serde(tag = "_type")]
95pub enum FieldEntry {
96 #[serde(rename = "Fields.Field")]
97 Field(Field),
98 #[serde(rename = "Fields.Reserved")]
99 Reserved(ReservedField),
100 #[serde(rename = "Fields.ImplementationDefined")]
101 ImplementationDefined(ImplementationDefinedField),
102 #[serde(rename = "Fields.Array")]
103 Array(ArrayField),
104 #[serde(rename = "Fields.Vector")]
105 Vector(VectorField),
106 #[serde(rename = "Fields.ConditionalField")]
107 ConditionalField(ConditionalField),
108 #[serde(rename = "Fields.ConstantField")]
109 ConstantField(ConstantField),
110 #[serde(rename = "Fields.Dynamic")]
111 Dynamic(DynamicField),
112}
113
114#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
115pub struct Field {
116 pub description: Description,
117 pub name: Option<String>,
118 pub rangeset: Vec<Range>,
119 pub resets: Option<FieldResets>,
120 pub values: Option<Values>,
121 pub volatile: Option<bool>,
122}
123
124#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
125pub struct ReservedField {
126 pub description: Description,
127 pub rangeset: Vec<Range>,
128 pub value: String,
129}
130
131#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
132pub struct ImplementationDefinedField {
133 pub constraints: Option<Vec<()>>,
134 pub description: Description,
135 pub display: Option<String>,
136 pub name: Option<String>,
137 pub rangeset: Vec<Range>,
138 pub resets: Option<FieldResets>,
139 pub volatile: Option<bool>,
140}
141
142#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
143pub struct ArrayField {
144 pub access: Option<()>,
145 pub description: Description,
146 pub display: Option<String>,
147 pub index_variable: String,
148 pub indexes: Vec<Range>,
149 pub name: Option<String>,
150 pub rangeset: Vec<Range>,
151 pub resets: Option<FieldResets>,
152 pub values: Option<Values>,
153 pub volatile: Option<bool>,
154}
155
156#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
157pub struct VectorField {
158 pub access: Option<()>,
159 pub description: Description,
160 pub display: Option<String>,
161 pub index_variable: String,
162 pub indexes: Vec<Range>,
163 pub name: Option<String>,
164 pub rangeset: Vec<Range>,
165 pub reserved_type: Option<String>,
166 pub resets: Option<FieldResets>,
167 pub size: Vec<ConditionValue>,
168 pub values: Option<Values>,
169 pub volatile: Option<bool>,
170}
171
172#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
173pub struct ConditionValue {
174 pub condition: Condition,
175 pub value: AstValue,
176}
177
178#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
179pub struct AstValue {}
180
181#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
182pub struct ConditionalField {
183 pub description: Description,
184 pub display: Option<String>,
185 pub fields: Vec<FieldCondition>,
186 pub name: Option<String>,
187 pub rangeset: Vec<Range>,
188 pub reservedtype: String,
189 pub resets: Option<FieldResets>,
190 pub volatile: Option<bool>,
191}
192
193#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
194pub struct FieldCondition {
195 pub condition: Condition,
196 pub field: FieldEntry,
197}
198
199#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
200pub struct ConstantField {
201 pub access: Option<()>,
202 pub description: Description,
203 pub name: Option<String>,
204 pub rangeset: Vec<Range>,
205 pub resets: Option<FieldResets>,
206 pub value: ValueEntry,
207}
208
209#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
210pub struct DynamicField {
211 pub description: Description,
212 pub display: Option<String>,
213 pub instances: Vec<Fieldset>,
214 pub name: Option<String>,
215 pub rangeset: Vec<Range>,
216 pub resets: Option<FieldResets>,
217 pub volatile: Option<bool>,
218}
219
220#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
221pub struct Description {
222 pub after: Option<String>,
223 pub before: Option<String>,
224}
225
226#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
227pub struct Range {
228 pub start: u32,
229 pub width: u32,
230}
231
232#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
233pub struct FieldResets {}
234
235#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
236pub struct Values {
237 pub values: Vec<ValueEntry>,
238}
239
240#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
241#[serde(tag = "_type")]
242pub enum ValueEntry {
243 #[serde(rename = "Values.ConditionalValue")]
244 ConditionalValue(ConditionalValue),
245 #[serde(rename = "Values.EquationValue")]
246 EquationValue(EquationValue),
247 #[serde(rename = "Values.Group")]
248 Group(Group),
249 #[serde(rename = "Values.ImplementationDefined")]
250 ImplementationDefined(ImplementationDefinedValue),
251 #[serde(rename = "Values.Link")]
252 Link(Link),
253 #[serde(rename = "Values.NamedValue")]
254 NamedValue(NamedValue),
255 #[serde(rename = "Values.Value")]
256 Value(Value),
257 #[serde(rename = "Values.ValueRange")]
258 ValueRange(ValueRange),
259}
260
261#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
262pub struct ConditionalValue {
263 pub condition: Condition,
264 pub meaning: Option<String>,
265 pub values: Values,
266}
267
268#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
269pub struct EquationValue {
270 pub meaning: Option<String>,
271 pub slice: Vec<Range>,
272 pub value: String,
273}
274
275#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
276pub struct Group {
277 pub meaning: Option<String>,
278 pub value: String,
279 pub values: Values,
280}
281
282#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
283pub struct Link {
284 pub links: BTreeMap<String, String>,
285 pub meaning: Option<String>,
286 pub value: String,
287}
288
289#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
290pub struct NamedValue {
291 pub meaning: Option<String>,
292 pub name: String,
293 pub value: String,
294}
295
296#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
297pub struct Value {
298 pub meaning: Option<String>,
299 pub value: String,
300}
301
302#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
303pub struct ImplementationDefinedValue {
304 pub constraints: Option<Values>,
305 pub meaning: Option<String>,
306}
307
308#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
309pub struct ValueRange {
310 pub end: Value,
311 pub meaning: Option<String>,
312 pub start: Value,
313}
314
315#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
316pub struct RegisterArray {
317 #[serde(rename = "_meta")]
318 pub meta: Option<Meta>,
319 pub access_text: Option<String>,
320 pub accessors: Vec<Accessor>,
321 pub condition: Condition,
322 pub configuration: Option<String>,
323 pub fieldsets: Vec<Fieldset>,
324 pub groups: Option<()>,
325 pub index_variable: String,
326 pub indexes: Vec<Range>,
327 pub instances: Instances,
328 pub mapset: Vec<()>,
329 pub name: String,
330 pub purpose: Option<String>,
331 #[serde(skip_serializing_if = "Option::is_none")]
332 pub state: Option<ExecutionState>,
333 pub title: Option<String>,
334}
335
336#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
337#[serde(untagged)]
338pub enum Instances {
339 InstanceSet(InstanceSet),
340 Bool(bool),
341}
342
343#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
344pub struct InstanceSet {
345 pub values: Vec<Instance>,
346}
347
348#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
349pub struct Instance {
350 pub condition: Condition,
351 pub instance: String,
352}
353
354#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
355pub struct RegisterBlock {
356 #[serde(rename = "_meta")]
357 pub meta: Meta,
358 pub accessors: Vec<Accessor>,
359 pub blocks: Vec<RegisterEntry>,
360 pub condition: Condition,
361 pub default_access: ReadWriteAccess,
362 pub mapset: Vec<()>,
363 pub name: String,
364 pub purpose: Option<String>,
365 pub references: References,
366 pub size: String,
367 pub title: Option<String>,
368}
369
370#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
371pub struct ReadWriteAccess {
372 pub read: String,
373 pub write: String,
374}
375
376#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
377pub struct References {}