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)]
78#[serde(tag = "_type")]
79pub enum Accessor {
80 #[serde(rename = "Accessors.SystemAccessor")]
81 SystemAccessor(SystemAccessor),
82 #[serde(rename = "Accessors.SystemAccessorArray")]
83 SystemAccessorArray(SystemAccessorArray),
84 #[serde(rename = "Accessors.BlockAccess")]
85 BlockAccess(BlockAccess),
86 #[serde(rename = "Accessors.BlockAccessArray")]
87 BlockAccessArray(BlockAccessArray),
88 #[serde(rename = "Accessors.ExternalDebug")]
89 ExternalDebug(ExternalDebug),
90 #[serde(rename = "Accessors.MemoryMapped")]
91 MemoryMapped(MemoryMapped),
92}
93
94#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
95pub struct SystemAccessor {
96 pub access: Option<SystemAccess>,
97 pub condition: Condition,
98 pub encoding: Vec<Encoding>,
99 pub name: String,
100}
101
102#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
103pub struct SystemAccessorArray {
104 pub access: Option<SystemAccess>,
105 pub condition: Condition,
106 pub encoding: Vec<Encoding>,
107 pub index_variable: String,
108 pub indexes: Vec<Range>,
109 pub name: String,
110}
111
112#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
113pub struct BlockAccess {
114 pub access: MemoryAccess,
115 pub condition: Condition,
116 pub offset: Vec<Offset>,
117 pub references: References,
118}
119
120#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
121pub struct BlockAccessArray {
122 pub access: MemoryAccess,
123 pub condition: Condition,
124 pub index_variable: String,
125 pub indexes: Vec<Range>,
126 pub offset: Vec<Offset>,
127 pub references: References,
128}
129
130#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
131pub struct ExternalDebug {
132 pub access: MemoryAccess,
133 pub component: String,
134 pub condition: Condition,
135 pub instance: Option<String>,
136 pub offset: Offset,
137 pub power_domain: Option<String>,
138 pub range: Option<Range>,
139}
140
141#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
142pub struct MemoryMapped {
143 pub access: MemoryAccess,
144 pub component: String,
145 pub condition: Condition,
146 pub frame: Option<String>,
147 pub instance: Option<String>,
148 pub offset: Offset,
149 pub power_domain: Option<String>,
150 pub range: Option<Range>,
151}
152
153#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
154pub struct MemoryAccess {}
155
156#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
157pub struct Offset {}
158
159#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
160pub struct SystemAccess {
161 pub access: Vec<Access>,
162 pub condition: Condition,
163}
164
165#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
166pub struct Access {}
167
168#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
169pub struct Encoding {
170 pub asmvalue: Option<String>,
171 pub encodings: BTreeMap<String, Value>,
172}
173
174#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
175pub struct Condition {}
176
177#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
178pub struct Fieldset {
179 pub condition: Condition,
180 pub description: Description,
181 pub display: Option<String>,
182 pub name: Option<String>,
183 pub values: Vec<FieldEntry>,
184 pub width: u32,
185}
186
187#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
188#[serde(tag = "_type")]
189pub enum FieldEntry {
190 #[serde(rename = "Fields.Field")]
191 Field(Field),
192 #[serde(rename = "Fields.Reserved")]
193 Reserved(ReservedField),
194 #[serde(rename = "Fields.ImplementationDefined")]
195 ImplementationDefined(ImplementationDefinedField),
196 #[serde(rename = "Fields.Array")]
197 Array(ArrayField),
198 #[serde(rename = "Fields.Vector")]
199 Vector(VectorField),
200 #[serde(rename = "Fields.ConditionalField")]
201 ConditionalField(ConditionalField),
202 #[serde(rename = "Fields.ConstantField")]
203 ConstantField(ConstantField),
204 #[serde(rename = "Fields.Dynamic")]
205 Dynamic(DynamicField),
206}
207
208#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
209pub struct Field {
210 pub description: Description,
211 pub name: Option<String>,
212 pub rangeset: Vec<Range>,
213 pub resets: Option<FieldResets>,
214 pub values: Option<Values>,
215 pub volatile: Option<bool>,
216}
217
218#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
219pub struct ReservedField {
220 pub description: Description,
221 pub rangeset: Vec<Range>,
222 pub value: String,
223}
224
225#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
226pub struct ImplementationDefinedField {
227 pub constraints: Option<Vec<()>>,
228 pub description: Description,
229 pub display: Option<String>,
230 pub name: Option<String>,
231 pub rangeset: Vec<Range>,
232 pub resets: Option<FieldResets>,
233 pub volatile: Option<bool>,
234}
235
236#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
237pub struct ArrayField {
238 pub access: Option<()>,
239 pub description: Description,
240 pub display: Option<String>,
241 pub index_variable: String,
242 pub indexes: Vec<Range>,
243 pub name: Option<String>,
244 pub rangeset: Vec<Range>,
245 pub resets: Option<FieldResets>,
246 pub values: Option<Values>,
247 pub volatile: Option<bool>,
248}
249
250#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
251pub struct VectorField {
252 pub access: Option<()>,
253 pub description: Description,
254 pub display: Option<String>,
255 pub index_variable: String,
256 pub indexes: Vec<Range>,
257 pub name: Option<String>,
258 pub rangeset: Vec<Range>,
259 pub reserved_type: Option<String>,
260 pub resets: Option<FieldResets>,
261 pub size: Vec<ConditionValue>,
262 pub values: Option<Values>,
263 pub volatile: Option<bool>,
264}
265
266#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
267pub struct ConditionValue {
268 pub condition: Condition,
269 pub value: AstValue,
270}
271
272#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
273pub struct AstValue {}
274
275#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
276pub struct ConditionalField {
277 pub description: Description,
278 pub display: Option<String>,
279 pub fields: Vec<FieldCondition>,
280 pub name: Option<String>,
281 pub rangeset: Vec<Range>,
282 pub reservedtype: String,
283 pub resets: Option<FieldResets>,
284 pub volatile: Option<bool>,
285}
286
287#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
288pub struct FieldCondition {
289 pub condition: Condition,
290 pub field: FieldEntry,
291}
292
293#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
294pub struct ConstantField {
295 pub access: Option<()>,
296 pub description: Description,
297 pub name: Option<String>,
298 pub rangeset: Vec<Range>,
299 pub resets: Option<FieldResets>,
300 pub value: ValueEntry,
301}
302
303#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
304pub struct DynamicField {
305 pub description: Description,
306 pub display: Option<String>,
307 pub instances: Vec<Fieldset>,
308 pub name: Option<String>,
309 pub rangeset: Vec<Range>,
310 pub resets: Option<FieldResets>,
311 pub volatile: Option<bool>,
312}
313
314#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
315pub struct Description {
316 pub after: Option<String>,
317 pub before: Option<String>,
318}
319
320#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
321pub struct Range {
322 pub start: u32,
323 pub width: u32,
324}
325
326#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
327pub struct FieldResets {}
328
329#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
330pub struct Values {
331 pub values: Vec<ValueEntry>,
332}
333
334#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
335#[serde(tag = "_type")]
336pub enum ValueEntry {
337 #[serde(rename = "Values.ConditionalValue")]
338 ConditionalValue(ConditionalValue),
339 #[serde(rename = "Values.EquationValue")]
340 EquationValue(EquationValue),
341 #[serde(rename = "Values.Group")]
342 Group(Group),
343 #[serde(rename = "Values.ImplementationDefined")]
344 ImplementationDefined(ImplementationDefinedValue),
345 #[serde(rename = "Values.Link")]
346 Link(Link),
347 #[serde(rename = "Values.NamedValue")]
348 NamedValue(NamedValue),
349 #[serde(rename = "Values.Value")]
350 Value(Value),
351 #[serde(rename = "Values.ValueRange")]
352 ValueRange(ValueRange),
353}
354
355#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
356pub struct ConditionalValue {
357 pub condition: Condition,
358 pub meaning: Option<String>,
359 pub values: Values,
360}
361
362#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
363pub struct EquationValue {
364 pub meaning: Option<String>,
365 pub slice: Vec<Range>,
366 pub value: String,
367}
368
369#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
370pub struct Group {
371 pub meaning: Option<String>,
372 pub value: String,
373 pub values: Values,
374}
375
376#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
377pub struct Link {
378 pub links: BTreeMap<String, String>,
379 pub meaning: Option<String>,
380 pub value: String,
381}
382
383#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
384pub struct NamedValue {
385 pub meaning: Option<String>,
386 pub name: String,
387 pub value: String,
388}
389
390#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
391pub struct Value {
392 pub meaning: Option<String>,
393 pub value: String,
394}
395
396#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
397pub struct ImplementationDefinedValue {
398 pub constraints: Option<Values>,
399 pub meaning: Option<String>,
400}
401
402#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
403pub struct ValueRange {
404 pub end: Value,
405 pub meaning: Option<String>,
406 pub start: Value,
407}
408
409#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
410pub struct RegisterArray {
411 #[serde(rename = "_meta")]
412 pub meta: Option<Meta>,
413 pub access_text: Option<String>,
414 pub accessors: Vec<Accessor>,
415 pub condition: Condition,
416 pub configuration: Option<String>,
417 pub fieldsets: Vec<Fieldset>,
418 pub groups: Option<()>,
419 pub index_variable: String,
420 pub indexes: Vec<Range>,
421 pub instances: Instances,
422 pub mapset: Vec<()>,
423 pub name: String,
424 pub purpose: Option<String>,
425 #[serde(skip_serializing_if = "Option::is_none")]
426 pub state: Option<ExecutionState>,
427 pub title: Option<String>,
428}
429
430#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
431#[serde(untagged)]
432pub enum Instances {
433 InstanceSet(InstanceSet),
434 Bool(bool),
435}
436
437#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
438pub struct InstanceSet {
439 pub values: Vec<Instance>,
440}
441
442#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
443pub struct Instance {
444 pub condition: Condition,
445 pub instance: String,
446}
447
448#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
449pub struct RegisterBlock {
450 #[serde(rename = "_meta")]
451 pub meta: Meta,
452 pub accessors: Vec<Accessor>,
453 pub blocks: Vec<RegisterEntry>,
454 pub condition: Condition,
455 pub default_access: ReadWriteAccess,
456 pub mapset: Vec<()>,
457 pub name: String,
458 pub purpose: Option<String>,
459 pub references: References,
460 pub size: String,
461 pub title: Option<String>,
462}
463
464#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
465pub struct ReadWriteAccess {
466 pub read: String,
467 pub write: String,
468}
469
470#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
471pub struct References {}