use crate::{Error, Result};
pub fn create_cluster(
name: &str,
address_offset: u32,
children: &[svd::RegisterCluster],
dim_element: Option<svd::DimElement>,
) -> Result<svd::Cluster> {
let name = if dim_element.is_some() {
format!("{name}[%s]")
} else {
name.into()
};
let info = svd::ClusterInfo::builder()
.name(name)
.address_offset(address_offset)
.children(children.into())
.build(svd::ValidateLevel::Strict)?;
match dim_element {
Some(dim) => Ok(svd::Cluster::Array(info, dim)),
None => Ok(svd::Cluster::Single(info)),
}
}
pub fn create_register(
name: &str,
desc: &str,
addr_offset: u32,
properties: svd::RegisterProperties,
fields: Option<&[svd::Field]>,
dim_element: Option<svd::DimElement>,
) -> Result<svd::Register> {
let name = if dim_element.is_some() {
format!("{name}[%s]")
} else {
name.into()
};
let info = svd::RegisterInfo::builder()
.name(name)
.description(Some(desc.into()))
.address_offset(addr_offset)
.properties(properties)
.fields(fields.map(|f| f.into()))
.build(svd::ValidateLevel::Weak)?;
match dim_element {
Some(dim) => Ok(svd::Register::Array(info, dim)),
None => Ok(svd::Register::Single(info)),
}
}
pub fn create_register_properties(size: u32, reset_value: u64) -> Result<svd::RegisterProperties> {
Ok(svd::RegisterProperties::new()
.size(Some(size))
.reset_value(Some(reset_value))
.build(svd::ValidateLevel::Strict)?)
}
pub fn create_field(
name: &str,
desc: &str,
bit_range: svd::BitRange,
access: svd::Access,
dim_element: Option<svd::DimElement>,
) -> Result<svd::Field> {
let info = svd::FieldInfo::builder()
.name(name.into())
.description(Some(desc.into()))
.bit_range(bit_range)
.access(Some(access))
.build(svd::ValidateLevel::Strict)?;
match dim_element {
Some(dim) => Ok(svd::Field::Array(info, dim)),
None => Ok(svd::Field::Single(info)),
}
}
pub fn create_bit_range(range: &str) -> Result<svd::BitRange> {
svd::BitRange::from_bit_range(range).ok_or(Error::InvalidBitRange)
}