Skip to content

Commit 1556a68

Browse files
committed
NEWWWWWWWW methodz
1 parent d0db7ad commit 1556a68

File tree

3 files changed

+148
-58
lines changed

3 files changed

+148
-58
lines changed

register_decoder/decoder.py

Lines changed: 92 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ def debug_print(*args, **kwargs):
1818
if DEBUG:
1919
print("\t\t\t\t\tDEBUG:", *args, **kwargs)
2020

21+
def newp(new_s, tabs=6):
22+
print("%s \t%s"%("\t"*tabs, new_s))
2123

2224
def verbose_print(*args, **kwargs):
2325
if VERBOSE:
@@ -59,7 +61,7 @@ def decode(self, row_num, row):
5961
print(rw, b0, end="")
6062
# like UNKNOWN
6163
if rw == "WRITE" and (b0 != 0x7F) and (not self._reg_known(b0)):
62-
print(
64+
verbose_print(
6365
"\n\t\tBAD KEY:",
6466
b0,
6567
"(%s)" % self._h(b0),
@@ -117,59 +119,54 @@ def _single_byte_decode(self, rw, b0):
117119
else:
118120
raise ("UNEXPECTED READ WITHOUT PREV WRITE")
119121

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):
135124
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)
142126

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
145133

146134
# 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\tbitfield 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\tsingle 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)
167165

168-
return bitfield_changes # [(unset_bitfield_mask, set_bitfield_mask)]
169166
#################### new-style bitfield parsing/mapping #############################
170167
def bitfield_masks(self, bitfields):
171168
bitfield_masks = {}
172-
# convert list of
169+
# convert list of
173170
# "0": "GYRO_FCHOICE",
174171
# "1": "GYRO_FS_SEL[1:0]",
175172
# "2": "GYRO_FS_SEL[1:0]",
@@ -189,14 +186,6 @@ def bitfield_masks(self, bitfields):
189186
# https://stackoverflow.com/questions/50705563/proper-way-to-do-bitwise-difference-python-2-7
190187
# b_minus_a = b & ~a
191188
# 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.
200189

201190
def _bitwise_diff2(self, old_value, new_value):
202191
if old_value is None:
@@ -213,6 +202,7 @@ def _bitwise_diff2(self, old_value, new_value):
213202

214203
def _bitfield_changes(self, bitfield_masks, unset_bitmask, set_bitmask):
215204
bitfield_changes = []
205+
return bitfield_changes # [(unset_bitfield_mask, set_bitfield_mask)]
216206
###############################################################
217207
def _bitwise_diff(self, old_value, new_value):
218208
# out should be a set mask and an unset mask
@@ -226,11 +216,56 @@ def _bitwise_diff(self, old_value, new_value):
226216
new_bit_value = (new_value & 1<<shift) >> shift
227217
changes.append((shift, new_bit_value))
228218
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+
229264
############ PULL THIS SECTION OUT/REDO W/ MASKS #############
230265
def _group_bitwise_diffs_by_bitfield_def(self, bitwise_diffs, register_def):
231266

232267
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)
234269
return itertools.groupby(bitwise_diffs, bitfield_def)
235270

236271

@@ -274,9 +309,9 @@ def _b(self, num):
274309
map_loader = CSVRegisterMapLoader(source_files)
275310
if map_loader.map is None :
276311
raise AttributeError("MAP is None")
277-
print("\n************* Making Decoder *****************************\n")
312+
278313
decoder = RegisterDecoder(register_map=map_loader.map)
279-
print("\n************* Parsing *****************************\n")
314+
280315
with open(sys.argv[1], newline="") as csvfile:
281316
reader = csv.DictReader(csvfile)
282317
for row_num, row in enumerate(reader):

register_decoder/map_loader/__init__.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,47 @@ def __init__(self, map_source=None):
33
self.map_source = map_source
44
self._map = None
55
self.load_map()
6+
self.generate_bitfield_masks()
67

78
def load_map(self):
89
if self.map_source is None:
910
raise AttributeError("Base Class", self.__name__, "cannot be instantiated directly")
1011
@property
1112
def map(self):
1213
"""The object representing the register map"""
13-
return self._map
14+
return self._map
15+
16+
def generate_bitfield_masks(self):
17+
pass
18+
# in: bitswise diffs? current_reg current value
19+
def _get_bitfields(self, current_register):
20+
if 'bitfields' not in current_register:
21+
bitfields = []
22+
prev_bitfield = None
23+
for idx in range(8):
24+
bitfield_def = current_register[idx]
25+
bitfield = self.extract_bitfield_mask(bitfield_def, idx)
26+
if prev_bitfield == bitfield or (not bitfield[0]):
27+
continue
28+
bitfields.append(bitfield)
29+
prev_bitfield = bitfield
30+
current_register['bitfields'] = bitfields
31+
return current_register['bitfields']
32+
bitfields
33+
34+
def extract_bitfield_mask(self, bitfield_def, idx):
35+
match = re.fullmatch(BITFIELD_REGEX, bitfield_def)
36+
# NAMED BITFIELD UPDATED
37+
if match: #
38+
bitfield_name, bf_end, bf_start = match.groups()
39+
bf_end = int(bf_end)
40+
bf_start = int(bf_start)
41+
bitfield_width_exponent = (bf_end-bf_start)+1
42+
# (2^2)-1 =>> (2**2)-1 = 4-1 =>> 3 -> 0b11 or 2^3 -1 = 8-1 = 7 -> 0b111
43+
bitfield_mask = (2**bitfield_width_exponent)-1
44+
# SINGLE BIT W/ NAME
45+
else:
46+
bitfield_name = bitfield_def
47+
bitfield_mask = (1 << idx)
48+
return (bitfield_name, bitfield_mask)
49+

register_decoder/shift_test.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
def get_shift(mask):
2+
for i in range(7, -1, -1):
3+
if mask > (1<<i):
4+
continue
5+
return i
6+
return None
7+
8+
if __name__ == "__main__":
9+
10+
for i in range(7, -1, -1):
11+
print(i)
12+
msk = (1<<i)-1
13+
print("Mask:", format(msk, "#010b"), get_shift(msk))
14+
msk = (1<<i)
15+
print("Mask:", format(msk, "#010b"), get_shift(msk))
16+
shft= (8-i)
17+
msk = (1<<i)-1 << shft
18+
print("Mask:", format(msk, "#010b"),"shft", shft, get_shift(msk))
19+
print()

0 commit comments

Comments
 (0)