blob: bf6cfeaed8d6604826d24ced00a7c64a9928730b [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*!
* \file extension.cc
* \brief Example of a tvm-ffi based library that registers various functions.
*/
#include <tvm/ffi/tvm_ffi.h>
#include <cstdint>
namespace my_ffi_extension {
namespace ffi = tvm::ffi;
// [tvm_ffi_abi.begin]
static int AddTwo(int x) { return x + 2; }
TVM_FFI_DLL_EXPORT_TYPED_FUNC(add_two, AddTwo)
// [tvm_ffi_abi.end]
// [global_function.begin]
static int AddOne(int x) { return x + 1; }
TVM_FFI_STATIC_INIT_BLOCK() {
namespace refl = tvm::ffi::reflection;
refl::GlobalDef() //
.def("my_ffi_extension.add_one", AddOne);
}
// [global_function.end]
/*!
* \brief Raise a runtime error to demonstrate error propagation.
*
* \param msg The error message to raise.
*
* \code{.py}
* import my_ffi_extension
* try:
* my_ffi_extension.raise_error("boom")
* except RuntimeError:
* pass
* \endcode
*/
static void RaiseError(const ffi::String& msg) { TVM_FFI_THROW(RuntimeError) << msg; }
TVM_FFI_STATIC_INIT_BLOCK() {
namespace refl = tvm::ffi::reflection;
refl::GlobalDef() //
.def("my_ffi_extension.raise_error", RaiseError);
}
// [object.begin]
class IntPairObj : public ffi::Object {
public:
int64_t a;
int64_t b;
IntPairObj(int64_t a, int64_t b) : a(a), b(b) {}
int64_t Sum() const { return a + b; }
static constexpr bool _type_mutable = true;
TVM_FFI_DECLARE_OBJECT_INFO_FINAL(
/*type_key=*/"my_ffi_extension.IntPair",
/*class=*/IntPairObj,
/*parent_class=*/ffi::Object);
};
TVM_FFI_STATIC_INIT_BLOCK() {
namespace refl = tvm::ffi::reflection;
refl::ObjectDef<IntPairObj>()
.def(refl::init<int64_t, int64_t>())
.def_rw("a", &IntPairObj::a, "the first field")
.def_rw("b", &IntPairObj::b, "the second field")
.def("sum", &IntPairObj::Sum, "IntPairObj::Sum() method");
}
// [object.end]
} // namespace my_ffi_extension