# ------------------------------------------------------------------------
# Makefile for mad (MP3 audio decoder, fixed-point) SpecC model
# ------------------------------------------------------------------------
#
# Modifications: (most recent first)
#
# AG 04/27/06	first version


# --- macros -------------------------------------------------------------

PROJECT	= mp3decoder
PACKAGE	= $(PROJECT).tar.gz

DATS	= $(wildcard *.dat)
HDRS	= $(wildcard *.h)
OBJS	= $(wildcard *.c)
INCS	= $(wildcard *.sh)
SRCS    = $(wildcard *.sc)
SOURCES	= $(HDRS) $(OBJS) $(INCS) $(SRCS) $(DATS)

STREAM_PATH	= ./testStream
REF_PATH	= ./reference
TESTSTREAMS	= spot1_3K classic1 spot1
#TESTSTREAMS	= spot1_3K funky classic1 classic2 spot1 spot2 spot3

CC		= gcc -m32
SCC		= scc
SCCINC          = -I.
SCCOPT		= -vv -ww -g $(SCCINC) $(CHANNEL_TYPE) $(TB_TIMING)

DISTDIR		= $(PROJECT)
DISTFILES	= README COPYING COPYRIGHT Makefile $(SOURCES) 		\
	          $(addprefix $(REF_PATH)/,$(addsuffix .pcm,$(TESTSTREAMS))) \
	          $(addprefix $(STREAM_PATH)/,$(addsuffix .mp3,$(TESTSTREAMS)))

RM		= rm -f
DIFF		= diff -s
MAKE		= make
MKDIR		= mkdir
TAR		= gtar
CHMOD		= chmod


# --- SpecC rules --------------------------------------------------------

.SUFFIXES:
.SUFFIXES:	.sc .sir .cc .c .o

.c.o:
	$(CC) -c $<

.sc.cc:
	$(SCC) $* -sc2cch $(SCCOPT)

.sc.sir:
	$(SCC) $* -sc2sir $(SCCOPT)

.cc.o:
	$(SCC) $* -cc2o $(SCCOPT)

.o:
	$(SCC) $* -o2out $(SCCOPT)

.cc:
	$(SCC) $* -cc2out $(SCCOPT)

.sc:
	$(SCC) $* -sc2out $(SCCOPT)

.sir:
	$(SCC) $* -sir2out $(SCCOPT)


# --- Targets

all:	testbench

ALL:
	$(MAKE) clean
	$(MAKE) all
	$(MAKE) test

test:	testbench
	set -e ; for file in $(TESTSTREAMS); do 		\
		./testbench $(STREAM_PATH)/$$file.mp3 $$file.pcm ; \
		if $(DIFF) $(REF_PATH)/$$file.pcm $$file.pcm > /dev/null ;\
		then\
			echo " OK";\
		else\
			echo " FAILED !!!!!!!!!";\
			exit 1;\
		fi;\
	done


# --- Explicit Rules

testbench: testbench.sir huffman.o
	$(SCC) testbench -sir2out $(SCCOPT) -xl huffman.o

testbench.sir: mp3monitor.sir mp3stimulus.sir mp3decoder.sir $(INCS)

mp3monitor.sir: $(INCS)

mp3stimulus.sir: $(INCS)

mp3decoder.sir: io.sir header.sir frame.sir synth.sir $(INCS)

io.sir: global.sir $(INCS)

header.sir: global.sir timer.sir bit.sir $(INCS)

frame.sir: layer3.sir $(INCS)

layer3.sir: sideinfo.sir decode3.sir $(INCS)

sideinfo.sir: bit.sir $(INCS)

decode3.sir: scalefac.sir huffman.sir stereo.sir aliasreduc.sir imdct.sir

scalefac.sir: global.sir bit.sir $(INCS)

huffman.sir: global.sir bit.sir $(INCS)

stereo.sir: huffman.sir $(INCS)

aliasreduc.sir: global.sir $(INCS)

imdct.sir: $(INCS)


# --- Maintenance Rules

clean:
	-$(RM) *.bak *.BAK *~
	-$(RM) *.si *.sir *.cc *.o
	-$(RM) testbench testbench.h *.exe
	-$(RM) *.pcm

distclean: clean
	$(RM) *.tar.gz


# --- Distribution

distdir:
	-$(RM) -r $(DISTDIR)
	$(MKDIR) $(DISTDIR)
	$(TAR) cf - $(DISTFILES) | $(TAR) xpfC - $(DISTDIR)

dist tar tarball:	distdir
	$(CHMOD) -R u+rwX,g-w+rX,o-rwx $(DISTDIR)
	$(TAR) czfC $(PACKAGE) $(DISTDIR) .
	$(RM) -r $(DISTDIR)


# --- EOF ----------------------------------------------------------------
