Skip to content
Snippets Groups Projects
Makefile 6.58 KiB
# This Makefile compiles the HPVM-CAVA pilot project. 
# It builds HPVM-related dependencies, then the native camera pipeline ISP code.
#
# Paths to some dependencies (e.g., HPVM, LLVM) must exist in Makefile.config,
# which can be copied from Makefile.config.example for a start.

CONFIG_FILE := Makefile.config

ifeq ($(wildcard $(CONFIG_FILE)),)
    $(error $(CONFIG_FILE) not found. See $(CONFIG_FILE).example)
endif
include $(CONFIG_FILE)

# Compiler Flags

DLEVEL ?= 0
LFLAGS += -lm -lrt

# Build dirs
ifeq ($(VERSION),)
    VERSION = IR_modules
endif
SRC_DIR = src/
CAM_PIPE_SRC_DIR = $(SRC_DIR)
BUILD_DIR = build/$(TARGET)_$(VERSION)
CURRENT_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))

# Source files for the frontend camera pipeline
COMMON_SRCS = main.c \


#CAM_PIPE_SRCS = load_cam_model.c \
        cam_pipe_utility.c \
	dma_interface.c # FIXME: This is a hack until external C++ files can be included in build.


# NOTE: We have temporarily removed gem5 and other dependencies for simplicity.
SRCS = $(COMMON_SRCS)

# NATIVE_FULL_PATH_SRCS contains all the full path source files for the camera vision pipeline.
NATIVE_FULL_PATH_SRCS = $(patsubst %, $(SRC_DIR)/%, $(COMMON_SRCS))
NATIVE_FULL_PATH_SRCS += $(patsubst %, $(CAM_PIPE_SRC_DIR)/%, $(CAM_PIPE_SRCS))

INCLUDES +=  -I$(SRC_DIR) \
            -I$(CAM_PIPE_SRC_DIR) \

ifneq ($(CONFUSE_ROOT),)
INCLUDES += -I$(CONFUSE_ROOT)/include
LFLAGS += -L$(CONFUSE_ROOT)/lib
endif

EXE = vec_add

CAM_CFLAGS += -mf16c -flax-vector-conversions
LFLAGS += -pthread


## BEGIN HPVM MAKEFILE
LANGUAGE=visc
#SRCDIR_OBJS= load_cam_model.ll cam_pipe_utility.ll dma_interface.ll utility.ll
#OBJS_SRC=src/cam_pipe.c src/pipe_stages.c src/load_cam_model.c src/cam_pipe_utility.c src/dma_interface.c src/utility.c
VISC_OBJS=main.visc.ll
APP = $(EXE)
APP_CUDALDFLAGS=-lm -lstdc++
APP_CFLAGS= $(INCLUDES) -DDMA_MODE -DDMA_INTERFACE_V3
APP_CXXFLAGS=-ffast-math -O0 -I/opt/opencv/include
APP_LDFLAGS=$(LFLAGS)
OPT_FLAGS = -tti -targetlibinfo -tbaa -scoped-noalias -assumption-cache-tracker -profile-summary-info -forceattrs -inferattrs -ipsccp -globalopt -domtree -mem2reg -deadargelim -domtree -basicaa -aa -simplifycfg -pgo-icall-prom -basiccg -globals-aa -prune-eh -always-inline -functionattrs -domtree -sroa -early-cse -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -domtree -basicaa -aa -libcalls-shrinkwrap -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -loop-rotate -licm -loop-unswitch -simplifycfg -domtree -basicaa -aa -loops -loop-simplify -lcssa-verification -lcssa -scalar-evolution -indvars -loop-idiom -loop-deletion -memdep -memcpyopt -sccp -domtree -demanded-bits -bdce -basicaa -aa -lazy-value-info -jump-threading -correlated-propagation -domtree -basicaa -aa -memdep -dse -loops -loop-simplify -lcssa-verification -lcssa -aa -scalar-evolution -licm -postdomtree -adce -simplifycfg -domtree -basicaa -aa -barrier -basiccg -rpo-functionattrs -globals-aa -float2int -domtree -loops -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -loop-rotate -loop-accesses -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -loop-distribute -loop-simplify -lcssa-verification -lcssa -branch-prob -block-freq -scalar-evolution -basicaa -aa -loop-accesses -demanded-bits -lazy-branch-prob -lazy-block-freq -opt-remark-emitter -loop-vectorize -loop-simplify -scalar-evolution -aa -loop-accesses -loop-load-elim -basicaa -aa -simplifycfg -domtree -basicaa -aa -loops -scalar-evolution -alignment-from-assumptions -strip-dead-prototypes -domtree -loops -branch-prob -block-freq -loop-simplify -lcssa-verification -lcssa -basicaa -aa -scalar-evolution -branch-prob -block-freq -loop-sink -instsimplify 

CFLAGS = -O1 $(APP_CFLAGS) $(PLATFORM_CFLAGS)
OBJS_CFLAGS = -O1 $(APP_CFLAGS) $(PLATFORM_CFLAGS)
CXXFLAGS = $(APP_CXXFLAGS) $(PLATFORM_CXXFLAGS)
LDFLAGS= $(APP_LDFLAGS) $(PLATFORM_LDFLAGS)

LIBCLC_LIB_PATH = $(LLVM_SRC_ROOT)/../libclc/built_libs
#VISC_RT_PATH = $(LLVM_SRC_ROOT)/projects/visc-rt
VISC_RT_PATH = $(LLVM_SRC_ROOT)/tools/hpvm/projects/visc-rt

VISC_RT_LIB = $(VISC_RT_PATH)/visc-rt.ll
LIBCLC_NVPTX_LIB = $(LIBCLC_LIB_PATH)/nvptx64--nvidiacl.bc

LLVM_34_AS = $(LLVM_34_ROOT)/build/bin/llvm-as

TESTGEN_OPTFLAGS = -load LLVMGenVISC.so -genvisc -globaldce
KERNEL_GEN_FLAGS = -O3 -target nvptx64-nvidia-nvcl


DEVICE = CPU_TARGET
VISC_OPTFLAGS = -load LLVMBuildDFG.so -load LLVMDFG2LLVM_X86.so -load LLVMClearDFG.so -dfg2llvm-x86 -clearDFG
VISC_OPTFLAGS += -visc-timers-x86
TESTGEN_OPTFLAGS += -visc-timers-gen

CFLAGS += -DDEVICE=$(DEVICE)
CXXFLAGS += -DDEVICE=$(DEVICE)


# Add BUILDDIR as a prefix to each element of $1
INBUILDDIR=$(addprefix $(BUILD_DIR)/,$(1))

PYTHON_LLVM_40_34 = ../llvm-40-34.py

.PRECIOUS: $(BUILD_DIR)/%.ll

OBJS = $(call INBUILDDIR,$(SRCDIR_OBJS))
TEST_OBJS = $(call INBUILDDIR,$(VISC_OBJS))
KERNEL = $(TEST_OBJS).kernels.ll

ifeq ($(TARGET),x86)
  SPIR_ASSEMBLY = $(TEST_OBJS).kernels.bc
else ifeq ($(TARGET),seq)
else ifeq ($(TARGET),fpga)
  AOC_CL = $(TEST_OBJS).kernels.cl
  AOCL_ASSEMBLY = $(TEST_OBJS).kernels.aocx
  BOARD = a10gx
  ifeq ($(EMULATION),1)
    EXE = cava-visc-emu
    AOC_EMU = -march=emulator
    BUILD_DIR = build/$(TARGET)-emu
  endif
else
  KERNEL_LINKED = $(BUILD_DIR)/$(APP).kernels.linked.ll
  PTX_ASSEMBLY = $(TEST_OBJS).nvptx.s
endif

HOST_LINKED = $(BUILD_DIR)/$(APP).linked.ll
HOST = $(BUILD_DIR)/$(APP).host.ll

ifeq ($(OPENCL_PATH),)
FAILSAFE=no_opencl
else 
FAILSAFE=
endif

# Targets
default: $(FAILSAFE) $(BUILD_DIR) $(EXE)
#default: $(FAILSAFE) $(BUILD_DIR) $(PTX_ASSEMBLY) $(SPIR_ASSEMBLY) $(AOC_CL) $(AOCL_ASSEMBLY) $(EXE)

$(PTX_ASSEMBLY) : $(KERNEL_LINKED)
	$(CC) $(KERNEL_GEN_FLAGS) -S $< -o $@
$(KERNEL_LINKED) : $(KERNEL)
	$(LLVM_LINK) $(LIBCLC_NVPTX_LIB) -S $< -o $@

$(SPIR_ASSEMBLY) : $(KERNEL)
	python $(PYTHON_LLVM_40_34) $< $(BUILD_DIR)/kernel_34.ll
	$(LLVM_34_AS) $(BUILD_DIR)/kernel_34.ll -o $@

$(AOCL_ASSEMBLY) : $(AOC_CL)
	aoc --report $(AOC_EMU) $(AOC_CL) -o $(AOCL_ASSEMBLY) -board=$(BOARD)

$(AOC_CL) : $(KERNEL)
	llvm-cbe --debug $(KERNEL)

$(EXE) : $(HOST_LINKED)
	$(CXX) -O3 $(LDFLAGS) $< -o $@

$(HOST_LINKED) : $(HOST) $(OBJS) $(VISC_RT_LIB)
	$(LLVM_LINK) $^ -S -o $@

$(VISC_RT_LIB) : $(VISC_RT_PATH)/visc-rt.cpp
	make -C $(LLVM_LIB_PATH)

$(HOST) $(KERNEL): $(BUILD_DIR)/$(VISC_OBJS)
	$(OPT) -debug $(VISC_OPTFLAGS) -S $< -o $(HOST)

$(BUILD_DIR):
	mkdir -p $(BUILD_DIR)

$(BUILD_DIR)/%.ll : $(SRC_DIR)/%.c
	$(CC) $(OBJS_CFLAGS) -emit-llvm -S -o $@ $<

$(BUILD_DIR)/main.ll : $(SRC_DIR)/main.c
	$(CC) $(CFLAGS) -emit-llvm -S -o $@ $<

$(BUILD_DIR)/main.visc.ll : $(BUILD_DIR)/main.ll
	$(OPT) -debug-only=genvisc $(TESTGEN_OPTFLAGS) $< -S -o $@