@@ -82,18 +82,16 @@ def decode(self, row_num, row):
82
82
########### Decode #################
83
83
self .decode_bytes (rw , b0 , b1 )
84
84
85
-
86
-
87
85
def decode_bytes (self , rw , b0 , b1 ):
88
86
if b1 is None :
89
- self ._single_byte_decode (rw , b0 )
87
+ self .single_byte_decode (rw , b0 )
90
88
elif rw == "WRITE" :
91
- self ._decode_set_value (rw , b0 , b1 )
89
+ self .decode_set_value (rw , b0 , b1 )
92
90
else :
93
91
#raise RuntimeError("Multi-byte reads not supported")
94
92
return
95
93
96
- def _single_byte_decode (self , rw , b0 ):
94
+ def single_byte_decode (self , rw , b0 ):
97
95
98
96
if rw == "WRITE" :
99
97
current_register = self .register_map [self .current_bank ][b0 ]
@@ -120,7 +118,7 @@ def _single_byte_decode(self, rw, b0):
120
118
else :
121
119
raise ("UNEXPECTED READ WITHOUT PRECEDING WRITE" )
122
120
123
- def _decode_set_value (self , rw , reg_addr , value_byte ):
121
+ def decode_set_value (self , rw , reg_addr , value_byte ):
124
122
current_register = self .register_map [self .current_bank ][reg_addr ]
125
123
bitfields = self .load_bitfields (current_register )
126
124
@@ -134,53 +132,75 @@ def _decode_set_value(self, rw, reg_addr, value_byte):
134
132
old_value = current_register ['last_read_value' ]
135
133
136
134
print ("" )
137
- self ._decode_bitfields (current_register , value_byte )
135
+ self .decode_by_bitfield (current_register , value_byte )
138
136
print ("" )
139
137
140
- def _decode_bitfields (self , current_register , new_value ):
138
+ def decode_by_bitfield (self , current_register , new_value ):
141
139
old_value = current_register ['last_read_value' ]
142
140
bitfields = self .load_bitfields (current_register )
143
141
142
+ self .print_bitfield_changes (old_value , new_value , bitfields )
143
+
144
+ def print_bitfield_changes (self , old_value , new_value , bitfields ):
144
145
unset_bitmask , set_bitmask = self .bitwise_diff (old_value , new_value )
145
- for bf_name , bf_mask , bf_shift in bitfields :
146
- newp ("'%s' =>%s" % (bf_name , format (bf_mask , "#010b" )), 3 )
146
+ for bitfield in bitfields :
147
+ bf_change_str = self .bitfield_change_str (bitfield , unset_bitmask , set_bitmask , new_value )
148
+ if bf_change_str :
149
+ print (bf_change_str )
150
+
151
+ def bitfield_change_str (self , bitfield , unset_bitmask , set_bitmask , new_value ):
152
+ bf_name , bf_mask , bf_shift = bitfield
153
+ change_str = None
154
+ #newp("'%s' =>%s"%(bf_name, format(bf_mask, "#010b")), 3)
155
+ if bf_mask == 0b1 :
156
+ if (bf_mask & unset_bitmask ):
157
+ change_str = "\t \t %s was unset" % bf_name
158
+ if (bf_mask & set_bitmask ):
159
+ change_str = "\t \t %s was set" % bf_name
160
+ else :
147
161
if (bf_mask & unset_bitmask ) or (bf_mask & set_bitmask ):
148
- newp ("%s was changed" % bf_name )
149
- continue
162
+ bf_value = (bf_mask & new_value )>> bf_shift
163
+ change_str = "\t \t %s was changed to %s" % (bf_name , hex (bf_value ))
164
+
165
+ return change_str
150
166
151
- # in: bitswise diffs? current_reg current value
152
167
def load_bitfields (self , current_register ):
153
168
if 'bitfields' not in current_register :
154
169
bitfields = []
155
- prev_bitfield = None
170
+ prev_bitfield_name = None
156
171
for idx in range (8 ):
157
172
bitfield_def = current_register [idx ]
158
- bitfield = self .bitfield_def_to_bitfield (bitfield_def , idx )
159
- if prev_bitfield == bitfield or (not bitfield [0 ]):
173
+ bitfield_name , bitfield_mask , bitfield_shift = self .bitfield_def_to_bitfield (bitfield_def , idx )
174
+
175
+ if not bitfield_name or (prev_bitfield_name == bitfield_name ):
160
176
continue
161
- bitfields .append (bitfield )
162
- prev_bitfield = bitfield
177
+ # print("name:", bitfield_name, "mask: %s shift: %d"%(format(bitfield_mask,"#010b"), bitfield_shift))
178
+ bitfields .append ((bitfield_name , bitfield_mask , bitfield_shift ))
179
+ prev_bitfield_name = bitfield_name
163
180
current_register ['bitfields' ] = bitfields
164
181
return current_register ['bitfields' ]
165
182
bitfields
166
183
167
184
def bitfield_def_to_bitfield (self , bitfield_def , shift ):
168
185
match = re .fullmatch (BITFIELD_REGEX , bitfield_def )
169
- # NAMED BITFIELD UPDATED
170
186
if match : #
171
187
bitfield_name , bf_end , bf_start = match .groups ()
172
188
bf_end = int (bf_end )
173
189
bf_start = int (bf_start )
174
- bitfield_width_exponent = (bf_end - bf_start )+ 1
175
- # (2^2)-1 =>> (2**2)-1 = 4-1 =>> 3 -> 0b11 or 2^3 -1 = 8-1 = 7 -> 0b111
176
- bitfield_mask = (2 ** bitfield_width_exponent )- 1
177
- print ("name:" , bitfield_name , "mask: %s idx: %d" % (format (bitfield_mask ,"#010b" ), shift ))
190
+ bitfield_mask = self .bitfield_range_to_mask (bf_start , bf_end )
178
191
# SINGLE BIT W/ NAME
179
192
else :
180
193
bitfield_name = bitfield_def
181
194
bitfield_mask = (1 << shift )
182
195
return (bitfield_name , bitfield_mask , shift )
183
196
197
+ def bitfield_range_to_mask (self , bf_start , bf_end ):
198
+ bitfield_width = (bf_end - bf_start )+ 1
199
+ # (2^2)-1 => 4-1 => 3 -> 0b11
200
+ # (2^3)-1 => 8-1 => 7 -> 0b111
201
+ bitfield_mask = (2 ** bitfield_width )- 1
202
+ return bitfield_mask
203
+
184
204
# https://stackoverflow.com/questions/50705563/proper-way-to-do-bitwise-difference-python-2-7
185
205
# b_minus_a = b & ~a
186
206
# a_minus_b = a & ~b
0 commit comments