@@ -70,6 +70,39 @@ def convert_max_required_version(version):
70
70
return '0xffffffffu'
71
71
return 'SPV_SPIRV_VERSION_WORD({})' .format (version .replace ('.' , ',' ))
72
72
73
+ def get_alias_array_name (aliases ):
74
+ """Returns the name of the array containing all the given aliases.
75
+
76
+ Arguments:
77
+ - aliases: a sequence of alias names
78
+ """
79
+ if not aliases :
80
+ return 'nullptr' ;
81
+ return '{}_aliases_{}' .format (PYGEN_VARIABLE_PREFIX , '' .join (aliases ))
82
+
83
+ def compose_alias_list (aliases ):
84
+ """Returns a string containing a braced list of aliases.
85
+
86
+ Arguments:
87
+ - aliases: a sequence of alias names
88
+
89
+ Returns:
90
+ a string containing the braced list of char* named by aliases.
91
+ """
92
+ return '{' + ', ' .join ([('"{}"' ).format (a ) for a in aliases ]) + '}'
93
+
94
+ def generate_aliases_arrays (aliases ):
95
+ """Returns the arrays of aliases
96
+
97
+ Arguments:
98
+ - aliases: a sequence of sequence of alias names
99
+ """
100
+ aliases = sorted (set ([tuple (a ) for a in aliases if a ]))
101
+ arrays = [
102
+ 'static const char* {}[] = {};' .format (
103
+ get_alias_array_name (a ), compose_alias_list (a ))
104
+ for a in aliases ]
105
+ return '\n ' .join (arrays )
73
106
74
107
def compose_capability_list (caps ):
75
108
"""Returns a string containing a braced list of capabilities as enums.
@@ -224,11 +257,12 @@ class InstInitializer(object):
224
257
"""Instances holds a SPIR-V instruction suitable for printing as the
225
258
initializer for spv_opcode_desc_t."""
226
259
227
- def __init__ (self , opname , caps , exts , operands , version , lastVersion ):
260
+ def __init__ (self , opname , aliases , caps , exts , operands , version , lastVersion ):
228
261
"""Initialization.
229
262
230
263
Arguments:
231
264
- opname: opcode name (with the 'Op' prefix)
265
+ - aliases: a sequence of aliases for the name of this opcode
232
266
- caps: a sequence of capability names required by this opcode
233
267
- exts: a sequence of names of extensions enabling this enumerant
234
268
- operands: a sequence of (operand-kind, operand-quantifier) tuples
@@ -238,6 +272,8 @@ def __init__(self, opname, caps, exts, operands, version, lastVersion):
238
272
239
273
assert opname .startswith ('Op' )
240
274
self .opname = opname [2 :] # Remove the "Op" prefix.
275
+ self .num_aliases = len (aliases );
276
+ self .aliases_mask = get_alias_array_name (aliases )
241
277
self .num_caps = len (caps )
242
278
self .caps_mask = get_capability_array_name (caps )
243
279
self .num_exts = len (exts )
@@ -272,13 +308,16 @@ def __str__(self):
272
308
base_str = 'spv::Op::Op'
273
309
274
310
template = ['{{"{opname}"' , base_str + '{opname}' ,
311
+ '{num_aliases}' , '{aliases_mask}' ,
275
312
'{num_caps}' , '{caps_mask}' ,
276
313
'{num_operands}' , '{{{operands}}}' ,
277
314
'{def_result_id}' , '{ref_type_id}' ,
278
315
'{num_exts}' , '{exts}' ,
279
316
'{min_version}' , '{max_version}}}' ]
280
317
return ', ' .join (template ).format (
281
318
opname = self .opname ,
319
+ num_aliases = self .num_aliases ,
320
+ aliases_mask = self .aliases_mask ,
282
321
num_caps = self .num_caps ,
283
322
caps_mask = self .caps_mask ,
284
323
num_operands = len (self .operands ),
@@ -336,6 +375,7 @@ def generate_instruction(inst, is_ext_inst):
336
375
"""
337
376
opname = inst .get ('opname' )
338
377
opcode = inst .get ('opcode' )
378
+ aliases = inst .get ('aliases' , [])
339
379
caps = inst .get ('capabilities' , [])
340
380
exts = inst .get ('extensions' , [])
341
381
operands = inst .get ('operands' , {})
@@ -348,7 +388,7 @@ def generate_instruction(inst, is_ext_inst):
348
388
if is_ext_inst :
349
389
return str (ExtInstInitializer (opname , opcode , caps , operands ))
350
390
else :
351
- return str (InstInitializer (opname , caps , exts , operands , min_version , max_version ))
391
+ return str (InstInitializer (opname , aliases , caps , exts , operands , min_version , max_version ))
352
392
353
393
354
394
def generate_instruction_table (inst_table ):
@@ -364,6 +404,8 @@ def generate_instruction_table(inst_table):
364
404
"""
365
405
inst_table = sorted (inst_table , key = lambda k : (k ['opcode' ], k ['opname' ]))
366
406
407
+ aliases_arrays = generate_aliases_arrays (
408
+ [inst .get ('aliases' , []) for inst in inst_table ])
367
409
caps_arrays = generate_capability_arrays (
368
410
[inst .get ('capabilities' , []) for inst in inst_table ])
369
411
exts_arrays = generate_extension_arrays (
@@ -373,7 +415,7 @@ def generate_instruction_table(inst_table):
373
415
insts = ['static const spv_opcode_desc_t kOpcodeTableEntries[] = {{\n '
374
416
' {}\n }};' .format (',\n ' .join (insts ))]
375
417
376
- return '{}\n \n {}\n \n {}' .format (caps_arrays , exts_arrays , '\n ' .join (insts ))
418
+ return '{}\n \n {}\n \n {}\n \n {} ' .format (aliases_arrays , caps_arrays , exts_arrays , '\n ' .join (insts ))
377
419
378
420
379
421
def generate_extended_instruction_table (json_grammar , set_name , operand_kind_prefix = "" ):
@@ -405,12 +447,13 @@ def generate_extended_instruction_table(json_grammar, set_name, operand_kind_pre
405
447
class EnumerantInitializer (object ):
406
448
"""Prints an enumerant as the initializer for spv_operand_desc_t."""
407
449
408
- def __init__ (self , enumerant , value , caps , exts , parameters , version , lastVersion ):
450
+ def __init__ (self , enumerant , value , aliases , caps , exts , parameters , version , lastVersion ):
409
451
"""Initialization.
410
452
411
453
Arguments:
412
454
- enumerant: enumerant name
413
455
- value: enumerant value
456
+ - aliases: a sequence of aliased capability names
414
457
- caps: a sequence of capability names required by this enumerant
415
458
- exts: a sequence of names of extensions enabling this enumerant
416
459
- parameters: a sequence of (operand-kind, operand-quantifier) tuples
@@ -419,6 +462,8 @@ def __init__(self, enumerant, value, caps, exts, parameters, version, lastVersio
419
462
"""
420
463
self .enumerant = enumerant
421
464
self .value = value
465
+ self .num_aliases = len (aliases )
466
+ self .aliases = get_alias_array_name (aliases )
422
467
self .num_caps = len (caps )
423
468
self .caps = get_capability_array_name (caps )
424
469
self .num_exts = len (exts )
@@ -428,13 +473,17 @@ def __init__(self, enumerant, value, caps, exts, parameters, version, lastVersio
428
473
self .lastVersion = convert_max_required_version (lastVersion )
429
474
430
475
def __str__ (self ):
431
- template = ['{{"{enumerant}"' , '{value}' , '{num_caps}' ,
432
- '{caps}' , '{num_exts}' , '{exts}' ,
476
+ template = ['{{"{enumerant}"' , '{value}' ,
477
+ '{num_aliases}' , '{aliases}' ,
478
+ '{num_caps}' , '{caps}' ,
479
+ '{num_exts}' , '{exts}' ,
433
480
'{{{parameters}}}' , '{min_version}' ,
434
481
'{max_version}}}' ]
435
482
return ', ' .join (template ).format (
436
483
enumerant = self .enumerant ,
437
484
value = self .value ,
485
+ num_aliases = self .num_aliases ,
486
+ aliases = self .aliases ,
438
487
num_caps = self .num_caps ,
439
488
caps = self .caps ,
440
489
num_exts = self .num_exts ,
@@ -456,6 +505,7 @@ def generate_enum_operand_kind_entry(entry, extension_map):
456
505
"""
457
506
enumerant = entry .get ('enumerant' )
458
507
value = entry .get ('value' )
508
+ aliases = entry .get ('aliases' , [])
459
509
caps = entry .get ('capabilities' , [])
460
510
if value in extension_map :
461
511
exts = extension_map [value ]
@@ -471,7 +521,7 @@ def generate_enum_operand_kind_entry(entry, extension_map):
471
521
assert value is not None
472
522
473
523
return str (EnumerantInitializer (
474
- enumerant , value , caps , exts , params , version , max_version ))
524
+ enumerant , value , aliases , caps , exts , params , version , max_version ))
475
525
476
526
477
527
def generate_enum_operand_kind (enum , synthetic_exts_list ):
@@ -516,7 +566,7 @@ def functor(k): return (int(k['value'], 16))
516
566
if len (entries ) == 0 :
517
567
# Insert a dummy entry. Otherwise the array is empty and compilation
518
568
# will fail in MSVC.
519
- entries = [' {"place holder", 0, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(999,0), 0}' ]
569
+ entries = [' {"place holder", 0, 0, nullptr, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(999,0), 0}' ]
520
570
521
571
template = ['static const spv_operand_desc_t {name}[] = {{' ,
522
572
'{entries}' , '}};' ]
@@ -532,6 +582,11 @@ def generate_operand_kind_table(enums):
532
582
# We only need to output info tables for those operand kinds that are enums.
533
583
enums = [e for e in enums if e .get ('category' ) in ['ValueEnum' , 'BitEnum' ]]
534
584
585
+ aliases = [entry .get ('aliases' , [])
586
+ for enum in enums
587
+ for entry in enum .get ('enumerants' , [])]
588
+ aliases_arrays = generate_aliases_arrays (aliases )
589
+
535
590
caps = [entry .get ('capabilities' , [])
536
591
for enum in enums
537
592
for entry in enum .get ('enumerants' , [])]
@@ -566,7 +621,7 @@ def generate_operand_kind_table(enums):
566
621
table = '\n ' .join (template ).format (
567
622
p = PYGEN_VARIABLE_PREFIX , enums = ',\n ' .join (table_entries ))
568
623
569
- return '\n \n ' .join ((caps_arrays ,) + (exts_arrays ,) + enum_entries + (table ,))
624
+ return '\n \n ' .join ((aliases_arrays ,) + ( caps_arrays ,) + (exts_arrays ,) + enum_entries + (table ,))
570
625
571
626
572
627
def get_extension_list (instructions , operand_kinds ):
0 commit comments