@@ -8,6 +8,7 @@ use proc_macro2::{Ident, Punct, Spacing, Span, TokenStream};
8
8
use quote:: { quote, ToTokens } ;
9
9
use std:: borrow:: Cow ;
10
10
use std:: collections:: HashSet ;
11
+ use std:: fmt:: Write ;
11
12
use svd_parser:: expand:: {
12
13
derive_enumerated_values, derive_field, BlockPath , EnumPath , FieldPath , Index , RegisterPath ,
13
14
} ;
@@ -80,8 +81,24 @@ pub fn render(
80
81
} else {
81
82
return Err ( anyhow ! ( "Incorrect access of register {}" , register. name) ) ;
82
83
} ;
83
- let alias_doc =
84
- format ! ( "{name} ({accs}) register accessor: an alias for `Reg<{regspec_ident}>`" ) ;
84
+
85
+ let mut alias_doc = format ! (
86
+ "{name} ({accs}) register accessor: {description}\n \n {}" ,
87
+ api_docs(
88
+ access. can_read( ) ,
89
+ access. can_write( ) ,
90
+ register. properties. reset_value. is_some( ) ,
91
+ & name_snake_case,
92
+ false ,
93
+ register. read_action,
94
+ ) ?
95
+ ) ;
96
+ if name_snake_case != "cfg" {
97
+ alias_doc += format ! (
98
+ "\n \n For information about available fields see [`{name_snake_case}`] module"
99
+ )
100
+ . as_str ( ) ;
101
+ }
85
102
let mut out = TokenStream :: new ( ) ;
86
103
out. extend ( quote ! {
87
104
#[ doc = #alias_doc]
@@ -106,6 +123,68 @@ pub fn render(
106
123
}
107
124
}
108
125
126
+ fn api_docs (
127
+ can_read : bool ,
128
+ can_write : bool ,
129
+ can_reset : bool ,
130
+ module : & Ident ,
131
+ inmodule : bool ,
132
+ read_action : Option < ReadAction > ,
133
+ ) -> Result < String , std:: fmt:: Error > {
134
+ fn method ( s : & str ) -> String {
135
+ format ! ( "[`{s}`](crate::generic::Reg::{s})" )
136
+ }
137
+
138
+ let mut doc = String :: new ( ) ;
139
+
140
+ if can_read {
141
+ write ! (
142
+ doc,
143
+ "You can {} this register and get [`{module}::R`]{}. " ,
144
+ method( "read" ) ,
145
+ if inmodule { "(R)" } else { "" } ,
146
+ ) ?;
147
+
148
+ if let Some ( action) = read_action {
149
+ doc. push_str ( "WARN: " ) ;
150
+ doc. push_str ( match action {
151
+ ReadAction :: Clear => "The register is **cleared** (set to zero) following a read operation." ,
152
+ ReadAction :: Set => "The register is **set** (set to ones) following a read operation." ,
153
+ ReadAction :: Modify => "The register is **modified** in some way after a read operation." ,
154
+ ReadAction :: ModifyExternal => "One or more dependent resources other than the current register are immediately affected by a read operation." ,
155
+ } ) ;
156
+ }
157
+ doc. push ( ' ' ) ;
158
+ }
159
+
160
+ if can_write {
161
+ let mut methods = Vec :: new ( ) ;
162
+ if can_reset {
163
+ methods. push ( "reset" ) ;
164
+ methods. push ( "write" ) ;
165
+ }
166
+ methods. push ( "write_with_zero" ) ;
167
+ write ! (
168
+ doc,
169
+ "You can {} this register using [`{module}::W`]{}. " ,
170
+ methods
171
+ . iter( )
172
+ . map( |m| method( m) )
173
+ . collect:: <Vec <_>>( )
174
+ . join( ", " ) ,
175
+ if inmodule { "(W)" } else { "" } ,
176
+ ) ?;
177
+ }
178
+
179
+ if can_read && can_write {
180
+ write ! ( doc, "You can also {} this register. " , method( "modify" ) , ) ?;
181
+ }
182
+
183
+ doc. push_str ( "See [API](https://docs.rs/svd2rust/#read--modify--write-api)." ) ;
184
+
185
+ Ok ( doc)
186
+ }
187
+
109
188
pub fn render_register_mod (
110
189
register : & Register ,
111
190
access : Access ,
@@ -138,7 +217,6 @@ pub fn render_register_mod(
138
217
) ;
139
218
140
219
let mut mod_items = TokenStream :: new ( ) ;
141
- let mut methods = vec ! [ ] ;
142
220
143
221
let can_read = access. can_read ( ) ;
144
222
let can_write = access. can_write ( ) ;
@@ -150,7 +228,6 @@ pub fn render_register_mod(
150
228
#[ doc = #desc]
151
229
pub type R = crate :: R <#regspec_ident>;
152
230
} ) ;
153
- methods. push ( "read" ) ;
154
231
}
155
232
156
233
if can_write {
@@ -159,15 +236,6 @@ pub fn render_register_mod(
159
236
#[ doc = #desc]
160
237
pub type W = crate :: W <#regspec_ident>;
161
238
} ) ;
162
- methods. push ( "write_with_zero" ) ;
163
- if can_reset {
164
- methods. push ( "reset" ) ;
165
- methods. push ( "write" ) ;
166
- }
167
- }
168
-
169
- if can_read && can_write {
170
- methods. push ( "modify" ) ;
171
239
}
172
240
173
241
let mut r_impl_items = TokenStream :: new ( ) ;
@@ -310,29 +378,17 @@ pub fn render_register_mod(
310
378
close. to_tokens ( & mut mod_items) ;
311
379
}
312
380
313
- let methods = methods
314
- . iter ( )
315
- . map ( |s| format ! ( "[`{s}`](crate::generic::Reg::{s})" ) )
316
- . collect :: < Vec < _ > > ( ) ;
317
- let mut doc = format ! ( "{description}\n \n This register you can {}. See [API](https://docs.rs/svd2rust/#read--modify--write-api)." , methods. join( ", " ) ) ;
318
-
319
- if name_snake_case != "cfg" {
320
- doc += format ! (
321
- "\n \n For information about available fields see [{name_snake_case}](index.html) module"
322
- )
323
- . as_str ( ) ;
324
- }
325
-
326
- if can_read {
327
- if let Some ( action) = register. read_action {
328
- doc += match action {
329
- ReadAction :: Clear => "\n \n The register is **cleared** (set to zero) following a read operation." ,
330
- ReadAction :: Set => "\n \n The register is **set** (set to ones) following a read operation." ,
331
- ReadAction :: Modify => "\n \n The register is **modified** in some way after a read operation." ,
332
- ReadAction :: ModifyExternal => "\n \n One or more dependent resources other than the current register are immediately affected by a read operation." ,
333
- } ;
334
- }
335
- }
381
+ let doc = format ! (
382
+ "{description}\n \n {}" ,
383
+ api_docs(
384
+ can_read,
385
+ can_write,
386
+ can_reset,
387
+ & name_snake_case,
388
+ true ,
389
+ register. read_action,
390
+ ) ?
391
+ ) ;
336
392
337
393
mod_items. extend ( quote ! {
338
394
#[ doc = #doc]
@@ -344,15 +400,15 @@ pub fn render_register_mod(
344
400
} ) ;
345
401
346
402
if can_read {
347
- let doc = format ! ( "`read()` method returns [{name_snake_case}::R](R) reader structure" , ) ;
403
+ let doc = format ! ( "`read()` method returns [` {name_snake_case}::R` ](R) reader structure" , ) ;
348
404
mod_items. extend ( quote ! {
349
405
#[ doc = #doc]
350
406
impl crate :: Readable for #regspec_ident { }
351
407
} ) ;
352
408
}
353
409
if can_write {
354
410
let doc =
355
- format ! ( "`write(|w| ..)` method takes [{name_snake_case}::W](W) writer structure" , ) ;
411
+ format ! ( "`write(|w| ..)` method takes [` {name_snake_case}::W` ](W) writer structure" , ) ;
356
412
357
413
let zero_to_modify_fields_bitmap = util:: hex ( zero_to_modify_fields_bitmap) ;
358
414
let one_to_modify_fields_bitmap = util:: hex ( one_to_modify_fields_bitmap) ;
0 commit comments