18#ifndef BACKENDS_TOFINO_BF_ASM_WIDEREG_H_
19#define BACKENDS_TOFINO_BF_ASM_WIDEREG_H_
27#include "lib/bitvec.h"
32void print_regname(std::ostream &out,
const void *addr,
const void *end);
38 mutable bool read, write;
39 mutable bool disabled_;
41 widereg_base() : read(
false), write(
false), disabled_(
false) {}
42 explicit widereg_base(
bitvec v)
43 : value(v), reset_value(v), read(
false), write(
false), disabled_(
false) {}
44 explicit widereg_base(uintptr_t v)
45 : value(v), reset_value(v), read(
false), write(
false), disabled_(
false) {}
48 explicit widereg_base(intptr_t v)
49 : value(v), reset_value(v), read(
false), write(
false), disabled_(
false) {}
51 explicit widereg_base(
int v)
52 : value(v), reset_value(v), read(
false), write(
false), disabled_(
false) {}
57 bool modified()
const {
return write; }
58 void set_modified(
bool v =
true) { write = v; }
59 bool disabled()
const {
return disabled_; }
60 bool disable_if_unmodified() {
return write ? false : (disabled_ =
true); }
61 bool disable_if_zero()
const {
return value.empty() && !write; }
62 bool disable_if_reset_value() {
return value == reset_value ? (disabled_ =
true) :
false; }
63 bool disable()
const {
65 LOG1(
"ERROR: Disabling modified register in " <<
this);
71 void enable()
const { disabled_ =
false; }
72 void rewrite() { write =
false; }
74 virtual unsigned size() = 0;
78inline static unsigned int to_unsigned(
const bitvec &v) {
81 std::string str(ss.str());
82 unsigned int rv = std::strtoul(str.c_str(), 0, 16);
86inline std::ostream &operator<<(std::ostream &out,
const widereg_base *u) {
87 print_regname(out, u, u + 1);
90inline std::ostream &operator<<(std::ostream &out,
const widereg_base &u) {
91 return out << to_unsigned(u.value);
95struct widereg : widereg_base {
96 widereg() : widereg_base() {}
97 const widereg &check() {
98 if (value.max().index() >= N) {
99 LOG1(
"ERROR: out of range for " << N <<
" bits in " <<
this);
100 value.clrrange(N, value.max().index() - N + 1);
104 explicit widereg(
bitvec v) : widereg_base(v) { check(); }
105 explicit widereg(uintptr_t v) : widereg_base(v) { check(); }
108 explicit widereg(intptr_t v) : widereg_base(v) { check(); }
110 explicit widereg(
int v) : widereg_base(v) { check(); }
111 widereg(
const widereg &) =
delete;
112 widereg(widereg &&) =
default;
114 if (disabled_) LOG1(
"ERROR: Writing disabled register value in " <<
this);
115 if (write) LOG1(
"WARNING: Overwriting " << value <<
" with " << v <<
" in " <<
this);
122 uintptr_t operator=(uintptr_t v) {
126 intptr_t operator=(intptr_t v) {
130 const widereg &operator=(
const widereg &v) {
135 const widereg_base &operator=(
const widereg_base &v) {
140 unsigned size() {
return N; }
141 const widereg &operator|=(
bitvec v) {
142 if (disabled_) LOG1(
"ERROR: Writing disabled register value in " <<
this);
144 LOG1(
"WARNING: Overwriting " << value <<
" with " << (v | value) <<
" in " <<
this);
150 const widereg &set_subfield(uintptr_t v,
unsigned bit,
unsigned size) {
151 if (disabled_) LOG1(
"ERROR: Writing disabled register value in " <<
this);
152 if (bit + size > N) {
153 LOG1(
"ERROR: subfield " << bit <<
".." << (bit + size - 1) <<
" out of range in "
155 }
else if (
auto o = value.getrange(bit, size)) {
157 LOG1((o != v ?
"ERROR" :
"WARNING")
158 <<
": Overwriting subfield(" << bit <<
".." << (bit + size - 1) <<
") value "
159 << o <<
" with " << v <<
" in " <<
this);
161 if (v >= (1U << size))
162 LOG1(
"ERROR: Subfield value " << v <<
" too large for " << size <<
" bits in " <<
this);
163 value.putrange(bit, size, v);
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24
void log(const char *op, bitvec v) const
Definition widereg.cpp:25