Skip to content

Commit 6e83cf0

Browse files
committed
Remove duplicate Register and Bitfield entries avr-rust#48
1 parent 538a700 commit 6e83cf0

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

core_generator/src/gen.rs

+25-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,33 @@
11
use avr_mcu::*;
22
use std::io;
33
use std::io::prelude::*;
4+
use std::collections::HashMap;
5+
use std::collections::HashSet;
6+
7+
fn collect_register_bitfields<'a, I: Iterator<Item = &'a Register>>(registers: I) -> impl Iterator<Item = Register> {
8+
let mut canonical_registers: HashMap<String, Register> = HashMap::new();
9+
for register in registers {
10+
let k = register.name.clone();
11+
match canonical_registers.get_mut(&k) {
12+
Some(existing_register) => {
13+
let mut old_bitfields = HashSet::new();
14+
for bitfield in &existing_register.bitfields {
15+
old_bitfields.insert(bitfield.name.clone());
16+
}
17+
let mut new_bitfields: Vec<Bitfield> =
18+
register.bitfields.clone().into_iter().filter(|bitfield| old_bitfields.take(&bitfield.name).is_none()).collect();
19+
existing_register.bitfields.append(&mut new_bitfields)
20+
}
21+
None => {
22+
canonical_registers.insert(k, register.clone());
23+
}
24+
}
25+
}
26+
canonical_registers.into_values()
27+
}
428

529
pub fn write_registers(mcu: &Mcu, w: &mut dyn Write) -> Result<(), io::Error> {
6-
for register in mcu.registers() {
30+
for register in collect_register_bitfields(mcu.registers()) {
731
let ty = if register.size == 1 { "u8" } else { "u16" };
832

933
// HACK: Skip, atmeg328p pack defines two of these.

0 commit comments

Comments
 (0)