Source code for nada_dsl.operations

"""
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."""