Skip to content

Commit c187416

Browse files
committed
merge config options
1 parent 50ba4d9 commit c187416

File tree

5 files changed

+192
-208
lines changed

5 files changed

+192
-208
lines changed

svd-encoder/src/config.rs

Lines changed: 72 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -178,34 +178,78 @@ pub enum Sorting {
178178
Name,
179179
}
180180

181-
impl FromStr for Sorting {
181+
impl Sorting {
182+
fn from_parts(parts: &[&str]) -> Option<Self> {
183+
if parts.contains(&"Offset") {
184+
Some(Self::Offset)
185+
} else if parts.contains(&"OffsetReserved") {
186+
Some(Self::OffsetReversed)
187+
} else if parts.contains(&"Name") {
188+
Some(Self::Name)
189+
} else {
190+
None
191+
}
192+
}
193+
}
194+
195+
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
196+
pub enum DerivableSorting {
197+
Unchanged(Option<Sorting>),
198+
DeriveLast(Option<Sorting>),
199+
}
200+
201+
impl DerivableSorting {
202+
fn from_parts(parts: &[&str]) -> Self {
203+
let sorting = Sorting::from_parts(parts);
204+
if parts.contains(&"DerivedLast") {
205+
Self::DeriveLast(sorting)
206+
} else {
207+
Self::Unchanged(sorting)
208+
}
209+
}
210+
}
211+
212+
impl FromStr for DerivableSorting {
182213
type Err = ();
183214

184215
fn from_str(s: &str) -> Result<Self, Self::Err> {
185-
match s {
186-
"Offset" => Ok(Self::Offset),
187-
"OffsetReversed" => Ok(Self::OffsetReversed),
188-
"Name" => Ok(Self::OffsetReversed),
189-
_ => Err(()),
190-
}
216+
let parts = s.split(',').collect::<Vec<_>>();
217+
Ok(DerivableSorting::from_parts(&parts))
218+
}
219+
}
220+
221+
impl Default for DerivableSorting {
222+
fn default() -> Self {
223+
Self::Unchanged(None)
191224
}
192225
}
193226

194227
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
195-
pub enum RegistersOrClustersFirst {
196-
Registers,
197-
Clusters,
228+
pub enum RcSorting {
229+
Unchanged(DerivableSorting),
230+
RegistersFirst(DerivableSorting),
231+
ClustersFirst(DerivableSorting),
198232
}
199233

200-
impl FromStr for RegistersOrClustersFirst {
234+
impl Default for RcSorting {
235+
fn default() -> Self {
236+
Self::Unchanged(Default::default())
237+
}
238+
}
239+
240+
impl FromStr for RcSorting {
201241
type Err = ();
202242

203243
fn from_str(s: &str) -> Result<Self, Self::Err> {
204-
match s {
205-
"Registers" => Ok(Self::Registers),
206-
"Clusters" => Ok(Self::Clusters),
207-
_ => Err(()),
208-
}
244+
let parts = s.split(',').collect::<Vec<_>>();
245+
let derivable_sorting = DerivableSorting::from_parts(&parts);
246+
Ok(if parts.contains(&"RegistersFirst") {
247+
Self::RegistersFirst(derivable_sorting)
248+
} else if parts.contains(&"ClustersFirst") {
249+
Self::ClustersFirst(derivable_sorting)
250+
} else {
251+
Self::Unchanged(derivable_sorting)
252+
})
209253
}
210254
}
211255

@@ -228,10 +272,7 @@ pub struct Config {
228272
pub peripheral_base_address: NumberFormat,
229273

230274
/// Sort peripherals in specified order
231-
pub peripheral_sorting: Option<Sorting>,
232-
233-
/// Place derived peripherals in the end
234-
pub peripheral_derived_last: bool,
275+
pub peripheral_sorting: DerivableSorting,
235276

236277
/// Format of addressBlock's offset element
237278
///
@@ -259,13 +300,7 @@ pub struct Config {
259300
pub cluster_address_offset: NumberFormat,
260301

261302
/// Sort registers and clusters in specified order
262-
pub register_cluster_sorting: Option<Sorting>,
263-
264-
/// First write registers or clusters
265-
pub registers_or_clusters_first: Option<RegistersOrClustersFirst>,
266-
267-
/// Place derived registers and clusters in the end
268-
pub register_cluster_derived_last: bool,
303+
pub register_cluster_sorting: RcSorting,
269304

270305
/// Format of register's name-kind elements
271306
/// - `derivedFrom`
@@ -304,10 +339,7 @@ pub struct Config {
304339
pub field_bit_range: Option<FieldBitRangeFormat>,
305340

306341
/// Sort fields in specified order
307-
pub field_sorting: Option<Sorting>,
308-
309-
/// Place derived fields in the end
310-
pub field_derived_last: bool,
342+
pub field_sorting: DerivableSorting,
311343

312344
/// Format of enumeratedValues's name-kind elements
313345
/// - `derivedFrom`
@@ -342,25 +374,21 @@ impl Default for Config {
342374
Self {
343375
peripheral_name: None,
344376
peripheral_base_address: NumberFormat::UpperHex8,
345-
peripheral_sorting: None,
346-
peripheral_derived_last: false,
377+
peripheral_sorting: Default::default(),
347378
address_block_offset: NumberFormat::UpperHex,
348379
address_block_size: NumberFormat::UpperHex,
349380
interrupt_name: None,
350381
cluster_name: None,
351382
cluster_address_offset: NumberFormat::UpperHex,
352-
register_cluster_sorting: None,
353-
registers_or_clusters_first: None,
354-
register_cluster_derived_last: false,
383+
register_cluster_sorting: Default::default(),
355384
register_name: None,
356385
register_address_offset: NumberFormat::UpperHex,
357386
register_size: NumberFormat::LowerHex,
358387
register_reset_value: NumberFormat::UpperHex16,
359388
register_reset_mask: NumberFormat::UpperHex16,
360389
field_name: None,
361390
field_bit_range: None,
362-
field_sorting: None,
363-
field_derived_last: false,
391+
field_sorting: Default::default(),
364392
enumerated_values_name: None,
365393
enumerated_value_name: None,
366394
enumerated_value_value: NumberFormat::Dec,
@@ -379,31 +407,21 @@ impl Config {
379407
match name {
380408
"peripheral_name" => self.peripheral_name = Some(value.parse().unwrap()),
381409
"peripheral_base_address" => self.peripheral_base_address = value.parse().unwrap(),
382-
"peripheral_sorting" => self.peripheral_sorting = Some(value.parse().unwrap()),
383-
"peripheral_derived_last" => self.peripheral_derived_last = value.parse().unwrap(),
410+
"peripheral_sorting" => self.peripheral_sorting = value.parse().unwrap(),
384411
"address_block_offset" => self.address_block_offset = value.parse().unwrap(),
385412
"address_block_size" => self.address_block_size = value.parse().unwrap(),
386413
"interrupt_name" => self.interrupt_name = Some(value.parse().unwrap()),
387414
"cluster_name" => self.cluster_name = Some(value.parse().unwrap()),
388415
"cluster_address_offset" => self.cluster_address_offset = value.parse().unwrap(),
389-
"register_cluster_sorting" => {
390-
self.register_cluster_sorting = Some(value.parse().unwrap())
391-
}
392-
"registers_or_clusters_first" => {
393-
self.registers_or_clusters_first = Some(value.parse().unwrap())
394-
}
395-
"register_cluster_derived_last" => {
396-
self.register_cluster_derived_last = value.parse().unwrap()
397-
}
416+
"register_cluster_sorting" => self.register_cluster_sorting = value.parse().unwrap(),
398417
"register_name" => self.register_name = Some(value.parse().unwrap()),
399418
"register_address_offset" => self.register_address_offset = value.parse().unwrap(),
400419
"register_size" => self.register_size = value.parse().unwrap(),
401420
"register_reset_value" => self.register_reset_value = value.parse().unwrap(),
402421
"register_reset_mask" => self.register_reset_mask = value.parse().unwrap(),
403422
"field_name" => self.field_name = Some(value.parse().unwrap()),
404423
"field_bit_range" => self.field_bit_range = Some(value.parse().unwrap()),
405-
"field_sorting" => self.field_sorting = Some(value.parse().unwrap()),
406-
"field_derived_last" => self.field_derived_last = value.parse().unwrap(),
424+
"field_sorting" => self.field_sorting = value.parse().unwrap(),
407425
"enumerated_values_name" => self.enumerated_values_name = Some(value.parse().unwrap()),
408426
"enumerated_value_name" => self.enumerated_value_name = Some(value.parse().unwrap()),
409427
"enumerated_value_value" => self.enumerated_value_value = value.parse().unwrap(),
@@ -435,19 +453,11 @@ impl Config {
435453
/// Sort peripherals in specified order
436454
///
437455
/// `None` means keep the original order
438-
pub fn peripheral_sorting(mut self, val: Option<Sorting>) -> Self {
456+
pub fn peripheral_sorting(mut self, val: DerivableSorting) -> Self {
439457
self.peripheral_sorting = val;
440458
self
441459
}
442460

443-
/// Place derived peripherals in the end
444-
///
445-
/// `false` means keep the original order
446-
pub fn peripheral_derived_last(mut self, val: bool) -> Self {
447-
self.peripheral_derived_last = val;
448-
self
449-
}
450-
451461
/// Format of addressBlock's offset element
452462
///
453463
/// format: hex, dec
@@ -487,27 +497,11 @@ impl Config {
487497
/// Sort registers and clusters in specified order
488498
///
489499
/// `None` means keep the original order
490-
pub fn register_cluster_sorting(mut self, val: Option<Sorting>) -> Self {
500+
pub fn register_cluster_sorting(mut self, val: RcSorting) -> Self {
491501
self.register_cluster_sorting = val;
492502
self
493503
}
494504

495-
/// First write registers or clusters
496-
///
497-
/// `None` means only `register_cluster_sorting` does matter
498-
pub fn registers_or_clusters_first(mut self, val: Option<RegistersOrClustersFirst>) -> Self {
499-
self.registers_or_clusters_first = val;
500-
self
501-
}
502-
503-
/// Place derived registers and clusters in the end
504-
///
505-
/// `false` means keep the original order
506-
pub fn register_cluster_derived_last(mut self, val: bool) -> Self {
507-
self.register_cluster_derived_last = val;
508-
self
509-
}
510-
511505
/// Format of register's name-kind elements
512506
pub fn register_name(mut self, val: Option<IdentifierFormat>) -> Self {
513507
self.register_name = val;
@@ -563,19 +557,11 @@ impl Config {
563557
/// Sort fields in specified order
564558
///
565559
/// `None` means keep the original order
566-
pub fn field_sorting(mut self, val: Option<Sorting>) -> Self {
560+
pub fn field_sorting(mut self, val: DerivableSorting) -> Self {
567561
self.field_sorting = val;
568562
self
569563
}
570564

571-
/// Place derived fields in the end
572-
///
573-
/// `false` means keep the original order
574-
pub fn field_derived_last(mut self, val: bool) -> Self {
575-
self.field_derived_last = val;
576-
self
577-
}
578-
579565
/// Format of enumeratedValues's name-kind elements
580566
pub fn enumerated_values_name(mut self, val: Option<IdentifierFormat>) -> Self {
581567
self.enumerated_values_name = val;

svd-encoder/src/device.rs

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
use svd_rs::Peripheral;
22

33
use super::{new_node, Config, Element, Encode, EncodeChildren, EncodeError, XMLNode};
4-
use crate::{config::Sorting, svd::Device};
4+
use crate::{
5+
config::{DerivableSorting, Sorting},
6+
svd::Device,
7+
};
58

69
impl Encode for Device {
710
type Error = EncodeError;
@@ -60,20 +63,16 @@ impl Encode for Device {
6063
);
6164

6265
let peripherals: Result<Vec<_>, _> =
63-
if !config.peripheral_derived_last && config.peripheral_sorting.is_none() {
66+
if config.peripheral_sorting == DerivableSorting::Unchanged(None) {
6467
self.peripherals
6568
.iter()
6669
.map(|peripheral| peripheral.encode_node_with_config(config))
6770
.collect()
6871
} else {
69-
sort_derived_peripherals(
70-
&self.peripherals,
71-
config.peripheral_sorting,
72-
config.peripheral_derived_last,
73-
)
74-
.into_iter()
75-
.map(|peripheral| peripheral.encode_node_with_config(config))
76-
.collect()
72+
sort_derived_peripherals(&self.peripherals, config.peripheral_sorting)
73+
.into_iter()
74+
.map(|peripheral| peripheral.encode_node_with_config(config))
75+
.collect()
7776
};
7877

7978
elem.children.push({
@@ -109,25 +108,27 @@ fn sort_peripherals(refs: &mut [&Peripheral], sorting: Option<Sorting>) {
109108

110109
fn sort_derived_peripherals(
111110
peripherals: &[Peripheral],
112-
sorting: Option<Sorting>,
113-
derived_last: bool,
111+
sorting: DerivableSorting,
114112
) -> Vec<&Peripheral> {
115-
if derived_last {
116-
let mut common_refs = peripherals
117-
.iter()
118-
.filter(|p| p.derived_from.is_none())
119-
.collect::<Vec<_>>();
120-
let mut derived_refs = peripherals
121-
.iter()
122-
.filter(|p| p.derived_from.is_some())
123-
.collect::<Vec<_>>();
124-
sort_peripherals(&mut common_refs, sorting);
125-
sort_peripherals(&mut derived_refs, sorting);
126-
common_refs.extend(derived_refs);
127-
common_refs
128-
} else {
129-
let mut refs = peripherals.iter().collect::<Vec<_>>();
130-
sort_peripherals(&mut refs, sorting);
131-
refs
113+
match sorting {
114+
DerivableSorting::Unchanged(sorting) => {
115+
let mut refs = peripherals.iter().collect::<Vec<_>>();
116+
sort_peripherals(&mut refs, sorting);
117+
refs
118+
}
119+
DerivableSorting::DeriveLast(sorting) => {
120+
let mut common_refs = peripherals
121+
.iter()
122+
.filter(|p| p.derived_from.is_none())
123+
.collect::<Vec<_>>();
124+
let mut derived_refs = peripherals
125+
.iter()
126+
.filter(|p| p.derived_from.is_some())
127+
.collect::<Vec<_>>();
128+
sort_peripherals(&mut common_refs, sorting);
129+
sort_peripherals(&mut derived_refs, sorting);
130+
common_refs.extend(derived_refs);
131+
common_refs
132+
}
132133
}
133134
}

svd-encoder/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::svd::Device;
77
use xmltree::{Element, EmitterConfig, XMLNode};
88

99
pub use crate::config::{
10-
Config, IdentifierFormat, NumberFormat, RegistersOrClustersFirst, Sorting,
10+
Config, DerivableSorting, IdentifierFormat, NumberFormat, RcSorting, Sorting,
1111
};
1212

1313
#[derive(Clone, Copy, Debug, PartialEq, Eq, thiserror::Error)]

0 commit comments

Comments
 (0)