52 void initPipeConstraints()
override {
54 validInMainControl.setbit(MAIN_CONTROL);
60 cstring getBlockName(
int bit)
override {
61 static const std::array<cstring, BLOCK_COUNT> lookup = {
62 "main parser"_cs,
"pre control"_cs,
"main control"_cs,
"main deparser"_cs};
63 return lookup[bit % BLOCK_COUNT];
66 const IR::P4Parser *getParser(
const cstring parserName) {
67 if (
auto p = findContext<IR::P4Parser>()) {
68 if (structure->parsers.count(parserName) != 0 &&
69 structure->parsers.at(parserName)->name == p->name) {
76 const IR::P4Control *getControl(
const cstring controlName) {
77 if (
auto c = findContext<IR::P4Control>()) {
78 if (structure->pipelines.count(controlName) != 0 &&
79 structure->pipelines.at(controlName)->name == c->name) {
86 const IR::P4Control *getDeparser(
const cstring deparserName) {
87 if (
auto d = findContext<IR::P4Control>()) {
88 if (structure->deparsers.count(deparserName) != 0 &&
89 structure->deparsers.at(deparserName)->name == d->name) {
96 void checkBlock(
const IR::MethodCallExpression *expr,
const cstring externType,
100 LOG4(
"externType: " << externType <<
", externName: " << externName);
102 if (pipeConstraints.count(externType)) {
103 if (
auto block = getParser(
"MainParserT"_cs)) {
104 LOG4(
"MainParser: " << (
void *)block <<
" " << dbp(block));
105 pos.setbit(MAIN_PARSER);
107 }
else if (
auto block = getControl(
"PreControlT"_cs)) {
108 LOG4(
"PreControl: " << (
void *)block <<
" " << dbp(block));
109 pos.setbit(PRE_CONTROL);
111 }
else if (
auto block = getControl(
"MainControlT"_cs)) {
112 LOG4(
"MainControl: " << (
void *)block <<
" " << dbp(block));
113 pos.setbit(MAIN_CONTROL);
115 }
else if (
auto block = getDeparser(
"MainDeparserT"_cs)) {
116 LOG4(
"MainDeparser: " << (
void *)block <<
" " << dbp(block));
117 pos.setbit(MAIN_DEPARSER);
123 LOG1(
"Pipe constraints not defined for: " << externType);
128 const IR::MethodCallExpression *expr)
override {
129 LOG3(
"ExternMethod: " << extMethod <<
", MethodCallExpression: " << expr);
130 checkBlock(expr, extMethod->originalExternType->name, extMethod->
object->
getName().name);
134 const IR::MethodCallExpression *expr)
override {
135 LOG3(
"ExternFunction: " << extFunction <<
", MethodCallExpression: " << expr);
136 checkBlock(expr, expr->method->toString(), cstring::empty);
143 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:138
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24