61 StructTypeReplacement(
const P4::TypeMap *typeMap,
const IR::Type_StructLike *type,
64 flatten(typeMap, cstring::empty, type, type->annotations, vec, policy);
65 if (type->is<IR::Type_Struct>()) {
66 replacementType =
new IR::Type_Struct(type->srcInfo, type->name, std::move(vec));
67 }
else if (type->is<IR::Type_Header>()) {
68 replacementType =
new IR::Type_Header(type->srcInfo, type->name, std::move(vec));
70 BUG(
"Unexpected type %1%", type);
80 std::map<cstring, cstring> fieldNameRemap;
84 std::map<cstring, const IR::Type_StructLike *> structFieldMap;
92 const IR::Type *replacementType;
93 virtual void dbprint(std::ostream &out)
const { out << replacementType; }
100 auto ann = IR::Annotations::withoutNameAnnotation(annotations);
101 if (
auto st = type->to<T>()) {
103 st->annotations.where([policy](
const IR::Annotation *annot) {
104 if (!policy)
return false;
105 return policy->
keep(annot);
107 structFieldMap.emplace(
prefix, st);
108 for (
auto f : st->fields) {
111 fann.append(f->annotations);
112 auto ft = typeMap->getType(f,
true);
113 flatten(typeMap,
prefix +
"." + f->name, ft, fann, fields, policy);
117 cstring fieldName =
prefix.replace(
'.',
'_') + std::to_string(fieldNameRemap.size());
118 fieldNameRemap.emplace(
prefix, fieldName);
119 fields.push_back(
new IR::StructField(
IR::ID(fieldName), ann, type->getP4Type()));
120 LOG3(
"Flatten: " << type <<
" | " <<
prefix);
129 auto fieldType = ::P4::get(structFieldMap,
prefix);
130 BUG_CHECK(fieldType,
"No field for %1%",
prefix);
131 for (
auto f : fieldType->fields) {
133 auto newFieldname = ::P4::get(fieldNameRemap, fieldName);
134 const IR::Expression *expr;
135 if (!newFieldname.isNullOrEmpty()) {
136 expr =
new IR::Member(root, newFieldname);
138 expr =
explode(root, fieldName);
140 vec.push_back(
new IR::NamedExpression(f->name, expr));
142 auto type = fieldType->getP4Type()->template to<IR::Type_Name>();
143 return new IR::StructExpression(root->srcInfo, type, type, std::move(vec));
223 std::map<const IR::Parameter *, StructTypeReplacement<IR::Type_Struct> *> toReplace;
228 setName(
"ReplaceStructs");
231 const IR::Node *preorder(IR::P4Program *program)
override;
232 const IR::Node *postorder(IR::Member *expression)
override;
233 const IR::Node *preorder(IR::P4Parser *parser)
override;
234 const IR::Node *preorder(IR::P4Control *control)
override;
235 const IR::Node *postorder(IR::Type_Struct *type)
override;
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13