arraygen/arraygen.py

138 lines
3.9 KiB
Python
Executable file

#!/usr/bin/env python3
# SPDX-FileCopyrightText: 2025 (c) A.M. Rowsell
# SPDX-FileContributor: A.M. Rowsell
# SPDX-License-Identifier: MPL-2.0
import csv
import math
import numpy
def digit(c):
s = ord(c)
if s >= ord("0") and s <= ord("7"):
return s - ord("0")
else:
return -1
def lutGenerate():
lut = []
while True:
bitOrder = int(input("Please enter the bit pattern (e.g. 46017235): "))
if len(str(bitOrder)) != 8:
print("Wrong number of digits: only 8-bit supported at the moment.")
else:
break
pos = []
for i in range(8):
b = digit(str(bitOrder)[i : i + 1])
pos.insert(b, 7 - i)
for i in range(256):
y = 0
for j in range(8):
y |= ((i >> pos[j]) & 1) << j
lut.insert(i, y)
return lut
def bcdEncode():
array = []
numPoints = int(input("Please enter the number of numbers: "))
for i in range(0, numPoints):
array.append("0x" + str(i))
return array
def consecutive():
array = []
startPoint = int(input("Please enter the starting value: "))
endPoint = int(input("Please enter the ending value: "))
skip = int(input("Please enter the skip value: "))
for i in range(startPoint, endPoint, skip):
array.append(i)
return array
def formula():
array = []
startPoint = int(input("Please enter starting value: "))
endPoint = int(input("Please enter the ending value: "))
formulaString = input("Please enter f(x): ")
formulaString = formulaString.replace("x", "{0}")
for i in range(startPoint, endPoint):
array.append(eval(formulaString.format(i)))
return array
def csvImport(filename):
array = []
with open(filename, newline="") as csvfile:
linereader = csv.reader(csvfile)
for row in linereader:
array.append(row)
def main():
print("C/C++ Array Generator by MrAureliusR")
print("Licensed under MPL v2")
completed = 0
while completed == 0:
print("What kind of array would you like to generate?")
print("1) Consecutive")
print("2) Formula")
print("3) BCD Encode")
print("4) Import CSV")
print("5) LUT for rearranged byte")
choice = input("Please pick a value from the list above: ")
if choice == "1":
array = consecutive()
completed = 1
elif choice == "2":
array = formula()
completed = 1
elif choice == "3":
array = bcdEncode()
completed = 1
elif choice == "4":
csvfilename = input("Please enter the filename: ")
array = csvImport(csvfilename)
completed = 1
elif choice == "5":
array = lutGenerate()
completed = 1
else:
print("Invalid selection!")
arrayName = input("Please pick a variable name for this array: ")
arrayType = input("Please enter the array type, eg, uint8_t, float, static char*: ")
try:
arrayLength = len(array)
except UnboundLocalError:
print(
"There was a problem examining the array. Please try again or report this bug!"
)
sys.exit(255)
# Begin printing the generated array, starting with type name[len] {
print(arrayType + " " + arrayName + "[" + str(arrayLength) + "] { ")
arrayIter = iter(array)
j = 0 # this variable keeps track of the number of items printed per line
print(" ", end="") # indent the first line
# iterate through all items in the array Pythonically
for value in arrayIter:
print(str(value) + ", ", end="")
j = j + 1
if j % 10 == 0: # more than 10 items? new line and indent
print("\n ", end="")
print("\x1b[2D", end="") # erase the extraneous , at the end of the array
print(" };")
return
if __name__ == "__main__":
main()