370 lines
14 KiB
Plaintext
370 lines
14 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"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",
|
|
" 'BNZ': ('0','0','0','0','0','0','0','0','0','0','1','0',),\n",
|
|
" 'BNA': ('0','0','0','0','0','0','0','0','0','0','1','1',),\n",
|
|
" 'BNP': ('0','0','0','0','0','0','0','0','0','1','0','0',),\n",
|
|
" 'BNN': ('0','0','0','0','0','0','0','0','0','1','0','1',),\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",
|
|
" 'POP': ('0','0','0','0','0','0','1','1','0','X','X','X',),\n",
|
|
" 'PSH': ('0','0','0','0','0','0','1','1','1','X','X','X',),\n",
|
|
" 'LIU': ('0','0','0','0','0','1','X','X','X','X','X','X',),\n",
|
|
" 'LDI': ('0','0','0','0','1','0','X','X','X','X','X','X',),\n",
|
|
" 'LIL': ('0','0','0','0','1','1','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",
|
|
" 'SUB': ('0','1','1','X','X','X','X','X','X','X','X','X',),\n",
|
|
" 'XOR': ('1','0','0','X','X','X','X','X','X','X','X','X',),\n",
|
|
" 'NAD': ('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": 9,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"controls = {\n",
|
|
" 'Halt': ['HLT'],\n",
|
|
" 'Branch if Zero': ['BNZ'],\n",
|
|
" 'Branch if Not Zero': ['BNA'],\n",
|
|
" 'Branch if Positive': ['BNP'],\n",
|
|
" 'Branch if Negative': ['BNN'],\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 Upper': ['LIU'],\n",
|
|
" 'Load Immediate Lower': ['LDI'],\n",
|
|
" 'Load Immediate Lower OR': ['LIL'],\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",
|
|
" 'Write Reg 1': ['LOD','PSH','LSH','RSH','INC','DEC','AND','OR','SUB','XOR','NAD','NOR','ADD'],\n",
|
|
" 'Read Reg 1': ['STR','POP'],\n",
|
|
" 'Any Reg 1': ['LOD','PSH','LSH','RSH','INC','DEC','AND','OR','SUB','XOR','NAD','NOR','ADD','STR','POP'],\n",
|
|
" 'Read Reg 2': ['LSH','RSH','INC','DEC','AND','OR','SUB','XOR','NAD','NOR','ADD'],\n",
|
|
" 'Read Reg 3': ['AND','OR','SUB','XOR','NAD','NOR','ADD'],\n",
|
|
" 'Update Flags': ['LSH','RSH','INC','DEC','AND','OR','SUB','XOR','NAD','NOR','ADD'],\n",
|
|
"}"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Simplifier"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"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",
|
|
"Branch if Zero (ORG) = B & ~A & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Branch if Zero (CNF) = B & ~A & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Branch if Zero (DNF) = B & ~A & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"Branch if Not Zero (ORG) = A & B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Branch if Not Zero (CNF) = A & B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Branch if Not Zero (DNF) = A & B & ~C & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"Branch if Positive (ORG) = C & ~A & ~B & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Branch if Positive (CNF) = C & ~A & ~B & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Branch if Positive (DNF) = C & ~A & ~B & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"Branch if Negative (ORG) = A & C & ~B & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Branch if Negative (CNF) = A & C & ~B & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Branch if Negative (DNF) = A & C & ~B & ~D & ~E & ~F & ~G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"Read Memory (ORG) = (E & F & ~D & ~G & ~H & ~I & ~J & ~K & ~L) | (F & ~D & ~E & ~G & ~H & ~I & ~J & ~K & ~L)\n",
|
|
"\n",
|
|
"Read Memory (CNF) = F & ~D & ~G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Read Memory (DNF) = F & ~D & ~G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"Write Memory (ORG) = (D & E & F & ~G & ~H & ~I & ~J & ~K & ~L) | (D & F & ~E & ~G & ~H & ~I & ~J & ~K & ~L)\n",
|
|
"\n",
|
|
"Write Memory (CNF) = D & F & ~G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Write Memory (DNF) = D & F & ~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 Upper (ORG) = G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Load Immediate Upper (CNF) = G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Load Immediate Upper (DNF) = G & ~H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"Load Immediate Lower (ORG) = H & ~G & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Load Immediate Lower (CNF) = H & ~G & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Load Immediate Lower (DNF) = H & ~G & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"Load Immediate Lower OR (ORG) = G & H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Load Immediate Lower OR (CNF) = G & H & ~I & ~J & ~K & ~L\n",
|
|
"\n",
|
|
"Load Immediate Lower OR (DNF) = G & H & ~I & ~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 & L & ~K) | (J & ~K & ~L)\n",
|
|
"\n",
|
|
"AND (CNF) = J & ~K\n",
|
|
"\n",
|
|
"AND (DNF) = J & ~K\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) = L & ~J & ~K\n",
|
|
"\n",
|
|
"XOR (CNF) = L & ~J & ~K\n",
|
|
"\n",
|
|
"XOR (DNF) = L & ~J & ~K\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"NOT out (ORG) = (J & L & ~K) | (K & L & ~J)\n",
|
|
"\n",
|
|
"NOT out (CNF) = L & (J | K) & (~J | ~K)\n",
|
|
"\n",
|
|
"NOT out (DNF) = (J & L & ~K) | (K & L & ~J)\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"NOT Reg 3 (ORG) = (J & K & ~L) | (G & H & I & ~J & ~K & ~L)\n",
|
|
"\n",
|
|
"NOT Reg 3 (CNF) = ~L & (G | J) & (H | J) & (I | J) & (J | ~K) & (K | ~J)\n",
|
|
"\n",
|
|
"NOT Reg 3 (DNF) = (J & K & ~L) | (G & H & I & ~J & ~K & ~L)\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"Add (ORG) = (J & K & L) | (J & K & ~L) | (G & H & I & ~J & ~K & ~L) | (H & I & ~G & ~J & ~K & ~L)\n",
|
|
"\n",
|
|
"Add (CNF) = (H | J) & (I | J) & (J | ~K) & (J | ~L) & (K | ~J)\n",
|
|
"\n",
|
|
"Add (DNF) = (J & K) | (H & I & ~J & ~K & ~L)\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"Inject Carry (ORG) = (J & K & ~L) | (G & H & I & ~J & ~K & ~L) | (H & I & ~G & ~J & ~K & ~L)\n",
|
|
"\n",
|
|
"Inject Carry (CNF) = ~L & (H | J) & (I | J) & (J | ~K) & (K | ~J)\n",
|
|
"\n",
|
|
"Inject Carry (DNF) = (J & K & ~L) | (H & I & ~J & ~K & ~L)\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",
|
|
"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) | (F & ~D & ~E & ~G & ~H & ~I & ~J & ~K & ~L)\n",
|
|
"\n",
|
|
"Write Reg 1 (CNF) = (F | I | J | K | L) & (I | J | K | L | ~G) & (I | J | K | L | ~H) & (D | I | J | K | L | ~E) & (E | I | J | K | L | ~D)\n",
|
|
"\n",
|
|
"Write Reg 1 (DNF) = I | J | K | L | (D & E & F & ~G & ~H) | (F & ~D & ~E & ~G & ~H)\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"Read Reg 1 (ORG) = (D & F & ~E & ~G & ~H & ~I & ~J & ~K & ~L) | (E & F & ~D & ~G & ~H & ~I & ~J & ~K & ~L)\n",
|
|
"\n",
|
|
"Read Reg 1 (CNF) = F & ~G & ~H & ~I & ~J & ~K & ~L & (D | E) & (~D | ~E)\n",
|
|
"\n",
|
|
"Read Reg 1 (DNF) = (D & F & ~E & ~G & ~H & ~I & ~J & ~K & ~L) | (E & F & ~D & ~G & ~H & ~I & ~J & ~K & ~L)\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"Any 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) | (D & F & ~E & ~G & ~H & ~I & ~J & ~K & ~L) | (E & F & ~D & ~G & ~H & ~I & ~J & ~K & ~L) | (F & ~D & ~E & ~G & ~H & ~I & ~J & ~K & ~L)\n",
|
|
"\n",
|
|
"Any Reg 1 (CNF) = (F | I | J | K | L) & (I | J | K | L | ~G) & (I | J | K | L | ~H)\n",
|
|
"\n",
|
|
"Any Reg 1 (DNF) = I | J | K | L | (F & ~G & ~H)\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",
|
|
"Update Flags (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",
|
|
"Update Flags (CNF) = I | J | K | L\n",
|
|
"\n",
|
|
"Update Flags (DNF) = 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
|
|
}
|