Skip to content

Commit 0963854

Browse files
authored
Merge pull request #208 from rust-embedded/enumname
specify `name` for `enumeratedValues`
2 parents 0c36eae + e0c1517 commit 0963854

File tree

6 files changed

+43
-38
lines changed

6 files changed

+43
-38
lines changed

CHANGELOG-python.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ This changelog tracks the Python `svdtools` project. See
66
## [Unreleased]
77

88
* Fix #176 in `collect_in_cluster`
9+
* Allow to specify `name` for `enumeratedValues`
910

1011
## [v0.1.27] 2023-12-23
1112

CHANGELOG-rust.md

Lines changed: 2 additions & 0 deletions
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+
* Allow to specify `name` for `enumeratedValues`
9+
810
## [v0.3.9] 2024-01-19
911

1012
* Use `<details>` instead of JavaScript in `html` template

Cargo.toml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ rust-version = "1.70"
2828
clap = { version = "4.4", features = ["derive", "cargo", "color"] }
2929
serde = { version = "1.0", features = ["derive"] }
3030
quick-xml = { version = "0.31", features = ["serialize"] }
31-
svd-rs = { version = "0.14.6", features = ["serde", "derive-from"] }
32-
svd-parser = { version = "0.14.4", features = ["expand"] }
31+
svd-rs = { version = "0.14.8", features = ["serde", "derive-from"] }
32+
svd-parser = { version = "0.14.5", features = ["expand"] }
3333
svd-encoder = "0.14.4"
3434
yaml-rust = "0.4"
3535
# serde_yaml 0.9.x looks broken
@@ -40,14 +40,15 @@ thiserror = "1.0.35"
4040
linked-hash-map = "0.5"
4141
globset = "0.4.14"
4242
commands = "0.0.5"
43-
env_logger = "0.10"
43+
env_logger = "0.11"
4444
log = { version = "~0.4", features = ["std"] }
4545
normpath = "1.1.0"
4646
liquid = "0.26.0"
4747
once_cell = "1.18.0"
4848
rayon = "1.7.0"
49-
regex = "1.9.1"
49+
regex = "1.10"
5050
itertools = "0.12.0"
51+
phf = { version = "0.11", features = ["macros"] }
5152

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

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,8 @@ _rebase:
306306

307307
# A field in this register, matches an SVD <field> tag
308308
FIELD:
309+
# You can optionally specify name for `enumeratedValues`
310+
_name: NAME
309311
# By giving the field a dictionary we construct an enumerateValues
310312
VARIANT: [VALUE, DESCRIPTION]
311313
VARIANT: [VALUE, DESCRIPTION]

src/patch/register.rs

Lines changed: 31 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -512,43 +512,36 @@ impl RegisterExt for Register {
512512
fmod: &Yaml,
513513
config: &Config,
514514
) -> PatchResult {
515-
const READ_KEYS: [&str; 5] = ["_read", "_RM", "_RS", "_RC", "_RME"];
516-
const READ_VALS: [Option<ReadAction>; 5] = [
517-
None,
518-
Some(ReadAction::Modify),
519-
Some(ReadAction::Set),
520-
Some(ReadAction::Clear),
521-
Some(ReadAction::ModifyExternal),
522-
];
523-
const WRITE_KEYS: [&str; 10] = [
524-
"_write", "_WM", "_WS", "_WC", "_W1S", "_W0C", "_W1C", "_W0S", "_W1T", "_W0T",
525-
];
526-
const WRITE_VALS: [Option<ModifiedWriteValues>; 10] = [
527-
None,
528-
Some(ModifiedWriteValues::Modify),
529-
Some(ModifiedWriteValues::Set),
530-
Some(ModifiedWriteValues::Clear),
531-
Some(ModifiedWriteValues::OneToSet),
532-
Some(ModifiedWriteValues::ZeroToClear),
533-
Some(ModifiedWriteValues::OneToClear),
534-
Some(ModifiedWriteValues::ZeroToSet),
535-
Some(ModifiedWriteValues::OneToToggle),
536-
Some(ModifiedWriteValues::ZeroToToggle),
537-
];
515+
const READ: phf::Map<&'static str, Option<ReadAction>> = phf::phf_map! {
516+
"_read" => None,
517+
"_RM" => Some(ReadAction::Modify),
518+
"_RS" => Some(ReadAction::Set),
519+
"_RC" => Some(ReadAction::Clear),
520+
"_RME" => Some(ReadAction::ModifyExternal),
521+
};
522+
const WRITE: phf::Map<&'static str, Option<ModifiedWriteValues>> = phf::phf_map! {
523+
"_write" => None,
524+
"_WM" => Some(ModifiedWriteValues::Modify),
525+
"_WS" => Some(ModifiedWriteValues::Set),
526+
"_WC" => Some(ModifiedWriteValues::Clear),
527+
"_W1S" => Some(ModifiedWriteValues::OneToSet),
528+
"_W0C" => Some(ModifiedWriteValues::ZeroToClear),
529+
"_W1C" => Some(ModifiedWriteValues::OneToClear),
530+
"_W0S" => Some(ModifiedWriteValues::ZeroToSet),
531+
"_W1T" => Some(ModifiedWriteValues::OneToToggle),
532+
"_W0T" => Some(ModifiedWriteValues::ZeroToToggle),
533+
};
534+
538535
match fmod {
539536
Yaml::Hash(fmod) => {
540-
let is_read = READ_KEYS
541-
.iter()
542-
.any(|key| fmod.contains_key(&key.to_yaml()));
543-
let is_write = WRITE_KEYS
544-
.iter()
545-
.any(|key| fmod.contains_key(&key.to_yaml()));
537+
let is_read = READ.keys().any(|key| fmod.contains_key(&key.to_yaml()));
538+
let is_write = WRITE.keys().any(|key| fmod.contains_key(&key.to_yaml()));
546539
if !is_read && !is_write {
547540
self.process_field_enum(pname, fspec, fmod, None, config)
548541
.with_context(|| "Adding read-write enumeratedValues")?;
549542
} else {
550543
if is_read {
551-
for (key, action) in READ_KEYS.into_iter().zip(READ_VALS.into_iter()) {
544+
for (key, action) in &READ {
552545
if let Some(fmod) = fmod.get_hash(key)? {
553546
if !fmod.is_empty() {
554547
self.process_field_enum(
@@ -561,14 +554,14 @@ impl RegisterExt for Register {
561554
.with_context(|| "Adding read-only enumeratedValues")?;
562555
}
563556
if let Some(action) = action {
564-
self.set_field_read_action(fspec, action);
557+
self.set_field_read_action(fspec, *action);
565558
}
566559
break;
567560
}
568561
}
569562
}
570563
if is_write {
571-
for (key, mwv) in WRITE_KEYS.into_iter().zip(WRITE_VALS.into_iter()) {
564+
for (key, mwv) in &WRITE {
572565
if let Some(fmod) = fmod.get_hash(key)? {
573566
if !fmod.is_empty() {
574567
self.process_field_enum(
@@ -581,7 +574,7 @@ impl RegisterExt for Register {
581574
.with_context(|| "Adding write-only enumeratedValues")?;
582575
}
583576
if let Some(mwv) = mwv {
584-
self.set_field_modified_write_values(fspec, mwv);
577+
self.set_field_modified_write_values(fspec, *mwv);
585578
}
586579
}
587580
}
@@ -749,7 +742,11 @@ impl RegisterExt for Register {
749742
let (min_offset, fname, min_offset_pos) =
750743
offsets.iter().min_by_key(|&on| on.0).unwrap();
751744
let min_pos = offsets.iter().map(|on| on.2).min().unwrap();
752-
let name = make_ev_name(&fname.replace("%s", ""), usage)?;
745+
let name = if let Some(name) = fmod.get_str("_name")? {
746+
name.to_string()
747+
} else {
748+
make_ev_name(&fname.replace("%s", ""), usage)?
749+
};
753750
for ftag in self.iter_fields(fspec) {
754751
let access = ftag.access.or(reg_access).unwrap_or_default();
755752
let checked_usage = check_usage(access, usage)

svdtools/patch.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1713,6 +1713,8 @@ def process_field_enum(self, pname, fspec, field, usage="read-write"):
17131713
for ftag in sorted_fields(list(self.iter_fields(fspec))):
17141714
if "_derivedFrom" in field:
17151715
derived = field["_derivedFrom"]
1716+
elif "_name" in field:
1717+
name = field["_name"]
17161718
else:
17171719
name = ftag.find("name").text
17181720

0 commit comments

Comments
 (0)