diff --git a/src/imagination/pco/pco_common.h.py b/src/imagination/pco/pco_common.h.py index 045eea93890..dce8955c420 100644 --- a/src/imagination/pco/pco_common.h.py +++ b/src/imagination/pco/pco_common.h.py @@ -51,7 +51,7 @@ static bool ${enum.name}_valid(uint64_t val) % for bit_set in bit_sets.values(): enum ${bit_set.name}_variant { ${bit_set.name.upper()}_NONE, - % for variant in bit_set.variants: + % for variant, *_ in bit_set.variants: ${variant}, % endfor }; diff --git a/src/imagination/pco/pco_isa.h.py b/src/imagination/pco/pco_isa.h.py index b0575c53baa..1b120a58191 100644 --- a/src/imagination/pco/pco_isa.h.py +++ b/src/imagination/pco/pco_isa.h.py @@ -32,6 +32,19 @@ enum ${bit_set.name}_field { % endfor }; +static unsigned ${bit_set.name}_bytes(enum ${bit_set.name}_variant variant) +{ + switch (variant) { + case ${bit_set.name.upper()}_NONE: return 0; + % for variant, num_bytes in bit_set.variants: + case ${variant}: return ${num_bytes}; + % endfor + default: break; + } + + unreachable(); +} + static unsigned ${bit_set.name}_encode_field(uint8_t *bin, enum ${bit_set.name}_field field, uint64_t val) { uint64_t enc_val; diff --git a/src/imagination/pco/pco_pygen_common.py b/src/imagination/pco/pco_pygen_common.py index 9fd2621362a..4a8bd825cf2 100644 --- a/src/imagination/pco/pco_pygen_common.py +++ b/src/imagination/pco/pco_pygen_common.py @@ -344,8 +344,9 @@ def bit_struct(name, bit_set, field_mappings, data=None): assert (total_bits % 8) == 0, f'Bit struct "{name}" has a non-byte-aligned number of bits ({total_bits}).' _name = f'{bit_set.name}_{name}' - bs = BitStruct(_name, struct_fields, encode_fields, total_bits // 8, data) + total_bytes = total_bits // 8 + bs = BitStruct(_name, struct_fields, encode_fields, total_bytes, data) bit_set.bit_structs[name] = bs - bit_set.variants.append(f'{bit_set.name}_{name}'.upper()) + bit_set.variants.append((f'{bit_set.name}_{name}'.upper(), total_bytes)) return bs