4
4
#
5
5
# Usage: awk -f gen-sysreg.awk sysregs.txt
6
6
7
+ function block_current () {
8
+ return __current_block[ __current_block_depth] ;
9
+ }
10
+
7
11
# Log an error and terminate
8
12
function fatal (msg ) {
9
13
print " Error at " NR " : " msg > " /dev/stderr"
14
+
15
+ printf " Current block nesting:"
16
+
17
+ for (i = 0 ; i <= __current_block_depth; i++ ) {
18
+ printf " " __current_block[ i]
19
+ }
20
+ printf " \n "
21
+
10
22
exit 1
11
23
}
12
24
13
- # Sanity check that the start or end of a block makes sense at this point in
14
- # the file. If not, produce an error and terminate.
15
- #
16
- # @this - the $Block or $EndBlock
17
- # @prev - the only valid block to already be in (value of @block)
18
- # @new - the new value of @ block
19
- function change_block ( this , prev , new ) {
20
- if (block != prev )
21
- fatal(" unexpected " this " (inside " block " ) " )
22
-
23
- block = new
25
+ # Enter a new block, setting the active block to @block
26
+ function block_push ( block ) {
27
+ __current_block [ ++ __current_block_depth ] = block
28
+ }
29
+
30
+ # Exit a block, setting the active block to the parent block
31
+ function block_pop ( ) {
32
+ if (__current_block_depth == 0 )
33
+ fatal(" error: block_pop() in root block " )
34
+
35
+ __current_block_depth -- ;
24
36
}
25
37
26
38
# Sanity check the number of records for a field makes sense. If not, produce
@@ -84,19 +96,24 @@ BEGIN {
84
96
print " /* Generated file - do not edit */"
85
97
print " "
86
98
87
- block = " None"
99
+ __current_block_depth = 0
100
+ __current_block[ __current_block_depth] = " Root"
88
101
}
89
102
90
103
END {
104
+ if (__current_block_depth != 0 )
105
+ fatal(" Missing terminator for " block_current() " block" )
106
+
91
107
print " #endif /* __ASM_SYSREG_DEFS_H */"
92
108
}
93
109
94
110
# skip blank lines and comment lines
95
111
/^ $ / { next }
96
112
/^ [\t ]* # / { next }
97
113
98
- /^ SysregFields / {
99
- change_block(" SysregFields" , " None" , " SysregFields" )
114
+ /^ SysregFields / && block_current() == " Root" {
115
+ block_push(" SysregFields" )
116
+
100
117
expect_fields(2 )
101
118
102
119
reg = $2
@@ -110,12 +127,10 @@ END {
110
127
next
111
128
}
112
129
113
- /^ EndSysregFields / {
130
+ /^ EndSysregFields / && block_current() == " SysregFields " {
114
131
if (next_bit > 0 )
115
132
fatal(" Unspecified bits in " reg)
116
133
117
- change_block(" EndSysregFields" , " SysregFields" , " None" )
118
-
119
134
define(reg " _RES0" , " (" res0 " )" )
120
135
define(reg " _RES1" , " (" res1 " )" )
121
136
define(reg " _UNKN" , " (" unkn " )" )
@@ -126,11 +141,13 @@ END {
126
141
res1 = null
127
142
unkn = null
128
143
144
+ block_pop()
129
145
next
130
146
}
131
147
132
- /^ Sysreg / {
133
- change_block(" Sysreg" , " None" , " Sysreg" )
148
+ /^ Sysreg / && block_current() == " Root" {
149
+ block_push(" Sysreg" )
150
+
134
151
expect_fields(7 )
135
152
136
153
reg = $2
@@ -160,12 +177,10 @@ END {
160
177
next
161
178
}
162
179
163
- /^ EndSysreg / {
180
+ /^ EndSysreg / && block_current() == " Sysreg " {
164
181
if (next_bit > 0 )
165
182
fatal(" Unspecified bits in " reg)
166
183
167
- change_block(" EndSysreg" , " Sysreg" , " None" )
168
-
169
184
if (res0 != null)
170
185
define(reg " _RES0" , " (" res0 " )" )
171
186
if (res1 != null)
@@ -185,12 +200,13 @@ END {
185
200
res1 = null
186
201
unkn = null
187
202
203
+ block_pop()
188
204
next
189
205
}
190
206
191
207
# Currently this is effectivey a comment, in future we may want to emit
192
208
# defines for the fields.
193
- /^ Fields / && (block == " Sysreg" ) {
209
+ /^ Fields / && block_current() == " Sysreg" {
194
210
expect_fields(2 )
195
211
196
212
if (next_bit != 63 )
@@ -208,7 +224,7 @@ END {
208
224
}
209
225
210
226
211
- /^ Res0 / && (block == " Sysreg" || block == " SysregFields" ) {
227
+ /^ Res0 / && (block_current() == " Sysreg" || block_current() == " SysregFields" ) {
212
228
expect_fields(2 )
213
229
parse_bitdef(reg, " RES0" , $2 )
214
230
field = " RES0_" msb " _" lsb
@@ -218,7 +234,7 @@ END {
218
234
next
219
235
}
220
236
221
- /^ Res1 / && (block == " Sysreg" || block == " SysregFields" ) {
237
+ /^ Res1 / && (block_current() == " Sysreg" || block_current() == " SysregFields" ) {
222
238
expect_fields(2 )
223
239
parse_bitdef(reg, " RES1" , $2 )
224
240
field = " RES1_" msb " _" lsb
@@ -228,7 +244,7 @@ END {
228
244
next
229
245
}
230
246
231
- /^ Unkn / && (block == " Sysreg" || block == " SysregFields" ) {
247
+ /^ Unkn / && (block_current() == " Sysreg" || block_current() == " SysregFields" ) {
232
248
expect_fields(2 )
233
249
parse_bitdef(reg, " UNKN" , $2 )
234
250
field = " UNKN_" msb " _" lsb
@@ -238,7 +254,7 @@ END {
238
254
next
239
255
}
240
256
241
- /^ Field / && (block == " Sysreg" || block == " SysregFields" ) {
257
+ /^ Field / && (block_current() == " Sysreg" || block_current() == " SysregFields" ) {
242
258
expect_fields(3 )
243
259
field = $3
244
260
parse_bitdef(reg, field, $2 )
@@ -249,15 +265,16 @@ END {
249
265
next
250
266
}
251
267
252
- /^ Raz / && (block == " Sysreg" || block == " SysregFields" ) {
268
+ /^ Raz / && (block_current() == " Sysreg" || block_current() == " SysregFields" ) {
253
269
expect_fields(2 )
254
270
parse_bitdef(reg, field, $2 )
255
271
256
272
next
257
273
}
258
274
259
- /^ SignedEnum / {
260
- change_block(" Enum<" , " Sysreg" , " Enum" )
275
+ /^ SignedEnum / && (block_current() == " Sysreg" || block_current() == " SysregFields" ) {
276
+ block_push(" Enum" )
277
+
261
278
expect_fields(3 )
262
279
field = $3
263
280
parse_bitdef(reg, field, $2 )
@@ -268,8 +285,9 @@ END {
268
285
next
269
286
}
270
287
271
- /^ UnsignedEnum / {
272
- change_block(" Enum<" , " Sysreg" , " Enum" )
288
+ /^ UnsignedEnum / && (block_current() == " Sysreg" || block_current() == " SysregFields" ) {
289
+ block_push(" Enum" )
290
+
273
291
expect_fields(3 )
274
292
field = $3
275
293
parse_bitdef(reg, field, $2 )
@@ -280,8 +298,9 @@ END {
280
298
next
281
299
}
282
300
283
- /^ Enum / {
284
- change_block(" Enum" , " Sysreg" , " Enum" )
301
+ /^ Enum / && (block_current() == " Sysreg" || block_current() == " SysregFields" ) {
302
+ block_push(" Enum" )
303
+
285
304
expect_fields(3 )
286
305
field = $3
287
306
parse_bitdef(reg, field, $2 )
@@ -291,16 +310,18 @@ END {
291
310
next
292
311
}
293
312
294
- /^ EndEnum / {
295
- change_block( " EndEnum " , " Enum " , " Sysreg " )
313
+ /^ EndEnum / && block_current() == " Enum " {
314
+
296
315
field = null
297
316
msb = null
298
317
lsb = null
299
318
print " "
319
+
320
+ block_pop()
300
321
next
301
322
}
302
323
303
- /0b[01 ]+ / && block == " Enum" {
324
+ /0b[01 ]+ / && block_current() == " Enum" {
304
325
expect_fields(2 )
305
326
val = $1
306
327
name = $2
0 commit comments