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