1cc1dc7a3Sopenharmony_ci// SPDX-License-Identifier: Apache-2.0 2cc1dc7a3Sopenharmony_ci// ---------------------------------------------------------------------------- 3cc1dc7a3Sopenharmony_ci// Copyright 2023 Arm Limited 4cc1dc7a3Sopenharmony_ci// 5cc1dc7a3Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); you may not 6cc1dc7a3Sopenharmony_ci// use this file except in compliance with the License. You may obtain a copy 7cc1dc7a3Sopenharmony_ci// of the License at: 8cc1dc7a3Sopenharmony_ci// 9cc1dc7a3Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 10cc1dc7a3Sopenharmony_ci// 11cc1dc7a3Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 12cc1dc7a3Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13cc1dc7a3Sopenharmony_ci// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14cc1dc7a3Sopenharmony_ci// License for the specific language governing permissions and limitations 15cc1dc7a3Sopenharmony_ci// under the License. 16cc1dc7a3Sopenharmony_ci// ---------------------------------------------------------------------------- 17cc1dc7a3Sopenharmony_ci 18cc1dc7a3Sopenharmony_ci// This is a utility tool to generate quant tables 19cc1dc7a3Sopenharmony_ci#include <algorithm> 20cc1dc7a3Sopenharmony_ci#include <array> 21cc1dc7a3Sopenharmony_ci#include <bitset> 22cc1dc7a3Sopenharmony_ci#include <set> 23cc1dc7a3Sopenharmony_ci 24cc1dc7a3Sopenharmony_ci/** 25cc1dc7a3Sopenharmony_ci * @brief The ASTC quantization methods. 26cc1dc7a3Sopenharmony_ci * 27cc1dc7a3Sopenharmony_ci * Note, the values here are used directly in the encoding in the format so do not rearrange. 28cc1dc7a3Sopenharmony_ci */ 29cc1dc7a3Sopenharmony_cienum quant_method 30cc1dc7a3Sopenharmony_ci{ 31cc1dc7a3Sopenharmony_ci QUANT_2 = 0, 32cc1dc7a3Sopenharmony_ci QUANT_3 = 1, 33cc1dc7a3Sopenharmony_ci QUANT_4 = 2, 34cc1dc7a3Sopenharmony_ci QUANT_5 = 3, 35cc1dc7a3Sopenharmony_ci QUANT_6 = 4, 36cc1dc7a3Sopenharmony_ci QUANT_8 = 5, 37cc1dc7a3Sopenharmony_ci QUANT_10 = 6, 38cc1dc7a3Sopenharmony_ci QUANT_12 = 7, 39cc1dc7a3Sopenharmony_ci QUANT_16 = 8, 40cc1dc7a3Sopenharmony_ci QUANT_20 = 9, 41cc1dc7a3Sopenharmony_ci QUANT_24 = 10, 42cc1dc7a3Sopenharmony_ci QUANT_32 = 11, 43cc1dc7a3Sopenharmony_ci QUANT_40 = 12, 44cc1dc7a3Sopenharmony_ci QUANT_48 = 13, 45cc1dc7a3Sopenharmony_ci QUANT_64 = 14, 46cc1dc7a3Sopenharmony_ci QUANT_80 = 15, 47cc1dc7a3Sopenharmony_ci QUANT_96 = 16, 48cc1dc7a3Sopenharmony_ci QUANT_128 = 17, 49cc1dc7a3Sopenharmony_ci QUANT_160 = 18, 50cc1dc7a3Sopenharmony_ci QUANT_192 = 19, 51cc1dc7a3Sopenharmony_ci QUANT_256 = 20 52cc1dc7a3Sopenharmony_ci}; 53cc1dc7a3Sopenharmony_ci 54cc1dc7a3Sopenharmony_cistatic inline unsigned int get_quant_level(quant_method method) 55cc1dc7a3Sopenharmony_ci{ 56cc1dc7a3Sopenharmony_ci switch (method) 57cc1dc7a3Sopenharmony_ci { 58cc1dc7a3Sopenharmony_ci case QUANT_2: return 2; 59cc1dc7a3Sopenharmony_ci case QUANT_3: return 3; 60cc1dc7a3Sopenharmony_ci case QUANT_4: return 4; 61cc1dc7a3Sopenharmony_ci case QUANT_5: return 5; 62cc1dc7a3Sopenharmony_ci case QUANT_6: return 6; 63cc1dc7a3Sopenharmony_ci case QUANT_8: return 8; 64cc1dc7a3Sopenharmony_ci case QUANT_10: return 10; 65cc1dc7a3Sopenharmony_ci case QUANT_12: return 12; 66cc1dc7a3Sopenharmony_ci case QUANT_16: return 16; 67cc1dc7a3Sopenharmony_ci case QUANT_20: return 20; 68cc1dc7a3Sopenharmony_ci case QUANT_24: return 24; 69cc1dc7a3Sopenharmony_ci case QUANT_32: return 32; 70cc1dc7a3Sopenharmony_ci case QUANT_40: return 40; 71cc1dc7a3Sopenharmony_ci case QUANT_48: return 48; 72cc1dc7a3Sopenharmony_ci case QUANT_64: return 64; 73cc1dc7a3Sopenharmony_ci case QUANT_80: return 80; 74cc1dc7a3Sopenharmony_ci case QUANT_96: return 96; 75cc1dc7a3Sopenharmony_ci case QUANT_128: return 128; 76cc1dc7a3Sopenharmony_ci case QUANT_160: return 160; 77cc1dc7a3Sopenharmony_ci case QUANT_192: return 192; 78cc1dc7a3Sopenharmony_ci case QUANT_256: return 256; 79cc1dc7a3Sopenharmony_ci } 80cc1dc7a3Sopenharmony_ci 81cc1dc7a3Sopenharmony_ci // Unreachable - the enum is fully described 82cc1dc7a3Sopenharmony_ci return 0; 83cc1dc7a3Sopenharmony_ci} 84cc1dc7a3Sopenharmony_ci 85cc1dc7a3Sopenharmony_cistruct quant_config { 86cc1dc7a3Sopenharmony_ci quant_method quant; 87cc1dc7a3Sopenharmony_ci unsigned int bits; 88cc1dc7a3Sopenharmony_ci unsigned int trits; 89cc1dc7a3Sopenharmony_ci unsigned int quints; 90cc1dc7a3Sopenharmony_ci unsigned int C; 91cc1dc7a3Sopenharmony_ci unsigned int masks[6]; 92cc1dc7a3Sopenharmony_ci}; 93cc1dc7a3Sopenharmony_ci 94cc1dc7a3Sopenharmony_ciconst std::array<quant_config, 17> quant_configs {{ 95cc1dc7a3Sopenharmony_ci { 96cc1dc7a3Sopenharmony_ci QUANT_6, 97cc1dc7a3Sopenharmony_ci 1, 1, 0, 98cc1dc7a3Sopenharmony_ci 204, 99cc1dc7a3Sopenharmony_ci { 100cc1dc7a3Sopenharmony_ci 0b000000000, 101cc1dc7a3Sopenharmony_ci 0b000000000, 102cc1dc7a3Sopenharmony_ci 0b000000000, 103cc1dc7a3Sopenharmony_ci 0b000000000, 104cc1dc7a3Sopenharmony_ci 0b000000000, 105cc1dc7a3Sopenharmony_ci 0b000000000 106cc1dc7a3Sopenharmony_ci } 107cc1dc7a3Sopenharmony_ci }, { 108cc1dc7a3Sopenharmony_ci QUANT_8, 109cc1dc7a3Sopenharmony_ci 3, 0, 0, 110cc1dc7a3Sopenharmony_ci 0, 111cc1dc7a3Sopenharmony_ci { 0 } 112cc1dc7a3Sopenharmony_ci }, { 113cc1dc7a3Sopenharmony_ci QUANT_10, 114cc1dc7a3Sopenharmony_ci 1, 0, 1, 115cc1dc7a3Sopenharmony_ci 113, 116cc1dc7a3Sopenharmony_ci { 117cc1dc7a3Sopenharmony_ci 0b000000000, 118cc1dc7a3Sopenharmony_ci 0b000000000, 119cc1dc7a3Sopenharmony_ci 0b000000000, 120cc1dc7a3Sopenharmony_ci 0b000000000, 121cc1dc7a3Sopenharmony_ci 0b000000000, 122cc1dc7a3Sopenharmony_ci 0b000000000 123cc1dc7a3Sopenharmony_ci } 124cc1dc7a3Sopenharmony_ci }, { 125cc1dc7a3Sopenharmony_ci QUANT_12, 126cc1dc7a3Sopenharmony_ci 2, 1, 0, 127cc1dc7a3Sopenharmony_ci 93, 128cc1dc7a3Sopenharmony_ci { 129cc1dc7a3Sopenharmony_ci 0b000000000, 130cc1dc7a3Sopenharmony_ci 0b100010110, 131cc1dc7a3Sopenharmony_ci 0b000000000, 132cc1dc7a3Sopenharmony_ci 0b000000000, 133cc1dc7a3Sopenharmony_ci 0b000000000, 134cc1dc7a3Sopenharmony_ci 0b000000000 135cc1dc7a3Sopenharmony_ci } 136cc1dc7a3Sopenharmony_ci }, { 137cc1dc7a3Sopenharmony_ci QUANT_16, 138cc1dc7a3Sopenharmony_ci 4, 0, 0, 139cc1dc7a3Sopenharmony_ci 0, 140cc1dc7a3Sopenharmony_ci { 0 } 141cc1dc7a3Sopenharmony_ci }, { 142cc1dc7a3Sopenharmony_ci QUANT_20, 143cc1dc7a3Sopenharmony_ci 2, 0, 1, 144cc1dc7a3Sopenharmony_ci 54, 145cc1dc7a3Sopenharmony_ci { 146cc1dc7a3Sopenharmony_ci 0b000000000, 147cc1dc7a3Sopenharmony_ci 0b100001100, 148cc1dc7a3Sopenharmony_ci 0b000000000, 149cc1dc7a3Sopenharmony_ci 0b000000000, 150cc1dc7a3Sopenharmony_ci 0b000000000, 151cc1dc7a3Sopenharmony_ci 0b000000000 152cc1dc7a3Sopenharmony_ci } 153cc1dc7a3Sopenharmony_ci }, { 154cc1dc7a3Sopenharmony_ci QUANT_24, 155cc1dc7a3Sopenharmony_ci 3, 1, 0, 156cc1dc7a3Sopenharmony_ci 44, 157cc1dc7a3Sopenharmony_ci { 158cc1dc7a3Sopenharmony_ci 0b000000000, 159cc1dc7a3Sopenharmony_ci 0b010000101, 160cc1dc7a3Sopenharmony_ci 0b100001010, 161cc1dc7a3Sopenharmony_ci 0b000000000, 162cc1dc7a3Sopenharmony_ci 0b000000000, 163cc1dc7a3Sopenharmony_ci 0b000000000 164cc1dc7a3Sopenharmony_ci } 165cc1dc7a3Sopenharmony_ci }, { 166cc1dc7a3Sopenharmony_ci QUANT_32, 167cc1dc7a3Sopenharmony_ci 5, 0, 0, 168cc1dc7a3Sopenharmony_ci 0, 169cc1dc7a3Sopenharmony_ci { 0 } 170cc1dc7a3Sopenharmony_ci }, 171cc1dc7a3Sopenharmony_ci { 172cc1dc7a3Sopenharmony_ci QUANT_40, 173cc1dc7a3Sopenharmony_ci 3, 0, 1, 174cc1dc7a3Sopenharmony_ci 26, 175cc1dc7a3Sopenharmony_ci { 176cc1dc7a3Sopenharmony_ci 0b000000000, 177cc1dc7a3Sopenharmony_ci 0b010000010, 178cc1dc7a3Sopenharmony_ci 0b100000101, 179cc1dc7a3Sopenharmony_ci 0b000000000, 180cc1dc7a3Sopenharmony_ci 0b000000000, 181cc1dc7a3Sopenharmony_ci 0b000000000 182cc1dc7a3Sopenharmony_ci } 183cc1dc7a3Sopenharmony_ci }, { 184cc1dc7a3Sopenharmony_ci QUANT_48, 185cc1dc7a3Sopenharmony_ci 4, 1, 0, 186cc1dc7a3Sopenharmony_ci 22, 187cc1dc7a3Sopenharmony_ci { 188cc1dc7a3Sopenharmony_ci 0b000000000, 189cc1dc7a3Sopenharmony_ci 0b001000001, 190cc1dc7a3Sopenharmony_ci 0b010000010, 191cc1dc7a3Sopenharmony_ci 0b100000100, 192cc1dc7a3Sopenharmony_ci 0b000000000, 193cc1dc7a3Sopenharmony_ci 0b000000000 194cc1dc7a3Sopenharmony_ci } 195cc1dc7a3Sopenharmony_ci }, { 196cc1dc7a3Sopenharmony_ci QUANT_64, 197cc1dc7a3Sopenharmony_ci 6, 0, 0, 198cc1dc7a3Sopenharmony_ci 0, 199cc1dc7a3Sopenharmony_ci { 0 } 200cc1dc7a3Sopenharmony_ci }, { 201cc1dc7a3Sopenharmony_ci QUANT_80, 202cc1dc7a3Sopenharmony_ci 4, 0, 1, 203cc1dc7a3Sopenharmony_ci 13, 204cc1dc7a3Sopenharmony_ci { 205cc1dc7a3Sopenharmony_ci 0b000000000, 206cc1dc7a3Sopenharmony_ci 0b001000000, 207cc1dc7a3Sopenharmony_ci 0b010000001, 208cc1dc7a3Sopenharmony_ci 0b100000010, 209cc1dc7a3Sopenharmony_ci 0b000000000, 210cc1dc7a3Sopenharmony_ci 0b000000000 211cc1dc7a3Sopenharmony_ci } 212cc1dc7a3Sopenharmony_ci }, { 213cc1dc7a3Sopenharmony_ci QUANT_96, 214cc1dc7a3Sopenharmony_ci 5, 1, 0, 215cc1dc7a3Sopenharmony_ci 11, 216cc1dc7a3Sopenharmony_ci { 217cc1dc7a3Sopenharmony_ci 0b000000000, 218cc1dc7a3Sopenharmony_ci 0b000100000, 219cc1dc7a3Sopenharmony_ci 0b001000000, 220cc1dc7a3Sopenharmony_ci 0b010000001, 221cc1dc7a3Sopenharmony_ci 0b100000010, 222cc1dc7a3Sopenharmony_ci 0b000000000 223cc1dc7a3Sopenharmony_ci } 224cc1dc7a3Sopenharmony_ci }, { 225cc1dc7a3Sopenharmony_ci QUANT_128, 226cc1dc7a3Sopenharmony_ci 7, 0, 0, 227cc1dc7a3Sopenharmony_ci 0, 228cc1dc7a3Sopenharmony_ci { 0 } 229cc1dc7a3Sopenharmony_ci }, { 230cc1dc7a3Sopenharmony_ci QUANT_160, 231cc1dc7a3Sopenharmony_ci 5, 0, 1, 232cc1dc7a3Sopenharmony_ci 6, 233cc1dc7a3Sopenharmony_ci { 234cc1dc7a3Sopenharmony_ci 0b000000000, 235cc1dc7a3Sopenharmony_ci 0b000100000, 236cc1dc7a3Sopenharmony_ci 0b001000000, 237cc1dc7a3Sopenharmony_ci 0b010000000, 238cc1dc7a3Sopenharmony_ci 0b100000001, 239cc1dc7a3Sopenharmony_ci 0b000000000 240cc1dc7a3Sopenharmony_ci } 241cc1dc7a3Sopenharmony_ci }, { 242cc1dc7a3Sopenharmony_ci QUANT_192, 243cc1dc7a3Sopenharmony_ci 6, 1, 0, 244cc1dc7a3Sopenharmony_ci 5, 245cc1dc7a3Sopenharmony_ci { 246cc1dc7a3Sopenharmony_ci 0b000000000, 247cc1dc7a3Sopenharmony_ci 0b000010000, 248cc1dc7a3Sopenharmony_ci 0b000100000, 249cc1dc7a3Sopenharmony_ci 0b001000000, 250cc1dc7a3Sopenharmony_ci 0b010000000, 251cc1dc7a3Sopenharmony_ci 0b100000001 252cc1dc7a3Sopenharmony_ci } 253cc1dc7a3Sopenharmony_ci }, { 254cc1dc7a3Sopenharmony_ci QUANT_256, 255cc1dc7a3Sopenharmony_ci 8, 0, 0, 256cc1dc7a3Sopenharmony_ci 0, 257cc1dc7a3Sopenharmony_ci { 0 } 258cc1dc7a3Sopenharmony_ci } 259cc1dc7a3Sopenharmony_ci}}; 260cc1dc7a3Sopenharmony_ci 261cc1dc7a3Sopenharmony_civoid generate_unpacked_quant( 262cc1dc7a3Sopenharmony_ci const quant_config& config, 263cc1dc7a3Sopenharmony_ci std::set<unsigned int>& set 264cc1dc7a3Sopenharmony_ci) { 265cc1dc7a3Sopenharmony_ci unsigned int levels = get_quant_level(config.quant); 266cc1dc7a3Sopenharmony_ci unsigned int emitted = 0; 267cc1dc7a3Sopenharmony_ci 268cc1dc7a3Sopenharmony_ci // Value has 1 trit and N bits 269cc1dc7a3Sopenharmony_ci if (config.trits) 270cc1dc7a3Sopenharmony_ci { 271cc1dc7a3Sopenharmony_ci for (unsigned int D = 0; D < 3; D++) 272cc1dc7a3Sopenharmony_ci { 273cc1dc7a3Sopenharmony_ci unsigned int max_bits = 1 << config.bits; 274cc1dc7a3Sopenharmony_ci for (unsigned int bits = 0; bits < max_bits; bits++) 275cc1dc7a3Sopenharmony_ci { 276cc1dc7a3Sopenharmony_ci unsigned int A = (bits & 1) * 0b111111111; 277cc1dc7a3Sopenharmony_ci unsigned int B = 0; 278cc1dc7a3Sopenharmony_ci unsigned int bit = bits; 279cc1dc7a3Sopenharmony_ci for (const auto& mask_n: config.masks) 280cc1dc7a3Sopenharmony_ci { 281cc1dc7a3Sopenharmony_ci unsigned int bit_n = bit & 1; 282cc1dc7a3Sopenharmony_ci bit >>= 1; 283cc1dc7a3Sopenharmony_ci B += bit_n * mask_n; 284cc1dc7a3Sopenharmony_ci } 285cc1dc7a3Sopenharmony_ci 286cc1dc7a3Sopenharmony_ci unsigned int T = D * config.C + B; 287cc1dc7a3Sopenharmony_ci T = T ^ A; 288cc1dc7a3Sopenharmony_ci T = (A & 0x80) | (T >> 2); 289cc1dc7a3Sopenharmony_ci set.insert(T); 290cc1dc7a3Sopenharmony_ci } 291cc1dc7a3Sopenharmony_ci } 292cc1dc7a3Sopenharmony_ci } 293cc1dc7a3Sopenharmony_ci // Value has 1 quint and N bits 294cc1dc7a3Sopenharmony_ci else if (config.quints) 295cc1dc7a3Sopenharmony_ci { 296cc1dc7a3Sopenharmony_ci for (unsigned int D = 0; D < 5; D++) 297cc1dc7a3Sopenharmony_ci { 298cc1dc7a3Sopenharmony_ci unsigned int max_bits = 1 << config.bits; 299cc1dc7a3Sopenharmony_ci for (unsigned int bits = 0; bits < max_bits; bits++) 300cc1dc7a3Sopenharmony_ci { 301cc1dc7a3Sopenharmony_ci unsigned int A = (bits & 1) * 0b111111111; 302cc1dc7a3Sopenharmony_ci unsigned int B = 0; 303cc1dc7a3Sopenharmony_ci unsigned int bit = bits; 304cc1dc7a3Sopenharmony_ci for (const auto& mask_n: config.masks) 305cc1dc7a3Sopenharmony_ci { 306cc1dc7a3Sopenharmony_ci unsigned int bit_n = bit & 1; 307cc1dc7a3Sopenharmony_ci bit >>= 1; 308cc1dc7a3Sopenharmony_ci B += bit_n * mask_n; 309cc1dc7a3Sopenharmony_ci } 310cc1dc7a3Sopenharmony_ci 311cc1dc7a3Sopenharmony_ci unsigned int T = D * config.C + B; 312cc1dc7a3Sopenharmony_ci T = T ^ A; 313cc1dc7a3Sopenharmony_ci T = (A & 0x80) | (T >> 2); 314cc1dc7a3Sopenharmony_ci set.insert(T); 315cc1dc7a3Sopenharmony_ci } 316cc1dc7a3Sopenharmony_ci } 317cc1dc7a3Sopenharmony_ci } 318cc1dc7a3Sopenharmony_ci // Value has N bits 319cc1dc7a3Sopenharmony_ci else 320cc1dc7a3Sopenharmony_ci { 321cc1dc7a3Sopenharmony_ci unsigned int max_bits = 1 << config.bits; 322cc1dc7a3Sopenharmony_ci for (unsigned int bits = 0; bits < max_bits; bits++) 323cc1dc7a3Sopenharmony_ci { 324cc1dc7a3Sopenharmony_ci unsigned int T = bits << (8 - config.bits); 325cc1dc7a3Sopenharmony_ci int bits_remaining = 8 - config.bits; 326cc1dc7a3Sopenharmony_ci 327cc1dc7a3Sopenharmony_ci while (bits_remaining > 0) 328cc1dc7a3Sopenharmony_ci { 329cc1dc7a3Sopenharmony_ci int shift = bits_remaining - config.bits; 330cc1dc7a3Sopenharmony_ci bits_remaining -= config.bits; 331cc1dc7a3Sopenharmony_ci if (shift > 0) 332cc1dc7a3Sopenharmony_ci { 333cc1dc7a3Sopenharmony_ci T |= bits << shift; 334cc1dc7a3Sopenharmony_ci } 335cc1dc7a3Sopenharmony_ci else 336cc1dc7a3Sopenharmony_ci { 337cc1dc7a3Sopenharmony_ci T |= bits >> -shift; 338cc1dc7a3Sopenharmony_ci } 339cc1dc7a3Sopenharmony_ci } 340cc1dc7a3Sopenharmony_ci set.insert(T); 341cc1dc7a3Sopenharmony_ci } 342cc1dc7a3Sopenharmony_ci } 343cc1dc7a3Sopenharmony_ci} 344cc1dc7a3Sopenharmony_ci 345cc1dc7a3Sopenharmony_civoid generate_unquant_to_unpacked_quant( 346cc1dc7a3Sopenharmony_ci const quant_config& config, 347cc1dc7a3Sopenharmony_ci const std::set<unsigned int>& set 348cc1dc7a3Sopenharmony_ci) { 349cc1dc7a3Sopenharmony_ci for (unsigned int i = 0; i < 256; i++) 350cc1dc7a3Sopenharmony_ci { 351cc1dc7a3Sopenharmony_ci unsigned int min_dist = 256; 352cc1dc7a3Sopenharmony_ci unsigned int val_lo = 256; 353cc1dc7a3Sopenharmony_ci unsigned int val_hi = 0; 354cc1dc7a3Sopenharmony_ci 355cc1dc7a3Sopenharmony_ci for (const auto& val: set) 356cc1dc7a3Sopenharmony_ci { 357cc1dc7a3Sopenharmony_ci unsigned int dist = std::max(i, val) - std::min(i, val); 358cc1dc7a3Sopenharmony_ci 359cc1dc7a3Sopenharmony_ci if (dist < min_dist) 360cc1dc7a3Sopenharmony_ci { 361cc1dc7a3Sopenharmony_ci min_dist = dist; 362cc1dc7a3Sopenharmony_ci val_lo = val; 363cc1dc7a3Sopenharmony_ci val_hi = val; 364cc1dc7a3Sopenharmony_ci } 365cc1dc7a3Sopenharmony_ci else if (dist == min_dist) 366cc1dc7a3Sopenharmony_ci { 367cc1dc7a3Sopenharmony_ci val_lo = std::min(val_lo, val); 368cc1dc7a3Sopenharmony_ci val_hi = std::max(val_hi, val); 369cc1dc7a3Sopenharmony_ci } 370cc1dc7a3Sopenharmony_ci } 371cc1dc7a3Sopenharmony_ci 372cc1dc7a3Sopenharmony_ci if ((i % 16) == 0) 373cc1dc7a3Sopenharmony_ci { 374cc1dc7a3Sopenharmony_ci printf("\t\t"); 375cc1dc7a3Sopenharmony_ci } 376cc1dc7a3Sopenharmony_ci 377cc1dc7a3Sopenharmony_ci printf("%3u, %3u", val_lo, val_hi); 378cc1dc7a3Sopenharmony_ci 379cc1dc7a3Sopenharmony_ci if (i != 255) 380cc1dc7a3Sopenharmony_ci { 381cc1dc7a3Sopenharmony_ci printf(", "); 382cc1dc7a3Sopenharmony_ci } 383cc1dc7a3Sopenharmony_ci 384cc1dc7a3Sopenharmony_ci if ((i % 16) == 15) 385cc1dc7a3Sopenharmony_ci { 386cc1dc7a3Sopenharmony_ci printf("\n"); 387cc1dc7a3Sopenharmony_ci } 388cc1dc7a3Sopenharmony_ci } 389cc1dc7a3Sopenharmony_ci} 390cc1dc7a3Sopenharmony_ci 391cc1dc7a3Sopenharmony_ciint main(void) 392cc1dc7a3Sopenharmony_ci{ 393cc1dc7a3Sopenharmony_ci printf("const uint8_t color_unquant_to_uquant_tables[17][512] {\n"); 394cc1dc7a3Sopenharmony_ci for (size_t i = 0; i < quant_configs.size(); i++) 395cc1dc7a3Sopenharmony_ci { 396cc1dc7a3Sopenharmony_ci const auto& config = quant_configs[i]; 397cc1dc7a3Sopenharmony_ci std::set<unsigned int> set; 398cc1dc7a3Sopenharmony_ci 399cc1dc7a3Sopenharmony_ci printf("\t{ // QUANT_%u\n", get_quant_level(config.quant)); 400cc1dc7a3Sopenharmony_ci generate_unpacked_quant(config, set); 401cc1dc7a3Sopenharmony_ci generate_unquant_to_unpacked_quant(config, set); 402cc1dc7a3Sopenharmony_ci printf("\t},\n"); 403cc1dc7a3Sopenharmony_ci } 404cc1dc7a3Sopenharmony_ci printf("};\n"); 405cc1dc7a3Sopenharmony_ci return 0; 406cc1dc7a3Sopenharmony_ci} 407