Skip to content

Commit a03e459

Browse files
committed
Custom parser/printer for header fields
1 parent 8eeb16c commit a03e459

File tree

3 files changed

+57
-2
lines changed

3 files changed

+57
-2
lines changed

include/p4mlir/Dialect/BMv2IR/BMv2IR_Types.td

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@ class BMv2IR_Type<string name, string typeMnemonic, list<Trait> traits = []>
1616
let mnemonic = typeMnemonic;
1717
}
1818

19+
// We use a custom parameter here to allow for an empty array of fields
20+
def FieldInfoArrayParameter : ArrayRefParameter<"BMv2IR::FieldInfo", "struct fields"> {
21+
let parser = "::mlir::FieldParser<::llvm::ArrayRef<BMv2IR::FieldInfo>>::parse($_parser)";
22+
let printer = [{
23+
$_printer << '[';
24+
llvm::interleaveComma($_self, $_printer, [&](BMv2IR::FieldInfo field) {
25+
$_printer << field;
26+
});
27+
$_printer << ']';
28+
}];
29+
}
30+
1931
def BMv2IR_HeaderType : BMv2IR_Type<"Header", "header"> {
2032
let summary = "BMv2 header type";
2133
let description = [{
@@ -32,12 +44,12 @@ def BMv2IR_HeaderType : BMv2IR_Type<"Header", "header"> {
3244

3345
let parameters = (ins
3446
StringRefParameter<"struct name">:$name,
35-
ArrayRefParameter<"BMv2IR::FieldInfo", "struct fields">:$fields,
47+
FieldInfoArrayParameter:$fields,
3648
OptionalParameter<"unsigned">:$max_length
3749
);
3850

3951
let assemblyFormat = [{
40-
`<` $name `,` `[` $fields `]`
52+
`<` $name `,` $fields
4153
(`,` `max_length` `=` $max_length^)?
4254
`>`
4355
}];

lib/Dialect/BMv2IR/BMv2IR_Types.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,28 @@ struct mlir::FieldParser<P4::P4MLIR::BMv2IR::FieldInfo> {
2929
}
3030
};
3131

32+
// Custom parser that allows an empty array of fields
33+
template <>
34+
struct mlir::FieldParser<llvm::ArrayRef<P4::P4MLIR::BMv2IR::FieldInfo>> {
35+
static FailureOr<llvm::SmallVector<P4::P4MLIR::BMv2IR::FieldInfo>> parse(AsmParser &parser) {
36+
llvm::SmallVector<P4::P4MLIR::BMv2IR::FieldInfo> result;
37+
38+
if (parser.parseLSquare()) return failure();
39+
40+
if (succeeded(parser.parseOptionalRSquare())) return result;
41+
42+
do {
43+
auto field = FieldParser<BMv2IR::FieldInfo>::parse(parser);
44+
if (failed(field)) return failure();
45+
result.push_back(*field);
46+
} while (succeeded(parser.parseOptionalComma()));
47+
48+
if (parser.parseRSquare()) return failure();
49+
50+
return result;
51+
}
52+
};
53+
3254
constexpr unsigned bitsInByte = 8;
3355
static unsigned computeTotalHeaderLenghtInBits(ArrayRef<BMv2IR::FieldInfo> fields) {
3456
unsigned total = 0;

test/Targets/BMv2/parser.mlir

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,3 +572,24 @@ module {
572572
// CHECK-NEXT: ]
573573
// CHECK-NEXT: }
574574
// CHECK-NEXT: ],
575+
576+
// -----
577+
578+
module {
579+
bmv2ir.header_instance @H_ipv4 : !bmv2ir.header<"ipv4_t", []>
580+
}
581+
582+
// CHECK: "header_types": [
583+
// CHECK: {
584+
// CHECK: "fields": [],
585+
// CHECK: "id": 0,
586+
// CHECK: "name": "ipv4_t"
587+
// CHECK: }
588+
// CHECK: ],
589+
// CHECK: "headers": [
590+
// CHECK: {
591+
// CHECK: "header_type": "ipv4_t",
592+
// CHECK: "id": 0,
593+
// CHECK: "metadata": false,
594+
// CHECK: "name": "H_ipv4"
595+
// CHECK: }

0 commit comments

Comments
 (0)