#---------- Macros
SCRIPTS_PATH = /home/borowcm/RESEARCH/DPA_FLOW/scripts
REPO_PATH = /home/borowcm/Repositories/nfgen/z3_py
REPO_SCRIPTS = ${REPO_PATH}/hscripts
BASE_FSM = ${REPO_PATH}/results_isvlsi/fsms/base

MPERL = perl -I /home/borowcm/perl/share/perl/5.14.2 -I /home/borowcm/perl/share/perl/5.12.4 -I /home/borowcm/perl/lib/perl5 -I /home/borowcm/perl/lib/perl/5.12.4 -I /home/borowcm/perl/share/perl/5.10 -I /home/borowcm/perl/lib/perl/5.10

MATLABPATH = ${SCRIPTS_PATH}/mlab

NO_OF_KEY_BITS := 0
KEY := 0

PRECHARGE = 0
OVERWRITE = 1


SPICEFILE = $(OUTPUTFILE).sp 
SPICE_NETLIST = $(SPICEFILE)

FSMORIG = $(shell echo ${OUTPUTFILE} | cut -d'-' -f1)

BMARK = $(shell echo ${OUTPUTFILE} | cut -d'_' -f1)
ORACLE_PATH= ${REPO_PATH}/results_isvlsi/oracles/${BMARK}
ORACLE= ${ORACLE_PATH}/${FSMORIG}.oracle

NO_OF_IP_BITS_US := $(shell ${REPO_SCRIPTS}/fsminputlen.pl ${BASE_FSM}/${BMARK}.*)  
NO_OF_IP_BITS := $(strip $(NO_OF_IP_BITS_US))

NO_OF_OP_BITS := 0
NO_OF_VECTORS := 1000
NO_OF_VECTORS_FOR_DPA := $(NO_OF_VECTORS)

SOURCE = $(OUTPUTFILE)
TARGET = $(OUTPUTFILE)

#%if $(OVERWRITE) == "1"
#	TARGET = $(SOURCE)
#%endif

METHOD = CPA
ALGORITHM = DES10

###Parameters to control Input stimuli Gen
### ALL TIMES ARE IN NS
INPUT_TOGGLE_PERIOD := 10
CLK_PERIOD := $(INPUT_TOGGLE_PERIOD)
ACCURACY := 1
SPICE_TRAN_START_TIME := 0
INITIAL_DELAY := 20

############### NOT TO BE MODIFIED #############################
SOURCE_TEST_NAME = $(SOURCE)_K$(KEY)_I$(NO_OF_VECTORS)
TARGET_TEST_NAME = $(TARGET)_K$(KEY)_I$(NO_OF_VECTORS)

SPICE_FILE = $(TARGET_TEST_NAME).sp
DATA_FILE = $(TARGET_TEST_NAME).dat

VECTOR_FILE = $(SOURCE_TEST_NAME).ptext.vec
STIMULI_FILE = $(SOURCE_TEST_NAME)_stim.sp
VERILOG_TB_FILE = $(SOURCE_TEST_NAME)_tb.v

STATS_ORACLE_DATA = $(SOURCE)_I$(NO_OF_VECTORS).odat

#Paramter to control DPA analysis
START := 100
STEP := 100
SPLITWF_START_TIME := 29

SPLITWF_START_TIME_INDEX := $(shell echo $(SPLITWF_START_TIME)/$(ACCURACY) | bc)
SAMPLE_RATE_O := $(shell echo $(CLK_PERIOD)/$(ACCURACY) | bc)
SAMPLE_RATE := $(shell echo $(CLK_PERIOD)*10 | bc)

gen_stim = $(NO_OF_IP_BITS)_$(NO_OF_VECTORS)_$(INPUT_TOGGLE_PERIOD)_$(CLK_PERIOD)_$(ACCURACY)_$(INITIAL_DELAY)_$(PRECHARGE).genstim 

gen_vec =$(NO_OF_IP_BITS)_$(NO_OF_VECTORS)_$(INPUT_TOGGLE_PERIOD)_$(CLK_PERIOD)_$(ACCURACY)_$(INITIAL_DELAY)_$(PRECHARGE).ptext.vec
# Targets
DPA: run_nanosim run_c currvar

STATS:	run_nanosim stat_package

run_c:
	g++ $(SCRIPTS_PATH)/DPA.cc -o DPA
	./DPA $(DATA_FILE) $(VECTOR_FILE) $(NO_OF_KEY_BITS) $(NO_OF_VECTORS_FOR_DPA) $(KEY) $(TARGET_TEST_NAME) $(METHOD) $(ALGORITHM) $(SPLITWF_START_TIME_INDEX) $(START) $(STEP) $(NO_OF_OP_BITS) $(CLK_PERIOD) $(ACCURACY) $(PRECHARGE)

run_nanosim: gen_spice gen_cfg
	nanosim -n $(SPICE_FILE) -o $(TARGET_TEST_NAME) -c $(TARGET_TEST_NAME).cfg
	$(SCRIPTS_PATH)/datformat_nanosim.pl $(TARGET_TEST_NAME).out $(TARGET_TEST_NAME)

gen_spice: 

ifeq ($(OVERWRITE),1) 
	@echo "Generating Stimuli...."
	g++ $(SCRIPTS_PATH)/ipfnc.cc -o inputgen
	./inputgen $(NO_OF_IP_BITS) $(NO_OF_VECTORS) $(INPUT_TOGGLE_PERIOD) $(CLK_PERIOD) $(ACCURACY) $(INITIAL_DELAY) $(STIMULI_FILE) $(VECTOR_FILE) $(PRECHARGE) 
	$(SCRIPTS_PATH)/singleend.pl $(STIMULI_FILE)
	@echo "Generating Key...."
	g++ $(SCRIPTS_PATH)/gen_key.cc -o keygen
	./keygen $(KEY) $(NO_OF_KEY_BITS) $(SOURCE_TEST_NAME).key
	cat $(SOURCE_TEST_NAME).key >> $(STIMULI_FILE)
	cat reset.stim >> $(STIMULI_FILE)
	cp $(STIMULI_FILE) generic/$(gen_stim)
	cp $(VECTOR_FILE) generic/$(gen_vec)
else
	@echo "Copying Global Generic Stimuli..."
	cp generic/$(gen_stim) $(STIMULI_FILE)
	cp generic/$(gen_vec) $(VECTOR_FILE)

endif 

	sed -e 's/\.include[ ]*\.\/stimuli.sp/.include $(STIMULI_FILE)/g' $(SPICE_NETLIST) > $(SPICE_FILE)
	${MPERL} ${ORACLE} ${VECTOR_FILE} > ${STATS_ORACLE_DATA}
stat_package:
	@echo "Stats package execution..."
	@echo "${MPERL} ${REPO_SCRIPTS}/stats.pl ${DATA_FILE} ${SPLITWF_START_TIME_INDEX} ${NO_OF_VECTORS} ${CLK_PERIOD} ${SAMPLE_RATE} ${STATS_ORACLE_DATA}"
	${MPERL} ${REPO_SCRIPTS}/stats.pl ${DATA_FILE} ${SPLITWF_START_TIME_INDEX} ${NO_OF_VECTORS} ${CLK_PERIOD} ${SAMPLE_RATE} ${STATS_ORACLE_DATA} > ${OUTPUTFILE}.result
gen_stim:
	@echo "Matlab creation of vectors...."

	/opt-shared/math/Matlab-2010A/bin/glnxa64/MATLAB -nosplash -r "try, cd ${MATLABPATH}, exp_run([1 1 0 0; 1 0 1 0; 0 1 0 1; 0 0 1 1], [0 1 2 3], 50, 0 , $(NO_OF_VECTORS), .1, 'simple_mbe'), catch, end, quit" 
	mv ${MATLABPATH}/simple_mbe* .

gen_states:
	@echo "Generate Actual States"

#	/opt-shared/math/Matlab-2010A/bin/glnxa64/MATLAB -nosplash -r "try, cd ${MATLABPATH}, exp_run([1 1 0 0; 1 0 1 0; 0 1 0 1; 0 0 1 1], [0 1 2 3], 50, 0 , $(NO_OF_VECTORS), .1, 'simple_mbe'), catch, end, quit" 
#	mv ${MATLABPATH}/simple_mbe* .


gen_cfg:           
	echo "set_print_ires 1e-15" > $(TARGET_TEST_NAME).cfg
	echo "set_sim_ires 1e-12" >> $(TARGET_TEST_NAME).cfg
	echo "set_sim_eou model=1 sim=1" >> $(TARGET_TEST_NAME).cfg

currvar:
	$(SCRIPTS_PATH)/get_variance.pl $(DATA_FILE) $(TARGET_TEST_NAME) $(NO_OF_VECTORS_FOR_DPA) $(SPLITWF_START_TIME_INDEX) $(SAMPLE_RATE) $(STEP) $(PRECHARGE)

clean:
	\rm -rf *.sxx 
	\rm -rf *.lis
	\rm -rf *.ic0 *.st0 *.tr0
	\rm -rf *.ignore *.err *.hist *.fcap *.nodealias *.stat 
clean_data:
	\rm -rf *.dat *.stim 
list:
	\@$(foreach v, $(.VARIABLES), echo $(v)==$($(v))===;)
