1#[derive(Clone, Debug, PartialOrd, PartialEq)]
3pub struct Mcu {
4 pub device: Device,
6 pub variants: Vec<Variant>,
8 pub modules: Vec<Module>,
10 pub architecture: Architecture,
12 pub c_preprocessor_name: String,
14}
15
16#[derive(Clone, Debug, PartialOrd, PartialEq, Eq, Hash)]
18pub struct Device {
19 pub name: String,
21 pub address_spaces: Vec<AddressSpace>,
23 pub peripherals: Vec<Peripheral>,
25 pub interrupts: Vec<Interrupt>,
27}
28
29#[derive(Clone, Debug, PartialOrd, PartialEq)]
31pub struct Variant {
32 pub name: String,
34 pub pinout: Option<String>,
36 pub package: String,
38 pub temperature_min: i32,
40 pub temperature_max: i32,
42 pub voltage_min: f32,
44 pub voltage_max: f32,
46 pub speed_max_hz: u64,
48}
49
50#[derive(Clone, Debug, PartialOrd, PartialEq, Eq, Hash)]
52pub struct AddressSpace {
53 pub id: String,
55 pub name: String,
57 pub start_address: u32,
59 pub size: u32,
61 pub segments: Vec<MemorySegment>,
63}
64
65#[derive(Clone, Debug, PartialOrd, PartialEq, Eq, Hash)]
67pub struct MemorySegment {
68 pub name: String,
70 pub start_address: u32,
72 pub size: u32,
74 pub ty: String,
76 pub readable: bool,
78 pub writable: bool,
80 pub executable: bool,
82 pub page_size: Option<u32>,
84}
85
86#[derive(Clone, Debug, PartialOrd, PartialEq, Eq, Hash)]
88pub struct Peripheral {
89 pub name: String,
91 pub instances: Vec<Instance>,
97}
98
99#[derive(Clone, Debug, PartialOrd, PartialEq, Eq, Hash)]
101pub struct Interrupt {
102 pub name: String,
104 pub caption: String,
106 pub index: u32,
108}
109
110#[derive(Clone, Debug, PartialOrd, PartialEq, Eq, Hash)]
112pub struct Module {
113 pub name: String,
115 pub register_groups: Vec<RegisterGroup>,
117 pub value_groups: Vec<ValueGroup>,
119}
120
121#[derive(Clone, Debug, PartialOrd, PartialEq, Eq, Hash)]
123pub struct Instance {
124 pub name: String,
126 pub signals: Vec<Signal>,
128}
129
130#[derive(Clone, Debug, PartialOrd, PartialEq, Eq, Hash)]
132pub struct RegisterGroup {
133 pub name: String,
135 pub caption: String,
136 pub registers: Vec<Register>,
138}
139
140#[derive(Clone, Debug, PartialOrd, PartialEq, Eq, Hash)]
142pub struct ValueGroup {
143 pub name: String,
144 pub caption: String,
145 pub values: Vec<Value>,
146}
147
148#[derive(Clone, Debug, PartialOrd, PartialEq, Eq, Hash)]
150pub struct Value {
151 pub name: String,
152 pub caption: String,
153 pub value: u32,
154}
155
156#[derive(Copy, Clone, Debug, PartialOrd, PartialEq, Eq, Hash)]
158pub enum ReadWrite {
159 ReadAndWrite,
161 ReadOnly,
163 WriteOnly,
165}
166
167#[derive(Clone, Debug, PartialOrd, PartialEq, Eq, Hash)]
169pub struct Register {
170 pub name: String,
172 pub caption: String,
174 pub offset: u32,
176 pub size: u32,
178 pub mask: Option<u32>,
179 pub rw: ReadWrite,
181 pub bitfields: Vec<Bitfield>,
183}
184
185#[derive(Clone, Debug, PartialOrd, PartialEq, Eq, Hash)]
187pub struct Bitfield {
188 pub name: String,
190 pub caption: String,
192 pub mask: u32,
197 pub size: u32,
199 pub values: Option<String>,
201}
202
203#[derive(Clone, Debug, PartialOrd, PartialEq, Eq, Hash)]
205pub struct Signal {
206 pub pad: String,
208 pub group: Option<String>,
209 pub index: Option<u8>,
210}
211
212#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
217pub enum Architecture {
218 Unknown,
219
220 Avr0,
221 Avr1,
222 Avr2,
223 Avr25,
224 Avr3,
225 Avr31,
226 Avr35,
227 Avr4,
228 Avr5,
229 Avr51,
230 Avr6,
231 Xmega2,
232 Xmega3,
233 Xmega4,
234 Xmega5,
235 Xmega6,
236 Xmega7,
237 Tiny,
238}
239
240#[derive(Clone, Debug, PartialOrd, PartialEq, Eq, Hash)]
242pub struct Port<'a> {
243 instance: &'a Instance,
245 register_group: &'a RegisterGroup,
247}
248
249impl Mcu {
250 pub fn peripheral(&self, name: &str) -> Option<&Peripheral> {
252 self.device.peripherals.iter().find(|p| p.name == name)
253 }
254
255 pub fn module(&self, name: &str) -> Option<&Module> {
257 self.modules.iter().find(|p| p.name == name)
258 }
259
260 pub fn register_groups<'a>(&'a self) -> impl Iterator<Item = &'a RegisterGroup> {
262 self.modules.iter().flat_map(|m| m.register_groups.iter())
263 }
264
265 pub fn registers<'a>(&'a self) -> impl Iterator<Item = &'a Register> {
267 self.register_groups().flat_map(|rg| rg.registers.iter())
268 }
269
270 pub fn port(&self, letter: char) -> Port {
272 let port_name = format!("PORT{}", letter);
273 let instance = self
274 .port_peripheral()
275 .instance(&port_name)
276 .expect("no port instance with that letter found");
277 let register_group = self
278 .port_module()
279 .register_group(&port_name)
280 .expect("no port register group with that letter found");
281 Port { instance, register_group }
282 }
283
284 pub fn port_peripheral(&self) -> &Peripheral {
286 self.peripheral("PORT").expect("mcu does not have a port peripheral")
287 }
288
289 pub fn port_module(&self) -> &Module {
291 self.module("PORT").expect("mcu does not have a port module")
292 }
293}
294
295impl Peripheral {
296 pub fn instance(&self, name: &str) -> Option<&Instance> {
298 self.instances.iter().find(|i| i.name == name)
299 }
300
301 pub fn signals<'a>(&'a self) -> impl Iterator<Item = &'a Signal> {
303 self.instances.iter().flat_map(|i| i.signals.iter())
304 }
305
306 pub fn instance_signal_with_pad(&self, pad: &str) -> Option<(&Instance, &Signal)> {
307 self.instance_signals_on_pad(pad).next()
308 }
309
310 fn instance_signals_on_pad<'a>(
312 &'a self,
313 pad: &str,
314 ) -> impl Iterator<Item = (&'a Instance, &'a Signal)> {
315 let mut instance_signals = Vec::new();
316
317 for instance in self.instances.iter() {
318 for signal in instance.signals.iter() {
319 if signal.pad == pad {
320 instance_signals.push((instance, signal));
321 }
322 }
323 }
324 instance_signals.into_iter()
325 }
326}
327
328impl Module {
329 pub fn register_group(&self, name: &str) -> Option<&RegisterGroup> {
331 self.register_groups.iter().find(|rg| rg.name == name)
332 }
333
334 pub fn registers<'a>(&'a self) -> impl Iterator<Item = &'a Register> {
336 self.register_groups.iter().flat_map(|rg| rg.registers.iter())
337 }
338}
339
340impl Register {
341 pub fn union(&self, with: &Self) -> Self {
343 assert_eq!(
344 self.name, with.name,
345 "can only take the union between different descriptions of the same register"
346 );
347
348 let mut result = self.clone();
349
350 match (result.mask, with.mask) {
351 (None, Some(v)) => result.mask = Some(v), _ => (),
353 }
354
355 result
356 }
357}
358
359impl<'a> Port<'a> {
360 pub fn registers(&'a self) -> impl Iterator<Item = &'a Register> {
362 self.register_group.registers.iter()
363 }
364
365 pub fn signals(&'a self) -> impl Iterator<Item = &'a Signal> {
367 self.instance.signals.iter()
368 }
369
370 pub fn signal_with_pad(&'a self, pad: &str) -> Option<&'a Signal> {
372 self.signals().find(|s| s.pad == pad)
373 }
374
375 pub fn ddr_register(&self) -> &Register {
377 self.registers()
378 .find(|r| r.name.starts_with("DDR"))
379 .expect("port does not have ddr register")
380 }
381
382 pub fn port_register(&self) -> &Register {
384 self.registers()
385 .find(|r| r.name.starts_with("PORT"))
386 .expect("port does not have port register")
387 }
388
389 pub fn pin_register(&self) -> &Register {
391 self.registers()
392 .find(|r| r.name.starts_with("PIN"))
393 .expect("port does not have pin register")
394 }
395}
396
397impl Architecture {
398 pub fn name(&self) -> &'static str {
399 use Architecture::*;
400
401 match self {
402 Unknown => "<unknown architecture>",
403 Avr0 => "avr0",
404 Avr1 => "avr1",
405 Avr2 => "avr2",
406 Avr25 => "avr25",
407 Avr3 => "avr3",
408 Avr31 => "avr31",
409 Avr35 => "avr35",
410 Avr4 => "avr4",
411 Avr5 => "avr5",
412 Avr51 => "avr51",
413 Avr6 => "avr6",
414 Xmega2 => "xmega2",
415 Xmega3 => "xmega3",
416 Xmega4 => "xmega4",
417 Xmega5 => "xmega5",
418 Xmega6 => "xmega6",
419 Xmega7 => "xmega7",
420 Tiny => "tiny",
421 }
422 }
423}