2
2
from functools import partial
3
3
from typing import Dict , Hashable , Iterable , List
4
4
5
+ import numpy as np
6
+
5
7
STAR = " * "
6
8
TAB = len (STAR ) * " "
7
9
@@ -147,6 +149,21 @@ def _maybe_panel(textgen, title: str, rich: bool):
147
149
return title + ":\n " + text
148
150
149
151
152
+ def find_set_bits (mask , value , repeated_masks ):
153
+ bitpos = np .arange (8 )[::- 1 ]
154
+ if mask not in repeated_masks :
155
+ if value == 0 :
156
+ return [- 1 ]
157
+ elif value is not None :
158
+ return [int (np .log2 (value ))]
159
+ else :
160
+ return [int (np .log2 (mask ))]
161
+ else :
162
+ allset = bitpos [np .unpackbits (np .uint8 (mask )) == 1 ]
163
+ setbits = bitpos [np .unpackbits (np .uint8 (mask & value )) == 1 ]
164
+ return [b if abs (b ) in setbits else - b for b in allset ]
165
+
166
+
150
167
def _format_flags (accessor , rich ):
151
168
from .accessor import create_flag_dict
152
169
@@ -165,6 +182,28 @@ def _format_flags(accessor, rich):
165
182
# for f, (m, _) in flag_dict.items()
166
183
# if m is not None and m not in repeated_masks
167
184
# ]
185
+ bit_text = []
186
+ value_text = []
187
+ for key , (mask , value ) in flag_dict .items ():
188
+ if mask is None :
189
+ bit_text .append ("✗" if rich else "" )
190
+ value_text .append (str (value ))
191
+ continue
192
+ bits = find_set_bits (mask , value , repeated_masks )
193
+ bitstring = ["." ] * 8
194
+ if bits == [- 1 ]:
195
+ continue
196
+ else :
197
+ for b in bits :
198
+ bitstring [abs (b )] = _format_cf_name ("1" if b >= 0 else "0" , rich )
199
+ text = "" .join (bitstring [::- 1 ])
200
+ value_text .append (
201
+ f"{ mask } & { value } "
202
+ if key in excl_flags and value is not None
203
+ else str (mask )
204
+ )
205
+ bit_text .append (text if rich else f" / Bit: { text } " )
206
+
168
207
if rich :
169
208
from rich import box
170
209
from rich .table import Table
@@ -179,29 +218,25 @@ def _format_flags(accessor, rich):
179
218
180
219
table .add_column ("Meaning" , justify = "left" )
181
220
table .add_column ("Value" , justify = "right" )
182
- table .add_column ("Bit? " , justify = "center" )
221
+ table .add_column ("Bits " , justify = "center" )
183
222
184
- for key , (mask , value ) in flag_dict .items ():
223
+ for val , bit , (key , (mask , value )) in zip (
224
+ value_text , bit_text , flag_dict .items ()
225
+ ):
185
226
table .add_row (
186
227
_format_cf_name (key , rich ),
187
- str ( value ) if key in excl_flags else str ( mask ) ,
188
- "✗" if key in excl_flags else "✓" ,
228
+ val ,
229
+ bit ,
189
230
)
190
231
191
232
return table
192
233
193
234
else :
194
- rows = [
195
- f"{ TAB } { _format_cf_name (key , rich )} : " f"{ _format_varname (value , rich )} "
196
- for key , (mask , value ) in flag_dict .items ()
197
- if key in excl_flags
198
- ]
199
-
200
- rows += [
201
- f"{ TAB } { _format_cf_name (key , rich )} : " f"Bit { _format_varname (mask , rich )} "
202
- for key , (mask , value ) in flag_dict .items ()
203
- if key not in excl_flags
204
- ]
235
+ rows = []
236
+ for val , bit , (key , (mask , value )) in zip (
237
+ value_text , bit_text , flag_dict .items ()
238
+ ):
239
+ rows .append (f"{ TAB } { _format_cf_name (key , rich )} : { TAB } { val } { bit } " )
205
240
return _print_rows ("Flag Meanings" , rows , rich )
206
241
207
242
0 commit comments