svd-generator 0.4.1

Converts device information from flattened device tree into an SVD description
Documentation
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))
}