23 #ifndef BM_BM_SIM_HEADERS_H_
24 #define BM_BM_SIM_HEADERS_H_
26 #include <bm/config.h>
35 #include "phv_forward.h"
39 using header_type_id_t = p4object_id_t;
41 class VLHeaderExpression;
42 class ArithExpression;
46 class HeaderType :
public NamedP4Object {
63 size_t get_hidden_offset(HiddenF hf)
const {
64 return fields_info.size() - 1 -
static_cast<size_t>(hf);
67 HeaderType(
const std::string &name, p4object_id_t
id);
70 int push_back_field(
const std::string &field_name,
int field_bit_width,
71 bool is_signed =
false,
bool is_saturating =
false,
76 int push_back_VL_field(
77 const std::string &field_name,
79 std::unique_ptr<VLHeaderExpression> field_length_expr,
80 bool is_signed =
false,
81 bool is_saturating =
false);
83 const FInfo &get_finfo(
int field_offset)
const {
84 return fields_info.at(field_offset);
87 int get_bit_width(
int field_offset)
const {
88 return fields_info.at(field_offset).bitwidth;
91 int get_bit_width()
const {
93 for (
const auto &f_info : fields_info)
94 bitwidth += f_info.bitwidth;
98 const std::string &get_field_name(
int field_offset)
const {
99 return fields_info.at(field_offset).name;
102 bool is_field_signed(
int field_offset)
const {
103 return fields_info.at(field_offset).is_signed;
106 header_type_id_t get_type_id()
const {
110 int get_num_fields()
const {
111 return fields_info.size();
114 int get_field_offset(
const std::string &field_name)
const {
115 for (
size_t res = 0; res < fields_info.size(); res++) {
116 if (field_name == fields_info[res].name)
return res;
121 bool is_VL_header()
const {
122 return (VL_offset >= 0);
125 bool has_VL_expr()
const;
127 std::unique_ptr<ArithExpression> resolve_VL_expr(header_id_t header_id)
const;
129 const std::vector<int> &get_VL_input_offsets()
const;
131 int get_VL_offset()
const {
135 int get_VL_max_header_bytes()
const;
138 std::vector<FInfo> fields_info;
140 std::unique_ptr<VLHeaderExpression> VL_expr_raw;
142 int VL_max_header_bytes{0};
149 using iterator = std::vector<Field>::iterator;
150 using const_iterator = std::vector<Field>::const_iterator;
151 using reference = std::vector<Field>::reference;
152 using const_reference = std::vector<Field>::const_reference;
153 using size_type = size_t;
158 Header(
const std::string &name, p4object_id_t
id,
159 const HeaderType &header_type,
const std::set<int> &arith_offsets,
160 const bool metadata =
false);
165 return nbytes_packet;
168 int recompute_nbytes_packet();
172 return (metadata || valid);
189 void reset_VL_header();
201 return fields.at(field_offset);
206 return fields.at(field_offset);
209 const HeaderType &get_header_type()
const {
return header_type; }
215 return header_type.get_type_id();
224 void extract(
const char *data,
const PHV &phv);
227 void extract_VL(
const char *data,
int VL_nbits);
229 void deparse(
char *data)
const;
232 size_type
size() const noexcept {
return fields.size(); }
237 iterator
begin() {
return fields.begin(); }
240 const_iterator
begin()
const {
return fields.begin(); }
243 iterator
end() {
return fields.end(); }
246 const_iterator
end()
const {
return fields.end(); }
251 assert(n < fields.size());
257 assert(n < fields.size());
262 void swap_values(
Header *other);
264 void copy_fields(
const Header &src);
269 bool cmp(
const Header &other)
const;
272 void set_packet_id(
const Debugger::PacketId *
id);
274 void set_packet_id(
const Debugger::PacketId *) { }
284 Header(
const Header &other) =
delete;
285 Header &operator=(
const Header &other) =
delete;
287 Header(Header &&other) =
default;
289 Header &operator=(Header &&other) =
delete;
292 void extract_VL(
const char *data,
const PHV &phv);
293 template <
typename Fn>
294 void extract_VL_common(
const char *data,
const Fn &VL_fn);
297 void set_union_membership(HeaderUnion *header_union,
size_t idx);
300 struct UnionMembership {
301 UnionMembership(HeaderUnion *header_union,
size_t idx);
306 HeaderUnion *header_union;
310 const HeaderType &header_type;
311 std::vector<Field> fields{};
314 Field *valid_field{
nullptr};
315 bool metadata{
false};
316 int nbytes_packet{0};
317 std::unique_ptr<ArithExpression> VL_expr;
318 std::unique_ptr<UnionMembership> union_membership{
nullptr};
320 const Debugger::PacketId *packet_id{&Debugger::dummy_PacketId};
326 #endif // BM_BM_SIM_HEADERS_H_