CXXFLAGS += -Wall -O3
Kernel_dir = ../../Kernel
Kernel_OBJ = $(Kernel_dir)/bitvector.o $(Kernel_dir)/Cube.o $(Kernel_dir)/myExcept.o $(Kernel_dir)/mytime.o $(Kernel_dir)/PLA.o $(Kernel_dir)/PLA_type.o $(Kernel_dir)/SoPLA.o $(Kernel_dir)/Term.o $(Kernel_dir)/TTree.o $(Kernel_dir)/utils.o $(Kernel_dir)/PLA_operations.o $(Kernel_dir)/orthogonalize.o

BOOM_dir = ../../Apps/BOOM
BOOM_OBJ = $(BOOM_dir)/BOOM.cpp $(BOOM_dir)/BoomAlg.o $(BOOM_dir)/CD_search.o $(BOOM_dir)/Cover.o $(BOOM_dir)/CovMatrix.o $(BOOM_dir)/Expand.o $(BOOM_dir)/FC_Min.o $(BOOM_dir)/HeurCover.o $(BOOM_dir)/Reduce.o

Multilevel_dir = ../../Multilevel
Multilevel_OBJ = $(Multilevel_dir)/Blif.o $(Multilevel_dir)/Connection.o $(Multilevel_dir)/Network.o $(Multilevel_dir)/Node.o

Asynch_Multilevel_dir = ../../Apps/Asynch_Multilevel
Asynch_Multilevel_OBJ = $(Asynch_Multilevel_dir)/Asynch_Multilevel.o

GetInfo_dir = ../../Apps/GetInfo
GetInfo_obj = $(GetInfo_dir)/GetInfo.o

MergePLAs_dir = ../../Apps/MergePLAs
MergePLAs_obj = $(MergePLAs_dir)/MergePLAs.o

Ortho_dir = ../../Apps/Ortho
Ortho_obj = $(Ortho_dir)/Ortho.o

Parity_dir = ../../Apps/Parity
Parity_obj = $(Parity_dir)/Parity.o

Resynth_dir = ../../Apps/Resynth
Resynth_obj = $(Resynth_dir)/Resynth.o

Split_dir = ../../Apps/Split
Split_obj = $(Split_dir)/Split.o

Split_outputs_dir = ../../Apps/Split_outputs
Split_outputs_obj = $(Split_outputs_dir)/Split_outputs.o

Strip_udc_dir = ../../Apps/Strip_udc
Strip_udc_obj = $(Strip_udc_dir)/Strip_udc.o

Swap_dir = ../../Apps/Swap
Swap_obj = $(Swap_dir)/Swap.o


all:	boom GetInfo MergePLAs Ortho Split Strip_udc Swap

boom:		$(Kernel_OBJ) $(BOOM_OBJ)
		$(CXX) $(CFLAGS) -o bin/boom $(Kernel_OBJ) $(BOOM_OBJ)

# Asynch_multilevel:	$(Kernel_OBJ) $(Asynch_Multilevel_OBJ) $(Multilevel_dir)/Blif.o
#			$(CXX) $(CFLAGS) -o bin/Asynch_Multilevel $(Kernel_OBJ) $(Asynch_multilevel_OBJ) $(Multilevel_dir)/Blif.o

GetInfo:	$(GetInfo_obj) $(Kernel_OBJ) $(Multilevel_dir)/Blif.o
		$(CXX) $(CFLAGS) -o bin/GetInfo $(GetInfo_obj) $(Kernel_OBJ) $(Multilevel_dir)/Blif.o

MergePLAs:	$(MergePLAs_obj) $(Kernel_OBJ)
		$(CXX) $(CFLAGS) -o bin/MergePLAs $(MergePLAs_obj) $(Kernel_OBJ)

Ortho:		$(Ortho_obj) $(Kernel_OBJ)
		$(CXX) $(CFLAGS) -o bin/Ortho $(Ortho_obj) $(Kernel_OBJ)

# Parity:		$(Parity_obj) $(Kernel_OBJ) $(Multilevel_dir)/Blif.o
#		$(CXX) $(CFLAGS) -o bin/Parity $(Parity_obj) $(Kernel_OBJ) $(Multilevel_dir)/Blif.o

# Resynth:		$(Resynth_obj) $(Kernel_OBJ) $(Multilevel_OBJ)
#		$(CXX) $(CFLAGS) -o bin/Resynth $(Resynth_obj) $(Kernel_OBJ) $(Multilevel_OBJ)

Split:		$(Split_obj) $(Kernel_OBJ)
		$(CXX) $(CFLAGS) -o bin/Split $(Split_obj) $(Kernel_OBJ)

# Split_outputs:	$(Split_outputs_obj) $(Kernel_OBJ)
#		$(CXX) $(CFLAGS) -o bin/Split_outputs $(Split_outputs_obj) $(Kernel_OBJ)

Strip_udc:	$(Strip_udc_obj) $(Kernel_OBJ)
		$(CXX) $(CFLAGS) -o bin/Strip_udc $(Strip_udc_obj) $(Kernel_OBJ)

Swap:		$(Swap_obj) $(Kernel_OBJ)
		$(CXX) $(CFLAGS) -o bin/Swap $(Swap_obj) $(Kernel_OBJ)


clean:
	rm -f *.o
	rm -f $(Kernel_dir)/*.o
	rm -f $(Multilevel_dir)/*.o
	rm -f $(BOOM_dir)/*.o
	rm -f $(Asynch_Multilevel_dir)/*.o
	rm -f $(GetInfo_dir)/*.o
	rm -f $(MergePLAs_dir)/*.o
	rm -f $(Parity_dir)/*.o
	rm -f $(Resynth_dir)/*.o
	rm -f $(Split_dir)/*.o
	rm -f $(Strip_udc_dir)/*.o
	rm -f $(Swap_dir)/*.o
	rm bin/*
