50    class NamedObjectInfo {
 
   54        std::unordered_map<cstring, int> *allNames;
 
   55        std::map<cstring, T> nameToObject;
 
   56        std::map<T, cstring> objectToNewName;
 
   60            friend class NamedObjectInfo;
 
   63            typename std::map<cstring, T>::iterator it;
 
   64            typename std::map<T, cstring> &objToName;
 
   65            iterator(
typename std::map<cstring, T>::iterator it,
 
   66                     typename std::map<T, cstring> &objToName)
 
   67                : it(it), objToName(objToName) {}
 
   70            const iterator &operator++() {
 
   74            bool operator!=(
const iterator &other)
 const { 
return it != other.it; }
 
   75            std::pair<T, cstring> operator*()
 const {
 
   76                return std::pair<T, cstring>(it->second, objToName[it->second]);
 
   81        explicit NamedObjectInfo(std::unordered_map<cstring, int> *allNames) : allNames(allNames) {}
 
   83            if (objectToNewName.find(obj) != objectToNewName.end()) {
 
   85                LOG3(
" already emplaced obj " << obj);
 
   89            nameToObject.emplace(obj->name, obj);
 
   92            if (allNames == 
nullptr || (allNames->find(obj->name) == allNames->end())) {
 
   95                newName = cstring::make_unique(*allNames, obj->name, allNames->at(obj->name), 
'_');
 
   97            if (allNames != 
nullptr) allNames->insert({newName, 0});
 
   98            LOG3(
"Discovered " << obj << 
" named " << newName);
 
   99            objectToNewName.emplace(obj, newName);
 
  102        T get(
cstring name)
 const { return ::get(nameToObject, name); }
 
  104        cstring get(T 
object)
 const { return ::get(objectToNewName, 
object, object->name.name); }
 
  107        bool contains(
cstring name)
 const { 
return nameToObject.find(name) != nameToObject.end(); }
 
  108        iterator begin() { 
return iterator(nameToObject.begin(), objectToNewName); }
 
  109        iterator end() { 
return iterator(nameToObject.end(), objectToNewName); }
 
  111            allNames->erase(name);
 
  112            auto obj = get(name);
 
  113            objectToNewName.erase(obj);
 
  114            nameToObject.erase(name);
 
  118    std::set<cstring> included_files;
 
  126    std::unordered_map<cstring, int> allNames;
 
  127    NamedObjectInfo<const IR::Type_StructLike *> types;
 
  128    NamedObjectInfo<const IR::HeaderOrMetadata *> metadata;
 
  129    NamedObjectInfo<const IR::Header *> headers;
 
  130    NamedObjectInfo<const IR::HeaderStack *> stacks;
 
  131    NamedObjectInfo<const IR::V1Control *> controls;
 
  132    NamedObjectInfo<const IR::V1Parser *> parserStates;
 
  133    NamedObjectInfo<const IR::V1Table *> tables;
 
  134    NamedObjectInfo<const IR::ActionFunction *> actions;
 
  135    NamedObjectInfo<const IR::Counter *> counters;
 
  136    NamedObjectInfo<const IR::Register *> registers;
 
  137    NamedObjectInfo<const IR::Meter *> meters;
 
  138    NamedObjectInfo<const IR::ActionProfile *> action_profiles;
 
  139    NamedObjectInfo<const IR::FieldList *> field_lists;
 
  140    NamedObjectInfo<const IR::FieldListCalculation *> field_list_calculations;
 
  141    NamedObjectInfo<const IR::ActionSelector *> action_selectors;
 
  142    NamedObjectInfo<const IR::Type_Extern *> extern_types;
 
  143    std::map<const IR::Type_Extern *, const IR::Type_Extern *> extern_remap;
 
  144    NamedObjectInfo<const IR::Declaration_Instance *> externs;
 
  145    NamedObjectInfo<const IR::ParserValueSet *> value_sets;
 
  146    std::set<cstring> value_sets_implemented;
 
  147    std::vector<const IR::CalculatedField *> calculated_fields;
 
  148    std::map<const IR::Node *, const IR::Declaration_Instance *> globalInstances;
 
  156    std::map<cstring, IR::Vector<IR::Expression>> extracts;  
 
  157    std::map<cstring, cstring> directCounters;               
 
  160    std::map<const IR::Meter *, const IR::Declaration_Instance *> meterMap;
 
  161    std::map<cstring, const IR::Declaration_Instance *> counterMap;
 
  165    std::map<const IR::V1Table *, const IR::V1Control *> tableMapping;
 
  166    std::map<const IR::V1Table *, const IR::Apply *> tableInvocation;
 
  181    std::map<cstring, const IR::ParserState *> parserEntryPoints;
 
  193    std::set<cstring> headerTypes;
 
  194    std::set<cstring> metadataTypes;
 
  195    std::set<cstring> parameterTypes;
 
  196    std::set<cstring> metadataInstances;
 
  197    std::set<cstring> headerInstances;
 
  205    const IR::Parameter *parserPacketIn = 
nullptr;
 
  206    const IR::Parameter *parserHeadersOut = 
nullptr;
 
  212    virtual const IR::Statement *convertPrimitive(
const IR::Primitive *primitive);
 
  213    virtual void checkHeaderType(
const IR::Type_StructLike *hrd, 
bool toStruct);
 
  232    static const IR::Annotations *addNameAnnotation(
cstring name,
 
  233                                                    const IR::Annotations *annos = 
nullptr);
 
  241                                                          const IR::Annotations *annos = 
nullptr);
 
  243    virtual const IR::ParserState *
convertParser(
const IR::V1Parser *,
 
  245    virtual const IR::Statement *convertParserStatement(
const IR::Expression *expr);
 
  246    virtual const IR::P4Control *convertControl(
const IR::V1Control *control, 
cstring newName);
 
  247    virtual const IR::Declaration_Instance *convertDirectMeter(
const IR::Meter *m, 
cstring newName);
 
  248    virtual const IR::Declaration_Instance *convertDirectCounter(
const IR::Counter *c,
 
  250    virtual const IR::Declaration_Instance *convert(
const IR::CounterOrMeter *cm, 
cstring newName);
 
  251    virtual const IR::Declaration_Instance *convertActionProfile(
const IR::ActionProfile *,
 
  253    virtual const IR::P4Table *convertTable(
const IR::V1Table *table, 
cstring newName,
 
  255                                            std::map<cstring, cstring> &);
 
  256    virtual const IR::P4Action *convertAction(
const IR::ActionFunction *action, 
cstring newName,
 
  257                                              const IR::Meter *meterToAccess,
 
  259    virtual const IR::Statement *convertMeterCall(
const IR::Meter *meterToAccess);
 
  260    virtual const IR::Statement *convertCounterCall(
cstring counterToAccess);
 
  261    virtual const IR::Type_Control *controlType(
IR::ID name);
 
  262    const IR::PathExpression *getState(
IR::ID dest);
 
  263    virtual const IR::Expression *counterType(
const IR::CounterOrMeter *cm);
 
  264    virtual void createChecksumVerifications();
 
  265    virtual void createChecksumUpdates();
 
  266    virtual void createStructures();
 
  267    virtual cstring createType(
const IR::Type_StructLike *type, 
bool header,
 
  268                               std::unordered_set<const IR::Type *> *converted);
 
  269    virtual void createParser();
 
  271    void createDeparserInternal(
IR::ID deparserId, IR::Parameter *packetOut, IR::Parameter *headers,
 
  272                                std::vector<IR::Parameter *>,
 
  274                                std::function<IR::BlockStatement *(IR::BlockStatement *)>);
 
  275    virtual void createDeparser();
 
  276    virtual void createMain();
 
  283    const IR::AssignmentStatement *assign(
Util::SourceInfo srcInfo, 
const IR::Expression *left,
 
  284                                          const IR::Expression *right, 
const IR::Type *type);
 
  285    virtual const IR::Expression *convertFieldList(
const IR::Expression *expression);
 
  287    virtual const IR::Expression *convertHashAlgorithms(
const IR::NameList *algorithm);
 
  288    virtual const IR::Declaration_Instance *convert(
const IR::Register *reg, 
cstring newName,
 
  289                                                    const IR::Type *regElementType = 
nullptr);
 
  290    virtual const IR::Type_Struct *createFieldListType(
const IR::Expression *expression);
 
  291    virtual const IR::FieldListCalculation *getFieldListCalculation(
const IR::Expression *);
 
  292    virtual const IR::FieldList *getFieldLists(
const IR::FieldListCalculation *flc);
 
  293    virtual const IR::Expression *paramReference(
const IR::Parameter *param);
 
  294    const IR::Statement *sliceAssign(
const IR::Primitive *prim, 
const IR::Expression *left,
 
  295                                     const IR::Expression *right, 
const IR::Expression *mask);
 
  296    void tablesReferred(
const IR::V1Control *control, std::vector<const IR::V1Table *> &out);
 
  297    bool isHeader(
const IR::ConcreteHeaderRef *nhr) 
const;
 
  299    bool isFieldInList(
cstring type, 
cstring field, 
const IR::FieldList *fl) 
const;
 
  305    const IR::Expression *
listIndex(
const IR::Expression *fl) 
const;
 
  307    const IR::Type *explodeType(
const std::vector<const IR::Type::Bits *> &fieldTypes);
 
  308    const IR::Expression *explodeLabel(
const IR::Constant *value, 
const IR::Constant *mask,
 
  309                                       const std::vector<const IR::Type::Bits *> &fieldTypes);
 
  313    const IR::V1Control *ingress;
 
  316    const IR::P4Control *verifyChecksums;
 
  317    const IR::P4Control *updateChecksums;
 
  318    const IR::P4Control *deparser;
 
  321    const int defaultRegisterWidth = 32;
 
  323    virtual void loadModel();
 
  324    void createExterns();