{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "instructions = {\n", " 'NOP': ('0','0','0','0','0','0','0','0','0','0','0','0',),\n", " 'HLT': ('0','0','0','0','0','0','0','0','0','0','0','1',),\n", " 'INT': ('0','0','0','0','0','0','0','0','0','0','1','0',),\n", " 'BNZ': ('0','0','0','0','0','0','0','0','0','0','1','1',),\n", " 'BLK': ('0','0','0','0','0','0','0','0','0','1','0','0',),\n", " 'ENB': ('0','0','0','0','0','0','0','0','0','1','0','1',),\n", " 'GLA': ('0','0','0','0','0','0','0','1','0','X','X','X',),\n", " 'GET': ('0','0','0','0','0','0','0','1','1','X','X','X',),\n", " 'LOD': ('0','0','0','0','0','0','1','0','0','X','X','X',),\n", " 'STR': ('0','0','0','0','0','0','1','0','1','X','X','X',),\n", " 'PSH': ('0','0','0','0','0','0','1','1','0','X','X','X',),\n", " 'POP': ('0','0','0','0','0','0','1','1','1','X','X','X',),\n", " 'LDI': ('0','0','0','0','1','X','X','X','X','X','X','X',),\n", " 'LSH': ('0','0','0','1','0','0','X','X','X','X','X','X',),\n", " 'RSH': ('0','0','0','1','0','1','X','X','X','X','X','X',),\n", " 'INC': ('0','0','0','1','1','0','X','X','X','X','X','X',),\n", " 'DEC': ('0','0','0','1','1','1','X','X','X','X','X','X',),\n", " 'AND': ('0','0','1','X','X','X','X','X','X','X','X','X',),\n", " 'OR': ('0','1','0','X','X','X','X','X','X','X','X','X',),\n", " 'NAD': ('0','1','1','X','X','X','X','X','X','X','X','X',),\n", " 'SUB': ('1','0','0','X','X','X','X','X','X','X','X','X',),\n", " 'XOR': ('1','0','1','X','X','X','X','X','X','X','X','X',),\n", " 'NOR': ('1','1','0','X','X','X','X','X','X','X','X','X',),\n", " 'ADD': ('1','1','1','X','X','X','X','X','X','X','X','X',),\n", "}" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "controls = {\n", " 'Halt': ['HLT'],\n", " 'Interrupt': ['INT'],\n", " 'Branch if Zero': ['BNZ'],\n", " 'Block interrupts': ['BLK'],\n", " 'Unblock interrupts': ['ENB'],\n", " 'Read Last Address': ['GLA'],\n", " 'Read Interrupt Device': ['GET'],\n", " 'Read Memory': ['LOD','POP'],\n", " 'Write Memory': ['STR','PSH'],\n", " 'Use Memory Pointer': ['LOD','STR'],\n", " 'Use Stack Pointer': ['PSH','POP'],\n", " 'Load Immediate': ['LDI'],\n", " 'Write Reg 1': ['GLA','GET','LOD','PSH','LSH','RSH','INC','DEC','AND','OR','NAD','SUB','XOR','NOR','ADD'],\n", " 'Read Reg 1': ['STR','POP'],\n", " 'Read Reg 2': ['LSH','RSH','INC','DEC','AND','OR','NAD','SUB','XOR','NOR','ADD'],\n", " 'Read Reg 3': ['AND','OR','NAD','SUB','XOR','NOR','ADD'],\n", " 'Left Shift': ['LSH'],\n", " 'Right Shift': ['RSH'],\n", " 'AND': ['AND','NAD'],\n", " 'OR': ['OR','NOR'],\n", " 'XOR': ['XOR'],\n", " 'NOT out': ['NAD','NOR'],\n", " 'NOT Reg 3': ['DEC','SUB'],\n", " 'Add': ['INC','DEC','SUB','ADD'],\n", " 'Inject Carry': ['INC','DEC','SUB'],\n", " 'One as Reg 3': ['DEC'],\n", "}" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def equ(control: list[str]) -> str:\n", " inputs = ['A','B','C','D','E','F','G','H','I','J','K','L']\n", " equ = \"\"\n", "\n", " for instruction in control:\n", " equ += '('\n", " last = ''\n", " for i, bit in enumerate(reversed(instructions[instruction])):\n", " if i != 0 and last != 'X':\n", " equ += ' & '\n", "\n", " if bit == '0':\n", " equ += f\"~{inputs[i]}\"\n", " elif bit == '1':\n", " equ += f\"{inputs[i]}\"\n", " elif bit == 'X':\n", " equ += f\"({inputs[i]} | ~{inputs[i]})\"\n", " # last = bit\n", " equ += ') | '\n", "\n", " return equ[:-3]" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'(A & ~B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L)'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "equ(controls['Halt'])" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'Halt': '(A & ~B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L)',\n", " 'Interrupt': '(~A & B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L)',\n", " 'Branch if Zero': '(A & B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L)',\n", " 'Block interrupts': '(~A & ~B & C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L)',\n", " 'Unblock interrupts': '(A & ~B & C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L)',\n", " 'Read Last Address': '((A | ~A) & (B | ~B) & (C | ~C) & ~D & E & ~F & ~G & ~H & ~I & ~J & ~K & ~L)',\n", " 'Read Interrupt Device': '((A | ~A) & (B | ~B) & (C | ~C) & D & E & ~F & ~G & ~H & ~I & ~J & ~K & ~L)',\n", " 'Read Memory': '((A | ~A) & (B | ~B) & (C | ~C) & ~D & ~E & F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & D & E & F & ~G & ~H & ~I & ~J & ~K & ~L)',\n", " 'Write Memory': '((A | ~A) & (B | ~B) & (C | ~C) & D & ~E & F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & ~D & E & F & ~G & ~H & ~I & ~J & ~K & ~L)',\n", " 'Use Memory Pointer': '((A | ~A) & (B | ~B) & (C | ~C) & ~D & ~E & F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & D & ~E & F & ~G & ~H & ~I & ~J & ~K & ~L)',\n", " 'Use Stack Pointer': '((A | ~A) & (B | ~B) & (C | ~C) & ~D & E & F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & D & E & F & ~G & ~H & ~I & ~J & ~K & ~L)',\n", " 'Load Immediate': '((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & H & ~I & ~J & ~K & ~L)',\n", " 'Write Reg 1': '((A | ~A) & (B | ~B) & (C | ~C) & ~D & E & ~F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & D & E & ~F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & ~D & ~E & F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & ~D & E & F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & ~G & ~H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & ~H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & ~G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & ~K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & L)',\n", " 'Read Reg 1': '((A | ~A) & (B | ~B) & (C | ~C) & D & ~E & F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & D & E & F & ~G & ~H & ~I & ~J & ~K & ~L)',\n", " 'Read Reg 2': '((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & ~G & ~H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & ~H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & ~G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & ~K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & L)',\n", " 'Read Reg 3': '((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & ~K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & L)',\n", " 'Left Shift': '((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & ~G & ~H & I & ~J & ~K & ~L)',\n", " 'Right Shift': '((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & ~H & I & ~J & ~K & ~L)',\n", " 'AND': '((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & ~L)',\n", " 'OR': '((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & L)',\n", " 'XOR': '((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & L)',\n", " 'NOT out': '((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & L)',\n", " 'NOT Reg 3': '((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & ~K & L)',\n", " 'Add': '((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & ~G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & ~K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & L)',\n", " 'Inject Carry': '((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & ~G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & ~K & L)',\n", " 'One as Reg 3': '((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & H & I & ~J & ~K & ~L)'}" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "control_equs = {}\n", "\n", "for key, value in controls.items():\n", " control_equs[key] = equ(value)\n", "\n", "control_equs" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Halt = (A & ~B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Interrupt = (~A & B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Branch if Zero = (A & B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Block interrupts = (~A & ~B & C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Unblock interrupts = (A & ~B & C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Read Last Address = ((A | ~A) & (B | ~B) & (C | ~C) & ~D & E & ~F & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Read Interrupt Device = ((A | ~A) & (B | ~B) & (C | ~C) & D & E & ~F & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Read Memory = ((A | ~A) & (B | ~B) & (C | ~C) & ~D & ~E & F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & D & E & F & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Write Memory = ((A | ~A) & (B | ~B) & (C | ~C) & D & ~E & F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & ~D & E & F & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Use Memory Pointer = ((A | ~A) & (B | ~B) & (C | ~C) & ~D & ~E & F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & D & ~E & F & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Use Stack Pointer = ((A | ~A) & (B | ~B) & (C | ~C) & ~D & E & F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & D & E & F & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Load Immediate = ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & H & ~I & ~J & ~K & ~L)\n", "\n", "Write Reg 1 = ((A | ~A) & (B | ~B) & (C | ~C) & ~D & E & ~F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & D & E & ~F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & ~D & ~E & F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & ~D & E & F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & ~G & ~H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & ~H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & ~G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & ~K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & L)\n", "\n", "Read Reg 1 = ((A | ~A) & (B | ~B) & (C | ~C) & D & ~E & F & ~G & ~H & ~I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & D & E & F & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Read Reg 2 = ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & ~G & ~H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & ~H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & ~G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & ~K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & L)\n", "\n", "Read Reg 3 = ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & ~K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & L)\n", "\n", "Left Shift = ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & ~G & ~H & I & ~J & ~K & ~L)\n", "\n", "Right Shift = ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & ~H & I & ~J & ~K & ~L)\n", "\n", "AND = ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & ~L)\n", "\n", "OR = ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & L)\n", "\n", "XOR = ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & ~K & L)\n", "\n", "NOT out = ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & K & L)\n", "\n", "NOT Reg 3 = ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & ~K & L)\n", "\n", "Add = ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & ~G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & ~K & L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & J & K & L)\n", "\n", "Inject Carry = ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & ~G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & H & I & ~J & ~K & ~L) | ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & (G | ~G) & (H | ~H) & (I | ~I) & ~J & ~K & L)\n", "\n", "One as Reg 3 = ((A | ~A) & (B | ~B) & (C | ~C) & (D | ~D) & (E | ~E) & (F | ~F) & G & H & I & ~J & ~K & ~L)\n", "\n" ] } ], "source": [ "for k, v in control_equs.items():\n", " print(k, '=', v, end='\\n\\n')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Simplifier" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Halt (ORG) = A & ~B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Halt (CNF) = A & ~B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Halt (DNF) = A & ~B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "\n", "\n", "Interrupt (ORG) = B & ~A & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Interrupt (CNF) = B & ~A & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Interrupt (DNF) = B & ~A & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "\n", "\n", "Branch if Zero (ORG) = A & B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Branch if Zero (CNF) = A & B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Branch if Zero (DNF) = A & B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "\n", "\n", "Block interrupts (ORG) = C & ~A & ~B & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Block interrupts (CNF) = C & ~A & ~B & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Block interrupts (DNF) = C & ~A & ~B & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "\n", "\n", "Unblock interrupts (ORG) = A & C & ~B & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Unblock interrupts (CNF) = A & C & ~B & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Unblock interrupts (DNF) = A & C & ~B & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "\n", "\n", "Read Last Address (ORG) = E & ~D & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Read Last Address (CNF) = E & ~D & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Read Last Address (DNF) = E & ~D & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "\n", "\n", "Read Interrupt Device (ORG) = D & E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Read Interrupt Device (CNF) = D & E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Read Interrupt Device (DNF) = D & E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "\n", "\n", "Read Memory (ORG) = (D & E & F & ~G & ~H & ~I & ~J & ~K & ~L) | (F & ~D & ~E & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Read Memory (CNF) = F & ~G & ~H & ~I & ~J & ~K & ~L & (D | ~E) & (E | ~D)\n", "\n", "Read Memory (DNF) = (D & E & F & ~G & ~H & ~I & ~J & ~K & ~L) | (F & ~D & ~E & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "\n", "\n", "Write Memory (ORG) = (D & F & ~E & ~G & ~H & ~I & ~J & ~K & ~L) | (E & F & ~D & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Write Memory (CNF) = F & ~G & ~H & ~I & ~J & ~K & ~L & (D | E) & (~D | ~E)\n", "\n", "Write Memory (DNF) = (D & F & ~E & ~G & ~H & ~I & ~J & ~K & ~L) | (E & F & ~D & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "\n", "\n", "Use Memory Pointer (ORG) = (D & F & ~E & ~G & ~H & ~I & ~J & ~K & ~L) | (F & ~D & ~E & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Use Memory Pointer (CNF) = F & ~E & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Use Memory Pointer (DNF) = F & ~E & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "\n", "\n", "Use Stack Pointer (ORG) = (D & E & F & ~G & ~H & ~I & ~J & ~K & ~L) | (E & F & ~D & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Use Stack Pointer (CNF) = E & F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Use Stack Pointer (DNF) = E & F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "\n", "\n", "Load Immediate (ORG) = H & ~I & ~J & ~K & ~L\n", "\n", "Load Immediate (CNF) = H & ~I & ~J & ~K & ~L\n", "\n", "Load Immediate (DNF) = H & ~I & ~J & ~K & ~L\n", "\n", "\n", "\n", "Write Reg 1 (ORG) = (J & K & L) | (J & K & ~L) | (J & L & ~K) | (K & L & ~J) | (J & ~K & ~L) | (K & ~J & ~L) | (L & ~J & ~K) | (G & H & I & ~J & ~K & ~L) | (G & I & ~H & ~J & ~K & ~L) | (H & I & ~G & ~J & ~K & ~L) | (I & ~G & ~H & ~J & ~K & ~L) | (D & E & ~F & ~G & ~H & ~I & ~J & ~K & ~L) | (E & F & ~D & ~G & ~H & ~I & ~J & ~K & ~L) | (E & ~D & ~F & ~G & ~H & ~I & ~J & ~K & ~L) | (F & ~D & ~E & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Write Reg 1 (CNF) = (I | J | K | L | ~G) & (I | J | K | L | ~H) & (E | F | I | J | K | L) & (I | J | K | L | ~D | ~F)\n", "\n", "Write Reg 1 (DNF) = I | J | K | L | (E & ~F & ~G & ~H) | (F & ~D & ~G & ~H)\n", "\n", "\n", "\n", "Read Reg 1 (ORG) = (D & E & F & ~G & ~H & ~I & ~J & ~K & ~L) | (D & F & ~E & ~G & ~H & ~I & ~J & ~K & ~L)\n", "\n", "Read Reg 1 (CNF) = D & F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "Read Reg 1 (DNF) = D & F & ~G & ~H & ~I & ~J & ~K & ~L\n", "\n", "\n", "\n", "Read Reg 2 (ORG) = (J & K & L) | (J & K & ~L) | (J & L & ~K) | (K & L & ~J) | (J & ~K & ~L) | (K & ~J & ~L) | (L & ~J & ~K) | (G & H & I & ~J & ~K & ~L) | (G & I & ~H & ~J & ~K & ~L) | (H & I & ~G & ~J & ~K & ~L) | (I & ~G & ~H & ~J & ~K & ~L)\n", "\n", "Read Reg 2 (CNF) = I | J | K | L\n", "\n", "Read Reg 2 (DNF) = I | J | K | L\n", "\n", "\n", "\n", "Read Reg 3 (ORG) = (J & K & L) | (J & K & ~L) | (J & L & ~K) | (K & L & ~J) | (J & ~K & ~L) | (K & ~J & ~L) | (L & ~J & ~K)\n", "\n", "Read Reg 3 (CNF) = J | K | L\n", "\n", "Read Reg 3 (DNF) = J | K | L\n", "\n", "\n", "\n", "Left Shift (ORG) = I & ~G & ~H & ~J & ~K & ~L\n", "\n", "Left Shift (CNF) = I & ~G & ~H & ~J & ~K & ~L\n", "\n", "Left Shift (DNF) = I & ~G & ~H & ~J & ~K & ~L\n", "\n", "\n", "\n", "Right Shift (ORG) = G & I & ~H & ~J & ~K & ~L\n", "\n", "Right Shift (CNF) = G & I & ~H & ~J & ~K & ~L\n", "\n", "Right Shift (DNF) = G & I & ~H & ~J & ~K & ~L\n", "\n", "\n", "\n", "AND (ORG) = (J & K & ~L) | (J & ~K & ~L)\n", "\n", "AND (CNF) = J & ~L\n", "\n", "AND (DNF) = J & ~L\n", "\n", "\n", "\n", "OR (ORG) = (K & L & ~J) | (K & ~J & ~L)\n", "\n", "OR (CNF) = K & ~J\n", "\n", "OR (DNF) = K & ~J\n", "\n", "\n", "\n", "XOR (ORG) = J & L & ~K\n", "\n", "XOR (CNF) = J & L & ~K\n", "\n", "XOR (DNF) = J & L & ~K\n", "\n", "\n", "\n", "NOT out (ORG) = (J & K & ~L) | (K & L & ~J)\n", "\n", "NOT out (CNF) = K & (J | L) & (~J | ~L)\n", "\n", "NOT out (DNF) = (J & K & ~L) | (K & L & ~J)\n", "\n", "\n", "\n", "NOT Reg 3 (ORG) = (L & ~J & ~K) | (G & H & I & ~J & ~K & ~L)\n", "\n", "NOT Reg 3 (CNF) = ~J & ~K & (G | L) & (H | L) & (I | L)\n", "\n", "NOT Reg 3 (DNF) = (L & ~J & ~K) | (G & H & I & ~J & ~K)\n", "\n", "\n", "\n", "Add (ORG) = (J & K & L) | (L & ~J & ~K) | (G & H & I & ~J & ~K & ~L) | (H & I & ~G & ~J & ~K & ~L)\n", "\n", "Add (CNF) = (H | L) & (I | L) & (J | ~K) & (K | ~J) & (L | ~K)\n", "\n", "Add (DNF) = (J & K & L) | (L & ~J & ~K) | (H & I & ~J & ~K)\n", "\n", "\n", "\n", "Inject Carry (ORG) = (L & ~J & ~K) | (G & H & I & ~J & ~K & ~L) | (H & I & ~G & ~J & ~K & ~L)\n", "\n", "Inject Carry (CNF) = ~J & ~K & (H | L) & (I | L)\n", "\n", "Inject Carry (DNF) = (L & ~J & ~K) | (H & I & ~J & ~K)\n", "\n", "\n", "\n", "One as Reg 3 (ORG) = G & H & I & ~J & ~K & ~L\n", "\n", "One as Reg 3 (CNF) = G & H & I & ~J & ~K & ~L\n", "\n", "One as Reg 3 (DNF) = G & H & I & ~J & ~K & ~L\n", "\n", "\n", "\n" ] } ], "source": [ "from sympy import symbols, Not, And, Or, simplify_logic\n", "\n", "A, B, C, D, E, F, G, H, I, J, K, L = symbols('A B C D E F G H I J K L')\n", "\n", "def equ_s(control: list[str]):\n", " inputs = [A, B, C, D, E, F, G, H, I, J, K, L]\n", " equ = []\n", "\n", " for instruction in control:\n", " sub_equ = []\n", " for i, bit in enumerate(reversed(instructions[instruction])):\n", " if bit == '0':\n", " sub_equ.append(Not(inputs[i]))\n", " elif bit == '1':\n", " sub_equ.append(inputs[i])\n", " equ.append(And(*sub_equ))\n", "\n", " return Or(*equ)\n", "\n", "for key, value in controls.items():\n", " expr = equ_s(value)\n", " cnf_expr = simplify_logic(expr, form='cnf', force=True)\n", " dnf_expr = simplify_logic(expr, form='dnf', force=True)\n", " print(key, '(ORG) =', expr, end='\\n\\n')\n", " print(key, '(CNF) =', cnf_expr, end='\\n\\n')\n", " print(key, '(DNF) =', dnf_expr, end='\\n\\n\\n\\n')" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.0" } }, "nbformat": 4, "nbformat_minor": 2 }