1
- #!/usr/bin/env python3
1
+ #!/usr/bin/env python
2
2
3
3
#
4
4
# This file is part of unicore-mx.
@@ -46,14 +46,11 @@ def verify_access_flags(data):
46
46
if i not in ('r' , 'w' , 'c' , 's' , 'h' ):
47
47
raise Exception ("'%c' flag of flags '%s' not valid" % (i , data ))
48
48
49
- def next_useful_line (input_file , strip_newline = True , strip_comment = True ):
50
- if not hasattr (input_file , 'line_number' ):
51
- input_file .last_line_number = input_file .line_number = 1
52
-
53
- while input_file .readable ():
54
- input_file .last_useful_pos = input_file .tell ()
55
- input_file .last_line_number = input_file .line_number
56
- inp = input_file .readline ()
49
+ def next_useful_line (tag , strip_newline = True , strip_comment = True ):
50
+ while True :
51
+ tag ['last_useful_pos' ] = tag ['input_file' ].tell ()
52
+ tag ['last_line_number' ] = tag ['line_number' ]
53
+ inp = tag ['input_file' ].readline ()
57
54
58
55
if not len (inp ):
59
56
break
@@ -62,35 +59,35 @@ def next_useful_line(input_file, strip_newline=True, strip_comment=True):
62
59
inp = inp .rstrip ()
63
60
64
61
if not len (inp ):
65
- logger .debug ("** SKIPPING NEWLINE at %i ***" % input_file . line_number )
66
- input_file . line_number += 1
62
+ logger .debug ("** SKIPPING NEWLINE at %i ***" % tag [ ' line_number' ] )
63
+ tag [ ' line_number' ] += 1
67
64
continue
68
65
69
66
if strip_comment :
70
67
if inp [0 ] == "%" :
71
- input_file . line_number += 1
72
- logger .debug ("** SKIPPING %i '%s' ***" % (input_file . line_number , inp ))
68
+ tag [ ' line_number' ] += 1
69
+ logger .debug ("** SKIPPING %i '%s' ***" % (tag [ ' line_number' ] , inp ))
73
70
continue
74
71
75
- logger .debug ("** LINE %i '%s' ***" % (input_file . line_number , inp ))
76
- input_file . line_number += 1
72
+ logger .debug ("** LINE %i '%s' ***" % (tag [ ' line_number' ] , inp ))
73
+ tag [ ' line_number' ] += 1
77
74
return inp
78
75
79
76
logger .debug ("** END OF FILE ***" )
80
77
return ''
81
78
82
- def restore_last_useful_line (input_file ):
83
- input_file . line_number = input_file . last_line_number
84
- input_file .seek (input_file . last_useful_pos )
79
+ def restore_last_useful_line (tag ):
80
+ tag [ ' line_number' ] = tag [ ' last_line_number' ]
81
+ tag [ ' input_file' ] .seek (tag [ ' last_useful_pos' ] )
85
82
86
- def get_line_number (input_file ):
87
- return input_file . line_number
83
+ def get_line_number (tag ):
84
+ return tag [ ' line_number' ]
88
85
89
- def we_have_problem (msg , input_file ):
90
- raise Exception ("%s [line: %i]" % (msg , get_line_number (input_file )))
86
+ def we_have_problem (msg , tag ):
87
+ raise Exception ("%s [line: %i]" % (msg , get_line_number (tag )))
91
88
92
89
# this will return the last readed line. (if it could not parse it)
93
- def parse_family_member (input_file ):
90
+ def parse_family_member (tag ):
94
91
family = {
95
92
'name' : None ,
96
93
'instance' : None ,
@@ -99,12 +96,12 @@ def parse_family_member(input_file):
99
96
}
100
97
101
98
while True :
102
- inp = next_useful_line (input_file )
99
+ inp = next_useful_line (tag )
103
100
if inp == '' : break
104
101
105
102
if not inp [0 ] == ' ' :
106
103
# revese back and return
107
- restore_last_useful_line (input_file )
104
+ restore_last_useful_line (tag )
108
105
break
109
106
110
107
data = inp .split ()
@@ -138,13 +135,13 @@ def parse_family_member(input_file):
138
135
assert (family ['name' ] is not None )
139
136
return family
140
137
141
- def parse_family (input_file ):
142
- inp = next_useful_line (input_file )
138
+ def parse_family (tag ):
139
+ inp = next_useful_line (tag )
143
140
if inp == '' :
144
141
return None
145
142
146
143
if not inp [0 ] == 'f' :
147
- restore_last_useful_line (input_file )
144
+ restore_last_useful_line (tag )
148
145
return None
149
146
150
147
if not inp == "family" :
@@ -158,9 +155,9 @@ def parse_family(input_file):
158
155
'internal_only' : False
159
156
}
160
157
else :
161
- return parse_family_member (input_file )
158
+ return parse_family_member (tag )
162
159
163
- def parse_register_member (input_file ):
160
+ def parse_register_member (tag ):
164
161
register = {
165
162
'name' : [],
166
163
'offset' : None ,
@@ -173,12 +170,12 @@ def parse_register_member(input_file):
173
170
}
174
171
175
172
while True :
176
- inp = next_useful_line (input_file )
173
+ inp = next_useful_line (tag )
177
174
if inp == '' : break
178
175
179
176
if not inp [0 ] == ' ' :
180
177
# revese back and return
181
- restore_last_useful_line (input_file )
178
+ restore_last_useful_line (tag )
182
179
break
183
180
184
181
data = inp .split ()
@@ -235,13 +232,13 @@ def parse_register_member(input_file):
235
232
236
233
return register
237
234
238
- def parse_register (input_file ):
239
- inp = next_useful_line (input_file )
235
+ def parse_register (tag ):
236
+ inp = next_useful_line (tag )
240
237
if inp == '' :
241
238
return None
242
239
243
240
if inp [0 ] is not 'r' :
244
- restore_last_useful_line (input_file )
241
+ restore_last_useful_line (tag )
245
242
return None
246
243
247
244
if inp [3 ] == ' ' :
@@ -262,9 +259,9 @@ def parse_register(input_file):
262
259
}
263
260
else :
264
261
assert (inp == "register" )
265
- return parse_register_member (input_file )
262
+ return parse_register_member (tag )
266
263
267
- def parse_bit_member (input_file ):
264
+ def parse_bit_member (tag ):
268
265
bit = {
269
266
'name' : [],
270
267
'offset' : None ,
@@ -273,12 +270,12 @@ def parse_bit_member(input_file):
273
270
}
274
271
275
272
while True :
276
- inp = next_useful_line (input_file )
273
+ inp = next_useful_line (tag )
277
274
if inp == '' : break
278
275
279
276
if not inp [0 ] == ' ' :
280
277
# revese back and return
281
- restore_last_useful_line (input_file )
278
+ restore_last_useful_line (tag )
282
279
break
283
280
284
281
data = inp .split ()
@@ -299,7 +296,7 @@ def parse_bit_member(input_file):
299
296
assert (type (bit ['offset' ]) == list )
300
297
bit ['offset' ].append ({'id' : data [1 ], 'offset' : data [2 ]})
301
298
else :
302
- we_have_problem ("unknown design of offset" , input_file )
299
+ we_have_problem ("unknown design of offset" , tag )
303
300
elif data [0 ] == "access" :
304
301
# access <access>
305
302
verify_access_flags (data [1 ])
@@ -314,14 +311,14 @@ def parse_bit_member(input_file):
314
311
assert (len (bit ['name' ]))
315
312
return bit
316
313
317
- def parse_bit (input_file ):
318
- inp = next_useful_line (input_file )
314
+ def parse_bit (tag ):
315
+ inp = next_useful_line (tag )
319
316
if inp == '' :
320
317
return None
321
318
322
319
data = inp .split ()
323
320
if data [0 ] != "bit" :
324
- restore_last_useful_line (input_file )
321
+ restore_last_useful_line (tag )
325
322
return None
326
323
327
324
if len (data ) > 1 :
@@ -333,9 +330,9 @@ def parse_bit(input_file):
333
330
'variable' : []
334
331
}
335
332
else :
336
- return parse_bit_member (input_file )
333
+ return parse_bit_member (tag )
337
334
338
- def parse_bits_member (input_file ):
335
+ def parse_bits_member (tag ):
339
336
bits = {
340
337
'name' : [],
341
338
'offset' : None ,
@@ -346,12 +343,12 @@ def parse_bits_member(input_file):
346
343
}
347
344
348
345
while True :
349
- inp = next_useful_line (input_file )
346
+ inp = next_useful_line (tag )
350
347
if inp == '' : break
351
348
352
349
if not inp [0 ] == ' ' :
353
350
# revese back and return
354
- restore_last_useful_line (input_file )
351
+ restore_last_useful_line (tag )
355
352
break
356
353
357
354
data = inp .split ()
@@ -372,7 +369,7 @@ def parse_bits_member(input_file):
372
369
assert (type (bits ['offset' ]) == list )
373
370
bits ['offset' ].append ({'id' : data [1 ], 'offset' : data [2 ]})
374
371
else :
375
- we_have_problem ("unknown design of offset" , input_file )
372
+ we_have_problem ("unknown design of offset" , tag )
376
373
elif data [0 ] == "size" :
377
374
# size <size>
378
375
bits ['size' ] = data [1 ]
@@ -398,14 +395,14 @@ def parse_bits_member(input_file):
398
395
assert (bits ['size' ] is not None )
399
396
return bits
400
397
401
- def parse_bits (input_file ):
402
- inp = next_useful_line (input_file )
398
+ def parse_bits (tag ):
399
+ inp = next_useful_line (tag )
403
400
if inp == '' :
404
401
return None
405
402
406
403
data = inp .split ()
407
404
if data [0 ] != "bits" :
408
- restore_last_useful_line (input_file )
405
+ restore_last_useful_line (tag )
409
406
return None
410
407
411
408
if len (data ) > 1 :
@@ -420,14 +417,21 @@ def parse_bits(input_file):
420
417
'variable' : []
421
418
}
422
419
else :
423
- return parse_bits_member (input_file )
420
+ return parse_bits_member (tag )
424
421
425
422
def parse_input (input_file ):
426
423
data = []
427
424
inside_block = False
428
425
429
- while input_file .readable ():
430
- inp = next_useful_line (input_file , strip_newline = inside_block , \
426
+ tag = {
427
+ 'input_file' : input_file ,
428
+ 'last_line_number' : 1 ,
429
+ 'line_number' : 1 ,
430
+ 'last_useful_pos' : 0
431
+ }
432
+
433
+ while True :
434
+ inp = next_useful_line (tag , strip_newline = inside_block , \
431
435
strip_comment = False )
432
436
if not len (inp ):
433
437
break
@@ -450,28 +454,28 @@ def parse_input(input_file):
450
454
data .append ({'type' : 'extra' , 'payload' : res + "\n \n " })
451
455
continue
452
456
453
- restore_last_useful_line (input_file )
457
+ restore_last_useful_line (tag )
454
458
if inp [0 ] == "f" :
455
- family = parse_family (input_file )
459
+ family = parse_family (tag )
456
460
if family is None :
457
461
break
458
462
data .append ({'type' : 'family' , 'payload' : family })
459
463
elif inp [0 ] == "r" :
460
- register = parse_register (input_file )
464
+ register = parse_register (tag )
461
465
if register is None :
462
466
break
463
467
data .append ({'type' : 'register' , 'payload' : register })
464
468
elif inp [0 ] == "b" :
465
- bit = parse_bit (input_file )
469
+ bit = parse_bit (tag )
466
470
if bit is not None :
467
471
data .append ({'type' : 'bit' , 'payload' : bit })
468
472
else :
469
- bits = parse_bits (input_file )
473
+ bits = parse_bits (tag )
470
474
if bits is None :
471
475
break
472
476
data .append ({'type' : 'bits' , 'payload' : bits })
473
477
else :
474
- we_have_problem ("unknown input: \" %s\" " % inp , input_file )
478
+ we_have_problem ("unknown input: \" %s\" " % inp , tag )
475
479
break
476
480
return data
477
481
0 commit comments