Skip to content

Commit d9423df

Browse files
bors[bot]burrbull
andauthored
Merge #629
629: sort fields & register sizes r=therealprof a=burrbull r? `@Emilgardis` Co-authored-by: Andrey Zgarbul <[email protected]>
2 parents ff4c6c9 + d6a475c commit d9423df

File tree

3 files changed

+21
-13
lines changed

3 files changed

+21
-13
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1111
case conversation traits
1212
- Add new feature `feature_group` which will generate cfg attribute for
1313
every group name when it is on
14+
- Sort fields by offset before process
1415

1516
## [v0.24.1] - 2022-07-04
1617

src/generate/register.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ pub fn render(
151151

152152
if !cur_fields.is_empty() {
153153
fields(
154-
&cur_fields,
154+
cur_fields,
155155
register,
156156
&name_constant_case_spec,
157157
all_registers,
@@ -317,7 +317,7 @@ pub fn render(
317317

318318
#[allow(clippy::too_many_arguments)]
319319
pub fn fields(
320-
fields: &[&Field],
320+
mut fields: Vec<&Field>,
321321
register: &Register,
322322
name_constant_case_spec: &Ident,
323323
all_registers: &[&Register],
@@ -335,6 +335,8 @@ pub fn fields(
335335
let can_read = access.can_read();
336336
let can_write = access.can_write();
337337

338+
fields.sort_by_key(|f| f.bit_offset());
339+
338340
// TODO enumeratedValues
339341
let inline = quote! { #[inline(always)] };
340342
for f in fields.iter() {
@@ -366,7 +368,7 @@ pub fn fields(
366368

367369
let lookup_results = lookup(
368370
evs,
369-
fields,
371+
&fields,
370372
register,
371373
all_registers,
372374
peripheral,
@@ -1044,13 +1046,23 @@ fn derive_from_base(
10441046
});
10451047
}
10461048

1047-
#[derive(Clone, Debug)]
1049+
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
10481050
pub struct Base<'a> {
10491051
pub peripheral: Option<&'a str>,
10501052
pub register: Option<&'a str>,
10511053
pub field: &'a str,
10521054
}
10531055

1056+
impl<'a> Base<'a> {
1057+
pub fn from_field(field: &'a str) -> Self {
1058+
Self {
1059+
peripheral: None,
1060+
register: None,
1061+
field,
1062+
}
1063+
}
1064+
}
1065+
10541066
fn lookup<'a>(
10551067
evs: &'a [EnumeratedValues],
10561068
fields: &'a [&'a Field],
@@ -1208,14 +1220,7 @@ fn lookup_in_register<'r>(
12081220
base_evs,
12091221
register.name
12101222
)),
1211-
[(evs, field)] => Ok((
1212-
evs,
1213-
Some(Base {
1214-
field,
1215-
register: None,
1216-
peripheral: None,
1217-
}),
1218-
)),
1223+
[(evs, field)] => Ok((evs, Some(Base::from_field(field)))),
12191224
matches => {
12201225
let fields = matches.iter().map(|(f, _)| &f.name).collect::<Vec<_>>();
12211226
Err(anyhow!(

src/util.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ fn handle_erc_error<T>(msg: &str, name: &str, descrip: &str, res: Result<T>) ->
456456
res.with_context(|| format!("{}\nName: {}\nDescription: {}", msg, name, descrip))
457457
}
458458

459-
pub fn get_register_sizes(d: &Device) -> HashSet<u32> {
459+
pub fn get_register_sizes(d: &Device) -> Vec<u32> {
460460
let mut reg_sizes = HashSet::new();
461461
for p in &d.peripherals {
462462
for r in p.all_registers() {
@@ -465,6 +465,8 @@ pub fn get_register_sizes(d: &Device) -> HashSet<u32> {
465465
}
466466
}
467467
}
468+
let mut reg_sizes: Vec<_> = reg_sizes.into_iter().collect();
469+
reg_sizes.sort();
468470
reg_sizes
469471
}
470472

0 commit comments

Comments
 (0)