blob: 2e601519b42257994156fcbabf136aac5d6a2356 [file] [log] [blame] [edit]
#!/usr/bin/python3 -i
#
# Copyright 2013-2024 The Khronos Group Inc.
# SPDX-License-Identifier: Apache-2.0
# Working-group-specific style conventions,
# used in generation.
import os
import re
from spec_tools.conventions import ConventionsBase
class OpenCLConventions(ConventionsBase):
@property
def null(self):
"""Preferred spelling of NULL."""
return '`NULL`'
def formatVersion(self, name, apivariant, major, minor):
"""Mark up an API version name as a link in the spec."""
return f'`<<versions-{major}-{minor}, OpenCL {major}.{minor}>>`'
def formatExtension(self, name):
"""Mark up a name as an extension for the spec."""
return '`<<{}>>`'.format(name)
@property
def struct_macro(self):
return ''
@property
def constFlagBits(self):
"""Returns True if static const flag bits should be generated, False if an enumerated type should be generated."""
return False
@property
def structtype_member_name(self):
"""Return name of the structure type member"""
return 'type'
@property
def nextpointer_member_name(self):
"""Return name of the structure pointer chain member"""
return 'next'
@property
def valid_pointer_prefix(self):
"""Return prefix to pointers which must themselves be valid"""
return 'valid'
def is_structure_type_member(self, paramtype, paramname):
"""Determine if member type and name match the structure type member."""
return False
def is_nextpointer_member(self, paramtype, paramname):
"""Determine if member type and name match the next pointer chain member."""
return paramtype == 'void' and paramname == self.nextpointer_member_name
def generate_structure_type_from_name(self, structname):
"""Generate a structure type name token from a structure name.
This should never be called for OpenCL, just other APIs."""
return ''
@property
def warning_comment(self):
"""Return warning comment to be placed in header of generated Asciidoctor files"""
return '// WARNING: DO NOT MODIFY! This file is automatically generated from the cl.xml registry'
@property
def file_suffix(self):
"""Return suffix of generated Asciidoctor files"""
return '.txt'
def api_name(self, spectype='api'):
"""Return API or specification name for citations in ref pages.ref
pages should link to for
spectype is the spec this refpage is for: 'api' is the OpenCL API
Specification, 'clang' is the OpenCL C Language specification.
Defaults to 'api'. If an unrecognized spectype is given, returns
None.
"""
if spectype == 'api' or spectype is None:
return 'OpenCL'
elif spectype == 'clang':
return 'OpenCL C'
else:
return None
@property
def api_prefix(self):
"""Return API token prefix"""
return 'CL_'
@property
def extension_name_prefix(self):
"""Return extension name prefix"""
return 'cl_'
def extension_short_description(self, elem):
"""Return a short description of an extension for use in refpages."""
return 'OpenCL extension'
@property
def write_contacts(self):
"""Return whether contact list should be written to extension appendices"""
return False
@property
def write_extension_type(self):
"""Return whether extension type should be written to extension appendices"""
return False
@property
def write_extension_number(self):
"""Return whether extension number should be written to extension appendices"""
return False
@property
def write_extension_revision(self):
"""Return whether extension revision number should be written to extension appendices"""
return False
@property
def write_refpage_include(self):
"""Return whether refpage include should be written to extension appendices"""
return True
@property
def KHR_prefix(self):
"""Return extension name prefix for KHR extensions"""
return 'cl_khr_'
@property
def EXT_prefix(self):
"""Return extension name prefix for EXT extensions"""
return 'cl_ext_'
def is_externsync_command(self, protoname):
"""Returns True if the protoname element is an API command requiring
external synchronization
"""
return False
def is_api_name(self, name):
"""Returns True if name is in the reserved API namespace.
For OpenCL, these are names with a case-insensitive 'cl' prefix.
"""
return name[0:2].lower() == 'cl'
def specURL(self, spectype = 'api'):
"""Return public registry URL which ref pages should link to for
full Specification, so xrefs in the asciidoc source that aren't
to ref pages can link into it instead.
spectype is the spec this refpage is for: 'api' is the OpenCL API
Specification, 'clang' is the OpenCL C Language specification.
Defaults to 'api'. If an unrecognized spectype is given, returns
None.
"""
if spectype == 'api' or spectype is None:
return 'https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_API.html'
elif spectype == 'clang':
return 'https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_C.html'
else:
return None
@property
def xml_api_name(self):
"""Return the name used in the default API XML registry for the default API"""
return 'opencl'
@property
def registry_path(self):
"""Return relpath to the default API XML registry in this project."""
return 'xml/cl.xml'
@property
def specification_path(self):
"""Return relpath to the Asciidoctor specification sources in this project."""
return '../appendices/meta'
def extension_file_path(self, name):
"""Return file path to an extension appendix relative to a directory
containing all such appendices.
- name - extension name
Must implement."""
# Normally this would use self.file_suffix, but the OpenCL spec
# currently uses a variety of suffixing conventions.
return f'{name}.asciidoc'
def extension_include_string(self, name):
"""Return format string for include:: line for an extension appendix
file.
- name - extension name"""
return 'include::{{apispec}}/{}[]'.format(
self.extension_file_path(name))
@property
def extra_refpage_headers(self):
"""Return any extra text to add to refpage headers."""
return 'include::{config}/attribs.txt[]\n' + \
'include::{config}/opencl.asciidoc[]\n' + \
'include::{config}/version-full-links.asciidoc[]\n' + \
'include::{generated}/api/api-dictionary-no-links.asciidoc[]\n' + \
'include::{cspec}/feature-dictionary.asciidoc[]\n' + \
'include::{apispec}/footnotes.asciidoc[]\n' + \
'include::{cspec}/footnotes.asciidoc[]\n'
@property
def extension_index_prefixes(self):
"""Return a list of extension prefixes used to group extension refpages."""
return ['cl_khr', 'cl_ext', 'cl']
@property
def unified_flag_refpages(self):
"""Return True if Flags/FlagBits refpages are unified, False if
they're separate.
"""
return False
@property
def spec_reflow_path(self):
"""Return the relative path to the spec source folder to reflow"""
return os.getcwd()
@property
def spec_no_reflow_dirs(self):
"""Return a set of directories not to automatically descend into
when reflowing spec text
"""
return ('scripts', 'style')
@property
def should_skip_checking_codes(self):
"""Return True if more than the basic validation of return codes should
be skipped for a command.
OpenCL has a different style of error handling than OpenXR or
Vulkan, so these checks are not appropriate."""
return True
@property
def extra_refpage_body(self):
"""Return any extra text (following the title) for generated
reference pages."""
return 'include::{generated}/specattribs.adoc[]'
@property
def docgen_language(self):
"""Return the language to be used in docgenerator [source]
blocks."""
return 'opencl'