From 22881148bd64dc5002860d25c7f87bea40d15c7a Mon Sep 17 00:00:00 2001 From: venkat1361 Date: Tue, 22 Oct 2024 01:14:08 -0500 Subject: [PATCH] Parsing Select() expression dimension args to support range of values. (#1074) * dim args for select token now supports range of values instead of single integer * dim args for select token now supports range of values instead of single integer * modified raw_ast fmt::format * CHANGELOG.md * varible rename for select dim from set to map in suffix * use : for giving range of values * Update source/lib/rocprofiler-sdk/counters/parser/scanner.cpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * format * Update CHANGELOG.md * using map instead of unordermap for select_dimension_map --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Gopesh Bhardwaj --- CHANGELOG.md | 1 + .../counters/parser/parser.cpp | 206 ++++++++++-------- .../rocprofiler-sdk/counters/parser/parser.h | 5 +- .../rocprofiler-sdk/counters/parser/parser.y | 19 +- .../counters/parser/raw_ast.hpp | 63 +++++- .../counters/parser/scanner.cpp | 108 ++++----- .../rocprofiler-sdk/counters/parser/scanner.l | 6 +- .../counters/parser/tests/parser_test.cpp | 143 ++++++------ 8 files changed, 323 insertions(+), 228 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c65f2af7ff..b2d10d6e81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -115,6 +115,7 @@ Full documentation for ROCprofiler-SDK is available at [Click Here](source/docs/ - Fixed MeanOccupancy* metrics - Fix aborted-app validation test to properly check for hipExtHostAlloc command now that it is supported - Fix for SQ and GRBM metrics implicitly reduced. +- Fix to handle a range of values for select() dimension in expressions parser. ### Removed - Removed gfx8 metric definitions. diff --git a/source/lib/rocprofiler-sdk/counters/parser/parser.cpp b/source/lib/rocprofiler-sdk/counters/parser/parser.cpp index 37c53c9937..632a31377e 100644 --- a/source/lib/rocprofiler-sdk/counters/parser/parser.cpp +++ b/source/lib/rocprofiler-sdk/counters/parser/parser.cpp @@ -82,7 +82,7 @@ yyerror(rocprofiler::counters::RawAST**, const char* s) ROCP_ERROR << s; } -#line 85 "parser.cpp" +#line 83 "parser.cpp" #ifndef YY_CAST # ifdef __cplusplus @@ -134,13 +134,14 @@ enum yysymbol_kind_t YYSYMBOL_REDUCE = 21, /* REDUCE */ YYSYMBOL_SELECT = 22, /* SELECT */ YYSYMBOL_ACCUMULATE = 23, /* ACCUMULATE */ - YYSYMBOL_LOWER_THAN_ELSE = 24, /* LOWER_THAN_ELSE */ - YYSYMBOL_ELSE = 25, /* ELSE */ - YYSYMBOL_YYACCEPT = 26, /* $accept */ - YYSYMBOL_top = 27, /* top */ - YYSYMBOL_exp = 28, /* exp */ - YYSYMBOL_reduce_dim_args = 29, /* reduce_dim_args */ - YYSYMBOL_select_dim_args = 30 /* select_dim_args */ + YYSYMBOL_DIM_ARGS_RANGE = 24, /* DIM_ARGS_RANGE */ + YYSYMBOL_LOWER_THAN_ELSE = 25, /* LOWER_THAN_ELSE */ + YYSYMBOL_ELSE = 26, /* ELSE */ + YYSYMBOL_YYACCEPT = 27, /* $accept */ + YYSYMBOL_top = 28, /* top */ + YYSYMBOL_exp = 29, /* exp */ + YYSYMBOL_reduce_dim_args = 30, /* reduce_dim_args */ + YYSYMBOL_select_dim_args = 31 /* select_dim_args */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; @@ -454,19 +455,19 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 13 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 60 +#define YYLAST 68 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 26 +#define YYNTOKENS 27 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 5 /* YYNRULES -- Number of rules. */ -#define YYNRULES 17 +#define YYNRULES 19 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 50 +#define YYNSTATES 56 /* YYMAXUTOK -- Last valid token kind. */ -#define YYMAXUTOK 279 +#define YYMAXUTOK 280 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM as returned by yylex, with out-of-bounds checking. */ @@ -477,22 +478,22 @@ union yyalloc /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM as returned by yylex. */ static const yytype_int8 yytranslate[] = { - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25}; + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ -static const yytype_int8 yyrline[] = - {0, 58, 58, 61, 62, 63, 64, 65, 66, 67, 70, 75, 79, 83, 90, 93, 100, 103}; +static const yytype_int8 yyrline[] = {0, 57, 57, 60, 61, 62, 63, 64, 65, 66, + 69, 74, 78, 82, 89, 92, 99, 103, 107, 112}; #endif /** Accessing symbol of state STATE. */ @@ -530,6 +531,7 @@ static const char* const yytname[] = {"\"end of file\"", "REDUCE", "SELECT", "ACCUMULATE", + "DIM_ARGS_RANGE", "LOWER_THAN_ELSE", "ELSE", "$accept", @@ -546,7 +548,7 @@ yysymbol_name(yysymbol_kind_t yysymbol) } #endif -#define YYPACT_NINF (-10) +#define YYPACT_NINF (-15) #define yypact_value_is_default(Yyn) ((Yyn) == YYPACT_NINF) @@ -556,20 +558,20 @@ yysymbol_name(yysymbol_kind_t yysymbol) /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -static const yytype_int8 yypact[] = {2, 2, -10, -10, -7, -2, 3, 21, 38, 27, 2, 2, 14, - -10, 2, 2, 2, 2, -10, 0, 23, 18, 13, 13, -10, -10, - 16, 28, 25, -9, 26, 37, -10, 39, 30, 36, -10, 29, 33, - 42, 40, 41, 43, -10, 29, 44, 26, -10, -10, -10}; +static const yytype_int8 yypact[] = { + 2, 2, -15, -15, -7, -2, 10, 21, 38, 27, 2, 2, 16, -15, 2, 2, 2, 2, -15, + 0, 23, 28, 29, 29, -15, -15, 26, 36, 30, -9, 31, 39, -15, 37, 44, 41, -15, 34, + 45, 47, 42, 43, -6, -15, 34, 48, 49, 50, -15, -15, 46, 51, 31, 31, -15, -15}; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. Performed when YYTABLE does not specify something else to do. Zero means the default is an error. */ -static const yytype_int8 yydefact[] = {0, 0, 3, 9, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 8, 0, 0, 0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 11, 0, - 0, 0, 10, 0, 0, 0, 14, 0, 16, 13, 0, 0, 0, 15, 12, 17}; +static const yytype_int8 yydefact[] = { + 0, 0, 3, 9, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 8, 0, 0, 0, 4, 5, 6, 7, 0, 0, + 0, 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 13, 0, 0, 0, 0, 15, 12, 16, 18, 0, 0, 17, 19}; /* YYPGOTO[NTERM-NUM]. */ -static const yytype_int8 yypgoto[] = {-10, -10, -1, 11, 10}; +static const yytype_int8 yypgoto[] = {-15, -15, -1, 20, -14}; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = {0, 7, 8, 41, 35}; @@ -578,28 +580,28 @@ static const yytype_int8 yydefgoto[] = {0, 7, 8, 41, 35}; positive, shift that token. If negative, reduce the rule whose number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int8 yytable[] = { - 9, 32, 10, 14, 15, 16, 17, 11, 33, 19, 20, 1, 12, 22, 23, 24, 25, 26, 16, 17, 2, - 13, 3, 4, 5, 6, 14, 15, 16, 17, 14, 15, 16, 17, 21, 28, 29, 18, 38, 30, 27, 14, - 15, 16, 17, 31, 34, 36, 39, 40, 37, 42, 43, 45, 48, 47, 49, 44, 0, 0, 46}; + 9, 32, 10, 14, 15, 16, 17, 11, 33, 19, 20, 1, 46, 22, 23, 24, 25, 26, 47, 12, 2, 13, 3, + 4, 5, 6, 14, 15, 16, 17, 14, 15, 16, 17, 16, 17, 21, 18, 54, 55, 27, 14, 15, 16, 17, 28, + 29, 30, 37, 36, 31, 34, 38, 39, 40, 45, 42, 43, 49, 44, 0, 50, 51, 52, 48, 0, 0, 0, 53}; -static const yytype_int8 yycheck[] = {1, 10, 9, 3, 4, 5, 6, 9, 17, 10, 11, 9, 9, 14, 15, 16, - 17, 17, 5, 6, 18, 0, 20, 21, 22, 23, 3, 4, 5, 6, 3, 4, - 5, 6, 20, 17, 20, 10, 8, 11, 17, 3, 4, 5, 6, 20, 20, 10, - 12, 20, 11, 18, 10, 12, 10, 44, 46, 17, -1, -1, 17}; +static const yytype_int8 yycheck[] = { + 1, 10, 9, 3, 4, 5, 6, 9, 17, 10, 11, 9, 18, 14, 15, 16, 17, 17, 24, 9, 18, 0, 20, + 21, 22, 23, 3, 4, 5, 6, 3, 4, 5, 6, 5, 6, 20, 10, 52, 53, 17, 3, 4, 5, 6, 17, + 20, 11, 11, 10, 20, 20, 8, 12, 20, 12, 11, 10, 10, 17, -1, 12, 12, 17, 44, -1, -1, -1, 17}; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of state STATE-NUM. */ -static const yytype_int8 yystos[] = {0, 9, 18, 20, 21, 22, 23, 27, 28, 28, 9, 9, 9, - 0, 3, 4, 5, 6, 10, 28, 28, 20, 28, 28, 28, 28, - 17, 17, 17, 20, 11, 20, 10, 17, 20, 30, 10, 11, 8, - 12, 20, 29, 18, 10, 17, 12, 17, 29, 10, 30}; +static const yytype_int8 yystos[] = {0, 9, 18, 20, 21, 22, 23, 28, 29, 29, 9, 9, 9, 0, + 3, 4, 5, 6, 10, 29, 29, 20, 29, 29, 29, 29, 17, 17, + 17, 20, 11, 20, 10, 17, 20, 31, 10, 11, 8, 12, 20, 30, + 11, 10, 17, 12, 18, 24, 30, 10, 12, 12, 17, 17, 31, 31}; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ -static const yytype_int8 yyr1[] = - {0, 26, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 30, 30}; +static const yytype_int8 yyr1[] = {0, 27, 28, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 30, 30, 31, 31, 31, 31}; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ -static const yytype_int8 yyr2[] = {0, 2, 1, 1, 3, 3, 3, 3, 3, 1, 6, 6, 10, 8, 1, 3, 3, 5}; +static const yytype_int8 yyr2[] = {0, 2, 1, 1, 3, 3, 3, 3, 3, 1, 6, 6, 10, 8, 1, 3, 5, 7, 5, 7}; enum { @@ -1024,143 +1026,163 @@ yyreduce: switch(yyn) { case 2: /* top: exp */ -#line 58 "parser.y" +#line 57 "parser.y" { *result = (yyvsp[0].a); } -#line 1122 "parser.cpp" +#line 1204 "parser.cpp" break; case 3: /* exp: NUMBER */ -#line 61 "parser.y" +#line 60 "parser.y" { (yyval.a) = new RawAST(NUMBER_NODE, (yyvsp[0].d)); } -#line 1128 "parser.cpp" +#line 1210 "parser.cpp" break; case 4: /* exp: exp ADD exp */ -#line 62 "parser.y" +#line 61 "parser.y" { (yyval.a) = new RawAST(ADDITION_NODE, {(yyvsp[-2].a), (yyvsp[0].a)}); } -#line 1134 "parser.cpp" +#line 1216 "parser.cpp" break; case 5: /* exp: exp SUB exp */ -#line 63 "parser.y" +#line 62 "parser.y" { (yyval.a) = new RawAST(SUBTRACTION_NODE, {(yyvsp[-2].a), (yyvsp[0].a)}); } -#line 1140 "parser.cpp" +#line 1222 "parser.cpp" break; case 6: /* exp: exp MUL exp */ -#line 64 "parser.y" +#line 63 "parser.y" { (yyval.a) = new RawAST(MULTIPLY_NODE, {(yyvsp[-2].a), (yyvsp[0].a)}); } -#line 1146 "parser.cpp" +#line 1228 "parser.cpp" break; case 7: /* exp: exp DIV exp */ -#line 65 "parser.y" +#line 64 "parser.y" { (yyval.a) = new RawAST(DIVIDE_NODE, {(yyvsp[-2].a), (yyvsp[0].a)}); } -#line 1152 "parser.cpp" +#line 1234 "parser.cpp" break; case 8: /* exp: OP exp CP */ -#line 66 "parser.y" +#line 65 "parser.y" { (yyval.a) = (yyvsp[-1].a); } -#line 1158 "parser.cpp" +#line 1240 "parser.cpp" break; case 9: /* exp: NAME */ -#line 67 "parser.y" +#line 66 "parser.y" { (yyval.a) = new RawAST(REFERENCE_NODE, (yyvsp[0].s)); free((yyvsp[0].s)); } -#line 1166 "parser.cpp" +#line 1248 "parser.cpp" break; case 10: /* exp: ACCUMULATE OP NAME CM NAME CP */ -#line 70 "parser.y" +#line 69 "parser.y" { (yyval.a) = new RawAST(ACCUMULATE_NODE, (yyvsp[-3].s), (yyvsp[-1].s)); free((yyvsp[-3].s)); free((yyvsp[-1].s)); } -#line 1176 "parser.cpp" +#line 1258 "parser.cpp" break; case 11: /* exp: REDUCE OP exp CM NAME CP */ -#line 75 "parser.y" +#line 74 "parser.y" { (yyval.a) = new RawAST(REDUCE_NODE, (yyvsp[-3].a), (yyvsp[-1].s), NULL); free((yyvsp[-1].s)); } -#line 1185 "parser.cpp" +#line 1267 "parser.cpp" break; case 12: /* exp: REDUCE OP exp CM NAME CM O_SQ reduce_dim_args C_SQ CP */ -#line 79 "parser.y" +#line 78 "parser.y" { (yyval.a) = new RawAST(REDUCE_NODE, (yyvsp[-7].a), (yyvsp[-5].s), (yyvsp[-2].ll)); free((yyvsp[-5].s)); } -#line 1194 "parser.cpp" +#line 1276 "parser.cpp" break; case 13: /* exp: SELECT OP exp CM O_SQ select_dim_args C_SQ CP */ -#line 83 "parser.y" +#line 82 "parser.y" { (yyval.a) = new RawAST(SELECT_NODE, (yyvsp[-5].a), (yyvsp[-2].ll)); } -#line 1202 "parser.cpp" +#line 1284 "parser.cpp" break; case 14: /* reduce_dim_args: NAME */ -#line 90 "parser.y" +#line 89 "parser.y" { (yyval.ll) = new LinkedList((yyvsp[0].s), NULL); free((yyvsp[0].s)); } -#line 1210 "parser.cpp" +#line 1292 "parser.cpp" break; case 15: /* reduce_dim_args: NAME CM reduce_dim_args */ -#line 93 "parser.y" +#line 92 "parser.y" { (yyval.ll) = new LinkedList((yyvsp[-2].s), (yyvsp[0].ll)); free((yyvsp[-2].s)); } -#line 1218 "parser.cpp" +#line 1300 "parser.cpp" break; - case 16: /* select_dim_args: NAME EQUALS NUMBER */ -#line 100 "parser.y" + case 16: /* select_dim_args: NAME EQUALS O_SQ NUMBER C_SQ */ +#line 99 "parser.y" { - (yyval.ll) = new LinkedList((yyvsp[-2].s), (yyvsp[0].d), NULL); - free((yyvsp[-2].s)); - } -#line 1226 "parser.cpp" - break; - - case 17: /* select_dim_args: NAME EQUALS NUMBER CM select_dim_args */ -#line 103 "parser.y" - { - (yyval.ll) = new LinkedList((yyvsp[-4].s), (yyvsp[-2].d), (yyvsp[0].ll)); + (yyval.ll) = new LinkedList((yyvsp[-4].s), (yyvsp[-1].d), NULL); free((yyvsp[-4].s)); } -#line 1234 "parser.cpp" +#line 1309 "parser.cpp" break; -#line 1238 "parser.cpp" + case 17: /* select_dim_args: NAME EQUALS O_SQ NUMBER C_SQ CM select_dim_args */ +#line 103 "parser.y" + { + (yyval.ll) = new LinkedList((yyvsp[-6].s), (yyvsp[-3].d), (yyvsp[0].ll)); + free((yyvsp[-6].s)); + } +#line 1318 "parser.cpp" + break; + + case 18: /* select_dim_args: NAME EQUALS O_SQ DIM_ARGS_RANGE C_SQ */ +#line 107 "parser.y" + { + (yyval.ll) = new LinkedList((yyvsp[-4].s), (yyvsp[-1].s), NULL); + free((yyvsp[-4].s)); + free((yyvsp[-1].s)); + } +#line 1328 "parser.cpp" + break; + + case 19: /* select_dim_args: NAME EQUALS O_SQ DIM_ARGS_RANGE C_SQ CM select_dim_args */ +#line 112 "parser.y" + { + (yyval.ll) = new LinkedList((yyvsp[-6].s), (yyvsp[-3].s), (yyvsp[0].ll)); + free((yyvsp[-6].s)); + free((yyvsp[-3].s)); + } +#line 1338 "parser.cpp" + break; + +#line 1342 "parser.cpp" default: break; } @@ -1334,4 +1356,4 @@ yyreturnlab: return yyresult; } -#line 109 "parser.y" +#line 120 "parser.y" diff --git a/source/lib/rocprofiler-sdk/counters/parser/parser.h b/source/lib/rocprofiler-sdk/counters/parser/parser.h index 7c3abb2694..ee72bf66e7 100644 --- a/source/lib/rocprofiler-sdk/counters/parser/parser.h +++ b/source/lib/rocprofiler-sdk/counters/parser/parser.h @@ -82,8 +82,9 @@ enum yytokentype REDUCE = 275, /* REDUCE */ SELECT = 276, /* SELECT */ ACCUMULATE = 277, /* ACCUMULATE */ - LOWER_THAN_ELSE = 278, /* LOWER_THAN_ELSE */ - ELSE = 279 /* ELSE */ + DIM_ARGS_RANGE = 278, /* DIM_ARGS_RANGE */ + LOWER_THAN_ELSE = 279, /* LOWER_THAN_ELSE */ + ELSE = 280 /* ELSE */ }; typedef enum yytokentype yytoken_kind_t; #endif diff --git a/source/lib/rocprofiler-sdk/counters/parser/parser.y b/source/lib/rocprofiler-sdk/counters/parser/parser.y index 3e7cb80a42..6f4f927144 100644 --- a/source/lib/rocprofiler-sdk/counters/parser/parser.y +++ b/source/lib/rocprofiler-sdk/counters/parser/parser.y @@ -40,8 +40,9 @@ void yyerror(rocprofiler::counters::RawAST**, const char *s) { ROCP_ERROR << s; %token NAME /* set data type for variables and user-defined functions */ %token REDUCE SELECT /* set data type for special functions */ %token ACCUMULATE +%token DIM_ARGS_RANGE %type exp /* set data type for expressions */ -%type NAME +%type NAME DIM_ARGS_RANGE %type NUMBER %type reduce_dim_args select_dim_args @@ -95,12 +96,24 @@ reduce_dim_args: NAME { $$ = new LinkedList($1, NULL); -select_dim_args: NAME EQUALS NUMBER { $$ = new LinkedList($1, $3, NULL); +select_dim_args: NAME EQUALS O_SQ NUMBER C_SQ { + $$ = new LinkedList($1, $4, NULL); free($1); } - | NAME EQUALS NUMBER CM select_dim_args { $$ = new LinkedList($1, $3, $5); + | NAME EQUALS O_SQ NUMBER C_SQ CM select_dim_args { + $$ = new LinkedList($1, $4, $7); free($1); } + | NAME EQUALS O_SQ DIM_ARGS_RANGE C_SQ { + $$ = new LinkedList($1, $4, NULL); + free($1); + free($4); + } + | NAME EQUALS O_SQ DIM_ARGS_RANGE C_SQ CM select_dim_args { + $$ = new LinkedList($1, $4, $7); + free($1); + free($4); + } ; diff --git a/source/lib/rocprofiler-sdk/counters/parser/raw_ast.hpp b/source/lib/rocprofiler-sdk/counters/parser/raw_ast.hpp index b35d245f85..75d45a3c44 100644 --- a/source/lib/rocprofiler-sdk/counters/parser/raw_ast.hpp +++ b/source/lib/rocprofiler-sdk/counters/parser/raw_ast.hpp @@ -22,6 +22,7 @@ #pragma once +#include "lib/common/logging.hpp" #include "lib/common/utility.hpp" #include "lib/rocprofiler-sdk/counters/id_decode.hpp" @@ -68,6 +69,7 @@ struct LinkedList { std::string name; int data{-1}; + std::string range_data; LinkedList* next{nullptr}; LinkedList(const char* v, LinkedList* next_node) : name(std::string{CHECK_NOTNULL(v)}) @@ -78,6 +80,11 @@ struct LinkedList , data(d) , next(next_node) {} + LinkedList(const char* v, const char* r, LinkedList* next_node) + : name(std::string{CHECK_NOTNULL(v)}) + , range_data(std::string{CHECK_NOTNULL(r)}) + , next(next_node) + {} }; struct RawAST @@ -100,7 +107,7 @@ struct RawAST std::unordered_set reduce_dimension_set; // Dimension set to select certain dimensions from the result - std::unordered_map select_dimension_set; + std::map select_dimension_map; // Range restriction on this node RawAST* range{nullptr}; @@ -197,8 +204,7 @@ struct RawAST { if(dimensions) { - LinkedList* ptr = dimensions; - while(ptr) + while(dimensions) { const rocprofiler_profile_counter_instance_types* dim = rocprofiler::common::get_val(get_dim_map(), dimensions->name); @@ -208,9 +214,12 @@ struct RawAST fmt::format("Unknown Dimension - {}", dimensions->name)); } - select_dimension_set.insert({*dim, ptr->data}); - LinkedList* current = ptr; - ptr = ptr->next; + select_dimension_map.insert({*dim, + (dimensions->data != -1) + ? std::to_string(dimensions->data) + : dimensions->range_data}); + LinkedList* current = dimensions; + dimensions = dimensions->next; delete current; } } @@ -285,6 +294,38 @@ struct formatter out = fmt::format_to(out, " \"Range\":{},", *ast.range); } + static const std::map + SelectDimensionTypeToString = { + {rocprofiler::counters::rocprofiler_profile_counter_instance_types:: + ROCPROFILER_DIMENSION_NONE, + "DIMENSION_NONE"}, + {rocprofiler::counters::rocprofiler_profile_counter_instance_types:: + ROCPROFILER_DIMENSION_XCC, + "DIMENSION_XCC"}, + {rocprofiler::counters::rocprofiler_profile_counter_instance_types:: + ROCPROFILER_DIMENSION_AID, + "DIMENSION_AID"}, + {rocprofiler::counters::rocprofiler_profile_counter_instance_types:: + ROCPROFILER_DIMENSION_SHADER_ENGINE, + "DIMENSION_SHADER_ENGINE"}, + {rocprofiler::counters::rocprofiler_profile_counter_instance_types:: + ROCPROFILER_DIMENSION_AGENT, + "DIMENSION_AGENT"}, + {rocprofiler::counters::rocprofiler_profile_counter_instance_types:: + ROCPROFILER_DIMENSION_SHADER_ARRAY, + "DIMENSION_SHADER_ARRAY"}, + {rocprofiler::counters::rocprofiler_profile_counter_instance_types:: + ROCPROFILER_DIMENSION_WGP, + "DIMENSION_WGP"}, + {rocprofiler::counters::rocprofiler_profile_counter_instance_types:: + ROCPROFILER_DIMENSION_INSTANCE, + "DIMENSION_INSTANCE"}, + {rocprofiler::counters::rocprofiler_profile_counter_instance_types:: + ROCPROFILER_DIMENSION_LAST, + "DIMENSION_LAST"}, + }; + out = fmt::format_to(out, " \"Counter_Set\":["); for(const auto& ref : ast.counter_set) { @@ -302,15 +343,15 @@ struct formatter ++ReduceSetIndex == ast.reduce_dimension_set.size() ? "" : ","); } - out = fmt::format_to(out, "], \"Select_Dimension_Set\":["); + out = fmt::format_to(out, "], \"Select_Dimension_Map\":["); size_t SelectSetIndex = 0; - for(const auto& [type, val] : ast.select_dimension_set) + for(const auto& [type, val] : ast.select_dimension_map) { out = fmt::format_to(out, - "\"{},{}\"{}", - static_cast(type), + "\"{}:\"{}\"\"{}", + SelectDimensionTypeToString.at(type), val, - ++SelectSetIndex == ast.select_dimension_set.size() ? "" : ","); + ++SelectSetIndex == ast.select_dimension_map.size() ? "" : ","); } return fmt::format_to(out, "]}}"); diff --git a/source/lib/rocprofiler-sdk/counters/parser/scanner.cpp b/source/lib/rocprofiler-sdk/counters/parser/scanner.cpp index aa161b6df1..57acd7186d 100644 --- a/source/lib/rocprofiler-sdk/counters/parser/scanner.cpp +++ b/source/lib/rocprofiler-sdk/counters/parser/scanner.cpp @@ -1,6 +1,5 @@ -#line 2 "scanner.cpp" -#line 4 "scanner.cpp" +#line 3 "scanner.cpp" #define YY_INT_ALIGNED short int @@ -388,8 +387,8 @@ yy_fatal_error(const char* msg); (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 23 -#define YY_END_OF_BUFFER 24 +#define YY_NUM_RULES 24 +#define YY_END_OF_BUFFER 25 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -397,10 +396,10 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[58] = { - 0, 0, 0, 24, 22, 21, 19, 6, 7, 3, 1, 9, 2, 22, 4, 14, 10, 8, 18, 11, - 12, 18, 18, 18, 5, 14, 20, 13, 14, 0, 18, 18, 18, 18, 20, 13, 0, 0, 14, 18, - 18, 18, 0, 13, 18, 18, 18, 18, 18, 18, 18, 15, 16, 18, 18, 18, 17, 0}; +static const flex_int16_t yy_accept[64] = { + 0, 0, 0, 25, 23, 22, 20, 6, 7, 3, 1, 9, 2, 23, 4, 14, 10, 8, 18, 11, 12, 18, + 18, 18, 5, 14, 21, 0, 13, 14, 0, 0, 18, 18, 18, 18, 21, 19, 13, 0, 19, 0, 14, 18, + 18, 18, 0, 0, 13, 18, 18, 18, 19, 18, 18, 18, 18, 15, 16, 18, 18, 18, 17, 0}; static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -422,37 +421,37 @@ static const YY_CHAR yy_ec[256] = { static const YY_CHAR yy_meta[30] = {0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 3, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1}; -static const flex_int16_t yy_base[60] = { - 0, 0, 0, 81, 82, 82, 82, 82, 82, 82, 82, 82, 82, 68, 68, 20, 82, 82, 0, 82, - 82, 58, 55, 54, 82, 19, 0, 21, 28, 39, 0, 55, 53, 50, 0, 33, 45, 60, 59, 42, - 41, 46, 55, 54, 41, 44, 43, 34, 39, 32, 33, 0, 0, 34, 20, 17, 0, 82, 31, 57}; +static const flex_int16_t yy_base[66] = { + 0, 0, 0, 89, 90, 90, 90, 90, 90, 90, 90, 90, 90, 76, 76, 22, 90, 90, 0, 90, 90, 66, + 63, 62, 90, 21, 0, 71, 24, 0, 70, 38, 0, 61, 59, 56, 0, 40, 39, 47, 50, 66, 65, 48, + 47, 52, 61, 60, 59, 46, 49, 48, 52, 38, 41, 30, 26, 0, 0, 23, 14, 17, 0, 90, 28, 64}; -static const flex_int16_t yy_def[60] = {0, 57, 1, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 58, 57, 57, 58, 58, 58, 57, 57, 59, 57, 57, 57, - 58, 58, 58, 58, 59, 57, 57, 57, 57, 58, 58, 58, 57, 57, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 0, 57, 57}; +static const flex_int16_t yy_def[66] = { + 0, 63, 1, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 63, 63, 64, + 64, 64, 63, 63, 65, 63, 63, 15, 63, 63, 64, 64, 64, 64, 65, 63, 63, 63, 63, 63, 63, 64, + 64, 64, 63, 63, 63, 64, 64, 64, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 63, 63}; -static const flex_int16_t yy_nxt[112] = { +static const flex_int16_t yy_nxt[120] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 19, 20, 21, 18, - 18, 18, 18, 18, 22, 23, 18, 18, 24, 27, 25, 28, 35, 30, 29, 29, 36, 27, 56, 28, 29, - 29, 36, 29, 35, 37, 55, 37, 36, 29, 38, 42, 54, 42, 36, 53, 43, 34, 52, 34, 51, 50, - 49, 48, 47, 43, 43, 46, 45, 44, 38, 38, 41, 40, 39, 33, 32, 31, 26, 25, 57, 3, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 18, 18, 18, 18, 22, 23, 18, 18, 24, 27, 32, 28, 25, 29, 30, 38, 31, 31, 62, 39, 61, + 60, 31, 31, 41, 39, 41, 27, 59, 42, 38, 37, 46, 47, 39, 47, 58, 27, 48, 27, 39, 40, + 57, 52, 36, 56, 36, 55, 54, 53, 48, 48, 52, 51, 50, 49, 42, 42, 45, 44, 43, 40, 37, + 35, 34, 33, 26, 25, 63, 3, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}; + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}; -static const flex_int16_t yy_chk[112] = { +static const flex_int16_t yy_chk[120] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 15, 25, 15, 27, 58, 25, 15, 27, 28, 55, 28, 25, - 15, 27, 28, 35, 29, 54, 29, 35, 28, 29, 36, 53, 36, 35, 50, 36, 59, 49, 59, 48, 47, - 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 33, 32, 31, 23, 22, 21, 14, 13, 3, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 15, 64, 15, 25, 15, 15, 28, 25, 15, 61, 28, 60, + 59, 25, 15, 31, 28, 31, 37, 56, 31, 38, 37, 37, 39, 38, 39, 55, 40, 39, 52, 38, 40, + 54, 52, 65, 53, 65, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 35, 34, 33, 30, 27, + 23, 22, 21, 14, 13, 3, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57}; + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}; /* Table of booleans, true if rule could match eol. */ -static const flex_int32_t yy_rule_can_match_eol[24] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, +static const flex_int32_t yy_rule_can_match_eol[25] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, }; static yy_state_type yy_last_accepting_state; @@ -477,9 +476,9 @@ char* yytext; #include "raw_ast.hpp" using namespace std; #define YYDEBUG 1 -#line 518 "scanner.cpp" -/* float exponent */ #line 520 "scanner.cpp" +/* float exponent */ +#line 522 "scanner.cpp" #define INITIAL 0 @@ -714,7 +713,7 @@ YY_DECL { #line 15 "scanner.l" -#line 737 "scanner.cpp" +#line 739 "scanner.cpp" while(/*CONSTCOND*/ 1) /* loops until end-of-file is reached */ { @@ -741,11 +740,11 @@ YY_DECL while(yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) { yy_current_state = (int) yy_def[yy_current_state]; - if(yy_current_state >= 58) yy_c = yy_meta[yy_c]; + if(yy_current_state >= 64) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; - } while(yy_base[yy_current_state] != 82); + } while(yy_base[yy_current_state] != 90); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -883,34 +882,41 @@ YY_DECL return NAME; } YY_BREAK - case 19: - /* rule 19 can match eol */ + case 19: YY_RULE_SETUP +#line 42 "scanner.l" + { + yylval.s = strdup(yytext); + return DIM_ARGS_RANGE; + } + YY_BREAK + case 20: + /* rule 20 can match eol */ YY_RULE_SETUP -#line 43 "scanner.l" +#line 48 "scanner.l" { return EOL; } YY_BREAK - case 20: YY_RULE_SETUP -#line 44 "scanner.l" + case 21: YY_RULE_SETUP +#line 49 "scanner.l" YY_BREAK - case 21: YY_RULE_SETUP -#line 45 "scanner.l" + case 22: YY_RULE_SETUP +#line 50 "scanner.l" { /* ignore white space */ } YY_BREAK - case 22: YY_RULE_SETUP -#line 46 "scanner.l" + case 23: YY_RULE_SETUP +#line 51 "scanner.l" { throw std::runtime_error(fmt::format("Mystery character {}", *yytext)); } YY_BREAK - case 23: YY_RULE_SETUP -#line 47 "scanner.l" + case 24: YY_RULE_SETUP +#line 52 "scanner.l" YY_FATAL_ERROR("flex scanner jammed"); YY_BREAK -#line 921 "scanner.cpp" +#line 931 "scanner.cpp" case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: @@ -1194,7 +1200,7 @@ yy_get_previous_state(void) while(yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) { yy_current_state = (int) yy_def[yy_current_state]; - if(yy_current_state >= 58) yy_c = yy_meta[yy_c]; + if(yy_current_state >= 64) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; } @@ -1222,10 +1228,10 @@ yy_try_NUL_trans(yy_state_type yy_current_state) while(yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) { yy_current_state = (int) yy_def[yy_current_state]; - if(yy_current_state >= 58) yy_c = yy_meta[yy_c]; + if(yy_current_state >= 64) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 57); + yy_is_jam = (yy_current_state == 63); return yy_is_jam ? 0 : yy_current_state; } @@ -1871,4 +1877,4 @@ yyfree(void* ptr) #define YYTABLES_NAME "yytables" -#line 47 "scanner.l" +#line 52 "scanner.l" diff --git a/source/lib/rocprofiler-sdk/counters/parser/scanner.l b/source/lib/rocprofiler-sdk/counters/parser/scanner.l index 411eeaa0e0..a1f7edf7ea 100644 --- a/source/lib/rocprofiler-sdk/counters/parser/scanner.l +++ b/source/lib/rocprofiler-sdk/counters/parser/scanner.l @@ -39,10 +39,14 @@ EXP ([Ee][-+]?[0-9]+) yylval.s = strdup(yytext); return NAME; } +([0-9]+(:[0-9]+)?)(,[0-9]+(:[0-9]+)?)* { + yylval.s = strdup(yytext); + return DIM_ARGS_RANGE; +} + \n { return EOL; } "//".* [ \t] { /* ignore white space */ } . { throw std::runtime_error(fmt::format("Mystery character {}", *yytext)); } %% - diff --git a/source/lib/rocprofiler-sdk/counters/parser/tests/parser_test.cpp b/source/lib/rocprofiler-sdk/counters/parser/tests/parser_test.cpp index 2d863cff70..584cec7a1b 100644 --- a/source/lib/rocprofiler-sdk/counters/parser/tests/parser_test.cpp +++ b/source/lib/rocprofiler-sdk/counters/parser/tests/parser_test.cpp @@ -37,45 +37,45 @@ TEST(parser, base_ops) "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"AB\", \"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}," + "\"Select_Dimension_Map\":[]}," "{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"BA\", " - "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], " + "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], " "\"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}"}, + "\"Select_Dimension_Map\":[]}"}, {"AB + BA", "{\"Type\":\"ADDITION_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"AB\", \"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}," + "\"Select_Dimension_Map\":[]}," "{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"BA\", " - "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], " + "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], " "\"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}"}, + "\"Select_Dimension_Map\":[]}"}, {"CD - ZX", "{\"Type\":\"SUBTRACTION_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"CD\", \"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}," + "\"Select_Dimension_Map\":[]}," "{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"ZX\", " - "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], " + "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], " "\"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}"}, + "\"Select_Dimension_Map\":[]}"}, {"NM / DB", "{\"Type\":\"DIVIDE_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"NM\", \"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}," + "\"Select_Dimension_Map\":[]}," "{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"DB\", " - "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], " + "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], " "\"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}"}}; + "\"Select_Dimension_Map\":[]}"}}; for(auto [op, expected] : expressionToExpected) { @@ -99,16 +99,16 @@ TEST(parser, order_of_ops) "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"AB\", \"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}," + "\"Select_Dimension_Map\":[]}," "{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"BA\", " - "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], " + "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], " "\"Reduce_Dimension_Set\":[]," - " \"Select_Dimension_Set\":[]},{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " + " \"Select_Dimension_Map\":[]},{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"CD\", \"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}], " - "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}"}, + "\"Select_Dimension_Map\":[]}], " + "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}"}, {"(AB / BA) - BN", "{\"Type\":\"SUBTRACTION_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"DIVIDE_NODE\", \"REDUCE_OP\":\"\", " @@ -116,49 +116,49 @@ TEST(parser, order_of_ops) "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"AB\", \"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}," + "\"Select_Dimension_Map\":[]}," "{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"BA\", " - "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], " + "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], " "\"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]},{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " + "\"Select_Dimension_Map\":[]},{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"BN\", \"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}], " - "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}"}, + "\"Select_Dimension_Map\":[]}], " + "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}"}, {"AD / (CD - ZX)", "{\"Type\":\"DIVIDE_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"AD\", \"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}," + "\"Select_Dimension_Map\":[]}," "{\"Type\":\"SUBTRACTION_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", \"Value\":\"CD\", " "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]},{\"Type\":\"REFERENCE_NODE\", " + "\"Select_Dimension_Map\":[]},{\"Type\":\"REFERENCE_NODE\", " "\"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", \"Value\":\"ZX\", \"Counter_Set\":[], " "\"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}], " - "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}"}, + "\"Select_Dimension_Map\":[]}], \"Reduce_Dimension_Set\":[], " + "\"Select_Dimension_Map\":[]}], " + "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}"}, {"MN * (NM / DB)", "{\"Type\":\"MULTIPLY_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"MN\", \"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}," + "\"Select_Dimension_Map\":[]}," "{\"Type\":\"DIVIDE_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"NM\", \"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}," + "\"Select_Dimension_Map\":[]}," "{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"DB\", " - "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], " + "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], " "\"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}"}}; + "\"Select_Dimension_Map\":[]}], \"Reduce_Dimension_Set\":[], " + "\"Select_Dimension_Map\":[]}"}}; for(auto [op, expected] : expressionToExpected) { @@ -179,8 +179,8 @@ TEST(parser, reduction) "{\"Type\":\"REDUCE_NODE\", \"REDUCE_OP\":\"SUM\", \"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", \"Value\":\"AB\", " - "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], " - "\"Reduce_Dimension_Set\":[\"3\",\"1\"], \"Select_Dimension_Set\":[]}"}, + "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], " + "\"Reduce_Dimension_Set\":[\"3\",\"1\"], \"Select_Dimension_Map\":[]}"}, {"reduce(AB+CD, SUM, [DIMENSION_XCC,DIMENSION_SHADER_ENGINE])", "{\"Type\":\"REDUCE_NODE\", \"REDUCE_OP\":\"SUM\", \"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"ADDITION_NODE\", \"REDUCE_OP\":\"\", " @@ -188,12 +188,12 @@ TEST(parser, reduction) "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", \"Value\":\"AB\", " "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]},{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " + "\"Select_Dimension_Map\":[]},{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", " "\"Value\":\"CD\", \"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}], \"Reduce_Dimension_Set\":[\"3\",\"1\"], " - "\"Select_Dimension_Set\":[]}"}, + "\"Select_Dimension_Map\":[]}], \"Reduce_Dimension_Set\":[], " + "\"Select_Dimension_Map\":[]}], \"Reduce_Dimension_Set\":[\"3\",\"1\"], " + "\"Select_Dimension_Map\":[]}"}, {"reduce(AB,DIV, [DIMENSION_XCC,DIMENSION_SHADER_ENGINE])+reduce(DC,SUM, " "[DIMENSION_XCC,DIMENSION_SHADER_ENGINE])", "{\"Type\":\"ADDITION_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " @@ -201,15 +201,15 @@ TEST(parser, reduction) "\"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", \"Value\":\"AB\", " - "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], " + "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], " "\"Reduce_Dimension_Set\":[\"3\",\"1\"], " - "\"Select_Dimension_Set\":[]},{\"Type\":\"REDUCE_NODE\", \"REDUCE_OP\":\"SUM\", " + "\"Select_Dimension_Map\":[]},{\"Type\":\"REDUCE_NODE\", \"REDUCE_OP\":\"SUM\", " "\"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", \"Value\":\"DC\", " - "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], " - "\"Reduce_Dimension_Set\":[\"3\",\"1\"], \"Select_Dimension_Set\":[]}], " - "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}"}}; + "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], " + "\"Reduce_Dimension_Set\":[\"3\",\"1\"], \"Select_Dimension_Map\":[]}], " + "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}"}}; for(auto [op, expected] : expressionToExpected) { @@ -223,36 +223,43 @@ TEST(parser, reduction) } } -TEST(parser, DISABLED_selection) +TEST(parser, selection) { std::map expressionToExpected = { - {"select(AB, [SE=1,XCC=0])+select(DC,[SE=2])", + {"select(AB, " + "[DIMENSION_SHADER_ENGINE=[1:5,7:9],DIMENSION_XCC=[0,2:4,8]])+select(DC,[DIMENSION_SHADER_" + "ENGINE=[1:3,6,8]])", "{\"Type\":\"ADDITION_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"SELECT_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", \"Value\":\"AB\", " - "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], " - "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[\"(\"XCC\", 0)\",\"(\"SE\", " - "1)\"]},{\"Type\":\"SELECT_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " + "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], " + "\"Reduce_Dimension_Set\":[], " + "\"Select_Dimension_Map\":[\"DIMENSION_XCC:\"0,2:4,8\"\",\"DIMENSION_SHADER_ENGINE:\"1:5," + "7:9\"\"]}," + "{\"Type\":\"SELECT_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", \"Value\":\"DC\", " - "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], " - "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[\"(\"SE\", 2)\"]}], " - "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}"}, - {"select(AB, [SE=2,XCC=1,WGP=3])", + "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], " + "\"Reduce_Dimension_Set\":[], " + "\"Select_Dimension_Map\":[\"DIMENSION_SHADER_ENGINE:\"1:3,6,8\"\"]}], " + "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}"}, + {"select(AB, [DIMENSION_SHADER_ENGINE=[2],DIMENSION_XCC=[1,4],DIMENSION_WGP=[3:5]])", "{\"Type\":\"SELECT_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", \"Value\":\"AB\", " - "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], " - "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[\"(\"WGP\", 3)\",\"(\"XCC\", " - "1)\",\"(\"SE\", 2)\"]}"}, - {"select(AB, [XCC=0])", + "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], " + "\"Reduce_Dimension_Set\":[], " + "\"Select_Dimension_Map\":[\"DIMENSION_XCC:\"1,4\"\",\"DIMENSION_SHADER_ENGINE:\"2\"\"," + "\"DIMENSION_WGP:\"3:5\"\"]}"}, + {"select(AB, [DIMENSION_XCC=[0,3:6,9,11:13]])", "{\"Type\":\"SELECT_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", \"Value\":\"AB\", " - "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], " - "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[\"(\"XCC\", 0)\"]}"}}; + "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], " + "\"Reduce_Dimension_Set\":[], " + "\"Select_Dimension_Map\":[\"DIMENSION_XCC:\"0,3:6,9,11:13\"\"]}"}}; for(auto [op, expected] : expressionToExpected) { @@ -292,17 +299,17 @@ TEST(parser, parse_accum_counter) {"accumulate(SQ_WAVES,NONE)", "{\"Type\":\"ACCUMULATE_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", \"Value\"" ":\"SQ_WAVES\", \"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}"}, + "\"Select_Dimension_Map\":[]}"}, {"accumulate(SQ_WAVES,HIGH_RES)", "{\"Type\":\"ACCUMULATE_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"HIGH_RES\", " "\"Value" "\":\"SQ_WAVES\", \"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}"}, + "\"Select_Dimension_Map\":[]}"}, {"accumulate(SQ_WAVES,LOW_RES)", "{\"Type\":\"ACCUMULATE_NODE\", \"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"LOW_RES\", " "\"Value\"" ":\"SQ_WAVES\", \"Counter_Set\":[], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}"}}; + "\"Select_Dimension_Map\":[]}"}}; for(auto [op, expected] : expressionToExpected) { @@ -327,16 +334,16 @@ TEST(parser, parse_nested_accum_counter) "\"REDUCE_OP\":\"sum\", \"ACCUMULATE_OP\":\"NONE\", " "\"Counter_Set\":[{\"Type\":\"ACCUMULATE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"HIGH_RES\", \"Value\":\"SQ_LEVEL_WAVES\", \"Counter_Set\":[], " - "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]},{\"Type\":\"REDUCE_NODE\", \"REDUCE_OP\":\"max\", " + "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], \"Reduce_Dimension_Set\":[], " + "\"Select_Dimension_Map\":[]},{\"Type\":\"REDUCE_NODE\", \"REDUCE_OP\":\"max\", " "\"ACCUMULATE_OP\":\"NONE\", \"Counter_Set\":[{\"Type\":\"REFERENCE_NODE\", " "\"REDUCE_OP\":\"\", \"ACCUMULATE_OP\":\"NONE\", \"Value\":\"GRBM_GUI_ACTIVE\", " - "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], " - "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]},{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " + "\"Counter_Set\":[], \"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], " + "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], \"Reduce_Dimension_Set\":[], " + "\"Select_Dimension_Map\":[]},{\"Type\":\"REFERENCE_NODE\", \"REDUCE_OP\":\"\", " "\"ACCUMULATE_OP\":\"NONE\", \"Value\":\"CU_NUM\", \"Counter_Set\":[], " - "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Set\":[]}], \"Reduce_Dimension_Set\":[], " - "\"Select_Dimension_Set\":[]}"}}; + "\"Reduce_Dimension_Set\":[], \"Select_Dimension_Map\":[]}], \"Reduce_Dimension_Set\":[], " + "\"Select_Dimension_Map\":[]}"}}; for(auto [op, expected] : expressionToExpected) {