'use strict';
module.exports = {
linalg_dialect : $ => prec.right(choice(
seq(choice(
'linalg.batch_matmul',
'linalg.batch_matmul_transpose_b',
'linalg.batch_matvec',
'linalg.batch_reduce_matmul', 'linalg.broadcast',
'linalg.conv_1d_ncw_fcw', 'linalg.conv_1d_nwc_wcf',
'linalg.conv_1d', 'linalg.conv_2d_nchw_fchw',
'linalg.conv_2d_ngchw_fgchw',
'linalg.conv_2d_nhwc_fhwc',
'linalg.conv_2d_nhwc_hwcf',
'linalg.conv_2d_nhwc_hwcf_q', 'linalg.conv_2d',
'linalg.conv_3d_ndhwc_dhwcf',
'linalg.conv_3d_ndhwc_dhwcf_q', 'linalg.conv_3d',
'linalg.copy', 'linalg.depthwise_conv_1d_nwc_wc',
'linalg.depthwise_conv_1d_nwc_wcm',
'linalg.depthwise_conv_2d_nchw_chw',
'linalg.depthwise_conv_2d_nhwc_hwc',
'linalg.depthwise_conv_2d_nhwc_hwc_q',
'linalg.depthwise_conv_2d_nhwc_hwcm',
'linalg.depthwise_conv_2d_nhwc_hwcm_q',
'linalg.depthwise_conv_3d_ndhwc_dhwc',
'linalg.depthwise_conv_3d_ndhwc_dhwcm',
'linalg.dot', 'linalg.elemwise_binary',
'linalg.elemwise_unary', 'linalg.fill',
'linalg.fill_rng_2d', 'linalg.matmul',
'linalg.matmul_transpose_b',
'linalg.matmul_unsigned', 'linalg.matvec',
'linalg.mmt4d', 'linalg.pooling_nchw_max',
'linalg.pooling_nchw_sum',
'linalg.pooling_ncw_max', 'linalg.pooling_ncw_sum',
'linalg.pooling_ndhwc_max',
'linalg.pooling_ndhwc_min',
'linalg.pooling_ndhwc_sum',
'linalg.pooling_nhwc_max',
'linalg.pooling_nhwc_max_unsigned',
'linalg.pooling_nhwc_min',
'linalg.pooling_nhwc_min_unsigned',
'linalg.pooling_nhwc_sum',
'linalg.pooling_nwc_max',
'linalg.pooling_nwc_max_unsigned',
'linalg.pooling_nwc_min',
'linalg.pooling_nwc_min_unsigned',
'linalg.pooling_nwc_sum',
'linalg.quantized_batch_matmul',
'linalg.quantized_matmul', 'linalg.vecmat'),
repeat1($._ins_outs_attributes),
field('return', optional($._function_return))),
seq('linalg.generic', repeat1($._ins_outs_attributes),
field('body', $.region),
field('return', optional($._function_return))),
// operation ::= `linalg.index` $dim attr-dict `:`
// type($result)
seq('linalg.index', field('dimension', $.integer_literal),
field('attributes', optional($.attribute)),
field('return', $._type_annotation)),
seq(choice('linalg.map', 'linalg.reduce'),
repeat1($._ins_outs_attributes),
field('arguments', $.block_arg_list),
field('body', $.region),
field('return', optional($._function_return))),
seq('linalg.yield',
field('attributes', optional($.attribute)),
field('results', optional($._value_use_type_list))))),
_ins_outs_attributes : $ => choice($._ins, $._outs, $.attribute,
$._attribute_entry_list),
_ins : $ => seq(token('ins'), '(', $._value_use_type_list, ')'),
_outs : $ => seq(token('outs'), '(', $._value_use_type_list, ')'),
_attribute_entry_list : $ => seq($.bare_attribute_entry,
repeat(seq(',', $.bare_attribute_entry))),
bare_attribute_entry : $ => seq($.bare_id, '=', $.attribute_value)
}