Skip to content
Snippets Groups Projects

Initial work on constant propagation

Open Oscar Gustafsson requested to merge constantpropagation into master
Files
2
+ 99
2
@@ -5,13 +5,13 @@ Contains some of the most commonly used mathematical operations.
@@ -5,13 +5,13 @@ Contains some of the most commonly used mathematical operations.
"""
"""
from numbers import Number
from numbers import Number
from typing import Dict, Optional
from typing import Dict, Iterable, Optional, Set
from numpy import abs as np_abs
from numpy import abs as np_abs
from numpy import conjugate, sqrt
from numpy import conjugate, sqrt
from b_asic.graph_component import Name, TypeName
from b_asic.graph_component import Name, TypeName
from b_asic.operation import AbstractOperation
from b_asic.operation import AbstractOperation, Operation
from b_asic.port import SignalSourceProvider
from b_asic.port import SignalSourceProvider
@@ -125,6 +125,14 @@ class Addition(AbstractOperation):
@@ -125,6 +125,14 @@ class Addition(AbstractOperation):
def evaluate(self, a, b):
def evaluate(self, a, b):
return a + b
return a + b
 
def _propagate_some_constants(
 
self,
 
constants: Iterable[Optional[Number]],
 
valid_operations: Optional[Set["Operation"]] = None,
 
) -> None:
 
if any(c == 0.0 for c in constants):
 
print("One input is 0!")
 
class Subtraction(AbstractOperation):
class Subtraction(AbstractOperation):
"""
"""
@@ -185,6 +193,14 @@ class Subtraction(AbstractOperation):
@@ -185,6 +193,14 @@ class Subtraction(AbstractOperation):
def evaluate(self, a, b):
def evaluate(self, a, b):
return a - b
return a - b
 
def _propagate_some_constants(
 
self,
 
constants: Iterable[Optional[Number]],
 
valid_operations: Optional[Set["Operation"]] = None,
 
) -> None:
 
if any(c == 0.0 for c in constants):
 
print("One input is 0!")
 
class AddSub(AbstractOperation):
class AddSub(AbstractOperation):
r"""
r"""
@@ -266,6 +282,20 @@ class AddSub(AbstractOperation):
@@ -266,6 +282,20 @@ class AddSub(AbstractOperation):
"""Set if operation is add."""
"""Set if operation is add."""
self.set_param("is_add", is_add)
self.set_param("is_add", is_add)
 
def _propagate_some_constants(
 
self,
 
constants: Iterable[Optional[Number]],
 
valid_operations: Optional[Set["Operation"]] = None,
 
) -> None:
 
if any(c == 0.0 for c in constants):
 
print("One input is 0!")
 
 
def _propagate_constant_parameters(
 
self, valid_operations: Optional[Set["Operation"]] = None
 
) -> None:
 
print(f"Can turn into {'Addition' if self.is_add else 'Subtraction'}")
 
return
 
class Multiplication(AbstractOperation):
class Multiplication(AbstractOperation):
r"""
r"""
@@ -327,6 +357,17 @@ class Multiplication(AbstractOperation):
@@ -327,6 +357,17 @@ class Multiplication(AbstractOperation):
def evaluate(self, a, b):
def evaluate(self, a, b):
return a * b
return a * b
 
def _propagate_some_constants(
 
self,
 
constants: Iterable[Optional[Number]],
 
valid_operations: Optional[Set["Operation"]] = None,
 
) -> None:
 
if any(c == 0.0 for c in constants):
 
print("One input is 0!")
 
if any(c == 1.0 for c in constants):
 
print("One input is 1!")
 
print("Can turn into ConstantMultiplication")
 
class Division(AbstractOperation):
class Division(AbstractOperation):
r"""
r"""
@@ -368,6 +409,17 @@ class Division(AbstractOperation):
@@ -368,6 +409,17 @@ class Division(AbstractOperation):
def evaluate(self, a, b):
def evaluate(self, a, b):
return a / b
return a / b
 
def _propagate_some_constants(
 
self,
 
constants: Iterable[Optional[Number]],
 
valid_operations: Optional[Set["Operation"]] = None,
 
) -> None:
 
numerator, denominator = constants
 
if numerator == 0.0:
 
print("Result is 0!")
 
if denominator is not None:
 
print("Can turn into ConstantMultiplication")
 
class Min(AbstractOperation):
class Min(AbstractOperation):
r"""
r"""
@@ -619,6 +671,15 @@ class ConstantMultiplication(AbstractOperation):
@@ -619,6 +671,15 @@ class ConstantMultiplication(AbstractOperation):
"""Set the constant value of this operation."""
"""Set the constant value of this operation."""
self.set_param("value", value)
self.set_param("value", value)
 
def _propagate_constant_parameters(
 
self, valid_operations: Optional[Set["Operation"]] = None
 
) -> None:
 
if self.value == 0.0:
 
print("Constant is zero!")
 
if self.value == 1.0:
 
print("Constant is zero!")
 
return
 
class Butterfly(AbstractOperation):
class Butterfly(AbstractOperation):
r"""
r"""
@@ -661,6 +722,14 @@ class Butterfly(AbstractOperation):
@@ -661,6 +722,14 @@ class Butterfly(AbstractOperation):
def evaluate(self, a, b):
def evaluate(self, a, b):
return a + b, a - b
return a + b, a - b
 
def _propagate_some_constants(
 
self,
 
constants: Iterable[Optional[Number]],
 
valid_operations: Optional[Set["Operation"]] = None,
 
) -> None:
 
if any(c == 0.0 for c in constants):
 
print("One input is 0!")
 
class MAD(AbstractOperation):
class MAD(AbstractOperation):
r"""
r"""
@@ -700,6 +769,19 @@ class MAD(AbstractOperation):
@@ -700,6 +769,19 @@ class MAD(AbstractOperation):
def evaluate(self, a, b, c):
def evaluate(self, a, b, c):
return a * b + c
return a * b + c
 
def _propagate_some_constants(
 
self,
 
constants: Iterable[Optional[Number]],
 
valid_operations: Optional[Set["Operation"]] = None,
 
) -> None:
 
a, b, c = constants
 
if a == 0.0 or b == 0.0:
 
print("One multiplier input is zero!")
 
if a == 1.0 or b == 1.0:
 
print("One multiplier input is one!")
 
if any(c == 0.0):
 
print("Adder input is zero!")
 
class SymmetricTwoportAdaptor(AbstractOperation):
class SymmetricTwoportAdaptor(AbstractOperation):
r"""
r"""
@@ -752,6 +834,21 @@ class SymmetricTwoportAdaptor(AbstractOperation):
@@ -752,6 +834,21 @@ class SymmetricTwoportAdaptor(AbstractOperation):
"""Set the constant value of this operation."""
"""Set the constant value of this operation."""
self.set_param("value", value)
self.set_param("value", value)
 
def _propagate_some_constants(
 
self,
 
constants: Iterable[Optional[Number]],
 
valid_operations: Optional[Set["Operation"]] = None,
 
) -> None:
 
if any(c == 0.0 for c in constants):
 
print("One input is 0!")
 
 
def _propagate_constant_parameters(
 
self, valid_operations: Optional[Set["Operation"]] = None
 
) -> None:
 
if self.value == 0.0:
 
print("Constant is zero!")
 
return
 
class Reciprocal(AbstractOperation):
class Reciprocal(AbstractOperation):
r"""
r"""
Loading