Chip_Case_Generator/4ch-Z_Generator/make_case.py

94 lines
3.2 KiB
Python

from ctypes import Union
import numpy as np
import random
class make_case(object):
def __init__(
self
):
self = 0
def data_gen(
self,
mode = 'random',
length = 1,
params = {}
):
match mode:
case 'random':
data = [random.randint(0,2**32) for _ in range(length)]
case 'ones':
data = (2**32-1)*np.ones(length)
case 'amp':
amp = params['amp']
amp = int(amp,0) if isinstance(amp, str) else int(amp)
data = amp*np.ones(length)
case 'zeros':
data = np.zeros(length)
case 'value':
value = params['value']
if np.size(value) != length:
print("Warnning: Length Mismatch")
elif length ==1:
data = int(value,0) if isinstance(value, str) else int(value)
else:
data = np.zeros(length)
for i in range(0,length):
data[i] = int(value[i],0) if isinstance(value[i], str) else int(value[i])
case 'acc':
ini_data = params['ini_data']
ini_data = int(ini_data,0) if isinstance(ini_data, str) else int(ini_data)
step_size = params['step_size']
step_size = int(step_size,0) if isinstance(step_size, str) else int(step_size)
data = np.zeros(length)
for i in range(0,length):
data[i] = ini_data + i*step_size
case 'rd_file':
file_name = params['file_name']
with open(file_name, "r") as f:
data_bin = f.read()
data_bin = data_bin.split('\n')
data = []
for d in data_bin:
data.append((int(d,2)))
return data
def rw_once(
self,
op = 'w',
addr = 0x1F00044,
data = [0],
file_name = 'case.txt',
chip_id = 0,
exaddr = 1,
ard_flag = 0
):
with open(file_name, "a") as f:
cmd = 1 if (op=='r') or (op==1) else 0
if isinstance(addr, str):
addr = int(addr,0)
else:
addr = int(addr)
f.write(f"{((int(cmd)<<31) | (int(ard_flag)<<30) | (int(chip_id)<<25) | (addr)):08x}\n")
f.write(f"{((int(exaddr)<<20) | (int(np.size(data)*4))):08x}\n")
if op == 'w':
if np.size(data) == 1:
if isinstance(data, str):
dt = int(data,0)
else:
dt = int(np.round(data))
f.write(f"{(dt if dt>=0 else 2**32+dt):08x}\n")
else:
for i in range(0,np.size(data)):
if isinstance(data[i], str):
dt = int(data[i],0)
else:
dt = int(np.round(data[i]))
f.write(f"{(dt if dt>=0 else 2**32+dt):08x}\n")
f.write('\n')