Skip to content

Commit 59bb535

Browse files
committed
fix collect_in_cluster
1 parent 0ed3d51 commit 59bb535

File tree

4 files changed

+15
-10
lines changed

4 files changed

+15
-10
lines changed

CHANGELOG-python.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ This changelog tracks the Python `svdtools` project. See
55

66
## [Unreleased]
77

8+
* Fix #176 in `collect_in_cluster`
9+
810
## [v0.1.27] 2023-12-23
911

1012
* Support `_include` in peripherals in `device.yaml`

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+
* Fix #176 in `collect_in_cluster`
9+
810
## [v0.3.7] 2023-12-22
911

1012
* Support `bitRange` and `msb+lsb` in field `_modify`

src/patch/peripheral.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,7 +1304,7 @@ fn collect_in_cluster(
13041304
let mut rspecs = Vec::new();
13051305
let single = !cname.contains("%s");
13061306

1307-
for rspec in cmod.keys() {
1307+
for (rspec, rmod) in cmod {
13081308
let rspec = rspec.str()?;
13091309
if rspec == "description" {
13101310
continue;
@@ -1396,7 +1396,7 @@ fn collect_in_cluster(
13961396
));
13971397
}
13981398
}
1399-
rdict.insert(rspec.to_string(), registers);
1399+
rdict.insert(rspec.to_string(), (rmod, registers));
14001400
}
14011401
if rdict.is_empty() {
14021402
return Err(anyhow!(
@@ -1405,6 +1405,7 @@ fn collect_in_cluster(
14051405
}
14061406
let address_offset = rdict
14071407
.values()
1408+
.map(|v| &v.1)
14081409
.min_by_key(|rs| rs[0].address_offset)
14091410
.unwrap()[0]
14101411
.address_offset;
@@ -1420,9 +1421,9 @@ fn collect_in_cluster(
14201421
let mut config = config.clone();
14211422
config.update_fields = true;
14221423
let cluster = if single {
1423-
for (rspec, mut registers) in rdict.into_iter() {
1424+
for (_, (rmod, mut registers)) in rdict.into_iter() {
14241425
let mut reg = registers.swap_remove(0).single();
1425-
let rmod = cmod.get_hash(rspec.as_str())?.unwrap();
1426+
let rmod = rmod.hash()?;
14261427
reg.process(rmod, path, &config)
14271428
.with_context(|| format!("Processing register `{}`", reg.name))?;
14281429
if let Some(name) = rmod.get_str("name")? {
@@ -1434,9 +1435,9 @@ fn collect_in_cluster(
14341435

14351436
cinfo.children(children).build(VAL_LVL)?.single()
14361437
} else {
1437-
for (rspec, mut registers) in rdict.into_iter() {
1438+
for (rspec, (rmod, mut registers)) in rdict.into_iter() {
14381439
let mut reg = registers.swap_remove(0).single();
1439-
let rmod = cmod.get_hash(rspec.as_str())?.unwrap();
1440+
let rmod = rmod.hash()?;
14401441
reg.process(rmod, path, &config)
14411442
.with_context(|| format!("Processing register `{}`", reg.name))?;
14421443
reg.name = if let Some(name) = rmod.get_str("name")? {

svdtools/patch.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,6 +1107,7 @@ def collect_in_cluster(self, cname, cmod):
11071107
check = True
11081108
rspecs = [r for r in cmod if r != "description"]
11091109
for rspec in rspecs:
1110+
rmod = cmod[rspec]
11101111
rspec, ignore = get_spec(rspec)
11111112
registers = []
11121113
for rtag, match_rspec in list(self.iter_registers_with_matches(rspec)):
@@ -1126,7 +1127,7 @@ def collect_in_cluster(self, cname, cmod):
11261127
"{}: registers {rspec} not found".format(self.ptag.findtext("name"))
11271128
)
11281129
registers = sorted(registers, key=lambda r: r[2])
1129-
rdict[rspec] = registers
1130+
rdict[rspec] = (rmod, registers)
11301131
bitmasks = [Register(r[0]).get_bitmask() for r in registers]
11311132
if first:
11321133
dim = len(registers)
@@ -1164,19 +1165,18 @@ def collect_in_cluster(self, cname, cmod):
11641165
)
11651166
)
11661167
ctag = ET.SubElement(self.ptag.find("registers"), "cluster")
1167-
addressOffset = min([registers[0][2] for _, registers in rdict.items()])
1168+
addressOffset = min([registers[0][2] for _, (_, registers) in rdict.items()])
11681169
ET.SubElement(ctag, "name").text = cname
11691170
if "description" in cmod:
11701171
description = cmod["description"]
11711172
else:
11721173
description = "Cluster {}, containing {}".format(cname, ", ".join(rspecs))
11731174
ET.SubElement(ctag, "description").text = description
11741175
ET.SubElement(ctag, "addressOffset").text = hex(addressOffset)
1175-
for rspec, registers in rdict.items():
1176+
for rspec, (rmod, registers) in rdict.items():
11761177
for rtag, _, _ in registers[1:]:
11771178
self.ptag.find("registers").remove(rtag)
11781179
rtag = registers[0][0]
1179-
rmod = cmod[rspec]
11801180
self.process_register(rspec, rmod)
11811181
new_rtag = copy.deepcopy(rtag)
11821182
self.ptag.find("registers").remove(rtag)

0 commit comments

Comments
 (0)