23 #ifndef BM_BM_SIM_FIELD_LISTS_H_
24 #define BM_BM_SIM_FIELD_LISTS_H_
28 #include <unordered_set>
31 #include <boost/functional/hash.hpp>
32 #include <boost/variant.hpp>
34 #include "phv_forward.h"
49 bool operator==(
const field_t& other)
const {
50 return header == other.header && offset == other.offset;
52 bool operator!=(
const field_t& other)
const {
53 return !(*
this == other);
61 bool operator==(
const constant_t& other)
const {
62 return value == other.value;
64 bool operator!=(
const constant_t& other)
const {
65 return !(*
this == other);
69 struct FieldListVisitor : boost::static_visitor<> {
70 void operator()(
const field_t &) { }
71 void operator()(
const constant_t &) { }
75 void push_back_field(header_id_t header,
int field_offset) {
76 field_t f = {header, field_offset};
77 fields.push_back(field_list_member_t(f));
81 void push_back_constant(
const std::string &hexstr,
size_t bitwidth) {
83 fields.push_back(field_list_member_t(c));
89 auto it = fields_set.find({header, field_offset});
90 return it != fields_set.end();
95 void visit(T &visitor) {
96 static_assert(std::is_base_of<FieldListVisitor, T>::value,
97 "Invalid visitor, must inherit from from FieldListVisitor");
98 std::for_each(fields.begin(), fields.end(), boost::apply_visitor(visitor));
101 void copy_fields_between_phvs(PHV *dst,
const PHV *src) {
102 struct CopyFieldsVisitor : FieldListVisitor {
103 CopyFieldsVisitor(PHV *dst,
const PHV *src)
104 : dst(dst), src(src) {}
108 void operator()(
const field_t &f) {
109 dst->get_field(f.header, f.offset)
110 .set(src->get_field(f.header, f.offset));
112 void operator()(
const constant_t &) { }
115 CopyFieldsVisitor v(dst, src);
120 using field_list_member_t = boost::variant<field_t, constant_t>;
122 struct FieldKeyHash {
123 std::size_t operator()(
const field_t& f)
const {
124 std::size_t seed = 0;
125 boost::hash_combine(seed, f.header);
126 boost::hash_combine(seed, f.offset);
132 std::vector<field_list_member_t> fields{};
133 std::unordered_set<field_t, FieldKeyHash> fields_set{};
138 #endif // BM_BM_SIM_FIELD_LISTS_H_