Skip to content
Snippets Groups Projects
Commit c86903f8 authored by Oscar Gustafsson's avatar Oscar Gustafsson :bicyclist:
Browse files

Code cleanup

parent d527f02e
No related branches found
No related tags found
No related merge requests found
Pipeline #72131 passed
from qtpy.QtWidgets import QVBoxLayout, QHBoxLayout, QWidget, QDialog, QLabel, QFrame, QScrollArea from qtpy.QtWidgets import QVBoxLayout, QHBoxLayout, QDialog, QLabel, QFrame, \
QScrollArea
from qtpy.QtCore import Qt from qtpy.QtCore import Qt
......
...@@ -5,7 +5,7 @@ This file opens the main window of the GUI for B-ASIC when run. ...@@ -5,7 +5,7 @@ This file opens the main window of the GUI for B-ASIC when run.
from pprint import pprint from pprint import pprint
from os import getcwd, path import os
import importlib import importlib
import logging import logging
import sys import sys
...@@ -22,23 +22,21 @@ from b_asic.GUI.select_sfg_window import SelectSFGWindow ...@@ -22,23 +22,21 @@ from b_asic.GUI.select_sfg_window import SelectSFGWindow
# from b_asic import FastSimulation # from b_asic import FastSimulation
from b_asic.simulation import Simulation as FastSimulation from b_asic.simulation import Simulation as FastSimulation
from b_asic.operation import Operation from b_asic.port import OutputPort
from b_asic.port import InputPort, OutputPort
from b_asic.signal_flow_graph import SFG from b_asic.signal_flow_graph import SFG
from b_asic.special_operations import Input, Output from b_asic.special_operations import Input, Output
import b_asic.core_operations as c_oper import b_asic.core_operations as c_oper
import b_asic.special_operations as s_oper import b_asic.special_operations as s_oper
from b_asic.save_load_structure import * from b_asic.save_load_structure import sfg_to_python, python_to_sfg
import numpy as np import numpy as np
from qtpy.QtWidgets import QApplication, QWidget, QMainWindow, QLabel, QAction,\ from qtpy.QtWidgets import (
QStatusBar, QMenuBar, QLineEdit, QPushButton, QSlider, QScrollArea, QVBoxLayout,\ QApplication, QMainWindow, QAction, QLineEdit, QListWidgetItem,
QHBoxLayout, QDockWidget, QToolBar, QMenu, QLayout, QSizePolicy, QListWidget,\ QGraphicsView, QGraphicsScene, QShortcut, QFileDialog, QGraphicsTextItem,
QListWidgetItem, QGraphicsView, QGraphicsScene, QShortcut, QGraphicsTextItem,\ QInputDialog)
QGraphicsProxyWidget, QInputDialog, QTextEdit, QFileDialog from qtpy.QtCore import QFileInfo, QSize, Qt
from qtpy.QtCore import Qt, QSize, QFileInfo from qtpy.QtGui import QIcon, QKeySequence, QPainter
from qtpy.QtGui import QIcon, QFont, QPainter, QPen, QBrush, QKeySequence
MIN_WIDTH_SCENE = 600 MIN_WIDTH_SCENE = 600
...@@ -54,19 +52,19 @@ class MainWindow(QMainWindow): ...@@ -54,19 +52,19 @@ class MainWindow(QMainWindow):
self.ui.setupUi(self) self.ui.setupUi(self)
self.setWindowIcon(QIcon('small_logo.png')) self.setWindowIcon(QIcon('small_logo.png'))
self.scene = None self.scene = None
self._operations_from_name = dict() self._operations_from_name = {}
self.zoom = 1 self.zoom = 1
self.sfg_name_i = 0 self.sfg_name_i = 0
self.dragOperationSceneDict = dict() self.dragOperationSceneDict = {}
self.operationDragDict = dict() self.operationDragDict = {}
self.operationItemSceneList = [] self.operationItemSceneList = []
self.signalList = [] self.signalList = []
self.pressed_operations = [] self.pressed_operations = []
self.portDict = dict() self.portDict = {}
self.signalPortDict = dict() self.signalPortDict = {}
self.opToSFG = dict() self.opToSFG = {}
self.pressed_ports = [] self.pressed_ports = []
self.sfg_dict = dict() self.sfg_dict = {}
self._window = self self._window = self
self.logger = logging.getLogger(__name__) self.logger = logging.getLogger(__name__)
self.init_ui() self.init_ui()
...@@ -116,7 +114,8 @@ class MainWindow(QMainWindow): ...@@ -116,7 +114,8 @@ class MainWindow(QMainWindow):
self.logger.info("Finished setting up GUI") self.logger.info("Finished setting up GUI")
self.logger.info( self.logger.info(
"For questions please refer to 'Ctrl+?', or visit the 'Help' section on the toolbar.") "For questions please refer to 'Ctrl+?', or visit the 'Help' "
"section on the toolbar.")
def init_ui(self): def init_ui(self):
self.create_toolbar_view() self.create_toolbar_view()
...@@ -139,7 +138,8 @@ class MainWindow(QMainWindow): ...@@ -139,7 +138,8 @@ class MainWindow(QMainWindow):
self.ui.operation_box.setGeometry( self.ui.operation_box.setGeometry(
10, 10, self.ui.operation_box.width(), self.height()) 10, 10, self.ui.operation_box.width(), self.height())
self.graphic_view.setGeometry(self.ui.operation_box.width( self.graphic_view.setGeometry(self.ui.operation_box.width(
) + 20, 60, self.width() - self.ui.operation_box.width() - 20, self.height()-30) ) + 20, 60, self.width() - self.ui.operation_box.width() - 20,
self.height()-30)
super().resizeEvent(event) super().resizeEvent(event)
def wheelEvent(self, event): def wheelEvent(self, event):
...@@ -168,10 +168,10 @@ class MainWindow(QMainWindow): ...@@ -168,10 +168,10 @@ class MainWindow(QMainWindow):
return return
self.logger.info(f"Saving SFG to path: {module}.") self.logger.info(f"Saving SFG to path: {module}.")
operation_positions = dict() operation_positions = {}
for operation_drag, operation_scene in self.dragOperationSceneDict.items(): for op_drag, op_scene in self.dragOperationSceneDict.items():
operation_positions[operation_drag.operation.graph_id] = ( operation_positions[op_drag.operation.graph_id] = (
operation_scene.x(), operation_scene.y()) op_scene.x(), op_scene.y())
try: try:
with open(module, "w+") as file_obj: with open(module, "w+") as file_obj:
...@@ -201,12 +201,14 @@ class MainWindow(QMainWindow): ...@@ -201,12 +201,14 @@ class MainWindow(QMainWindow):
sfg, positions = python_to_sfg(module) sfg, positions = python_to_sfg(module)
except ImportError as e: except ImportError as e:
self.logger.error( self.logger.error(
f"Failed to load module: {module} with the following error: {e}.") f"Failed to load module: {module} with the following error: "
f"{e}.")
return return
while sfg.name in self.sfg_dict: while sfg.name in self.sfg_dict:
self.logger.warning( self.logger.warning(
f"Duplicate SFG with name: {sfg.name} detected. Please choose a new name.") f"Duplicate SFG with name: {sfg.name} detected. "
"Please choose a new name.")
name, accepted = QInputDialog.getText( name, accepted = QInputDialog.getText(
self, "Change SFG Name", "Name: ", QLineEdit.Normal) self, "Change SFG Name", "Name: ", QLineEdit.Normal)
if not accepted: if not accepted:
...@@ -221,10 +223,13 @@ class MainWindow(QMainWindow): ...@@ -221,10 +223,13 @@ class MainWindow(QMainWindow):
def connect_ports(ports): def connect_ports(ports):
for port in ports: for port in ports:
for signal in port.signals: for signal in port.signals:
source = [source for source in self.portDict[self.operationDragDict[signal.source.operation]] source = [source for source in self.portDict[
if source.port is signal.source] self.operationDragDict[signal.source.operation]]
destination = [destination for destination in self.portDict[self.operationDragDict[ if source.port is signal.source]
signal.destination.operation]] if destination.port is signal.destination] destination = [destination for destination in
self.portDict[self.operationDragDict[
signal.destination.operation]]
if destination.port is signal.destination]
if source and destination: if source and destination:
self.connect_button(source[0], destination[0]) self.connect_button(source[0], destination[0])
...@@ -291,40 +296,46 @@ class MainWindow(QMainWindow): ...@@ -291,40 +296,46 @@ class MainWindow(QMainWindow):
and signal.destination.operation.type_name() == signal_2.destination.operation.type_name()): and signal.destination.operation.type_name() == signal_2.destination.operation.type_name()):
return False return False
if hasattr(signal.source.operation, "value") and hasattr(signal_2.source.operation, "value") \ if (hasattr(signal.source.operation, "value") and
and hasattr(signal.destination.operation, "value") and hasattr(signal_2.destination.operation, "value"): hasattr(signal_2.source.operation, "value") and
hasattr(signal.destination.operation, "value") and
hasattr(signal_2.destination.operation, "value")):
if not (signal.source.operation.value == signal_2.source.operation.value if not (signal.source.operation.value == signal_2.source.operation.value
and signal.destination.operation.value == signal_2.destination.operation.value): and signal.destination.operation.value == signal_2.destination.operation.value):
return False return False
if hasattr(signal.source.operation, "name") and hasattr(signal_2.source.operation, "name") \ if (hasattr(signal.source.operation, "name") and
and hasattr(signal.destination.operation, "name") and hasattr(signal_2.destination.operation, "name"): hasattr(signal_2.source.operation, "name") and
hasattr(signal.destination.operation, "name") and
hasattr(signal_2.destination.operation, "name")):
if not (signal.source.operation.name == signal_2.source.operation.name if not (signal.source.operation.name == signal_2.source.operation.name
and signal.destination.operation.name == signal_2.destination.operation.name): and signal.destination.operation.name == signal_2.destination.operation.name):
return False return False
try: try:
_signal_source_index = [signal.source.operation.outputs.index( _signal_source_index = [
port) for port in signal.source.operation.outputs if signal in port.signals] signal.source.operation.outputs.index(port) for port in
_signal_2_source_index = [signal_2.source.operation.outputs.index( signal.source.operation.outputs if signal in port.signals]
port) for port in signal_2.source.operation.outputs if signal_2 in port.signals] _signal_2_source_index = [
signal_2.source.operation.outputs.index(port) for port in
signal_2.source.operation.outputs if signal_2 in port.signals]
except ValueError: except ValueError:
return False # Signal output connections not matching return False # Signal output connections not matching
try: try:
_signal_destination_index = [signal.destination.operation.inputs.index( _signal_destination_index = [
port) for port in signal.destination.operation.inputs if signal in port.signals] signal.destination.operation.inputs.index(port) for port in
_signal_2_destination_index = [signal_2.destination.operation.inputs.index( signal.destination.operation.inputs if signal in port.signals]
port) for port in signal_2.destination.operation.inputs if signal_2 in port.signals] _signal_2_destination_index = [
signal_2.destination.operation.inputs.index(port) for port in
signal_2.destination.operation.inputs if signal_2 in port.signals]
except ValueError: except ValueError:
return False # Signal input connections not matching return False # Signal input connections not matching
if not (_signal_source_index == _signal_2_source_index and _signal_destination_index == _signal_2_destination_index): return (_signal_source_index == _signal_2_source_index and
return False _signal_destination_index == _signal_2_destination_index)
return True
for pressed_op in self.pressed_operations: for _pressed_op in self.pressed_operations:
for operation in sfg.operations: for operation in sfg.operations:
for input_ in operation.inputs: for input_ in operation.inputs:
for signal in input_.signals: for signal in input_.signals:
...@@ -362,7 +373,7 @@ class MainWindow(QMainWindow): ...@@ -362,7 +373,7 @@ class MainWindow(QMainWindow):
55 - 17, operation.operation.output_count) 55 - 17, operation.operation.output_count)
_input_ports_dist = self._determine_port_distance( _input_ports_dist = self._determine_port_distance(
55 - 17, operation.operation.input_count) 55 - 17, operation.operation.input_count)
self.portDict[operation] = list() self.portDict[operation] = []
print(_output_ports_dist) print(_output_ports_dist)
print(_input_ports_dist) print(_input_ports_dist)
...@@ -428,11 +439,11 @@ class MainWindow(QMainWindow): ...@@ -428,11 +439,11 @@ class MainWindow(QMainWindow):
border-color: black; border-width: 2px") border-color: black; border-width: 2px")
self.add_ports(attr_button) self.add_ports(attr_button)
icon_path = path.join(path.dirname( icon_path = os.path.join(os.path.dirname(
__file__), "operation_icons", f"{op.type_name().lower()}.png") __file__), "operation_icons", f"{op.type_name().lower()}.png")
if not path.exists(icon_path): if not os.path.exists(icon_path):
icon_path = path.join(path.dirname( icon_path = os.path.join(os.path.dirname(
__file__), "operation_icons", f"custom_operation.png") __file__), "operation_icons", "custom_operation.png")
attr_button.setIcon(QIcon(icon_path)) attr_button.setIcon(QIcon(icon_path))
attr_button.setIconSize(QSize(55, 55)) attr_button.setIconSize(QSize(55, 55))
attr_button.setToolTip("No SFG") attr_button.setToolTip("No SFG")
......
...@@ -18,7 +18,7 @@ class PropertiesWindow(QDialog): ...@@ -18,7 +18,7 @@ class PropertiesWindow(QDialog):
self.edit_name = QLineEdit(self.operation.operation_path_name) self.edit_name = QLineEdit(self.operation.operation_path_name)
self.name_layout.addWidget(self.name_label) self.name_layout.addWidget(self.name_label)
self.name_layout.addWidget(self.edit_name) self.name_layout.addWidget(self.edit_name)
self.latency_fields = dict() self.latency_fields = {}
self.vertical_layout = QVBoxLayout() self.vertical_layout = QVBoxLayout()
self.vertical_layout.addLayout(self.name_layout) self.vertical_layout.addLayout(self.name_layout)
......
...@@ -11,7 +11,7 @@ class ShowPCWindow(QDialog): ...@@ -11,7 +11,7 @@ class ShowPCWindow(QDialog):
def __init__(self, window): def __init__(self, window):
super().__init__() super().__init__()
self._window = window self._window = window
self.check_box_dict = dict() self.check_box_dict = {}
self.setWindowFlags(Qt.WindowTitleHint | Qt.WindowCloseButtonHint) self.setWindowFlags(Qt.WindowTitleHint | Qt.WindowCloseButtonHint)
self.setWindowTitle("Show precedence graph") self.setWindowTitle("Show precedence graph")
......
...@@ -14,9 +14,9 @@ class SimulateSFGWindow(QDialog): ...@@ -14,9 +14,9 @@ class SimulateSFGWindow(QDialog):
def __init__(self, window): def __init__(self, window):
super().__init__() super().__init__()
self._window = window self._window = window
self.properties = dict() self.properties = {}
self.sfg_to_layout = dict() self.sfg_to_layout = {}
self.input_fields = dict() self.input_fields = {}
self.setWindowFlags(Qt.WindowTitleHint | Qt.WindowCloseButtonHint) self.setWindowFlags(Qt.WindowTitleHint | Qt.WindowCloseButtonHint)
self.setWindowTitle("Simulate SFG") self.setWindowTitle("Simulate SFG")
......
...@@ -387,7 +387,7 @@ class AbstractOperation(Operation, AbstractGraphComponent): ...@@ -387,7 +387,7 @@ class AbstractOperation(Operation, AbstractGraphComponent):
def __str__(self) -> str: def __str__(self) -> str:
"""Get a string representation of this operation.""" """Get a string representation of this operation."""
inputs_dict = dict() inputs_dict = {}
for i, port in enumerate(self.inputs): for i, port in enumerate(self.inputs):
if port.signal_count == 0: if port.signal_count == 0:
inputs_dict[i] = '-' inputs_dict[i] = '-'
...@@ -406,7 +406,7 @@ class AbstractOperation(Operation, AbstractGraphComponent): ...@@ -406,7 +406,7 @@ class AbstractOperation(Operation, AbstractGraphComponent):
dict_ele.append("no_id") dict_ele.append("no_id")
inputs_dict[i] = dict_ele inputs_dict[i] = dict_ele
outputs_dict = dict() outputs_dict = {}
for i, port in enumerate(self.outputs): for i, port in enumerate(self.outputs):
if port.signal_count == 0: if port.signal_count == 0:
outputs_dict[i] = '-' outputs_dict[i] = '-'
...@@ -618,7 +618,7 @@ class AbstractOperation(Operation, AbstractGraphComponent): ...@@ -618,7 +618,7 @@ class AbstractOperation(Operation, AbstractGraphComponent):
@property @property
def latency_offsets(self) -> Sequence[Sequence[int]]: def latency_offsets(self) -> Sequence[Sequence[int]]:
latency_offsets = dict() latency_offsets = {}
for i, inp in enumerate(self.inputs): for i, inp in enumerate(self.inputs):
latency_offsets["in" + str(i)] = inp.latency_offset latency_offsets["in" + str(i)] = inp.latency_offset
......
...@@ -53,7 +53,7 @@ def sfg_to_python(sfg: SFG, counter: int = 0, suffix: str = None) -> str: ...@@ -53,7 +53,7 @@ def sfg_to_python(sfg: SFG, counter: int = 0, suffix: str = None) -> str:
result += "\n# Signals:\n" result += "\n# Signals:\n"
# Keep track of already existing connections to avoid adding duplicates # Keep track of already existing connections to avoid adding duplicates
connections = list() connections = []
for op in sfg.split(): for op in sfg.split():
for out in op.outputs: for out in op.outputs:
for signal in out.signals: for signal in out.signals:
......
...@@ -30,7 +30,7 @@ class Schedule: ...@@ -30,7 +30,7 @@ class Schedule:
def __init__(self, sfg: SFG, schedule_time: Optional[int] = None, cyclic: bool = False, resolution: int = 1, scheduling_alg: str = "ASAP"): def __init__(self, sfg: SFG, schedule_time: Optional[int] = None, cyclic: bool = False, resolution: int = 1, scheduling_alg: str = "ASAP"):
"""Construct a Schedule from an SFG.""" """Construct a Schedule from an SFG."""
self._sfg = sfg self._sfg = sfg
self._start_times = dict() self._start_times = {}
self._laps = defaultdict(lambda: 0) self._laps = defaultdict(lambda: 0)
self._cyclic = cyclic self._cyclic = cyclic
self._resolution = resolution self._resolution = resolution
...@@ -77,11 +77,11 @@ class Schedule: ...@@ -77,11 +77,11 @@ class Schedule:
return slack return slack
def _forward_slacks(self, op_id: GraphID) -> Dict["OutputPort", Dict["Signal", int]]: def _forward_slacks(self, op_id: GraphID) -> Dict["OutputPort", Dict["Signal", int]]:
ret = dict() ret = {}
start_time = self._start_times[op_id] start_time = self._start_times[op_id]
op = self._sfg.find_by_id(op_id) op = self._sfg.find_by_id(op_id)
for output_port in op.outputs: for output_port in op.outputs:
output_slacks = dict() output_slacks = {}
available_time = start_time + output_port.latency_offset available_time = start_time + output_port.latency_offset
for signal in output_port.signals: for signal in output_port.signals:
...@@ -103,11 +103,11 @@ class Schedule: ...@@ -103,11 +103,11 @@ class Schedule:
return slack return slack
def _backward_slacks(self, op_id: GraphID) -> Dict["OutputPort", Dict["Signal", int]]: def _backward_slacks(self, op_id: GraphID) -> Dict["OutputPort", Dict["Signal", int]]:
ret = dict() ret = {}
start_time = self._start_times[op_id] start_time = self._start_times[op_id]
op = self._sfg.find_by_id(op_id) op = self._sfg.find_by_id(op_id)
for input_port in op.inputs: for input_port in op.inputs:
input_slacks = dict() input_slacks = {}
usage_time = start_time + input_port.latency_offset usage_time = start_time + input_port.latency_offset
for signal in input_port.signals: for signal in input_port.signals:
...@@ -309,7 +309,7 @@ class Schedule: ...@@ -309,7 +309,7 @@ class Schedule:
ytickpositions = [] ytickpositions = []
yticklabels = [] yticklabels = []
plt.grid(zorder=0.5) plt.grid(zorder=0.5)
ypositions = dict() ypositions = {}
for op_id, op_start_time in self._start_times.items(): for op_id, op_start_time in self._start_times.items():
op = self._sfg.find_by_id(op_id) op = self._sfg.find_by_id(op_id)
latency_coords, execution_time_coords = op.get_plot_coordinates() latency_coords, execution_time_coords = op.get_plot_coordinates()
......
...@@ -93,7 +93,7 @@ class SFG(AbstractOperation): ...@@ -93,7 +93,7 @@ class SFG(AbstractOperation):
output_count=output_signal_count + output_operation_count, output_count=output_signal_count + output_operation_count,
name=name, input_sources=input_sources) name=name, input_sources=input_sources)
self._components_by_id = dict() self._components_by_id = {}
self._used_ids = set() self._used_ids = set()
self._components_by_name = defaultdict(list) self._components_by_name = defaultdict(list)
self._components_dfs_order = [] self._components_dfs_order = []
......
...@@ -24,7 +24,7 @@ class TestInit: ...@@ -24,7 +24,7 @@ class TestInit:
for op in schedule._sfg.get_operations_topological_order(): for op in schedule._sfg.get_operations_topological_order():
print(op.latency_offsets) print(op.latency_offsets)
start_times_names = dict() start_times_names = {}
for op_id, start_time in schedule._start_times.items(): for op_id, start_time in schedule._start_times.items():
op_name = precedence_sfg_delays.find_by_id(op_id).name op_name = precedence_sfg_delays.find_by_id(op_id).name
start_times_names[op_name] = start_time start_times_names[op_name] = start_time
...@@ -49,7 +49,7 @@ class TestInit: ...@@ -49,7 +49,7 @@ class TestInit:
schedule = Schedule(precedence_sfg_delays, scheduling_alg="ASAP") schedule = Schedule(precedence_sfg_delays, scheduling_alg="ASAP")
start_times_names = dict() start_times_names = {}
for op_id, start_time in schedule._start_times.items(): for op_id, start_time in schedule._start_times.items():
op_name = precedence_sfg_delays.find_by_id(op_id).name op_name = precedence_sfg_delays.find_by_id(op_id).name
start_times_names[op_name] = start_time start_times_names[op_name] = start_time
...@@ -60,7 +60,7 @@ class TestInit: ...@@ -60,7 +60,7 @@ class TestInit:
def test_independent_sfg(self, sfg_two_inputs_two_outputs_independent_with_cmul): def test_independent_sfg(self, sfg_two_inputs_two_outputs_independent_with_cmul):
schedule = Schedule(sfg_two_inputs_two_outputs_independent_with_cmul, scheduling_alg="ASAP") schedule = Schedule(sfg_two_inputs_two_outputs_independent_with_cmul, scheduling_alg="ASAP")
start_times_names = dict() start_times_names = {}
for op_id, start_time in schedule._start_times.items(): for op_id, start_time in schedule._start_times.items():
op_name = sfg_two_inputs_two_outputs_independent_with_cmul.find_by_id(op_id).name op_name = sfg_two_inputs_two_outputs_independent_with_cmul.find_by_id(op_id).name
start_times_names[op_name] = start_time start_times_names[op_name] = start_time
...@@ -100,7 +100,7 @@ class TestRescheduling: ...@@ -100,7 +100,7 @@ class TestRescheduling:
schedule.move_operation(precedence_sfg_delays.find_by_name("ADD3")[0].graph_id, 4) schedule.move_operation(precedence_sfg_delays.find_by_name("ADD3")[0].graph_id, 4)
schedule.move_operation(precedence_sfg_delays.find_by_name("A2")[0].graph_id, 2) schedule.move_operation(precedence_sfg_delays.find_by_name("A2")[0].graph_id, 2)
start_times_names = dict() start_times_names = {}
for op_id, start_time in schedule._start_times.items(): for op_id, start_time in schedule._start_times.items():
op_name = precedence_sfg_delays.find_by_id(op_id).name op_name = precedence_sfg_delays.find_by_id(op_id).name
start_times_names[op_name] = start_time start_times_names[op_name] = start_time
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment