diff --git a/b_asic/GUI/about_window.py b/b_asic/GUI/about_window.py index f6ca3ae815e7bf7cd9c4066ed43565712b0b33ce..2322d94954f97cc6235f846fb508ce485637adaf 100644 --- a/b_asic/GUI/about_window.py +++ b/b_asic/GUI/about_window.py @@ -1,4 +1,5 @@ -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 diff --git a/b_asic/GUI/main_window.py b/b_asic/GUI/main_window.py index bcfe780e4569b53ce428a667a1d1a9c986f783aa..c650337a26d95b2d6057b4d002a3c84b2e3d2ced 100644 --- a/b_asic/GUI/main_window.py +++ b/b_asic/GUI/main_window.py @@ -5,7 +5,7 @@ This file opens the main window of the GUI for B-ASIC when run. from pprint import pprint -from os import getcwd, path +import os import importlib import logging import sys @@ -22,23 +22,21 @@ from b_asic.GUI.select_sfg_window import SelectSFGWindow # from b_asic import FastSimulation from b_asic.simulation import Simulation as FastSimulation -from b_asic.operation import Operation -from b_asic.port import InputPort, OutputPort +from b_asic.port import OutputPort from b_asic.signal_flow_graph import SFG from b_asic.special_operations import Input, Output import b_asic.core_operations as c_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 -from qtpy.QtWidgets import QApplication, QWidget, QMainWindow, QLabel, QAction,\ - QStatusBar, QMenuBar, QLineEdit, QPushButton, QSlider, QScrollArea, QVBoxLayout,\ - QHBoxLayout, QDockWidget, QToolBar, QMenu, QLayout, QSizePolicy, QListWidget,\ - QListWidgetItem, QGraphicsView, QGraphicsScene, QShortcut, QGraphicsTextItem,\ - QGraphicsProxyWidget, QInputDialog, QTextEdit, QFileDialog -from qtpy.QtCore import Qt, QSize, QFileInfo -from qtpy.QtGui import QIcon, QFont, QPainter, QPen, QBrush, QKeySequence +from qtpy.QtWidgets import ( + QApplication, QMainWindow, QAction, QLineEdit, QListWidgetItem, + QGraphicsView, QGraphicsScene, QShortcut, QFileDialog, QGraphicsTextItem, + QInputDialog) +from qtpy.QtCore import QFileInfo, QSize, Qt +from qtpy.QtGui import QIcon, QKeySequence, QPainter MIN_WIDTH_SCENE = 600 @@ -54,19 +52,19 @@ class MainWindow(QMainWindow): self.ui.setupUi(self) self.setWindowIcon(QIcon('small_logo.png')) self.scene = None - self._operations_from_name = dict() + self._operations_from_name = {} self.zoom = 1 self.sfg_name_i = 0 - self.dragOperationSceneDict = dict() - self.operationDragDict = dict() + self.dragOperationSceneDict = {} + self.operationDragDict = {} self.operationItemSceneList = [] self.signalList = [] self.pressed_operations = [] - self.portDict = dict() - self.signalPortDict = dict() - self.opToSFG = dict() + self.portDict = {} + self.signalPortDict = {} + self.opToSFG = {} self.pressed_ports = [] - self.sfg_dict = dict() + self.sfg_dict = {} self._window = self self.logger = logging.getLogger(__name__) self.init_ui() @@ -116,7 +114,8 @@ class MainWindow(QMainWindow): self.logger.info("Finished setting up GUI") 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): self.create_toolbar_view() @@ -139,7 +138,8 @@ class MainWindow(QMainWindow): self.ui.operation_box.setGeometry( 10, 10, self.ui.operation_box.width(), self.height()) 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) def wheelEvent(self, event): @@ -168,10 +168,10 @@ class MainWindow(QMainWindow): return self.logger.info(f"Saving SFG to path: {module}.") - operation_positions = dict() - for operation_drag, operation_scene in self.dragOperationSceneDict.items(): - operation_positions[operation_drag.operation.graph_id] = ( - operation_scene.x(), operation_scene.y()) + operation_positions = {} + for op_drag, op_scene in self.dragOperationSceneDict.items(): + operation_positions[op_drag.operation.graph_id] = ( + op_scene.x(), op_scene.y()) try: with open(module, "w+") as file_obj: @@ -201,12 +201,14 @@ class MainWindow(QMainWindow): sfg, positions = python_to_sfg(module) except ImportError as e: 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 while sfg.name in self.sfg_dict: 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( self, "Change SFG Name", "Name: ", QLineEdit.Normal) if not accepted: @@ -221,10 +223,13 @@ class MainWindow(QMainWindow): def connect_ports(ports): for port in ports: for signal in port.signals: - source = [source for source in self.portDict[self.operationDragDict[signal.source.operation]] - if source.port is signal.source] - destination = [destination for destination in self.portDict[self.operationDragDict[ - signal.destination.operation]] if destination.port is signal.destination] + source = [source for source in self.portDict[ + self.operationDragDict[signal.source.operation]] + if source.port is signal.source] + destination = [destination for destination in + self.portDict[self.operationDragDict[ + signal.destination.operation]] + if destination.port is signal.destination] if source and destination: self.connect_button(source[0], destination[0]) @@ -291,40 +296,46 @@ class MainWindow(QMainWindow): and signal.destination.operation.type_name() == signal_2.destination.operation.type_name()): return False - if hasattr(signal.source.operation, "value") and hasattr(signal_2.source.operation, "value") \ - and hasattr(signal.destination.operation, "value") and hasattr(signal_2.destination.operation, "value"): + if (hasattr(signal.source.operation, "value") and + 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 and signal.destination.operation.value == signal_2.destination.operation.value): return False - if hasattr(signal.source.operation, "name") and hasattr(signal_2.source.operation, "name") \ - and hasattr(signal.destination.operation, "name") and hasattr(signal_2.destination.operation, "name"): + if (hasattr(signal.source.operation, "name") and + 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 and signal.destination.operation.name == signal_2.destination.operation.name): return False try: - _signal_source_index = [signal.source.operation.outputs.index( - port) for port in signal.source.operation.outputs if signal 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] + _signal_source_index = [ + signal.source.operation.outputs.index(port) for port in + signal.source.operation.outputs if signal 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: return False # Signal output connections not matching try: - _signal_destination_index = [signal.destination.operation.inputs.index( - port) for port in signal.destination.operation.inputs if signal 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] + _signal_destination_index = [ + signal.destination.operation.inputs.index(port) for port in + signal.destination.operation.inputs if signal 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: 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 False - - return True + return (_signal_source_index == _signal_2_source_index and + _signal_destination_index == _signal_2_destination_index) - for pressed_op in self.pressed_operations: + for _pressed_op in self.pressed_operations: for operation in sfg.operations: for input_ in operation.inputs: for signal in input_.signals: @@ -362,7 +373,7 @@ class MainWindow(QMainWindow): 55 - 17, operation.operation.output_count) _input_ports_dist = self._determine_port_distance( 55 - 17, operation.operation.input_count) - self.portDict[operation] = list() + self.portDict[operation] = [] print(_output_ports_dist) print(_input_ports_dist) @@ -428,11 +439,11 @@ class MainWindow(QMainWindow): border-color: black; border-width: 2px") 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") - if not path.exists(icon_path): - icon_path = path.join(path.dirname( - __file__), "operation_icons", f"custom_operation.png") + if not os.path.exists(icon_path): + icon_path = os.path.join(os.path.dirname( + __file__), "operation_icons", "custom_operation.png") attr_button.setIcon(QIcon(icon_path)) attr_button.setIconSize(QSize(55, 55)) attr_button.setToolTip("No SFG") diff --git a/b_asic/GUI/properties_window.py b/b_asic/GUI/properties_window.py index e24e7bf58a2aef66cfbd722172891e51ee998f07..3aba3d280409fb16a31a28e4583dfc3357aec8e5 100644 --- a/b_asic/GUI/properties_window.py +++ b/b_asic/GUI/properties_window.py @@ -18,7 +18,7 @@ class PropertiesWindow(QDialog): self.edit_name = QLineEdit(self.operation.operation_path_name) self.name_layout.addWidget(self.name_label) self.name_layout.addWidget(self.edit_name) - self.latency_fields = dict() + self.latency_fields = {} self.vertical_layout = QVBoxLayout() self.vertical_layout.addLayout(self.name_layout) diff --git a/b_asic/GUI/show_pc_window.py b/b_asic/GUI/show_pc_window.py index c3cbd32b4d37e6a5fdb7cd9a7914bd0301ea70c1..f5d575377461860ac5dad095aa733bc200e8234d 100644 --- a/b_asic/GUI/show_pc_window.py +++ b/b_asic/GUI/show_pc_window.py @@ -11,7 +11,7 @@ class ShowPCWindow(QDialog): def __init__(self, window): super().__init__() self._window = window - self.check_box_dict = dict() + self.check_box_dict = {} self.setWindowFlags(Qt.WindowTitleHint | Qt.WindowCloseButtonHint) self.setWindowTitle("Show precedence graph") diff --git a/b_asic/GUI/simulate_sfg_window.py b/b_asic/GUI/simulate_sfg_window.py index c3df452f1a98a49b8407ebd509e18d08586ee307..9cb69e26ad6fa7fe5863be62085cc91595bb0e28 100644 --- a/b_asic/GUI/simulate_sfg_window.py +++ b/b_asic/GUI/simulate_sfg_window.py @@ -14,9 +14,9 @@ class SimulateSFGWindow(QDialog): def __init__(self, window): super().__init__() self._window = window - self.properties = dict() - self.sfg_to_layout = dict() - self.input_fields = dict() + self.properties = {} + self.sfg_to_layout = {} + self.input_fields = {} self.setWindowFlags(Qt.WindowTitleHint | Qt.WindowCloseButtonHint) self.setWindowTitle("Simulate SFG") diff --git a/b_asic/operation.py b/b_asic/operation.py index c4d557503621ad14b00720959c11bc6c758bcb25..293b47526bfb8f216e13bc0537e1360040d2f01e 100644 --- a/b_asic/operation.py +++ b/b_asic/operation.py @@ -387,7 +387,7 @@ class AbstractOperation(Operation, AbstractGraphComponent): def __str__(self) -> str: """Get a string representation of this operation.""" - inputs_dict = dict() + inputs_dict = {} for i, port in enumerate(self.inputs): if port.signal_count == 0: inputs_dict[i] = '-' @@ -406,7 +406,7 @@ class AbstractOperation(Operation, AbstractGraphComponent): dict_ele.append("no_id") inputs_dict[i] = dict_ele - outputs_dict = dict() + outputs_dict = {} for i, port in enumerate(self.outputs): if port.signal_count == 0: outputs_dict[i] = '-' @@ -618,7 +618,7 @@ class AbstractOperation(Operation, AbstractGraphComponent): @property def latency_offsets(self) -> Sequence[Sequence[int]]: - latency_offsets = dict() + latency_offsets = {} for i, inp in enumerate(self.inputs): latency_offsets["in" + str(i)] = inp.latency_offset diff --git a/b_asic/save_load_structure.py b/b_asic/save_load_structure.py index 222e474193691ce9b1ca9b7320dc5ffd6fd9b75d..caa5755e8871280d899d96ea24ba03e3b2d68886 100644 --- a/b_asic/save_load_structure.py +++ b/b_asic/save_load_structure.py @@ -53,7 +53,7 @@ def sfg_to_python(sfg: SFG, counter: int = 0, suffix: str = None) -> str: result += "\n# Signals:\n" # Keep track of already existing connections to avoid adding duplicates - connections = list() + connections = [] for op in sfg.split(): for out in op.outputs: for signal in out.signals: diff --git a/b_asic/schedule.py b/b_asic/schedule.py index d0bb566850353bb12681b34ef0dbc12030e11eb7..8d0dfafe4beaf17b24f67a3bb52b08f0bcde66e2 100644 --- a/b_asic/schedule.py +++ b/b_asic/schedule.py @@ -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"): """Construct a Schedule from an SFG.""" self._sfg = sfg - self._start_times = dict() + self._start_times = {} self._laps = defaultdict(lambda: 0) self._cyclic = cyclic self._resolution = resolution @@ -77,11 +77,11 @@ class Schedule: return slack def _forward_slacks(self, op_id: GraphID) -> Dict["OutputPort", Dict["Signal", int]]: - ret = dict() + ret = {} start_time = self._start_times[op_id] op = self._sfg.find_by_id(op_id) for output_port in op.outputs: - output_slacks = dict() + output_slacks = {} available_time = start_time + output_port.latency_offset for signal in output_port.signals: @@ -103,11 +103,11 @@ class Schedule: return slack def _backward_slacks(self, op_id: GraphID) -> Dict["OutputPort", Dict["Signal", int]]: - ret = dict() + ret = {} start_time = self._start_times[op_id] op = self._sfg.find_by_id(op_id) for input_port in op.inputs: - input_slacks = dict() + input_slacks = {} usage_time = start_time + input_port.latency_offset for signal in input_port.signals: @@ -309,7 +309,7 @@ class Schedule: ytickpositions = [] yticklabels = [] plt.grid(zorder=0.5) - ypositions = dict() + ypositions = {} for op_id, op_start_time in self._start_times.items(): op = self._sfg.find_by_id(op_id) latency_coords, execution_time_coords = op.get_plot_coordinates() diff --git a/b_asic/signal_flow_graph.py b/b_asic/signal_flow_graph.py index 15e624d33944269089d02b73adc45930d7147afb..42c0cdefd3af54add2ff13eae402ba8ef2a56a81 100644 --- a/b_asic/signal_flow_graph.py +++ b/b_asic/signal_flow_graph.py @@ -93,7 +93,7 @@ class SFG(AbstractOperation): output_count=output_signal_count + output_operation_count, name=name, input_sources=input_sources) - self._components_by_id = dict() + self._components_by_id = {} self._used_ids = set() self._components_by_name = defaultdict(list) self._components_dfs_order = [] diff --git a/test/test_schedule.py b/test/test_schedule.py index 10c0913fe2de24a21df062bbb6f52488a417bac9..f75e85023144317965d58801228d5a783f959dc8 100644 --- a/test/test_schedule.py +++ b/test/test_schedule.py @@ -24,7 +24,7 @@ class TestInit: for op in schedule._sfg.get_operations_topological_order(): print(op.latency_offsets) - start_times_names = dict() + start_times_names = {} for op_id, start_time in schedule._start_times.items(): op_name = precedence_sfg_delays.find_by_id(op_id).name start_times_names[op_name] = start_time @@ -49,7 +49,7 @@ class TestInit: 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(): op_name = precedence_sfg_delays.find_by_id(op_id).name start_times_names[op_name] = start_time @@ -60,7 +60,7 @@ class TestInit: 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") - start_times_names = dict() + start_times_names = {} 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 start_times_names[op_name] = start_time @@ -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("A2")[0].graph_id, 2) - start_times_names = dict() + start_times_names = {} for op_id, start_time in schedule._start_times.items(): op_name = precedence_sfg_delays.find_by_id(op_id).name start_times_names[op_name] = start_time