# SPIM S20 MIPS Simulator.
# Imakefile for SPIM.
# Copyright (C) 1992 by James Larus (larus@cs.wisc.edu).
# ALL RIGHTS RESERVED.
#
# SPIM is distributed under the following conditions:
#
#   You may make copies of SPIM for your own use and modify those copies.
#
#   All copies of SPIM must retain my name and copyright notice.
#
#   You may not sell SPIM or distributed SPIM in conjunction with a commerical
#   product or service without the expressed written consent of James Larus.
#
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE.
#
# $Header: /home/primost/larus/Software/SPIM/RCS/Imakefile,v 1.15 1993/08/30 15:20:56 larus Exp larus $


#
# To make spim, type:
#
#   make spim
#
# To make xpsim, type:
#
#   make xspim
#

#
# To verify spim works, type:
#
#   make test
#

#
# To make cl-spim (cycle level SPIM simulator), type:
#
#   make cl-spim
#
# To make cl-xpsim, type:
#
#   make cl-xspim
#


#
# The following parameters must be set for the target machine on which SPIM
# or XSPIM is compiled:
#
# Note: SPIM does not fully work when compiled by a compiler that does not
# distinguish floats from doubles (e.g., pcc and pcc-compatible compilers
# on the VAX).
#

# Full path for directory that will hold the trap handler file:
TRAP_DIR = /usr/public/CE202/spim

# Full path for the directory that will hold the executable files:
BIN_DIR = /usr/public/CE202/spim/bin

# Full path for the directory that will hold the man files:
MAN_DIR = /usr/public/CE202/spim/man

# If you have flex, use it instead of lex.  If you use flex, define this
# variable and set LEXFLAGS.
MYLEX = flex

# SPIM needs flex's -I flag since the scanner is used interactively.
# You can set the -8 flag so that funny characters do not hang the scanner.
LEXFLAGS = -I -8

# If you use lex, set the variables this way:
#MYLEX = lex
#LEXFLAGS =


# Size of the segments when spim starts up (data segment must be >= 64K).
# (These sizes are fine for most users since SPIM dynamically expands
# the memory as necessary.)
MEM_SIZES = -DTEXT_SIZE=65536 -DDATA_SIZE=131072 -DK_TEXT_SIZE=65536


#
# END OF PARAMETERS
#


BASE_OBJS = spim-utils.o run.o mem.o inst.o data.o sym-tbl.o y.tab.o lex.yy.o \
       read-aout.o mips-syscall.o

OBJS = spim.o $(BASE_OBJS)

BASE_XOBJS = xspim.o windows.o buttons.o

XOBJS = $(BASE_OBJS) $(BASE_XOBJS)

BASE_CLOBJS = cl-cache.o cl-except.o cl-tlb.o cl-cycle.o

CLOBJS = spim.o $(BASE_OBJS) $(BASE_CLOBJS)

XCLOBJS = $(BASE_OBJS) $(BASE_CLOBJS) $(BASE_XOBJS)

TRAP_PATH = \"$(TRAP_DIR)/trap.handler\"

ENDIAN=`cat configuration`

# lex.yy.c is usually compiled with -O to speed it up.
LEXCFLAGS = -O
YFLAGS = -d

DEPLIBS = XawClientDepLibs
LOCALLIBS = XawClientLibs
EXTRA_LIBRARIES = -lm
CDEBUGFLAGS = -g
DEFINES = $(ENDIAN) $(MEM_SIZES) $(CL_FLAG)

#

#
#  Program dependencies:
#

AllTarget(spim)

spim:	force
	@if [ -f .cl-spim-made ]; then make clean; else true; fi
	@touch .spim-made
	@make spim_sub
	mv spim_sub spim

xspim:	force
	@if [ -f .cl-spim-made ]; then make clean; else true; fi
	@touch .spim-made
	@make xspim_sub
	mv xspim_sub xspim

cl-spim: force
	@if [ -f .spim-made ]; then make clean; else true; fi
	@touch .cl-spim-made
	@make cl-spim_sub CL_FLAG=-DCL_SPIM
	mv cl-spim_sub cl-spim

cl-xspim: force
	@if [ -f .spim-made ]; then make clean; else true; fi
	@touch .cl-spim-made
	@make cl-xspim_sub CL_FLAG=-DCL_SPIM
	mv cl-xspim_sub cl-xspim

force:  configuration

configuration:
	Configure

NormalProgramTarget(spim_sub,$(OBJS),,,)
NormalProgramTarget(xspim_sub,$(XOBJS),$(DEPLIBS),$(LOCALLIBS),$(SYSLIBS))
NormalProgramTarget(cl-spim_sub,$(CLOBJS),,,)
NormalProgramTarget(cl-xspim_sub,$(XCLOBJS),$(DEPLIBS),$(LOCALLIBS),$(SYSLIBS))

InstallProgram(spim,$(BIN_DIR))
InstallProgram(xspim,$(BIN_DIR))
InstallManPage(spim,$(MAN_DIR))
InstallManPage(xspim,$(MAN_DIR))
InstallNonExec(trap.handler,$(TRAP_DIR))


spim-utils.o: spim-utils.c spim.h inst.h mem.h reg.h y.tab.h VERSION
	$(CC) $(IFLAGS) $(CFLAGS) -DDEFAULT_TRAP_HANDLER=$(TRAP_PATH) -DSPIM_VERSION="\"`cat VERSION`\"" -c spim-utils.c


y.tab.h: y.tab.c

y.tab.c: parser.y
	$(YACC) $(YFLAGS) parser.y

y.tab.o: y.tab.c
	$(CC) $(IFLAGS) $(CFLAGS) $(YCFLAGS) -c y.tab.c


lex.yy.c: scanner.l
	$(MYLEX) $(LEXFLAGS) scanner.l

lex.yy.o: lex.yy.c
	$(CC) $(IFLAGS) $(LEXCFLAGS) -c lex.yy.c

#

#
# Test spim with a torture test:
#

test:	spim
	/bin/rm -f Tests/tt.out
	@echo
	csh -c "./spim -bare -notrap -file Tests/tt.bare.s >& Tests/tt.out"
	@echo The next command should not produce any output:
	diff Tests/tt.out Tests/tt.bare.OK
	/bin/rm -f Tests/tt.out

	@echo
	@if [ ! -f $(TRAP_DIR)/trap.handler ]; then echo "Trap Handler not installed; do make install"; exit 1; else true; fi
	csh -c "./spim -file Tests/tt.s < Tests/tt.in >& Tests/tt.out"
	@echo The next command should not produce any output:
	diff Tests/tt.out Tests/tt.OK
	@echo
	/bin/rm -f Tests/tt.out


# This test currently only works for little-endian machines.  The file
# tt.alu.bare.s needs to be converted in places for big-endian machines.

test_bare:
	csh -c "./spim -bare -notrap -file Tests/tt.alu.bare.s >& Tests/tt.out"
	@echo The next command should not produce any output:
	diff Tests/tt.out Tests/tt.alu.bare.OK
	/bin/rm -f Tests/tt.out

	@echo
	csh -c "./spim -bare -notrap -file Tests/tt.fpu.bare.s >& Tests/tt.out"
	@echo The next command should not produce any output:
	diff Tests/tt.out Tests/tt.fpu.bare.OK
	/bin/rm -f Tests/tt.out

#

TAGS:	*.c *.h *.l *.y
	etags *.l *.y *.c *.h


clean::
	rm -f spim xspim cl-spim cl-xspim *.o y.output core a.out TAGS \
	  .spim-made .cl-spim-made spim.tar.*


very-clean: clean
	rm -f y.tab.h y.tab.c lex.yy.c spim.tar* spim.shar* \
	Documentation/spim.ps, Documentation/spim.aux Documentation/spim.log \
	Documentation/spim.dvi Tests/tt.s Tests/tt.OK configuration

#

TAR_FILES = Configure BLURB README Imakefile Makefile.std *.c *.h *.y *.l \
	    trap.handler Tests/tt.* VERSION Documentation spim.man xspim.man


Documentation/spim.ps: Documentation/spim.tex
	cd Documentation; latex spim.tex; latex spim.tex; dvips -D 300 spim.dvi; \
	rm -f spim.aux spim.log spim.dvi


tar:	Documentation/spim.ps
	mkdir Hide
	mv Tests/tt.s Tests/tt.OK configuration Hide
	tar cvf spim.tar $(TAR_FILES)
	mv Hide/tt.* Tests
	mv Hide/configuration .
	rm -fr Hide

tar.Z:	tar
	compress spim.tar


shar:
	mv -f y.tab.c y.tab.c.xx
	mv -f lex.yy.c lex.yy.c.xx
	rm -f spim.shar spim.shar0?
	makekit -n spim.shar $(FILES)
	mv -f y.tab.c.xx y.tab.c
	mv -f lex.yy.c.xx lex.yy.c

depend:
	mv y.tab.c y.tab.c.bak
	mv lex.yy.c lex.yy.c.bak
	makedepend -w10 *.c *.y *.l
	mv y.tab.c.bak y.tab.c
	mv lex.yy.c.bak lex.yy.c

#
# DO NOT DELETE THIS LINE -- make depend depends on it.

buttons.o: spim.h
buttons.o: spim-utils.h
buttons.o: xspim.h
buttons.o: inst.h
buttons.o: mem.h
buttons.o: reg.h
buttons.o: scanner.h
buttons.o: sym-tbl.h
buttons.o: buttons.h
cl-cache.o: spim.h
cl-cache.o: inst.h
cl-cache.o: mem.h
cl-cache.o: mips-syscall.h
cl-cache.o: cl-cache.h
cl-cache.o: cl-mem.h
cl-cache.o: cl-tlb.h
cl-cycle.o: spim.h
cl-cycle.o: inst.h
cl-cycle.o: reg.h
cl-cycle.o: mem.h
cl-cycle.o: read-aout.h
cl-cycle.o: spim-utils.h
cl-cycle.o: sym-tbl.h
cl-cycle.o: y.tab.h
cl-cycle.o: mips-syscall.h
cl-cycle.o: cl-mem.h
cl-cycle.o: cl-cache.h
cl-cycle.o: cl-cycle.h
cl-cycle.o: cl-tlb.h
cl-cycle.o: cl-except.h
cl-except.o: spim.h
cl-except.o: inst.h
cl-except.o: reg.h
cl-except.o: mem.h
cl-except.o: spim-utils.h
cl-except.o: y.tab.h
cl-except.o: mips-syscall.h
cl-except.o: cl-mem.h
cl-except.o: cl-cycle.h
cl-except.o: cl-cache.h
cl-except.o: cl-except.h
cl-except.o: cl-tlb.h
cl-tlb.o: spim.h
cl-tlb.o: inst.h
cl-tlb.o: reg.h
cl-tlb.o: mem.h
cl-tlb.o: mips-syscall.h
cl-tlb.o: cl-mem.h
cl-tlb.o: cl-tlb.h
data.o: spim.h
data.o: spim-utils.h
data.o: inst.h
data.o: mem.h
data.o: reg.h
data.o: sym-tbl.h
data.o: parser.h
data.o: run.h
data.o: read-aout.h
data.o: data.h
inst.o: spim.h
inst.o: spim-utils.h
inst.o: inst.h
inst.o: mem.h
inst.o: reg.h
inst.o: sym-tbl.h
inst.o: y.tab.h
inst.o: parser.h
inst.o: scanner.h
inst.o: data.h
inst.o: op.h
mem.o: spim.h
mem.o: spim-utils.h
mem.o: inst.h
mem.o: mem.h
mem.o: reg.h
mips-syscall.o: spim.h
mips-syscall.o: inst.h
mips-syscall.o: mem.h
mips-syscall.o: reg.h
mips-syscall.o: read-aout.h
mips-syscall.o: sym-tbl.h
mips-syscall.o: spim-syscall.h
mips-syscall.o: mips-syscall.h
read-aout.o: spim.h
read-aout.o: spim-utils.h
read-aout.o: inst.h
read-aout.o: mem.h
read-aout.o: data.h
read-aout.o: parser.h
read-aout.o: read-aout.h
read-aout.o: sym-tbl.h
run.o: spim.h
run.o: spim-utils.h
run.o: inst.h
run.o: mem.h
run.o: reg.h
run.o: sym-tbl.h
run.o: y.tab.h
run.o: read-aout.h
run.o: mips-syscall.h
run.o: run.h
spim-utils.o: spim.h
spim-utils.o: spim-utils.h
spim-utils.o: inst.h
spim-utils.o: data.h
spim-utils.o: mem.h
spim-utils.o: reg.h
spim-utils.o: scanner.h
spim-utils.o: parser.h
spim-utils.o: y.tab.h
spim-utils.o: run.h
spim-utils.o: sym-tbl.h
spim.o: spim.h
spim.o: spim-utils.h
spim.o: inst.h
spim.o: mem.h
spim.o: reg.h
spim.o: parser.h
spim.o: read-aout.h
spim.o: sym-tbl.h
spim.o: scanner.h
spim.o: y.tab.h
sym-tbl.o: spim.h
sym-tbl.o: spim-utils.h
sym-tbl.o: inst.h
sym-tbl.o: mem.h
sym-tbl.o: data.h
sym-tbl.o: parser.h
sym-tbl.o: sym-tbl.h
windows.o: spim.h
windows.o: spim-utils.h
windows.o: buttons.h
windows.o: xspim.h
windows.o: windows.h
xspim.o: spim.h
xspim.o: spim-utils.h
xspim.o: inst.h
xspim.o: mem.h
xspim.o: reg.h
xspim.o: y.tab.h
xspim.o: buttons.h
xspim.o: windows.h
xspim.o: read-aout.h
xspim.o: xspim.h
parser.o: spim.h
parser.o: spim-utils.h
parser.o: inst.h
parser.o: mem.h
parser.o: reg.h
parser.o: sym-tbl.h
parser.o: data.h
parser.o: scanner.h
parser.o: parser.h
scanner.o: spim.h
scanner.o: spim-utils.h
scanner.o: inst.h
scanner.o: sym-tbl.h
scanner.o: y.tab.h
scanner.o: parser.h
scanner.o: scanner.h
scanner.o: op.h
