// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #ifdef ROCROLLER_USE_LLVM #include #endif #include #include #include "Base.hpp" #include "Containers.hpp" #include "Variant.hpp" namespace rocRoller { namespace Serialization { template struct MappingTraits { using iot = IOTraits; static void mapping(IO& io, TOp& op, Context& ctx) { iot::mapRequired(io, "dest", op.dest); iot::mapRequired(io, "a", op.a); } static void mapping(IO& io, TOp& val) { AssertFatal((std::same_as)); Context ctx; mapping(io, val, ctx); } }; template struct MappingTraits { using iot = IOTraits; static void mapping(IO& io, TOp& op, Context& ctx) { iot::mapRequired(io, "dest", op.dest); iot::mapRequired(io, "a", op.a); iot::mapRequired(io, "b", op.b); } static void mapping(IO& io, TOp& val) { AssertFatal((std::same_as)); Context ctx; mapping(io, val, ctx); } }; template struct MappingTraits { using iot = IOTraits; static void mapping(IO& io, TOp& op, Context& ctx) { iot::mapRequired(io, "dest", op.dest); iot::mapRequired(io, "a", op.a); iot::mapRequired(io, "b", op.b); iot::mapRequired(io, "c", op.c); } static void mapping(IO& io, TOp& val) { AssertFatal((std::same_as)); Context ctx; mapping(io, val, ctx); } }; template <> struct DefaultConstruct { static Operations::XOp call() { return Operations::E_Neg(Operations::OperationTag(-1)); } }; template <> struct DefaultConstruct { static Operations::XOp call() { return Operations::E_Abs(Operations::OperationTag(-1)); } }; template <> struct DefaultConstruct { static Operations::XOp call() { return Operations::E_Not(Operations::OperationTag(-1)); } }; template <> struct DefaultConstruct { static Operations::XOp call() { return Operations::E_Cvt(Operations::OperationTag(-1), DataType::None); } }; template <> struct DefaultConstruct { static Operations::XOp call() { return Operations::E_StochasticRoundingCvt( Operations::OperationTag(-1), Operations::OperationTag(-1), DataType::None); } }; template <> struct DefaultConstruct { static Operations::XOp call() { return Operations::E_Add(Operations::OperationTag(-1), Operations::OperationTag(-1)); } }; template <> struct DefaultConstruct { static Operations::XOp call() { return Operations::E_Sub(Operations::OperationTag(-1), Operations::OperationTag(-1)); } }; template <> struct DefaultConstruct { static Operations::XOp call() { return Operations::E_Mul(Operations::OperationTag(-1), Operations::OperationTag(-1)); } }; template <> struct DefaultConstruct { static Operations::XOp call() { return Operations::E_Div(Operations::OperationTag(-1), Operations::OperationTag(-1)); } }; template <> struct DefaultConstruct { static Operations::XOp call() { return Operations::E_And(Operations::OperationTag(-1), Operations::OperationTag(-1)); } }; template <> struct DefaultConstruct { static Operations::XOp call() { return Operations::E_Or(Operations::OperationTag(-1), Operations::OperationTag(-1)); } }; template <> struct DefaultConstruct { static Operations::XOp call() { return Operations::E_GreaterThan(Operations::OperationTag(-1), Operations::OperationTag(-1)); } }; template <> struct DefaultConstruct { static Operations::XOp call() { return Operations::E_Conditional(Operations::OperationTag(-1), Operations::OperationTag(-1), Operations::OperationTag(-1)); } }; template <> struct DefaultConstruct { static Operations::XOp call() { return Operations::E_RandomNumber(Operations::OperationTag(-1)); } }; template struct MappingTraits : public DefaultVariantMappingTraits { }; template struct MappingTraits, IO, Context> { using TOp = std::shared_ptr; using iot = IOTraits; static void mapping(IO& io, TOp& op, Context& ctx) { if(!iot::outputting(io)) op = std::make_shared( Operations::E_Neg(Operations::OperationTag{-1})); MappingTraits::mapping(io, *op, ctx); } static void mapping(IO& io, TOp& val) { AssertFatal((std::same_as)); Context ctx; mapping(io, val, ctx); } }; template struct SequenceTraits>, IO> : public DefaultSequenceTraits>, IO, false> { }; } }