16#ifndef SIMICS_FIELD_TEMPLATES_H
17#define SIMICS_FIELD_TEMPLATES_H
19#include <fmt/fmt/format.h>
35template <
typename TField = Field,
typename... Args>
37 static_assert(std::is_base_of<Field, TField>::value,
38 "TField must be derived from Field");
42 : TField(reg_iface,
name, args ...) {
53 void write(uint64_t value, uint64_t enabled_bits)
override {}
61 uint64_t
read(uint64_t enabled_bits)
override {
63 fmt::format(
"Read from read-zero field {} -> 0x0.",
72 using Read0Field::Read0Field;
74 uint64_t
read(uint64_t enabled_bits)
override {
76 fmt::format(
"Read from write-only field {} -> 0x0.",
88 void write(uint64_t value, uint64_t enabled_bits)
override {
89 if ((value & enabled_bits) != (
get() & enabled_bits)) {
91 fmt::format(
"Write to read-only field {} (value written"
92 " = {:#010x}, contents = {:#010x}).",
93 name(), value & enabled_bits,
get()));
99 bool logged_once_ {
false};
111 void write(uint64_t value, uint64_t enabled_bits)
override {
122 uint64_t
read(uint64_t enabled_bits)
override {
123 uint64_t value =
get();
125 return value & enabled_bits;
136 void write(uint64_t value, uint64_t enabled_bits)
override {
148 void write(uint64_t value, uint64_t enabled_bits)
override {
159 read_val_(read_val) {}
164 read_val_(read_val) {}
166 uint64_t
read(uint64_t enabled_bits)
override {
167 return read_val_ & enabled_bits;
180 init_val_(init_val) {}
185 init_val_(init_val) {}
187 void write(uint64_t value, uint64_t enabled_bits)
override {
188 if ((value & enabled_bits) != (
get() & enabled_bits)) {
190 fmt::format(
"Write to constant field {} (value written"
191 " = {:#010x}, contents = {:#010x}).",
name(),
192 value & enabled_bits,
get()));
199 Field::init(desc, bits,
offset);
204 bool logged_once_ {
false};
214 void write(uint64_t value, uint64_t enabled_bits)
override {}
234 (
std::numeric_limits<uint64_t>::max)()) {}
238 (
std::numeric_limits<uint64_t>::max)()) {}
245 using IgnoreWriteField::IgnoreWriteField;
247 uint64_t
read(uint64_t enabled_bits)
override {
258 void write(uint64_t value, uint64_t enabled_bits)
override {
259 if (!has_logged_ && (value & enabled_bits) != (
get() & enabled_bits)) {
261 fmt::format(
"Write to reserved field {} (value written"
262 " = {:#010x}, contents = {:#010x}), will not warn"
263 " again.",
name(), value & enabled_bits,
get()));
270 bool has_logged_ {
false};
287 uint64_t
read(uint64_t enabled_bits)
override {
288 return get() & enabled_bits;
307 uint64_t
read(uint64_t enabled_bits)
override {
308 return get() & enabled_bits;
311 void write(uint64_t value, uint64_t enabled_bits)
override {
312 if ((value & enabled_bits) != (
get() & enabled_bits)) {
314 fmt::format(
"Write to unimplemented field {} (value written"
315 " = {:#010x}, contents = {:#010x}).",
316 name(), value & enabled_bits,
get()));
323 bool logged_once_ {
false};
340 void write(uint64_t value, uint64_t enabled_bits)
override {
341 if ((value & enabled_bits) != (
get() & enabled_bits)) {
343 fmt::format(
"Write to unimplemented field {} (value written"
344 " = {:#010x}, contents = {:#010x}).",
345 name(), value & enabled_bits,
get()));
352 bool logged_once_ {
false};
362 uint64_t
read(uint64_t enabled_bits)
override {
363 return get() & enabled_bits;
366 void write(uint64_t value, uint64_t enabled_bits)
override {
367 if ((value & enabled_bits) != (
get() & enabled_bits)) {
369 fmt::format(
"Write to unimplemented field {} (value written"
370 " = {:#010x}, contents = {:#010x}).",
371 name(), value & enabled_bits,
get()));
378 bool logged_once_ {
false};
387 uint64_t
read(uint64_t enabled_bits)
override {
389 fmt::format(
"Read from poorly or non-documented field {}"
390 " (contents = {:#010x}).",
391 name(),
get() & enabled_bits));
392 logged_once_read_ =
true;
393 return get() & enabled_bits;
396 void write(uint64_t value, uint64_t enabled_bits)
override {
398 fmt::format(
"Write to poorly or non-documented field {} (value"
399 " written = {:#010x}, contents = {:#010x}).",
400 name(), value & enabled_bits,
get()));
401 logged_once_write_ =
true;
406 bool logged_once_read_ {
false};
407 bool logged_once_write_ {
false};
421 +
" This field is a dummy field with no side effects. "
426 std::string_view field_name)
429 +
" This field is a dummy field with no side effects. "
439 void write(uint64_t value, uint64_t enabled_bits)
override {
442 fmt::format(
"Write to write-once field {} (value written"
443 " = {:#010x}, contents = {:#010x})",
444 name(), value & enabled_bits,
get()));
452 bool written_ {
false};
460 using ReadOnlyField::ReadOnlyField;
462 uint64_t
read(uint64_t enabled_bits)
override {
463 uint64_t value =
get();
465 return value & enabled_bits;
Definition: field-templates.h:118
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:122
Definition: field-templates.h:175
ConstantField(MappableConfObject *obj, const std::string &name, uint64_t init_val)
Definition: field-templates.h:177
ConstantField(RegisterInterface *parent, std::string_view field_name, uint64_t init_val)
Definition: field-templates.h:182
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:187
void init(std::string_view desc, const bits_type &bits, int8_t offset) override
Initialize the field with a description, size in bits and an offset.
Definition: field-templates.h:197
Definition: field-templates.h:416
DesignLimitationField(RegisterInterface *parent, std::string_view field_name)
Definition: field-templates.h:425
DesignLimitationField(MappableConfObject *obj, const std::string &name)
Definition: field-templates.h:418
Base class to represent a Simics field.
Definition: field.h:38
RegisterInterface * parent() const override
void write(uint64_t value, uint64_t enabled_bits) override
uint64_t get() const override
const std::string & description() const override
Get the description of the field.
std::string_view name() const override
Get the name of the field without level delimiters.
Field(MappableConfObject *dev_obj, const std::string &name)
void set(uint64_t value) override
ConfObjectRef bank_obj_ref() const override
void set_description(std::string_view desc) override
Definition: field-templates.h:243
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:247
Definition: field-templates.h:49
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:53
Definition: mappable-conf-object.h:134
Definition: field-templates.h:230
OnesField(RegisterInterface *parent, std::string_view field_name)
Definition: field-templates.h:236
OnesField(MappableConfObject *obj, const std::string &name)
Definition: field-templates.h:232
Definition: field-templates.h:57
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:61
Definition: field-templates.h:154
ReadConstantField(MappableConfObject *obj, const std::string &name, uint64_t read_val)
Definition: field-templates.h:156
ReadConstantField(RegisterInterface *parent, std::string_view field_name, uint64_t read_val)
Definition: field-templates.h:161
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:166
Definition: field-templates.h:458
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:462
Definition: field-templates.h:84
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:88
Definition: field-templates.h:275
ReadUnimplField(RegisterInterface *parent, std::string_view field_name)
Definition: field-templates.h:282
ReadUnimplField(MappableConfObject *obj, const std::string &name)
Definition: field-templates.h:277
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:287
Definition: field-templates.h:36
RegisterField(RegisterInterface *reg_iface, Name name, Description desc, Offset offset, BitWidth size, Args... args)
Definition: field-templates.h:40
Definition: register-interface.h:37
virtual void add_field(std::string_view field_name, std::string_view desc, Offset offset, BitWidth width)=0
Add a field to the register.
Definition: field-templates.h:254
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:258
Definition: field-templates.h:210
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:214
Definition: field-templates.h:358
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:362
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:366
Definition: field-templates.h:383
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:387
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:396
Definition: field-templates.h:295
UnimplField(MappableConfObject *obj, const std::string &name)
Definition: field-templates.h:297
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:311
UnimplField(RegisterInterface *parent, std::string_view field_name)
Definition: field-templates.h:302
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:307
Definition: field-templates.h:144
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:148
Definition: field-templates.h:107
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:111
Definition: field-templates.h:132
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:136
Definition: field-templates.h:435
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:439
Definition: field-templates.h:70
uint64_t read(uint64_t enabled_bits) override
Definition: field-templates.h:74
Definition: field-templates.h:328
WriteUnimplField(MappableConfObject *obj, const std::string &name)
Definition: field-templates.h:330
void write(uint64_t value, uint64_t enabled_bits) override
Definition: field-templates.h:340
WriteUnimplField(RegisterInterface *parent, std::string_view field_name)
Definition: field-templates.h:335
Definition: field-templates.h:219
ZerosField(MappableConfObject *obj, const std::string &name)
Definition: field-templates.h:221
ZerosField(RegisterInterface *parent, std::string_view field_name)
Definition: field-templates.h:224
Literal type that extends size_t type.
Definition: common-types.h:30
Represents name of a bank/register/field.
Definition: hierarchical-object-name.h:44
#define SIM_LOG_UNIMPLEMENTED_STR(level, obj, group, str)
Definition: log.h:36
#define SIM_LOG_INFO_STR(level, obj, group, str)
Special macro to handle string object (for example, fmt::format)
Definition: log.h:30
#define SIM_LOG_SPEC_VIOLATION_STR(level, obj, group, str)
Definition: log.h:33
Definition: after-bank.h:33
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:46
Definition: common-types.h:66