16#ifndef SIMICS_REGISTER_TEMPLATES_H
17#define SIMICS_REGISTER_TEMPLATES_H
38template <
typename TRegister = Register,
typename... Args>
40 static_assert(std::is_base_of<Register, TRegister>::value,
41 "TRegister must be derived from Register");
45 InitValue value, std::initializer_list<field_t> fields = {},
47 : TRegister(bank_iface, reg_name, args ...) {
48 bank_iface->
add_register(reg_name, desc, offset, size, value, fields);
57 void write(uint64_t value, uint64_t enabled_bits)
override {}
65 uint64_t
read(uint64_t enabled_bits)
override {
67 fmt::format(
"Read from read-zero register {} -> 0x0",
83 void write(uint64_t value, uint64_t enabled_bits)
override {
87 fmt::format(
"Write to read-only register {}"
88 " (value written = {:#010x},"
89 " contents = {:#010x})",
name(),
90 value & enabled_bits,
get()));
95 bool logged_once_ {
false};
104 uint64_t
read(uint64_t enabled_bits)
override {
106 fmt::format(
"Read from write-only register"
107 " {} (returning 0)",
name()));
113 bool logged_once_ {
false};
125 void write(uint64_t value, uint64_t enabled_bits)
override {
136 uint64_t
read(uint64_t enabled_bits)
override {
137 uint64_t value =
get();
139 return value & enabled_bits;
150 void write(uint64_t value, uint64_t enabled_bits)
override {
162 void write(uint64_t value, uint64_t enabled_bits)
override {
171 const std::string &
name,
172 uint64_t read_val = 0) :
177 std::string_view reg_name,
178 uint64_t read_val = 0) :
183 uint64_t
read(uint64_t enabled_bits)
override {
196 void write(uint64_t value, uint64_t enabled_bits)
override {
198 fmt::format(
"Write to constant register {}"
199 " (value written = {:#010x},"
200 " contents = {:#010x})",
name(),
201 value & enabled_bits,
get()));
206 bool logged_once_ {
false};
215 void write(uint64_t value, uint64_t enabled_bits)
override {}
222 using ConstantRegister::ConstantRegister;
225 uint64_t init_val)
override {
227 SIM_LOG_SPEC_VIOLATION(
229 "Invalid non-zeros init_val for ZerosRegister");
236 bool logged_once_ {
false};
243 using ConstantRegister::ConstantRegister;
246 uint64_t init_val)
override {
247 uint64_t all_ones = std::numeric_limits<uint64_t>::max();
251 if (init_val != all_ones) {
252 SIM_LOG_SPEC_VIOLATION(
254 "Invalid non-ones init_val for OnesRegister");
261 bool logged_once_ {
false};
268 using IgnoreWriteRegister::IgnoreWriteRegister;
270 uint64_t
read(uint64_t enabled_bits)
override {
281 void write(uint64_t value, uint64_t enabled_bits)
override {
284 fmt::format(
"Write to reserved register {} (value written ="
285 " {:#010x}, contents = {:#010x}), will not warn"
286 " again.",
name(), value & enabled_bits,
get()));
292 bool has_logged_ {
false};
305 std::string_view reg_name) :
310 uint64_t
read(uint64_t enabled_bits)
override {
312 fmt::format(
"Read from unimplemented register {}"
313 " (contents = {:#010x}).",
name(),
314 get() & enabled_bits));
316 return get() & enabled_bits;
320 bool logged_once_ {
false};
338 uint64_t
read(uint64_t enabled_bits)
override {
340 fmt::format(
"Read from unimplemented register {}"
341 " (contents = {:#010x}).",
name(),
342 get() & enabled_bits));
343 logged_once_read_ =
true;
344 return get() & enabled_bits;
347 void write(uint64_t value, uint64_t enabled_bits)
override {
349 fmt::format(
"Write to unimplemented register {} (value"
350 " written = {:#010x}, contents = {:#010x}).",
351 name(), value & enabled_bits,
get()));
352 logged_once_write_ =
true;
357 bool logged_once_read_ {
false};
358 bool logged_once_write_ {
false};
375 void write(uint64_t value, uint64_t enabled_bits)
override {
377 fmt::format(
"Write to unimplemented register {} (value"
378 " written = {:#010x}, contents = {:#010x}).",
379 name(), value & enabled_bits,
get()));
385 bool logged_once_ {
false};
395 uint64_t
read(uint64_t enabled_bits)
override {
397 fmt::format(
"Read from unimplemented register {}"
398 " (contents = {:#010x}).",
name(),
399 get() & enabled_bits));
400 logged_once_read_ =
true;
401 return get() & enabled_bits;
404 void write(uint64_t value, uint64_t enabled_bits)
override {
406 fmt::format(
"Write to unimplemented register {} (value"
407 " written = {:#010x}, contents = {:#010x}).",
408 name(), value & enabled_bits,
get()));
409 logged_once_write_ =
true;
414 bool logged_once_read_ {
false};
415 bool logged_once_write_ {
false};
424 uint64_t
read(uint64_t enabled_bits)
override {
426 fmt::format(
"Read from poorly or non-documented"
427 " register {} (contents = {:#010x}).",
428 name(),
get() & enabled_bits));
429 logged_once_read_ =
true;
430 return get() & enabled_bits;
433 void write(uint64_t value, uint64_t enabled_bits)
override {
436 fmt::format(
"Write to poorly or non-documented register {}"
437 " (value written = {:#010x}, contents = {:#010x}).",
438 name(), value & enabled_bits,
get()));
439 logged_once_write_ =
true;
444 bool logged_once_read_ {
false};
445 bool logged_once_write_ {
false};
469 uint64_t init_value) {
472 "The supported register size is [1-8] bytes");
477 bytePointers.push_back(register_memory_.data() + i);
483 std::array<uint8_t, 8> register_memory_;
496 set_description(std::string(
"Not implemented (design limitation). This")
497 +
" register is a dummy register with no side effects. "
503 set_description(std::string(
"Not implemented (design limitation). This")
504 +
" register is a dummy register with no side effects. "
514 const std::string &alias_name)
516 alias_name_(alias_name) {
521 const std::string &alias_name)
523 alias_name_(alias_name) {
535 uint64_t
get()
const override {
536 return alias_->
get();
539 void set(uint64_t value)
override {
543 uint64_t
read(uint64_t enabled_bits)
override {
544 return alias_->
read(enabled_bits);
547 void write(uint64_t value, uint64_t enabled_bits)
override {
548 alias_->
write(value, enabled_bits);
560 std::string err =
"Ignored invalid register name (" \
563 throw std::invalid_argument { err };
571 std::string err =
"The aliased register " + alias_name_ \
572 +
" not found. Alter the register define order to make sure " \
573 +
"it is defined before this register.";
575 throw std::invalid_argument { err };
579 std::string alias_name_;
580 RegisterInterface *alias_ {
nullptr};
588 void write(uint64_t value, uint64_t enabled_bits)
override {
591 fmt::format(
"Write to write-once register {} (value"
592 " written = {:#010x}, contents = {:#010x})",
593 name(), value & enabled_bits,
get()));
601 bool written_ {
false};
609 using ReadOnlyRegister::ReadOnlyRegister;
611 uint64_t
read(uint64_t enabled_bits)
override {
612 uint64_t value =
get();
614 return value & enabled_bits;
Definition: register-templates.h:511
bool is_read_only() const override
Definition: register-templates.h:527
void write(uint64_t value, uint64_t enabled_bits) override
Definition: register-templates.h:547
uint64_t read(uint64_t enabled_bits) override
Definition: register-templates.h:543
bool is_mapped() const override
Definition: register-templates.h:531
AliasRegister(MappableConfObject *obj, const std::string &name, const std::string &alias_name)
Definition: register-templates.h:513
AliasRegister(BankInterface *parent, std::string_view reg_name, const std::string &alias_name)
Definition: register-templates.h:520
void set(uint64_t value) override
Definition: register-templates.h:539
uint64_t get() const override
Definition: register-templates.h:535
std::vector< field_t > fields_info() const override
Definition: register-templates.h:551
Definition: bank-interface.h:45
virtual void add_register(const register_t ®)=0
Definition: register-templates.h:39
BankRegister(BankInterface *bank_iface, Name reg_name, Description desc, Offset offset, ByteSize size, InitValue value, std::initializer_list< field_t > fields={}, Args... args)
Definition: register-templates.h:43
Definition: register-templates.h:132
uint64_t read(uint64_t enabled_bits) override
Definition: register-templates.h:136
Definition: register-templates.h:192
void write(uint64_t value, uint64_t enabled_bits) override
Definition: register-templates.h:196
Definition: register-templates.h:492
DesignLimitationRegister(BankInterface *parent, std::string_view reg_name)
Definition: register-templates.h:501
DesignLimitationRegister(MappableConfObject *obj, const std::string &name)
Definition: register-templates.h:494
static bool is_valid_hierarchical_name(std::string_view name)
Definition: hierarchical-object.h:303
void set_description(std::string_view desc) override
Definition: hierarchical-object.h:160
static int level_of_hierarchical_name(std::string_view name)
Definition: hierarchical-object.h:332
Definition: register-templates.h:266
uint64_t read(uint64_t enabled_bits) override
Definition: register-templates.h:270
Definition: register-templates.h:53
void write(uint64_t value, uint64_t enabled_bits) override
Definition: register-templates.h:57
Definition: mappable-conf-object.h:131
IFACE * get_iface(const std::string &name) const
Definition: mappable-conf-object.h:170
Definition: register-templates.h:241
void init(std::string_view desc, unsigned number_of_bytes, uint64_t init_val) override
Definition: register-templates.h:245
Definition: register-templates.h:61
uint64_t read(uint64_t enabled_bits) override
Definition: register-templates.h:65
Definition: register-templates.h:168
ReadConstantRegister(BankInterface *parent, std::string_view reg_name, uint64_t read_val=0)
Definition: register-templates.h:176
uint64_t read(uint64_t enabled_bits) override
Definition: register-templates.h:183
uint64_t read_val_
Definition: register-templates.h:188
ReadConstantRegister(MappableConfObject *dev_obj, const std::string &name, uint64_t read_val=0)
Definition: register-templates.h:170
Definition: register-templates.h:607
uint64_t read(uint64_t enabled_bits) override
Definition: register-templates.h:611
Definition: register-templates.h:75
void write(uint64_t value, uint64_t enabled_bits) override
Definition: register-templates.h:83
bool is_read_only() const override
Definition: register-templates.h:79
Definition: register-templates.h:297
uint64_t read(uint64_t enabled_bits) override
Definition: register-templates.h:310
ReadUnimplRegister(MappableConfObject *obj, const std::string &name)
Definition: register-templates.h:299
ReadUnimplRegister(BankInterface *parent, std::string_view reg_name)
Definition: register-templates.h:304
virtual std::vector< field_t > fields_info() const =0
virtual bool is_mapped() const =0
virtual bool is_read_only() const =0
Definition: register.h:65
void set(uint64_t value) override
Definition: register.h:213
void write(uint64_t value, uint64_t enabled_bits) override
Definition: register.h:324
void set_byte_pointers(const register_memory_t &byte_pointers) override
Definition: register.h:164
std::string_view name() const override
Definition: register.h:114
void init(std::string_view desc, unsigned number_of_bytes, uint64_t init_val) override
Definition: register.h:138
ConfObjectRef bank_obj_ref() const override
Definition: register.h:130
Register(MappableConfObject *dev_obj, const std::string &name)
Definition: register.h:68
const std::string & description() const override
Definition: register.h:122
BankInterface * parent() const override
Definition: register.h:445
uint64_t get() const override
Definition: register.h:194
unsigned number_of_bytes() const override
Definition: register.h:134
MappableConfObject * dev_obj() const override
Definition: register.h:126
Definition: register-templates.h:277
void write(uint64_t value, uint64_t enabled_bits) override
Definition: register-templates.h:281
Definition: register-templates.h:211
void write(uint64_t value, uint64_t enabled_bits) override
Definition: register-templates.h:215
Definition: register-templates.h:391
void write(uint64_t value, uint64_t enabled_bits) override
Definition: register-templates.h:404
uint64_t read(uint64_t enabled_bits) override
Definition: register-templates.h:395
Definition: register-templates.h:420
void write(uint64_t value, uint64_t enabled_bits) override
Definition: register-templates.h:433
uint64_t read(uint64_t enabled_bits) override
Definition: register-templates.h:424
Definition: register-templates.h:326
UnimplRegister(MappableConfObject *obj, const std::string &name)
Definition: register-templates.h:328
void write(uint64_t value, uint64_t enabled_bits) override
Definition: register-templates.h:347
UnimplRegister(BankInterface *parent, std::string_view reg_name)
Definition: register-templates.h:333
uint64_t read(uint64_t enabled_bits) override
Definition: register-templates.h:338
Definition: register-templates.h:449
bool is_mapped() const override
Definition: register-templates.h:463
UnmappedRegister(MappableConfObject *obj, const std::string &name, size_t number_of_bytes=4, uint64_t init_value=0)
Definition: register-templates.h:451
UnmappedRegister(BankInterface *parent, std::string_view reg_name, size_t number_of_bytes=4, uint64_t init_value=0)
Definition: register-templates.h:457
virtual uint64_t get() const =0
virtual uint64_t read(uint64_t enabled_bits)=0
virtual void write(uint64_t value, uint64_t enabled_bits)=0
virtual void set(uint64_t value)=0
Definition: register-templates.h:158
void write(uint64_t value, uint64_t enabled_bits) override
Definition: register-templates.h:162
Definition: register-templates.h:121
void write(uint64_t value, uint64_t enabled_bits) override
Definition: register-templates.h:125
Definition: register-templates.h:146
void write(uint64_t value, uint64_t enabled_bits) override
Definition: register-templates.h:150
Definition: register-templates.h:584
void write(uint64_t value, uint64_t enabled_bits) override
Definition: register-templates.h:588
Definition: register-templates.h:100
uint64_t read(uint64_t enabled_bits) override
Definition: register-templates.h:104
Definition: register-templates.h:363
WriteUnimplRegister(MappableConfObject *obj, const std::string &name)
Definition: register-templates.h:365
void write(uint64_t value, uint64_t enabled_bits) override
Definition: register-templates.h:375
WriteUnimplRegister(BankInterface *parent, std::string_view reg_name)
Definition: register-templates.h:370
Definition: register-templates.h:220
void init(std::string_view desc, unsigned number_of_bytes, uint64_t init_val) override
Definition: register-templates.h:224
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_ERROR_STR(obj, group, str)
Definition: log.h:40
#define SIM_LOG_SPEC_VIOLATION_STR(level, obj, group, str)
Definition: log.h:34
Definition: attr-value.h:23
std::string_view Description
Type used to describe a resource.
Definition: common-types.h:43
std::vector< uint8_t * > register_memory_t
Definition: register-type.h:52