view utils/gen_language.ipynb @ 20:ddeae9d3fff4

clean up
author james <jb302@eecs.qmul.ac.uk>
date Sun, 23 Feb 2014 14:52:31 +0000
parents 256d24488e3f
children
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": []
    },
    {
     "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",
      "            found_label = 0\n",
      "            for a in line[1]:\n",
      "                if a in labelable:\n",
      "                    found_label = 1\n",
      "                    args.append('label')\n",
      "                elif a == '@addr16':\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": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "{    'add': {    ('a', '#data8'): [166, 2],\n",
        "                 ('a', '@dptr'): [167, 1],\n",
        "                 ('a', 'dph'): [164, 1],\n",
        "                 ('a', 'dpl'): [165, 1],\n",
        "                 ('a', 'r0'): [160, 1],\n",
        "                 ('a', 'r1'): [161, 1],\n",
        "                 ('a', 'r2'): [162, 1],\n",
        "                 ('a', 'r3'): [163, 1]},\n",
        "     'addc': {    ('a', '#data8'): [174, 2],\n",
        "                  ('a', '@dptr'): [175, 1],\n",
        "                  ('a', 'dph'): [172, 1],\n",
        "                  ('a', 'dpl'): [173, 1],\n",
        "                  ('a', 'r0'): [168, 1],\n",
        "                  ('a', 'r1'): [169, 1],\n",
        "                  ('a', 'r2'): [170, 1],\n",
        "                  ('a', 'r3'): [171, 1]},\n",
        "     'anl': {    ('a', '#data8'): [134, 2],\n",
        "                 ('a', '@dptr'): [135, 1],\n",
        "                 ('a', 'dph'): [132, 1],\n",
        "                 ('a', 'dpl'): [133, 1],\n",
        "                 ('a', 'r0'): [128, 1],\n",
        "                 ('a', 'r1'): [129, 1],\n",
        "                 ('a', 'r2'): [130, 1],\n",
        "                 ('a', 'r3'): [131, 1]},\n",
        "     'cjne': {    ('a', '#data8', 'label'): [223, 3],\n",
        "                  ('a', '#data8', 'rel8'): [223, 3],\n",
        "                  ('r0', '#data', 'label'): [212, 2],\n",
        "                  ('r0', '#data', 'rel8'): [212, 2],\n",
        "                  ('r1', '#data', 'label'): [213, 2],\n",
        "                  ('r1', '#data', 'rel8'): [213, 2],\n",
        "                  ('r2', '#data', 'label'): [214, 2],\n",
        "                  ('r2', '#data', 'rel8'): [214, 2],\n",
        "                  ('r3', '#data', 'label'): [215, 2],\n",
        "                  ('r3', '#data', 'rel8'): [215, 2]},\n",
        "     'clr': {    ('bs',): [11, 1], ('c',): [9, 1], ('ie',): [13, 1]},\n",
        "     'cpl': {    ('a',): [15, 1], ('c',): [14, 1]},\n",
        "     'da': {    ('a',): [250, 1]},\n",
        "     'dec': {    ('a',): [159, 1], ('dptr',): [157, 1]},\n",
        "     'div': {    ('r0', 'r1'): [249, 1]},\n",
        "     'djnz': {    ('r0', 'label'): [208, 2],\n",
        "                  ('r0', 'rel8'): [208, 2],\n",
        "                  ('r1', 'label'): [209, 2],\n",
        "                  ('r1', 'rel8'): [209, 2],\n",
        "                  ('r2', 'label'): [210, 2],\n",
        "                  ('r2', 'rel8'): [210, 2],\n",
        "                  ('r3', 'label'): [211, 2],\n",
        "                  ('r3', 'rel8'): [211, 2]},\n",
        "     'hlt': {    ('',): [255, 1]},\n",
        "     'in': {    ('a', 'port_addr'): [252, 2]},\n",
        "     'inc': {    ('a',): [158, 1], ('dptr',): [156, 1]},\n",
        "     'int': {    ('vect8',): [254, 2]},\n",
        "     'jc': {    ('label',): [226, 2], ('rel8',): [226, 2]},\n",
        "     'jmp': {    ('@a+dptr',): [221, 1], ('@dptr',): [222, 1]},\n",
        "     'jnc': {    ('label',): [227, 2], ('rel8',): [227, 2]},\n",
        "     'jns': {    ('label',): [231, 2], ('rel8',): [231, 2]},\n",
        "     'jnz': {    ('label',): [225, 2], ('rel8',): [225, 2]},\n",
        "     'jpe': {    ('label',): [229, 2], ('rel8',): [229, 2]},\n",
        "     'jpo': {    ('label',): [228, 2], ('rel8',): [228, 2]},\n",
        "     'js': {    ('label',): [230, 2], ('rel8',): [230, 2]},\n",
        "     'jz': {    ('label',): [224, 2], ('rel8',): [224, 2]},\n",
        "     'laf': {    ('',): [18, 1]},\n",
        "     'lcall': {    ('addr16',): [217, 3], ('label',): [217, 3]},\n",
        "     'ljmp': {    ('addr16',): [216, 3], ('label',): [216, 3]},\n",
        "     'mov': {    ('@addr16', 'a'): [29, 3],\n",
        "                 ('@dptr', 'a'): [31, 1],\n",
        "                 ('@dptr', 'dph'): [36, 1],\n",
        "                 ('@dptr', 'dpl'): [37, 1],\n",
        "                 ('@dptr', 'r0'): [32, 1],\n",
        "                 ('@dptr', 'r1'): [33, 1],\n",
        "                 ('@dptr', 'r2'): [34, 1],\n",
        "                 ('@dptr', 'r3'): [35, 1],\n",
        "                 ('@dptr', 'sph'): [38, 1],\n",
        "                 ('@dptr', 'spl'): [39, 1],\n",
        "                 ('@label', 'a'): [29, 3],\n",
        "                 ('a', '#data8'): [21, 2],\n",
        "                 ('a', '@a+dptr'): [26, 1],\n",
        "                 ('a', '@a+pc'): [27, 1],\n",
        "                 ('a', '@addr16'): [28, 3],\n",
        "                 ('a', '@dptr'): [30, 1],\n",
        "                 ('a', '@label'): [28, 3],\n",
        "                 ('a', 'addr16'): [24, 3],\n",
        "                 ('a', 'dph'): [60, 1],\n",
        "                 ('a', 'dpl'): [61, 1],\n",
        "                 ('a', 'label'): [24, 3],\n",
        "                 ('a', 'r0'): [56, 1],\n",
        "                 ('a', 'r1'): [57, 1],\n",
        "                 ('a', 'r2'): [58, 1],\n",
        "                 ('a', 'r3'): [59, 1],\n",
        "                 ('a', 'sph'): [62, 1],\n",
        "                 ('a', 'spl'): [63, 1],\n",
        "                 ('addr16', 'a'): [25, 3],\n",
        "                 ('dph', '#data8'): [44, 2],\n",
        "                 ('dph', '@dptr'): [100, 1],\n",
        "                 ('dph', 'a'): [52, 1],\n",
        "                 ('dph', 'dpl'): [101, 1],\n",
        "                 ('dph', 'r0'): [96, 1],\n",
        "                 ('dph', 'r1'): [97, 1],\n",
        "                 ('dph', 'r2'): [98, 1],\n",
        "                 ('dph', 'r3'): [99, 1],\n",
        "                 ('dph', 'sph'): [102, 1],\n",
        "                 ('dph', 'spl'): [103, 1],\n",
        "                 ('dpl', '#data8'): [45, 2],\n",
        "                 ('dpl', '@dptr'): [109, 1],\n",
        "                 ('dpl', 'a'): [53, 1],\n",
        "                 ('dpl', 'dph'): [108, 1],\n",
        "                 ('dpl', 'r0'): [104, 1],\n",
        "                 ('dpl', 'r1'): [105, 1],\n",
        "                 ('dpl', 'r2'): [106, 1],\n",
        "                 ('dpl', 'r3'): [107, 1],\n",
        "                 ('dpl', 'sph'): [110, 1],\n",
        "                 ('dpl', 'spl'): [111, 1],\n",
        "                 ('dptr', '#data16'): [23, 3],\n",
        "                 ('dptr', 'sp'): [19, 1],\n",
        "                 ('label', 'a'): [25, 3],\n",
        "                 ('r0', '#data8'): [40, 2],\n",
        "                 ('r0', '@dptr'): [64, 1],\n",
        "                 ('r0', 'a'): [48, 1],\n",
        "                 ('r0', 'dph'): [68, 1],\n",
        "                 ('r0', 'dpl'): [69, 1],\n",
        "                 ('r0', 'r1'): [65, 1],\n",
        "                 ('r0', 'r2'): [66, 1],\n",
        "                 ('r0', 'r3'): [67, 1],\n",
        "                 ('r0', 'sph'): [70, 1],\n",
        "                 ('r0', 'spl'): [71, 1],\n",
        "                 ('r1', '#data8'): [41, 2],\n",
        "                 ('r1', '@dptr'): [73, 1],\n",
        "                 ('r1', 'a'): [49, 1],\n",
        "                 ('r1', 'dph'): [76, 1],\n",
        "                 ('r1', 'dpl'): [77, 1],\n",
        "                 ('r1', 'r0'): [72, 1],\n",
        "                 ('r1', 'r2'): [74, 1],\n",
        "                 ('r1', 'r3'): [75, 1],\n",
        "                 ('r1', 'sph'): [78, 1],\n",
        "                 ('r1', 'spl'): [79, 1],\n",
        "                 ('r2', '#data8'): [42, 2],\n",
        "                 ('r2', '@dptr'): [82, 1],\n",
        "                 ('r2', 'a'): [50, 1],\n",
        "                 ('r2', 'dph'): [84, 1],\n",
        "                 ('r2', 'dpl'): [85, 1],\n",
        "                 ('r2', 'r0'): [80, 1],\n",
        "                 ('r2', 'r1'): [81, 1],\n",
        "                 ('r2', 'r3'): [83, 1],\n",
        "                 ('r2', 'sph'): [86, 1],\n",
        "                 ('r2', 'spl'): [87, 1],\n",
        "                 ('r3', '#data8'): [43, 2],\n",
        "                 ('r3', '@dptr'): [91, 1],\n",
        "                 ('r3', 'a'): [51, 1],\n",
        "                 ('r3', 'dph'): [92, 1],\n",
        "                 ('r3', 'dpl'): [93, 1],\n",
        "                 ('r3', 'r0'): [88, 1],\n",
        "                 ('r3', 'r1'): [89, 1],\n",
        "                 ('r3', 'r2'): [90, 1],\n",
        "                 ('r3', 'sph'): [94, 1],\n",
        "                 ('r3', 'spl'): [95, 1],\n",
        "                 ('sp', '#data16'): [22, 3],\n",
        "                 ('sp', 'dptr'): [20, 1],\n",
        "                 ('sph', '#data8'): [46, 2],\n",
        "                 ('sph', '@dptr'): [118, 1],\n",
        "                 ('sph', 'a'): [54, 1],\n",
        "                 ('sph', 'dph'): [116, 1],\n",
        "                 ('sph', 'dpl'): [117, 1],\n",
        "                 ('sph', 'r0'): [112, 1],\n",
        "                 ('sph', 'r1'): [113, 1],\n",
        "                 ('sph', 'r2'): [114, 1],\n",
        "                 ('sph', 'r3'): [115, 1],\n",
        "                 ('sph', 'spl'): [119, 1],\n",
        "                 ('spl', '#data8'): [47, 2],\n",
        "                 ('spl', '@dptr'): [127, 1],\n",
        "                 ('spl', 'a'): [55, 1],\n",
        "                 ('spl', 'dph'): [124, 1],\n",
        "                 ('spl', 'dpl'): [125, 1],\n",
        "                 ('spl', 'r0'): [120, 1],\n",
        "                 ('spl', 'r1'): [121, 1],\n",
        "                 ('spl', 'r2'): [122, 1],\n",
        "                 ('spl', 'r3'): [123, 1],\n",
        "                 ('spl', 'sph'): [126, 1]},\n",
        "     'mul': {    ('r0', 'r1'): [248, 1]},\n",
        "     'nop': {    ('',): [0, 1]},\n",
        "     'orl': {    ('a', '#data8'): [142, 2],\n",
        "                 ('a', '@dptr'): [143, 1],\n",
        "                 ('a', 'dph'): [140, 1],\n",
        "                 ('a', 'dpl'): [141, 1],\n",
        "                 ('a', 'r0'): [136, 1],\n",
        "                 ('a', 'r1'): [137, 1],\n",
        "                 ('a', 'r2'): [138, 1],\n",
        "                 ('a', 'r3'): [139, 1]},\n",
        "     'out': {    ('port_addr', 'a'): [253, 2]},\n",
        "     'pcall': {    ('addr11',): [207, 2], ('label',): [207, 2]},\n",
        "     'pjmp': {    ('addr11',): [199, 2], ('label',): [199, 2]},\n",
        "     'pop': {    ('a',): [246, 1],\n",
        "                 ('dph',): [244, 1],\n",
        "                 ('dpl',): [245, 1],\n",
        "                 ('flags',): [247, 1],\n",
        "                 ('r0',): [240, 1],\n",
        "                 ('r1',): [241, 1],\n",
        "                 ('r2',): [242, 1],\n",
        "                 ('r3',): [243, 1]},\n",
        "     'push': {    ('a',): [238, 1],\n",
        "                  ('dph',): [236, 1],\n",
        "                  ('dpl',): [237, 1],\n",
        "                  ('flags',): [239, 1],\n",
        "                  ('r0',): [232, 1],\n",
        "                  ('r1',): [233, 1],\n",
        "                  ('r2',): [234, 1],\n",
        "                  ('r3',): [235, 1]},\n",
        "     'reserved': {    ('',): [251, 1]},\n",
        "     'ret': {    ('',): [218, 1]},\n",
        "     'reti': {    ('',): [219, 1]},\n",
        "     'rl': {    ('a',): [152, 1]"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "},\n",
        "     'rlc': {    ('a',): [153, 1]},\n",
        "     'rr': {    ('a',): [154, 1]},\n",
        "     'rrc': {    ('a',): [155, 1]},\n",
        "     'set': {    ('bs',): [10, 1], ('c',): [8, 1], ('ie',): [12, 1]},\n",
        "     'sfa': {    ('',): [17, 1]},\n",
        "     'sjmp': {    ('label',): [220, 2], ('rel8',): [220, 2]},\n",
        "     'sub': {    ('a', '#data8'): [182, 2],\n",
        "                 ('a', '@dptr'): [183, 1],\n",
        "                 ('a', 'dph'): [180, 1],\n",
        "                 ('a', 'dpl'): [181, 1],\n",
        "                 ('a', 'r0'): [176, 1],\n",
        "                 ('a', 'r1'): [177, 1],\n",
        "                 ('a', 'r2'): [178, 1],\n",
        "                 ('a', 'r3'): [179, 1]},\n",
        "     'subb': {    ('a', '#data8'): [190, 2],\n",
        "                  ('a', '@dptr'): [191, 1],\n",
        "                  ('a', 'dph'): [188, 1],\n",
        "                  ('a', 'dpl'): [189, 1],\n",
        "                  ('a', 'r0'): [184, 1],\n",
        "                  ('a', 'r1'): [185, 1],\n",
        "                  ('a', 'r2'): [186, 1],\n",
        "                  ('a', 'r3'): [187, 1]},\n",
        "     'xcsd': {    ('',): [16, 1]},\n",
        "     'xrl': {    ('a', '#data8'): [150, 2],\n",
        "                 ('a', '@dptr'): [151, 1],\n",
        "                 ('a', 'dph'): [148, 1],\n",
        "                 ('a', 'dpl'): [149, 1],\n",
        "                 ('a', 'r0'): [144, 1],\n",
        "                 ('a', 'r1'): [145, 1],\n",
        "                 ('a', 'r2'): [146, 1],\n",
        "                 ('a', 'r3'): [147, 1]}}\n"
       ]
      }
     ],
     "prompt_number": 11
    },
    {
     "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": []
    },
    {
     "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": []
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [],
     "language": "python",
     "metadata": {},
     "outputs": []
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [],
     "language": "python",
     "metadata": {},
     "outputs": []
    }
   ],
   "metadata": {}
  }
 ]
}