@@ -18,6 +18,8 @@ def debug_print(*args, **kwargs):
18
18
if DEBUG :
19
19
print ("\t \t \t \t \t DEBUG:" , * args , ** kwargs )
20
20
21
+ def newp (new_s , tabs = 6 ):
22
+ print ("%s \t %s" % ("\t " * tabs , new_s ))
21
23
22
24
def verbose_print (* args , ** kwargs ):
23
25
if VERBOSE :
@@ -59,7 +61,7 @@ def decode(self, row_num, row):
59
61
print (rw , b0 , end = "" )
60
62
# like UNKNOWN
61
63
if rw == "WRITE" and (b0 != 0x7F ) and (not self ._reg_known (b0 )):
62
- print (
64
+ verbose_print (
63
65
"\n \t \t BAD KEY:" ,
64
66
b0 ,
65
67
"(%s)" % self ._h (b0 ),
@@ -117,59 +119,54 @@ def _single_byte_decode(self, rw, b0):
117
119
else :
118
120
raise ("UNEXPECTED READ WITHOUT PREV WRITE" )
119
121
120
-
121
- def _decode_set_value (self , rw , reg_addr , value_byte ):
122
- print (rw , reg_addr , value_byte )
123
- # print("current_bank:", self.current_bank, "type", type(self.current_bank))
124
- # print("reg_addr:", reg_addr)
125
- # print("map_keys:", self.register_map.keys())
126
- current_register = self .register_map [self .current_bank ][reg_addr ]
127
-
128
- # TODO: check this by name
129
- # ******* SET BANK **************
130
- if reg_addr == 0x7F :
131
- self .current_bank = value_byte >> 4
132
- return
133
- # ****IDENTIFIED WRITE TO REG W/ NEW VALUE ***
134
- print ("SET %s to %s (%s)" % (self ._reg_name (reg_addr ), self ._b (value_byte ), self ._h (value_byte )))
122
+ # in: bitswise diffs? current_reg current value
123
+ def _decode_bitfields (self , current_register , new_value ):
135
124
old_value = current_register ['last_read_value' ]
136
- # FIND BITS THAT HAVE CHANGED
137
- bitwise_diffs = self ._bitwise_diff (old_value , value_byte )
138
-
139
- # NOTHING CHANGED
140
- if len (bitwise_diffs ) is 0 :
141
- return
125
+ bitfields = self ._get_bitfields (current_register )
142
126
143
- self ._decode_bitfields (bitwise_diffs , current_register , value_byte )
144
- print ("" )
127
+ unset_bitmask , set_bitmask = self ._bitwise_diff2 (old_value , new_value )
128
+ for bf_name , bf_mask in bitfields :
129
+ newp ("'%s' =>%s" % (bf_name , format (bf_mask , "#010b" )), 3 )
130
+ if (bf_mask & unset_bitmask ) or (bf_mask & set_bitmask ):
131
+ newp ("%s was changed" % bf_name )
132
+ continue
145
133
146
134
# in: bitswise diffs? current_reg current value
147
- def _decode_bitfields (self , bitwise_diffs , current_register , value_byte ):
148
- for bitfield_def , group_iterator in self ._group_bitwise_diffs_by_bitfield_def (bitwise_diffs , current_register ):
149
-
150
- match = re .fullmatch (BITFIELD_REGEX , bitfield_def )
151
- print ("\t \t bitfield def: %s(%s)" % (bitfield_def , type (bitfield_def )))
152
- # NAMED BITFIELD UPDATED
153
- if match : #
154
- name , msb_str , lsb_str = match .groups ()
155
- bitfield_msb = int (msb_str )
156
- bitfield_lsb = int (lsb_str )
157
- bitfield_value = self ._extract_bitfield_val_from_byte (value_byte , bitfield_msb , bitfield_lsb )
158
- print ("\t %s" % name , "now HHet to" , self ._h (bitfield_value )) # check that this is called when we know the old value
159
- # SINGLE BIT W/ NAME
160
- else :
161
- group = list (group_iterator )
162
- print ("\t \t single named bit group:" )
163
- print ("\t \t " , group )
164
- bitfield_name = bitfield_def
165
- bitfield_value = bool (group [0 ][1 ])
166
- print ("\t %s is now set to %s" % (bitfield_name , bitfield_value ))
135
+ def _get_bitfields (self , current_register ):
136
+ if 'bitfields' not in current_register :
137
+ bitfields = []
138
+ prev_bitfield = None
139
+ for idx in range (8 ):
140
+ bitfield_def = current_register [idx ]
141
+ bitfield = self .extract_bitfield_mask (bitfield_def , idx )
142
+ if prev_bitfield == bitfield or (not bitfield [0 ]):
143
+ continue
144
+ bitfields .append (bitfield )
145
+ prev_bitfield = bitfield
146
+ current_register ['bitfields' ] = bitfields
147
+ return current_register ['bitfields' ]
148
+ bitfields
149
+
150
+ def extract_bitfield_mask (self , bitfield_def , idx ):
151
+ match = re .fullmatch (BITFIELD_REGEX , bitfield_def )
152
+ # NAMED BITFIELD UPDATED
153
+ if match : #
154
+ bitfield_name , bf_end , bf_start = match .groups ()
155
+ bf_end = int (bf_end )
156
+ bf_start = int (bf_start )
157
+ bitfield_width_exponent = (bf_end - bf_start )+ 1
158
+ # (2^2)-1 =>> (2**2)-1 = 4-1 =>> 3 -> 0b11 or 2^3 -1 = 8-1 = 7 -> 0b111
159
+ bitfield_mask = (2 ** bitfield_width_exponent )- 1
160
+ # SINGLE BIT W/ NAME
161
+ else :
162
+ bitfield_name = bitfield_def
163
+ bitfield_mask = (1 << idx )
164
+ return (bitfield_name , bitfield_mask )
167
165
168
- return bitfield_changes # [(unset_bitfield_mask, set_bitfield_mask)]
169
166
#################### new-style bitfield parsing/mapping #############################
170
167
def bitfield_masks (self , bitfields ):
171
168
bitfield_masks = {}
172
- # convert list of
169
+ # convert list of
173
170
# "0": "GYRO_FCHOICE",
174
171
# "1": "GYRO_FS_SEL[1:0]",
175
172
# "2": "GYRO_FS_SEL[1:0]",
@@ -189,14 +186,6 @@ def bitfield_masks(self, bitfields):
189
186
# https://stackoverflow.com/questions/50705563/proper-way-to-do-bitwise-difference-python-2-7
190
187
# b_minus_a = b & ~a
191
188
# a_minus_b = a & ~b
192
- # two values, represented by 2 and 4.
193
- # >>> b, a = 0b110, 0b1010
194
- # >>> b & ~a
195
- # 4
196
- # >>> bin(_)
197
- # 0b100
198
- # # By union they form a set, the value 6. (110)
199
- # I then have a second set, decimal value 10(binary 1010), which is 2 and 8.
200
189
201
190
def _bitwise_diff2 (self , old_value , new_value ):
202
191
if old_value is None :
@@ -213,6 +202,7 @@ def _bitwise_diff2(self, old_value, new_value):
213
202
214
203
def _bitfield_changes (self , bitfield_masks , unset_bitmask , set_bitmask ):
215
204
bitfield_changes = []
205
+ return bitfield_changes # [(unset_bitfield_mask, set_bitfield_mask)]
216
206
###############################################################
217
207
def _bitwise_diff (self , old_value , new_value ):
218
208
# out should be a set mask and an unset mask
@@ -226,11 +216,56 @@ def _bitwise_diff(self, old_value, new_value):
226
216
new_bit_value = (new_value & 1 << shift ) >> shift
227
217
changes .append ((shift , new_bit_value ))
228
218
return changes
219
+
220
+
221
+
222
+ def _decode_set_value (self , rw , reg_addr , value_byte ):
223
+ current_register = self .register_map [self .current_bank ][reg_addr ]
224
+
225
+ # TODO: check this by name
226
+ # ******* SET BANK **************
227
+ if reg_addr == 0x7F :
228
+ self .current_bank = value_byte >> 4
229
+ return
230
+ # ****IDENTIFIED WRITE TO REG W/ NEW VALUE ***
231
+ print ("SET %s to %s (%s)" % (self ._reg_name (reg_addr ), self ._b (value_byte ), self ._h (value_byte )))
232
+ old_value = current_register ['last_read_value' ]
233
+ # FIND BITS THAT HAVE CHANGED
234
+ bitwise_diffs = self ._bitwise_diff (old_value , value_byte )
235
+
236
+ # NOTHING CHANGED
237
+ if len (bitwise_diffs ) is 0 :
238
+ return
239
+ print ("" )
240
+ self ._decode_bitfields_old (bitwise_diffs , current_register , value_byte )
241
+ self ._decode_bitfields (current_register , value_byte )
242
+ print ("" )
243
+
244
+ # in: bitswise diffs? current_reg current value
245
+ def _decode_bitfields_old (self , bitwise_diffs , current_register , value_byte ):
246
+ for bitfield_def , group_iterator in self ._group_bitwise_diffs_by_bitfield_def (bitwise_diffs , current_register ):
247
+
248
+ match = re .fullmatch (BITFIELD_REGEX , bitfield_def )
249
+ # NAMED BITFIELD UPDATED
250
+ if match : #
251
+ name , msb_str , lsb_str = match .groups ()
252
+ bitfield_msb = int (msb_str )
253
+ bitfield_lsb = int (lsb_str )
254
+ bitfield_value = self ._extract_bitfield_val_from_byte (value_byte , bitfield_msb , bitfield_lsb )
255
+ print ("\t \t \t ***OLD CONTIG**\t %s" % name , "now set to" , self ._h (bitfield_value )) # check that this is called when we know the old value
256
+ # SINGLE BIT W/ NAME
257
+ else :
258
+ group = list (group_iterator )
259
+ bitfield_name = bitfield_def
260
+ bitfield_value = bool (group [0 ][1 ])
261
+ print ("\t \t \t ***OLD SINGLE**\t %s is now set to %s" % (bitfield_name , bitfield_value ))
262
+
263
+
229
264
############ PULL THIS SECTION OUT/REDO W/ MASKS #############
230
265
def _group_bitwise_diffs_by_bitfield_def (self , bitwise_diffs , register_def ):
231
266
232
267
bitfield_def = lambda x : register_def [x [0 ]]
233
- print ("\n \n \n " , "*" * 50 , "\n " ,register_def , "\n " , bitwise_diffs )
268
+ # print("\n\n\n", "*"*50, "\n",register_def, "\n", bitwise_diffs)
234
269
return itertools .groupby (bitwise_diffs , bitfield_def )
235
270
236
271
@@ -274,9 +309,9 @@ def _b(self, num):
274
309
map_loader = CSVRegisterMapLoader (source_files )
275
310
if map_loader .map is None :
276
311
raise AttributeError ("MAP is None" )
277
- print ( " \n ************* Making Decoder ***************************** \n " )
312
+
278
313
decoder = RegisterDecoder (register_map = map_loader .map )
279
- print ( " \n ************* Parsing ***************************** \n " )
314
+
280
315
with open (sys .argv [1 ], newline = "" ) as csvfile :
281
316
reader = csv .DictReader (csvfile )
282
317
for row_num , row in enumerate (reader ):
0 commit comments