22 #ifndef BM_BM_SIM_EXPRESSIONS_H_
23 #define BM_BM_SIM_EXPRESSIONS_H_
25 #include <unordered_map>
32 #include "phv_forward.h"
40 struct ExpressionTemps;
42 enum class ExprOpcode {
43 LOAD_FIELD, LOAD_HEADER, LOAD_HEADER_STACK, LOAD_LAST_HEADER_STACK_FIELD,
44 LOAD_UNION, LOAD_UNION_STACK, LOAD_BOOL, LOAD_CONST, LOAD_LOCAL,
45 LOAD_REGISTER_REF, LOAD_REGISTER_GEN,
46 ADD, SUB, MOD, DIV, MUL, SHIFT_LEFT, SHIFT_RIGHT,
47 EQ_DATA, NEQ_DATA, GT_DATA, LT_DATA, GET_DATA, LET_DATA,
48 EQ_HEADER, NEQ_HEADER,
52 BIT_AND, BIT_OR, BIT_XOR, BIT_NEG,
53 VALID_HEADER, VALID_UNION,
57 DATA_TO_BOOL, BOOL_TO_DATA,
58 DEREFERENCE_HEADER_STACK,
59 DEREFERENCE_UNION_STACK,
60 LAST_STACK_INDEX, SIZE_STACK,
66 UNKNOWN, DATA, HEADER, HEADER_STACK, BOOL, UNION, UNION_STACK
69 class ExprOpcodesMap {
71 static ExprOpcode get_opcode(std::string expr_name);
74 static ExprOpcodesMap *get_instance();
79 std::unordered_map<std::string, ExprOpcode> opcodes_map{};
82 class ExprOpcodesUtils {
84 static ExprOpcode get_eq_opcode(ExprType expr_type);
85 static ExprOpcode get_neq_opcode(ExprType expr_type);
87 static ExprType get_opcode_type(ExprOpcode opcode);
103 header_stack_id_t header_stack;
106 header_stack_id_t header_stack;
110 header_union_id_t header_union;
112 header_union_stack_id_t header_union_stack;
129 RegisterArray *array;
133 RegisterArray *register_array;
143 virtual ~Expression() { }
145 void push_back_load_field(header_id_t header,
int field_offset);
146 void push_back_load_bool(
bool value);
147 void push_back_load_header(header_id_t header);
148 void push_back_load_header_stack(header_stack_id_t header_stack);
149 void push_back_load_last_header_stack_field(header_stack_id_t header_stack,
151 void push_back_load_header_union(header_union_id_t header_union);
152 void push_back_load_header_union_stack(
153 header_union_stack_id_t header_union_stack);
154 void push_back_load_const(
const Data &data);
155 void push_back_load_local(
const int offset);
156 void push_back_load_register_ref(RegisterArray *register_array,
158 void push_back_load_register_gen(RegisterArray *register_array);
159 void push_back_op(ExprOpcode opcode);
160 void push_back_ternary_op(
const Expression &e1,
const Expression &e2);
161 void push_back_access_field(
int field_offset);
162 void push_back_access_union_header(
int header_offset);
166 void grab_register_accesses(RegisterSync *register_sync)
const;
168 bool eval_bool(
const PHV &phv,
const std::vector<Data> &locals = {})
const;
169 Data eval_arith(
const PHV &phv,
const std::vector<Data> &locals = {})
const;
170 void eval_arith(
const PHV &phv, Data *data,
171 const std::vector<Data> &locals = {})
const;
172 Data &eval_arith_lvalue(PHV *phv,
const std::vector<Data> &locals = {})
const;
173 Header &eval_header(PHV *phv,
const std::vector<Data> &locals = {})
const;
175 PHV *phv,
const std::vector<Data> &locals = {})
const;
176 HeaderUnion &eval_header_union(
177 PHV *phv,
const std::vector<Data> &locals = {})
const;
179 PHV *phv,
const std::vector<Data> &locals = {})
const;
184 Expression(
const Expression &other) =
default;
185 Expression &operator=(
const Expression &other) =
default;
187 Expression(Expression &&other) =
default;
188 Expression &operator=(Expression &&other) =
default;
191 int assign_dest_registers();
192 void eval_(
const PHV &phv,
193 const std::vector<Data> &locals,
194 ExpressionTemps *temps)
const;
195 size_t get_num_ops()
const;
196 void append_expression(
const Expression &e);
199 std::vector<Op> ops{};
200 std::vector<Data> const_values{};
201 int data_registers_cnt{0};
204 friend class VLHeaderExpression;
208 class ArithExpression :
public Expression {
210 void eval(
const PHV &phv, Data *data,
211 const std::vector<Data> &locals = {})
const {
212 eval_arith(phv, data, locals);
215 Data &eval_lvalue(PHV *phv,
const std::vector<Data> &locals = {})
const {
216 return eval_arith_lvalue(phv, locals);
221 class BoolExpression :
public Expression {
223 bool eval(
const PHV &phv,
const std::vector<Data> &locals = {})
const {
224 return eval_bool(phv, locals);
229 class VLHeaderExpression {
231 explicit VLHeaderExpression(
const ArithExpression &expr);
233 ArithExpression resolve(header_id_t header_id);
235 const std::vector<int> &get_input_offsets()
const;
238 ArithExpression expr;
239 std::vector<int> offsets{};
244 #endif // BM_BM_SIM_EXPRESSIONS_H_