40 PSyclone configuration management module.
42 Deals with reading the config file and storing default settings.
46 from configparser
import (ConfigParser, MissingSectionHeaderError,
48 from collections
import namedtuple
58 _FILE_NAME =
"psyclone.cfg"
66 VALID_KERNEL_NAMING_SCHEMES = [
"multiple",
"single"]
72 Class for all configuration-related errors.
74 :param str value: error message.
75 :param config: the Config object associated with the error.
76 :type config: :py:class:`psyclone.configuration.Config`.
78 def __init__(self, value, config=None):
79 PSycloneError.__init__(self, value)
80 self.
valuevaluevalue =
"PSyclone configuration error"
82 self.
valuevaluevalue = f
"{self.value} (file={config.filename})"
90 Handles all configuration management. It is implemented as a singleton
91 using a class _instance variable and a get() function.
99 _HAS_CONFIG_BEEN_INITIALISED =
False
102 _supported_api_list = [
"dynamo0.3",
"gocean1.0",
"nemo"]
105 _supported_stub_api_list = [
"dynamo0.3"]
109 _default_api =
"dynamo0.3"
120 _default_kernel_naming =
"multiple"
124 _default_psyir_root_name =
"psyir_tmp"
127 _valid_psy_data_prefixes = []
130 def get(do_not_load_file=False):
131 '''Static function that if necessary creates and returns the singleton
134 :param bool do_not_load_file: If set it will not load the default \
135 config file. This is used when handling the command line so \
136 that the user can specify the file to load.
138 if not Config._instance:
139 Config._instance =
Config()
140 if not do_not_load_file:
141 Config._instance.load()
142 return Config._instance
147 ''':returns: if the config class has loaded a (potential custom) \
151 return Config._HAS_CONFIG_BEEN_INITIALISED
156 '''This function returns the absolute path to the config file included
157 in the PSyclone repository. It is used by the testing framework to make
158 sure all tests get the same config file (see tests/config_tests for the
160 :return str: Absolute path to the config file included in the \
163 this_dir = os.path.dirname(os.path.abspath(__file__))
166 psyclone_root_dir = os.path.dirname(os.path.dirname(this_dir))
167 return os.path.join(psyclone_root_dir,
"config",
"psyclone.cfg")
171 '''This is the basic constructor that only sets the supported APIs
172 and stub APIs, it does not load a config file. The Config instance
173 is a singleton, and as such will test that no instance already exists
174 and raise an exception otherwise.
175 :raises GenerationError: If a singleton instance of Config already \
179 if Config._instance
is not None:
181 "Config can be created")
232 def load(self, config_file=None):
233 '''Loads a configuration file.
235 :param str config_file: Override default configuration file to read.
236 :raises ConfigurationError: if there are errors or inconsistencies in \
237 the specified config file.
243 if not os.path.isfile(config_file):
245 f
"File {config_file} does not exist")
254 self.
_config_config = ConfigParser(
255 converters={
'list':
lambda x: []
if not x
else
256 [i.strip()
for i
in x.split(
',')]})
261 except (MissingSectionHeaderError, ParsingError)
as err:
263 f
"ConfigParser failed to read the configuration file. Is it "
264 f
"formatted correctly? (Error was: {err})",
265 config=self)
from err
270 if 'DEFAULT' not in self.
_config_config
or \
271 not self.
_config_config[
'DEFAULT'].keys():
273 "Configuration file has no [DEFAULT] section", config=self)
283 'DISTRIBUTED_MEMORY')
284 except ValueError
as err:
286 f
"Error while parsing DISTRIBUTED_MEMORY: {err}",
287 config=self)
from err
290 if "DEFAULTAPI" in self.
_config_config[
"DEFAULT"]:
291 self.
_api_api = self.
_config_config[
'DEFAULT'][
'DEFAULTAPI']
293 self.
_api_api = Config._default_api
297 if len(self.
_config_config) == 2:
298 for section
in self.
_config_config:
299 self.
_api_api = section.lower()
300 if self.
_api_api !=
"default":
304 if self.
_api_api
not in Config._supported_api_list:
306 f
"The API ({self._api}) is not in the list of supported "
307 f
"APIs ({Config._supported_api_list}).", config=self)
310 if 'defaultstubapi' not in self.
_config_config[
'DEFAULT']:
317 if self.
_default_stub_api_default_stub_api
not in Config._supported_stub_api_list:
319 f
"The default stub API ({self._default_stub_api}) is not in "
320 f
"the list of supported stub APIs ("
321 f
"{Config._supported_stub_api_list}).", config=self)
325 'REPRODUCIBLE_REDUCTIONS')
326 except ValueError
as err:
328 f
"Error while parsing REPRODUCIBLE_REDUCTIONS: {err}",
329 config=self)
from err
334 except ValueError
as err:
336 f
"error while parsing REPROD_PAD_SIZE: {err}",
337 config=self)
from err
339 if 'PSYIR_ROOT_NAME' not in self.
_config_config[
'DEFAULT']:
349 self.
_config_config[
"DEFAULT"].getlist(
"VALID_PSY_DATA_PREFIXES", [])
352 'OCL_DEVICES_PER_NODE')
353 except ValueError
as err:
355 f
"error while parsing OCL_DEVICES_PER_NODE: {err}",
356 config=self)
from err
359 valid_var = re.compile(
r"[A-Z][A-Z0-9_]*$", re.I)
361 if not valid_var.match(prefix):
363 f
"Invalid PsyData-prefix '{prefix}' in config file. The "
364 f
"prefix must be valid for use as the start of a Fortran "
365 f
"variable name.", config=self)
368 if 'BACKEND_CHECKS_ENABLED' in self.
_config_config[
'DEFAULT']:
371 self.
_config_config[
'DEFAULT'].getboolean(
372 'BACKEND_CHECKS_ENABLED'))
373 except ValueError
as err:
375 f
"Error while parsing BACKEND_CHECKS_ENABLED: {err}",
376 config=self)
from err
381 for api
in Config._supported_api_list:
383 if api ==
"dynamo0.3":
385 elif api ==
"gocean1.0":
388 raise NotImplementedError(
389 f
"Configuration file '{self._config_file}' contains a "
390 f
"'{api}' section but no Config sub-class has "
391 f
"been implemented for this API")
398 ignore_modules = self.
_config_config[
'DEFAULT'].getlist(
"IGNORE_MODULES", [])
402 mod_manager = ModuleManager.get()
403 for module_name
in ignore_modules:
404 mod_manager.add_ignore_module(module_name)
407 Config._HAS_CONFIG_BEEN_INITIALISED =
True
411 Getter for the object holding API-specific configuration options.
413 :param str api: Optional, the API for which configuration details are
414 required. If none is specified, returns the config for the
416 :returns: object containing API-specific configuration
417 :rtype: One of :py:class:`psyclone.configuration.LFRicConfig`,
418 :py:class:`psyclone.configuration.GOceanConfig` or None.
420 :raises ConfigurationError: if api is not in the list of supported \
422 :raises ConfigurationError: if the config file did not contain a \
423 section for the requested API.
431 f
"API '{api}' is not in the list '{self.supported_apis}'' of "
435 f
"Configuration file did not contain a section for the "
436 f
"'{api}' API", config=self)
442 Static method that searches various locations for a configuration
443 file. If the full path to an existing file has been provided in
444 the PSYCLONE_CONFIG environment variable then that is returned.
445 Otherwise, we search the following locations, in order:
448 - if inside-a-virtual-environment:
449 <base-dir-of-virtual-env>/share/psyclone/
450 - ${HOME}/.local/share/psyclone/
451 - <system-install-prefix>/share/psyclone/
452 - <psyclone-installation-base>/share/psyclone/
454 :returns: the fully-qualified path to the configuration file
457 :raises ConfigurationError: if no config file is found
466 _psy_config = os.environ.get(
'PSYCLONE_CONFIG')
467 if _psy_config
and os.path.isfile(_psy_config):
471 share_dir = os.path.join(sys.prefix,
"share",
"psyclone")
473 os.path.join(os.path.dirname(psyclone_path),
"share",
"psyclone")
474 for psyclone_path
in psyclone.__path__]
477 _file_paths = [os.path.join(os.getcwd(),
".psyclone")]
478 if within_virtual_env():
480 _file_paths.append(share_dir)
482 _file_paths.append(os.path.join(os.path.expanduser(
"~"),
483 ".local",
"share",
"psyclone"))
484 if not within_virtual_env():
486 _file_paths.append(share_dir)
488 _file_paths.extend(pkg_share_dir)
490 for cfile
in [os.path.join(cdir, _FILE_NAME)
for cdir
in _file_paths]:
491 if os.path.isfile(cfile):
501 Getter for whether or not distributed memory is enabled
503 :returns: True if DM is enabled, False otherwise
508 @distributed_memory.setter
511 Setter for whether or not distributed memory support is enabled
512 in this configuration.
514 :param bool dist_mem: Whether or not dm is enabled
516 if not isinstance(dist_mem, bool):
518 f
"distributed_memory must be a boolean but got "
525 Getter for the default API used by PSyclone.
527 :returns: default PSyclone API
534 '''Getter for the API selected by the user.
536 :returns: The name of the selected API.
543 '''Setter for the API selected by the user.
545 :param str api: The name of the API to use.
547 :raises ValueError if api is not a supported API.
550 raise ValueError(f
"'{api}' is not a valid API, it must be one "
551 f
"of {Config._supported_api_list}'.")
557 Getter for the list of APIs supported by PSyclone.
559 :returns: list of supported APIs
562 return Config._supported_api_list
567 Getter for the default API used by the stub generator.
569 :returns: default API for the stub generator
577 :returns: whether the validity checks in the PSyIR backend should be
583 @backend_checks_enabled.setter
586 Setter for whether or not the PSyIR backend is to perform validation
589 :param bool value: whether or not to perform validation.
591 :raises TypeError: if `value` is not a boolean.
594 if not isinstance(value, bool):
595 raise TypeError(f
"Config.backend_checks_enabled must be a boolean "
596 f
"but got '{type(value).__name__}'")
602 Getter for the list of APIs supported by the stub generator.
604 :returns: list of supported APIs.
607 return Config._supported_stub_api_list
612 Getter for whether reproducible reductions are enabled.
614 :returns: True if reproducible reductions are enabled, False otherwise.
622 Getter for the amount of padding to use for the array required
623 for reproducible OpenMP reductions
625 :returns: padding size (no. of array elements)
633 Getter for the root name to use when creating PSyIR names.
635 :returns: the PSyIR root name.
643 Getter for the full path and name of the configuration file used
644 to initialise this configuration object.
646 :returns: full path and name of configuration file
654 :returns: the directory to which to write transformed kernels.
662 @kernel_output_dir.setter
665 Setter for kernel output directory.
666 :param str value: directory to which to write transformed kernels.
673 :returns: what naming scheme to use when writing transformed kernels \
679 @kernel_naming.setter
682 Setter for how to re-name kernels when writing transformed kernels
685 :param str value: one of VALID_KERNEL_NAMING_SCHEMES.
686 :raises ValueError: if the supplied value is not a recognised \
687 kernel-renaming scheme.
689 if value
not in VALID_KERNEL_NAMING_SCHEMES:
691 f
"kernel_naming must be one of '{VALID_KERNEL_NAMING_SCHEMES}'"
692 f
" but got '{value}'")
698 :returns: the list of paths to search for Fortran include files.
703 @include_paths.setter
706 Sets the list of paths to search for Fortran include files.
708 :param path_list: list of directories to search.
709 :type path_list: list of str.
711 :raises ValueError: if `path_list` is not a list-like object.
712 :raises ConfigurationError: if any of the paths in the list do \
717 for path
in path_list:
718 if not os.path.exists(path):
720 f
"Include path '{path}' does not exist")
722 except (TypeError, ValueError)
as err:
723 raise ValueError(f
"include_paths must be a list but got: "
724 f
"{type(path_list)}")
from err
728 ''':returns: The list of all valid class prefixes.
729 :rtype: list of str'''
734 ''':returns: The number of OpenCL devices per node.
739 '''Returns all keys from the default section.
740 :returns list: List of all keys of the default section as strings.
742 return self.
_config_config.defaults()
745 ''':returns: the constants instance of the current API.
746 :rtype: :py:class:`psyclone.domain.lfric.LFRicConstants` |
747 :py:class:`psyclone.domain.gocean.GOceanConstants`
754 '''A base class for functions that each API-specific class must provide.
755 At the moment this is just the function 'access_mapping' that maps between
756 API-specific access-descriptor strings and the PSyclone internal
758 :param section: :py:class:`configparser.SectionProxy`
759 :raises ConfigurationError: if an access-mapping is provided that \
760 assigns an invalid value (i.e. not one of 'read', 'write', \
761 'readwrite'), 'inc' or 'sum') to a string.
764 def __init__(self, section):
767 self.
_access_mapping_access_mapping = {
"read":
"read",
"write":
"write",
768 "readwrite":
"readwrite",
"inc":
"inc",
773 mapping_list = section.getlist(
"ACCESS_MAPPING")
774 if mapping_list
is not None:
776 APISpecificConfig.create_dict_from_list(mapping_list)
784 for api_access_name, access_type
in self.
_access_mapping_access_mapping.items():
787 AccessType.from_string(access_type)
788 except ValueError
as err:
791 f
"Unknown access type '{access_type}' found for key "
792 f
"'{api_access_name}'")
from err
800 '''Takes a list of strings each with the format: key:value and creates
801 a dictionary with the key,value pairs. Any leading or trailing
802 white space is removed.
804 :param input_list: the input list.
805 :type input_list: list of str
807 :returns: a dictionary with the key,value pairs from the input list.
808 :rtype: dict[str, Any]
810 :raises ConfigurationError: if any entry in the input list
811 does not contain a ":".
815 for entry
in input_list:
817 key, value = entry.split(
":", 1)
818 except ValueError
as err:
821 f
"Invalid format for mapping: {entry.strip()}")
from err
823 return_dict[str(key.strip())] = str(value.strip())
828 '''Extracts the precision map values from the psyclone.cfg file
829 and converts them to a dictionary with integer values.
831 :returns: The precision maps to be used by this API.
832 :rtype: dict[str, int]
834 precisions_list = section.getlist(
"precision_map")
836 return_dict = APISpecificConfig.create_dict_from_list(precisions_list)
838 for key, value
in return_dict.items():
842 if value.isdecimal()
and value.isdigit():
843 return_dict[key] = int(value)
847 f
"Wrong type supplied to mapping: '{value}'"
848 f
" is not a positive integer or contains special"
853 '''Returns the mapping of API-specific access strings (e.g.
854 gh_write) to the AccessType (e.g. AccessType.WRITE).
855 :returns: The access mapping to be used by this API.
856 :rtype: Dictionary of strings
861 '''Returns the reverse mapping of a PSyclone internal access type
862 to the API specific string, e.g.: AccessType.READ to 'gh_read'.
863 This is used to provide the user with API specific error messages.
864 :returns: The mapping of access types to API-specific strings.
865 :rtype: Dictionary of strings
870 '''Returns the sorted, API-specific names of all valid access
872 :returns: Sorted list of API-specific valid strings.
873 :rtype: List of strings
881 ''':returns: an object containing all constants for the API.
882 :rtype: :py:class:`psyclone.domain.lfric.LFRicConstants` |
883 :py:class:`psyclone.domain.gocean.GOceanConstants`
888 class LFRicConfig(APISpecificConfig):
890 LFRic-specific (Dynamo 0.3) Config sub-class. Holds configuration options
891 specific to the LFRic (Dynamo 0.3) API.
893 :param config: the 'parent' Config object.
894 :type config: :py:class:`psyclone.configuration.Config`
895 :param section: the entry for the '[dynamo0.3]' section of \
896 the configuration file, as produced by ConfigParser.
897 :type section: :py:class:`configparser.SectionProxy`
899 :raises ConfigurationError: for a missing mandatory configuration option.
900 :raises ConfigurationError: for an invalid option for the redundant \
901 computation over annexed dofs.
902 :raises ConfigurationError: for an invalid run_time_checks flag.
903 :raises ConfigurationError: if argument datatypes in the 'default_kind' \
904 mapping do not match the supported datatypes.
905 :raises ConfigurationError: for an invalid argument kind.
906 :raises ConfigurationError: for an invalid value type of NUM_ANY_SPACE.
907 :raises ConfigurationError: if the supplied number of ANY_SPACE \
908 function spaces is less than or equal to 0.
909 :raises ConfigurationError: for an invalid value type of \
910 NUM_ANY_DISCONTINUOUS_SPACE.
911 :raises ConfigurationError: if the supplied number of \
912 ANY_DISCONTINUOUS_SPACE function \
913 spaces is less than or equal to 0.
935 "compute_annexed_dofs",
936 "supported_fortran_datatypes",
941 "num_any_discontinuous_space"]
943 if not mdkeys.issubset(set(section.keys())):
945 f
"Missing mandatory configuration option in the "
946 f
"'[{section.name}]' section of the configuration file "
947 f
"'{config.filename}'. Valid options are: "
948 f
"{self._mandatory_keys}.")
953 "compute_annexed_dofs")
954 except ValueError
as err:
956 f
"Error while parsing COMPUTE_ANNEXED_DOFS in the "
957 f
"'[{section.name}]' section of the configuration file "
958 f
"'{config.filename}': {str(err)}.",
959 config=self.
_config_config)
from err
965 except ValueError
as err:
967 f
"Error while parsing RUN_TIME_CHECKS in the "
968 f
"'[{section.name}]' section of the configuration file "
969 f
"'{config.filename}': {str(err)}.",
970 config=self.
_config_config)
from err
976 "supported_fortran_datatypes")
981 kind_list = section.getlist(
"default_kind")
985 datatypes = set(filter(
None, all_kinds.keys()))
988 f
"Fortran datatypes in the 'default_kind' mapping in the "
989 f
"'[{section.name}]' section of the configuration file "
990 f
"'{config.filename}' do not match the supported Fortran "
991 f
"datatypes {self._supported_fortran_datatypes}.")
993 datakinds = set(filter(
None, all_kinds.values()))
996 f
"Supplied kind parameters {sorted(datakinds)} in the "
997 f
"'[{section.name}]' section of the configuration file "
998 f
"'{config.filename}' do not define the default kind for "
999 f
"one or more supported datatypes "
1000 f
"{self._supported_fortran_datatypes}.")
1010 self.
_num_any_space_num_any_space = section.getint(
"NUM_ANY_SPACE")
1011 except ValueError
as err:
1013 f
"Error while parsing NUM_ANY_SPACE in the '[{section.name}]' "
1014 f
"section of the configuration file '{config.filename}': "
1015 f
"{str(err)}.", config=self.
_config_config)
from err
1019 f
"The supplied number of ANY_SPACE function spaces "
1020 f
"in the '[{section.name}]' section of the configuration "
1021 f
"file '{config.filename}' must be greater than 0 but found "
1022 f
"{self._num_any_space}.")
1028 "NUM_ANY_DISCONTINUOUS_SPACE")
1029 except ValueError
as err:
1031 f
"Error while parsing NUM_ANY_DISCONTINUOUS_SPACE in the "
1032 f
"'[{section.name}]' section of the configuration file "
1033 f
"'{config.filename}': {str(err)}.",
1034 config=self.
_config_config)
from err
1038 f
"The supplied number of ANY_DISCONTINUOUS_SPACE function "
1039 f
"spaces in the '[{section.name}]' section of the "
1040 f
"configuration file '{config.filename}' must be greater than "
1041 f
"0 but found {self._num_any_discontinuous_space}.")
1046 Getter for whether or not we perform redundant computation over
1049 :returns: true if we are to do redundant computation.
1058 Getter for whether or not we generate run-time checks in the code.
1060 :returns: true if we are generating run-time checks
1069 Getter for the supported Fortran argument datatypes in LFRic.
1071 :returns: supported Fortran datatypes for LFRic arguments.
1080 Getter for default kind (precision) for real, integer and logical
1083 :returns: the default kinds for main datatypes in LFRic.
1092 Getter for precision map values for supported fortran datatypes
1093 in LFRic. (Precision in bytes indexed by the name of the LFRic
1096 :returns: the precision map values for main datatypes in LFRic.
1097 :rtype: dict[str, int]
1105 :returns: the number of ANY_SPACE function spaces in LFRic.
1114 :returns: the number of ANY_DISCONTINUOUS_SPACE function \
1122 ''':returns: an object containing all constants for the API.
1123 :rtype: :py:class:`psyclone.domain.lfric.LFRicConstants`
1129 return LFRicConstants()
1134 '''Gocean1.0-specific Config sub-class. Holds configuration options
1135 specific to the GOcean 1.0 API.
1137 :param config: The 'parent' Config object.
1138 :type config: :py:class:`psyclone.configuration.Config`
1139 :param section: The entry for the gocean1.0 section of \
1140 the configuration file, as produced by ConfigParser.
1141 :type section: :py:class:`configparser.SectionProxy`
1145 def __init__(self, config, section):
1147 super().__init__(section)
1157 for key
in section.keys():
1160 if key
in config.get_default_keys():
1162 if key ==
"iteration-spaces":
1167 value_as_str = str(section[key])
1168 new_iteration_spaces = value_as_str.split(
"\n")
1172 for it_space
in new_iteration_spaces:
1173 GOLoop.add_bounds(it_space)
1174 elif key ==
"access_mapping":
1177 elif key ==
"debug_mode":
1180 self.
_debug_mode_debug_mode = section.getboolean(
"debug_mode")
1181 except ValueError
as err:
1183 f
"error while parsing DEBUG_MODE in the [gocean1p0] "
1184 f
"section of the config file: {err}")
from err
1185 elif key ==
"grid-properties":
1192 for grid_property, property_str
in all_props.items():
1194 fortran, variable_type, intrinsic_type = \
1195 property_str.split(
":")
1196 except ValueError
as err:
1199 error = (f
"Invalid property '{grid_property}' found "
1200 f
"with value '{property_str}' in "
1201 f
"'{config.filename}'. It must have exactly "
1202 f
"three ':'-delimited separated values: the "
1203 f
"property, whether it is a scalar or an "
1204 f
"array, and the intrinsic type (real or "
1210 GOceanConfig.make_property(fortran.strip(),
1211 variable_type.strip(),
1212 intrinsic_type.strip())
1215 for required
in [
"go_grid_xstop",
"go_grid_ystop",
1217 "go_grid_internal_inner_start",
1218 "go_grid_internal_inner_stop",
1219 "go_grid_internal_outer_start",
1220 "go_grid_internal_outer_stop",
1221 "go_grid_whole_inner_start",
1222 "go_grid_whole_inner_stop",
1223 "go_grid_whole_outer_start",
1224 "go_grid_whole_outer_stop"]:
1226 error = (f
"The config file {config.filename} does not "
1227 f
"contain values for the following, mandatory"
1228 f
" grid property: '{required}'.")
1232 f
"'{config.filename}'.")
1237 '''Creates a property (based on namedtuple) for a given Fortran
1238 code to access a grid property, and the type.
1240 :param str dereference_format: The Fortran code to access a property \
1241 given a field name (which will be used to replace a {0} in the \
1242 string. E.g. "{0}%whole%xstop").
1243 :param str type_name: The type of the grid property, must be \
1244 'scalar' or 'array'.
1245 :param str intrinsic_type: The intrinsic type of the grid property, \
1246 must be 'integer' or 'real'.
1248 :returns: a namedtuple for a grid property given the Fortran
1249 statement to access it and the type.
1251 :raises InternalError: if type_name is not 'scalar' or 'array'
1252 :raises InternalError: if intrinsic_type is not 'integer' or 'real'
1254 if type_name
not in [
'array',
'scalar']:
1255 raise InternalError(f
"Type must be 'array' or 'scalar' but is "
1258 if intrinsic_type
not in [
'integer',
'real']:
1259 raise InternalError(f
"Intrinsic type must be 'integer' or 'real' "
1260 f
"but is '{intrinsic_type}'.")
1262 Property = namedtuple(
"Property",
"fortran type intrinsic_type")
1263 return Property(dereference_format, type_name, intrinsic_type)
1268 ''':returns: the dict containing the grid properties.
1269 :rtype: a dict with values of \
1270 namedtuple("Property","fortran type intrinsic_type") instances.
1278 :returns: whether we are generating additional debug code.
1286 ''':returns: an object containing all constants for GOcean.
1287 :rtype: :py:class:`psyclone.domain.gocean.GOceanConstants`
1292 return GOceanConstants()
1298 __all__ = [
"APISpecificConfig",
1300 "ConfigurationError",
def create_dict_from_list(input_list)
def get_precision_map_dict(section)
def get_valid_accesses_api(self)
def get_reverse_access_mapping(self)
def get_access_mapping(self)
def get_repository_config_file()
def kernel_output_dir(self)
def has_config_been_initialised()
def api_conf(self, api=None)
def valid_psy_data_prefixes(self)
def supported_stub_apis(self)
def backend_checks_enabled(self)
def default_stub_api(self)
def reprod_pad_size(self)
def distributed_memory(self)
def reproducible_reductions(self)
def psyir_root_name(self)
def ocl_devices_per_node(self)
def load(self, config_file=None)
list _valid_psy_data_prefixes
def get(do_not_load_file=False)
def get_default_keys(self)
def make_property(dereference_format, type_name, intrinsic_type)
def grid_properties(self)
def compute_annexed_dofs(self)
def num_any_discontinuous_space(self)
def run_time_checks(self)
_num_any_discontinuous_space
def __init__(self, config, section)
_supported_fortran_datatypes
def supported_fortran_datatypes(self)