From b07dc0acb5f2c256a687f94a3286e66d489fd957 Mon Sep 17 00:00:00 2001
From: Oscar Gustafsson <oscar.gustafsson@gmail.com>
Date: Thu, 6 Apr 2023 15:43:52 +0200
Subject: [PATCH] Add is_constant to Signal

---
 b_asic/operation.py |  4 ++--
 b_asic/signal.py    |  9 +++++++++
 test/test_signal.py | 17 ++++++++++++++++-
 3 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/b_asic/operation.py b/b_asic/operation.py
index 557210ba..dd5a93d0 100644
--- a/b_asic/operation.py
+++ b/b_asic/operation.py
@@ -477,7 +477,7 @@ class Operation(GraphComponent, SignalSourceProvider):
     @abstractmethod
     def is_constant(self) -> bool:
         """
-        Return True if the output of the operation is constant.
+        Return True if the output(s) of the operation is(are) constant.
         """
         raise NotImplementedError
 
@@ -948,7 +948,7 @@ class AbstractOperation(Operation, AbstractGraphComponent):
         for i, input_port in enumerate(self.inputs):
             value = input_values[i]
             if bits_override is None and input_port.signal_count >= 1:
-                input_port.signals[0].bits
+                bits_override = input_port.signals[0].bits
             if bits_override is not None:
                 if isinstance(value, complex):
                     raise TypeError(
diff --git a/b_asic/signal.py b/b_asic/signal.py
index 1a05940a..5f4e0948 100644
--- a/b_asic/signal.py
+++ b/b_asic/signal.py
@@ -193,3 +193,12 @@ class Signal(AbstractGraphComponent):
             if bits < 0:
                 raise ValueError("Bits cannot be negative")
         self.set_param("bits", bits)
+
+    @property
+    def is_constant(self) -> bool:
+        """
+        Return True if the value of the signal (source) is constant.
+        """
+        if self.source is None:
+            raise ValueError("Signal source not set")
+        return self.source.operation.is_constant
diff --git a/test/test_signal.py b/test/test_signal.py
index 33fd69f6..ca2c57f6 100644
--- a/test/test_signal.py
+++ b/test/test_signal.py
@@ -4,9 +4,10 @@ B-ASIC test suit for the signal module which consists of the Signal class.
 
 import pytest
 
-from b_asic.core_operations import Addition, Butterfly, ConstantMultiplication
+from b_asic.core_operations import Addition, Butterfly, Constant, ConstantMultiplication
 from b_asic.port import InputPort, OutputPort
 from b_asic.signal import Signal
+from b_asic.special_operations import Input
 
 
 def test_signal_creation_and_disconnection_and_connection_changing():
@@ -105,6 +106,16 @@ def test_create_from_single_input_single_output():
     assert signal.source.operation.name == "Zig"
 
 
+def test_signal_is_constant():
+    c = Constant(0.5, name="Foo")
+    signal = Signal(c)
+    assert signal.is_constant
+
+    i = Input()
+    signal = Signal(i)
+    assert not signal.is_constant
+
+
 def test_signal_errors():
     cm1 = ConstantMultiplication(0.5, name="Foo")
     add1 = Addition(name="Zig")
@@ -146,3 +157,7 @@ def test_signal_errors():
         ),
     ):
         signal.set_source(bf)
+
+    signal = Signal()
+    with pytest.raises(ValueError, match="Signal source not set"):
+        signal.is_constant
-- 
GitLab