arm_sysregs_json/
lib.rs

1// Copyright 2025 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15//! Types to parse the Arm system register JSON format.
16
17use 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/// An expression in an AST.
174#[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 {}