Skip to content

Commit 5f748ca

Browse files
committed
collect register/cluster errors
1 parent 0a5d2fd commit 5f748ca

File tree

2 files changed

+36
-31
lines changed

2 files changed

+36
-31
lines changed

src/patch/peripheral.rs

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,14 +1202,20 @@ fn collect_in_array(
12021202
.iter()
12031203
.map(|r| r.address_offset)
12041204
.collect::<Vec<_>>();
1205+
let dim_increment = if dim > 1 { offsets[1] - offsets[0] } else { 0 };
1206+
if !check_offsets(&offsets, dim_increment) {
1207+
return Err(anyhow!(
1208+
"{}: registers cannot be collected into {rspec} array. Different addressOffset increments",
1209+
path
1210+
));
1211+
}
12051212
let bitmasks = registers
12061213
.iter()
12071214
.map(RegisterInfo::get_bitmask)
12081215
.collect::<Vec<_>>();
1209-
let dim_increment = if dim > 1 { offsets[1] - offsets[0] } else { 0 };
1210-
if !(check_offsets(&offsets, dim_increment) && bitmasks.iter().all(|&m| m == bitmasks[0])) {
1216+
if !bitmasks.iter().all(|&m| m == bitmasks[0]) {
12111217
return Err(anyhow!(
1212-
"{}: registers cannot be collected into {rspec} array",
1218+
"{}: registers cannot be collected into {rspec} array. Different bit masks",
12131219
path
12141220
));
12151221
}
@@ -1248,8 +1254,7 @@ fn collect_in_cluster(
12481254
cmod: &Hash,
12491255
) -> PatchResult {
12501256
let mut rdict = linked_hash_map::LinkedHashMap::new();
1251-
let mut first = true;
1252-
let mut check = true;
1257+
let mut first = None;
12531258
let mut dim = 0;
12541259
let mut dim_index = Vec::new();
12551260
let mut dim_increment = 0;
@@ -1311,43 +1316,43 @@ fn collect_in_cluster(
13111316
Ok(r.name[li..r.name.len() - ri].to_string())
13121317
})
13131318
.collect::<Result<Vec<_>, _>>();
1314-
let new_dim_index = match new_dim_index {
1315-
Ok(v) => v,
1316-
Err(e) => return Err(e),
1317-
};
1318-
if first {
1319+
let new_dim_index = new_dim_index?;
1320+
if let Some(rspec1) = first.as_ref() {
1321+
let len = registers.len();
1322+
if dim != len {
1323+
return Err(anyhow!(
1324+
"{path}: registers cannot be collected into {cname} cluster. Different number of registers {rspec} ({len}) and {rspec1} ({dim})"
1325+
));
1326+
}
1327+
if dim_index != new_dim_index {
1328+
return Err(anyhow!(
1329+
"{path}: registers cannot be collected into {cname} cluster. {rspec} and {rspec1} have different indeces"
1330+
));
1331+
}
1332+
} else {
13191333
dim = registers.len();
13201334
dim_index = new_dim_index;
1321-
dim_increment = 0;
13221335
offsets = registers
13231336
.iter()
13241337
.map(|r| r.address_offset)
13251338
.collect::<Vec<_>>();
13261339
if dim > 1 {
13271340
dim_increment = offsets[1] - offsets[0];
13281341
}
1329-
if !(check_offsets(&offsets, dim_increment)
1330-
&& bitmasks.iter().all(|&m| m == bitmasks[0]))
1331-
{
1332-
check = false;
1333-
break;
1334-
}
1335-
} else if (dim != registers.len())
1336-
|| (dim_index != new_dim_index)
1337-
|| (!check_offsets(&offsets, dim_increment))
1338-
|| (!bitmasks.iter().all(|&m| m == bitmasks[0]))
1339-
{
1340-
check = false;
1341-
break;
1342+
first = Some(rspec.clone());
1343+
}
1344+
if !check_offsets(&offsets, dim_increment) {
1345+
return Err(anyhow!(
1346+
"{path}: registers cannot be collected into {cname} cluster. Different addressOffset increments in {rspec} registers"
1347+
));
1348+
}
1349+
if !bitmasks.iter().all(|&m| m == bitmasks[0]) {
1350+
return Err(anyhow!(
1351+
"{path}: registers cannot be collected into {cname} cluster. Different bit masks in {rspec} registers"
1352+
));
13421353
}
13431354
}
13441355
rdict.insert(rspec.to_string(), registers);
1345-
first = false;
1346-
}
1347-
if !check {
1348-
return Err(anyhow!(
1349-
"{path}: registers cannot be collected into {cname} cluster"
1350-
));
13511356
}
13521357
let address_offset = rdict
13531358
.values()

src/patch/register.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ impl RegisterExt for Register {
405405
let dim_increment = if dim > 1 { offsets[1] - offsets[0] } else { 0 };
406406
if !check_offsets(&offsets, dim_increment) {
407407
return Err(anyhow!(
408-
"{}: registers cannot be collected into {fspec} array",
408+
"{}: fields cannot be collected into {fspec} array. Different bitOffset increments",
409409
self.name
410410
));
411411
}

0 commit comments

Comments
 (0)