Skip to content

Commit b24c6bd

Browse files
committed
Implement naive derivedFrom for peripherals
1 parent 778692f commit b24c6bd

File tree

4 files changed

+39
-19
lines changed

4 files changed

+39
-19
lines changed

Cargo.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ version = "0.1.2"
1313
clap = "2.14.0"
1414
inflections = "1.0.0"
1515
quote = "0.3.3"
16-
svd-parser = "0.1.1"
16+
svd-parser = "0.1.2"
1717
syn = "0.9"

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ impl SanitizeName for String {
274274

275275
#[doc(hidden)]
276276
pub fn gen_peripheral(p: &Peripheral, d: &Defaults) -> Vec<Tokens> {
277-
assert!(p.derived_from.is_none(), "DerivedFrom not supported");
277+
assert!(p.derived_from.is_none(), "DerivedFrom not supported here (should be resolved earlier)");
278278

279279
let mut items = vec![];
280280
let mut fields = vec![];

src/main.rs

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,20 +41,40 @@ fn main() {
4141
}
4242
}
4343
Some(pattern) => {
44-
if let Some(peripheral) = d.peripherals
45-
.iter()
46-
.find(|x| x.name.to_ascii_lowercase() == pattern)
47-
.or(d.peripherals
48-
.iter()
49-
.find(|x| x.name.to_ascii_lowercase().contains(&pattern))) {
50-
println!("{}",
51-
svd2rust::gen_peripheral(peripheral, &d.defaults)
52-
.iter()
53-
.map(|i| i.to_string())
54-
.collect::<Vec<_>>()
55-
.join("\n\n"));
56-
44+
if let Some(peripheral) = find_peripheral(&d, |n| n == pattern)
45+
.or(find_peripheral(&d, |n| n.contains(pattern))) {
46+
if let Some(base_peripheral) = peripheral.derived_from.as_ref()
47+
.and_then(|bn| find_peripheral(&d, |n| n == bn.to_ascii_lowercase())) {
48+
let merged_peripheral = merge(peripheral, base_peripheral);
49+
println!("{}", gen_peripheral_desc(&merged_peripheral, &d.defaults));
50+
} else {
51+
println!("{}", gen_peripheral_desc(peripheral, &d.defaults));
52+
}
5753
}
5854
}
5955
}
6056
}
57+
58+
fn find_peripheral<F: Fn(&str) -> bool>(device: &svd::Device, matcher: F) -> Option<&svd::Peripheral> {
59+
device.peripherals.iter().find(|x| matcher(&x.name.to_ascii_lowercase()))
60+
}
61+
62+
fn gen_peripheral_desc(p: &svd::Peripheral, def: &svd::Defaults) -> String {
63+
svd2rust::gen_peripheral(p, &def)
64+
.iter()
65+
.map(|i| i.to_string())
66+
.collect::<Vec<_>>()
67+
.join("\n\n")
68+
}
69+
70+
fn merge(p: &svd::Peripheral, bp: &svd::Peripheral) -> svd::Peripheral {
71+
svd::Peripheral {
72+
name: p.name.clone(),
73+
base_address: p.base_address,
74+
derived_from: None,
75+
group_name: p.group_name.clone().or(bp.group_name.clone()),
76+
description: p.description.clone().or(bp.description.clone()),
77+
interrupt: p.interrupt.clone().or(bp.interrupt.clone()),
78+
registers: p.registers.clone().or(bp.registers.clone()),
79+
}
80+
}

0 commit comments

Comments
 (0)