All Projects → wdhg → reggie

wdhg / reggie

Licence: BSD-3-Clause license
run and encode simple register machine programs

Programming Languages

haskell
3896 projects
Yacc
648 projects
Logos
282 projects
Makefile
30231 projects

Projects that are alternatives of or similar to reggie

Challenges
ICDSS Advanced Data Science Team Challenges 2020-2021
Stars: ✭ 14 (+0%)
Mutual labels:  imperial-college
lunatic
lunatic: a toy lua interpreter
Stars: ✭ 16 (+14.29%)
Mutual labels:  register-machine

reggie

Run and encode simple register machine programs. Inspired by the COMP50003 Models of Computation course at Imperial College London.

Install

To build reggie you need alex and happy. These can be installed by running:

stack install alex happy

Installation of reggie is done using stack. Clone this repository and run:

cd reggie
make install

Usage

To run a program:

reggie run my_program
reggie run my_program 10 12 # run with registers R0 = 10, R1 = 12

To run a program step-by-step:

reggie step my_program
reggie step my_program 10 12

To encode a program:

reggie encode my_program

To decode a program:

reggie decode 1356938545749799165120738728340994364585019113312996743434322372066314551816

To decode a program like 294 * 16395:

reggie decode2 94 16395

Example programs

examples/prog0 puts 3 and 4 into R0 and R1 respectively:

L0: R0+ -> L1
L1: R0+ -> L2
L2: R0+ -> L4

L4: R1+ -> L5
L5: R1+ -> L6
L6: R1+ -> L7
L7: R1+ -> L8
L8: HALT

This program encodes to 1356938545749799165120738728340994364585019113312996743434322372066314551816

examples/prog1 adds 3 and 4 and stores the result in R0:

L0: R1+ -> L1
L1: R1+ -> L2
L2: R1+ -> L3

L3: R2+ -> L4
L4: R2+ -> L5
L5: R2+ -> L6
L6: R2+ -> L7

L7: R1- -> L8, L9
L8: R0+ -> L7

L9: R2- -> L10, L11
L10: R0+ -> L9

L11: HALT

This program encodes to examples/prog1.encode, which is 477431 digits long!

examples/add takes two values from R1 and R2 and adds them to R0

# clear return register
L0: R0- -> L0, L1

# add R1 to R0
L1: R1- -> L2, L3
L2: R0+ -> L1

# add R2 to R0
L3: R2- -> L4, L5
L4: R0+ -> L3

# increment the output
L5: R0+ -> L6

L6: HALT
$ reggie run examples/add 0 75 25
>>> (L5, R0: 100, R1: 0, R2: 0)
$ reggie step examples/add 0 3 4
R0- -> L0, L1    ==> (L0, R0: 0, R1: 3, R2: 4)
R1- -> L2, L3    ==> (L1, R0: 0, R1: 3, R2: 4)
R0+ -> L1        ==> (L2, R0: 0, R1: 2, R2: 4)
R1- -> L2, L3    ==> (L1, R0: 1, R1: 2, R2: 4)
R0+ -> L1        ==> (L2, R0: 1, R1: 1, R2: 4)
R1- -> L2, L3    ==> (L1, R0: 2, R1: 1, R2: 4)
R0+ -> L1        ==> (L2, R0: 2, R1: 0, R2: 4)
R1- -> L2, L3    ==> (L1, R0: 3, R1: 0, R2: 4)
R2- -> L4, L5    ==> (L3, R0: 3, R1: 0, R2: 4)
R0+ -> L3        ==> (L4, R0: 3, R1: 0, R2: 3)
R2- -> L4, L5    ==> (L3, R0: 4, R1: 0, R2: 3)
R0+ -> L3        ==> (L4, R0: 4, R1: 0, R2: 2)
R2- -> L4, L5    ==> (L3, R0: 5, R1: 0, R2: 2)
R0+ -> L3        ==> (L4, R0: 5, R1: 0, R2: 1)
R2- -> L4, L5    ==> (L3, R0: 6, R1: 0, R2: 1)
R0+ -> L3        ==> (L4, R0: 6, R1: 0, R2: 0)
R2- -> L4, L5    ==> (L3, R0: 7, R1: 0, R2: 0)
HALT             ==> (L5, R0: 7, R1: 0, R2: 0)

To Do

  • Erroneous halting
  • Decoding programs
  • Add support for custom initial register states
  • More detailed parsing / lexical errors
  • Functions / modules (Gadgets)
  • Custom labels
  • Comments
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].