23 #ifndef BM_BM_SIM_PHV_H_
24 #define BM_BM_SIM_PHV_H_
27 #include <unordered_map>
31 #include <unordered_set>
42 #include "expressions.h"
46 using header_id_t = p4object_id_t;
69 using HeaderRef = std::reference_wrapper<Header>;
70 using FieldRef = std::reference_wrapper<Field>;
73 friend class PHVFactory;
76 using HeaderNamesMap = std::unordered_map<std::string, HeaderRef>;
83 using FieldNamesMap = std::unordered_map<std::string, FieldRef>;
94 size_t num_header_unions,
size_t num_header_union_stacks);
98 return headers[header_index];
103 return headers[header_index];
110 return headers_map.at(header_name);
115 return headers_map.at(header_name);
120 auto it = headers_map.find(header_name);
121 return (it != headers_map.end());
129 return headers[header_index].get_field(field_offset);
134 return headers[header_index].get_field(field_offset);
141 return fields_map.at(field_name);
146 return fields_map.at(field_name);
152 auto it = fields_map.find(field_name);
153 return (it != fields_map.end());
159 return header_stacks[header_stack_index];
164 header_stack_id_t header_stack_index)
const {
165 return header_stacks[header_stack_index];
171 return header_unions[header_union_index];
176 header_union_id_t header_union_index)
const {
177 return header_unions[header_union_index];
183 header_union_stack_id_t header_union_stack_index) {
184 return header_union_stacks[header_union_stack_index];
190 header_union_stack_id_t header_union_stack_index)
const {
191 return header_union_stacks[header_union_stack_index];
216 PHV(
const PHV &other) =
delete;
221 PHV(
PHV &&other) =
default;
234 void set_packet_id(
const uint64_t id1,
const uint64_t id2) {
235 packet_id = {id1, id2};
248 return headers_map.begin();
253 return headers_map.begin();
259 return headers_map.end();
264 return headers_map.end();
289 int field_offset)
const;
295 void push_back_header(
const std::string &header_name,
296 header_id_t header_index,
297 const HeaderType &header_type,
298 const std::set<int> &arith_offsets,
299 const bool metadata);
301 void push_back_header_stack(
const std::string &header_stack_name,
302 header_stack_id_t header_stack_index,
303 const HeaderType &header_type,
304 const std::vector<header_id_t> &header_ids);
306 void push_back_header_union(
const std::string &header_union_name,
307 header_union_id_t header_union_index,
308 const std::vector<header_id_t> &header_ids);
310 void push_back_header_union_stack(
311 const std::string &header_union_stack_name,
312 header_union_stack_id_t header_union_stack_index,
313 const std::vector<header_union_id_t> &header_union_ids);
318 void add_field_alias(
const std::string &from,
const std::string &to);
321 std::vector<Header> headers{};
322 std::vector<HeaderStack> header_stacks{};
323 std::vector<HeaderUnion> header_unions{};
324 std::vector<HeaderUnionStack> header_union_stacks{};
325 HeaderNamesMap headers_map{};
326 FieldNamesMap fields_map{};
328 size_t capacity_stacks{0};
329 size_t capacity_unions{0};
330 size_t capacity_union_stacks{0};
331 Debugger::PacketId packet_id;
337 const std::string name;
339 const HeaderType &header_type;
340 std::set<int> arith_offsets{};
343 HeaderDesc(
const std::string &name,
const header_id_t index,
344 const HeaderType &header_type,
const bool metadata)
345 : name(name), index(index), header_type(header_type),
347 for (
int offset = 0; offset < header_type.get_num_fields(); offset++) {
348 arith_offsets.insert(offset);
353 struct HeaderStackDesc {
354 const std::string name;
355 header_stack_id_t index;
356 const HeaderType &header_type;
357 std::vector<header_id_t> headers;
359 HeaderStackDesc(
const std::string &name,
const header_stack_id_t index,
360 const HeaderType &header_type,
361 const std::vector<header_id_t> &headers)
362 : name(name), index(index), header_type(header_type),
366 struct HeaderUnionDesc {
367 const std::string name;
368 header_union_id_t index;
369 std::vector<header_id_t> headers;
371 HeaderUnionDesc(
const std::string &name,
const header_union_id_t index,
372 const std::vector<header_id_t> &headers)
373 : name(name), index(index), headers(headers) { }
376 struct HeaderUnionStackDesc {
377 const std::string name;
378 header_union_stack_id_t index;
379 std::vector<header_union_id_t> header_unions;
381 HeaderUnionStackDesc(
const std::string &name,
382 const header_union_stack_id_t index,
383 const std::vector<header_union_id_t> &header_unions)
384 : name(name), index(index), header_unions(header_unions) { }
388 void push_back_header(
const std::string &header_name,
389 const header_id_t header_index,
390 const HeaderType &header_type,
391 const bool metadata =
false);
393 void push_back_header_stack(
const std::string &header_stack_name,
394 const header_stack_id_t header_stack_index,
395 const HeaderType &header_type,
396 const std::vector<header_id_t> &headers);
398 void push_back_header_union(
const std::string &header_union_name,
399 const header_stack_id_t header_union_index,
400 const std::vector<header_id_t> &headers);
402 void push_back_header_union_stack(
403 const std::string &header_union_stack_name,
404 const header_union_stack_id_t header_union_stack_index,
405 const std::vector<header_union_id_t> &header_unions);
407 void add_field_alias(
const std::string &from,
const std::string &to);
409 const HeaderType &get_header_type(header_id_t header_id)
const {
410 return header_descs.at(header_id).header_type;
413 const HeaderType &get_header_stack_type(
414 header_stack_id_t header_stack_id)
const {
415 return header_stack_descs.at(header_stack_id).header_type;
418 void enable_field_arith(header_id_t header_id,
int field_offset);
420 void enable_all_field_arith(header_id_t header_id);
422 void disable_field_arith(header_id_t header_id,
int field_offset);
424 void disable_all_field_arith(header_id_t header_id);
426 void enable_stack_field_arith(header_stack_id_t header_stack_id,
429 void enable_all_stack_field_arith(header_stack_id_t header_stack_id);
431 void enable_union_stack_field_arith(
432 header_union_stack_id_t header_union_stack_id,
size_t header_offset,
435 void enable_all_union_stack_field_arith(
436 header_union_stack_id_t header_union_stack_id,
size_t header_offset);
438 void enable_all_union_stack_field_arith(
439 header_union_stack_id_t header_union_stack_id);
441 void enable_all_arith();
443 std::unique_ptr<PHV> create()
const;
446 std::map<header_id_t, HeaderDesc> header_descs{};
447 std::map<header_stack_id_t, HeaderStackDesc> header_stack_descs{};
448 std::map<header_union_id_t, HeaderUnionDesc> header_union_descs{};
449 std::map<header_union_stack_id_t, HeaderUnionStackDesc>
450 header_union_stack_descs{};
451 std::map<std::string, std::string> field_aliases{};
452 std::unordered_set<std::string> field_names{};
457 #endif // BM_BM_SIM_PHV_H_