Skip to content

Commit

Permalink
Merge branch 'master' into RISC-V-to-x86
Browse files Browse the repository at this point in the history
  • Loading branch information
ckirsch committed Apr 5, 2019
2 parents 9aa4c45 + f7e1141 commit 1c70459
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 48 deletions.
17 changes: 9 additions & 8 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ RUN mkdir -p $RISCV \
#######################################
# Spike (ISA simulator) builder image #
#######################################
FROM ubuntu:16.04 AS spikebuilder
FROM ubuntu:18.04 AS spikebuilder

# specify work directory and RISC-V install directory
ENV TOP=/opt RISCV=/opt/riscv PATH=$PATH:/opt/riscv/bin
Expand All @@ -60,17 +60,18 @@ RUN apt-get update \
&& rm -rf /var/lib/apt/lists/*

# get sources from HEAD
RUN git clone https://github.com/riscv/riscv-tools.git \
&& cd riscv-tools \
&& git submodule update --init --recursive riscv-fesvr riscv-isa-sim
RUN git clone https://github.com/riscv/riscv-isa-sim.git

# use multiple cores to speed up compilation
ENV MAKEFLAGS=-j4

# build spike ISA simulator
RUN mkdir -p $RISCV \
&& cd riscv-tools \
&& ./build-spike-only.sh
&& mkdir -p riscv-isa-sim/build \
&& cd riscv-isa-sim/build \
&& ../configure --prefix=$RISCV \
&& make \
&& make install

######################
# QEMU builder image #
Expand All @@ -94,7 +95,7 @@ RUN mkdir -p $RISCV/bin \
########################################
# Boolector (SMT solver) builder image #
########################################
FROM ubuntu:16.04 AS boolectorbuilder
FROM ubuntu:18.04 AS boolectorbuilder

# specify work directory and RISC-V install directory
ENV TOP=/opt RISCV=/opt/riscv PATH=$PATH:/opt/riscv/bin
Expand Down Expand Up @@ -131,7 +132,7 @@ RUN mkdir -p $RISCV \
##################################
# Selfie interactive final image #
##################################
FROM ubuntu:16.04
FROM ubuntu:18.04

# specify work directory and RISC-V install directory
ENV TOP=/opt RISCV=/opt/riscv PATH=$PATH:/opt/riscv/bin
Expand Down
54 changes: 26 additions & 28 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
# Compiler flags
CFLAGS := -Wall -Wextra -O3 -m64 -D'uint64_t=unsigned long long'

# Compile selfie.c into selfie executable
# Bootstrap selfie.c into selfie executable
selfie: selfie.c
$(CC) $(CFLAGS) $< -o $@

# Self-compile selfie.c into RISC-U selfie.m executable and RISC-U selfie.s assembly
selfie.m selfie.s: selfie
./selfie -c selfie.c -o selfie.m -s selfie.s

# Consider these targets as targets, not files
.PHONY : compile quine escape debug replay os vm min mob smt sat spike qemu boolector x86 all clean

# Self-compile
# Self-contained fixed-point of self-compilation
compile: selfie
./selfie -c selfie.c -o selfie1.m -s selfie1.s -m 2 -c selfie.c -o selfie2.m -s selfie2.s
diff -q selfie1.m selfie2.m
Expand All @@ -31,24 +35,20 @@ replay: selfie
./selfie -c manuscript/code/division-by-zero.c -r 1

# Run emulator on emulator
os: selfie
./selfie -c selfie.c -o selfie.m -m 2 -l selfie.m -m 1
os: selfie.m
./selfie -l selfie.m -m 2 -l selfie.m -m 1

# Self-compile on two virtual machines
vm: selfie
./selfie -c selfie.c -o selfie3.m -s selfie3.s -m 3 -l selfie3.m -y 3 -l selfie3.m -y 2 -c selfie.c -o selfie4.m -s selfie4.s
diff -q selfie3.m selfie4.m
diff -q selfie3.s selfie4.s
diff -q selfie1.m selfie3.m
diff -q selfie1.s selfie3.s
vm: selfie.m selfie.s
./selfie -l selfie.m -m 3 -l selfie.m -y 3 -l selfie.m -y 2 -c selfie.c -o selfie3.m -s selfie3.s
diff -q selfie.m selfie3.m
diff -q selfie.s selfie3.s

# Self-compile on two virtual machines on fully mapped virtual memory
min: selfie
./selfie -c selfie.c -o selfie5.m -s selfie5.s -min 15 -l selfie5.m -y 3 -l selfie5.m -y 2 -c selfie.c -o selfie6.m -s selfie6.s
diff -q selfie5.m selfie6.m
diff -q selfie5.s selfie6.s
diff -q selfie3.m selfie5.m
diff -q selfie3.s selfie5.s
min: selfie.m selfie.s
./selfie -l selfie.m -min 15 -l selfie.m -y 3 -l selfie.m -y 2 -c selfie.c -o selfie4.m -s selfie4.s
diff -q selfie.m selfie4.m
diff -q selfie.s selfie4.s

# Run mobster
mob: selfie
Expand All @@ -59,24 +59,22 @@ smt: selfie
./selfie -c manuscript/code/symbolic.c -n 0

# Run SAT solver
sat: selfie
sat: selfie.m
./selfie -sat manuscript/cnfs/rivest.cnf
./selfie -c selfie.c -m 1 -sat manuscript/cnfs/rivest.cnf
./selfie -l selfie.m -m 1 -sat manuscript/cnfs/rivest.cnf

# Run selfie on spike
spike: selfie
./selfie -c selfie.c -o selfie.m -s selfie.s
spike pk selfie.m -c selfie.c -o selfie7.m -s selfie7.s -m 1
diff -q selfie.m selfie7.m
diff -q selfie.s selfie7.s
spike: selfie.m selfie.s
spike pk selfie.m -c selfie.c -o selfie5.m -s selfie5.s -m 1
diff -q selfie.m selfie5.m
diff -q selfie.s selfie5.s

# Run selfie on qemu usermode emulation
qemu: selfie
./selfie -c selfie.c -o selfie.m -s selfie.s
qemu: selfie.m selfie.s
chmod +x selfie.m
qemu-riscv64-static selfie.m -c selfie.c -o selfie8.m -s selfie8.s -m 1
diff -q selfie.m selfie8.m
diff -q selfie.s selfie8.s
qemu-riscv64-static selfie.m -c selfie.c -o selfie6.m -s selfie6.s -m 1
diff -q selfie.m selfie6.m
diff -q selfie.s selfie6.s

# Test boolector SMT solver
boolector: smt
Expand Down
63 changes: 52 additions & 11 deletions grader/self.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,13 @@ def encode_amo_format(funct5, funct3):
LR_INSTRUCTION = encode_amo_format(F5_LR, F3_LR)
SC_INSTRUCTION = encode_amo_format(F5_SC, F3_SC)

class DummyWriter:
def __getattr__( self, name ):
return sys.__stdout__.__getattribute__(name)

def write(self, text):
return

def print_passed(msg):
print("\033[92m[PASSED]\033[0m " + msg)

Expand Down Expand Up @@ -506,7 +513,6 @@ def grade():
number_of_tests_passed = number_of_positive_tests_passed[stage] + number_of_negative_tests_passed[stage]

if number_of_tests == 0:
print('nothing to grade')
return

passed = number_of_tests_passed / number_of_tests
Expand Down Expand Up @@ -541,7 +547,36 @@ def grade():
grade = 5
color = 91

print('your grade is: \033[{}m\033[1m{}\033[0m'.format(color, grade))
print('your grade is: \033[{}m\033[1m'.format(color), end='')
print_loud('{}'.format(grade), end='')
print('\033[0m')


def enter_quiet_mode():
sys.stdout = DummyWriter()


def print_loud(msg, end='\n'):
quiet_writer = sys.stdout
sys.stdout = sys.__stdout__

print(msg, end)

sys.stdout = quiet_writer


def print_usage():
print('usage: python grader/self.py { option } { test }\n')

print('options:')

for option in defined_options:
print(' {} {}'.format(option[0], option[2]))

print('\ntests: ')

for test in defined_tests:
print(' {}'.format(test[0]))


defined_tests = [
Expand All @@ -559,14 +594,10 @@ def grade():
]


def print_usage():
print('usage: python grader/self.py { test_name }\n')

print('available tests: ')

for test in defined_tests:
print(' ', end='')
print(test[0])
defined_options = [
('-q', enter_quiet_mode, 'only the grade is printed'),
('-h', print_usage, 'this help text')
]


if __name__ == "__main__":
Expand All @@ -578,7 +609,17 @@ def print_usage():

home_path = os.path.dirname(sys.argv[0]) + '/../'

tests = sys.argv[1:]
options = list(filter(lambda x: x[0] == '-', sys.argv[1:]))

for option in options:
option_to_execute = list(filter(lambda x: x[0] == option, defined_options))

if len(option_to_execute) == 0:
print('unknown option: {}'.format(option))
else:
option_to_execute[0][1]()

tests = list(set(sys.argv[1:]) - set(options))

for test in tests:
set_up()
Expand Down
2 changes: 1 addition & 1 deletion grader/tools/grade-from-links.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
os.system("git fetch")
os.system("git checkout " + commit)
os.system("make")
os.system("python3 " + selfiedir + "/grader/self.py " + assignment)
os.system("python3 " + selfiedir + "/grader/self.py -q " + assignment)

os.chdir(os.path.pardir)
os.chdir(os.path.pardir)
Expand Down

0 comments on commit 1c70459

Please sign in to comment.