jb302@1: { jb302@1: "metadata": { jb302@1: "name": "gen_language" jb302@1: }, jb302@1: "nbformat": 3, jb302@1: "nbformat_minor": 0, jb302@1: "worksheets": [ jb302@1: { jb302@1: "cells": [ jb302@1: { jb302@1: "cell_type": "code", jb302@1: "collapsed": false, jb302@1: "input": [ jb302@1: "from pprint import pprint\n", jb302@1: "import sys\n", jb302@1: "sys.path.append('../assembler')\n", jb302@1: "from assembler import *\n", jb302@14: "f = open('iset.csv', 'r')\n", jb302@1: "\n", jb302@1: "codes = []\n", jb302@14: "lang = []\n", jb302@14: "for line in f:\n", jb302@14: " line = line.split(';')\n", jb302@14: " codes.append(int(line[0]))\n", jb302@14: " statement = line[1].strip().lower().split()\n", jb302@14: " mnemonic = statement[0]\n", jb302@14: " arguments = ''.join(statement[1:]).split(',')\n", jb302@14: " lang.append([mnemonic, arguments])\n", jb302@14: " \n", jb302@14: "#pprint(lang) \n" jb302@1: ], jb302@1: "language": "python", jb302@1: "metadata": {}, jb302@1: "outputs": [], jb302@14: "prompt_number": 1 jb302@1: }, jb302@1: { jb302@1: "cell_type": "code", jb302@1: "collapsed": false, jb302@1: "input": [ jb302@14: "consts = { 'addr11':1, 'addr16':2, '@addr16':2, 'vect8':1, '#data8':1, 'port_addr':1, 'rel8':1, '#data16':2}\n", jb302@14: "labelable = ('addr11', 'addr16', 'rel8')\n", jb302@14: "\n", jb302@1: "mne_syms = []\n", jb302@1: "arg_syms = []\n", jb302@1: "for line in lang:\n", jb302@1: " mne_syms.append(line[0])\n", jb302@1: " arg_syms.extend(line[1])\n", jb302@1: "mne_set = set(mne_syms)\n", jb302@1: "arg_set = set(arg_syms)\n", jb302@1: "\n", jb302@1: "iset = {}\n", jb302@1: "for mne in mne_set:\n", jb302@1: " i = 0\n", jb302@1: " valid_args = {}\n", jb302@1: " for line in lang:\n", jb302@14: " args = []\n", jb302@1: " if line[0] == mne:\n", jb302@14: " width = 1\n", jb302@14: " for a in line[1]:\n", jb302@14: " if a in consts:\n", jb302@14: " width = width + consts[a]\n", jb302@14: " valid_args.update({tuple(line[1]):[int(codes[i]), width]})\n", jb302@14: " \n", jb302@14: " for a in line[1]:\n", jb302@14: " found_label = 0\n", jb302@14: " if a in labelable:\n", jb302@14: " found_label = 1\n", jb302@14: " args.append('label')\n", jb302@14: " else:\n", jb302@14: " args.append(a)\n", jb302@14: " if found_label:\n", jb302@14: " valid_args.update({tuple(args):[int(codes[i]), width]})\n", jb302@14: " \n", jb302@1: " i = i + 1\n", jb302@1: " iset.update({mne:valid_args})\n", jb302@14: "#pprint(iset, indent=5)\n" jb302@1: ], jb302@1: "language": "python", jb302@1: "metadata": {}, jb302@14: "outputs": [], jb302@14: "prompt_number": 2 jb302@14: }, jb302@14: { jb302@14: "cell_type": "code", jb302@14: "collapsed": false, jb302@14: "input": [ jb302@14: "# generate function lookup table\n", jb302@14: "optable = []\n", jb302@14: "for l in lang:\n", jb302@14: " optable.append(l[0])\n", jb302@14: "\n", jb302@14: "for i in range(17):\n", jb302@14: " 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", jb302@14: "\n" jb302@14: ], jb302@14: "language": "python", jb302@14: "metadata": {}, jb302@14: "outputs": [ jb302@14: { jb302@14: "output_type": "stream", jb302@14: "stream": "stdout", jb302@14: "text": [ jb302@14: "nop, reserved, reserved, reserved, reserved\n", jb302@14: "reserved, reserved, reserved, set, clr\n", jb302@14: "set, clr, set, clr, cpl\n", jb302@14: "cpl, xcsd, sfa, laf, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, mov, mov\n", jb302@14: "mov, mov, mov, anl, anl\n", jb302@14: "anl, anl, anl, anl, anl\n", jb302@14: "anl, orl, orl, orl, orl\n", jb302@14: "orl, orl, orl, orl, xrl\n", jb302@14: "xrl, xrl, xrl, xrl, xrl\n", jb302@14: "xrl, xrl, rl, rlc, rr\n", jb302@14: "rrc, inc, dec, inc, dec\n", jb302@14: "add, add, add, add, add\n", jb302@14: "add, add, add, addc, addc\n", jb302@14: "addc, addc, addc, addc, addc\n", jb302@14: "addc, sub, sub, sub, sub\n", jb302@14: "sub, sub, sub, sub, subb\n", jb302@14: "subb, subb, subb, subb, subb\n", jb302@14: "subb, subb, pjmp, pjmp, pjmp\n", jb302@14: "pjmp, pjmp, pjmp, pjmp, pjmp\n", jb302@14: "pcall, pcall, pcall, pcall, pcall\n", jb302@14: "pcall, pcall, pcall, djnz, djnz\n", jb302@14: "djnz, djnz, cjne, cjne, cjne\n", jb302@14: "cjne, ljmp, lcall, ret, reti\n", jb302@14: "sjmp, jmp, jmp, cjne, jz\n", jb302@14: "jnz, jc, jnc, jpo, jpe\n", jb302@14: "js, jns, push, push, push\n", jb302@14: "push, push, push, push, push\n", jb302@14: "pop, pop, pop, pop, pop\n", jb302@14: "pop, pop, pop, mul, div\n", jb302@14: "da, reserved, in, out, int\n" jb302@14: ] jb302@14: } jb302@14: ], jb302@14: "prompt_number": 3 jb302@14: }, jb302@14: { jb302@14: "cell_type": "code", jb302@14: "collapsed": false, jb302@14: "input": [ jb302@14: "# print function templates\n", jb302@14: "#for mne in mne_set:\n", jb302@14: "# print \"//implement me\\nvoid\\n%s(void) {\\n registers.PC = registers.PC + 1;\\n}\\n\" % mne.upper()\n", jb302@14: "\n", jb302@14: "# print function definitions\n", jb302@14: "#for mne in mne_set:\n", jb302@14: "# print \"void\\n%s(void);\\n\" % mne.upper()\n" jb302@14: ], jb302@14: "language": "python", jb302@14: "metadata": {}, jb302@14: "outputs": [], jb302@14: "prompt_number": 2 jb302@14: }, jb302@14: { jb302@14: "cell_type": "code", jb302@14: "collapsed": false, jb302@14: "input": [ jb302@14: "float(255)/15\n" jb302@14: ], jb302@14: "language": "python", jb302@14: "metadata": {}, jb302@14: "outputs": [ jb302@14: { jb302@14: "output_type": "pyout", jb302@14: "prompt_number": 13, jb302@14: "text": [ jb302@14: "17.0" jb302@14: ] jb302@14: } jb302@14: ], jb302@14: "prompt_number": 13 jb302@14: }, jb302@14: { jb302@14: "cell_type": "code", jb302@14: "collapsed": false, jb302@14: "input": [], jb302@14: "language": "python", jb302@14: "metadata": {}, jb302@1: "outputs": [] jb302@1: } jb302@1: ], jb302@1: "metadata": {} jb302@1: } jb302@1: ] jb302@1: }