File tree 1 file changed +25
-1
lines changed
1 file changed +25
-1
lines changed Original file line number Diff line number Diff line change 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
+ 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
+ }
4
28
5
29
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 ( ) ) {
7
31
let ty = if register. size == 1 { "u8" } else { "u16" } ;
8
32
9
33
// HACK: Skip, atmeg328p pack defines two of these.
You can’t perform that action at this time.
0 commit comments