Skip to content

Commit 29bde15

Browse files
committed
working bitwise change extraction
1 parent 3d3ef71 commit 29bde15

File tree

1 file changed

+43
-23
lines changed

1 file changed

+43
-23
lines changed

register_decoder/decoder.py

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -82,18 +82,16 @@ def decode(self, row_num, row):
8282
########### Decode #################
8383
self.decode_bytes(rw, b0, b1)
8484

85-
86-
8785
def decode_bytes(self, rw, b0, b1):
8886
if b1 is None:
89-
self._single_byte_decode(rw, b0)
87+
self.single_byte_decode(rw, b0)
9088
elif rw == "WRITE":
91-
self._decode_set_value(rw, b0, b1)
89+
self.decode_set_value(rw, b0, b1)
9290
else:
9391
#raise RuntimeError("Multi-byte reads not supported")
9492
return
9593

96-
def _single_byte_decode(self, rw, b0):
94+
def single_byte_decode(self, rw, b0):
9795

9896
if rw == "WRITE":
9997
current_register = self.register_map[self.current_bank][b0]
@@ -120,7 +118,7 @@ def _single_byte_decode(self, rw, b0):
120118
else:
121119
raise ("UNEXPECTED READ WITHOUT PRECEDING WRITE")
122120

123-
def _decode_set_value(self, rw, reg_addr, value_byte):
121+
def decode_set_value(self, rw, reg_addr, value_byte):
124122
current_register = self.register_map[self.current_bank][reg_addr]
125123
bitfields = self.load_bitfields(current_register)
126124

@@ -134,53 +132,75 @@ def _decode_set_value(self, rw, reg_addr, value_byte):
134132
old_value = current_register['last_read_value']
135133

136134
print("")
137-
self._decode_bitfields(current_register, value_byte)
135+
self.decode_by_bitfield(current_register, value_byte)
138136
print("")
139137

140-
def _decode_bitfields(self, current_register, new_value):
138+
def decode_by_bitfield(self, current_register, new_value):
141139
old_value = current_register['last_read_value']
142140
bitfields = self.load_bitfields(current_register)
143141

142+
self.print_bitfield_changes(old_value, new_value, bitfields)
143+
144+
def print_bitfield_changes(self, old_value, new_value, bitfields):
144145
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:
147161
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
150166

151-
# in: bitswise diffs? current_reg current value
152167
def load_bitfields(self, current_register):
153168
if 'bitfields' not in current_register:
154169
bitfields = []
155-
prev_bitfield = None
170+
prev_bitfield_name = None
156171
for idx in range(8):
157172
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):
160176
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
163180
current_register['bitfields'] = bitfields
164181
return current_register['bitfields']
165182
bitfields
166183

167184
def bitfield_def_to_bitfield(self, bitfield_def, shift):
168185
match = re.fullmatch(BITFIELD_REGEX, bitfield_def)
169-
# NAMED BITFIELD UPDATED
170186
if match: #
171187
bitfield_name, bf_end, bf_start = match.groups()
172188
bf_end = int(bf_end)
173189
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)
178191
# SINGLE BIT W/ NAME
179192
else:
180193
bitfield_name = bitfield_def
181194
bitfield_mask = (1 << shift)
182195
return (bitfield_name, bitfield_mask, shift)
183196

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+
184204
# https://stackoverflow.com/questions/50705563/proper-way-to-do-bitwise-difference-python-2-7
185205
# b_minus_a = b & ~a
186206
# a_minus_b = a & ~b

0 commit comments

Comments
 (0)