10
10
bank0 = None
11
11
bank1 = None
12
12
13
+ BITFIELD_REGEX = '^([^\[]+)\[(\d):(\d)\]$' # matches WHO_AM_I[7:0], DISABLE_ACCEL[5:3] etc.
13
14
14
15
def debug_print (* args , ** kwargs ):
15
16
if DEBUG :
@@ -54,6 +55,7 @@ def decode(self, row_num, row):
54
55
# TODO: Add support for an arbitrary number of bytes
55
56
# check for a first byte
56
57
b0 = int (row ["byte0" ], 16 )
58
+ # like UNKNOWN
57
59
if rw == "WRITE" and (b0 != 0x7F ) and (not self ._reg_known (b0 )):
58
60
print (
59
61
"\n \t \t BAD KEY:" ,
@@ -80,53 +82,11 @@ def decode(self, row_num, row):
80
82
def decode_bytes (self , rw , b0 , b1 ):
81
83
if b1 is None :
82
84
self ._single_byte_decode (rw , b0 )
85
+ elif rw == "WRITE" :
86
+ self ._decode_set_value (rw , b0 , b1 )
83
87
else :
84
- self . _multi_byte_decode ( rw , b0 , b1 )
88
+ raise RuntimeError ( "Multi-byte reads not supported" )
85
89
86
- def _multi_byte_decode (self , rw , b0 , b1 ):
87
- if rw == "WRITE" :
88
- current_register = self .banks_dict [self .current_bank ][b0 ]
89
-
90
- # TODO: check this by name
91
- if b0 == 0x7F :
92
- self .current_bank = b1 >> 4
93
- return
94
- print ("SET %s to %s (%s)" % (self ._reg_name (b0 ), self ._b (b1 ), self ._h (b1 )))
95
- old_value = current_register ['last_read_value' ]
96
- bitwise_diffs = self ._bitwise_diff (old_value , b1 )
97
- if len (bitwise_diffs ) is 0 :
98
- return
99
-
100
- for bitfield_def , group_iterator in self ._group_diffs (bitwise_diffs , current_register ):
101
- group = list (group_iterator )
102
-
103
- rx = '^([^\[]+)\[(\d):(\d)\]$'
104
- m = re .fullmatch (rx , bitfield_def )
105
- if m is not None :
106
- bitfield_name , bitfield_value = self ._bitfield_value (m , b1 )
107
- print ("\t %s" % bitfield_name , "now set to" , self ._h (bitfield_value )) # check that this is called when we know the old value
108
- else :
109
- bitfield_name = bitfield_def
110
- bitfield_value = bool (group [0 ][1 ])
111
- print ("\t %s is now set to %s" % (bitfield_name , bitfield_value ))
112
- print ("" )
113
-
114
- else :
115
- print (
116
- "\t \t \t \t \t \t \t _READ %s=%s (%s)"
117
- % (self ._reg_name (b0 ), self ._b (b1 ), self ._h (b1 ))
118
- )
119
-
120
- def _bitwise_diff (self , old_value , new_value ):
121
- if old_value is None :
122
- old_value = 0
123
- changed_bits = old_value ^ new_value
124
- changes = []
125
- for shift in range (7 , - 1 , - 1 ):
126
- if changed_bits >> shift & 0b1 :
127
- new_bit_value = (new_value & 1 << shift ) >> shift
128
- changes .append ((shift , new_bit_value ))
129
- return changes
130
90
131
91
def _single_byte_decode (self , rw , b0 ):
132
92
@@ -155,36 +115,86 @@ def _single_byte_decode(self, rw, b0):
155
115
else :
156
116
raise ("UNEXPECTED READ WITHOUT PREV WRITE" )
157
117
118
+
119
+ def _decode_set_value (self , rw , reg_addr , value_byte ):
120
+ print (rw , reg_addr , value_byte )
121
+
122
+ current_register = self .banks_dict [self .current_bank ][reg_addr ]
123
+
124
+ # TODO: check this by name
125
+ # ******* SET BANK **************
126
+ if reg_addr == 0x7F :
127
+ self .current_bank = value_byte >> 4
128
+ return
129
+ # ****IDENTIFIED WRITE TO REG W/ NEW VALUE ***
130
+ print ("SET %s to %s (%s)" % (self ._reg_name (reg_addr ), self ._b (value_byte ), self ._h (value_byte )))
131
+ old_value = current_register ['last_read_value' ]
132
+ # FIND BITS THAT HAVE CHANGED
133
+ bitwise_diffs = self ._bitwise_diff (old_value , value_byte )
134
+
135
+ # NOTHING CHANGED
136
+ if len (bitwise_diffs ) is 0 :
137
+ return
138
+
139
+ self ._decode_bitfields (bitwise_diffs , current_register , value_byte )
140
+ print ("" )
141
+
142
+ def _decode_bitfields (self , bitwise_diffs , current_register , value_byte ):
143
+ for bitfield_def , group_iterator in self ._group_bitwise_diffs_by_bitfield_def (bitwise_diffs , current_register ):
144
+
145
+ match = re .fullmatch (BITFIELD_REGEX , bitfield_def )
146
+ # NAMED BITFIELD UPDATED
147
+ if match : #
148
+ name , msb_str , lsb_str = match .groups ()
149
+ bitfield_msb = int (msb_str )
150
+ bitfield_lsb = int (lsb_str )
151
+ bitfield_value = self ._extract_bitfield_val_from_byte (value_byte , bitfield_msb , bitfield_lsb )
152
+ print ("\t %s" % name , "now HHet to" , self ._h (bitfield_value )) # check that this is called when we know the old value
153
+ # SINGLE BIT W/ NAME
154
+ else :
155
+ group = list (group_iterator )
156
+ bitfield_name = bitfield_def
157
+ bitfield_value = bool (group [0 ][1 ])
158
+ print ("\t %s is now zzet to %s" % (bitfield_name , bitfield_value ))
159
+
160
+ def _bitwise_diff (self , old_value , new_value ):
161
+ if old_value is None :
162
+ old_value = 0
163
+ changed_bits = old_value ^ new_value
164
+ changes = []
165
+ for shift in range (7 , - 1 , - 1 ):
166
+ if changed_bits >> shift & 0b1 :
167
+ new_bit_value = (new_value & 1 << shift ) >> shift
168
+ changes .append ((shift , new_bit_value ))
169
+ return changes
170
+
171
+
172
+ def _extract_bitfield_val_from_byte (self , value_byte , msb , lsb ):
173
+ """Extract the value of bitfield from a byte using a returned match object"""
174
+ # determine the mask width exponent from [3:0]-> 3-(0+1) = 2
175
+ bitfield_width_exponent = msb - lsb + 1
176
+ # (2^2)-1 =>> (2**2)-1 = 4-1 =>> 3 -> 0b11 or 2^3 -1 = 8-1 = 7 -> 0b111
177
+ bitfield_mask = (2 ** bitfield_width_exponent )- 1
178
+ bitfield_mask <<= lsb
179
+ bitfield_value = (value_byte & bitfield_mask ) >> lsb
180
+
181
+ return bitfield_value
182
+
158
183
def _reg_known (self , b0 ):
159
184
return b0 in self .banks_dict [self .current_bank ].keys ()
160
185
161
186
def _reg_name (self , b0 ):
162
187
return self .banks_dict [self .current_bank ][b0 ]["name" ]
163
188
164
- def _group_diffs (self , bitwise_diffs , register_def ):
189
+ def _group_bitwise_diffs_by_bitfield_def (self , bitwise_diffs , register_def ):
165
190
bitfield_def = lambda x : register_def [x [0 ]]
166
191
return itertools .groupby (bitwise_diffs , bitfield_def )
167
192
168
- def _bitfield_value (self , m , byte ):
169
-
170
- match_groups = m .groups ()
171
-
172
- bitfield_name = match_groups [0 ]
173
- bitfield_msb = int (match_groups [1 ])
174
- bitfield_lsb = int (match_groups [2 ])
175
-
176
- bitfield_width = bitfield_msb - bitfield_lsb + 1
177
- bitfield_mask = (2 ** bitfield_width )- 1
178
- bitfield_mask <<= bitfield_lsb
179
- bitfield_value = (byte & bitfield_mask ) >> bitfield_lsb
180
-
181
- return (bitfield_name , bitfield_value )
182
-
183
193
def _h (self , num ):
184
194
return "0x%s" % format (num , "02X" )
185
195
186
196
def _b (self , num ):
187
- return "0b%s %s" % (format (num >> 4 , "04b" ), format ((num & 0b1111 ), "04b" ))
197
+ return "0b %s %s" % (format (num >> 4 , "04b" ), format ((num & 0b1111 ), "04b" ))
188
198
# return format(num, "#010b")
189
199
190
200
def parse_csv_bank (self , filename , bank_number = 0 ):
0 commit comments