Skip to content

Commit 303445e

Browse files
committed
metapac: generate feature per part number and package
This is the last step blocking embassy-stm32 from being able to generate Peripherals while being aware of the package.
1 parent 8912e10 commit 303445e

File tree

12 files changed

+227
-160
lines changed

12 files changed

+227
-160
lines changed

d

Lines changed: 7 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -59,55 +59,13 @@ case "$CMD" in
5959
./d build-metapac
6060
;;
6161
check)
62-
# MSPS
63-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,msps003f3
64-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,msps003f4
65-
66-
# C Series
67-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0c1103
68-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0c1104
69-
70-
# G Series
71-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g1105
72-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g1106
73-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g1107
74-
75-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g1505
76-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g1506
77-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g1507
78-
79-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g1518
80-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g1519
81-
82-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g3505
83-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g3506
84-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g3507
85-
86-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g3105
87-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g3106
88-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g3107
89-
90-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g3518
91-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0g3519
92-
93-
# L Series
94-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0l1105
95-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0l1106
96-
97-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0l1227
98-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0l1228
99-
100-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0l1304
101-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0l1305
102-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0l1306
103-
104-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0l1343
105-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0l1344
106-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0l1345
107-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0l1346
108-
109-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0l2227
110-
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,mspm0l2228
62+
# Iterate over each chip that was generated in metapac and build it.
63+
#
64+
# TODO: Parallelize this to speed up checks?
65+
for feature in build/mspm0-metapac/src/chips/*/; do
66+
feature=$(basename "$feature")
67+
cargo build --release --manifest-path build/mspm0-metapac/Cargo.toml --features pac,metadata,$feature
68+
done
11169
;;
11270
*)
11371
echo "unknown command"

mspm0-data-gen/src/clock_tree.rs

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,30 @@ impl ClockTree {
1919
let mut clock_trees = BTreeMap::new();
2020
let sysconfigs = data_sources.join("sysconfig");
2121

22-
for path in glob::glob(&format!("{}/**/clocktree.json", sysconfigs.display())).unwrap() {
23-
if let Ok(path) = path {
24-
let Some(name) = path.iter().nth_back(1) else {
25-
continue;
26-
};
27-
28-
let name = name.to_string_lossy().to_lowercase();
29-
let content = fs::read_to_string(path)?;
30-
let clock_tree = serde_json::from_str::<ClockTree>(&content)?;
31-
32-
if name.contains("c110x") {
33-
for entry in clock_tree.ip_instances.iter() {
34-
match entry.ty.as_str() {
35-
"Divider" | "Mux" => {
36-
// dbg!(&entry);
37-
}
38-
_ => {}
22+
for path in glob::glob(&format!("{}/**/clocktree.json", sysconfigs.display()))
23+
.unwrap()
24+
.flatten()
25+
{
26+
let Some(name) = path.iter().nth_back(1) else {
27+
continue;
28+
};
29+
30+
let name = name.to_string_lossy().to_lowercase();
31+
let content = fs::read_to_string(path)?;
32+
let clock_tree = serde_json::from_str::<ClockTree>(&content)?;
33+
34+
if name.contains("c110x") {
35+
for entry in clock_tree.ip_instances.iter() {
36+
match entry.ty.as_str() {
37+
"Divider" | "Mux" => {
38+
// dbg!(&entry);
3939
}
40+
_ => {}
4041
}
4142
}
42-
43-
clock_trees.insert(name, clock_tree);
4443
}
44+
45+
clock_trees.insert(name, clock_tree);
4546
}
4647

4748
Ok(clock_trees)

mspm0-data-gen/src/generate.rs

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,18 +58,34 @@ fn generate_family(
5858
int_groups: &BTreeMap<String, Groups>,
5959
) -> anyhow::Result<()> {
6060
// Data shared across all chips in a family.
61-
let packages = get_packages(&family.family, &sysconfig)?;
62-
let iomux = generate_pincm(&family.family, &sysconfig)?;
63-
let peripherals = generate_peripherals2(&family.family, header, &sysconfig)?;
61+
let packages = get_packages(&family.family, sysconfig)?;
62+
let iomux = generate_pincm(&family.family, sysconfig)?;
63+
let peripherals = generate_peripherals2(&family.family, header, sysconfig)?;
6464
let interrupts = generate_irqs(&family.family, header, int_groups)?;
65-
let dma_channels = generate_dma_channels(&family.family, &sysconfig)?;
65+
let dma_channels = generate_dma_channels(&family.family, sysconfig)?;
6666

6767
for part_number in family.part_numbers.iter() {
6868
// Filter for package types available on the part number.
6969
let packages = packages
7070
.iter()
7171
.filter(|package| part_number.packages.contains(&package.package))
72-
.cloned();
72+
.cloned()
73+
.map(|package| {
74+
// We need to build the actual chip name, including package.
75+
//
76+
// e.g. mspm0c1104dgs20
77+
//
78+
// however this really should be something like mspm0c1104**s**dgs20 or mspm0c1104**q**dgs20
79+
let mut chip = part_number.name.clone();
80+
chip.push_str(&package.package.to_lowercase());
81+
82+
Package {
83+
name: package.name,
84+
chip,
85+
package: package.package,
86+
pins: package.pins,
87+
}
88+
});
7389

7490
let chip = Chip {
7591
name: part_number.name.clone(),
@@ -108,7 +124,7 @@ fn get_packages(family: &str, sysconfig: &SysconfigFile) -> anyhow::Result<Vec<P
108124
for package in sysconfig.packages.values() {
109125
let raw_name = &package.name;
110126

111-
let captures = PATTERN.captures(&raw_name).unwrap();
127+
let captures = PATTERN.captures(raw_name).unwrap();
112128
let name = &captures["name"];
113129
let package_name = &captures["package"];
114130

@@ -278,7 +294,7 @@ fn generate_peripherals2(
278294
let pin = device_pin_name
279295
.split_once('/')
280296
.map(|(a, _)| a)
281-
.unwrap_or_else(|| &device_pin_name)
297+
.unwrap_or_else(|| device_pin_name)
282298
.to_string();
283299

284300
if skip_peripheral_pin(device_pin_name, chip_name) {

mspm0-data-gen/src/header.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ impl Headers {
2727
let name = name.to_string_lossy();
2828

2929
let name = name.split(".h").next().unwrap();
30-
headers.insert(name.to_string(), Header::read(&name, &header)?);
30+
headers.insert(name.to_string(), Header::read(name, &header)?);
3131
}
3232

3333
Ok(Self { headers })
@@ -96,7 +96,7 @@ impl Header {
9696
}
9797

9898
assert!(
99-
peripherals.len() > 0,
99+
!peripherals.is_empty(),
100100
"{chip_name}: no matches in header for peripherals and addresses"
101101
);
102102

@@ -142,7 +142,7 @@ impl Header {
142142
}
143143

144144
assert!(
145-
irqs.len() > 0,
145+
!irqs.is_empty(),
146146
"{chip_name}: no matches in header for irq numbers"
147147
);
148148

mspm0-metapac-gen/res/metadata.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
#[derive(Debug, Eq, PartialEq, Clone)]
22
pub struct Metadata {
33
pub name: &'static str,
4+
pub family: &'static str,
45
// pub memory: &'static [MemoryRegion],
56
pub peripherals: &'static [Peripheral],
6-
pub pincm_mappings: &'static [PinCmMapping],
7+
pub pins: &'static [Pin],
78
// pub nvic_priority_bits: Option<u8>,
89
pub interrupts: &'static [Interrupt],
910
pub dma_channels: &'static [DmaChannel],
@@ -17,7 +18,7 @@ pub struct Peripheral {
1718
}
1819

1920
#[derive(Debug, Eq, PartialEq, Clone)]
20-
pub struct PinCmMapping {
21+
pub struct Pin {
2122
pub pin: &'static str,
2223
pub pincm: u8,
2324
}

mspm0-metapac-gen/src/interrupt.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ fn group_enum(interrupt: &Interrupt) -> TokenStream {
6060
let name = Ident::new(&interrupt.name.to_pascal_case(), Span::call_site());
6161

6262
let members = interrupt.group.iter().map(|(index, interrupt)| {
63-
let ident = Ident::new(&interrupt, Span::call_site());
63+
let ident = Ident::new(interrupt, Span::call_site());
6464
let value = Literal::u8_unsuffixed(*index as _);
6565

6666
quote! {
@@ -69,7 +69,7 @@ fn group_enum(interrupt: &Interrupt) -> TokenStream {
6969
});
7070

7171
let matches = interrupt.group.iter().map(|(index, interrupt)| {
72-
let ident = Ident::new(&interrupt, Span::call_site());
72+
let ident = Ident::new(interrupt, Span::call_site());
7373
let value = Literal::u8_unsuffixed(*index as _);
7474

7575
quote! {

mspm0-metapac-gen/src/krate.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::{collections::BTreeMap, fs, path::Path};
22

33
use mspm0_data_types::Chip;
44

5-
pub fn generate<'a>(out_dir: &Path, chips: &BTreeMap<String, Chip>) -> anyhow::Result<()> {
5+
pub fn generate(out_dir: &Path, chips: &BTreeMap<String, Chip>) -> anyhow::Result<()> {
66
use std::fmt::Write;
77

88
fs::copy("mspm0-metapac-gen/res/build.rs", out_dir.join("build.rs"))?;
@@ -16,8 +16,11 @@ pub fn generate<'a>(out_dir: &Path, chips: &BTreeMap<String, Chip>) -> anyhow::R
1616

1717
writeln!(cargo_toml, "# Chip features - automatically generated")?;
1818

19-
for (name, _) in chips {
20-
writeln!(cargo_toml, "{name} = []")?;
19+
// Features are done by chip and package.
20+
for (name, chip) in chips {
21+
for package in chip.packages.iter() {
22+
writeln!(cargo_toml, "{name}{} = []", package.package.to_lowercase())?;
23+
}
2124
}
2225

2326
fs::write(out_dir.join("Cargo.toml"), cargo_toml)?;

mspm0-metapac-gen/src/linker.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::{
77
use mspm0_data_types::Chip;
88

99
pub fn generate_device_x(name: &str, chip: &Chip, out_dir: &Path) -> anyhow::Result<()> {
10-
let dir = out_dir.join("src/chips").join(&name);
10+
let dir = out_dir.join("src/chips").join(name);
1111
fs::create_dir_all(&dir)?;
1212

1313
let path = dir.join("device.x");
@@ -26,7 +26,7 @@ pub fn generate_device_x(name: &str, chip: &Chip, out_dir: &Path) -> anyhow::Res
2626
}
2727

2828
pub fn generate_memory_x(name: &str, chip: &Chip, out_dir: &Path) -> anyhow::Result<()> {
29-
let dir = out_dir.join("src/chips").join(&name);
29+
let dir = out_dir.join("src/chips").join(name);
3030
fs::create_dir_all(&dir)?;
3131

3232
let path = dir.join("memory.x");

0 commit comments

Comments
 (0)