69class HashGenSetup :
public PassManager {
76 auto rv = PassManager::init_apply(node);
77 hash_gen_injections.clear();
78 hash_dist_injections.clear();
87 std::vector<const IR::Expression *> per_prim_hge;
88 bool preorder(
const IR::MAU::StatefulAlu *)
override {
return false; }
89 bool preorder(
const IR::BFN::SignExtend *)
override;
90 bool preorder(
const IR::Concat *)
override;
91 bool preorder(
const IR::Expression *)
override;
92 bool preorder(
const IR::Constant *)
override;
93 bool preorder(
const IR::MAU::Primitive *)
override;
94 void postorder(
const IR::MAU::Primitive *)
override;
96 void check_for_symmetric(
const IR::Declaration_Instance *decl,
const IR::ListExpression *le,
98 bool isBetter(
const IR::Expression *dest,
const IR::Expression *a,
const IR::Expression *b);
101 explicit CreateHashGenExprs(HashGenSetup &s) : self(s) {}
109 bool preorder(
const IR::MAU::StatefulAlu *)
override {
return false; }
110 bool preorder(
const IR::Expression *)
override;
113 explicit ScanHashDists(HashGenSetup &s) : self(s) {}
121 const IR::Expression *postorder(IR::Expression *)
override;
124 explicit UpdateHashDists(HashGenSetup &s) : self(s) {}
130 {
new CreateHashGenExprs(*
this),
new ScanHashDists(*
this),
new UpdateHashDists(*
this)});
144 std::set<UniqueAttachedId> per_flow_enables;
145 std::map<UniqueAttachedId, IR::MAU::MeterType> meter_types;
149 const IR::MAU::Action *preorder(IR::MAU::Action *)
override;
150 const IR::Node *postorder(IR::MAU::Primitive *)
override;
151 const IR::MAU::Action *postorder(IR::MAU::Action *)
override;
153 void clear_action() {
155 per_flow_enables.clear();
160 explicit Synth2PortSetup(
const PhvInfo &) {}
180 IR::MAU::Action *af =
nullptr;
182 int synth_arg_num = 0;
183 const IR::MAU::TableSeq *ts =
nullptr;
187 const IR::MAU::HashDist *preorder(IR::MAU::HashDist *hd)
override {
191 const IR::GlobalRef *preorder(IR::GlobalRef *)
override;
192 const IR::MAU::TableSeq *postorder(IR::MAU::TableSeq *)
override;
193 const IR::MAU::Action *postorder(IR::MAU::Action *)
override;
194 const IR::MAU::Action *preorder(IR::MAU::Action *)
override;
195 const IR::MAU::SaluAction *preorder(IR::MAU::SaluAction *a)
override {
199 const IR::Expression *postorder(IR::Add *)
override;
200 const IR::Expression *postorder(IR::AddSat *)
override;
201 const IR::Expression *postorder(IR::Sub *)
override;
202 const IR::Expression *postorder(IR::SubSat *)
override;
203 const IR::Expression *postorder(IR::Neg *)
override;
204 const IR::Expression *postorder(IR::Shr *)
override;
205 const IR::Expression *postorder(IR::Shl *)
override;
206 const IR::Expression *postorder(IR::BAnd *)
override;
207 const IR::Expression *postorder(IR::BOr *)
override;
208 const IR::Expression *postorder(IR::BXor *)
override;
209 const IR::Expression *postorder(IR::Cmpl *)
override;
210 const IR::Expression *preorder(IR::BFN::SignExtend *)
override;
211 const IR::Expression *preorder(IR::Concat *)
override;
213 const IR::Expression *postorder(IR::Operation_Relation *)
override;
214 const IR::Expression *postorder(IR::Mux *)
override;
215 const IR::Slice *postorder(IR::Slice *)
override;
216 const IR::Expression *postorder(IR::BoolLiteral *)
override;
217 const IR::Node *postorder(IR::MAU::Primitive *)
override;
218 const IR::MAU::Instruction *postorder(IR::MAU::Instruction *i)
override {
return i; }
220 bool checkPHV(
const IR::Expression *);
221 bool checkActionBus(
const IR::Expression *e);
222 bool checkSrc1(
const IR::Expression *);
223 bool checkConst(
const IR::Expression *ex,
long &value);
224 bool equiv(
const IR::Expression *a,
const IR::Expression *b);
225 IR::Member *genIntrinsicMetadata(gress_t gress,
cstring header,
cstring field);
227 void limitWidth(
const IR::Expression *);
230 explicit DoInstructionSelection(
const PhvInfo &phv) : phv(phv) {}
239class StatefulAttachmentSetup :
public PassManager {
241 const IR::TempVar *saved_tempvar =
nullptr;
242 const IR::MAU::HashDist *saved_hashdist =
nullptr;
243 typedef std::pair<const IR::MAU::AttachedMemory *, const IR::MAU::Table *> HashDistKey;
244 typedef std::pair<const IR::MAU::StatefulCall *, const IR::MAU::Table *> StatefulCallKey;
251 typedef IR::MAU::StatefulUse use_t;
254 typedef std::pair<const IR::MAU::Synth2Port *, const IR::MAU::Table *> IndexCheck;
255 struct clear_info_t {
256 const IR::MAU::AttachedMemory *attached = 0;
258 uint32_t busy_value = 0;
267 remove_tempvars.clear();
268 copy_propagated_tempvars.clear();
269 remove_instr.clear();
270 stateful_alu_from_hash_dists.clear();
272 return PassManager::init_apply(root);
275 StatefulAttachmentSetup &self;
276 bool preorder(
const IR::MAU::Action *)
override;
277 bool preorder(
const IR::MAU::Instruction *)
override;
278 bool preorder(
const IR::TempVar *)
override;
279 bool preorder(
const IR::MAU::HashDist *)
override;
280 void postorder(
const IR::MAU::Instruction *)
override;
281 void postorder(
const IR::MAU::Primitive *)
override;
282 void postorder(
const IR::MAU::Table *)
override;
283 void setup_index_operand(
const IR::Expression *index_expr,
284 const IR::MAU::Synth2Port *synth2port,
const IR::MAU::Table *tbl,
285 const IR::MAU::StatefulCall *call);
286 void simpl_concat(std::vector<const IR::Expression *> &slices,
const IR::Concat *concat);
289 explicit Scan(StatefulAttachmentSetup &self) : self(self) {}
292 StatefulAttachmentSetup &self;
293 const IR::MAU::StatefulCall *preorder(IR::MAU::StatefulCall *)
override;
294 const IR::MAU::BackendAttached *preorder(IR::MAU::BackendAttached *ba)
override;
295 const IR::MAU::StatefulAlu *preorder(IR::MAU::StatefulAlu *salu)
override;
296 const IR::MAU::Instruction *preorder(IR::MAU::Instruction *sp)
override;
299 explicit Update(StatefulAttachmentSetup &self) : self(self) {
300 dontForwardChildrenBeforePreorder =
true;
304 const IR::MAU::HashDist *find_hash_dist(
const IR::Expression *expr,
305 const IR::MAU::Primitive *prim);
306 IR::MAU::HashDist *create_hash_dist(
const IR::Expression *e,
const IR::MAU::Primitive *prim);
309 explicit StatefulAttachmentSetup(
const PhvInfo &p) : phv(p) {
310 addPasses({
new Scan(*
this),
new Update(*
this)});
327 le_bitrange dest_bits;
328 const IR::Expression *read;
331 FieldImpact(le_bitrange db,
const IR::Expression *r) : dest_bits(db), read(r) {}
332 const IR::Expression *getSlice(
bool isSalu, le_bitrange bits);
335 bool elem_copy_propagated =
false;
342 const IR::Node *preorder(IR::MAU::Instruction *i)
override;
343 const IR::MAU::StatefulCall *preorder(IR::MAU::StatefulCall *sc)
override {
347 const IR::MAU::Action *preorder(IR::MAU::Action *a)
override;
348 const IR::Expression *preorder(IR::Expression *a)
override;
349 void update(
const IR::MAU::Instruction *instr,
const IR::Expression *e);
350 const IR::Expression *propagate(
const IR::MAU::Instruction *instr,
const IR::Expression *e);
351 const IR::MAU::Action *postorder(IR::MAU::Action *)
override;
354 explicit BackendCopyPropagation(
const PhvInfo &p) : phv(p) { visitDagOnce =
false; }
381class EliminateAllButLastWrite :
public PassManager {
394 EliminateAllButLastWrite &self;
395 LastInstrMap last_instr_map;
397 bool preorder(
const IR::MAU::Action *)
override;
398 bool preorder(
const IR::MAU::Instruction *)
override;
399 bool preorder(
const IR::MAU::StatefulCall *)
override {
return false; }
400 bool preorder(
const IR::MAU::BackendAttached *)
override {
return false; }
401 void postorder(
const IR::MAU::Action *)
override;
404 explicit Scan(EliminateAllButLastWrite &self) : self(self) {}
408 EliminateAllButLastWrite &self;
409 const IR::MAU::Action *current_af =
nullptr;
410 const IR::MAU::Action *preorder(IR::MAU::Action *)
override;
411 const IR::Node *preorder(IR::MAU::Instruction *)
override;
412 const IR::MAU::StatefulCall *preorder(IR::MAU::StatefulCall *sc)
override {
416 const IR::MAU::BackendAttached *preorder(IR::MAU::BackendAttached *ba)
override {
422 explicit Update(EliminateAllButLastWrite &self) : self(self) {}
426 explicit EliminateAllButLastWrite(
const PhvInfo &p) : phv(p) {
427 addPasses({
new Scan(*
this),
new Update(*
this)});
499class ArithCompareAdjustment :
public PassManager {
503 std::map<const PHV::Field *, int> comp_adj_field_width_map;
504 std::map<const cstring, int> comp_adj_name_width_map;
505 std::map<const IR::MAU::Action *, std::set<const PHV::Field *>> comp_adj_fields_per_action_map;
509 ArithCompareAdjustment &self;
510 std::map<const PHV::Field *, bitvec> comp_or_set_zero_writes;
512 std::set<const PHV::Field *> other_targets;
514 bool preorder(
const IR::MAU::Action *)
override;
515 bool preorder(
const IR::MAU::Instruction *)
override;
516 bool preorder(
const IR::MAU::StatefulCall *)
override {
return false; }
517 bool preorder(
const IR::MAU::BackendAttached *)
override {
return false; }
518 void postorder(
const IR::MAU::Action *)
override;
521 explicit Scan(ArithCompareAdjustment &self) : self(self) {}
526 ArithCompareAdjustment &self;
527 const IR::MAU::Action *current_af =
nullptr;
528 std::set<const PHV::Field *> comp_adj_fields;
530 const IR::MAU::Action *preorder(IR::MAU::Action *)
override;
531 const IR::MAU::Instruction *preorder(IR::MAU::Instruction *)
override;
532 const IR::Metadata *preorder(IR::Metadata *)
override;
533 const IR::ConcreteHeaderRef *preorder(IR::ConcreteHeaderRef *)
override;
534 const IR::Node *preorder(IR::Member *)
override;
535 const IR::Type_StructLike *adjust_type_struct(
const IR::Type_StructLike *,
cstring name);
536 const IR::MAU::StatefulCall *preorder(IR::MAU::StatefulCall *sc)
override {
540 const IR::MAU::BackendAttached *preorder(IR::MAU::BackendAttached *ba)
override {
544 const IR::MAU::Action *postorder(IR::MAU::Action *)
override;
547 explicit Update(ArithCompareAdjustment &self) : self(self) {}
550 bool is_compare(
cstring name) {
551 return name ==
"gtequ" || name ==
"gteqs" || name ==
"ltu" || name ==
"lts" ||
552 name ==
"lequ" || name ==
"leqs" || name ==
"gtu" || name ==
"gts" || name ==
"eq" ||
553 name ==
"neq" || name ==
"eq64" || name ==
"neq64";
557 explicit ArithCompareAdjustment(
const PhvInfo &p) : phv(p) {
558 addPasses({
new Scan(*
this),
new Update(*
this)});
567class MeterSetup :
public PassManager {
579 void find_input(
const IR::MAU::Primitive *);
580 void find_pre_color(
const IR::MAU::Primitive *);
581 const IR::Expression *convert_cast_to_slice(
const IR::Expression *);
583 bool preorder(
const IR::MAU::Instruction *)
override;
584 bool preorder(
const IR::MAU::Primitive *)
override;
587 explicit Scan(MeterSetup &self) : self(self) {}
592 void update_input(IR::MAU::Meter *);
593 void update_pre_color(IR::MAU::Meter *);
594 bool preorder(IR::MAU::Meter *)
override;
595 bool preorder(IR::MAU::Action *)
override;
598 explicit Update(MeterSetup &self) : self(self) {}
602 explicit MeterSetup(
const PhvInfo &p) : phv(p) {
603 addPasses({
new Scan(*
this),
new Update(*
this)});
607class SetupAttachedAddressing :
public PassManager {
608 struct AttachedActionCoord {
609 bool all_per_flow_enabled =
true;
610 bool all_same_meter_type =
true;
611 bool meter_type_set =
false;
612 IR::MAU::MeterType meter_type = IR::MAU::MeterType::UNUSED;
613 const IR::MAU::AttachedMemory *am =
nullptr;
616 using AttachedInfo = std::map<UniqueAttachedId, AttachedActionCoord>;
623 SetupAttachedAddressing &self;
624 bool preorder(
const IR::MAU::BackendAttached *)
override;
627 explicit InitializeAttachedInfo(SetupAttachedAddressing &self) : self(self) {}
631 SetupAttachedAddressing &self;
632 bool preorder(
const IR::MAU::Table *)
override;
635 explicit ScanTables(SetupAttachedAddressing &self) : self(self) {}
639 SetupAttachedAddressing &self;
640 bool preorder(
const IR::MAU::BackendAttached *)
override;
643 explicit VerifyAttached(SetupAttachedAddressing &self) : self(self) {}
647 SetupAttachedAddressing &self;
648 void simple_attached(IR::MAU::BackendAttached *);
649 bool preorder(IR::MAU::BackendAttached *)
override;
652 explicit UpdateAttached(SetupAttachedAddressing &self) : self(self) {}
656 SetupAttachedAddressing() {
657 addPasses({
new InitializeAttachedInfo(*
this),
new ScanTables(*
this),
658 new VerifyAttached(*
this),
new UpdateAttached(*
this)});
669class GuaranteeHashDistSize :
public PassManager {
673 auto rv = PassManager::init_apply(node);
674 hash_dist_instrs.clear();
679 GuaranteeHashDistSize &self;
680 bool contains_hash_dist =
false;
682 bool preorder(
const IR::MAU::BackendAttached *)
override {
return false; }
683 bool preorder(
const IR::MAU::StatefulCall *)
override {
return false; }
684 bool preorder(
const IR::MAU::Instruction *)
override;
685 bool preorder(
const IR::MAU::HashDist *)
override;
686 void postorder(
const IR::MAU::Instruction *)
override;
689 explicit Scan(GuaranteeHashDistSize &s) : self(s) {}
693 GuaranteeHashDistSize &self;
695 const IR::Node *postorder(IR::MAU::Instruction *)
override;
698 explicit Update(GuaranteeHashDistSize &s) : self(s) {}
702 GuaranteeHashDistSize() { addPasses({
new Scan(*
this),
new Update(*
this)}); }
Definition tofino_write_context.h:24
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24