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_