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