xref: /llvm-project/mlir/utils/tree-sitter-mlir/dialect/scf.js (revision 10f8be19e7562624c0e63872e28cc963e03e56a5)
1'use strict';
2
3module.exports = {
4  scf_dialect : $ => prec.right(choice(
5                  // operation ::= `scf.condition` `(` $condition `)` attr-dict
6                  // ($args^ `:` type($args))?
7                  seq('scf.condition',
8                      field('condition', $._value_use_list_parens),
9                      field('attributes', optional($.attribute)),
10                      field('arguments', optional($._value_use_type_list))),
11
12                  seq('scf.execute_region',
13                      field('return', optional($._function_return)),
14                      field('body', $.region),
15                      field('attributes', optional($.attribute))),
16
17                  seq('scf.if', field('condition', $.value_use),
18                      field('return', optional($._function_return)),
19                      field('trueblk', $.region),
20                      field('falseblk',
21                            optional(seq(token('else'), $.region)))),
22
23                  // operation ::= `scf.index_switch` $arg attr-dict (`->`
24                  // type($results)^)?
25                  //               custom<SwitchCases>($cases, $caseRegions)
26                  //               `\n`
27                  //               `` `default` $defaultRegion
28                  seq('scf.index_switch', field('flag', $._value_use_and_type),
29                      field('attributes', optional($.attribute)),
30                      field('result', optional($._function_return)),
31                      $.scf_case_label, $.region,
32                      repeat(seq($.scf_case_label, $.region))),
33
34                  // scf.for %iv = %lb to %ub step %step {
35                  // ... // body
36                  // }
37                  seq('scf.for', field('iv', $.value_use), '=',
38                      field('lb', $.value_use), token('to'),
39                      field('ub', $.value_use),
40                      field('step', seq(token('step'), $.value_use)),
41                      field('iter_args',
42                            optional(seq(token('iter_args'),
43                                         $._value_assignment_list))),
44                      field('return', optional($._function_return)),
45                      field('body', $.region),
46                      field('attributes', optional($.attribute))),
47
48                  seq('scf.forall', field('iv', $._value_use_list_parens),
49                      field('bounds',
50                            seq(choice(seq('=', $._value_use_list_parens,
51                                           token('to')),
52                                       token('in')),
53                                $._value_use_list_parens)),
54                      field('step', optional(seq(token('step'),
55                                                 $._value_use_list_parens))),
56                      field('shared_outs',
57                            optional(seq(token('shared_outs'),
58                                         $._value_assignment_list))),
59                      field('return', optional($._function_return)),
60                      field('body', $.region),
61                      field('attributes', optional($.attribute))),
62
63                  seq('scf.forall.in_parallel', field('body', $.region),
64                      field('attributes', optional($.attribute))),
65
66                  seq('scf.parallel', field('iv', $._value_use_list_parens),
67                      '=', field('lb', $._value_use_list_parens), token('to'),
68                      field('ub', $._value_use_list_parens),
69                      field('step',
70                            seq(token('step'), $._value_use_list_parens)),
71                      field('init', optional(seq(token('init'),
72                                                 $._value_use_list_parens))),
73                      field('return', optional($._function_return)),
74                      field('body', $.region),
75                      field('attributes', optional($.attribute))),
76
77                  seq('scf.reduce', field('operand', $._value_use_list_parens),
78                      field('return', $._type_annotation),
79                      field('body', $.region)),
80
81                  // operation ::= `scf.reduce.return` $result attr-dict `:`
82                  // type($result)
83                  seq('scf.reduce.return', field('result', $.value_use),
84                      field('attributes', optional($.attribute)),
85                      field('return', $._type_annotation)),
86
87                  // op ::= `scf.while` assignments `:` function-type region
88                  // `do` region
89                  //        `attributes` attribute-dict
90                  // initializer ::= /* empty */ | `(` assignment-list `)`
91                  seq('scf.while',
92                      field('assignments', optional($._value_assignment_list)),
93                      field('return', $._function_type_annotation),
94                      field('condblk', $.region), 'do',
95                      field('doblk', $.region),
96                      field('attributes',
97                            optional(seq('attributes', $.attribute)))),
98
99                  // operation ::= `scf.yield` attr-dict ($results^ `:`
100                  // type($results))?
101                  seq('scf.yield', field('attributes', optional($.attribute)),
102                      field('results', optional($._value_use_type_list))),
103                  )),
104
105  scf_case_label : $ => choice(seq(token('case'), $.integer_literal),
106                               token('default'))
107}
108