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