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)]
78pub struct Accessor {}
79
80#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
81pub struct Condition {}
82
83#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
84pub struct Fieldset {
85 pub condition: Condition,
86 pub description: Description,
87 pub display: Option<String>,
88 pub name: Option<String>,
89 pub values: Vec<Fields>,
90 pub width: u32,
91}
92
93#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
94pub struct Fields {
95 pub description: Description,
96 pub name: Option<String>,
97 pub rangeset: Vec<Range>,
98 pub resets: Option<FieldResets>,
99 pub values: Option<Values>,
100 pub volatile: Option<bool>,
101}
102
103#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
104pub struct Description {
105 pub after: Option<String>,
106 pub before: Option<String>,
107}
108
109#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
110pub struct Range {
111 pub start: u32,
112 pub width: u32,
113}
114
115#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
116pub struct FieldResets {}
117
118#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
119pub struct Values {
120 pub values: Vec<ValueEntry>,
121}
122
123#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
124#[serde(tag = "_type")]
125pub enum ValueEntry {
126 #[serde(rename = "Values.ConditionalValue")]
127 ConditionalValue(ConditionalValue),
128 #[serde(rename = "Values.EquationValue")]
129 EquationValue(EquationValue),
130 #[serde(rename = "Values.Group")]
131 Group(Group),
132 #[serde(rename = "Values.Link")]
133 Link(Link),
134 #[serde(rename = "Values.NamedValue")]
135 NamedValue(NamedValue),
136 #[serde(rename = "Values.Value")]
137 Value(Value),
138 #[serde(rename = "Values.ValueRange")]
139 ValueRange(ValueRange),
140}
141
142#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
143pub struct ConditionalValue {
144 pub condition: Condition,
145 pub meaning: Option<String>,
146 pub values: Values,
147}
148
149#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
150pub struct EquationValue {
151 pub meaning: Option<String>,
152 pub slice: Vec<Range>,
153 pub value: String,
154}
155
156#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
157pub struct Group {
158 pub meaning: Option<String>,
159 pub value: String,
160 pub values: Values,
161}
162
163#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
164pub struct Link {
165 pub links: BTreeMap<String, String>,
166 pub meaning: Option<String>,
167 pub value: String,
168}
169
170#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
171pub struct NamedValue {
172 pub meaning: Option<String>,
173 pub name: String,
174 pub value: String,
175}
176
177#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
178pub struct Value {
179 pub meaning: Option<String>,
180 pub value: String,
181}
182
183#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
184pub struct ValueRange {
185 pub end: Value,
186 pub meaning: Option<String>,
187 pub start: Value,
188}
189
190#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
191pub struct RegisterArray {
192 #[serde(rename = "_meta")]
193 pub meta: Option<Meta>,
194 pub access_text: Option<String>,
195 pub accessors: Vec<Accessor>,
196 pub condition: Condition,
197 pub configuration: Option<String>,
198 pub fieldsets: Vec<Fieldset>,
199 pub groups: Option<()>,
200 pub index_variable: String,
201 pub indexes: Vec<Range>,
202 pub instances: Instances,
203 pub mapset: Vec<()>,
204 pub name: String,
205 pub purpose: Option<String>,
206 #[serde(skip_serializing_if = "Option::is_none")]
207 pub state: Option<ExecutionState>,
208 pub title: Option<String>,
209}
210
211#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
212#[serde(untagged)]
213pub enum Instances {
214 InstanceSet(InstanceSet),
215 Bool(bool),
216}
217
218#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
219pub struct InstanceSet {
220 pub values: Vec<Instance>,
221}
222
223#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
224pub struct Instance {
225 pub condition: Condition,
226 pub instance: String,
227}
228
229#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
230pub struct RegisterBlock {
231 #[serde(rename = "_meta")]
232 pub meta: Meta,
233 pub accessors: Vec<Accessor>,
234 pub blocks: Vec<RegisterEntry>,
235 pub condition: Condition,
236 pub default_access: ReadWriteAccess,
237 pub mapset: Vec<()>,
238 pub name: String,
239 pub purpose: Option<String>,
240 pub references: References,
241 pub size: String,
242 pub title: Option<String>,
243}
244
245#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
246pub struct ReadWriteAccess {
247 pub read: String,
248 pub write: String,
249}
250
251#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
252pub struct References {}