svd_generator/svd/
register.rs

1use crate::{Error, Result};
2
3pub mod dwmac_dma;
4pub mod jh7110;
5
6/// Convenience function to create a SVD register [`Cluster`](svd::Cluster).
7pub fn create_cluster(
8    name: &str,
9    desc: &str,
10    address_offset: u32,
11    children: &[svd::RegisterCluster],
12    dim_element: Option<svd::DimElement>,
13) -> Result<svd::Cluster> {
14    let name = if dim_element.is_some() {
15        format!("{name}[%s]")
16    } else {
17        name.into()
18    };
19    let info = svd::ClusterInfo::builder()
20        .name(name)
21        .description(Some(desc.into()))
22        .address_offset(address_offset)
23        .children(children.into())
24        .build(svd::ValidateLevel::Strict)?;
25
26    match dim_element {
27        Some(dim) => Ok(svd::Cluster::Array(info, dim)),
28        None => Ok(svd::Cluster::Single(info)),
29    }
30}
31
32/// Convenience function to create a SVD [`Register`](svd::Register).
33pub fn create_register(
34    name: &str,
35    desc: &str,
36    addr_offset: u32,
37    properties: svd::RegisterProperties,
38    fields: Option<&[svd::Field]>,
39    dim_element: Option<svd::DimElement>,
40) -> Result<svd::Register> {
41    let name = if dim_element.is_some() {
42        format!("{name}[%s]")
43    } else {
44        name.into()
45    };
46    let info = svd::RegisterInfo::builder()
47        .name(name)
48        .description(Some(desc.into()))
49        .address_offset(addr_offset)
50        .properties(properties)
51        .fields(fields.map(|f| f.into()))
52        .build(svd::ValidateLevel::Weak)?;
53
54    match dim_element {
55        Some(dim) => Ok(svd::Register::Array(info, dim)),
56        None => Ok(svd::Register::Single(info)),
57    }
58}
59
60/// Convenience function to create a default [`Register`](svd::RegisterCluster::Register).
61pub fn create_default_register() -> Result<svd::RegisterCluster> {
62    create_register("", "", 0, create_register_properties(0, 0)?, None, None)
63        .map(svd::RegisterCluster::Register)
64}
65
66/// Convenience function to create a SVD [`RegisterProperties`](svd::RegisterProperties).
67pub fn create_register_properties(size: u32, reset_value: u64) -> Result<svd::RegisterProperties> {
68    Ok(svd::RegisterProperties::new()
69        .size(Some(size))
70        .reset_value(Some(reset_value))
71        .build(svd::ValidateLevel::Strict)?)
72}
73
74/// Convenience function to create a SVD register [`Field`](svd::Field).
75pub fn create_field(
76    name: &str,
77    desc: &str,
78    bit_range: svd::BitRange,
79    access: svd::Access,
80    dim_element: Option<svd::DimElement>,
81) -> Result<svd::Field> {
82    let name = if dim_element.is_some() {
83        format!("{name}[%s]")
84    } else {
85        name.into()
86    };
87    let info = svd::FieldInfo::builder()
88        .name(name)
89        .description(Some(desc.into()))
90        .bit_range(bit_range)
91        .access(Some(access))
92        .build(svd::ValidateLevel::Strict)?;
93
94    match dim_element {
95        Some(dim) => Ok(svd::Field::Array(info, dim)),
96        None => Ok(svd::Field::Single(info)),
97    }
98}
99
100/// Convenience function to create a SVD register [`Field`](svd::Field) with a
101/// [`WriteConstraint`](svd::WriteConstraint).
102pub fn create_field_constraint(
103    name: &str,
104    desc: &str,
105    bit_range: svd::BitRange,
106    access: svd::Access,
107    constraint: svd::WriteConstraint,
108    dim_element: Option<svd::DimElement>,
109) -> Result<svd::Field> {
110    let name = if dim_element.is_some() {
111        format!("{name}[%s]")
112    } else {
113        name.into()
114    };
115    let info = svd::FieldInfo::builder()
116        .name(name)
117        .description(Some(desc.into()))
118        .bit_range(bit_range)
119        .access(Some(access))
120        .write_constraint(Some(constraint))
121        .build(svd::ValidateLevel::Strict)?;
122
123    match dim_element {
124        Some(dim) => Ok(svd::Field::Array(info, dim)),
125        None => Ok(svd::Field::Single(info)),
126    }
127}
128
129/// Convenience function to create an SVD [`WriteConstraintRange`](svd::WriteConstraintRange).
130#[inline]
131pub const fn create_write_constraint(min: u64, max: u64) -> Result<svd::WriteConstraint> {
132    if min > max {
133        Err(Error::InvalidWriteConstraint((min, max)))
134    } else {
135        Ok(svd::WriteConstraint::Range(svd::WriteConstraintRange {
136            min,
137            max,
138        }))
139    }
140}
141
142/// Convenience function to create a SVD register [`Field`](svd::Field) with a list of
143/// [`EnumeratedValues`](svd::EnumeratedValues).
144pub fn create_field_enum(
145    name: &str,
146    desc: &str,
147    bit_range: svd::BitRange,
148    access: svd::Access,
149    enum_values: &[svd::EnumeratedValues],
150    dim_element: Option<svd::DimElement>,
151) -> Result<svd::Field> {
152    let name = if dim_element.is_some() {
153        format!("{name}[%s]")
154    } else {
155        name.into()
156    };
157    let info = svd::FieldInfo::builder()
158        .name(name)
159        .description(Some(desc.into()))
160        .bit_range(bit_range)
161        .access(Some(access))
162        .write_constraint(Some(svd::WriteConstraint::UseEnumeratedValues(true)))
163        .enumerated_values(enum_values.into())
164        .build(svd::ValidateLevel::Strict)?;
165
166    match dim_element {
167        Some(dim) => Ok(svd::Field::Array(info, dim)),
168        None => Ok(svd::Field::Single(info)),
169    }
170}
171
172/// Convenience function to create a SVD [`EnumeratedValues`](svd::EnumeratedValues).
173pub fn create_enum_values(values: &[svd::EnumeratedValue]) -> Result<svd::EnumeratedValues> {
174    Ok(svd::EnumeratedValues::builder()
175        .values(values.into())
176        .build(svd::ValidateLevel::Strict)?)
177}
178
179/// Convenience function to create a SVD [`EnumeratedValue`](svd::EnumeratedValue).
180pub fn create_enum_value(name: &str, desc: &str, value: u64) -> Result<svd::EnumeratedValue> {
181    Ok(svd::EnumeratedValue::builder()
182        .name(name.into())
183        .description(Some(desc.into()))
184        .value(Some(value))
185        .build(svd::ValidateLevel::Strict)?)
186}
187
188/// Convenience function to create a SVD register [`BitRange`](svd::BitRange).
189pub fn create_bit_range(range: &str) -> Result<svd::BitRange> {
190    svd::BitRange::from_bit_range(range).ok_or(Error::InvalidBitRange)
191}