Skip to content

Commit 89ce25d

Browse files
committed
Persist register size on Bitfield
A Bitfield should have enough information on its own to generate code.
1 parent 231a1d3 commit 89ce25d

File tree

2 files changed

+11
-4
lines changed

2 files changed

+11
-4
lines changed

src/model.rs

+5
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,12 @@ pub struct Bitfield {
186186
/// A description of the bitfield.
187187
pub caption: String,
188188
/// The mask that makes up the bitfield.
189+
///
190+
/// This will always match up to the parent register. A 16-bit register has
191+
/// 16-but masks.
189192
pub mask: u32,
193+
/// The number of bytes that make up the bitfield.
194+
pub size: u32,
190195
/// reference into value_groups on the container
191196
pub values: Option<String>
192197
}

src/pack.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -225,25 +225,26 @@ fn read_value(value: &Element) -> Value {
225225
/// <register caption="EEPROM Address Register Bytes" name="EEAR" offset="0x41" size="2" mask="0x01FF" ocd-rw=""/>
226226
/// ```
227227
fn read_register(register: &Element) -> Register {
228+
let byte_count = register.attributes.get("size").unwrap().parse().unwrap();
228229
let rw = match register.attributes.get("ocd-rw").map(String::as_ref) {
229230
Some("R") => ReadWrite::ReadOnly,
230231
Some("W") => ReadWrite::WriteOnly,
231232
_ => ReadWrite::ReadAndWrite,
232233
};
233234

234235
let bitfields = register.children.iter().filter_map(|child| match &child.name[..] {
235-
"bitfield" => Some(self::read_bitfield(child)),
236+
"bitfield" => Some(self::read_bitfield(child, byte_count)),
236237
_ => None,
237238
}).collect();
238239

239240
Register {
240241
name: register.attributes.get("name").unwrap().clone(),
241242
caption: register.attributes.get("caption").unwrap().clone(),
242243
offset: read_int(register.attributes.get("offset")).clone(),
243-
size: register.attributes.get("size").unwrap().parse().unwrap(),
244244
mask: read_opt_int(register.attributes.get("mask")).clone(),
245-
rw,
245+
size: byte_count,
246246
bitfields,
247+
rw,
247248
}
248249
}
249250

@@ -255,12 +256,13 @@ fn read_register(register: &Element) -> Register {
255256
/// <bitfield caption="Power Reduction Serial Peripheral Interface" mask="0x04" name="PRSPI"/>
256257
/// <bitfield caption="Prescaler source of Timer/Counter 3" mask="0x07" name="CS3" values="CLK_SEL_3BIT_EXT"/>
257258
/// ```
258-
fn read_bitfield(bitfield: &Element) -> Bitfield {
259+
fn read_bitfield(bitfield: &Element, byte_count: u32) -> Bitfield {
259260
Bitfield {
260261
name: bitfield.attributes.get("name").expect("bitfield name").clone(),
261262
caption: bitfield.attributes.get("caption").unwrap_or(&"".to_owned()).clone(),
262263
mask: read_int(bitfield.attributes.get("mask")).clone(),
263264
values: bitfield.attributes.get("values").map(String::clone),
265+
size: byte_count,
264266
}
265267
}
266268

0 commit comments

Comments
 (0)