From 400eea877fad13741f408c6c23f254a51d3f1837 Mon Sep 17 00:00:00 2001 From: Neil Smith Date: Mon, 26 Jun 2017 22:28:20 +0100 Subject: [PATCH] Finalised day 7 --- 07-interpreter/07-program.txt | 48 ++++++ 07-interpreter/instructions.html | 46 ++++++ 07-interpreter/instructions.md | 11 ++ 07-interpreter/machine-code.ipynb | 233 ++++++++++++++++++++++-------- 4 files changed, 281 insertions(+), 57 deletions(-) create mode 100644 07-interpreter/07-program.txt create mode 100644 07-interpreter/instructions.html create mode 100644 07-interpreter/instructions.md diff --git a/07-interpreter/07-program.txt b/07-interpreter/07-program.txt new file mode 100644 index 0000000..f12d425 --- /dev/null +++ b/07-interpreter/07-program.txt @@ -0,0 +1,48 @@ +sto a 1 +set b 0 +dec a +jpz a 42 +inc a +cpy a c +set b 0 +dec c +jpz b 3 +dec b +jmp 2 +inc b +jpz c 2 +jmp -6 +jpz b 11 +cpy a b +jpz b 6 +dec b +inc c +inc c +inc c +jmp -5 +inc c +cpy c a +jmp 12 +set c 0 +set b 0 +dec a +jpz b 4 +dec b +inc c +jmp 2 +inc b +jpz a 2 +jmp -7 +cpy c a +cpy a b +ld c 1 +jpz c 5 +jpz b 5 +dec b +dec c +jmp -4 +sto a 1 +jmp -42 +ld a 1 +set c 0 +sto c 1 \ No newline at end of file diff --git a/07-interpreter/instructions.html b/07-interpreter/instructions.html new file mode 100644 index 0000000..5abe593 --- /dev/null +++ b/07-interpreter/instructions.html @@ -0,0 +1,46 @@ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InstructionDescription
inc rincrement contents of register r
dec rdecrement contents of register r
set r iset contents of register r to literal value i
cpy r sset contents of register r into register s
sto r mstore contents of register r into memory location m
ld r mload contents of memory location m into register r
jmp ijump to instruction i places forward
jpz r ijump to instruction i places forward if
register r contains zero, otherwise continue to next instruction
diff --git a/07-interpreter/instructions.md b/07-interpreter/instructions.md new file mode 100644 index 0000000..a2464ca --- /dev/null +++ b/07-interpreter/instructions.md @@ -0,0 +1,11 @@ +| Instruction | Description | +|:------------|:------------| +| `inc r` | increment contents of register `r` | +| `dec r` | decrement contents of register `r` | +| `set r i` | set contents of register `r` to literal value `i` | +| `cpy r s` | set contents of register `r` into register `s` | +| `sto r m` | store contents of register `r` into memory location `m` | +| `ld r m` | load contents of memory location `m` into register `r` | +| `jmp i` | jump to instruction `i` places forward | +| `jpz r i` | jump to instruction `i` places forward if
register `r` contains zero, otherwise continue to next instruction | + diff --git a/07-interpreter/machine-code.ipynb b/07-interpreter/machine-code.ipynb index 48da543..ceee75c 100644 --- a/07-interpreter/machine-code.ipynb +++ b/07-interpreter/machine-code.ipynb @@ -241,7 +241,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 15, "metadata": { "collapsed": true }, @@ -257,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 16, "metadata": { "collapsed": true }, @@ -310,7 +310,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -416,17 +416,17 @@ { "data": { "text/plain": [ - "{'instructions': [(, ['a', 10]),\n", + "{1: 10,\n", + " 'a': 0,\n", + " 'c': 20,\n", + " 'pc': 6,\n", + " 'b': 10,\n", + " 'instructions': [(, ['a', 10]),\n", " (, ['a']),\n", " (, ['b']),\n", " (, ['b', 1]),\n", " (, ['a', 2]),\n", - " (, [-4])],\n", - " 1: 10,\n", - " 'c': 20,\n", - " 'a': 0,\n", - " 'pc': 6,\n", - " 'b': 10}" + " (, [-4])]}" ] }, "execution_count": 22, @@ -457,17 +457,17 @@ { "data": { "text/plain": [ - "{'instructions': [(, ['a', 10]),\n", + "{1: 10,\n", + " 'a': 0,\n", + " 'c': 20,\n", + " 'pc': 6,\n", + " 'b': 10,\n", + " 'instructions': [(, ['a', 10]),\n", " (, ['a']),\n", " (, ['b']),\n", " (, ['b', 1]),\n", " (, ['a', 2]),\n", - " (, [-4])],\n", - " 1: 10,\n", - " 'c': 20,\n", - " 'a': 0,\n", - " 'pc': 6,\n", - " 'b': 10}" + " (, [-4])]}" ] }, "execution_count": 23, @@ -582,7 +582,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -591,7 +591,7 @@ "'1: 8, a: 0, b: 1, c: 8, pc: 11'" ] }, - "execution_count": 85, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -619,7 +619,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -628,7 +628,7 @@ "'a: 4, b: 0, c: 12, pc: 9'" ] }, - "execution_count": 43, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -658,47 +658,85 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'1: 0, a: 0, b: 0, c: 27, pc: 11'" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# c holds a!\n", + "# c holds a * b\n", "program = \"\"\"\n", - "??????????????\n", " set c 0\n", - " cpy a b\n", - " # start of main loop\n", - "loop: jpz b end\n", + " sto a 1\n", + "loop: jpz b end \n", " dec b\n", + " ld a 1\n", + "smul: jpz a emul\n", " inc c\n", - " inc c\n", - " inc c\n", - " jmp loop\n", + " dec a\n", + " jmp smul\n", + "emul: jmp loop \n", " \n", - " # end of program \n", - " \n", - "end: jmp 1\n", + "end: sto a 1\n", "\"\"\"\n", - "# m = new_machine()\n", - "# program_from_listing(program, m)\n", - "# run(m)\n", - "show_machine(execute(program, initial_state={'a': 4}))" + "m = new_machine()\n", + "program_from_listing(program, m)\n", + "run(m)\n", + "show_machine(execute(program, initial_state={'a': 9, 'b': 3}))" ] }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "set c 0\n", + "sto a 1\n", + "jpz b 8\n", + "dec b\n", + "ld a 1\n", + "jpz a 4\n", + "inc c\n", + "dec a\n", + "jmp -3\n", + "jmp -7\n", + "sto a 1\n" + ] + } + ], + "source": [ + "labelled_instructions = [i.strip() for i in program.split('\\n') \n", + " if i.strip() \n", + " if not i.strip().startswith('#')]\n", + "instructions = replace_labels(labelled_instructions)\n", + "print('\\n'.join(instructions))" + ] + }, + { + "cell_type": "code", + "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'1: 52, a: 0, b: 0, c: 0, pc: 46'" + "'1: 0, a: 52, b: 0, c: 0, pc: 48'" ] }, - "execution_count": 82, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -768,7 +806,9 @@ " \n", " # end of program \n", " \n", - "end: set c 0\n", + "end: ld a 1\n", + " set c 0\n", + " sto c 1\n", "\"\"\"\n", "# m = new_machine()\n", "# program_from_listing(program, m)\n", @@ -778,7 +818,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -787,7 +827,7 @@ "40" ] }, - "execution_count": 56, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -798,7 +838,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 31, "metadata": { "collapsed": true }, @@ -819,7 +859,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -828,7 +868,7 @@ "52" ] }, - "execution_count": 64, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -839,7 +879,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -848,7 +888,7 @@ "(250504, 937)" ] }, - "execution_count": 80, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -859,7 +899,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -868,7 +908,7 @@ "[]" ] }, - "execution_count": 73, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -885,16 +925,16 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'1: 250504, a: 0, b: 0, c: 0, pc: 46'" + "'1: 0, a: 250504, b: 0, c: 0, pc: 48'" ] }, - "execution_count": 83, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } @@ -903,6 +943,85 @@ "show_machine(execute(program, initial_state={'a': 937}))" ] }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sto a 1\n", + "set b 0\n", + "dec a\n", + "jpz a 42\n", + "inc a\n", + "cpy a c\n", + "set b 0\n", + "dec c\n", + "jpz b 3\n", + "dec b\n", + "jmp 2\n", + "inc b\n", + "jpz c 2\n", + "jmp -6\n", + "jpz b 11\n", + "cpy a b\n", + "jpz b 6\n", + "dec b\n", + "inc c\n", + "inc c\n", + "inc c\n", + "jmp -5\n", + "inc c\n", + "cpy c a\n", + "jmp 12\n", + "set c 0\n", + "set b 0\n", + "dec a\n", + "jpz b 4\n", + "dec b\n", + "inc c\n", + "jmp 2\n", + "inc b\n", + "jpz a 2\n", + "jmp -7\n", + "cpy c a\n", + "cpy a b\n", + "ld c 1\n", + "jpz c 5\n", + "jpz b 5\n", + "dec b\n", + "dec c\n", + "jmp -4\n", + "sto a 1\n", + "jmp -42\n", + "ld a 1\n", + "set c 0\n", + "sto c 1\n" + ] + }, + { + "data": { + "text/plain": [ + "342" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "labelled_instructions = [i.strip() for i in program.split('\\n') \n", + " if i.strip() \n", + " if not i.strip().startswith('#')]\n", + "instructions = replace_labels(labelled_instructions)\n", + "print('\\n'.join(instructions))\n", + "open('07-program.txt', 'w').write('\\n'.join(instructions))" + ] + }, { "cell_type": "code", "execution_count": null, -- 2.34.1