Skip to content

Commit 6c39534

Browse files
committed
Move field with derived enums before other
1 parent 9fbd8a0 commit 6c39534

File tree

5 files changed

+35
-57
lines changed

5 files changed

+35
-57
lines changed

CHANGELOG-rust.md

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ This changelog tracks the Rust `svdtools` project. See
55

66
## [Unreleased]
77

8+
* Move field with derived enums before other
9+
810
## [v0.3.4] 2023-10-14
911

1012
* Revert #145

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ liquid = "0.26.0"
4747
once_cell = "1.18.0"
4848
rayon = "1.7.0"
4949
regex = "1.9.1"
50+
itertools = "0.11.0"
5051

5152
[dev-dependencies]
5253
tempfile = "3.3"

src/patch/device.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use anyhow::{anyhow, Context};
2+
use itertools::Itertools;
23
use svd_parser::svd::{Device, Peripheral, PeripheralInfo};
34
use yaml_rust::{yaml::Hash, Yaml};
45

@@ -389,11 +390,7 @@ impl DeviceExt for Device {
389390
if pcount == 0 {
390391
Err(anyhow!(
391392
"Could not find `{pspec}. Present peripherals: {}.`",
392-
self.peripherals
393-
.iter()
394-
.map(|p| p.name.as_str())
395-
.collect::<Vec<_>>()
396-
.join(", ")
393+
self.peripherals.iter().map(|p| p.name.as_str()).join(", ")
397394
))
398395
} else {
399396
Ok(())

src/patch/peripheral.rs

+8-27
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use anyhow::{anyhow, Context};
2+
use itertools::Itertools;
23
use svd_parser::svd::{
34
self, Cluster, ClusterInfo, DimElement, Interrupt, Peripheral, Register, RegisterCluster,
45
RegisterInfo,
@@ -487,10 +488,7 @@ impl RegisterBlockExt for Peripheral {
487488
self.get_register(rderive).ok_or_else(|| {
488489
anyhow!(
489490
"register {rderive} not found. Present registers: {}.`",
490-
self.registers()
491-
.map(|r| r.name.as_str())
492-
.collect::<Vec<_>>()
493-
.join(", ")
491+
self.registers().map(|r| r.name.as_str()).join(", ")
494492
)
495493
})?;
496494

@@ -652,10 +650,7 @@ impl RegisterBlockExt for Peripheral {
652650
if rcount == 0 {
653651
Err(anyhow!(
654652
"Could not find `{pname}:{rspec}. Present registers: {}.`",
655-
self.registers()
656-
.map(|r| r.name.as_str())
657-
.collect::<Vec<_>>()
658-
.join(", ")
653+
self.registers().map(|r| r.name.as_str()).join(", ")
659654
))
660655
} else {
661656
Ok(())
@@ -674,10 +669,7 @@ impl RegisterBlockExt for Peripheral {
674669
if ccount == 0 {
675670
Err(anyhow!(
676671
"Could not find `{pname}:{cspec}. Present clusters: {}.`",
677-
self.clusters()
678-
.map(|c| c.name.as_str())
679-
.collect::<Vec<_>>()
680-
.join(", ")
672+
self.clusters().map(|c| c.name.as_str()).join(", ")
681673
))
682674
} else {
683675
Ok(())
@@ -966,10 +958,7 @@ impl RegisterBlockExt for Cluster {
966958
self.get_register(rderive).ok_or_else(|| {
967959
anyhow!(
968960
"register {rderive} not found. Present registers: {}.`",
969-
self.registers()
970-
.map(|r| r.name.as_str())
971-
.collect::<Vec<_>>()
972-
.join(", ")
961+
self.registers().map(|r| r.name.as_str()).join(", ")
973962
)
974963
})?;
975964

@@ -1117,10 +1106,7 @@ impl RegisterBlockExt for Cluster {
11171106
Err(anyhow!(
11181107
"Could not find `{pname}:{}:{rspec}. Present registers: {}.`",
11191108
self.name,
1120-
self.registers()
1121-
.map(|r| r.name.as_str())
1122-
.collect::<Vec<_>>()
1123-
.join(", ")
1109+
self.registers().map(|r| r.name.as_str()).join(", ")
11241110
))
11251111
} else {
11261112
Ok(())
@@ -1140,10 +1126,7 @@ impl RegisterBlockExt for Cluster {
11401126
Err(anyhow!(
11411127
"Could not find `{pname}:{}:{cspec}. Present clusters: {}.`",
11421128
self.name,
1143-
self.clusters()
1144-
.map(|c| c.name.as_str())
1145-
.collect::<Vec<_>>()
1146-
.join(", ")
1129+
self.clusters().map(|c| c.name.as_str()).join(", ")
11471130
))
11481131
} else {
11491132
Ok(())
@@ -1179,7 +1162,6 @@ fn collect_in_array(
11791162
RegisterCluster::Register(r) => Some(r.name.as_str()),
11801163
_ => None,
11811164
})
1182-
.collect::<Vec<_>>()
11831165
.join(", ")
11841166
));
11851167
}
@@ -1298,7 +1280,6 @@ fn collect_in_cluster(
12981280
RegisterCluster::Register(r) => Some(r.name.as_str()),
12991281
_ => None,
13001282
})
1301-
.collect::<Vec<_>>()
13021283
.join(", ")
13031284
));
13041285
}
@@ -1347,7 +1328,7 @@ fn collect_in_cluster(
13471328
if dim > 1 {
13481329
dim_increment = offsets[1] - offsets[0];
13491330
}
1350-
first = Some(rspec.clone());
1331+
first = Some(rspec);
13511332
}
13521333
if !check_offsets(&offsets, dim_increment) {
13531334
return Err(anyhow!(

src/patch/register.rs

+22-25
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use anyhow::{anyhow, Context};
2+
use itertools::Itertools;
23
use svd_parser::svd::{
34
Access, BitRange, DimElement, EnumeratedValues, Field, FieldInfo, ModifiedWriteValues,
45
ReadAction, Register, RegisterInfo, Usage, WriteConstraint, WriteConstraintRange,
@@ -323,10 +324,7 @@ impl RegisterExt for Register {
323324
return Err(anyhow!(
324325
"Could not find any fields to merge {}:{key}. Present fields: {}.`",
325326
self.name,
326-
self.fields()
327-
.map(|f| f.name.as_str())
328-
.collect::<Vec<_>>()
329-
.join(", ")
327+
self.fields().map(|f| f.name.as_str()).join(", ")
330328
));
331329
}
332330
let mut bitwidth = 0;
@@ -377,10 +375,7 @@ impl RegisterExt for Register {
377375
return Err(anyhow!(
378376
"{}: fields {fspec} not found. Present fields: {}.`",
379377
self.name,
380-
self.fields()
381-
.map(|f| f.name.as_str())
382-
.collect::<Vec<_>>()
383-
.join(", ")
378+
self.fields().map(|f| f.name.as_str()).join(", ")
384379
));
385380
}
386381
fields.sort_by_key(|f| f.bit_range.offset);
@@ -443,10 +438,7 @@ impl RegisterExt for Register {
443438
return Err(anyhow!(
444439
"Could not find any fields to split {}:{fspec}. Present fields: {}.`",
445440
self.name,
446-
self.fields()
447-
.map(|f| f.name.as_str())
448-
.collect::<Vec<_>>()
449-
.join(", ")
441+
self.fields().map(|f| f.name.as_str()).join(", ")
450442
));
451443
}
452444
(Some(_), Some(_)) => {
@@ -697,21 +689,22 @@ impl RegisterExt for Register {
697689
set_enum(ftag, evs.clone(), orig_usage, true, access)?;
698690
}
699691
} else {
700-
let offsets = self
701-
.iter_fields(fspec)
702-
.map(|f| (f.bit_range.offset, f.name.to_string()))
703-
.collect::<Vec<_>>();
692+
let mut offsets: Vec<_> = Vec::new();
693+
for (i, f) in self.fields().enumerate() {
694+
if matchname(&f.name, fspec) {
695+
offsets.push((f.bit_range.offset, f.name.to_string(), i));
696+
}
697+
}
704698
if offsets.is_empty() {
705699
return Err(anyhow!(
706700
"Could not find field {pname}:{}:{fspec}. Present fields: {}.`",
707701
self.name,
708-
self.fields()
709-
.map(|f| f.name.as_str())
710-
.collect::<Vec<_>>()
711-
.join(", ")
702+
self.fields().map(|f| f.name.as_str()).join(", ")
712703
));
713704
}
714-
let (min_offset, fname) = offsets.iter().min_by_key(|on| on.0).unwrap();
705+
let (min_offset, fname, min_offset_pos) =
706+
offsets.iter().min_by_key(|&on| on.0).unwrap();
707+
let min_pos = offsets.iter().map(|on| on.2).min().unwrap();
715708
let name = make_ev_name(&fname.replace("%s", ""), usage)?;
716709
for ftag in self.iter_fields(fspec) {
717710
let access = ftag.access.or(reg_access).unwrap_or_default();
@@ -735,6 +728,13 @@ impl RegisterExt for Register {
735728
)?;
736729
}
737730
}
731+
// Move field with derived enums before other
732+
if let Some(fields) = self.fields.as_mut() {
733+
if *min_offset_pos != min_pos {
734+
let f = fields.remove(*min_offset_pos);
735+
fields.insert(min_pos, f);
736+
}
737+
}
738738
}
739739
Ok(())
740740
}
@@ -752,10 +752,7 @@ impl RegisterExt for Register {
752752
return Err(anyhow!(
753753
"Could not find field {pname}:{}:{fspec}. Present fields: {}.`",
754754
self.name,
755-
self.fields()
756-
.map(|f| f.name.as_str())
757-
.collect::<Vec<_>>()
758-
.join(", ")
755+
self.fields().map(|f| f.name.as_str()).join(", ")
759756
));
760757
}
761758
Ok(())

0 commit comments

Comments
 (0)