############################
# makefile parameters
############################
SHELL =	/bin/sh

circuit =	digicode
CELLS_LIB =	$(TOP)/cells/scr
C4_LIB =	C4
AUTO_PATH =	.

SYF_EXE       = $(TOP)/archi/$(MACHINE)/bin/syf
LOGIC_EXE     = $(TOP)/archi/$(MACHINE)/bin/logic
NETOPTIM_EXE  = $(TOP)/archi/$(MACHINE)/bin/netoptim
SCR_EXE       = $(TOP)/archi/$(MACHINE)/bin/scr
LYNX_EXE      = $(TOP)/archi/$(MACHINE)/bin/lynx
PROOF_EXE     = $(TOP)/archi/$(MACHINE)/bin/proof
DESB_EXE      = $(TOP)/archi/$(MACHINE)/bin/desb

SYF =	MBK_WORK_LIB=$(AUTO_PATH);		export MBK_WORK_LIB;\
	$(SYF_EXE)

OPTIM = MBK_WORK_LIB=$(AUTO_PATH);		export MBK_WORK_LIB;\
	$(LOGIC_EXE) -o

MAPSC = MBK_WORK_LIB=$(AUTO_PATH);		export MBK_WORK_LIB;\
	MBK_TARGET_LIB=$(CELLS_LIB);		export MBK_TARGET_LIB;\
	MBK_IN_LO=al;				export MBK_IN_LO;\
	MBK_OUT_LO=al;				export MBK_OUT_LO;\
	$(LOGIC_EXE) -s

MAPC4 = MBK_WORK_LIB=$(AUTO_PATH);		export MBK_WORK_LIB;\
	MBK_C4_LIB=$(C4_LIB);			export MBK_C4_LIB;\
	MBK_IN_LO=al;				export MBK_IN_LO;\
	MBK_OUT_LO=al;				export MBK_OUT_LO;\
	MBK_OUT_PH=ap;				export MBK_OUT_PH;\
	$(LOGIC_EXE) -c

NETOPTIM = MBK_CATAL_NAME=CATAL;		export MBK_CATAL_NAME;\
	MBK_CATA_LIB=$(CELLS_LIB):$(C4_LIB);	export MBK_CATA_LIB;\
	MBK_WORK_LIB=$(AUTO_PATH);		export MBK_WORK_LIB;\
	MBK_VDD=vdd;				export MBK_VDD;\
	MBK_VSS=vss;				export MBK_VSS;\
	MBK_IN_LO=al;				export MBK_IN_LO;\
	MBK_OUT_LO=al;				export MBK_OUT_LO;\
	$(NETOPTIM_EXE) -g

TIMING = MBK_CATAL_NAME=CATAL;			export MBK_CATAL_NAME;\
	MBK_CATA_LIB=$(CELLS_LIB):$(C4_LIB);	export MBK_CATA_LIB;\
	MBK_WORK_LIB=$(AUTO_PATH);		export MBK_WORK_LIB;\
	MBK_VDD=vdd;				export MBK_VDD;\
	MBK_VSS=vss;				export MBK_VSS;\
	MBK_IN_LO=al;				export MBK_IN_LO;\
	$(NETOPTIM_EXE) -t

SCR =	MBK_CATAL_NAME=CATAL;                   export MBK_CATAL_NAME;\
	MBK_CATA_LIB=$(CELLS_LIB):$(C4_LIB);	export MBK_CATA_LIB;\
	MBK_WORK_LIB=$(AUTO_PATH);		export MBK_WORK_LIB;\
	MBK_IN_LO=al;                         	export MBK_IN_LO;\
	MBK_IN_PH=ap;                         	export MBK_IN_PH;\
	MBK_OUT_PH=ap;                        	export MBK_OUT_PH;\
	$(SCR_EXE) -p -r -i 1000

LYNX =  MBK_CATAL_NAME=CATAL;                   export MBK_CATAL_NAME;\
	MBK_CATA_LIB=$(CELLS_LIB):$(C4_LIB);	export MBK_CATA_LIB;\
        MBK_WORK_LIB=$(AUTO_PATH);		export MBK_WORK_LIB;\
        MBK_IN_PH=ap;	                        export MBK_IN_PH;\
        MBK_OUT_LO=al;    	                export MBK_OUT_LO;\
        $(LYNX_EXE) -f

DESB =  MBK_WORK_LIB=$(AUTO_PATH);		export MBK_WORK_LIB;\
	MBK_CATA_LIB=$(CELLS_LIB):$(C4_LIB);	export MBK_CATA_LIB;\
	MBK_IN_LO=al;                         	export MBK_IN_LO;\
        $(DESB_EXE) -v

PROOF =	MBK_WORK_LIB=$(AUTO_PATH);		export MBK_WORK_LIB;\
        $(PROOF_EXE) -d -p

.SILENT:

all : $(circuit)rg0sct.vbe $(circuit)sg0sct.vbe $(circuit)sg3sct.vbe $(circuit)sg0c4t.vbe $(circuit)sg3c4t.vbe proof results

clean	:
	-@rm -f $(AUTO_PATH)/*.cod
	-@rm -f $(AUTO_PATH)/*.vbe
	-@rm -f $(AUTO_PATH)/*.al
	-@rm -f $(AUTO_PATH)/*.ap
	-@rm -f $(AUTO_PATH)/*.dsbr
	-@rm -f $(AUTO_PATH)/*.fcf
	-@rm -f $(AUTO_PATH)/results
	-@rm -f $(C4_LIB)/CATAL
	-@rm -f $(C4_LIB)/*.vbe
	-@rm -f $(C4_LIB)/*.al
	-@rm -f $(C4_LIB)/*.icn
	-@rm -f $(C4_LIB)/*.ap

################################################################################
#	State encoding by SYF
################################################################################
$(circuit)s.vbe : $(circuit).fsm
	$(SYF) -s $(circuit) -save
$(circuit)r.vbe : $(circuit).fsm
	$(SYF) -r $(circuit) -save

################################################################################
#	Delay and Area global Optimisation by LOGIC
################################################################################
$(circuit)sg0.vbe : $(circuit)s.vbe area.lax
	$(OPTIM) $(circuit)s $(circuit)sg0 area
$(circuit)rg0.vbe : $(circuit)r.vbe area.lax
	$(OPTIM) $(circuit)r $(circuit)rg0 area
$(circuit)sg3.vbe : $(circuit)s.vbe delay.lax
	$(OPTIM) $(circuit)s $(circuit)sg3 delay

################################################################################
#	Mapping by LOGIC
################################################################################
$(circuit)sg0sc.al : $(circuit)sg0.vbe
	$(MAPSC) $(circuit)sg0 $(circuit)sg0sc area
$(circuit)rg0sc.al : $(circuit)rg0.vbe
	$(MAPSC) $(circuit)rg0 $(circuit)rg0sc area
$(circuit)sg3sc.al : $(circuit)sg3.vbe
	$(MAPSC) $(circuit)sg3 $(circuit)sg3sc delay
$(circuit)sg0c4.al : $(circuit)sg0.vbe
	$(MAPC4) $(circuit)sg0 $(circuit)sg0c4 area
$(circuit)sg3c4.al : $(circuit)sg3.vbe
	$(MAPC4) $(circuit)sg3 $(circuit)sg3c4 delay

################################################################################
#	Delay Optimisation by NETOPTIM
################################################################################
$(circuit)sg0scg.al : $(circuit)sg0sc.al neto.lax
	$(NETOPTIM) $(circuit)sg0sc $(circuit)sg0scg neto
$(circuit)rg0scg.al : $(circuit)rg0sc.al neto.lax
	$(NETOPTIM) $(circuit)rg0sc $(circuit)rg0scg neto
$(circuit)sg3scg.al : $(circuit)sg3sc.al neto.lax
	$(NETOPTIM) $(circuit)sg3sc $(circuit)sg3scg neto
$(circuit)sg0c4g.al : $(circuit)sg0c4.al neto.lax
	$(NETOPTIM) $(circuit)sg0c4 $(circuit)sg0c4g neto
$(circuit)sg3c4g.al : $(circuit)sg3c4.al neto.lax
	$(NETOPTIM) $(circuit)sg3c4 $(circuit)sg3c4g neto


################################################################################
#	Placement and Routage by SCR
################################################################################
$(circuit)sg0scg.ap : $(circuit)sg0scg.al
	$(SCR) $(circuit)sg0scg
$(circuit)rg0scg.ap : $(circuit)rg0scg.al
	$(SCR) $(circuit)rg0scg
$(circuit)sg3scg.ap : $(circuit)sg3scg.al
	$(SCR) $(circuit)sg3scg
$(circuit)sg0c4g.ap : $(circuit)sg0c4g.al
	$(SCR) $(circuit)sg0c4g
$(circuit)sg3c4g.ap : $(circuit)sg3c4g.al
	$(SCR) $(circuit)sg3c4g

################################################################################
#	Area and Delay Results
################################################################################
results : $(circuit)sg0scg.ap $(circuit)sg3scg.ap $(circuit)sg0c4g.ap $(circuit)sg3c4g.ap $(circuit)rg0scg.ap
	echo "Simulated annealing encoding and standard cell mapping with area optimisation :" > results
	echo -n "        Area : " >> results
	grep "^A" $(circuit)rg0scg.ap >> results
	$(TIMING) $(circuit)rg0scg toto | grep path | grep -v Min >> results
	echo "Vertical encoding and standard cell mapping with area optimisation :" >>results
	echo -n "        Area : " >> results
	grep "^A" $(circuit)sg0scg.ap >> results
	$(TIMING) $(circuit)sg0scg toto | grep path | grep -v Min >> results
	echo "Vertical encoding and standard cell mapping with delay optimisation :" >>results
	echo -n "        Area : " >> results
	grep "^A" $(circuit)sg3scg.ap >> results
	$(TIMING) $(circuit)sg3scg toto | grep path | grep -v Min >> results
	echo "Vertical encoding and C4 mapping with area optimisation :" >>results
	echo -n "        Area : " >> results
	grep "^A" $(circuit)sg0c4g.ap >> results
	$(TIMING) $(circuit)sg0c4g toto | grep path | grep -v Min >> results
	echo "Vertical encoding and C4 mapping with delay optimisation :" >>results
	echo -n "        Area : " >> results
	grep "^A" $(circuit)sg3c4g.ap >> results
	$(TIMING) $(circuit)sg3c4g toto | grep path | grep -v Min >> results
	cat results

################################################################################
#	Netlist Extraction by LYNX
################################################################################
$(circuit)sg0sct.al : $(circuit)sg0scg.ap
	$(LYNX) $(circuit)sg0scg $(circuit)sg0sct
$(circuit)rg0sct.al : $(circuit)rg0scg.ap
	$(LYNX) $(circuit)rg0scg $(circuit)rg0sct
$(circuit)sg3sct.al : $(circuit)sg3scg.ap
	$(LYNX) $(circuit)sg3scg $(circuit)sg3sct
$(circuit)sg0c4t.al : $(circuit)sg0c4g.ap
	$(LYNX) $(circuit)sg0c4g $(circuit)sg0c4t
$(circuit)sg3c4t.al : $(circuit)sg3c4g.ap
	$(LYNX) $(circuit)sg3c4g $(circuit)sg3c4t

################################################################################
#	Functional Abstraction by DESB
################################################################################
$(circuit)sg0sct.vbe : $(circuit)sg0sct.al
	$(DESB) $(circuit)sg0sct
	sed -e "s/_dff_s//g" $(circuit)sg0sct.vbe > toto
	mv toto $(circuit)sg0sct.vbe
$(circuit)rg0sct.vbe : $(circuit)rg0sct.al
	$(DESB) $(circuit)rg0sct
	sed -e "s/_dff_s//g" $(circuit)rg0sct.vbe > toto
	mv toto $(circuit)rg0sct.vbe
$(circuit)sg3sct.vbe : $(circuit)sg3sct.al
	$(DESB) $(circuit)sg3sct
	sed -e "s/_dff_s//g" $(circuit)sg3sct.vbe > toto
	mv toto $(circuit)sg3sct.vbe
$(circuit)sg0c4t.vbe : $(circuit)sg0c4t.al
	$(DESB) $(circuit)sg0c4t
	sed -e "s/_dff_ss//g" $(circuit)sg0c4t.vbe > toto
	mv toto $(circuit)sg0c4t.vbe
$(circuit)sg3c4t.vbe : $(circuit)sg3c4t.al
	$(DESB) $(circuit)sg3c4t
	sed -e "s/_dff_ss//g" $(circuit)sg3c4t.vbe > toto
	mv toto $(circuit)sg3c4t.vbe

################################################################################
#	Formal Proof by PROOF
################################################################################
proof :
	$(PROOF) $(circuit)sg0sct $(circuit)s
	$(PROOF) $(circuit)rg0sct $(circuit)r
	$(PROOF) $(circuit)sg3sct $(circuit)s
	$(PROOF) $(circuit)sg0c4t $(circuit)s
	$(PROOF) $(circuit)sg3c4t $(circuit)s
