Skip to content

Commit 03888a9

Browse files
bors[bot]burrbull
andauthored
Merge #83
83: missing derived_from r=Disasm a=burrbull Parsing part of #81 cc @Disasm Co-authored-by: Andrey Zgarbul <zgarbul.andrey@gmail.com>
2 parents 350b8e9 + 8491829 commit 03888a9

File tree

5 files changed

+20
-29
lines changed

5 files changed

+20
-29
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
99

1010
- [breaking-change] `Defaults` field renamed on `RegisterProperties`
1111
and added into `Peripheral` and `ClusterInfo`
12+
- Added `derived_from` into `Field` and `ClusterInfo`
1213
- Updated dependencies, use `Edition 2018`
1314
- Added missing `zeroToToggle`
1415
- Added serializing/deserializing with `serde`

src/svd/clusterinfo.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use crate::svd::{
1818
#[derive(Clone, Debug, PartialEq)]
1919
pub struct ClusterInfo {
2020
pub name: String,
21+
pub derived_from: Option<String>,
2122
pub description: String,
2223
pub header_struct_name: Option<String>,
2324
pub address_offset: u32,
@@ -34,6 +35,7 @@ impl Parse for ClusterInfo {
3435
fn parse(tree: &Element) -> Result<ClusterInfo, SVDError> {
3536
Ok(ClusterInfo {
3637
name: tree.get_child_text("name")?, // TODO: Handle naming of cluster
38+
derived_from: tree.attributes.get("derivedFrom").map(|s| s.to_owned()),
3739
description: tree.get_child_text("description")?,
3840
header_struct_name: tree.get_child_text_opt("headerStructName")?,
3941
address_offset: tree.get_child_u32("addressOffset")?,
@@ -57,6 +59,10 @@ impl Encode for ClusterInfo {
5759
fn encode(&self) -> Result<Element, SVDError> {
5860
let mut e = new_element("cluster", None);
5961

62+
if let Some(v) = &self.derived_from {
63+
e.attributes.insert(String::from("derivedFrom"), format!("{}", v));
64+
}
65+
6066
e.children.push(new_element(
6167
"description",
6268
Some(self.description.clone()),

src/svd/enumeratedvalues.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,7 @@ impl Parse for EnumeratedValues {
3838
Ok(EnumeratedValues {
3939
name: tree.get_child_text_opt("name")?,
4040
usage: parse::optional::<Usage>("usage", tree)?,
41-
derived_from: tree.attributes
42-
.get(&"derivedFrom".to_owned())
43-
.map(|s| s.to_owned()),
41+
derived_from: tree.attributes.get("derivedFrom").map(|s| s.to_owned()),
4442
values: {
4543
let values: Result<Vec<_>, _> = tree.children
4644
.iter()

src/svd/field.rs

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use crate::svd::{
2525
#[derive(Clone, Debug, PartialEq)]
2626
pub struct Field {
2727
pub name: String,
28+
pub derived_from: Option<String>,
2829
pub description: Option<String>,
2930
pub bit_range: BitRange,
3031
pub access: Option<Access>,
@@ -59,6 +60,7 @@ impl Field {
5960
fn _parse(tree: &Element, name: String) -> Result<Field, SVDError> {
6061
Ok(Field {
6162
name,
63+
derived_from: tree.attributes.get("derivedFrom").map(|s| s.to_owned()),
6264
description: tree.get_child_text_opt("description")?,
6365
bit_range: BitRange::parse(tree)?,
6466
access: parse::optional::<Access>("access", tree)?,
@@ -103,6 +105,10 @@ impl Encode for Field {
103105
text: None,
104106
};
105107

108+
if let Some(v) = &self.derived_from {
109+
elem.attributes.insert(String::from("derivedFrom"), format!("{}", v));
110+
}
111+
106112
// Add bit range
107113
elem.children
108114
.append(&mut self.bit_range.encode()?);
@@ -146,6 +152,7 @@ mod tests {
146152
(
147153
Field {
148154
name: String::from("MODE"),
155+
derived_from: None,
149156
description: Some(String::from("Read Mode")),
150157
bit_range: BitRange {
151158
offset: 24,
@@ -193,49 +200,27 @@ mod tests {
193200
</field>
194201
",
195202
),
196-
// almost the same test but description info is missing
197203
(
198204
Field {
199205
name: String::from("MODE"),
206+
derived_from: Some(String::from("other field")),
200207
description: None,
201208
bit_range: BitRange {
202209
offset: 24,
203210
width: 2,
204211
range_type: BitRangeType::OffsetWidth,
205212
},
206-
access: Some(Access::ReadWrite),
207-
enumerated_values: vec![EnumeratedValues {
208-
name: None,
209-
usage: None,
210-
derived_from: None,
211-
values: vec![EnumeratedValue {
212-
name: String::from("WS0"),
213-
description: Some(String::from(
214-
"Zero wait-states inserted in fetch or read transfers",
215-
)),
216-
value: Some(0),
217-
is_default: None,
218-
_extensible: (),
219-
}],
220-
_extensible: (),
221-
}],
213+
access: None,
214+
enumerated_values: vec![],
222215
write_constraint: None,
223216
modified_write_values: None,
224217
_extensible: (),
225218
},
226219
"
227-
<field>
220+
<field derivedFrom=\"other field\">
228221
<name>MODE</name>
229222
<bitOffset>24</bitOffset>
230223
<bitWidth>2</bitWidth>
231-
<access>read-write</access>
232-
<enumeratedValues>
233-
<enumeratedValue>
234-
<name>WS0</name>
235-
<description>Zero wait-states inserted in fetch or read transfers</description>
236-
<value>0x00000000</value>
237-
</enumeratedValue>
238-
</enumeratedValues>
239224
</field>
240225
",
241226
),

src/svd/registerinfo.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ mod tests {
220220
reset_mask: Some(0x00000023),
221221
fields: Some(vec![Field {
222222
name: String::from("WREN"),
223+
derived_from: None,
223224
description: Some(String::from(
224225
"Enable Write/Erase Controller",
225226
)),

0 commit comments

Comments
 (0)