Skip to content
Snippets Groups Projects
Commit cc7e6685 authored by Martin Högstedt's avatar Martin Högstedt
Browse files

merged w main

parents 1456692c d2b192d2
No related branches found
No related tags found
1 merge request!17Pipeline diagram
Pipeline #131859 failed
...@@ -33,7 +33,7 @@ class Memory(Module): ...@@ -33,7 +33,7 @@ class Memory(Module):
super().__init__(signals, name) super().__init__(signals, name)
# Internal state # Internal state
self.memory = [0 for i in range(size)] self.memory = [0 for _ in range(size)]
self.current_address = 0 self.current_address = 0
self.is_write = False self.is_write = False
......
from math import ceil
from qtpy.QtCore import Qt from qtpy.QtCore import Qt
from qtpy.QtCore import Signal as pyqtSignal from qtpy.QtCore import Signal as pyqtSignal
from qtpy.QtCore import Slot from qtpy.QtCore import Slot
...@@ -5,9 +7,8 @@ from qtpy.QtWidgets import ( ...@@ -5,9 +7,8 @@ from qtpy.QtWidgets import (
QAction, QAction,
QGraphicsRectItem, QGraphicsRectItem,
QGraphicsSimpleTextItem, QGraphicsSimpleTextItem,
QTextEdit, QTableWidget,
QVBoxLayout, QTableWidgetItem,
QWidget,
) )
from simudator.core.modules import Memory from simudator.core.modules import Memory
...@@ -17,36 +18,84 @@ from simudator.gui.orientation import Orientation ...@@ -17,36 +18,84 @@ from simudator.gui.orientation import Orientation
from simudator.gui.port_graphics_item import PortGraphicsItem from simudator.gui.port_graphics_item import PortGraphicsItem
class MemoryWindow(QWidget): class MemoryWindow(QTableWidget):
"""
Widget for showing content of memory
""" """
A class showing the contents of a memory module in a QTableWidget.
This class assumes that the size of the memory module will remain constant.
_ROW_LENGTH = 5 Parameters
----------
memory_module: An instance of the Memory base class.
column_size: An integer specifying the number of columns, optional.
"""
def __init__(self, memory_module: Memory): def __init__(self, memory_module: Memory, column_size=-1):
super().__init__() super().__init__()
self.module = memory_module self._memory = memory_module
self._column_size = column_size
self._memory_size = len(self._memory.get_state()["memory"])
self._set_column_size()
self.setColumnCount(self._column_size)
self.setRowCount(ceil(self._memory_size / self._column_size))
self.setHorizontalHeaderLabels(["+" + str(i) for i in range(4)])
self.text = QTextEdit("") vertical_headers = []
layout = QVBoxLayout() for i in range(0, self._memory_size, self._column_size):
layout.addWidget(self.text) vertical_headers.append(str(hex(i)))
self.setLayout(layout)
self.setVerticalHeaderLabels(vertical_headers)
self.update() self.update()
def update(self): def update(self):
memory_str = "" """
for address, value in enumerate(self.module.memory): Update the content of this widget to reflect the content of the memory module.
# Add address and content to string """
# Make sure its unifrom lenght so rows are consistent memory_content = self._memory.get_state()["memory"]
memory_str += f"{address}" + ": " + f"{value}" + " " + "\t" for i in range(self._memory_size):
value = memory_content[i]
row = i // self._column_size
col = i % self._column_size
self.set_item(row, col, str(value))
# Make new line when we reach end of row def set_item(self, row: int, col: int, text: str) -> None:
if address % self._ROW_LENGTH == self._ROW_LENGTH - 1: """Set the text at specified table cell to the given text.
memory_str += "\n"
Parameters
----------
row: int
The items row position in the pipeline diagram.
col: int
The items column position in the pipeline diagram.
text: str
The text to be displayed.
"""
item = QTableWidgetItem(text)
self.text.setText(memory_str) self.setItem(row, col, item)
def _set_column_size(self) -> None:
"""
Set the column size to a reasonable value if the size was not given to the constructor.
This function assumes that the attributes `column_size` and `memory_size` are set before it is called.
"""
if not self._column_size == -1:
return
if self._memory_size > 200:
self._column_size = 4
return
if self._memory_size > 100:
self._column_size = 2
return
self._column_size = 1
return
class MemoryGraphicsItem(ModuleGraphicsItem): class MemoryGraphicsItem(ModuleGraphicsItem):
......
from qtpy.QtWidgets import QTableWidget, QTableWidgetItem
from typing import Any from typing import Any
from qtpy.QtWidgets import QTableWidget, QTableWidgetItem
class PipeLine(QTableWidget): class PipeLine(QTableWidget):
""" """
...@@ -28,6 +29,8 @@ class PipeLine(QTableWidget): ...@@ -28,6 +29,8 @@ class PipeLine(QTableWidget):
Instructions are set from get_current_instructions() in the Processor class. Instructions are set from get_current_instructions() in the Processor class.
""" """
def set_instruction(self, instructions: list[str]) -> None:
"""Give the pipeline the current CPU instructions."""
self.instructions = instructions self.instructions = instructions
for i in range(len(self.instructions)): for i in range(len(self.instructions)):
instruction = self.instructions[i][0] instruction = self.instructions[i][0]
......
...@@ -11,44 +11,15 @@ from qtpy.QtWidgets import ( ...@@ -11,44 +11,15 @@ from qtpy.QtWidgets import (
from simudator.core.modules import Memory from simudator.core.modules import Memory
from simudator.gui.color_scheme import ColorScheme as CS from simudator.gui.color_scheme import ColorScheme as CS
from simudator.gui.module_graphics_item.memory_graphic import MemoryGraphicsItem from simudator.gui.module_graphics_item.memory_graphic import (
MemoryGraphicsItem,
MemoryWindow,
)
from simudator.gui.orientation import Orientation from simudator.gui.orientation import Orientation
from simudator.gui.port_graphics_item import PortGraphicsItem from simudator.gui.port_graphics_item import PortGraphicsItem
from simudator.processor.mia.gui.mia_memory_content_dialog import MiaMemoryContentDialog from simudator.processor.mia.gui.mia_memory_content_dialog import MiaMemoryContentDialog
class MiaMemoryWindow(QWidget):
"""
Widget for showing content of memory
"""
ROW_LENGTH = 4
def __init__(self, memory_module: Memory):
super().__init__()
self.module = memory_module
self.text = QTextEdit("")
layout = QVBoxLayout()
layout.addWidget(self.text)
self.setLayout(layout)
self.update()
def update(self):
memory_str = ""
for address, value in enumerate(self.module.memory):
# Add address and content to string
# Make sure its unifrom lenght so rows are consistent
memory_str += f"0x{address:02x}" + ": " + f"0x{value:04x}" + " " + "\t"
# Make new line when we reach end of row
if address % self.ROW_LENGTH == self.ROW_LENGTH - 1:
memory_str += "\n"
self.text.setText(memory_str)
class MiaMemoryGraphicsItem(MemoryGraphicsItem): class MiaMemoryGraphicsItem(MemoryGraphicsItem):
""" """
Graphics module for a Memory module. Graphics module for a Memory module.
...@@ -99,7 +70,7 @@ class MiaMemoryGraphicsItem(MemoryGraphicsItem): ...@@ -99,7 +70,7 @@ class MiaMemoryGraphicsItem(MemoryGraphicsItem):
Create and show a MemoryWindow that displays the contents Create and show a MemoryWindow that displays the contents
of the memory module associated with this graphics item. of the memory module associated with this graphics item.
""" """
self.memory_window = MiaMemoryWindow(self.module) self.memory_window = MemoryWindow(self.module)
self.memory_window.show() self.memory_window.show()
def memoryBreakpointDialog(self) -> None: def memoryBreakpointDialog(self) -> None:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment