@@ -489,9 +489,39 @@ fn main() {
489
489
}
490
490
491
491
impl < ' a > ClockGen < ' a > {
492
+ fn parse_mul_div ( name : & str ) -> ( & str , Frac ) {
493
+ if name == "hse_div_rtcpre" {
494
+ return ( name, Frac { num : 1 , denom : 1 } ) ;
495
+ }
496
+
497
+ if let Some ( i) = name. find ( "_div_" ) {
498
+ let n = & name[ ..i] ;
499
+ let val: u32 = name[ i + 5 ..] . parse ( ) . unwrap ( ) ;
500
+ ( n, Frac { num : 1 , denom : val } )
501
+ } else if let Some ( i) = name. find ( "_mul_" ) {
502
+ let n = & name[ ..i] ;
503
+ let val: u32 = name[ i + 5 ..] . parse ( ) . unwrap ( ) ;
504
+ ( n, Frac { num : val, denom : 1 } )
505
+ } else {
506
+ ( name, Frac { num : 1 , denom : 1 } )
507
+ }
508
+ }
509
+
492
510
fn gen_clock ( & mut self , peripheral : & str , name : & str ) -> TokenStream {
493
- let clock_name = format_ident ! ( "{}" , name. to_ascii_lowercase( ) ) ;
494
- self . clock_names . insert ( name. to_ascii_lowercase ( ) ) ;
511
+ let name = name. to_ascii_lowercase ( ) ;
512
+ let ( name, frac) = Self :: parse_mul_div ( & name) ;
513
+ let clock_name = format_ident ! ( "{}" , name) ;
514
+ self . clock_names . insert ( name. to_string ( ) ) ;
515
+
516
+ let mut muldiv = quote ! ( ) ;
517
+ if frac. num != 1 {
518
+ let val = frac. num ;
519
+ muldiv. extend ( quote ! ( * #val) ) ;
520
+ }
521
+ if frac. denom != 1 {
522
+ let val = frac. denom ;
523
+ muldiv. extend ( quote ! ( / #val) ) ;
524
+ }
495
525
quote ! ( unsafe {
496
526
unwrap!(
497
527
crate :: rcc:: get_freqs( ) . #clock_name. to_hertz( ) ,
@@ -500,6 +530,7 @@ fn main() {
500
530
#peripheral,
501
531
#name
502
532
)
533
+ #muldiv
503
534
} )
504
535
}
505
536
@@ -1503,29 +1534,6 @@ fn main() {
1503
1534
}
1504
1535
}
1505
1536
1506
- #[ derive( Copy , Clone , Debug ) ]
1507
- struct Frac {
1508
- num : u32 ,
1509
- denom : u32 ,
1510
- }
1511
-
1512
- impl Frac {
1513
- fn simplify ( self ) -> Self {
1514
- let d = gcd ( self . num , self . denom ) ;
1515
- Self {
1516
- num : self . num / d,
1517
- denom : self . denom / d,
1518
- }
1519
- }
1520
- }
1521
-
1522
- fn gcd ( a : u32 , b : u32 ) -> u32 {
1523
- if b == 0 {
1524
- return a;
1525
- }
1526
- gcd ( b, a % b)
1527
- }
1528
-
1529
1537
fn parse_num ( n : & str ) -> Result < Frac , ( ) > {
1530
1538
for prefix in [ "DIV" , "MUL" ] {
1531
1539
if let Some ( n) = n. strip_prefix ( prefix) {
@@ -2136,3 +2144,26 @@ fn mem_filter(chip: &str, region: &str) -> bool {
2136
2144
2137
2145
true
2138
2146
}
2147
+
2148
+ #[ derive( Copy , Clone , Debug ) ]
2149
+ struct Frac {
2150
+ num : u32 ,
2151
+ denom : u32 ,
2152
+ }
2153
+
2154
+ impl Frac {
2155
+ fn simplify ( self ) -> Self {
2156
+ let d = gcd ( self . num , self . denom ) ;
2157
+ Self {
2158
+ num : self . num / d,
2159
+ denom : self . denom / d,
2160
+ }
2161
+ }
2162
+ }
2163
+
2164
+ fn gcd ( a : u32 , b : u32 ) -> u32 {
2165
+ if b == 0 {
2166
+ return a;
2167
+ }
2168
+ gcd ( b, a % b)
2169
+ }
0 commit comments