diff options
author | David Neto <dneto@google.com> | 2016-08-29 14:49:00 -0400 |
---|---|---|
committer | David Neto <dneto@google.com> | 2016-08-30 15:41:39 -0400 |
commit | 273920c55407751940195393e0152d8155aa5b7a (patch) | |
tree | 5b702c4e38d49bf8820c4fc5dd695af0570440b8 /utils | |
parent | 47f2a1414bf39de531f764e08faefafc91efd7d9 (diff) |
Handle capabilities larger than value 63
Use libspirv::CapabilitySet instead of a 64-bit mask.
Remove dead function spvOpcodeRequiresCapability and its tests.
The JSON grammar parser is simplified since it just writes the
list of capabilities as a braced list, and takes advantage of
the CapabilitySet intializer-list constructor.
Diffstat (limited to 'utils')
-rwxr-xr-x | utils/generate_grammar_tables.py | 46 |
1 files changed, 7 insertions, 39 deletions
diff --git a/utils/generate_grammar_tables.py b/utils/generate_grammar_tables.py index 85c2f476..e1bd4740 100755 --- a/utils/generate_grammar_tables.py +++ b/utils/generate_grammar_tables.py @@ -12,9 +12,6 @@ import re # Prefix for all C variables generated by this script. PYGEN_VARIABLE_PREFIX = 'pygen_variable' -CAPABILITY_BIT_MAPPING = {} - - def make_path_to_file(f): """Makes all ancestor directories to the given file, if they don't yet exist. @@ -31,38 +28,16 @@ def make_path_to_file(f): else: raise - -def populate_capability_bit_mapping_dict(cap_dict): - """Populates CAPABILITY_BIT_MAPPING. - - Arguments: - - cap_dict: a dict containing all capability names and values - """ - assert cap_dict['category'] == 'ValueEnum' - assert cap_dict['kind'] == 'Capability' - for enumerant in cap_dict['enumerants']: - if enumerant['value'] > 63: - print( - "error: capability enumerant {} valued {} is over 63; " - "spv_capability_mask_t doesn't support this".format( - enumerant['enumerant'], enumerant['value'])) - exit(1) - CAPABILITY_BIT_MAPPING[enumerant['enumerant']] = enumerant['value'] - - -def compose_capability_mask(caps): - """Returns a bit mask for a sequence of capabilities +def compose_capability_list(caps): + """Returns a string containing a braced list of capabilities as enums. Arguments: - caps: a sequence of capability names Returns: - a string containing the hexadecimal value of the bit mask + a string containing the braced list of SpvCapability* enums named by caps. """ - assert len(CAPABILITY_BIT_MAPPING) != 0 - bits = [CAPABILITY_BIT_MAPPING[c] for c in caps] - caps_mask = functools.reduce(lambda m, b: m | (1 << b), bits, 0) - return '0x{:04x}'.format(caps_mask) + return "{" + ", ".join(['SpvCapability{}'.format(c) for c in caps]) + "}" def convert_operand_kind(operand_tuple): @@ -142,7 +117,7 @@ class InstInitializer(object): """ assert opname.startswith('Op') self.opname = opname[2:] # Remove the "Op" prefix. - self.caps_mask = compose_capability_mask(caps) + self.caps_mask = compose_capability_list(caps) self.operands = [convert_operand_kind(o) for o in operands] self.fix_syntax() @@ -193,7 +168,7 @@ class ExtInstInitializer(object): """ self.opname = opname self.opcode = opcode - self.caps_mask = compose_capability_mask(caps) + self.caps_mask = compose_capability_list(caps) self.operands = [convert_operand_kind(o) for o in operands] self.operands.append('SPV_OPERAND_TYPE_NONE') @@ -259,7 +234,7 @@ class EnumerantInitializer(object): """ self.enumerant = enumerant self.value = value - self.caps_mask = compose_capability_mask(caps) + self.caps_mask = compose_capability_list(caps) self.parameters = [convert_operand_kind(p) for p in parameters] def __str__(self): @@ -396,13 +371,6 @@ def main(): with open(args.spirv_core_grammar) as json_file: grammar = json.loads(json_file.read()) - - # Get the dict for the Capability operand kind. - cap_dict = [o for o in grammar['operand_kinds'] - if o['kind'] == 'Capability'] - assert len(cap_dict) == 1 - populate_capability_bit_mapping_dict(cap_dict[0]) - if args.core_insts_output is not None: make_path_to_file(args.core_insts_output) make_path_to_file(args.operand_kinds_output) |