42 void initPipeConstraints()
override {
44 validInMainControl.setbit(MAIN_CONTROL);
50 cstring getBlockName(
int bit)
override {
51 static const std::array<cstring, BLOCK_COUNT> lookup = {
52 "main parser"_cs,
"pre control"_cs,
"main control"_cs,
"main deparser"_cs};
53 return lookup[bit % BLOCK_COUNT];
56 const IR::P4Parser *getParser(
const cstring parserName) {
57 if (
auto p = findContext<IR::P4Parser>()) {
58 if (structure->parsers.count(parserName) != 0 &&
59 structure->parsers.at(parserName)->name == p->name) {
66 const IR::P4Control *getControl(
const cstring controlName) {
67 if (
auto c = findContext<IR::P4Control>()) {
68 if (structure->pipelines.count(controlName) != 0 &&
69 structure->pipelines.at(controlName)->name == c->name) {
76 const IR::P4Control *getDeparser(
const cstring deparserName) {
77 if (
auto d = findContext<IR::P4Control>()) {
78 if (structure->deparsers.count(deparserName) != 0 &&
79 structure->deparsers.at(deparserName)->name == d->name) {
86 void checkBlock(
const IR::MethodCallExpression *expr,
const cstring externType,
90 LOG4(
"externType: " << externType <<
", externName: " << externName);
92 if (pipeConstraints.count(externType)) {
93 if (
auto block = getParser(
"MainParserT"_cs)) {
94 LOG4(
"MainParser: " << (
void *)block <<
" " << dbp(block));
95 pos.setbit(MAIN_PARSER);
97 }
else if (
auto block = getControl(
"PreControlT"_cs)) {
98 LOG4(
"PreControl: " << (
void *)block <<
" " << dbp(block));
99 pos.setbit(PRE_CONTROL);
101 }
else if (
auto block = getControl(
"MainControlT"_cs)) {
102 LOG4(
"MainControl: " << (
void *)block <<
" " << dbp(block));
103 pos.setbit(MAIN_CONTROL);
105 }
else if (
auto block = getDeparser(
"MainDeparserT"_cs)) {
106 LOG4(
"MainDeparser: " << (
void *)block <<
" " << dbp(block));
107 pos.setbit(MAIN_DEPARSER);
113 LOG1(
"Pipe constraints not defined for: " << externType);
118 const IR::MethodCallExpression *expr)
override {
119 LOG3(
"ExternMethod: " << extMethod <<
", MethodCallExpression: " << expr);
120 checkBlock(expr, extMethod->originalExternType->name, extMethod->
object->
getName().name);
124 const IR::MethodCallExpression *expr)
override {
125 LOG3(
"ExternFunction: " << extFunction <<
", MethodCallExpression: " << expr);
126 checkBlock(expr, expr->method->toString(), cstring::empty);
132 initPipeConstraints();
void checkPipeConstraints(cstring extType, bitvec bv, const IR::MethodCallExpression *expr, cstring extName, cstring pipe)
Check if the invocation of extern object method or extern function is valid in the block where it is ...
Definition checkExternInvocationCommon.h:128
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13