
*** to conform to clang-format’s LLVM style. This kind of mass change has *** two obvious implications: Firstly, merging this particular commit into a downstream fork may be a huge effort. Alternatively, it may be worth merging all changes up to this commit, performing the same reformatting operation locally, and then discarding the merge for this particular commit. The commands used to accomplish this reformatting were as follows (with current working directory as the root of the repository): find . \( -iname "*.c" -or -iname "*.cpp" -or -iname "*.h" -or -iname "*.mm" \) -exec clang-format -i {} + find . -iname "*.py" -exec autopep8 --in-place --aggressive --aggressive {} + ; The version of clang-format used was 3.9.0, and autopep8 was 1.2.4. Secondly, “blame” style tools will generally point to this commit instead of a meaningful prior commit. There are alternatives available that will attempt to look through this change and find the appropriate prior commit. YMMV. llvm-svn: 280751
126 lines
3.5 KiB
Python
126 lines
3.5 KiB
Python
"Collection of tools for displaying bit representation of numbers."""
|
|
|
|
import StringIO
|
|
|
|
|
|
def binary(n, width=None):
|
|
"""
|
|
Return a list of (0|1)'s for the binary representation of n where n >= 0.
|
|
If you specify a width, it must be > 0, otherwise it is ignored. The list
|
|
could be padded with 0 bits if width is specified.
|
|
"""
|
|
l = []
|
|
if width and width <= 0:
|
|
width = None
|
|
while n > 0:
|
|
l.append(1 if n & 1 else 0)
|
|
n = n >> 1
|
|
|
|
if width:
|
|
for i in range(width - len(l)):
|
|
l.append(0)
|
|
|
|
l.reverse()
|
|
return l
|
|
|
|
|
|
def twos_complement(n, width):
|
|
"""
|
|
Return a list of (0|1)'s for the binary representation of a width-bit two's
|
|
complement numeral system of an integer n which may be negative.
|
|
"""
|
|
val = 2**(width - 1)
|
|
if n >= 0:
|
|
if n > (val - 1):
|
|
return None
|
|
# It is safe to represent n with width-bits.
|
|
return binary(n, width)
|
|
|
|
if n < 0:
|
|
if abs(n) > val:
|
|
return None
|
|
# It is safe to represent n (a negative int) with width-bits.
|
|
return binary(val * 2 - abs(n))
|
|
|
|
# print binary(0xABCD)
|
|
# [1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1]
|
|
# print binary(0x1F, 8)
|
|
# [0, 0, 0, 1, 1, 1, 1, 1]
|
|
# print twos_complement(-5, 4)
|
|
# [1, 0, 1, 1]
|
|
# print twos_complement(7, 4)
|
|
# [0, 1, 1, 1]
|
|
# print binary(7)
|
|
# [1, 1, 1]
|
|
# print twos_complement(-5, 64)
|
|
# [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1]
|
|
|
|
|
|
def positions(width):
|
|
"""Helper function returning a list describing the bit positions.
|
|
Bit positions greater than 99 are truncated to 2 digits, for example,
|
|
100 -> 00 and 127 -> 27."""
|
|
return ['{0:2}'.format(i)[-2:] for i in reversed(range(width))]
|
|
|
|
|
|
def utob(debugger, command_line, result, dict):
|
|
"""Convert the unsigned integer to print its binary representation.
|
|
args[0] (mandatory) is the unsigned integer to be converted
|
|
args[1] (optional) is the bit width of the binary representation
|
|
args[2] (optional) if specified, turns on verbose printing"""
|
|
args = command_line.split()
|
|
try:
|
|
n = int(args[0], 0)
|
|
width = None
|
|
if len(args) > 1:
|
|
width = int(args[1], 0)
|
|
if width < 0:
|
|
width = 0
|
|
except:
|
|
print utob.__doc__
|
|
return
|
|
|
|
if len(args) > 2:
|
|
verbose = True
|
|
else:
|
|
verbose = False
|
|
|
|
bits = binary(n, width)
|
|
if not bits:
|
|
print "insufficient width value: %d" % width
|
|
return
|
|
if verbose and width > 0:
|
|
pos = positions(width)
|
|
print ' ' + ' '.join(pos)
|
|
print ' %s' % str(bits)
|
|
|
|
|
|
def itob(debugger, command_line, result, dict):
|
|
"""Convert the integer to print its two's complement representation.
|
|
args[0] (mandatory) is the integer to be converted
|
|
args[1] (mandatory) is the bit width of the two's complement representation
|
|
args[2] (optional) if specified, turns on verbose printing"""
|
|
args = command_line.split()
|
|
try:
|
|
n = int(args[0], 0)
|
|
width = int(args[1], 0)
|
|
if width < 0:
|
|
width = 0
|
|
except:
|
|
print itob.__doc__
|
|
return
|
|
|
|
if len(args) > 2:
|
|
verbose = True
|
|
else:
|
|
verbose = False
|
|
|
|
bits = twos_complement(n, width)
|
|
if not bits:
|
|
print "insufficient width value: %d" % width
|
|
return
|
|
if verbose and width > 0:
|
|
pos = positions(width)
|
|
print ' ' + ' '.join(pos)
|
|
print ' %s' % str(bits)
|