svd_generator/svd/
register.rs1use crate::{Error, Result};
2
3pub mod dwmac_dma;
4pub mod jh7110;
5
6pub 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
32pub 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
60pub 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
66pub 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
74pub 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
100pub 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#[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
142pub 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
172pub 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
179pub 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
188pub fn create_bit_range(range: &str) -> Result<svd::BitRange> {
190 svd::BitRange::from_bit_range(range).ok_or(Error::InvalidBitRange)
191}