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

Bugfixes

parent fe17e1e6
No related branches found
No related tags found
1 merge request!438Bugfixes
Pipeline #123847 passed
......@@ -1242,7 +1242,16 @@ class SFG(AbstractOperation):
self, original_component: GraphComponent
) -> GraphComponent:
if original_component in self._original_components_to_new:
raise ValueError("Tried to add duplicate SFG component")
id = (
original_component.name
if original_component.name
else (
original_component.graph_id
if original_component.graph_id
else original_component.type_name()
)
)
raise ValueError(f"Tried to add duplicate SFG component: {id}")
new_component = original_component.copy()
self._original_components_to_new[original_component] = new_component
if not new_component.graph_id or new_component.graph_id in self._used_ids:
......@@ -1273,7 +1282,16 @@ class SFG(AbstractOperation):
# Connect input ports to new signals.
for original_input_port in original_op.inputs:
if original_input_port.signal_count < 1:
raise ValueError("Unconnected input port in SFG")
id = (
original_op.name
if original_op.name
else (
original_op.graph_id
if original_op.graph_id
else original_op.type_name()
)
)
raise ValueError(f"Unconnected input port in SFG. Operation: {id}")
for original_signal in original_input_port.signals:
# Check if the signal is one of the SFG's input signals.
......@@ -1509,7 +1527,7 @@ class SFG(AbstractOperation):
def sfg_digraph(
self,
show_id: bool = False,
show_signal_id: bool = False,
engine: Optional[str] = None,
branch_node: bool = True,
port_numbering: bool = True,
......@@ -1522,7 +1540,7 @@ class SFG(AbstractOperation):
Parameters
----------
show_id : bool, default: False
show_signal_id : bool, default: False
If True, the graph_id:s of signals are shown.
engine : str, optional
Graphviz layout engine to be used, see https://graphviz.org/documentation/.
......@@ -1554,7 +1572,7 @@ class SFG(AbstractOperation):
if branch_node and source.signal_count > 1
else source.operation.graph_id
)
label = op.graph_id if show_id else None
label = op.graph_id if show_signal_id else None
taillabel = (
str(source.index)
if source.operation.output_count > 1
......@@ -1593,7 +1611,11 @@ class SFG(AbstractOperation):
taillabel=taillabel,
)
else:
dg.node(op.graph_id, shape=_OPERATION_SHAPE[op.type_name()])
dg.node(
op.graph_id,
shape=_OPERATION_SHAPE[op.type_name()],
label=f"{op.name}\n({op.graph_id})" if op.name else None,
)
return dg
def _repr_mimebundle_(self, include=None, exclude=None):
......@@ -1618,7 +1640,7 @@ class SFG(AbstractOperation):
def show(
self,
fmt: Optional[str] = None,
show_id: bool = False,
show_signal_id: bool = False,
engine: Optional[str] = None,
branch_node: bool = True,
port_numbering: bool = True,
......@@ -1634,7 +1656,7 @@ class SFG(AbstractOperation):
https://www.graphviz.org/doc/info/output.html
Most common are "pdf", "eps", "png", and "svg". Default is None which
leads to PDF.
show_id : bool, default: False
show_signal_id : bool, default: False
If True, the graph_id:s of signals are shown.
engine : str, optional
Graphviz layout engine to be used, see https://graphviz.org/documentation/.
......@@ -1649,7 +1671,7 @@ class SFG(AbstractOperation):
"""
dg = self.sfg_digraph(
show_id=show_id,
show_signal_id=show_signal_id,
engine=engine,
branch_node=branch_node,
port_numbering=port_numbering,
......
......@@ -180,13 +180,13 @@ def sfg_simple_filter():
in1---->add1----->t1+---->out1
. .
"""
in1 = Input("IN1")
cmul1 = ConstantMultiplication(0.5, name="CMUL1")
add1 = Addition(in1, cmul1, "ADD1")
in1 = Input("IN")
cmul1 = ConstantMultiplication(0.5, name="CMUL")
add1 = Addition(in1, cmul1, "ADD")
add1.input(1).signals[0].name = "S2"
t1 = Delay(add1, name="T1")
t1 = Delay(add1, name="T")
cmul1.input(0).connect(t1, "S1")
out1 = Output(t1, "OUT1")
out1 = Output(t1, "OUT")
return SFG(inputs=[in1], outputs=[out1], name="simple_filter")
......
......@@ -163,15 +163,15 @@ class TestPrintSfg:
+ "Internal Operations:\n"
+ "--------------------------------------------------------------------"
+ "--------------------------------\n"
+ str(sfg_simple_filter.find_by_name("IN1")[0])
+ str(sfg_simple_filter.find_by_name("IN")[0])
+ "\n"
+ str(sfg_simple_filter.find_by_name("ADD1")[0])
+ str(sfg_simple_filter.find_by_name("ADD")[0])
+ "\n"
+ str(sfg_simple_filter.find_by_name("T1")[0])
+ str(sfg_simple_filter.find_by_name("T")[0])
+ "\n"
+ str(sfg_simple_filter.find_by_name("CMUL1")[0])
+ str(sfg_simple_filter.find_by_name("CMUL")[0])
+ "\n"
+ str(sfg_simple_filter.find_by_name("OUT1")[0])
+ str(sfg_simple_filter.find_by_name("OUT")[0])
+ "\n"
+ "--------------------------------------------------------------------"
+ "--------------------------------\n"
......@@ -958,11 +958,11 @@ class TestTopologicalOrderOperations:
topological_order = sfg_simple_filter.get_operations_topological_order()
assert [comp.name for comp in topological_order] == [
"IN1",
"ADD1",
"T1",
"CMUL1",
"OUT1",
"IN",
"ADD",
"T",
"CMUL",
"OUT",
]
def test_multiple_independent_inputs(self, sfg_two_inputs_two_outputs_independent):
......@@ -1007,26 +1007,25 @@ class TestRemove:
assert {
op.name
for op in sfg_simple_filter.find_by_name("T1")[0].subsequent_operations
} == {"CMUL1", "OUT1"}
for op in sfg_simple_filter.find_by_name("T")[0].subsequent_operations
} == {"CMUL", "OUT"}
assert {
op.name for op in new_sfg.find_by_name("T1")[0].subsequent_operations
} == {"ADD1", "OUT1"}
op.name for op in new_sfg.find_by_name("T")[0].subsequent_operations
} == {"ADD", "OUT"}
assert {
op.name
for op in sfg_simple_filter.find_by_name("ADD1")[0].preceding_operations
} == {"CMUL1", "IN1"}
for op in sfg_simple_filter.find_by_name("ADD")[0].preceding_operations
} == {"CMUL", "IN"}
assert {
op.name for op in new_sfg.find_by_name("ADD1")[0].preceding_operations
} == {"T1", "IN1"}
op.name for op in new_sfg.find_by_name("ADD")[0].preceding_operations
} == {"T", "IN"}
assert "S1" in {
sig.name
for sig in sfg_simple_filter.find_by_name("T1")[0].output(0).signals
sig.name for sig in sfg_simple_filter.find_by_name("T")[0].output(0).signals
}
assert "S2" in {
sig.name for sig in new_sfg.find_by_name("T1")[0].output(0).signals
sig.name for sig in new_sfg.find_by_name("T")[0].output(0).signals
}
def test_remove_multiple_inputs_outputs(self, butterfly_operation_tree):
......@@ -1217,59 +1216,105 @@ class TestPrecedenceGraph:
class TestSFGGraph:
def test_sfg(self, sfg_simple_filter):
res = (
'digraph {\n\trankdir=LR splines=spline\n\tin0 [shape=cds]\n\tin0 -> add0'
' [headlabel=0]\n\tout0 [shape=cds]\n\tt0 -> out0\n\tadd0'
' [shape=ellipse]\n\tcmul0 -> add0 [headlabel=1]\n\tcmul0'
' [shape=ellipse]\n\tadd0 -> t0\n\tt0 [shape=square]\n\tt0 -> cmul0\n}'
)
assert sfg_simple_filter.sfg_digraph(branch_node=False).source in (
res = """digraph {
rankdir=LR splines=spline
in0 [label="IN
(in0)" shape=cds]
in0 -> add0 [headlabel=0]
out0 [label="OUT
(out0)" shape=cds]
"t0.0" -> out0
"t0.0" [shape=point]
t0 -> "t0.0" [arrowhead=none]
add0 [label="ADD
(add0)" shape=ellipse]
cmul0 -> add0 [headlabel=1]
cmul0 [label="CMUL
(cmul0)" shape=ellipse]
add0 -> t0
t0 [label="T
(t0)" shape=square]
"t0.0" -> cmul0
}"""
assert sfg_simple_filter.sfg_digraph().source in (
res,
res + "\n",
)
def test_sfg_show_id(self, sfg_simple_filter):
res = (
'digraph {\n\trankdir=LR splines=spline\n\tin0 [shape=cds]\n\tin0 -> add0'
' [label=s0 headlabel=0]\n\tout0 [shape=cds]\n\tt0 -> out0'
' [label=s1]\n\tadd0 [shape=ellipse]\n\tcmul0 -> add0 [label=s2'
' headlabel=1]\n\tcmul0 [shape=ellipse]\n\tadd0 -> t0 [label=s3]\n\tt0'
' [shape=square]\n\tt0 -> cmul0 [label=s4]\n}'
)
assert sfg_simple_filter.sfg_digraph(
show_id=True, branch_node=False
).source in (
def test_sfg_show_signal_id(self, sfg_simple_filter):
res = """digraph {
rankdir=LR splines=spline
in0 [label="IN
(in0)" shape=cds]
in0 -> add0 [label=s0 headlabel=0]
out0 [label="OUT
(out0)" shape=cds]
"t0.0" -> out0 [label=s1]
"t0.0" [shape=point]
t0 -> "t0.0" [arrowhead=none]
add0 [label="ADD
(add0)" shape=ellipse]
cmul0 -> add0 [label=s2 headlabel=1]
cmul0 [label="CMUL
(cmul0)" shape=ellipse]
add0 -> t0 [label=s3]
t0 [label="T
(t0)" shape=square]
"t0.0" -> cmul0 [label=s4]
}"""
assert sfg_simple_filter.sfg_digraph(show_signal_id=True).source in (
res,
res + "\n",
)
def test_sfg_branch(self, sfg_simple_filter):
res = (
'digraph {\n\trankdir=LR splines=spline\n\tin0 [shape=cds]\n\tin0 -> add0'
' [headlabel=0]\n\tout0 [shape=cds]\n\t"t0.0" -> out0\n\t"t0.0"'
' [shape=point]\n\tt0 -> "t0.0" [arrowhead=none]\n\tadd0'
' [shape=ellipse]\n\tcmul0 -> add0 [headlabel=1]\n\tcmul0'
' [shape=ellipse]\n\tadd0 -> t0\n\tt0 [shape=square]\n\t"t0.0" ->'
' cmul0\n}'
)
assert sfg_simple_filter.sfg_digraph().source in (
def test_sfg_no_branch(self, sfg_simple_filter):
res = """digraph {
rankdir=LR splines=spline
in0 [label="IN
(in0)" shape=cds]
in0 -> add0 [headlabel=0]
out0 [label="OUT
(out0)" shape=cds]
t0 -> out0
add0 [label="ADD
(add0)" shape=ellipse]
cmul0 -> add0 [headlabel=1]
cmul0 [label="CMUL
(cmul0)" shape=ellipse]
add0 -> t0
t0 [label="T
(t0)" shape=square]
t0 -> cmul0
}"""
assert sfg_simple_filter.sfg_digraph(branch_node=False).source in (
res,
res + "\n",
)
def test_sfg_no_port_numbering(self, sfg_simple_filter):
res = (
'digraph {\n\trankdir=LR splines=spline\n\tin0 [shape=cds]\n\tin0 ->'
' add0\n\tout0 [shape=cds]\n\tt0 -> out0\n\tadd0 [shape=ellipse]\n\tcmul0'
' -> add0\n\tcmul0 [shape=ellipse]\n\tadd0 -> t0\n\tt0 [shape=square]\n\tt0'
' -> cmul0\n}'
)
assert sfg_simple_filter.sfg_digraph(
port_numbering=False, branch_node=False
).source in (
res = """digraph {
rankdir=LR splines=spline
in0 [label="IN
(in0)" shape=cds]
in0 -> add0
out0 [label="OUT
(out0)" shape=cds]
"t0.0" -> out0
"t0.0" [shape=point]
t0 -> "t0.0" [arrowhead=none]
add0 [label="ADD
(add0)" shape=ellipse]
cmul0 -> add0
cmul0 [label="CMUL
(cmul0)" shape=ellipse]
add0 -> t0
t0 [label="T
(t0)" shape=square]
"t0.0" -> cmul0
}"""
assert sfg_simple_filter.sfg_digraph(port_numbering=False).source in (
res,
res + "\n",
)
......
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