"""
Class definitions corresponding to Nada operations.
"""
from dataclasses import dataclass
from nada_dsl import SourceRef
from nada_dsl.ast_util import (
AST_OPERATIONS,
BinaryASTOperation,
IfElseASTOperation,
RandomASTOperation,
UnaryASTOperation,
next_operation_id,
)
from nada_dsl.nada_types import AllTypes
[docs]
class BinaryOperation:
"""Superclass of all the binary operations."""
def __init__(self, left: AllTypes, right: AllTypes, source_ref: SourceRef):
self.id = next_operation_id()
self.left = left
self.right = right
self.source_ref = source_ref
[docs]
def store_in_ast(self, ty: object):
"""Store object in AST"""
AST_OPERATIONS[self.id] = BinaryASTOperation(
id=self.id,
name=self.__class__.__name__,
left=self.left.inner.id,
right=self.right.inner.id,
source_ref=self.source_ref,
ty=ty,
)
[docs]
class UnaryOperation:
"""Superclass of all the unary operations."""
def __init__(self, inner: AllTypes, source_ref: SourceRef):
self.id = next_operation_id()
self.inner = inner
self.source_ref = source_ref
[docs]
def store_in_ast(self, ty: object):
"""Store object in AST."""
AST_OPERATIONS[self.id] = UnaryASTOperation(
id=self.id,
name=self.__class__.__name__,
inner=self.inner.inner.id,
source_ref=self.source_ref,
ty=ty,
)
[docs]
class Addition(BinaryOperation):
"""Addition operation"""
[docs]
class Subtraction(BinaryOperation):
"""Subtraction operation."""
[docs]
class Multiplication(BinaryOperation):
"""Multiplication operation"""
[docs]
class Division(BinaryOperation):
"""Division operation"""
[docs]
class Modulo(BinaryOperation):
"""Modulo operation"""
[docs]
class Power(BinaryOperation):
"""Power operation"""
[docs]
class RightShift(BinaryOperation):
"""Right shift (>>) operation."""
[docs]
class LeftShift(BinaryOperation):
"""Left shift (<<)operation."""
[docs]
class LessThan(BinaryOperation):
"""Less than (<) operation"""
[docs]
class GreaterThan(BinaryOperation):
"""Greater than (>) operation."""
[docs]
class LessOrEqualThan(BinaryOperation):
"""Less or equal (<=) operation."""
[docs]
class GreaterOrEqualThan(BinaryOperation):
"""Greater or equal (>=) operation."""
[docs]
class Equals(BinaryOperation):
"""Equals (==) operation"""
[docs]
class NotEquals(BinaryOperation):
"""Not equals (!=) operation."""
[docs]
class PublicOutputEquality(BinaryOperation):
"""Public output equality operation."""
[docs]
class BooleanAnd(BinaryOperation):
"""Boolean AND (&) operation."""
[docs]
class BooleanOr(BinaryOperation):
"""Boolean OR (|) operation."""
[docs]
class BooleanXor(BinaryOperation):
"""Boolean XOR (^) operation."""
[docs]
class Random:
"""Random operation."""
source_ref: SourceRef
def __init__(self, source_ref):
self.id = next_operation_id()
self.source_ref = source_ref
[docs]
def store_in_ast(self, ty):
"""Store object in AST."""
AST_OPERATIONS[self.id] = RandomASTOperation(
id=self.id, ty=ty, source_ref=self.source_ref
)
[docs]
@dataclass
class IfElse:
"""
cond.if_else(left, right)
"""
this: AllTypes # cond
arg_0: AllTypes # left
arg_1: AllTypes # right
source_ref: SourceRef
def __init__(
self, this: AllTypes, arg_0: AllTypes, arg_1: AllTypes, source_ref: SourceRef
):
self.id = next_operation_id()
self.this = this
self.arg_0 = arg_0
self.arg_1 = arg_1
self.source_ref = source_ref
[docs]
def store_in_ast(self, ty):
"""Store object in AST."""
AST_OPERATIONS[self.id] = IfElseASTOperation(
id=self.id,
this=self.this.inner.id,
arg_0=self.arg_0.inner.id,
arg_1=self.arg_1.inner.id,
ty=ty,
source_ref=self.source_ref,
)
[docs]
class Reveal(UnaryOperation):
"""Reveal (i.e. make public) operation."""
def __init__(self, this: AllTypes, source_ref: SourceRef):
super().__init__(inner=this, source_ref=source_ref)
[docs]
class TruncPr(BinaryOperation):
"""Probabilistic Truncation operation."""
[docs]
class Not(UnaryOperation):
"""Not (!) Operation"""
def __init__(self, this: AllTypes, source_ref: SourceRef):
super().__init__(inner=this, source_ref=source_ref)
[docs]
class EcdsaSign(BinaryOperation):
"""Ecdsa signing operation."""