16#ifndef SIMICS_FIELD_TEMPLATES_H
17#define SIMICS_FIELD_TEMPLATES_H
32template <
typename TField = Field,
typename... Args>
34 static_assert(std::is_base_of<Field, TField>::value,
35 "TField must be derived from Field");
39 : TField(reg_iface,
name, args ...) {
50 void write(uint64_t value, uint64_t enabled_bits)
override {}
58 uint64_t
read(uint64_t enabled_bits)
override {
60 fmt::format(
"Read from read-zero field {} -> 0x0.",
69 using Read0Field::Read0Field;
71 uint64_t
read(uint64_t enabled_bits)
override {
73 fmt::format(
"Read from write-only field {} -> 0x0.",
85 void write(uint64_t value, uint64_t enabled_bits)
override {
86 if ((value & enabled_bits) != (
get() & enabled_bits)) {
88 fmt::format(
"Write to read-only field {} (value written"
89 " = {:#010x}, contents = {:#010x}).",
90 name(), value & enabled_bits,
get()));
96 bool logged_once_ {
false};
108 void write(uint64_t value, uint64_t enabled_bits)
override {
119 uint64_t
read(uint64_t enabled_bits)
override {
120 uint64_t value =
get();
122 return value & enabled_bits;
133 void write(uint64_t value, uint64_t enabled_bits)
override {
145 void write(uint64_t value, uint64_t enabled_bits)
override {
156 read_val_(read_val) {}
161 read_val_(read_val) {}
163 uint64_t
read(uint64_t enabled_bits)
override {
164 return read_val_ & enabled_bits;
177 init_val_(init_val) {}
182 init_val_(init_val) {}
184 void write(uint64_t value, uint64_t enabled_bits)
override {
185 if ((value & enabled_bits) != (
get() & enabled_bits)) {
187 fmt::format(
"Write to constant field {} (value written"
188 " = {:#010x}, contents = {:#010x}).",
name(),
189 value & enabled_bits,
get()));
196 Field::init(desc, bits,
offset);
201 bool logged_once_ {
false};
211 void write(uint64_t value, uint64_t enabled_bits)
override {}
231 std::numeric_limits<uint64_t>::max()) {}
235 std::numeric_limits<uint64_t>::max()) {}
242 using IgnoreWriteField::IgnoreWriteField;
244 uint64_t
read(uint64_t enabled_bits)
override {
255 void write(uint64_t value, uint64_t enabled_bits)
override {
256 if (!has_logged_ && (value & enabled_bits) != (
get() & enabled_bits)) {
258 fmt::format(
"Write to reserved field {} (value written"
259 " = {:#010x}, contents = {:#010x}), will not warn"
260 " again.",
name(), value & enabled_bits,
get()));
267 bool has_logged_ {
false};
284 uint64_t
read(uint64_t enabled_bits)
override {
285 return get() & enabled_bits;
304 uint64_t
read(uint64_t enabled_bits)
override {
305 return get() & enabled_bits;
308 void write(uint64_t value, uint64_t enabled_bits)
override {
309 if ((value & enabled_bits) != (
get() & enabled_bits)) {
311 fmt::format(
"Write to unimplemented field {} (value written"
312 " = {:#010x}, contents = {:#010x}).",
313 name(), value & enabled_bits,
get()));
320 bool logged_once_ {
false};
337 void write(uint64_t value, uint64_t enabled_bits)
override {
338 if ((value & enabled_bits) != (
get() & enabled_bits)) {
340 fmt::format(
"Write to unimplemented field {} (value written"
341 " = {:#010x}, contents = {:#010x}).",
342 name(), value & enabled_bits,
get()));
349 bool logged_once_ {
false};
359 uint64_t
read(uint64_t enabled_bits)
override {
360 return get() & enabled_bits;
363 void write(uint64_t value, uint64_t enabled_bits)
override {
364 if ((value & enabled_bits) != (
get() & enabled_bits)) {
366 fmt::format(
"Write to unimplemented field {} (value written"
367 " = {:#010x}, contents = {:#010x}).",
368 name(), value & enabled_bits,
get()));
375 bool logged_once_ {
false};
384 uint64_t
read(uint64_t enabled_bits)
override {
386 fmt::format(
"Read from poorly or non-documented field {}"
387 " (contents = {:#010x}).",
388 name(),
get() & enabled_bits));
389 logged_once_read_ =
true;
390 return get() & enabled_bits;
393 void write(uint64_t value, uint64_t enabled_bits)
override {
395 fmt::format(
"Write to poorly or non-documented field {} (value"
396 " written = {:#010x}, contents = {:#010x}).",
397 name(), value & enabled_bits,
get()));
398 logged_once_write_ =
true;
403 bool logged_once_read_ {
false};
404 bool logged_once_write_ {
false};
418 +
" This field is a dummy field with no side effects. "
423 std::string_view field_name)
426 +
" This field is a dummy field with no side effects. "
436 void write(uint64_t value, uint64_t enabled_bits)
override {
439 fmt::format(
"Write to write-once field {} (value written"
440 " = {:#010x}, contents = {:#010x})",
441 name(), value & enabled_bits,
get()));
449 bool written_ {
false};
457 using ReadOnlyField::ReadOnlyField;
459 uint64_t
read(uint64_t enabled_bits)
override {
460 uint64_t value =
get();
462 return value & enabled_bits;
Definition: field-templates.h:115
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:119
Definition: field-templates.h:172
ConstantField(MappableConfObject *obj, const std::string &name, uint64_t init_val)
Definition: field-templates.h:174
ConstantField(RegisterInterface *parent, std::string_view field_name, uint64_t init_val)
Definition: field-templates.h:179
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:184
void init(std::string_view desc, const bits_type &bits, int8_t offset) override
Definition: field-templates.h:194
Definition: field-templates.h:413
DesignLimitationField(RegisterInterface *parent, std::string_view field_name)
Definition: field-templates.h:422
DesignLimitationField(MappableConfObject *obj, const std::string &name)
Definition: field-templates.h:415
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
const std::string & description() const override
Definition: field.h:88
std::string_view name() const override
Definition: field.h:84
Field(MappableConfObject *dev_obj, const std::string &name)
Definition: field.h:44
void set(uint64_t value) override
Definition: field.h:128
ConfObjectRef bank_obj_ref() const override
Definition: hierarchical-object.h:181
void set_description(std::string_view desc) override
Definition: hierarchical-object.h:160
Definition: field-templates.h:240
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:244
Definition: field-templates.h:46
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:50
Definition: mappable-conf-object.h:131
Definition: field-templates.h:227
OnesField(RegisterInterface *parent, std::string_view field_name)
Definition: field-templates.h:233
OnesField(MappableConfObject *obj, const std::string &name)
Definition: field-templates.h:229
Definition: field-templates.h:54
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:58
Definition: field-templates.h:151
ReadConstantField(MappableConfObject *obj, const std::string &name, uint64_t read_val)
Definition: field-templates.h:153
ReadConstantField(RegisterInterface *parent, std::string_view field_name, uint64_t read_val)
Definition: field-templates.h:158
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:163
Definition: field-templates.h:455
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:459
Definition: field-templates.h:81
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:85
Definition: field-templates.h:272
ReadUnimplField(RegisterInterface *parent, std::string_view field_name)
Definition: field-templates.h:279
ReadUnimplField(MappableConfObject *obj, const std::string &name)
Definition: field-templates.h:274
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:284
Definition: field-templates.h:33
RegisterField(RegisterInterface *reg_iface, Name name, Description desc, Offset offset, BitWidth size, Args... args)
Definition: field-templates.h:37
Definition: register-interface.h:36
virtual void parse_field(const field_t &f)=0
Definition: field-templates.h:251
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:255
Definition: field-templates.h:207
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:211
Definition: field-templates.h:355
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:359
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:363
Definition: field-templates.h:380
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:384
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:393
Definition: field-templates.h:292
UnimplField(MappableConfObject *obj, const std::string &name)
Definition: field-templates.h:294
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:308
UnimplField(RegisterInterface *parent, std::string_view field_name)
Definition: field-templates.h:299
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:304
Definition: field-templates.h:141
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:145
Definition: field-templates.h:104
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:108
Definition: field-templates.h:129
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:133
Definition: field-templates.h:432
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:436
Definition: field-templates.h:67
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:71
Definition: field-templates.h:325
WriteUnimplField(MappableConfObject *obj, const std::string &name)
Definition: field-templates.h:327
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:337
WriteUnimplField(RegisterInterface *parent, std::string_view field_name)
Definition: field-templates.h:332
Definition: field-templates.h:216
ZerosField(MappableConfObject *obj, const std::string &name)
Definition: field-templates.h:218
ZerosField(RegisterInterface *parent, std::string_view field_name)
Definition: field-templates.h:221
Literal type that extends size_t type.
Definition: common-types.h:27
Definition: hierarchical-object-name.h:37
#define SIM_LOG_UNIMPLEMENTED_STR(level, obj, group, str)
Definition: log.h:37
#define SIM_LOG_INFO_STR(level, obj, group, str)
Special macro to handle string object (for example, fmt::format)
Definition: log.h:31
#define SIM_LOG_SPEC_VIOLATION_STR(level, obj, group, str)
Definition: log.h:34
Definition: attr-value.h:23
std::vector< std::pair< uint8_t *, uint8_t > > bits_type
Definition: field-interface.h:30
std::string_view Description
Type used to describe a resource.
Definition: common-types.h:43
Definition: common-types.h:63