Mercurial > hg > ede
comparison utils/gen_language.ipynb @ 14:2b8eb2c86602
Major update to assembler design, now handles labels proper.
Next step unit test
Added boot procedure and experimental function look up table to emulator
Started implementing operations
tested SET and CLR operations with success
author | james <jb302@eecs.qmul.ac.uk> |
---|---|
date | Wed, 29 Jan 2014 20:11:07 +0000 |
parents | 82e82dda442b |
children | 256d24488e3f |
comparison
equal
deleted
inserted
replaced
13:7a988d894f74 | 14:2b8eb2c86602 |
---|---|
13 "input": [ | 13 "input": [ |
14 "from pprint import pprint\n", | 14 "from pprint import pprint\n", |
15 "import sys\n", | 15 "import sys\n", |
16 "sys.path.append('../assembler')\n", | 16 "sys.path.append('../assembler')\n", |
17 "from assembler import *\n", | 17 "from assembler import *\n", |
18 "f = open('instruction_set.txt', 'r')\n", | 18 "f = open('iset.csv', 'r')\n", |
19 "lang = first_pass(f)\n", | 19 "\n", |
20 "\n", | |
21 "r = open('instruction_table.txt', 'r')\n", | |
22 "r = filter(lambda l: l != '\\n', r.readlines())\n", | |
23 "codes = []\n", | 20 "codes = []\n", |
24 "for line in r:\n", | 21 "lang = []\n", |
25 " codes.append(line.split()[0])\n", | 22 "for line in f:\n", |
26 " " | 23 " line = line.split(';')\n", |
24 " codes.append(int(line[0]))\n", | |
25 " statement = line[1].strip().lower().split()\n", | |
26 " mnemonic = statement[0]\n", | |
27 " arguments = ''.join(statement[1:]).split(',')\n", | |
28 " lang.append([mnemonic, arguments])\n", | |
29 " \n", | |
30 "#pprint(lang) \n" | |
27 ], | 31 ], |
28 "language": "python", | 32 "language": "python", |
29 "metadata": {}, | 33 "metadata": {}, |
30 "outputs": [], | 34 "outputs": [], |
31 "prompt_number": 2 | 35 "prompt_number": 1 |
32 }, | 36 }, |
33 { | 37 { |
34 "cell_type": "code", | 38 "cell_type": "code", |
35 "collapsed": false, | 39 "collapsed": false, |
36 "input": [ | 40 "input": [ |
41 "consts = { 'addr11':1, 'addr16':2, '@addr16':2, 'vect8':1, '#data8':1, 'port_addr':1, 'rel8':1, '#data16':2}\n", | |
42 "labelable = ('addr11', 'addr16', 'rel8')\n", | |
43 "\n", | |
37 "mne_syms = []\n", | 44 "mne_syms = []\n", |
38 "arg_syms = []\n", | 45 "arg_syms = []\n", |
39 "for line in lang:\n", | 46 "for line in lang:\n", |
40 " mne_syms.append(line[0])\n", | 47 " mne_syms.append(line[0])\n", |
41 " arg_syms.extend(line[1])\n", | 48 " arg_syms.extend(line[1])\n", |
45 "iset = {}\n", | 52 "iset = {}\n", |
46 "for mne in mne_set:\n", | 53 "for mne in mne_set:\n", |
47 " i = 0\n", | 54 " i = 0\n", |
48 " valid_args = {}\n", | 55 " valid_args = {}\n", |
49 " for line in lang:\n", | 56 " for line in lang:\n", |
57 " args = []\n", | |
50 " if line[0] == mne:\n", | 58 " if line[0] == mne:\n", |
51 " valid_args.update({tuple(line[1]):int(codes[i])})\n", | 59 " width = 1\n", |
60 " for a in line[1]:\n", | |
61 " if a in consts:\n", | |
62 " width = width + consts[a]\n", | |
63 " valid_args.update({tuple(line[1]):[int(codes[i]), width]})\n", | |
64 " \n", | |
65 " for a in line[1]:\n", | |
66 " found_label = 0\n", | |
67 " if a in labelable:\n", | |
68 " found_label = 1\n", | |
69 " args.append('label')\n", | |
70 " else:\n", | |
71 " args.append(a)\n", | |
72 " if found_label:\n", | |
73 " valid_args.update({tuple(args):[int(codes[i]), width]})\n", | |
74 " \n", | |
52 " i = i + 1\n", | 75 " i = i + 1\n", |
53 " iset.update({mne:valid_args})\n", | 76 " iset.update({mne:valid_args})\n", |
54 "pprint(iset)\n" | 77 "#pprint(iset, indent=5)\n" |
55 ], | 78 ], |
79 "language": "python", | |
80 "metadata": {}, | |
81 "outputs": [], | |
82 "prompt_number": 2 | |
83 }, | |
84 { | |
85 "cell_type": "code", | |
86 "collapsed": false, | |
87 "input": [ | |
88 "# generate function lookup table\n", | |
89 "optable = []\n", | |
90 "for l in lang:\n", | |
91 " optable.append(l[0])\n", | |
92 "\n", | |
93 "for i in range(17):\n", | |
94 " print \"%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, \" % (optable[(i*15)], optable[(i*15)+1], optable[(i*15)+2], optable[(i*15)+3], optable[(i*15)+4], optable[(i*15)+5], optable[(i*15)+6], optable[(i*15)+7], optable[(i*15)+8], optable[(i*15)+9], optable[(i*15)+10], optable[(i*15)+11], optable[(i*15)+12], optable[(i*15)+13], optable[(i*15)+14])\n", | |
95 "\n" | |
96 ], | |
97 "language": "python", | |
98 "metadata": {}, | |
99 "outputs": [ | |
100 { | |
101 "output_type": "stream", | |
102 "stream": "stdout", | |
103 "text": [ | |
104 "nop, reserved, reserved, reserved, reserved\n", | |
105 "reserved, reserved, reserved, set, clr\n", | |
106 "set, clr, set, clr, cpl\n", | |
107 "cpl, xcsd, sfa, laf, mov\n", | |
108 "mov, mov, mov, mov, mov\n", | |
109 "mov, mov, mov, mov, mov\n", | |
110 "mov, mov, mov, mov, mov\n", | |
111 "mov, mov, mov, mov, mov\n", | |
112 "mov, mov, mov, mov, mov\n", | |
113 "mov, mov, mov, mov, mov\n", | |
114 "mov, mov, mov, mov, mov\n", | |
115 "mov, mov, mov, mov, mov\n", | |
116 "mov, mov, mov, mov, mov\n", | |
117 "mov, mov, mov, mov, mov\n", | |
118 "mov, mov, mov, mov, mov\n", | |
119 "mov, mov, mov, mov, mov\n", | |
120 "mov, mov, mov, mov, mov\n", | |
121 "mov, mov, mov, mov, mov\n", | |
122 "mov, mov, mov, mov, mov\n", | |
123 "mov, mov, mov, mov, mov\n", | |
124 "mov, mov, mov, mov, mov\n", | |
125 "mov, mov, mov, mov, mov\n", | |
126 "mov, mov, mov, mov, mov\n", | |
127 "mov, mov, mov, mov, mov\n", | |
128 "mov, mov, mov, mov, mov\n", | |
129 "mov, mov, mov, anl, anl\n", | |
130 "anl, anl, anl, anl, anl\n", | |
131 "anl, orl, orl, orl, orl\n", | |
132 "orl, orl, orl, orl, xrl\n", | |
133 "xrl, xrl, xrl, xrl, xrl\n", | |
134 "xrl, xrl, rl, rlc, rr\n", | |
135 "rrc, inc, dec, inc, dec\n", | |
136 "add, add, add, add, add\n", | |
137 "add, add, add, addc, addc\n", | |
138 "addc, addc, addc, addc, addc\n", | |
139 "addc, sub, sub, sub, sub\n", | |
140 "sub, sub, sub, sub, subb\n", | |
141 "subb, subb, subb, subb, subb\n", | |
142 "subb, subb, pjmp, pjmp, pjmp\n", | |
143 "pjmp, pjmp, pjmp, pjmp, pjmp\n", | |
144 "pcall, pcall, pcall, pcall, pcall\n", | |
145 "pcall, pcall, pcall, djnz, djnz\n", | |
146 "djnz, djnz, cjne, cjne, cjne\n", | |
147 "cjne, ljmp, lcall, ret, reti\n", | |
148 "sjmp, jmp, jmp, cjne, jz\n", | |
149 "jnz, jc, jnc, jpo, jpe\n", | |
150 "js, jns, push, push, push\n", | |
151 "push, push, push, push, push\n", | |
152 "pop, pop, pop, pop, pop\n", | |
153 "pop, pop, pop, mul, div\n", | |
154 "da, reserved, in, out, int\n" | |
155 ] | |
156 } | |
157 ], | |
158 "prompt_number": 3 | |
159 }, | |
160 { | |
161 "cell_type": "code", | |
162 "collapsed": false, | |
163 "input": [ | |
164 "# print function templates\n", | |
165 "#for mne in mne_set:\n", | |
166 "# print \"//implement me\\nvoid\\n%s(void) {\\n registers.PC = registers.PC + 1;\\n}\\n\" % mne.upper()\n", | |
167 "\n", | |
168 "# print function definitions\n", | |
169 "#for mne in mne_set:\n", | |
170 "# print \"void\\n%s(void);\\n\" % mne.upper()\n" | |
171 ], | |
172 "language": "python", | |
173 "metadata": {}, | |
174 "outputs": [], | |
175 "prompt_number": 2 | |
176 }, | |
177 { | |
178 "cell_type": "code", | |
179 "collapsed": false, | |
180 "input": [ | |
181 "float(255)/15\n" | |
182 ], | |
183 "language": "python", | |
184 "metadata": {}, | |
185 "outputs": [ | |
186 { | |
187 "output_type": "pyout", | |
188 "prompt_number": 13, | |
189 "text": [ | |
190 "17.0" | |
191 ] | |
192 } | |
193 ], | |
194 "prompt_number": 13 | |
195 }, | |
196 { | |
197 "cell_type": "code", | |
198 "collapsed": false, | |
199 "input": [], | |
56 "language": "python", | 200 "language": "python", |
57 "metadata": {}, | 201 "metadata": {}, |
58 "outputs": [] | 202 "outputs": [] |
59 } | 203 } |
60 ], | 204 ], |