@@ -4,7 +4,7 @@ use convert_case::{Boundary, Case, Casing};
4
4
5
5
use crate :: svd:: BitRangeType ;
6
6
7
- #[ derive( Clone , Copy , Debug ) ]
7
+ #[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
8
8
pub enum IdentifierFormat {
9
9
/// `Camel` case
10
10
///
@@ -63,7 +63,7 @@ pub fn change_case(s: &str, case: Option<IdentifierFormat>) -> String {
63
63
}
64
64
}
65
65
66
- #[ derive( Clone , Copy , Debug ) ]
66
+ #[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
67
67
pub enum NumberFormat {
68
68
/// `UpperHex` format
69
69
///
@@ -150,7 +150,7 @@ where
150
150
}
151
151
}
152
152
153
- #[ derive( Clone , Copy , Debug ) ]
153
+ #[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
154
154
pub struct FieldBitRangeFormat ( pub BitRangeType ) ;
155
155
156
156
impl FromStr for FieldBitRangeFormat {
@@ -166,6 +166,93 @@ impl FromStr for FieldBitRangeFormat {
166
166
}
167
167
}
168
168
169
+ #[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
170
+ #[ non_exhaustive]
171
+ /// Apply a kind of sorting
172
+ pub enum Sorting {
173
+ /// Sort by addresses of offsets
174
+ Offset ,
175
+ /// Same as [`Sorting::Offset`], but reversed
176
+ OffsetReversed ,
177
+ /// Sort by name
178
+ Name ,
179
+ }
180
+
181
+ impl Sorting {
182
+ fn from_parts ( parts : & [ & str ] ) -> Option < Self > {
183
+ if parts. contains ( & "Offset" ) {
184
+ Some ( Self :: Offset )
185
+ } else if parts. contains ( & "OffsetReserved" ) {
186
+ Some ( Self :: OffsetReversed )
187
+ } else if parts. contains ( & "Name" ) {
188
+ Some ( Self :: Name )
189
+ } else {
190
+ None
191
+ }
192
+ }
193
+ }
194
+
195
+ #[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
196
+ pub enum DerivableSorting {
197
+ Unchanged ( Option < Sorting > ) ,
198
+ DeriveLast ( Option < Sorting > ) ,
199
+ }
200
+
201
+ impl DerivableSorting {
202
+ fn from_parts ( parts : & [ & str ] ) -> Self {
203
+ let sorting = Sorting :: from_parts ( parts) ;
204
+ if parts. contains ( & "DerivedLast" ) {
205
+ Self :: DeriveLast ( sorting)
206
+ } else {
207
+ Self :: Unchanged ( sorting)
208
+ }
209
+ }
210
+ }
211
+
212
+ impl FromStr for DerivableSorting {
213
+ type Err = ( ) ;
214
+
215
+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
216
+ let parts = s. split ( ',' ) . collect :: < Vec < _ > > ( ) ;
217
+ Ok ( DerivableSorting :: from_parts ( & parts) )
218
+ }
219
+ }
220
+
221
+ impl Default for DerivableSorting {
222
+ fn default ( ) -> Self {
223
+ Self :: Unchanged ( None )
224
+ }
225
+ }
226
+
227
+ #[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
228
+ pub enum RcSorting {
229
+ Unchanged ( DerivableSorting ) ,
230
+ RegistersFirst ( DerivableSorting ) ,
231
+ ClustersFirst ( DerivableSorting ) ,
232
+ }
233
+
234
+ impl Default for RcSorting {
235
+ fn default ( ) -> Self {
236
+ Self :: Unchanged ( Default :: default ( ) )
237
+ }
238
+ }
239
+
240
+ impl FromStr for RcSorting {
241
+ type Err = ( ) ;
242
+
243
+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
244
+ let parts = s. split ( ',' ) . collect :: < Vec < _ > > ( ) ;
245
+ let derivable_sorting = DerivableSorting :: from_parts ( & parts) ;
246
+ Ok ( if parts. contains ( & "RegistersFirst" ) {
247
+ Self :: RegistersFirst ( derivable_sorting)
248
+ } else if parts. contains ( & "ClustersFirst" ) {
249
+ Self :: ClustersFirst ( derivable_sorting)
250
+ } else {
251
+ Self :: Unchanged ( derivable_sorting)
252
+ } )
253
+ }
254
+ }
255
+
169
256
#[ derive( Clone , Copy , Debug ) ]
170
257
#[ non_exhaustive]
171
258
/// Advanced encoder options
@@ -184,6 +271,9 @@ pub struct Config {
184
271
/// format: hex, dec
185
272
pub peripheral_base_address : NumberFormat ,
186
273
274
+ /// Sort peripherals in specified order
275
+ pub peripheral_sorting : DerivableSorting ,
276
+
187
277
/// Format of addressBlock's offset element
188
278
///
189
279
/// format: hex, dec
@@ -209,6 +299,9 @@ pub struct Config {
209
299
/// format: hex, dec
210
300
pub cluster_address_offset : NumberFormat ,
211
301
302
+ /// Sort registers and clusters in specified order
303
+ pub register_cluster_sorting : RcSorting ,
304
+
212
305
/// Format of register's name-kind elements
213
306
/// - `derivedFrom`
214
307
/// - `name`
@@ -245,6 +338,9 @@ pub struct Config {
245
338
/// `None` means keep the original bitRange
246
339
pub field_bit_range : Option < FieldBitRangeFormat > ,
247
340
341
+ /// Sort fields in specified order
342
+ pub field_sorting : DerivableSorting ,
343
+
248
344
/// Format of enumeratedValues's name-kind elements
249
345
/// - `derivedFrom`
250
346
/// - `name`
@@ -278,18 +374,21 @@ impl Default for Config {
278
374
Self {
279
375
peripheral_name : None ,
280
376
peripheral_base_address : NumberFormat :: UpperHex8 ,
377
+ peripheral_sorting : Default :: default ( ) ,
281
378
address_block_offset : NumberFormat :: UpperHex ,
282
379
address_block_size : NumberFormat :: UpperHex ,
283
380
interrupt_name : None ,
284
381
cluster_name : None ,
285
382
cluster_address_offset : NumberFormat :: UpperHex ,
383
+ register_cluster_sorting : Default :: default ( ) ,
286
384
register_name : None ,
287
385
register_address_offset : NumberFormat :: UpperHex ,
288
386
register_size : NumberFormat :: LowerHex ,
289
387
register_reset_value : NumberFormat :: UpperHex16 ,
290
388
register_reset_mask : NumberFormat :: UpperHex16 ,
291
389
field_name : None ,
292
390
field_bit_range : None ,
391
+ field_sorting : Default :: default ( ) ,
293
392
enumerated_values_name : None ,
294
393
enumerated_value_name : None ,
295
394
enumerated_value_value : NumberFormat :: Dec ,
@@ -308,18 +407,21 @@ impl Config {
308
407
match name {
309
408
"peripheral_name" => self . peripheral_name = Some ( value. parse ( ) . unwrap ( ) ) ,
310
409
"peripheral_base_address" => self . peripheral_base_address = value. parse ( ) . unwrap ( ) ,
410
+ "peripheral_sorting" => self . peripheral_sorting = value. parse ( ) . unwrap ( ) ,
311
411
"address_block_offset" => self . address_block_offset = value. parse ( ) . unwrap ( ) ,
312
412
"address_block_size" => self . address_block_size = value. parse ( ) . unwrap ( ) ,
313
413
"interrupt_name" => self . interrupt_name = Some ( value. parse ( ) . unwrap ( ) ) ,
314
414
"cluster_name" => self . cluster_name = Some ( value. parse ( ) . unwrap ( ) ) ,
315
415
"cluster_address_offset" => self . cluster_address_offset = value. parse ( ) . unwrap ( ) ,
416
+ "register_cluster_sorting" => self . register_cluster_sorting = value. parse ( ) . unwrap ( ) ,
316
417
"register_name" => self . register_name = Some ( value. parse ( ) . unwrap ( ) ) ,
317
418
"register_address_offset" => self . register_address_offset = value. parse ( ) . unwrap ( ) ,
318
419
"register_size" => self . register_size = value. parse ( ) . unwrap ( ) ,
319
420
"register_reset_value" => self . register_reset_value = value. parse ( ) . unwrap ( ) ,
320
421
"register_reset_mask" => self . register_reset_mask = value. parse ( ) . unwrap ( ) ,
321
422
"field_name" => self . field_name = Some ( value. parse ( ) . unwrap ( ) ) ,
322
423
"field_bit_range" => self . field_bit_range = Some ( value. parse ( ) . unwrap ( ) ) ,
424
+ "field_sorting" => self . field_sorting = value. parse ( ) . unwrap ( ) ,
323
425
"enumerated_values_name" => self . enumerated_values_name = Some ( value. parse ( ) . unwrap ( ) ) ,
324
426
"enumerated_value_name" => self . enumerated_value_name = Some ( value. parse ( ) . unwrap ( ) ) ,
325
427
"enumerated_value_value" => self . enumerated_value_value = value. parse ( ) . unwrap ( ) ,
@@ -348,6 +450,14 @@ impl Config {
348
450
self
349
451
}
350
452
453
+ /// Sort peripherals in specified order
454
+ ///
455
+ /// `None` means keep the original order
456
+ pub fn peripheral_sorting ( mut self , val : DerivableSorting ) -> Self {
457
+ self . peripheral_sorting = val;
458
+ self
459
+ }
460
+
351
461
/// Format of addressBlock's offset element
352
462
///
353
463
/// format: hex, dec
@@ -384,6 +494,14 @@ impl Config {
384
494
self
385
495
}
386
496
497
+ /// Sort registers and clusters in specified order
498
+ ///
499
+ /// `None` means keep the original order
500
+ pub fn register_cluster_sorting ( mut self , val : RcSorting ) -> Self {
501
+ self . register_cluster_sorting = val;
502
+ self
503
+ }
504
+
387
505
/// Format of register's name-kind elements
388
506
pub fn register_name ( mut self , val : Option < IdentifierFormat > ) -> Self {
389
507
self . register_name = val;
@@ -436,6 +554,14 @@ impl Config {
436
554
self
437
555
}
438
556
557
+ /// Sort fields in specified order
558
+ ///
559
+ /// `None` means keep the original order
560
+ pub fn field_sorting ( mut self , val : DerivableSorting ) -> Self {
561
+ self . field_sorting = val;
562
+ self
563
+ }
564
+
439
565
/// Format of enumeratedValues's name-kind elements
440
566
pub fn enumerated_values_name ( mut self , val : Option < IdentifierFormat > ) -> Self {
441
567
self . enumerated_values_name = val;
0 commit comments