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: Expression,
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 #[serde(rename = "Accessors.ImplementationDefinedOffsetAccessor")]
93 ImplementationDefinedOffsetAccessor(ImplementationDefinedOffsetAccessor),
94 #[serde(rename = "Accessors.ImplementationDefinedOffsetAccessorArray")]
95 ImplementationDefinedOffsetAccessorArray(ImplementationDefinedOffsetAccessorArray),
96}
97
98#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
99pub struct SystemAccessor {
100 pub access: Option<SystemAccess>,
101 pub condition: Expression,
102 pub encoding: Vec<Encoding>,
103 pub name: String,
104}
105
106#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
107pub struct SystemAccessorArray {
108 pub access: Option<SystemAccess>,
109 pub condition: Expression,
110 pub encoding: Vec<Encoding>,
111 pub index_variable: String,
112 pub indexes: Vec<Range>,
113 pub name: String,
114}
115
116#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
117pub struct BlockAccess {
118 pub access: MemoryAccess,
119 pub condition: Expression,
120 pub offset: Vec<Expression>,
121 pub references: References,
122}
123
124#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
125pub struct BlockAccessArray {
126 pub access: MemoryAccess,
127 pub condition: Expression,
128 pub index_variable: String,
129 pub indexes: Vec<Range>,
130 pub offset: Vec<Expression>,
131 pub references: References,
132}
133
134#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
135pub struct ExternalDebug {
136 pub access: MemoryAccess,
137 pub component: String,
138 pub condition: Expression,
139 pub instance: Option<String>,
140 pub offset: Expression,
141 pub power_domain: Option<String>,
142 pub range: Option<Range>,
143}
144
145#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
146pub struct MemoryMapped {
147 pub access: MemoryAccess,
148 pub component: String,
149 pub condition: Expression,
150 pub frame: Option<String>,
151 pub instance: Option<String>,
152 pub offset: Expression,
153 pub power_domain: Option<String>,
154 pub range: Option<Range>,
155}
156
157#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
158pub struct ImplementationDefinedOffsetAccessor {
159 pub access: MemoryAccess,
160 pub condition: Expression,
161 pub offset: Vec<Expression>,
162}
163
164#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
165pub struct ImplementationDefinedOffsetAccessorArray {
166 pub access: MemoryAccess,
167 pub condition: Expression,
168 pub index_variable: String,
169 pub indexes: Vec<Range>,
170 pub offset: Vec<Expression>,
171}
172
173#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
174pub struct MemoryAccess {
175 pub condition: Expression,
176}
177
178#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
179pub struct SystemAccess {
180 pub access: Vec<Access>,
181 pub condition: Expression,
182}
183
184#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
185pub struct Access {}
186
187#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
188pub struct Encoding {
189 pub asmvalue: Option<String>,
190 pub encodings: BTreeMap<String, Value>,
191}
192
193#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
195#[serde(tag = "_type")]
196pub enum Expression {
197 #[serde(rename = "AST.Assignment")]
198 Assignment(AstAssignment),
199 #[serde(rename = "AST.BinaryOp")]
200 BinaryOp(AstBinaryOp),
201 #[serde(rename = "AST.Bool")]
202 Bool(AstBool),
203 #[serde(rename = "AST.Concat")]
204 Concat(AstConcat),
205 #[serde(rename = "AST.DotAtom")]
206 DotAtom(AstDotAtom),
207 #[serde(rename = "Types.Field")]
208 Field(TypesField),
209 #[serde(rename = "AST.Function")]
210 Function(AstFunction),
211 #[serde(rename = "AST.Identifier")]
212 Identifier(AstIdentifier),
213 #[serde(rename = "AST.Integer")]
214 Integer(AstInteger),
215 #[serde(rename = "Types.String")]
216 String(TypesString),
217 #[serde(rename = "AST.Set")]
218 Set(AstSet),
219 #[serde(rename = "AST.SquareOp")]
220 SquareOp(AstSquareOp),
221 #[serde(rename = "AST.UnaryOp")]
222 UnaryOp(AstUnaryOp),
223 #[serde(rename = "Values.Value")]
224 Value(Value),
225}
226
227#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
228pub struct AstAssignment {
229 pub val: Box<Expression>,
230 pub var: Box<Expression>,
231}
232
233#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
234pub struct AstBinaryOp {
235 pub op: String,
236 pub left: Box<Expression>,
237 pub right: Box<Expression>,
238}
239
240#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
241pub struct AstBool {
242 pub value: bool,
243}
244
245#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
246pub struct AstConcat {
247 pub values: Vec<Expression>,
248}
249
250#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
251pub struct AstDotAtom {
252 pub values: Vec<Expression>,
253}
254
255#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
256pub struct AstFunction {
257 pub arguments: Vec<Expression>,
258 pub name: String,
259 pub parameters: Vec<Expression>,
260}
261
262#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
263pub struct AstIdentifier {
264 pub value: String,
265}
266
267#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
268pub struct AstInteger {
269 pub value: i64,
270}
271
272#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
273pub struct AstSet {
274 pub values: Vec<Expression>,
275}
276
277#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
278pub struct AstSquareOp {
279 pub arguments: Vec<Expression>,
280 pub var: Box<Expression>,
281}
282
283#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
284pub struct AstUnaryOp {
285 pub expr: Box<Expression>,
286 pub op: String,
287}
288
289#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
290pub struct TypesField {
291 pub value: FieldValue,
292}
293
294#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
295pub struct FieldValue {
296 pub field: String,
297 pub instance: Option<()>,
298 pub name: String,
299 pub slices: Option<()>,
300 pub state: ExecutionState,
301}
302
303#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
304pub struct TypesString {
305 pub value: String,
306}
307
308#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
309pub struct Fieldset {
310 pub condition: Expression,
311 pub description: Description,
312 pub display: Option<String>,
313 pub name: Option<String>,
314 pub values: Vec<FieldEntry>,
315 pub width: u32,
316}
317
318#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
319#[serde(tag = "_type")]
320pub enum FieldEntry {
321 #[serde(rename = "Fields.Field")]
322 Field(Field),
323 #[serde(rename = "Fields.Reserved")]
324 Reserved(ReservedField),
325 #[serde(rename = "Fields.ImplementationDefined")]
326 ImplementationDefined(ImplementationDefinedField),
327 #[serde(rename = "Fields.Array")]
328 Array(ArrayField),
329 #[serde(rename = "Fields.Vector")]
330 Vector(VectorField),
331 #[serde(rename = "Fields.ConditionalField")]
332 ConditionalField(ConditionalField),
333 #[serde(rename = "Fields.ConstantField")]
334 ConstantField(ConstantField),
335 #[serde(rename = "Fields.Dynamic")]
336 Dynamic(DynamicField),
337}
338
339#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
340pub struct Field {
341 pub description: Description,
342 pub name: Option<String>,
343 pub rangeset: Vec<Range>,
344 pub resets: Option<FieldResets>,
345 pub values: Option<Values>,
346 pub volatile: Option<bool>,
347}
348
349#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
350pub struct ReservedField {
351 pub description: Description,
352 pub rangeset: Vec<Range>,
353 pub value: String,
354}
355
356#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
357pub struct ImplementationDefinedField {
358 pub constraints: Option<Vec<()>>,
359 pub description: Description,
360 pub display: Option<String>,
361 pub name: Option<String>,
362 pub rangeset: Vec<Range>,
363 pub resets: Option<FieldResets>,
364 pub volatile: Option<bool>,
365}
366
367#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
368pub struct ArrayField {
369 pub access: Option<()>,
370 pub description: Description,
371 pub display: Option<String>,
372 pub index_variable: String,
373 pub indexes: Vec<Range>,
374 pub name: Option<String>,
375 pub rangeset: Vec<Range>,
376 pub resets: Option<FieldResets>,
377 pub values: Option<Values>,
378 pub volatile: Option<bool>,
379}
380
381#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
382pub struct VectorField {
383 pub access: Option<()>,
384 pub description: Description,
385 pub display: Option<String>,
386 pub index_variable: String,
387 pub indexes: Vec<Range>,
388 pub name: Option<String>,
389 pub rangeset: Vec<Range>,
390 pub reserved_type: Option<String>,
391 pub resets: Option<FieldResets>,
392 pub size: Vec<ConditionValue>,
393 pub values: Option<Values>,
394 pub volatile: Option<bool>,
395}
396
397#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
398pub struct ConditionValue {
399 pub condition: Expression,
400 pub value: Expression,
401}
402
403#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
404pub struct ConditionalField {
405 pub description: Description,
406 pub display: Option<String>,
407 pub fields: Vec<FieldCondition>,
408 pub name: Option<String>,
409 pub rangeset: Vec<Range>,
410 pub reservedtype: String,
411 pub resets: Option<FieldResets>,
412 pub volatile: Option<bool>,
413}
414
415#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
416pub struct FieldCondition {
417 pub condition: Expression,
418 pub field: FieldEntry,
419}
420
421#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
422pub struct ConstantField {
423 pub access: Option<()>,
424 pub description: Description,
425 pub name: Option<String>,
426 pub rangeset: Vec<Range>,
427 pub resets: Option<FieldResets>,
428 pub value: ValueEntry,
429}
430
431#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
432pub struct DynamicField {
433 pub description: Description,
434 pub display: Option<String>,
435 pub instances: Vec<Fieldset>,
436 pub name: Option<String>,
437 pub rangeset: Vec<Range>,
438 pub resets: Option<FieldResets>,
439 pub volatile: Option<bool>,
440}
441
442#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
443pub struct Description {
444 pub after: Option<String>,
445 pub before: Option<String>,
446}
447
448#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
449pub struct Range {
450 pub start: u32,
451 pub width: u32,
452}
453
454#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
455pub struct FieldResets {}
456
457#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
458pub struct Values {
459 pub values: Vec<ValueEntry>,
460}
461
462#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
463#[serde(tag = "_type")]
464pub enum ValueEntry {
465 #[serde(rename = "Values.ConditionalValue")]
466 ConditionalValue(ConditionalValue),
467 #[serde(rename = "Values.EquationValue")]
468 EquationValue(EquationValue),
469 #[serde(rename = "Values.Group")]
470 Group(Group),
471 #[serde(rename = "Values.ImplementationDefined")]
472 ImplementationDefined(ImplementationDefinedValue),
473 #[serde(rename = "Values.Link")]
474 Link(Link),
475 #[serde(rename = "Values.NamedValue")]
476 NamedValue(NamedValue),
477 #[serde(rename = "Values.Value")]
478 Value(Value),
479 #[serde(rename = "Values.ValueRange")]
480 ValueRange(ValueRange),
481}
482
483#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
484pub struct ConditionalValue {
485 pub condition: Expression,
486 pub meaning: Option<String>,
487 pub values: Values,
488}
489
490#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
491pub struct EquationValue {
492 pub meaning: Option<String>,
493 pub slice: Vec<Range>,
494 pub value: String,
495}
496
497#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
498pub struct Group {
499 pub meaning: Option<String>,
500 pub value: String,
501 pub values: Values,
502}
503
504#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
505pub struct Link {
506 pub links: BTreeMap<String, String>,
507 pub meaning: Option<String>,
508 pub value: String,
509}
510
511#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
512pub struct NamedValue {
513 pub meaning: Option<String>,
514 pub name: String,
515 pub value: String,
516}
517
518#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
519pub struct Value {
520 pub meaning: Option<String>,
521 pub value: String,
522}
523
524#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
525pub struct ImplementationDefinedValue {
526 pub constraints: Option<Values>,
527 pub meaning: Option<String>,
528}
529
530#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
531pub struct ValueRange {
532 pub end: Value,
533 pub meaning: Option<String>,
534 pub start: Value,
535}
536
537#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
538pub struct RegisterArray {
539 #[serde(rename = "_meta")]
540 pub meta: Option<Meta>,
541 pub access_text: Option<String>,
542 pub accessors: Vec<Accessor>,
543 pub condition: Expression,
544 pub configuration: Option<String>,
545 pub fieldsets: Vec<Fieldset>,
546 pub groups: Option<()>,
547 pub index_variable: String,
548 pub indexes: Vec<Range>,
549 pub instances: Instances,
550 pub mapset: Vec<()>,
551 pub name: String,
552 pub purpose: Option<String>,
553 #[serde(skip_serializing_if = "Option::is_none")]
554 pub state: Option<ExecutionState>,
555 pub title: Option<String>,
556}
557
558#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
559#[serde(untagged)]
560pub enum Instances {
561 InstanceSet(InstanceSet),
562 Bool(bool),
563}
564
565#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
566pub struct InstanceSet {
567 pub values: Vec<Instance>,
568}
569
570#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
571pub struct Instance {
572 pub condition: Expression,
573 pub instance: String,
574}
575
576#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
577pub struct RegisterBlock {
578 #[serde(rename = "_meta")]
579 pub meta: Meta,
580 pub accessors: Vec<Accessor>,
581 pub blocks: Vec<RegisterEntry>,
582 pub condition: Expression,
583 pub default_access: ReadWriteAccess,
584 pub mapset: Vec<()>,
585 pub name: String,
586 pub purpose: Option<String>,
587 pub references: References,
588 pub size: String,
589 pub title: Option<String>,
590}
591
592#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
593pub struct ReadWriteAccess {
594 pub read: String,
595 pub write: String,
596}
597
598#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
599pub struct References {}