From 708d50d23cc4abd35b4b87d6ec36b6754b032554 Mon Sep 17 00:00:00 2001 From: Forest Belton <65484+forestbelton@users.noreply.github.com> Date: Tue, 6 Jul 2021 01:55:39 -0400 Subject: [PATCH] Add script for computing fixed-point constants --- scripts/convert_fixed_point.py | 59 ++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 scripts/convert_fixed_point.py diff --git a/scripts/convert_fixed_point.py b/scripts/convert_fixed_point.py new file mode 100644 index 0000000..f4fb940 --- /dev/null +++ b/scripts/convert_fixed_point.py @@ -0,0 +1,59 @@ +import argparse + + +def convert_to(dec_str: str) -> None: + str_parts = dec_str.split(".") + assert len(str_parts) == 2 + + whole_str, part_str = str_parts + whole_dec = int(whole_str) + part_dec = float(f"0.{part_str}") + part_bits = [] + for i in range(1, 9, 1): + bit = "0" + sub = 1 / (1 << i) + if part_dec > sub: + bit = "1" + part_dec = part_dec - sub + part_bits.append(bit) + part_dec = int("".join(part_bits), 2) + + assert whole_dec <= 0xFF + assert part_dec <= 0xFF + + print(f"0x{bytes([whole_dec, part_dec]).hex()}") + + +def convert_from(hex_str: str) -> None: + assert hex_str.startswith("0x") + assert len(hex_str) == 6 + + whole_bin = int(hex_str[2:4], 16) + # TODO: support negatives + # if whole_bin & (1 << 7): + # whole_bin = - + part_bin = int(hex_str[4:6], 16) + + part_dec = 0 + for i in range(1, 9, 1): + mask = 1 << (8 - i) + if part_bin & mask: + part_dec += 1 / (1 << i) + + print(f"{whole_bin + part_dec}") + + +def main() -> None: + parser = argparse.ArgumentParser("convert_fixed_point") + parser.add_argument("-d", "--decode", action="store_true") + parser.add_argument("decimal") + + args = parser.parse_args() + if args.decode: + convert_from(args.decimal) + else: + convert_to(args.decimal) + + +if __name__ == "__main__": + main()