1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#[derive(Clone, Debug, PartialOrd, PartialEq)]
pub struct Mcu {
pub device: Device,
pub variants: Vec<Variant>,
pub modules: Vec<Module>,
}
#[derive(Clone, Debug, PartialOrd, PartialEq)]
pub struct Device {
pub name: String,
pub address_spaces: Vec<AddressSpace>,
pub modules: Vec<Module>,
}
#[derive(Clone, Debug, PartialOrd, PartialEq)]
pub struct Variant {
pub name: String,
pub pinout: Option<String>,
pub package: String,
pub temperature_min: i32,
pub temperature_max: i32,
pub voltage_min: f32,
pub voltage_max: f32,
pub speed_max_hz: u64,
}
#[derive(Clone, Debug, PartialOrd, PartialEq)]
pub struct AddressSpace {
pub id: String,
pub name: String,
pub start_address: u32,
pub size: u32,
pub segments: Vec<MemorySegment>,
}
#[derive(Clone, Debug, PartialOrd, PartialEq)]
pub struct MemorySegment {
pub start_address: u32,
pub size: u32,
pub ty: String,
pub readable: bool,
pub writable: bool,
pub executable: bool,
pub name: String,
pub page_size: Option<u32>,
}
#[derive(Clone, Debug, PartialOrd, PartialEq)]
pub struct Module {
pub name: String,
pub instances: Vec<Instance>,
pub register_groups: Vec<RegisterGroup>,
}
#[derive(Clone, Debug, PartialOrd, PartialEq)]
pub struct Instance {
pub name: String,
pub signals: Vec<Signal>,
}
#[derive(Clone, Debug, PartialOrd, PartialEq)]
pub struct RegisterGroup {
pub name: String,
pub caption: String,
pub registers: Vec<Register>,
}
#[derive(Clone, Debug, PartialOrd, PartialEq)]
pub struct Register {
pub name: String,
pub caption: String,
pub offset: u32,
pub size: u32,
pub mask: Option<u32>,
}
#[derive(Clone, Debug, PartialOrd, PartialEq)]
pub struct Signal {
pub pad: String,
pub group: Option<String>,
pub index: Option<u8>,
}
impl Register {
pub fn union(&self, with: &Self) -> Self {
assert_eq!(self.name, with.name,
"can only take the union between different descriptions of the same register");
let mut result = self.clone();
match (result.mask, with.mask) {
(None, Some(v)) => result.mask = Some(v),
_ => (),
}
result
}
}