diff --git a/b_asic/GUI/main_window.py b/b_asic/GUI/main_window.py index 909681dfa15ca92a552d035421423c543049add9..b4e94b8091fc01a05b73050ae7ed8ae4d67aa29e 100644 --- a/b_asic/GUI/main_window.py +++ b/b_asic/GUI/main_window.py @@ -210,18 +210,22 @@ class MainWindow(QMainWindow): self.logger.info(f"Saved SFG to path: {module}.") - def save_work(self): + def save_work(self, arg): + print("Save: ", arg) self.sfg_widget = SelectSFGWindow(self) self.sfg_widget.show() # Wait for input to dialog. self.sfg_widget.ok.connect(self._save_work) - def load_work(self): + def load_work(self, arg): + print("Load: ", arg) module, accepted = QFileDialog().getOpenFileName() if not accepted: return + self._load_from_file(module) + def _load_from_file(self, module): self.logger.info(f"Loading SFG from path: {module}.") try: sfg, positions = python_to_sfg(module) @@ -244,6 +248,12 @@ class MainWindow(QMainWindow): return sfg.name = name + self._load_sfg(sfg, positions) + self.logger.info(f"Loaded SFG from path: {module}.") + + def _load_sfg(self, sfg, positions=None): + if positions is None: + positions = {} for op in sfg.split(): self.create_operation( @@ -285,7 +295,6 @@ class MainWindow(QMainWindow): self.opToSFG[self.operationDragDict[op]] = sfg self.sfg_dict[sfg.name] = sfg - self.logger.info(f"Loaded SFG from path: {module}.") self.update() def exit_app(self): diff --git a/examples/twotapfirsfg.py b/examples/twotapfirsfg.py new file mode 100644 index 0000000000000000000000000000000000000000..1456dbba99a0cdd1c4d0f7f5d22e33e49e92af1c --- /dev/null +++ b/examples/twotapfirsfg.py @@ -0,0 +1,35 @@ + +""" +B-ASIC automatically generated SFG file. +Name: twotapfir +Last saved: 2023-01-23 11:29:09.423052. +""" +from b_asic import SFG, Signal, Input, Output, ConstantMultiplication, Delay, Input, Output, Addition +# Inputs: +in1 = Input(name="") + +# Outputs: +out1 = Output(name="") + +# Operations: +cmul1 = ConstantMultiplication(value=0.5, name="cmul", latency_offsets={'in0': None, 'out0': None}) +in1 = Input(name="") +add1 = Addition(name="", latency_offsets={'in0': None, 'in1': None, 'out0': None}) +cmul2 = ConstantMultiplication(value=0.5, name="cmul2", latency_offsets={'in0': None, 'out0': None}) +out1 = Output(name="") +t1 = Delay(initial_value=0, name="") +in1 = Input(name="") + +# Signals: + +Signal(source=cmul1.output(0), destination=add1.input(1)) +Signal(source=in1.output(0), destination=cmul1.input(0)) +Signal(source=in1.output(0), destination=t1.input(0)) +Signal(source=add1.output(0), destination=out1.input(0)) +Signal(source=cmul2.output(0), destination=add1.input(0)) +Signal(source=t1.output(0), destination=cmul2.input(0)) +twotapfir = SFG(inputs=[in1], outputs=[out1], name='twotapfir') + +# SFG Properties: +prop = {'name':twotapfir} +positions = {'in1': (-264.0, -202.0), 't1': (-135.0, -204.0), 'out1': (216.0, 92.0), 'cmul1': (-181.0, -67.0), 'cmul2': (-27.0, -66.0), 'add1': (91.0, 93.0)} diff --git a/test/conftest.py b/test/conftest.py index 637da5fa37a3609c3a4d5e29d8d2c1dca80576da..9f33ab9d1059470ffb16558ec2e737d163abdf51 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -3,4 +3,21 @@ from test.fixtures.port import * from test.fixtures.signal import signal, signals from test.fixtures.signal_flow_graph import * +from distutils import dir_util +import os + import pytest + + +@pytest.fixture +def datadir(tmpdir, request): + print(tmpdir, request) + filename = request.module.__file__ + print(filename) + test_dir, ext = os.path.splitext(filename) + print(test_dir, ext) + + if os.path.isdir(test_dir): + dir_util.copy_tree(test_dir, str(tmpdir)) + + return tmpdir diff --git a/test/test_gui.py b/test/test_gui.py index cbd73be198ba9fb5a6cca1bb711a14f891829a96..ec977a0c5fdb6e3493c52c2352b91f0f068d16d4 100644 --- a/test/test_gui.py +++ b/test/test_gui.py @@ -11,3 +11,15 @@ def test_start(qtbot): qtbot.addWidget(widget) widget.exit_app() + + +def test_load(qtbot, datadir): + widget = GUI.MainWindow() + qtbot.addWidget(widget) + widget._load_from_file(datadir.join('twotapfir.py')) + assert 'twotapfir' in widget.sfg_dict + widget.clear_workspace() + assert 'twotapfir' not in widget.sfg_dict + assert not widget.sfg_dict + + widget.exit_app() diff --git a/test/test_gui/twotapfir.py b/test/test_gui/twotapfir.py new file mode 100644 index 0000000000000000000000000000000000000000..dd9edd6a478df5263970267e27f769d7ff5e9f61 --- /dev/null +++ b/test/test_gui/twotapfir.py @@ -0,0 +1,58 @@ +""" +B-ASIC automatically generated SFG file. +Name: twotapfir +Last saved: 2023-01-23 11:29:09.423052. +""" +from b_asic import ( + SFG, + Signal, + Input, + Output, + ConstantMultiplication, + Delay, + Input, + Output, + Addition, +) + +# Inputs: +in1 = Input(name="") + +# Outputs: +out1 = Output(name="") + +# Operations: +cmul1 = ConstantMultiplication( + value=0.5, name="cmul", latency_offsets={'in0': None, 'out0': None} +) +in1 = Input(name="") +add1 = Addition( + name="", latency_offsets={'in0': None, 'in1': None, 'out0': None} +) +cmul2 = ConstantMultiplication( + value=0.5, name="cmul2", latency_offsets={'in0': None, 'out0': None} +) +out1 = Output(name="") +t1 = Delay(initial_value=0, name="") +in1 = Input(name="") + +# Signals: + +Signal(source=cmul1.output(0), destination=add1.input(1)) +Signal(source=in1.output(0), destination=cmul1.input(0)) +Signal(source=in1.output(0), destination=t1.input(0)) +Signal(source=add1.output(0), destination=out1.input(0)) +Signal(source=cmul2.output(0), destination=add1.input(0)) +Signal(source=t1.output(0), destination=cmul2.input(0)) +twotapfir = SFG(inputs=[in1], outputs=[out1], name='twotapfir') + +# SFG Properties: +prop = {'name': twotapfir} +positions = { + 'in1': (-264.0, -202.0), + 't1': (-135.0, -204.0), + 'out1': (216.0, 92.0), + 'cmul1': (-181.0, -67.0), + 'cmul2': (-27.0, -66.0), + 'add1': (91.0, 93.0), +} diff --git a/test/test_scheduler_gui.py b/test/test_scheduler_gui.py index ebfdad70c6e5a94c37c550dc0d16a81b13b2f92e..9dc4abcecc490c911105b94185e9a39565091cf7 100644 --- a/test/test_scheduler_gui.py +++ b/test/test_scheduler_gui.py @@ -2,6 +2,7 @@ import pytest from b_asic.core_operations import Addition, ConstantMultiplication from b_asic.schedule import Schedule + try: import b_asic.scheduler_gui as GUI except ImportError: