18#ifndef SIMICS_AFTER_BANK_H
19#define SIMICS_AFTER_BANK_H
38template<
typename Class,
typename... Args>
44 : func_(func), name_(
name + typeid(func).
name()),
45 obj_(nullptr), dev_obj_(nullptr), hierarchical_object_name_(
"") {}
47 std::string
name()
const override {
51 void set_args(
const attr_value_t &value)
override {
54 dev_obj_ = std::get<0>(t);
55 hierarchical_object_name_ = std::get<1>(t);
56 set_args_impl(t, std::index_sequence_for<Args...>{});
65 auto rest = std::tuple_cat(
66 std::make_tuple(dev_obj_, hierarchical_object_name_),
72 void invoke()
override {
73 auto level =
static_cast<Level>(
75 hierarchical_object_name_));
76 auto *dev = from_obj<MappableConfObject>(dev_obj_);
80 hierarchical_object_name_));
84 hierarchical_object_name_));
88 hierarchical_object_name_));
91 SIM_LOG_ERROR(dev_obj_, 0,
92 "%s is not a valid hierarchical object name",
93 hierarchical_object_name_.c_str());
95 invoke_impl(std::index_sequence_for<Args...>{});
99 template<std::size_t... I>
100 void invoke_impl(std::index_sequence<I...>) {
101 (obj_->*func_)(std::get<I>(args_)...);
105 template <std::size_t... Is>
106 void set_args_impl(
const std::tuple<ConfObjectRef, std::string,
107 Args...>& input_tuple,
108 std::index_sequence<Is...>) {
109 args_ = std::make_tuple(std::get<Is + 2>(input_tuple)...);
114 Class *obj_ {
nullptr};
115 ConfObjectRef dev_obj_;
116 std::string hierarchical_object_name_;
117 std::tuple<Args...> args_;
122template<
typename Class,
typename... Args>
124 const std::string &name) {
130#define REGISTER_REG_BANK_AFTER_CALL(f) \
131 simics::AfterCall::addIface(simics::make_reg_bank_function_call( \
Definition: after-interface.h:27
An interface implemented by a Simics bank.
Definition: bank-interface.h:47
Represents Simics C type conf_object_t.
Definition: conf-object.h:38
Definition: field-interface.h:34
static std::string_view::size_type level_of_hierarchical_name(std::string_view name)
Definition: after-bank.h:39
attr_value_t get_value() override
Definition: after-bank.h:64
std::string name() const override
Definition: after-bank.h:47
AfterCallInterface * make_copy() override
Definition: after-bank.h:59
RegBankFunctionCall(RegBankFunctionType func, const std::string &name)
Definition: after-bank.h:43
void(Class::*)(Args...) RegBankFunctionType
Definition: after-bank.h:41
void set_args(const attr_value_t &value) override
Definition: after-bank.h:51
Definition: register-interface.h:37
Definition: after-bank.h:33
constexpr auto make_reg_bank_function_call(void(Class::*func)(Args...), const std::string &name)
Definition: after-bank.h:123
std::enable_if< std::is_enum< T >::value, attr_value_t >::type std_to_attr(const T &src)
Function transforms C++ enum type T to Simics attr_value_t.
Definition: attribute-traits.h:163
std::enable_if< std::is_enum< T >::value, T >::type attr_to_std(attr_value_t src)
Function transforms Simics attr_value_t to C++ enum type.
Definition: attribute-traits.h:207
Level
Enum representing the hierarchy level of an object.
Definition: hierarchical-object-interface.h:37