#---------- Macros
SCRIPTS_PATH = /home/borowcm/Dev_Work/scripts
NO_OF_KEY_BITS := 6
KEY := 20

OVERWRITE = 0
PRECHARGE = 0

NO_OF_IP_BITS := 10
NO_OF_OP_BITS := 4
NO_OF_VECTORS := 1000
NO_OF_VECTORS_FOR_DPA := 1000

SPICE_NETLIST = des_test_trycm4_tweaked_K20_I1000.sp

SOURCE = des_test_try1
TARGET = des_test_trycm4_tweaked

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

METHOD = CPA
ALGORITHM = DES10
############### 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
HW_FILE_1 = $(SOURCE_TEST_NAME).1.PBC
HW_FILE_0 = $(SOURCE_TEST_NAME).0.PBC
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


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


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

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

FIRST_CLK_POSEDGE := $(shell echo $(INITIAL_DELAY) + $(CLK_PERIOD)/2 | bc) 
FIRST_CLK_POSEDGE_INDEX := $(shell echo $(FIRST_CLK_POSEDGE)/$(ACCURACY) + 1 | bc)
RELATIVE_CLK_POSEDGE_INDEX := $(shell echo $(FIRST_CLK_POSEDGE_INDEX) + 1 - $(SPLITWF_START_TIME_INDEX) | bc)
CLK_OFFSET_INDEX := $(shell echo $(CLK_OFFSET)/$(ACCURACY) | bc)

# Targets
DPA: run_nanosim run_c currvar

DPA_only: run_c curr_inv

run_c:
	g++ $(SCRIPTS_PATH)/DPA.cc
	./a.out $(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_only: 
	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)

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
	./a.out $(NO_OF_IP_BITS) $(NO_OF_VECTORS) $(INPUT_TOGGLE_PERIOD) $(CLK_PERIOD) $(ACCURACY) $(INITIAL_DELAY) $(STIMULI_FILE) $(VECTOR_FILE) $(VERILOG_TB_FILE) $(PRECHARGE)
	$(SCRIPTS_PATH)/singleend.pl $(STIMULI_FILE)
	@echo "Generating Key...."
	g++ $(SCRIPTS_PATH)/gen_key.cc
	./a.out $(KEY) $(NO_OF_KEY_BITS) $(SOURCE_TEST_NAME).key
	cat $(SOURCE_TEST_NAME).key >> $(STIMULI_FILE)
endif 
	sed -e 's/\.include[ ]*\.\/stimuli.sp/.include $(STIMULI_FILE)/g' $(SPICE_NETLIST) > $(SPICE_FILE)

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=4 sim=3" >> $(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)

currvar2:
	$(SCRIPTS_PATH)/get_variance_modified.pl $(DATA_FILE) $(TARGET_TEST_NAME) $(NO_OF_VECTORS_FOR_DPA) $(SPLITWF_START_TIME_INDEX) $(SAMPLE_RATE) $(STEP) $(PRECHARGE) $(HW_FILE_1) $(HW_FILE_0)

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 

clean_matlab:
	\rm -rf *.m

