Skip to content

Commit 2bacd94

Browse files
committed
[FIRRTL] FIRParser: parse tagExtract operations
1 parent 0b3976c commit 2bacd94

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

lib/Dialect/FIRRTL/Import/FIRParser.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1967,6 +1967,7 @@ struct FIRStmtParser : public FIRParser {
19671967
ParseResult parseRefRelease();
19681968
ParseResult parseRefReleaseInitial();
19691969
ParseResult parseRefRead(Value &result);
1970+
ParseResult parseTagExtract(Value &result);
19701971
ParseResult parseProbe(Value &result);
19711972
ParseResult parsePropAssign();
19721973
ParseResult parseRWProbe(Value &result);
@@ -2122,6 +2123,14 @@ ParseResult FIRStmtParser::parseExpImpl(Value &result, const Twine &message,
21222123
if (parseRefRead(result))
21232124
return failure();
21242125
break;
2126+
case FIRToken::lp_tagExtract:
2127+
if (requireFeature(missingSpecFIRVersion, "Bools"))
2128+
return failure();
2129+
if (isLeadingStmt)
2130+
return emitError("unexpected tagExtract() as start of statement");
2131+
if (parseTagExtract(result))
2132+
return failure();
2133+
break;
21252134
case FIRToken::lp_probe:
21262135
if (isLeadingStmt)
21272136
return emitError("unexpected probe() as start of statement");
@@ -3956,6 +3965,28 @@ ParseResult FIRStmtParser::parseRefRead(Value &result) {
39563965
return success();
39573966
}
39583967

3968+
/// tagExtract ::= 'tagExtract' '(' exp ')'
3969+
ParseResult FIRStmtParser::parseTagExtract(Value &result) {
3970+
auto startTok = consumeToken(FIRToken::lp_tagExtract);
3971+
3972+
Value input;
3973+
if (parseExp(input, "expected expression in 'tagExtract'") ||
3974+
parseToken(FIRToken::r_paren, "expected ')' in 'tagExtract'"))
3975+
return failure();
3976+
3977+
locationProcessor.setLoc(startTok.getLoc());
3978+
3979+
// Check argument is an enum-type value.
3980+
if (!type_isa<FEnumType>(input.getType()))
3981+
return emitError(startTok.getLoc(),
3982+
"expected enum-type expression in 'tagExtract', got ")
3983+
<< input.getType();
3984+
3985+
result = builder.create<TagExtractOp>(input);
3986+
3987+
return success();
3988+
}
3989+
39593990
/// probe ::= 'probe' '(' static_ref ')'
39603991
ParseResult FIRStmtParser::parseProbe(Value &result) {
39613992
auto startTok = consumeToken(FIRToken::lp_probe);

lib/Dialect/FIRRTL/Import/FIRTokenKinds.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ TOK_LPKEYWORD(release_initial)
187187
TOK_LPKEYWORD(read)
188188
TOK_LPKEYWORD(probe)
189189
TOK_LPKEYWORD(rwprobe)
190+
TOK_LPKEYWORD(tagExtract)
190191

191192
TOK_LPKEYWORD(intrinsic)
192193
TOK_LPKEYWORD(cat)

test/Dialect/FIRRTL/parse-basic.fir

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -945,7 +945,7 @@ circuit MyModule : ; CHECK: firrtl.circuit "MyModule"
945945
; CHECK: }
946946
None:
947947
invalidate o
948-
948+
949949
; CHECK-LABEL: firrtl.module private @EnumInfer(
950950
module EnumInfer:
951951
input i : {| A: UInt<8>, None |}
@@ -954,6 +954,14 @@ circuit MyModule : ; CHECK: firrtl.circuit "MyModule"
954954
; CHECK: connect %o, %i
955955
connect o, i
956956

957+
; CHECK-LABEL: firrtl.module private @TagExtract
958+
module TagExtract:
959+
input i : {|A, B, C|}
960+
output o : UInt<2>
961+
; CHECK: %0 = firrtl.tagextract %i : !firrtl.enum<A, B, C>
962+
; CHECK: firrtl.matchingconnect %o, %0 : !firrtl.uint<2>
963+
connect o, tagExtract(i)
964+
957965
; CHECK-LABEL: module private @RefsChild(
958966
; CHECK-SAME: out %r: !firrtl.probe<uint<1>>
959967
; CHECK-SAME: out %rw: !firrtl.rwprobe<uint<1>>

0 commit comments

Comments
 (0)