|
1 | 1 | use avr_mcu::*;
|
2 | 2 | use std::io;
|
3 | 3 | 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 | +} |
4 | 34 |
|
5 | 35 | 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()) { |
7 | 37 | let ty = if register.size == 1 { "u8" } else { "u16" };
|
8 | 38 |
|
9 | 39 | // HACK: Skip, atmeg328p pack defines two of these.
|
|
0 commit comments