55 profile_t rv = Inspector::init_apply(root);
60 bool preorder(
const IR::BFN::AbstractParser *parser)
override {
61 return gress_ == parser->gress;
64 bool preorder(
const IR::BFN::ParserPrimitive *)
override {
return false; };
66 bool preorder(
const IR::BFN::ParserState *state)
override;
68 void flow_merge(
Visitor &)
override;
69 void flow_copy(::ControlFlowVisitor &)
override;
70 void end_apply()
override;
76 : gress_(gress), final_result(rst) {
81 ParserCriticalPath *clone()
const override {
return new ParserCriticalPath(*
this); }
87class CollectUserSpecifiedCriticalStates :
public Inspector {
91 bool preorder(
const IR::BFN::ParserState *state)
override {
92 if (state->gress != gress)
return false;
94 for (
const auto *p4State : state->p4States) {
95 for (
auto annot : p4State->annotations) {
96 if (annot->name.name ==
"critical") {
97 auto &exprs = annot->getExpr();
98 if (exprs.size() == 1) {
99 auto gress = exprs[0]->to<IR::StringLiteral>();
102 "Invalid use of %1%, correct usage is: "
103 "@pragma critical [ingress/egress]",
107 if (gress && gress->value == toString(state->gress)) {
108 LOG3(
"@critical specified on " << state->name);
109 critical_states.insert(state);
112 }
else if (exprs.size() == 0) {
113 LOG3(
"@critical specified on " << state->name);
114 critical_states.insert(state);
126 : gress(gr), critical_states(cs) {}
131class CalcParserCriticalPath :
public PassManager {
133 explicit CalcParserCriticalPath(
const PhvInfo &phv) : phv(phv) {
147 return ingress_user_critical_states;
151 return egress_user_critical_states;
154 bool is_on_critical_path(
const IR::BFN::ParserState *state)
const;
155 bool is_user_specified_critical_state(
const IR::BFN::ParserState *state)
const;
158 static bool is_on_critical_path(
const IR::BFN::ParserState *state,
161 static bool is_user_specified_critical_state(
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:58