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