Skip to main content

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, Default, Deserialize, Eq, PartialEq, Serialize)]
54pub struct License {
55    pub copyright: String,
56    pub info: String,
57}
58
59#[derive(Clone, Debug, Default, 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, Default, Deserialize, Eq, PartialEq, Serialize)]
188pub struct Encoding {
189    pub asmvalue: Option<String>,
190    pub encodings: BTreeMap<String, ValueEntry>,
191}
192
193/// An expression in an AST.
194#[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, Default, Deserialize, Eq, PartialEq, Serialize)]
241pub struct AstBool {
242    pub value: bool,
243}
244
245#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
246pub struct AstConcat {
247    pub values: Vec<Expression>,
248}
249
250#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
251pub struct AstDotAtom {
252    pub values: Vec<Expression>,
253}
254
255#[derive(Clone, Debug, Default, 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, Default, Deserialize, Eq, PartialEq, Serialize)]
263pub struct AstIdentifier {
264    pub value: String,
265}
266
267#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
268pub struct AstInteger {
269    pub value: i64,
270}
271
272#[derive(Clone, Debug, Default, 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, Default, 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, Default, 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, Default, 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, Default, 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, Default, 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, Default, 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, Default, 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, Default, 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, Default, Deserialize, Eq, PartialEq, Serialize)]
443pub struct Description {
444    pub after: Option<String>,
445    pub before: Option<String>,
446}
447
448#[derive(Clone, Debug, Default, 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, Default, 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, Default, 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, Default, 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, Default, 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, Default, 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, Default, Deserialize, Eq, PartialEq, Serialize)]
519pub struct Value {
520    pub meaning: Option<String>,
521    pub value: String,
522}
523
524#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
525pub struct ImplementationDefinedValue {
526    pub constraints: Option<Values>,
527    pub meaning: Option<String>,
528}
529
530#[derive(Clone, Debug, Default, 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, Default, 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, Default, 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 {}