summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorDavid Neto <dneto@google.com>2016-08-29 14:49:00 -0400
committerDavid Neto <dneto@google.com>2016-08-30 15:41:39 -0400
commit273920c55407751940195393e0152d8155aa5b7a (patch)
tree5b702c4e38d49bf8820c4fc5dd695af0570440b8 /utils
parent47f2a1414bf39de531f764e08faefafc91efd7d9 (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-xutils/generate_grammar_tables.py46
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)