19#include <simics/base/notifier.h>
30class MappableConfObject;
61 bits_(
std::move(rhs.bits_)),
62 number_of_bits_(
std::move(rhs.number_of_bits_)),
63 offset_(
std::move(rhs.offset_)) {
64 rhs.number_of_bits_ = 0;
75 bits_ = std::move(rhs.bits_);
76 number_of_bits_ = rhs.number_of_bits_;
77 rhs.number_of_bits_ = 0;
78 offset_ = rhs.offset_;
84 std::string_view
name()
const override {
93 return number_of_bits_;
98 if (number_of_bits_ != 0) {
100 fmt::format(
"Re-init field ({}) is not allowed",
107 if (parent_ ==
nullptr) {
117 uint64_t
get()
const override {
119 int num_bytes = bits_.size();
120 for (
int i = 0; i < num_bytes; ++i) {
121 const auto &[ptr, mask] = bits_[i];
122 uint64_t
byte = *ptr & mask;
123 result |=
byte << (8 * i);
125 return result >> (offset_ % 8);
128 void set(uint64_t value)
override {
129 bool changed =
false;
130 value <<= (offset_ % 8);
131 int num_bytes = bits_.size();
132 for (
int i = 0; i < num_bytes; ++i) {
133 const auto &[ptr, mask] = bits_[i];
134 uint8_t
byte = *ptr & mask;
135 if (!changed && (value & mask) != byte) {
138 *ptr = (value & mask) | (*ptr & ~mask);
143 SIM_notify(
bank_obj_ref(), Sim_Notify_Bank_Register_Value_Change);
147 uint64_t
read(uint64_t enabled_bits)
override {
148 if (enabled_bits == 0) {
151 return get() & enabled_bits;
154 void write(uint64_t value, uint64_t enabled_bits)
override {
155 if (enabled_bits != 0) {
156 set((enabled_bits & value) | (~enabled_bits &
get()));
169 fmt::format(
"Cannot set bits for field ({}) when"
170 " device has finalized",
175 for (
const auto &[_, bits_mask] : bits_) {
176 number_of_bits_ += std::bitset<8>(bits_mask).count();
186 std::uint8_t number_of_bits_ {0};
188 std::int8_t offset_ {-1};
191 RegisterInterface *parent_ {
nullptr};
Definition: field-interface.h:34
unsigned number_of_bits() const override
Definition: field.h:92
void init(std::string_view desc, const bits_type &bits, int8_t offset) override
Definition: field.h:96
RegisterInterface * parent() const override
Definition: field.h:113
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field.h:154
uint64_t get() const override
Definition: field.h:117
size_t offset() const
Definition: field.h:160
Field & operator=(const Field &)=delete
Field(RegisterInterface *parent, std::string_view field_name)
Definition: field.h:48
const std::string & description() const override
Definition: field.h:88
std::string_view name() const override
Definition: field.h:84
void set_bits(const bits_type &bits)
Definition: field.h:166
Field(Field &&rhs)
Definition: field.h:59
uint64_t read(uint64_t enabled_bits) override
Definition: field.h:147
Field & operator=(Field &&rhs)
Definition: field.h:68
Field(MappableConfObject *dev_obj, const std::string &name)
Definition: field.h:44
void set(uint64_t value) override
Definition: field.h:128
Field(const Field &)=delete
Definition: hierarchical-object.h:43
void init_iface(BankInterface *iface)
Definition: hierarchical-object.h:113
HierarchicalObject & operator=(const HierarchicalObject &)=delete
ConfObjectRef bank_obj_ref() const override
Definition: hierarchical-object.h:181
std::string_view name() const override
Definition: hierarchical-object.h:147
std::string_view parent_name() const override
Definition: hierarchical-object.h:191
const std::string & description() const override
Definition: hierarchical-object.h:156
void set_description(std::string_view desc) override
Definition: hierarchical-object.h:160
MappableConfObject * dev_obj() const override
Definition: hierarchical-object.h:177
const std::string & hierarchical_name() const override
Definition: hierarchical-object.h:143
Definition: mappable-conf-object.h:131
IFACE * get_iface(const std::string &name) const
Definition: mappable-conf-object.h:170
Definition: register-interface.h:36
#define SIM_LOG_ERROR_STR(obj, group, str)
Definition: log.h:40
Definition: attr-value.h:23
std::vector< std::pair< uint8_t *, uint8_t > > bits_type
Definition: field-interface.h:30
Definition: common-types.h:63