42 friend class AllocateClot;
43 friend class CollectClotInfo;
44 friend class ClotCandidate;
45 friend class GreedyClotAllocator;
54 parser_state_to_fields_;
59 parser_state_to_header_stacks_;
64 header_stack_elements_;
69 std::unordered_map<const IR::BFN::ParserState *, const IR::BFN::ParserRVal *>>
70 field_to_parser_states_;
82 std::set<const PHV::Field *> checksum_dests_;
83 std::map<const PHV::Field *, std::vector<const IR::BFN::EmitChecksum *>>
84 field_to_checksum_updates_;
86 std::vector<Clot *> clots_;
87 std::map<const Clot *, std::pair<gress_t, std::set<cstring>>, Clot::Less>
88 clot_to_parser_states_;
91 std::map<gress_t, std::map<cstring, std::set<const Clot *>>> parser_state_to_clots_;
93 std::map<const IR::BFN::ParserState *, ordered_map<const PHV::Field *, nw_bitrange>>
96 std::map<const Clot *, std::vector<const IR::BFN::EmitChecksum *>> clot_to_emit_checksum_;
99 std::map<const PHV::Field *, std::set<const PHV::Field *> *> field_aliases_;
102 std::set<cstring> headers_added_by_mau_;
105 std::map<const PHV::Field *, std::set<const Pseudoheader *>> field_to_pseudoheaders_;
107 std::map<gress_t, DeparseGraph> deparse_graph_;
110 std::map<const PHV::Field *, PovBitSet> fields_to_pov_bits_;
113 explicit ClotInfo(
PhvUse &uses) : uses(uses) {}
116 unsigned num_clots_allocated(gress_t gress)
const {
return Clot::tag_count.at(gress); }
119 std::optional<nw_bitrange> field_range(
const IR::BFN::ParserState *state,
123 std::optional<unsigned> offset(
const IR::BFN::ParserState *state,
135 CollectParserInfo parserInfo;
138 parser_state_to_fields()
const {
139 return parser_state_to_fields_;
143 parser_state_to_header_stacks()
const {
144 return parser_state_to_header_stacks_;
148 std::set<unsigned>> &
149 header_stack_elements() {
150 return header_stack_elements_;
157 const std::map<const Clot *, std::pair<gress_t, std::set<cstring>>, Clot::Less> &
158 clot_to_parser_states()
const {
159 return clot_to_parser_states_;
162 std::map<cstring, std::set<const Clot *>> &parser_state_to_clots(gress_t gress) {
163 return parser_state_to_clots_.at(gress);
166 const std::map<cstring, std::set<const Clot *>> &parser_state_to_clots(gress_t gress)
const {
167 return parser_state_to_clots_.at(gress);
170 const std::set<const Clot *> parser_state_to_clots(
171 const IR::BFN::LoweredParserState *state)
const;
173 const Clot *parser_state_to_clot(
const IR::BFN::LoweredParserState *state,
unsigned tag)
const;
175 const std::vector<Clot *> &clots() {
return clots_; }
177 const std::map<const PHV::Field *, std::vector<const IR::BFN::EmitChecksum *>> &
178 field_to_checksum_updates() {
179 return field_to_checksum_updates_;
184 const PhvInfo &phv)
const;
187 std::map<int, const PHV::Field *>
get_csum_fields(
const Clot *clot)
const;
189 std::map<const Clot *, std::vector<const IR::BFN::EmitChecksum *>> &clot_to_emit_checksum() {
190 return clot_to_emit_checksum_;
193 const std::map<const Clot *, std::vector<const IR::BFN::EmitChecksum *>> &
194 clot_to_emit_checksum()
const {
195 return clot_to_emit_checksum_;
207 void add_field(
const PHV::Field *f,
const IR::BFN::ParserRVal *source,
208 const IR::BFN::ParserState *state);
210 void add_stack(
const IR::HeaderStack *hs,
const IR::BFN::ParserState *state,
int index = -1);
213 void compute_byte_maps();
215 void add_clot(Clot *clot, ordered_set<const IR::BFN::ParserState *> states);
219 const ordered_set<const IR::BFN::ParserState *> *find_full_states(
220 const IR::BFN::ParserGraph *graph)
const;
226 bool is_used_in_multiple_checksum_update_sets(
const PHV::Field *field)
const;
229 bool is_extracted_in_multiple_non_mutex_states(
const PHV::Field *f)
const;
232 bool extracted_with_pov(
const PHV::Field *field)
const;
236 bool has_consistent_bit_in_byte_offset(
const PHV::Field *field)
const;
240 bool can_be_in_clot(
const PHV::Field *field)
const;
243 bool can_start_clot(
const FieldSliceExtractInfo *extract_info)
const;
246 bool can_end_clot(
const FieldSliceExtractInfo *extract_info)
const;
251 bool extracts_full_width(
const PHV::Field *field)
const;
254 mutable std::map<const PHV::Field *, bool> is_modified_;
259 bool is_checksum(
const PHV::FieldSlice *slice)
const;
264 bool is_modified(
const PHV::FieldSlice *slice)
const;
269 bool is_readonly(
const PHV::FieldSlice *slice)
const;
273 bool is_unused(
const PHV::Field *field)
const;
274 bool is_unused(
const PHV::FieldSlice *slice)
const;
344 void crop(
Clot *clot,
cstring parser_state,
unsigned start_bits,
unsigned end_bits);
346 void crop(
Clot *clot,
cstring parser_state,
unsigned num_bits,
bool from_start);
374 template <Endian Order = Endian::Network>
384 template <Endian Order = Endian::Network>
411 std::string print(
const PhvInfo *phvInfo =
nullptr)
const;
427 std::pair<unsigned, ordered_set<const IR::BFN::ParserState *> *> *find_largest_paths(
428 const std::map<
cstring, std::set<const Clot *>> &parser_state_to_clots,
429 const IR::BFN::ParserGraph *graph,
const IR::BFN::ParserState *state,
430 std::map<
const IR::BFN::ParserState *,
447 : phv(phv), clotInfo(clotInfo), pragmaDoNotUseClot(pragmaDoNotUseClot) {}
453 bool preorder(
const IR::BFN::Extract *extract)
override;
454 bool preorder(
const IR::BFN::ParserZeroInit *zero_init)
override;
457 bool preorder(
const IR::HeaderStackItemRef *hs)
override;
460 bool preorder(
const IR::BFN::EmitField *emit)
override;
464 bool preorder(
const IR::BFN::EmitChecksum *emit)
override;
467 void postorder(
const IR::BFN::Deparser *deparser)
override;
473 void add_pseudoheader(
474 const PovBitSet pov_bits,
const std::vector<const PHV::Field *> fields,
475 std::map<std::pair<
const PovBitSet,
const std::vector<const PHV::Field *>>,
479 bool preorder(
const IR::BFN::AliasMember *alias)
override {
480 add_alias_field(alias);
485 bool preorder(
const IR::BFN::AliasSlice *alias)
override {
486 add_alias_field(alias);
490 void add_alias_field(
const IR::Expression *alias);
493 bool preorder(
const IR::MAU::Instruction *instruction)
override;
495 void end_apply(
const IR::Node *root)
override;