Идея для этого проекта пришла ко мне во время изучения Computer Science, и мне захотелось повторить архитектуру Фон Неймана на Python.
Я изначально знал на что иду, и мне было неинтересно пользоваться упрощениями и высоким уровнем абстракции в Python, и я буквально начал писать симулятор ассемблера, который в дальнейшем должен перерасти в симулятор процессора, который воссоздаётся из самых базовых логических схем, триггеров и так далее.
git clone https://github.com/PurpleSwtr/Pymputer.gitcd PymputerЗапустите главный файл main.py, чтобы увидеть примеры выполнения команд:
python main.pyВы можете изменять команды в файле main.py:
from Classes.Computer import Computer
# Инициализация основного экземпляра класса
computer = Computer()
# Отображение начального состояния регистров
computer.comp_repr()
# Пример 1: Выполнение команды в машинных кодах
computer.command("0010 0100 0010 0101")
# Пример 2: Выполнение команды на ассемблере
computer.command("w = 7 + 9")Computer: Главный класс, координирующий работу всех модулей.ALU (Arithmetic-Logic Unit): Реализует логические операции (AND,OR,XOR,NOT) и арифметические операции на их основе (полусумматоры, полные сумматоры).RegisterFile: Хранилище данных, состоящее из нескольких 4-битных регистров, включая регистр инструкций[OP]и регистр для записи результата[w](итого 16).Decoder: Преобразует команды с упрощенного ассемблера (например,w = 7 + 9) в машинный код.ProgramCounter (PC): Счетчик команд, указывающий на текущий шаг выполнения программы.
Примечание: абсолютно все блоки реализовывались на основе предыдущих, начиная с самых низких уровней абстракции
Процесс выполнения команды w = 7 + 9 выглядит следующим образом:
- Пользователь передает строку
"w = 7 + 9"в методcomputer.command(). Decoderпреобразует эту строку в машинный код. Он разбивает команду на (w,=,7,+,9) и заменяет их на соответствующие 4-битные коды из своего словаря инструкций. Результат:['0010', '0111', '1001', '1101'].Computerзагружает эти 4-битные чанки вRegisterFile:0010(код операции+) -> в регистр[OP]0111(число 7) -> в регистр[R1]1001(число 9) -> в регистр[R2]
Computerизвлекает инструкцию (0010) и аргументы (0111,1001) из регистров и передает их вALU.ALUвыполняет 4-битное сложение0111+1001. Результат10000(16 в десятичной).- Поскольку результат 5-битный,
ALUсигнализирует о переполнении ([WARNING] - stack overflow!). Computerзаписывает 4 младших бита результата (0000) в регистр[w].Computerвыводит конечное состояние регистров.