12
3456789
10pure func TileMatrixMLayoutLegal(11 layout: TileLayout,12 m: integer {1..65535}) => boolean13begin14 return (layout == TileLayout_CUBE_M16 && m <= 16) ||15 (layout == TileLayout_CUBE_M32 && m <= 32);16end;17
18readonly func TileMatrixLocalPrimaryInfoLegal(19 tile: TileInfo,20 valid_rows: integer {1..65535},21 valid_columns: integer {1..65535},22 data_type: TileDataType,23 expected_layout: TileLayout) => boolean24begin25 return TileCubeDescriptorLegal(tile) && tile.contents_defined &&26 tile.valid_rows == valid_rows &&27 tile.valid_columns == valid_columns &&28 tile.data_type == data_type &&29 tile.layout == expected_layout;30end;31
32readonly func TileMatrixCubeInfosMatchDimensions(33 left: TileInfo, right: TileInfo,34 m: integer {0..65535}, n: integer {0..65535},35 k: integer {0..65535}) => boolean36begin37 if m == 0 || n == 0 || k == 0 then return FALSE; end;38 let positive_m = m as integer {1..65535};39 let positive_n = n as integer {1..65535};40 let positive_k = k as integer {1..65535};41 return TileMatrixMLayoutLegal(left.layout, positive_m) &&42 TileMatrixLocalPrimaryInfoLegal(43 left, positive_m, positive_k,44 left.data_type, left.layout) &&45 TileMatrixLocalPrimaryInfoLegal(46 right, positive_k, positive_n,47 right.data_type, TileLayout_CUBE_N8);48end;49
50readonly func TileMatrixLocalMOperandSchemaLegal(51 source: TileIndex,52 valid_rows: integer {1..65535},53 valid_columns: integer {1..65535},54 data_type: TileDataType) => boolean55begin56 let tile = _Tiles[[source]];57 return TileMatrixMLayoutLegal(tile.layout, valid_rows) &&58 TileMatrixLocalPrimaryInfoLegal(59 tile, valid_rows, valid_columns, data_type, tile.layout);60end;61
62readonly func TileMatrixLocalNOperandSchemaLegal(63 source: TileIndex,64 valid_rows: integer {1..65535},65 valid_columns: integer {1..65535},66 data_type: TileDataType) => boolean67begin68 return TileMatrixLocalPrimaryInfoLegal(69 _Tiles[[source]], valid_rows, valid_columns,70 data_type, TileLayout_CUBE_N8);71end;72
73readonly func TileMatrixLocalCubeAccumulatorSchemaLegal(74 accumulator: TileIndex,75 m: integer {1..65535},76 n: integer {1..65535},77 result_type: TileDataType,78 expected_layout: TileLayout,79 destination_capacity: integer {0..262144}) => boolean80begin81 let tile = _Tiles[[accumulator]];82 let output_converted =83 UInt(_BundleFixedPointAttributes.pre_quant_mode) != 0;84 return TileMatrixLocalPrimaryInfoLegal(85 tile, m, n, result_type, expected_layout) &&86 (output_converted ||87 tile.capacity_bytes == destination_capacity);88end;89