use crate::{Error, Result};
use alloc::vec::Vec;
pub fn parse_reg(
node: &device_tree::Node,
addr_cells: usize,
size_cells: usize,
) -> Result<(u64, u32)> {
let name = node.name.as_str();
let reg: Vec<u32> = node
.prop_raw("reg")
.ok_or(Error::Svd(format!(
"missing `reg` property in node: {name}"
)))?
.chunks_exact(4)
.map(|r| u32::from_be_bytes([r[0], r[1], r[2], r[3]]))
.collect();
let address = reg
.iter()
.take(addr_cells)
.enumerate()
.map(|(i, &r)| (r as u64) << (32 * (addr_cells - i).saturating_sub(1)))
.sum();
let size = reg
.iter()
.skip(addr_cells)
.take(size_cells)
.enumerate()
.map(|(i, &r)| (r as u64) << (32 * (size_cells - i).saturating_sub(1)))
.sum::<u64>() as u32;
Ok((address, size))
}