##############################################################################
################ This file sets the tbench for the CIM up ####################
##############################################################################

import os, sys
import subprocess

import numpy as np

from create_C_header import create_header
from genRandomData import genRandomData

### Local variables ###
# // Hardware parameters
# CIM size
Nrows = 1152;
Ncols = 256;
# Image dimensions
Himg = 28;
Wimg = Himg;
# Target layer size
C_in  = 1024;
C_out = 32;
# Target precision
r_in  = 1;
r_w   = 1;
r_out = 8;
# Timing config
T_DP    = 2;
T_PRE   = 2;
T_MBIT  = 2;
T_ADC   = 2;
# ABN vectors
r_beta  = 5;
r_gamma = 8;
GAMMA_VEC = np.arange(1,r_gamma);
BETA_VEC  = 2**np.arange(r_beta)-1;
# // Target data distributions & data
dist_in = 'normal';
dist_w  = 'uniform';
Ndata   = 50;
# // Path to output file
filename_h = "./outputs/cim_config.h";
filename_o = "./outputs/TF_DP_in.txt";

### Create data distributions ###
cim_info = (Nrows,Ncols,r_in,C_in,r_out,C_out);
dataVec = genRandomData(cim_info,dist_in,dist_w,Ndata);

### Generate test files ###
filename_vec  = (filename_h,filename_o);
cim_dim       = (Nrows,Ncols);
D_VEC         = (Himg,Wimg,C_in,C_out);
P_VEC         = (r_in,r_w,r_out,r_beta,r_gamma);
T_VEC         = (T_DP,T_PRE,T_MBIT,T_ADC);

create_header(filename_vec,cim_dim,D_VEC,P_VEC,T_VEC,BETA_VEC,GAMMA_VEC,dataVec);

# // C header has been created, C file is ready for execution //
print("/// Done writing setup files, ready for flashing ///");