Skip to content

Commit 093c7f7

Browse files
committed
Remove duplicate Register and Bitfield entries
avr-rust#48
1 parent da9ee10 commit 093c7f7

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

core_generator/src/gen.rs

+31-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,39 @@
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+
for i in &old_bitfields {
20+
println!("OLD: {}", i);
21+
}
22+
for i in &new_bitfields {
23+
println!("NEW: {}", i.name);
24+
}
25+
existing_register.bitfields.append(&mut new_bitfields)
26+
}
27+
None => {
28+
canonical_registers.insert(k, register.clone());
29+
}
30+
}
31+
}
32+
canonical_registers.into_values()
33+
}
434

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

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

0 commit comments

Comments
 (0)