Commit 28382d82 authored by Pavel Pisa's avatar Pavel Pisa

seminaries/qtmips/apo-sort: provided template for your sort implementation.

The directory contain
  seminaries/qtmips/apo-sort/apo-sort-template.S
  seminaries/qtmips/apo-sort/d-cache-template.par
files. The whole directory or only above files should be copyed
in the directory work/apo-sort of your repository.
The template files  should be renamed to apo-sort.S and d-cache.par .
The file d-cache.par specifies D cache parameters in the form
<policy>,<#sets>,<#words in block>,<#ways>,<write method>
The example is
  lru,1,1,1,wb
The cache size is limited to 16 words maximum.
Signed-off-by: Pavel Pisa's avatarPavel Pisa <pisa@cmp.felk.cvut.cz>
parent 04f71ad1
*.o
depend
apo-sort
array_data.out
array_size.in
array_data.ref
ARCH=mips-elf
#ARCH=mips-linux-gnu
SOURCES = apo-sort.S
TARGET_EXE = apo-sort
CC=$(ARCH)-gcc
CXX=$(ARCH)-g++
AS=$(ARCH)-as
LD=$(ARCH)-ld
OBJCOPY=$(ARCH)-objcopy
ARCHFLAGS += -march=mips32
#ARCHFLAGS += -fno-lto
#ARCHFLAGS += -mno-shared
CFLAGS += -ggdb -Os -Wall
CXXFLAGS+= -ggdb -Os -Wall
AFLAGS += -ggdb
LDFLAGS += -ggdb
LDFLAGS += -nostartfiles
LDFLAGS += -static
#LDFLAGS += -specs=/opt/musl/mips-linux-gnu/lib/musl-gcc.specs
CFLAGS += $(ARCHFLAGS)
CXXFLAGS+= $(ARCHFLAGS)
AFLAGS += $(ARCHFLAGS)
LDFLAGS += $(ARCHFLAGS)
OBJECTS += $(filter %.o,$(SOURCES:%.S=%.o))
OBJECTS += $(filter %.o,$(SOURCES:%.c=%.o))
OBJECTS += $(filter %.o,$(SOURCES:%.cpp=%.o))
all : default
.PHONY : default clean dep all run_test
%.o:%.S
$(CC) -D__ASSEMBLY__ $(AFLAGS) -c $< -o $@
%.o:%.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
%.o:%.cpp
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
%.s:%.c
$(CC) $(CFLAGS) $(CPPFLAGS) -S $< -o $@
#default : $(TARGET_EXE)
default : run_test
$(TARGET_EXE) : $(OBJECTS)
$(CC) $(LDFLAGS) $^ -o $@
dep: depend
depend: $(SOURCES) $(glob *.h)
echo '# autogenerated dependencies' > depend
ifneq ($(filter %.S,$(SOURCES)),)
$(CC) -D__ASSEMBLY__ $(AFLAGS) -w -E -M $(filter %.S,$(SOURCES)) \
>> depend
endif
ifneq ($(filter %.c,$(SOURCES)),)
$(CC) $(CFLAGS) $(CPPFLAGS) -w -E -M $(filter %.c,$(SOURCES)) \
>> depend
endif
ifneq ($(filter %.cpp,$(SOURCES)),)
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -w -E -M $(filter %.cpp,$(SOURCES)) \
>> depend
endif
clean:
rm -f *.o *.a $(OBJECTS) $(TARGET_EXE) depend array_data.out array_data.ref array_size.in
#mips-elf-objdump --source -M no-aliases,reg-names=numeric qtmips_binrep
ARRAY_DATA_IN_FILE=array_data.in
ARRAY_SIZE:=$(words $(shell cat $(ARRAY_DATA_IN_FILE)))
ARRAY_BYTES:=$(words $(shell seq 1 $(ARRAY_SIZE)) $(shell seq 1 $(ARRAY_SIZE)) $(shell seq 1 $(ARRAY_SIZE)) $(shell seq 1 $(ARRAY_SIZE)))
D_CACHE_PAR:=$(shell sed -n -e 's/^[a-z]*,[0-9]*,[0-9]*,[0-9]*,[a-z]*/&/p' d-cache.par)
ifeq ($(D_CACHE_PAR),)
$(error cache parameters cannot be parsed $(D_CACHE_PAR))
endif
D_CACHE_SIZE_OK:=$(shell echo $(D_CACHE_PAR) | \
sed -n -e 's/^[a-z]*,\([0-9]*\),\([0-9]*\),\([0-9]*\),[a-z]*/\1*\2*\3<=16/p' | bc)
ifneq ($(D_CACHE_SIZE_OK),1)
$(error cache parameters probably request too many words $(D_CACHE_PAR))
endif
run_test: $(TARGET_EXE)
echo $(ARRAY_SIZE) >array_size.in
sort <array_data.in >array_data.ref
qtmips_cli --dump-cycles $< \
--dump-cache-stats \
--load-range array_size,array_size.in \
--load-range array_start,$(ARRAY_DATA_IN_FILE) \
--dump-range array_start,$(ARRAY_BYTES),array_data.out \
--d-cache "$(D_CACHE_PAR)" \
--read-time 10 \
--write-time 10 \
--burst-time 2
diff -u -B -b array_data.out array_data.ref
-include depend
// bubble-sort.S file template, rename and implement the algorithm
// Test algorithm in qtmips_gui program
// Select the CPU core configuration with delay-slot
// This setups requires (for simplicity) one NOP instruction after
// each branch and jump instruction (more during lecture about pipelining)
// The code will be compiled and tested by external mips-elf-gcc
// compiler by teachers, you can try make in addition, but testing
// by internal assembler should be enough
// copy directory with the project to your repository to
// the directory work/bubble-sort
// critical is location of the file work/bubble-sort/bubble-sort.S
// which is checked by the scripts
// Directives to make interesting windows visible
#pragma qtmips show registers
#pragma qtmips show memory
.set noreorder
.set noat
.globl array_size
.globl array_start
.text
.globl _start
.ent _start
_start:
la $a0, array_start
la $a1, array_size
lw $a1, 0($a1) // number of elements in the array
//Insert your code there
//Final infinite loop
end_loop:
cache 9, 0($0) // flush cache memory
break // stop the simulator
j end_loop
nop
.end _start
.data
// .align 2 // not supported by QtMips yet
array_size:
.word 15
array_start:
.word 5, 3, 4, 1, 15, 8, 9, 2, 10, 6, 11, 1, 6, 9, 12
// Specify location to show in memory window
#pragma qtmips focus memory array_size
0x00000022
0x00000055
0x00000060
0x12345678
0x12345676
0x00000012
0x00000008
0x000000ac
0x33333333
0x02000010
0x00008382
0x12375310
0x00012340
0x00020202
0x00028288
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment