CXX ?= g++
CXXFLAGS ?= -std=c++17 -Wall -Wextra -O2

.PHONY: all clean tools

all: exchange_plan_dump no_blob_exchange one_to_many_exchange proper_multicast multi_tile_matmul run_matmul_executable load_executable parallel_sum build_baremetal

exchange_plan_dump: exchange_plan_dump.cpp exchange_plan.hpp
	$(CXX) $< $(CXXFLAGS) -o $@

no_blob_exchange: no_blob_exchange.cpp no_blob_codelets.cpp exchange_plan.hpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

one_to_many_exchange: one_to_many_exchange.cpp no_blob_codelets.cpp exchange_plan.hpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

proper_multicast: proper_multicast.cpp no_blob_codelets.cpp exchange_plan.hpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

multi_tile_matmul: multi_tile_matmul.cpp matmul_codelets.cpp exchange_plan.hpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

run_matmul_executable: run_matmul_executable.cpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

load_executable: load_executable.cpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

parallel_sum: parallel_sum.cpp no_blob_codelets.cpp exchange_plan.hpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

build_baremetal: build_baremetal.cpp baremetal_codelets.cpp baremetal_protocol.hpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

tools: plan_dump plan_dump_counts plan_dump_many exchange_plan_verify exchange_plan_tests host_exchange_plan_dump host_exchange_plan_tests tile_id_dump fanout_groups sdk_multicast_oracle sdk_host_tensor_oracle sdk_local_host_tensor_oracle sdk_host_exchange_codegen_oracle sdk_host_exchange_redirect_oracle sdk_host_exchange_d2h_redirect_oracle sdk_two_pass_exchange_oracle sdk_multi_host_read_oracle sdk_pcie_probe ipu_driver_probe direct_ipu_loader host_exchange_tests ipu_bootloader_frames ipu_ioctl_trace.so ipu_image ipu_image_tests ipu21_arch_constants gsp_config_decode sync_zone_dump popef_to_ipu_image

plan_dump: tools/plan_dump.cpp reference/JDL.hpp reference/JDL.gp
	$(CXX) $< $(CXXFLAGS) -Ireference -lpoplar -o $@

plan_dump_counts: tools/plan_dump_counts.cpp reference/JDL.hpp reference/JDL.gp
	$(CXX) $< $(CXXFLAGS) -Ireference -lpoplar -o $@

plan_dump_many: tools/plan_dump_many.cpp reference/JDL.hpp reference/JDL.gp
	$(CXX) $< $(CXXFLAGS) -Ireference -lpoplar -o $@

exchange_plan_verify: tools/exchange_plan_verify.cpp exchange_plan.hpp
	$(CXX) $< $(CXXFLAGS) -I. -o $@

exchange_plan_tests: tools/exchange_plan_tests.cpp exchange_plan.hpp
	$(CXX) $< $(CXXFLAGS) -I. -o $@

host_exchange_plan_tests: tools/host_exchange_plan_tests.cpp host_exchange_plan.hpp
	$(CXX) $< $(CXXFLAGS) -I. -o $@

host_exchange_plan_dump: tools/host_exchange_plan_dump.cpp host_exchange_plan.hpp
	$(CXX) $< $(CXXFLAGS) -I. -o $@

tile_id_dump: tools/tile_id_dump.cpp tools/tile_id_codelets.cpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

fanout_groups: tools/fanout_groups.cpp exchange_plan.hpp
	$(CXX) $< $(CXXFLAGS) -I. -o $@

sdk_multicast_oracle: tools/sdk_multicast_oracle.cpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

sdk_host_tensor_oracle: tools/sdk_host_tensor_oracle.cpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

sdk_local_host_tensor_oracle: tools/sdk_local_host_tensor_oracle.cpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

sdk_host_exchange_codegen_oracle: tools/sdk_host_exchange_codegen_oracle.cpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

sdk_host_exchange_redirect_oracle: tools/sdk_host_exchange_redirect_oracle.cpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

sdk_host_exchange_d2h_redirect_oracle: tools/sdk_host_exchange_d2h_redirect_oracle.cpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

sdk_two_pass_exchange_oracle: tools/sdk_two_pass_exchange_oracle.cpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

sdk_multi_host_read_oracle: tools/sdk_multi_host_read_oracle.cpp
	$(CXX) $< $(CXXFLAGS) -lpoplar -o $@

sdk_pcie_probe: tools/sdk_pcie_probe.cpp
	$(CXX) $< $(CXXFLAGS) -ldl -o $@

ipu_driver_probe: tools/ipu_driver_probe.cpp
	$(CXX) $< $(CXXFLAGS) -o $@

direct_ipu_loader: tools/direct_ipu_loader.cpp direct_ipu.hpp host_exchange.hpp ipu_image.hpp ipu_bootloader_frames.hpp
	$(CXX) $< $(CXXFLAGS) -I. -o $@

host_exchange_tests: tools/host_exchange_tests.cpp direct_ipu.hpp host_exchange.hpp
	$(CXX) $< $(CXXFLAGS) -I. -o $@

ipu_bootloader_frames: tools/ipu_bootloader_frames.cpp ipu_bootloader_frames.hpp ipu_image.hpp
	$(CXX) $< $(CXXFLAGS) -I. -o $@

ipu_ioctl_trace.so: tools/ipu_ioctl_trace.cpp
	$(CXX) $< $(CXXFLAGS) -g -fPIC -shared -ldl -o $@

ipu_image: tools/ipu_image.cpp ipu_image.hpp ipu_image_writer.hpp exchange_plan.hpp
	$(CXX) $< $(CXXFLAGS) -I. -o $@

ipu_image_tests: tools/ipu_image_tests.cpp ipu_image.hpp ipu_image_writer.hpp
	$(CXX) $< $(CXXFLAGS) -I. -o $@

ipu21_arch_constants: tools/ipu21_arch_constants.cpp
	$(CXX) $< $(CXXFLAGS) -ldl -o $@

gsp_config_decode: tools/gsp_config_decode.cpp
	$(CXX) $< $(CXXFLAGS) -lipu_arch_info -o $@

sync_zone_dump: tools/sync_zone_dump.cpp
	$(CXX) $< $(CXXFLAGS) -lipu_arch_info -o $@

popef_to_ipu_image: tools/popef_to_ipu_image.cpp ipu_image.hpp ipu_image_writer.hpp
	$(CXX) $< $(CXXFLAGS) -I. -lpoplar -o $@

clean:
	rm -f exchange_plan_dump no_blob_exchange one_to_many_exchange proper_multicast multi_tile_matmul run_matmul_executable load_executable parallel_sum build_baremetal plan_dump plan_dump_counts \
		plan_dump_many exchange_plan_verify exchange_plan_tests host_exchange_plan_dump host_exchange_plan_tests tile_id_dump fanout_groups \
		sdk_multicast_oracle sdk_host_tensor_oracle sdk_local_host_tensor_oracle sdk_host_exchange_codegen_oracle sdk_host_exchange_redirect_oracle sdk_host_exchange_d2h_redirect_oracle sdk_two_pass_exchange_oracle sdk_multi_host_read_oracle sdk_pcie_probe ipu_driver_probe direct_ipu_loader host_exchange_tests ipu_bootloader_frames ipu_ioctl_trace.so ipu_image ipu_image_tests ipu21_arch_constants gsp_config_decode sync_zone_dump popef_to_ipu_image sdk_multicast.popef sdk_host_tensor.popef
