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();