diff --git a/docs/.doxygen/Doxyfile b/docs/.doxygen/Doxyfile
index 7f89f635ed..69e044b6bb 100644
--- a/docs/.doxygen/Doxyfile
+++ b/docs/.doxygen/Doxyfile
@@ -1,4 +1,4 @@
-# Doxyfile 1.8.17
+# Doxyfile 1.9.5
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project.
@@ -12,6 +12,16 @@
# For lists, items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (\" \").
+#
+# Note:
+#
+# Use doxygen to compare the used configuration file with the template
+# configuration file:
+# doxygen -x [configFile]
+# Use doxygen to compare the used configuration file with the template
+# configuration file without replacing the environment variables or CMake type
+# replacement variables:
+# doxygen -x_noenv [configFile]
#---------------------------------------------------------------------------
# Project related configuration options
@@ -60,16 +70,28 @@ PROJECT_LOGO =
OUTPUT_DIRECTORY = docBin
-# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
-# directories (in 2 levels) under the output directory of each output format and
-# will distribute the generated files over these directories. Enabling this
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
+# sub-directories (in 2 levels) under the output directory of each output format
+# and will distribute the generated files over these directories. Enabling this
# option can be useful when feeding doxygen a huge amount of source files, where
# putting all generated files in the same directory would otherwise causes
-# performance problems for the file system.
+# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to
+# control the number of sub-directories.
# The default value is: NO.
CREATE_SUBDIRS = NO
+# Controls the number of sub-directories that will be created when
+# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every
+# level increment doubles the number of directories, resulting in 4096
+# directories at level 8 which is the default and also the maximum value. The
+# sub-directories are organized in 2 levels, the first level always has a fixed
+# numer of 16 directories.
+# Minimum value: 0, maximum value: 8, default value: 8.
+# This tag requires that the tag CREATE_SUBDIRS is set to YES.
+
+CREATE_SUBDIRS_LEVEL = 8
+
# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
# characters to appear in the names of generated files. If set to NO, non-ASCII
# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
@@ -81,26 +103,18 @@ ALLOW_UNICODE_NAMES = NO
# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
# information to generate all constant output in the proper language.
-# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
-# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
-# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
-# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
-# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
-# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
-# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
-# Ukrainian and Vietnamese.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian,
+# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English
+# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek,
+# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with
+# English messages), Korean, Korean-en (Korean with English messages), Latvian,
+# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese,
+# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish,
+# Swedish, Turkish, Ukrainian and Vietnamese.
# The default value is: English.
OUTPUT_LANGUAGE = English
-# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all generated output in the proper direction.
-# Possible values are: None, LTR, RTL and Context.
-# The default value is: None.
-
-OUTPUT_TEXT_DIRECTION = None
-
# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
# descriptions after the members that are listed in the file and class
# documentation (similar to Javadoc). Set to NO to disable this.
@@ -227,6 +241,14 @@ QT_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
+# By default Python docstrings are displayed as preformatted text and doxygen's
+# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
+# doxygen's special commands can be used and the contents of the docstring
+# documentation blocks is shown as doxygen documentation.
+# The default value is: YES.
+
+PYTHON_DOCSTRING = YES
+
# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
# documentation from any documented member that it re-implements.
# The default value is: YES.
@@ -250,25 +272,19 @@ TAB_SIZE = 4
# the documentation. An alias has the form:
# name=value
# For example adding
-# "sideeffect=@par Side Effects:\n"
+# "sideeffect=@par Side Effects:^^"
# will allow you to put the command \sideeffect (or @sideeffect) in the
# documentation, which will result in a user-defined paragraph with heading
-# "Side Effects:". You can put \n's in the value part of an alias to insert
-# newlines (in the resulting output). You can put ^^ in the value part of an
-# alias to insert a newline as if a physical newline was in the original file.
-# When you need a literal { or } or , in the value part of an alias you have to
-# escape them by means of a backslash (\), this can lead to conflicts with the
-# commands \{ and \} for these it is advised to use the version @{ and @} or use
-# a double escape (\\{ and \\})
+# "Side Effects:". Note that you cannot put \n's in the value part of an alias
+# to insert newlines (in the resulting output). You can put ^^ in the value part
+# of an alias to insert a newline as if a physical newline was in the original
+# file. When you need a literal { or } or , in the value part of an alias you
+# have to escape them by means of a backslash (\), this can lead to conflicts
+# with the commands \{ and \} for these it is advised to use the version @{ and
+# @} or use a double escape (\\{ and \\})
ALIASES =
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding "class=itcl::class"
-# will allow you to use the command class in the itcl::class meaning.
-
-TCL_SUBST =
-
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C. For
# instance, some of the names that are used will be different. The list of all
@@ -310,18 +326,21 @@ OPTIMIZE_OUTPUT_SLICE = NO
# extension. Doxygen has a built-in mapping, but you can override or extend it
# using this tag. The format is ext=language, where ext is a file extension, and
# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
-# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice,
-# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
+# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
+# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
# tries to guess whether the code is fixed or free formatted code, this is the
-# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat
-# .inc files as Fortran files (default is PHP), and .f files as C (default is
-# Fortran), use: inc=Fortran f=C.
+# default for Fortran type files). For instance to make doxygen treat .inc files
+# as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C.
#
# Note: For files without extension you can use no_extension as a placeholder.
#
# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
-# the files are not read by doxygen.
+# the files are not read by doxygen. When specifying no_extension you should add
+# * to the FILE_PATTERNS.
+#
+# Note see also the list of default file extension mappings.
EXTENSION_MAPPING =
@@ -360,7 +379,7 @@ AUTOLINK_SUPPORT = YES
# diagrams that involve STL classes more complete and accurate.
# The default value is: NO.
-BUILTIN_STL_SUPPORT =
+BUILTIN_STL_SUPPORT = NO
# If you use Microsoft's C++/CLI language, you should set this option to YES to
# enable parsing support.
@@ -455,6 +474,19 @@ TYPEDEF_HIDES_STRUCT = YES
LOOKUP_CACHE_SIZE = 0
+# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use
+# during processing. When set to 0 doxygen will based this on the number of
+# cores available in the system. You can set it explicitly to a value larger
+# than 0 to get more control over the balance between CPU load and processing
+# speed. At this moment only the input processing can be done using multiple
+# threads. Since this is still an experimental feature the default is set to 1,
+# which effectively disables parallel processing. Please report any issues you
+# encounter. Generating dot graphs in parallel is controlled by the
+# DOT_NUM_THREADS setting.
+# Minimum value: 0, maximum value: 32, default value: 1.
+
+NUM_PROC_THREADS = 1
+
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
@@ -518,6 +550,13 @@ EXTRACT_LOCAL_METHODS = NO
EXTRACT_ANON_NSPACES = NO
+# If this flag is set to YES, the name of an unnamed parameter in a declaration
+# will be determined by the corresponding definition. By default unnamed
+# parameters remain unnamed in the output.
+# The default value is: YES.
+
+RESOLVE_UNNAMED_PARAMS = YES
+
# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
# undocumented members inside documented classes or files. If set to NO these
# members will be included in the various overviews, but no documentation
@@ -555,12 +594,20 @@ HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO
-# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES, upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# (including Cygwin) ands Mac users are advised to set this option to NO.
-# The default value is: system dependent.
+# With the correct setting of option CASE_SENSE_NAMES doxygen will better be
+# able to match the capabilities of the underlying filesystem. In case the
+# filesystem is case sensitive (i.e. it supports files in the same directory
+# whose names only differ in casing), the option must be set to YES to properly
+# deal with such files in case they appear in the input. For filesystems that
+# are not case sensitive the option should be set to NO to properly deal with
+# output files written for symbols that only differ in casing, such as for two
+# classes, one named CLASS and the other named Class, and to also support
+# references to files without having to specify the exact matching casing. On
+# Windows (including Cygwin) and MacOS, users should typically set this option
+# to NO, whereas on Linux or other Unix flavors it should typically be set to
+# YES.
+# Possible values are: SYSTEM, NO and YES.
+# The default value is: SYSTEM.
CASE_SENSE_NAMES = NO
@@ -578,6 +625,12 @@ HIDE_SCOPE_NAMES = NO
HIDE_COMPOUND_REFERENCE= NO
+# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class
+# will show which file needs to be included to use the class.
+# The default value is: YES.
+
+SHOW_HEADERFILE = YES
+
# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
# the files that are included by a file in the documentation of that file.
# The default value is: YES.
@@ -735,7 +788,8 @@ FILE_VERSION_FILTER =
# output files in an output format independent way. To create the layout file
# that represents doxygen's defaults, run doxygen with the -l option. You can
# optionally specify a file name after the option, if omitted DoxygenLayout.xml
-# will be used as the name of the layout file.
+# will be used as the name of the layout file. See also section "Changing the
+# layout of pages" for information.
#
# Note that if you run doxygen from a directory containing a file called
# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
@@ -781,24 +835,35 @@ WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some parameters
-# in a documented function, or documenting parameters that don't exist or using
-# markup commands wrongly.
+# potential errors in the documentation, such as documenting some parameters in
+# a documented function twice, or documenting parameters that don't exist or
+# using markup commands wrongly.
# The default value is: YES.
WARN_IF_DOC_ERROR = YES
+# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete
+# function parameter documentation. If set to NO, doxygen will accept that some
+# parameters have no documentation without warning.
+# The default value is: YES.
+
+WARN_IF_INCOMPLETE_DOC = YES
+
# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
# are documented, but have no documentation for their parameters or return
-# value. If set to NO, doxygen will only warn about wrong or incomplete
-# parameter documentation, but not about the absence of documentation. If
-# EXTRACT_ALL is set to YES then this flag will automatically be disabled.
+# value. If set to NO, doxygen will only warn about wrong parameter
+# documentation, but not about the absence of documentation. If EXTRACT_ALL is
+# set to YES then this flag will automatically be disabled. See also
+# WARN_IF_INCOMPLETE_DOC
# The default value is: NO.
WARN_NO_PARAMDOC = NO
# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
-# a warning is encountered.
+# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
+# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
+# at the end of the doxygen process doxygen will return with a non-zero status.
+# Possible values are: NO, YES and FAIL_ON_WARNINGS.
# The default value is: NO.
WARN_AS_ERROR = NO
@@ -809,13 +874,27 @@ WARN_AS_ERROR = NO
# and the warning text. Optionally the format may contain $version, which will
# be replaced by the version of the file (if it could be obtained via
# FILE_VERSION_FILTER)
+# See also: WARN_LINE_FORMAT
# The default value is: $file:$line: $text.
WARN_FORMAT = "$file:$line: $text"
+# In the $text part of the WARN_FORMAT command it is possible that a reference
+# to a more specific place is given. To make it easier to jump to this place
+# (outside of doxygen) the user can define a custom "cut" / "paste" string.
+# Example:
+# WARN_LINE_FORMAT = "'vi $file +$line'"
+# See also: WARN_FORMAT
+# The default value is: at line $line of file $file.
+
+WARN_LINE_FORMAT = "at line $line of file $file"
+
# The WARN_LOGFILE tag can be used to specify a file to which warning and error
# messages should be written. If left blank the output is written to standard
-# error (stderr).
+# error (stderr). In case the file specified cannot be opened for writing the
+# warning and error messages are written to standard error. When as file - is
+# specified the warning and error messages are written to standard output
+# (stdout).
WARN_LOGFILE =
@@ -829,18 +908,29 @@ WARN_LOGFILE =
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
# Note: If this tag is empty the current directory is searched.
-INPUT = mainpage.md \
+INPUT = mainpage.md \
../../include/hip
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
-# possible encodings.
+# documentation (see:
+# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
+# See also: INPUT_FILE_ENCODING
# The default value is: UTF-8.
INPUT_ENCODING = UTF-8
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify
+# character encoding on a per file pattern basis. Doxygen will compare the file
+# name with each pattern and apply the encoding instead of the default
+# INPUT_ENCODING) if there is a match. The character encodings are a list of the
+# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding
+# "INPUT_ENCODING" for further information on supported encodings.
+
+INPUT_FILE_ENCODING =
+
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
# *.h) to filter out the source-files in the directories.
@@ -849,12 +939,14 @@ INPUT_ENCODING = UTF-8
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
# read by doxygen.
#
+# Note the list of default checked file patterns might differ from the list of
+# default file extension mappings.
+#
# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
-# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
-# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment),
-# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen
-# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f, *.for, *.tcl, *.vhd,
+# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml,
+# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C
+# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
# *.vhdl, *.ucf, *.qsf and *.ice.
FILE_PATTERNS = *.c \
@@ -932,7 +1024,7 @@ EXCLUDE_PATTERNS =
# (namespaces, classes, functions, etc.) that should be excluded from the
# output. The symbol name can be a fully qualified name, a word, or if the
# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
+# ANamespace::AClass, ANamespace::*Test
#
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories use the pattern */test/*
@@ -980,6 +1072,11 @@ IMAGE_PATH =
# code is scanned, but not when the output code is generated. If lines are added
# or removed, the anchors will not be placed correctly.
#
+# Note that doxygen will use the data processed and written to standard output
+# for further processing, therefore nothing else, like debug statements or used
+# commands (so in case of a Windows batch file always use @echo OFF), should be
+# written to standard output.
+#
# Note that for custom extensions or not directly supported extensions you also
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
# properly processed by doxygen.
@@ -1021,6 +1118,15 @@ FILTER_SOURCE_PATTERNS =
USE_MDFILE_AS_MAINPAGE =
+# The Fortran standard specifies that for fixed formatted Fortran code all
+# characters from position 72 are to be considered as comment. A common
+# extension is to allow longer lines before the automatic comment starts. The
+# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can
+# be processed before the automatic comment starts.
+# Minimum value: 7, maximum value: 10000, default value: 72.
+
+FORTRAN_COMMENT_AFTER = 72
+
#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------
@@ -1108,16 +1214,24 @@ USE_HTAGS = NO
VERBATIM_HEADERS = YES
# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
-# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
-# cost of reduced performance. This can be particularly helpful with template
-# rich C++ code for which doxygen's built-in parser lacks the necessary type
-# information.
+# clang parser (see:
+# http://clang.llvm.org/) for more accurate parsing at the cost of reduced
+# performance. This can be particularly helpful with template rich C++ code for
+# which doxygen's built-in parser lacks the necessary type information.
# Note: The availability of this option depends on whether or not doxygen was
# generated with the -Duse_libclang=ON option for CMake.
# The default value is: NO.
CLANG_ASSISTED_PARSING = NO
+# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS
+# tag is set to YES then doxygen will add the directory of each input to the
+# include path.
+# The default value is: YES.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_ADD_INC_PATHS = YES
+
# If clang assisted parsing is enabled you can provide the compiler with command
# line options that you would normally use when invoking the compiler. Note that
# the include paths will already be set by doxygen for the files and directories
@@ -1127,10 +1241,13 @@ CLANG_ASSISTED_PARSING = NO
CLANG_OPTIONS =
# If clang assisted parsing is enabled you can provide the clang parser with the
-# path to the compilation database (see:
-# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files
-# were built. This is equivalent to specifying the "-p" option to a clang tool,
-# such as clang-check. These options will then be passed to the parser.
+# path to the directory containing a file called compile_commands.json. This
+# file is the compilation database (see:
+# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the
+# options used when the source files were built. This is equivalent to
+# specifying the -p option to a clang tool, such as clang-check. These options
+# will then be passed to the parser. Any options specified with CLANG_OPTIONS
+# will be added as well.
# Note: The availability of this option depends on whether or not doxygen was
# generated with the -Duse_libclang=ON option for CMake.
@@ -1147,13 +1264,6 @@ CLANG_DATABASE_PATH =
ALPHABETICAL_INDEX = YES
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-COLS_IN_ALPHA_INDEX = 5
-
# In case all classes in a project start with a common prefix, all classes will
# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
# can be used to specify a prefix (or a list of prefixes) that should be ignored
@@ -1251,9 +1361,26 @@ HTML_EXTRA_STYLESHEET = ../_doxygen/extra_stylesheet.css
HTML_EXTRA_FILES =
+# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output
+# should be rendered with a dark or light theme. Default setting AUTO_LIGHT
+# enables light output unless the user preference is dark output. Other options
+# are DARK to always use dark mode, LIGHT to always use light mode, AUTO_DARK to
+# default to dark mode unless the user prefers light mode, and TOGGLE to let the
+# user toggle between dark and light mode via a button.
+# Possible values are: LIGHT Always generate light output., DARK Always generate
+# dark output., AUTO_LIGHT Automatically set the mode according to the user
+# preference, use light mode if no preference is set (the default)., AUTO_DARK
+# Automatically set the mode according to the user preference, use dark mode if
+# no preference is set. and TOGGLE Allow to user to switch between light and
+# dark mode via a button..
+# The default value is: AUTO_LIGHT.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE = AUTO_LIGHT
+
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the style sheet and background images according to
-# this color. Hue is specified as an angle on a colorwheel, see
+# this color. Hue is specified as an angle on a color-wheel, see
# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
# purple, and 360 is red again.
@@ -1263,7 +1390,7 @@ HTML_EXTRA_FILES =
HTML_COLORSTYLE_HUE = 220
# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
-# in the HTML output. For a value of 0 the output will use grayscales only. A
+# in the HTML output. For a value of 0 the output will use gray-scales only. A
# value of 255 will produce the most vivid colors.
# Minimum value: 0, maximum value: 255, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES.
@@ -1324,10 +1451,11 @@ HTML_INDEX_NUM_ENTRIES = 100
# If the GENERATE_DOCSET tag is set to YES, additional index files will be
# generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: https://developer.apple.com/xcode/), introduced with OSX
-# 10.5 (Leopard). To create a documentation set, doxygen will generate a
-# Makefile in the HTML output directory. Running make will produce the docset in
-# that directory and running make install will install the docset in
+# environment (see:
+# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
+# create a documentation set, doxygen will generate a Makefile in the HTML
+# output directory. Running make will produce the docset in that directory and
+# running make install will install the docset in
# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
# genXcode/_index.html for more information.
@@ -1344,6 +1472,13 @@ GENERATE_DOCSET = NO
DOCSET_FEEDNAME = "Doxygen generated docs"
+# This tag determines the URL of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDURL =
+
# This tag specifies a string that should uniquely identify the documentation
# set bundle. This should be a reverse domain-name style string, e.g.
# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
@@ -1369,8 +1504,12 @@ DOCSET_PUBLISHER_NAME = Publisher
# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on
-# Windows.
+# on Windows. In the beginning of 2021 Microsoft took the original page, with
+# a.o. the download links, offline the HTML help workshop was already many years
+# in maintenance mode). You can download the HTML help workshop from the web
+# archives at Installation executable (see:
+# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo
+# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe).
#
# The HTML Help Workshop contains a compiler that can convert all HTML output
# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
@@ -1400,7 +1539,7 @@ CHM_FILE =
HHC_LOCATION =
# The GENERATE_CHI flag controls if a separate .chi index file is generated
-# (YES) or that it should be included in the master .chm file (NO).
+# (YES) or that it should be included in the main .chm file (NO).
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
@@ -1445,7 +1584,8 @@ QCH_FILE =
# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
# Project output. For more information please see Qt Help Project / Namespace
-# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
+# (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_QHP is set to YES.
@@ -1453,8 +1593,8 @@ QHP_NAMESPACE = org.doxygen.Project
# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
# Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-
-# folders).
+# Folders (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
# The default value is: doc.
# This tag requires that the tag GENERATE_QHP is set to YES.
@@ -1462,16 +1602,16 @@ QHP_VIRTUAL_FOLDER = doc
# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
# filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
-# filters).
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_CUST_FILTER_NAME =
# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
# custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
-# filters).
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
# This tag requires that the tag GENERATE_QHP is set to YES.
QHP_CUST_FILTER_ATTRS =
@@ -1483,9 +1623,9 @@ QHP_CUST_FILTER_ATTRS =
QHP_SECT_FILTER_ATTRS =
-# The QHG_LOCATION tag can be used to specify the location of Qt's
-# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
-# generated .qhp file.
+# The QHG_LOCATION tag can be used to specify the location (absolute path
+# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
+# run qhelpgenerator on the generated .qhp file.
# This tag requires that the tag GENERATE_QHP is set to YES.
QHG_LOCATION =
@@ -1528,16 +1668,28 @@ DISABLE_INDEX = NO
# to work a browser that supports JavaScript, DHTML, CSS and frames is required
# (i.e. any modern browser). Windows users are probably better off using the
# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
-# further fine-tune the look of the index. As an example, the default style
-# sheet generated by doxygen has an example that shows how to put an image at
-# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
-# the same information as the tab index, you could consider setting
-# DISABLE_INDEX to YES when enabling this option.
+# further fine tune the look of the index (see "Fine-tuning the output"). As an
+# example, the default style sheet generated by doxygen has an example that
+# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
+# Since the tree basically has the same information as the tab index, you could
+# consider setting DISABLE_INDEX to YES when enabling this option.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
GENERATE_TREEVIEW = NO
+# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the
+# FULL_SIDEBAR option determines if the side bar is limited to only the treeview
+# area (value NO) or if it should extend to the full height of the window (value
+# YES). Setting this to YES gives a layout similar to
+# https://docs.readthedocs.io with more room for contents, but less room for the
+# project logo, title, and description. If either GENERATE_TREEVIEW or
+# DISABLE_INDEX is set to NO, this option has no effect.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FULL_SIDEBAR = NO
+
# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
# doxygen will group on one line in the generated HTML documentation.
#
@@ -1562,6 +1714,24 @@ TREEVIEW_WIDTH = 250
EXT_LINKS_IN_WINDOW = NO
+# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email
+# addresses.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+OBFUSCATE_EMAILS = YES
+
+# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
+# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
+# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
+# the HTML output. These images will generally look nicer at scaled resolutions.
+# Possible values are: png (the default) and svg (looks nicer but requires the
+# pdf2svg or inkscape tool).
+# The default value is: png.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FORMULA_FORMAT = png
+
# Use this tag to change the font size of LaTeX formulas included as images in
# the HTML documentation. When you change the font size after a successful
# doxygen run you need to manually remove any form_*.png images from the HTML
@@ -1571,17 +1741,6 @@ EXT_LINKS_IN_WINDOW = NO
FORMULA_FONTSIZE = 10
-# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are not
-# supported properly for IE 6.0, but are supported on all modern browsers.
-#
-# Note that when changing this option you need to delete any form_*.png files in
-# the HTML output directory before the changes have effect.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-FORMULA_TRANSPARENT = YES
-
# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
# to create new LaTeX commands to be used in formulas as building blocks. See
# the section "Including formulas" for details.
@@ -1599,11 +1758,29 @@ FORMULA_MACROFILE =
USE_MATHJAX = YES
+# With MATHJAX_VERSION it is possible to specify the MathJax version to be used.
+# Note that the different versions of MathJax have different requirements with
+# regards to the different settings, so it is possible that also other MathJax
+# settings have to be changed when switching between the different MathJax
+# versions.
+# Possible values are: MathJax_2 and MathJax_3.
+# The default value is: MathJax_2.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_VERSION = MathJax_2
+
# When MathJax is enabled you can set the default output format to be used for
-# the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
+# the MathJax output. For more details about the output format see MathJax
+# version 2 (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3
+# (see:
+# http://docs.mathjax.org/en/latest/web/components/output.html).
# Possible values are: HTML-CSS (which is slower, but has the best
-# compatibility), NativeMML (i.e. MathML) and SVG.
+# compatibility. This is the name for Mathjax version 2, for MathJax version 3
+# this will be translated into chtml), NativeMML (i.e. MathML. Only supported
+# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This
+# is the name for Mathjax version 3, for MathJax version 2 this will be
+# translated into HTML-CSS) and SVG.
# The default value is: HTML-CSS.
# This tag requires that the tag USE_MATHJAX is set to YES.
@@ -1616,22 +1793,29 @@ MATHJAX_FORMAT = HTML-CSS
# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
# Content Delivery Network so you can quickly see the result without installing
# MathJax. However, it is strongly recommended to install a local copy of
-# MathJax from https://www.mathjax.org before deployment.
-# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/.
+# MathJax from https://www.mathjax.org before deployment. The default value is:
+# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
+# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
# This tag requires that the tag USE_MATHJAX is set to YES.
MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
# extension names that should be enabled during MathJax rendering. For example
+# for MathJax version 2 (see
+# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions):
# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# For example for MathJax version 3 (see
+# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
+# MATHJAX_EXTENSIONS = ams
# This tag requires that the tag USE_MATHJAX is set to YES.
MATHJAX_EXTENSIONS =
# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
# of code that will be used on startup of the MathJax code. See the MathJax site
-# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
# example see the documentation.
# This tag requires that the tag USE_MATHJAX is set to YES.
@@ -1678,7 +1862,8 @@ SERVER_BASED_SEARCH = NO
#
# Doxygen ships with an example indexer (doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: https://xapian.org/).
+# Xapian (see:
+# https://xapian.org/).
#
# See the section "External Indexing and Searching" for details.
# The default value is: NO.
@@ -1691,8 +1876,9 @@ EXTERNAL_SEARCH = NO
#
# Doxygen ships with an example indexer (doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: https://xapian.org/). See the section "External Indexing and
-# Searching" for details.
+# Xapian (see:
+# https://xapian.org/). See the section "External Indexing and Searching" for
+# details.
# This tag requires that the tag SEARCHENGINE is set to YES.
SEARCHENGINE_URL =
@@ -1801,29 +1987,31 @@ PAPER_TYPE = a4
EXTRA_PACKAGES =
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
-# generated LaTeX document. The header should contain everything until the first
-# chapter. If it is left blank doxygen will generate a standard header. See
-# section "Doxygen usage" for information on how to let doxygen write the
-# default header to a separate file.
+# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for
+# the generated LaTeX document. The header should contain everything until the
+# first chapter. If it is left blank doxygen will generate a standard header. It
+# is highly recommended to start with a default header using
+# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
+# and then modify the file new_header.tex. See also section "Doxygen usage" for
+# information on how to generate the default header that doxygen normally uses.
#
-# Note: Only use a user-defined header if you know what you are doing! The
-# following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
-# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
-# string, for the replacement values of the other commands the user is referred
-# to HTML_HEADER.
+# Note: Only use a user-defined header if you know what you are doing!
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. The following
+# commands have a special meaning inside the header (and footer): For a
+# description of the possible markers and block names see the documentation.
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_HEADER =
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
-# generated LaTeX document. The footer should contain everything after the last
-# chapter. If it is left blank doxygen will generate a standard footer. See
+# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for
+# the generated LaTeX document. The footer should contain everything after the
+# last chapter. If it is left blank doxygen will generate a standard footer. See
# LATEX_HEADER for more information on how to generate a default footer and what
-# special commands can be used inside the footer.
-#
-# Note: Only use a user-defined footer if you know what you are doing!
+# special commands can be used inside the footer. See also section "Doxygen
+# usage" for information on how to generate the default footer that doxygen
+# normally uses. Note: Only use a user-defined footer if you know what you are
+# doing!
# This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_FOOTER =
@@ -1856,9 +2044,11 @@ LATEX_EXTRA_FILES =
PDF_HYPERLINKS = YES
-# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES, to get a
-# higher quality PDF documentation.
+# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as
+# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
+# files. Set this option to YES, to get a higher quality PDF documentation.
+#
+# See also section LATEX_CMD_NAME for selecting the engine.
# The default value is: YES.
# This tag requires that the tag GENERATE_LATEX is set to YES.
@@ -1866,8 +2056,7 @@ USE_PDFLATEX = YES
# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
# command to the generated LaTeX files. This will instruct LaTeX to keep running
-# if errors occur, instead of asking the user for help. This option is also used
-# when generating formulas in HTML.
+# if errors occur, instead of asking the user for help.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.
@@ -1880,16 +2069,6 @@ LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO
-# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
-# code with syntax highlighting in the LaTeX output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_SOURCE_CODE = NO
-
# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
# bibliography, e.g. plainnat, or ieeetr. See
# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
@@ -1970,16 +2149,6 @@ RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
-# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
-# with syntax highlighting in the RTF output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_SOURCE_CODE = NO
-
#---------------------------------------------------------------------------
# Configuration options related to the man page output
#---------------------------------------------------------------------------
@@ -2076,15 +2245,6 @@ GENERATE_DOCBOOK = NO
DOCBOOK_OUTPUT = docbook
-# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
-# program listings (including syntax highlighting and cross-referencing
-# information) to the DOCBOOK output. Note that enabling this will significantly
-# increase the size of the DOCBOOK output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
-DOCBOOK_PROGRAMLISTING = NO
-
#---------------------------------------------------------------------------
# Configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
@@ -2171,7 +2331,8 @@ SEARCH_INCLUDES = NO
# The INCLUDE_PATH tag can be used to specify one or more directories that
# contain include files that are not input files but should be processed by the
-# preprocessor.
+# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of
+# RECURSIVE has no effect here.
# This tag requires that the tag SEARCH_INCLUDES is set to YES.
INCLUDE_PATH =
@@ -2263,15 +2424,6 @@ EXTERNAL_PAGES = YES
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
-# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
-# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
-# NO turns the diagrams off. Note that this option also works with HAVE_DOT
-# disabled, but it is recommended to install and use dot, since it yields more
-# powerful graphs.
-# The default value is: YES.
-
-CLASS_DIAGRAMS = NO
-
# You can include diagrams made with dia in doxygen documentation. Doxygen will
# then run dia to produce the diagram and insert it in the documentation. The
# DIA_PATH tag allows you to specify the directory where the dia binary resides.
@@ -2290,7 +2442,7 @@ HIDE_UNDOC_RELATIONS = YES
# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
# Bell Labs. The other options in this section have no effect if this option is
# set to NO
-# The default value is: YES.
+# The default value is: NO.
HAVE_DOT = YES
@@ -2304,35 +2456,50 @@ HAVE_DOT = YES
DOT_NUM_THREADS = 0
-# When you want a differently looking font in the dot files that doxygen
-# generates you can specify the font name using DOT_FONTNAME. You need to make
-# sure dot is able to find the font, which can be done by putting it in a
-# standard location or by setting the DOTFONTPATH environment variable or by
-# setting DOT_FONTPATH to the directory containing the font.
-# The default value is: Helvetica.
+# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of
+# subgraphs. When you want a differently looking font in the dot files that
+# doxygen generates you can specify fontname, fontcolor and fontsize attributes.
+# For details please see Node,
+# Edge and Graph Attributes specification You need to make sure dot is able
+# to find the font, which can be done by putting it in a standard location or by
+# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font. Default graphviz fontsize is 14.
+# The default value is: fontname=Helvetica,fontsize=10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10"
+
+# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can
+# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about
+# arrows shapes.
+# The default value is: labelfontname=Helvetica,labelfontsize=10.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_FONTNAME = Helvetica
+DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10"
-# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
-# dot graphs.
-# Minimum value: 4, maximum value: 24, default value: 10.
+# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes
+# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification
+# The default value is: shape=box,height=0.2,width=0.4.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_FONTSIZE = 10
+DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4"
-# By default doxygen will tell dot to use the default font as specified with
-# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
-# the path where dot can find it using this tag.
+# You can set the path where dot can find font specified with fontname in
+# DOT_COMMON_ATTR and others dot attributes.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_FONTPATH =
-# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
-# each documented class showing the direct and indirect inheritance relations.
-# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a
+# graph for each documented class showing the direct and indirect inheritance
+# relations. In case HAVE_DOT is set as well dot will be used to draw the graph,
+# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set
+# to TEXT the direct and indirect inheritance relations will be shown as texts /
+# links.
+# Possible values are: NO, YES, TEXT and GRAPH.
# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
CLASS_GRAPH = YES
@@ -2346,7 +2513,8 @@ CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
-# groups, showing the direct groups dependencies.
+# groups, showing the direct groups dependencies. See also the chapter Grouping
+# in the manual.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
@@ -2369,10 +2537,32 @@ UML_LOOK = NO
# but if the number exceeds 15, the total amount of fields shown is limited to
# 10.
# Minimum value: 0, maximum value: 100, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
+# This tag requires that the tag UML_LOOK is set to YES.
UML_LIMIT_NUM_FIELDS = 10
+# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
+# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
+# tag is set to YES, doxygen will add type and arguments for attributes and
+# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
+# will not generate fields with class member information in the UML graphs. The
+# class diagrams will look similar to the default class diagrams but using UML
+# notation for the relationships.
+# Possible values are: NO, YES and NONE.
+# The default value is: NO.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+DOT_UML_DETAILS = NO
+
+# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
+# to display on a single line. If the actual line length exceeds this threshold
+# significantly it will wrapped across multiple lines. Some heuristics are apply
+# to avoid ugly line breaks.
+# Minimum value: 0, maximum value: 1000, default value: 17.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_WRAP_THRESHOLD = 17
+
# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
# collaboration graphs will show the relations between templates and their
# instances.
@@ -2439,6 +2629,13 @@ GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
+# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels
+# of child directories generated in directory dependency graphs by dot.
+# Minimum value: 1, maximum value: 25, default value: 1.
+# This tag requires that the tag DIRECTORY_GRAPH is set to YES.
+
+DIR_GRAPH_MAX_DEPTH = 1
+
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
# generated by dot. For an explanation of the image formats see the section
# output formats in the documentation of the dot tool (Graphviz (see:
@@ -2446,9 +2643,7 @@ DIRECTORY_GRAPH = YES
# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
# to make the SVG files visible in IE 9+ (other browsers do not have this
# requirement).
-# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
-# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
-# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo,
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
# png:gdiplus:gdiplus.
# The default value is: png.
@@ -2494,10 +2689,10 @@ MSCFILE_DIRS =
DIAFILE_DIRS =
# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
-# path where java can find the plantuml.jar file. If left blank, it is assumed
-# PlantUML is not used or called during a preprocessing step. Doxygen will
-# generate a warning when it encounters a \startuml command in this case and
-# will not generate output for the diagram.
+# path where java can find the plantuml.jar file or to the filename of jar file
+# to be used. If left blank, it is assumed PlantUML is not used or called during
+# a preprocessing step. Doxygen will generate a warning when it encounters a
+# \startuml command in this case and will not generate output for the diagram.
PLANTUML_JAR_PATH =
@@ -2535,18 +2730,6 @@ DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 0
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not seem
-# to support this out of the box.
-#
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_TRANSPARENT = NO
-
# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
# files in one run (i.e. multiple -o and -T options on the command line). This
# makes dot run faster, but since only newer versions of dot (>1.8.10) support
@@ -2559,14 +2742,18 @@ DOT_MULTI_TARGETS = NO
# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
# explaining the meaning of the various boxes and arrows in the dot generated
# graphs.
+# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal
+# graphical representation for inheritance and collaboration diagrams is used.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
GENERATE_LEGEND = YES
-# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
# files that are used to generate the various graphs.
+#
+# Note: This setting is not only used for dot files but also for msc temporary
+# files.
# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
DOT_CLEANUP = YES
diff --git a/docs/.sphinx/_toc.yml.in b/docs/.sphinx/_toc.yml.in
index dc07d17d8a..036bd9d60e 100644
--- a/docs/.sphinx/_toc.yml.in
+++ b/docs/.sphinx/_toc.yml.in
@@ -1,26 +1,35 @@
root: index
subtrees:
-- caption: User Guide
+- caption: User Reference
+ entries:
+ - file: .doxygen/docBin/html/index
+ - file: reference/kernel_language
+ - file: reference/math_api
+ - file: reference/glossary
+ - file: reference/deprecated_api_list
+- caption: User How to Guides
+ entries:
+ - file: how_to_guides/install.md
+- caption: User Tutorials
+ entries:
+ - file: tutorials/saxpy.md
+- caption: Developer How to Guides
+ entries:
+ - file: developer_guide/build
+- caption: Legacy Reference
+ entries:
+ - file: reference/terms
+- caption: Legacy User Guide
entries:
- file: user_guide/programming_manual
- file: user_guide/hip_rtc
- file: user_guide/faq
+- caption: Legacy How to Guides
+ entries:
+ - file: how_to_guides/debugging.md
- file: user_guide/hip_porting_guide
- file: user_guide/hip_porting_driver_api
-- caption: How to Guides
- entries:
- - file: how_to_guides/install.md
- - file: how_to_guides/debugging.md
-- caption: Reference
- entries:
- - file: .doxygen/docBin/html/index
- - file: reference/kernel_language
- - file: reference/math_api
- - file: reference/terms
- - file: reference/glossary
- - file: reference/deprecated_api_list
-- caption: Developer Guide
- entries:
- - file: developer_guide/build
- - file: developer_guide/logging
- - file: developer_guide/contributing.md
\ No newline at end of file
+- caption: Legacy Developer Guide
+ entries:
+ - file: developer_guide/logging
+ - file: developer_guide/contributing.md
\ No newline at end of file
diff --git a/docs/.sphinx/requirements.in b/docs/.sphinx/requirements.in
index 67a925b2c9..5a45df89c6 100644
--- a/docs/.sphinx/requirements.in
+++ b/docs/.sphinx/requirements.in
@@ -1 +1 @@
-rocm-docs-core[api_reference]==0.11.0
+rocm-docs-core[api_reference]==0.19.0
diff --git a/docs/.sphinx/requirements.txt b/docs/.sphinx/requirements.txt
index a52f70a92d..32ac1a0b3f 100644
--- a/docs/.sphinx/requirements.txt
+++ b/docs/.sphinx/requirements.txt
@@ -1,8 +1,8 @@
#
-# This file is autogenerated by pip-compile with Python 3.8
+# This file is autogenerated by pip-compile with Python 3.10
# by the following command:
#
-# pip-compile requirements.in
+# pip-compile ./docs/.sphinx/requirements.in
#
accessible-pygments==0.0.3
# via pydata-sphinx-theme
@@ -41,7 +41,7 @@ docutils==0.16
# myst-parser
# pydata-sphinx-theme
# sphinx
-doxysphinx==3.2.1
+doxysphinx==3.3.4
# via rocm-docs-core
fastjsonschema==2.16.2
# via rocm-docs-core
@@ -53,18 +53,12 @@ idna==3.3
# via requests
imagesize==1.4.1
# via sphinx
-importlib-metadata==5.1.0
- # via sphinx
-importlib-resources==5.10.4
- # via rocm-docs-core
jinja2==3.1.2
# via
# myst-parser
# sphinx
-json5==0.9.11
+libsass==0.22.0
# via doxysphinx
-linkify-it-py==1.0.3
- # via myst-parser
lxml==4.9.2
# via doxysphinx
markdown-it-py==2.1.0
@@ -77,7 +71,9 @@ mdit-py-plugins==0.3.5
# via myst-parser
mdurl==0.1.2
# via markdown-it-py
-myst-parser[linkify]==1.0.0
+mpire==2.7.1
+ # via doxysphinx
+myst-parser==1.0.0
# via rocm-docs-core
packaging==21.3
# via
@@ -94,8 +90,11 @@ pygithub==1.58.2
pygments==2.12.0
# via
# accessible-pygments
+ # mpire
# pydata-sphinx-theme
# sphinx
+pyjson5==1.6.3
+ # via doxysphinx
pyjwt[crypto]==2.6.0
# via pygithub
pynacl==1.5.0
@@ -115,8 +114,8 @@ requests==2.28.1
# via
# pygithub
# sphinx
-rocm-docs-core[api_reference]==0.11.0
- # via -r requirements.in
+rocm-docs-core[api_reference]==0.19.0
+ # via -r ./docs/.sphinx/requirements.in
smmap==5.0.0
# via gitdb
snowballstemmer==2.2.0
@@ -156,15 +155,11 @@ sphinxcontrib-qthelp==1.0.3
# via sphinx
sphinxcontrib-serializinghtml==1.1.5
# via sphinx
+tqdm==4.65.0
+ # via mpire
typing-extensions==4.4.0
# via pydata-sphinx-theme
-uc-micro-py==1.0.1
- # via linkify-it-py
urllib3==1.26.11
# via requests
wrapt==1.15.0
# via deprecated
-zipp==3.11.0
- # via
- # importlib-metadata
- # importlib-resources
diff --git a/docs/index.md b/docs/index.md
index a2a7c89f20..5f6906492d 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -3,35 +3,98 @@
HIP is a C++ runtime API and kernel language that allows developers to create
portable applications for AMD and NVIDIA GPUs from single source code.
-## Overview
+## User Manual
+
+These documents are targeted at authors of HIP libraries and applications.
+
+::::{grid} 1 1 2 2
+:gutter: 1
+
+:::{grid-item-card} Reference
+
+- {doc}`/.doxygen/docBin/html/index`
+ - {doc}`/.doxygen/docBin/html/modules`
+- {doc}`/reference/kernel_language`
+- {doc}`/reference/math_api`
+- {doc}`/reference/deprecated_api_list`
+
+:::
+
+:::{grid-item-card} Understand HIP
+:::
+
+:::{grid-item-card} How-to Guides
+
+- {doc}`/how_to_guides/install`
+
+:::
+
+:::{grid-item-card} Tutorials
+
+- {doc}`/tutorials/saxpy`
+
+:::
+
+::::
+
+## Developer Manual
+
+These documents are targeted at authors contributing to the HIP runtime and
+the accompanying host/device compiler.
+
+::::{grid} 1 1 2 2
+:gutter: 1
+
+:::{grid-item-card} Reference
+:::
+
+:::{grid-item-card} Background
+:::
+
+:::{grid-item-card} How-to Guides
+
+- {doc}`/developer_guide/build`
+
+:::
+
+:::{grid-item-card} Tutorials
+:::
+
+::::
+
+## Legacy Content
+
+Materials listed here don't fit well the new documentation system and will be
+removed once their contents are appropriately covered.
::::{grid} 1 1 2 2
:gutter: 1
:::{grid-item-card} User Guide
+
- {doc}`/user_guide/programming_manual`
- {doc}`/user_guide/hip_rtc`
- {doc}`/user_guide/faq`
+
:::
:::{grid-item-card} How to Guides
-- {doc}`/how_to_guides/install`
+
- {doc}`/how_to_guides/debugging`
+
:::
:::{grid-item-card} Reference
-- {doc}`/.doxygen/docBin/html/index`
- - {doc}`/.doxygen/docBin/html/modules`
-- {doc}`/reference/kernel_language`
-- {doc}`/reference/math_api`
+
- {doc}`/reference/terms`
-- {doc}`/reference/deprecated_api_list`
+
:::
:::{grid-item-card} Developer Guide
-- {doc}`/developer_guide/build`
+
- {doc}`/developer_guide/logging`
- {doc}`/developer_guide/contributing`
+
:::
-::::
\ No newline at end of file
+::::
diff --git a/docs/tutorials/saxpy.md b/docs/tutorials/saxpy.md
new file mode 100644
index 0000000000..1fed2ce118
--- /dev/null
+++ b/docs/tutorials/saxpy.md
@@ -0,0 +1,812 @@
+# Tutorial: SAXPY - Hello, HIP
+
+This tutorial will show you some of the basic concepts of the single-source HIP
+programming model, the most essential tooling around it and briefly rehash some
+commonalities of heterogenous APIs in general. Mild familiarity with the C/C++
+compilation model and the language is assumed throughout this article.
+
+## Prerequisites
+
+In order to follow this tutorial you will need properly installed drivers and a
+HIP compiler toolchain to compile your code. Because HIP provided by ROCm
+supports compiling and running on Linux and Windows with AMD and NVIDIA GPUs
+alike, the combination of install instructions are more then worth covering as
+part of this tutorial. Please refer to {doc}`/how_to_guides/install` on how to
+install HIP development packages.
+
+## Heterogenous Programming
+
+Heterogenous programming and offloading APIs are often mentioned together.
+Heterogenous programming deals with devices of varying capabilities at once
+while the term offloading focuses on the "remote" and asnychronous aspect of
+the computation. HIP encompasses both: it exposes GPGPU (General Purpose GPU)
+programming much like ordinary host-side CPU programming and let's us move data
+to and from device as need be.
+
+```{important}
+Most of the HIP-specific code will deal with "where", "what" and "how".
+```
+
+One thing to keep in mind while programming in HIP (and other heterogenous APIs
+for that matter), is that target devices are built for a specific purpose. They
+are designed with different tradeoffs than traditional CPUs and therefore have
+very different performance characteristics. Ever so subtle changes in code may
+effect execution time adversely. Rest assured one can always find the root
+cause and design a fix.
+
+## Your First Piece of HIP Code
+
+First, let's take the "Hello, World!" of GPGPU: SAXPY. The name comes from
+math, a vector equation at that: {math}`a\cdot x+y=z` where
+{math}`a\in\mathbb{R}` is a scalar and {math}`x,y,z\in\mathbb{V}` are vector
+quantities of some large dimensionality. (Our vector space is defined over the
+set of reals.) From a practical perspective we can compute this using a single
+`for` loop over 3 arrays.
+
+```c++
+for (int i = 0 ; i < N ; ++i)
+ z[i] = a * x[i] + y[i];
+```
+
+In linear algebra libraries, such as BLAS (Basic Linear Algebra Subsystem) this
+operation is defined as AXPY "A times X Plus Y". The "S" comes from
+single-precision, meaning that every element of our array are `float`s. (We
+choose IEEE 754: binary32 arithmetic as the representation of our algebra.)
+
+To get quickly off the ground, we'll take off-the-shelf piece of code, the set
+of [HIP samples from GitHub](https://github.com/amd/rocm-examples/). Assuming
+Git is on your Path, open a command-line and navigate to where you'll want to
+work, then issue:
+
+```shell
+git clone https://github.com/amd/rocm-examples.git
+```
+
+Inside the repo, you should find `HIP-Basic\saxpy\main.hip` which is a
+sufficiently simple implementation of SAXPY. It was already mentioned
+that HIP code will mostly deal with where and when data has to be and
+how devices will transform it. The very first HIP calls deal with
+allocating device-side memory and dispatching data from host-side
+memory in a C Runtime-like fashion.
+
+```hip
+// Allocate and copy vectors to device memory.
+float* d_x{};
+float* d_y{};
+HIP_CHECK(hipMalloc(&d_x, size_bytes));
+HIP_CHECK(hipMalloc(&d_y, size_bytes));
+HIP_CHECK(hipMemcpy(d_x, x.data(), size_bytes, hipMemcpyHostToDevice));
+HIP_CHECK(hipMemcpy(d_y, y.data(), size_bytes, hipMemcpyHostToDevice));
+```
+
+`HIP_CHECK` is a custom macro borrowed from the examples utilities which
+checks the error code returned by API functions for errors and reports them to
+the console. It's not quintessential to the API.
+
+If you're wondering: how does it know which device to allocate on / dispatch
+to... wonder no more. Commands are issued to the HIP runtime on a per-thread
+basis and every thread has a device set as the target of commands. The default
+device is `0`, which is equivalent to calling `hipSetDevice(0)`.
+
+Once our data has been dispatched, we can launch our calculation on the device.
+
+```cu
+__global__ void saxpy_kernel(const float a, const float* d_x, float* d_y, const unsigned int size)
+{
+ ...
+}
+
+int main()
+{
+ ...
+
+ // Launch the kernel on the default stream.
+ saxpy_kernel<<>>(a, d_x, d_y, size);
+}
+```
+
+First let's discuss the signature of the offloaded function:
+
+- `__global__` instructs the compiler to generate code for this function as an
+ entrypoint to a device program, such that it can be launched from the host.
+- The function does not return anything, because there is no trivial way to
+ construct a return channel of a parallel invocation. Device-side entrypoints
+ may not return a value, their results should be communicated using out
+ params.
+- Device-side functions are typically called compute kernels, or just kernels
+ for short. This is to distinguish them from non-graphics-related graphics
+ shaders, or just shaders for short.
+- Arguments are taken by value and all arguments shall be
+ [TriviallyCopyable](https://en.cppreference.com/w/cpp/named_req/TriviallyCopyable),
+ meaning they should be `memcpy`-friendly. _(Imagine if they had custom copy
+ constructors. Where would that logic execute? On the host? On the device?)_
+ Pointer arguments are pointers to device memory, one typically backed by
+ VRAM.
+- We said that we'll be computing {math}`a\cdot x+y=z`, however we only pass
+ two pointers to the function. We'll be canonically reusing one of the inputs
+ as outputs.
+
+There's quite a lot to unpack already. How is this function launched from the
+host? Using a language extension, the so-called triple chevron syntax. Inside
+the angle brackets we can provide the following:
+
+- The number of blocks to launch (our grid size)
+- The number of threads in a block (our block size)
+- The amount of shared memory to allocate by the host
+- The device stream to enqueue the operation on
+
+Following the triple chevron is ordinary function argument passing. Now let's
+take a look how the kernel is implemented.
+
+```cu
+__global__ void saxpy_kernel(const float a, const float* d_x, float* d_y, const unsigned int size)
+{
+ // Compute the current thread's index in the grid.
+ const unsigned int global_idx = blockIdx.x * blockDim.x + threadIdx.x;
+
+ // The grid can be larger than the number of items in the vectors. Avoid out-of-bounds addressing.
+ if(global_idx < size)
+ {
+ d_y[global_idx] = a * d_x[global_idx] + d_y[global_idx];
+ }
+}
+```
+
+- The unique linear index identifying the thread is computed from the block id
+ the thread is a member of, the block's size and the id of the thread within
+ the block.
+- A check is made to avoid overindexing the input.
+- The useful part of the computation is carried out.
+
+Retrieval of the result from the device is done much like its dispatch:
+
+```cu
+HIP_CHECK(hipMemcpy(y.data(), d_y, size_bytes, hipMemcpyDeviceToHost));
+```
+
+## Compiling on the Command-Line
+
+(setting_up_the_command-line)=
+
+### Setting Up the Command-Line
+
+While strictly speaking there's no such thing as "setting up the command-line
+for compilation" on Linux, just to make invocations more terse let's do it on
+both Linux and Windows.
+
+::::{tab-set}
+:::{tab-item} Linux & AMD
+:sync: linux-amd
+
+While distro maintainers may package ROCm such that they install to
+system-default locations, AMD's installation don't and need to be added to the
+Path by the user.
+
+```bash
+export PATH=/opt/rocm/bin:${PATH}
+```
+
+You should be able to call the compiler on the command-line now:
+
+```bash
+amdclang++ --version
+```
+
+```{tip}
+Docker images distributed by AMD, such as
+[`rocm-terminal`](https://hub.docker.com/r/rocm/rocm-terminal/) already have
+`/opt/rocm/bin` on the Path for convenience. (This subtly affects CMake package
+detection logic of ROCm libraries.)
+```
+
+:::
+:::{tab-item} Linux & NVIDIA
+:sync: linux-nvidia
+
+Both distro maintainers and NVIDIA package CUDA as such that `nvcc` and related
+tools are on the command-line by default. You should be able to call the
+compiler on the command-line simply:
+
+```bash
+nvcc --version
+```
+
+:::
+:::{tab-item} Windows & AMD
+:sync: windows-amd
+
+Windows compilers and command-line tooling have traditionally
+relied on extra environmental variables and Path entries to function correctly.
+Visual Studio refers to command-lines with these setup as "Developer
+Command Prompt" or "Developer PowerShell" for `cmd.exe` and PowerShell
+respectively.
+
+The HIP SDK on Windows doesn't ship a complete toolchain, you will also need:
+
+- the Windows SDK, most crucially providing the import libs to crucial system
+ libraries all executables must link to and some auxiliary compiler tooling.
+- a Standard Template Library, aka. STL, which HIP too relies on.
+
+The prior may be installed separately, though it's most conveniently obtained
+through the Visual Studio installer, while the latter is part of the Microsoft
+Visual C++ compiler, aka. MSVC, also installed via Visual Studio.
+
+If you don't already have some SKU of Visual Studio 2022 installed, for a
+minimal command-line experience, install the
+[Build Tools for Visual Studio 2022](https://aka.ms/vs/17/release/vs_BuildTools.exe)
+with the Desktop Developemnt Workload and under Individual Components select:
+
+- some version of the Windows SDK
+- "MSVC v143 - VS 2022 C++ x64/x86 build tools (Latest)"
+- "C++ CMake tools for Windows" (optional)
+
+```{tip}
+The "C++ CMake tools for Windows" individual component is a convenience which
+puts both `cmake.exe` and `ninja.exe` onto the `PATH` inside developer
+command-prompts. You can install these manually, but then you need to manage
+them manually.
+```
+
+Visual Studio installations as of VS 2017 are detectable as COM object
+instances via WMI. To setup a command-line from any shell for the latest
+Visual Studio's default (latest) Visual C++ toolset issue:
+
+```pwsh
+$InstallationPath = Get-CimInstance MSFT_VSInstance | Sort-Object -Property Version -Descending | Select-Object -First 1 -ExpandProperty InstallLocation
+Import-Module $InstallationPath\Common7\Tools\Microsoft.VisualStudio.DevShell.dll
+Enter-VsDevShell -InstallPath $InstallationPath -SkipAutomaticLocation -Arch amd64 -HostArch amd64 -DevCmdArguments '-no_logo'
+$env:PATH = "${env:HIP_PATH}bin;${env:PATH}"
+```
+
+You should be able to call the compiler on the command-line now:
+
+```pwsh
+clang++ --version
+```
+
+:::
+:::{tab-item} Windows & NVIDIA
+:sync: windows-nvidia
+
+Windows compilers and command-line tooling have traditionally
+relied on extra environmental variables and Path entries to function correctly.
+Visual Studio refers to command-lines with these setup as "Developer
+Command Prompt" or "Developer PowerShell" for `cmd.exe` and PowerShell
+respectively.
+
+The HIP and CUDA SDKs on Windows doesn't ship complete toolchains, you will
+also need:
+
+- the Windows SDK, most crucially providing the import libs to crucial system
+ libraries all executables must link to and some auxiliary compiler tooling.
+- a Standard Template Library, aka. STL, which HIP too relies on.
+
+The prior may be installed separately, though it's most conveniently obtained
+through the Visual Studio installer, while the latter is part of the Microsoft
+Visual C++ compiler, aka. MSVC, also installed via Visual Studio.
+
+If you don't already have some SKU of Visual Studio 2022 installed, for a
+minimal command-line experience, install the
+[Build Tools for Visual Studio 2022](https://aka.ms/vs/17/release/vs_BuildTools.exe)
+with the Desktop Developemnt Workload and under Individual Components select:
+
+- some version of the Windows SDK
+- "MSVC v143 - VS 2022 C++ x64/x86 build tools (Latest)"
+- "C++ CMake tools for Windows" (optional)
+
+```{tip}
+The "C++ CMake tools for Windows" individual component is a convenience which
+puts both `cmake.exe` and `ninja.exe` onto the `PATH` inside developer
+command-prompts. You can install these manually, but then you need to manage
+them manually.
+```
+
+Visual Studio installations as of VS 2017 are detectable as COM object
+instances via WMI. To setup a command-line from any shell for the latest
+Visual Studio's default (latest) Visual C++ toolset issue:
+
+```pwsh
+$InstallationPath = Get-CimInstance MSFT_VSInstance | Sort-Object -Property Version -Descending | Select-Object -First 1 -ExpandProperty InstallLocation
+Import-Module $InstallationPath\Common7\Tools\Microsoft.VisualStudio.DevShell.dll
+Enter-VsDevShell -InstallPath $InstallationPath -SkipAutomaticLocation -Arch amd64 -HostArch amd64 -DevCmdArguments '-no_logo'
+```
+
+You should be able to call the compiler on the command-line now:
+
+```pwsh
+nvcc --version
+```
+
+:::
+::::
+
+### Invoking the Compiler Manually
+
+To compile and link a single-file application, one may use the following
+command:
+
+::::{tab-set}
+:::{tab-item} Linux & AMD
+:sync: linux-amd
+
+```bash
+amdclang++ ./HIP-Basic/saxpy/main.hip -o saxpy -I ./Common -lamdhip64 -L /opt/rocm/lib -O2
+```
+
+:::
+:::{tab-item} Linux & NVIDIA
+:sync: linux-nvidia
+
+```bash
+nvcc ./HIP-Basic/saxpy/main.hip -o saxpy -I ./Common -I /opt/rocm/include -O2 -x cu
+```
+
+:::
+:::{tab-item} Windows & AMD
+:sync: windows-amd
+
+```pwsh
+clang++ .\HIP-Basic\saxpy\main.hip -o saxpy.exe -I .\Common -lamdhip64 -L ${env:HIP_PATH}lib -O2
+```
+
+:::
+:::{tab-item} Windows & NVIDIA
+:sync: windows-nvidia
+
+```pwsh
+nvcc .\HIP-Basic\saxpy\main.hip -o saxpy.exe -I ${env:HIP_PATH}include -I .\Common -O2 -x cu
+```
+
+:::
+::::
+
+Depending on your computer, the resulting binary may or may not run. If not, it
+will typically complain about about "Invalid device function". That error
+(corresponding to the `hipErrorInvalidDeviceFunction` entry of `hipError_t`)
+means that the runtime could not find a device program binary of the
+appropriate flavor embedded into the executable.
+
+So far we've only talked about how our data makes it from the host to the
+device and back. We've also seen our device code as source, but the HIP runtime
+was arguing about not finding the right binary to dispatch for execution. How
+can one find out what device binary flavors are embedded into the executable?
+
+::::{tab-set}
+:::{tab-item} Linux & AMD
+:sync: linux-amd
+
+The set of `roc-*` utilities shipping with ROCm help significantly to inspect
+binary artifacts on disk. If you wish to use these utilities, add the ROCmCC
+installation folder to your PATH (the utilities expect them to be on the PATH).
+
+Lisitng of the embedded program binaries can be done using `roc-obj-ls`
+
+```bash
+roc-obj-ls ./saxpy
+```
+
+It may return something like:
+
+```shell
+1 host-x86_64-unknown-linux file://./saxpy#offset=12288&size=0
+1 hipv4-amdgcn-amd-amdhsa--gfx803 file://./saxpy#offset=12288&size=9760
+```
+
+We can see that the compiler embedded a version 4 code object (more on code
+object versions
+[here](https://www.llvm.org/docs/AMDGPUUsage.html#code-object-metadata)) and
+used the LLVM target triple `amdgcn-amd-amdhsa--gfx803` (more on target triples
+[here](https://www.llvm.org/docs/AMDGPUUsage.html#target-triples)). We can
+extract that program object in a disassembled fashion for human consumption via
+`roc-obj`
+
+```bash
+roc-obj -t gfx803 -d ./saxpy
+```
+
+Which will create two files on disk and we'll be interested in the one with the
+`.s` extension. Opening up said file or dumping it to the console using `cat`
+one will find the disassembled binary of our saxpy compute kernel, something
+similar to:
+
+```none
+Disassembly of section .text:
+
+<_Z12saxpy_kernelfPKfPfj>:
+ s_load_dword s0, s[4:5], 0x2c // 000000001000: C0020002 0000002C
+ s_load_dword s1, s[4:5], 0x18 // 000000001008: C0020042 00000018
+ s_waitcnt lgkmcnt(0) // 000000001010: BF8C007F
+ s_and_b32 s0, s0, 0xffff // 000000001014: 8600FF00 0000FFFF
+ s_mul_i32 s6, s6, s0 // 00000000101C: 92060006
+ v_add_u32_e32 v0, vcc, s6, v0 // 000000001020: 32000006
+ v_cmp_gt_u32_e32 vcc, s1, v0 // 000000001024: 7D980001
+ s_and_saveexec_b64 s[0:1], vcc // 000000001028: BE80206A
+ s_cbranch_execz 22 // 00000000102C: BF880016 <_Z12saxpy_kernelfPKfPfj+0x88>
+ s_load_dwordx4 s[0:3], s[4:5], 0x8 // 000000001030: C00A0002 00000008
+ v_mov_b32_e32 v1, 0 // 000000001038: 7E020280
+ v_lshlrev_b64 v[0:1], 2, v[0:1] // 00000000103C: D28F0000 00020082
+ s_waitcnt lgkmcnt(0) // 000000001044: BF8C007F
+ v_mov_b32_e32 v3, s1 // 000000001048: 7E060201
+ v_add_u32_e32 v2, vcc, s0, v0 // 00000000104C: 32040000
+ v_addc_u32_e32 v3, vcc, v3, v1, vcc // 000000001050: 38060303
+ flat_load_dword v2, v[2:3] // 000000001054: DC500000 02000002
+ v_mov_b32_e32 v3, s3 // 00000000105C: 7E060203
+ v_add_u32_e32 v0, vcc, s2, v0 // 000000001060: 32000002
+ v_addc_u32_e32 v1, vcc, v3, v1, vcc // 000000001064: 38020303
+ flat_load_dword v3, v[0:1] // 000000001068: DC500000 03000000
+ s_load_dword s0, s[4:5], 0x0 // 000000001070: C0020002 00000000
+ s_waitcnt vmcnt(0) lgkmcnt(0) // 000000001078: BF8C0070
+ v_mac_f32_e32 v3, s0, v2 // 00000000107C: 2C060400
+ flat_store_dword v[0:1], v3 // 000000001080: DC700000 00000300
+ s_endpgm // 000000001088: BF810000
+```
+
+Alternatively we can call the compiler with `--save-temps` to dump all device
+binary to disk in separate files.
+
+```bash
+amdclang++ ./HIP-Basic/saxpy/main.hip -o saxpy -I ./Common -lamdhip64 -L /opt/rocm/lib -O2 --save-temps
+```
+
+Now we can list all the temporaries created while compiling `main.hip` via
+
+```bash
+ls main-hip-amdgcn-amd-amdhsa-*
+main-hip-amdgcn-amd-amdhsa-gfx803.bc
+main-hip-amdgcn-amd-amdhsa-gfx803.cui
+main-hip-amdgcn-amd-amdhsa-gfx803.o
+main-hip-amdgcn-amd-amdhsa-gfx803.out
+main-hip-amdgcn-amd-amdhsa-gfx803.out.resolution.txt
+main-hip-amdgcn-amd-amdhsa-gfx803.s
+```
+
+Files with the `.s` extension hold the disassembled contents of the binary and
+the filename directly informs us of the graphics IPs used by the compiler. The
+contents of this file is very similar to what `roc-obj` printed to the console.
+
+:::
+:::{tab-item} Linux & NVIDIA
+:sync: linux-nvidia
+
+Unlike HIP on AMD, when compiling using the NVIDIA support of HIP the resulting
+binary will be a valid CUDA executable as far as the binary goes. Therefor
+it'll incorporate PTX ISA (Parallel Thread eXecution Instruction Set
+Architecture) instead of AMDGPU binary. As s result, tooling shipping with the
+CUDA SDK can be used to inspect which device ISA got compiled into a specific
+executable. The tool most useful to us currently is `cuobjdump`.
+
+```bash
+cuobjdump --list-ptx ./saxpy
+```
+
+Which will print something like:
+
+```none
+PTX file 1: saxpy.1.sm_52.ptx
+```
+
+From this we can see that the saxpy kernel is stored as `sm_52`, which shows
+that a compute capability 5.2 ISA got embedded into the executable, so devices
+which sport compute capability 5.2 or newer will be able to run this code.
+
+:::
+:::{tab-item} Windows & AMD
+:sync: windows-amd
+
+The HIP SDK for Windows don't yet sport the `roc-*` set of utilities to work
+with binary artifacts. To find out what binary formats are embedded into an
+executable, one may use `dumpbin` tool from the Windows SDK to obtain the
+raw data of the `.hip_fat` section of an executable. (This binary payload is
+what gets parsed by the `roc-*` set of utilities on Linux.) Skipping over the
+reported header, the rendered raw data as ASCII has ~3 lines per entries.
+Depending on how many binaries are embedded, you may need to alter the number
+of rendered lines. An invocation such as:
+
+```pwsh
+dumpbin.exe /nologo /section:.hip_fat /rawdata:8 .\saxpy.exe | select -Skip 20 -First 12
+```
+
+The output may look like:
+
+```none
+000000014004C000: 5F474E414C435F5F 5F44414F4C46464F __CLANG_OFFLOAD_
+000000014004C010: 5F5F454C444E5542 0000000000000002 BUNDLE__........
+000000014004C020: 0000000000001000 0000000000000000 ................
+000000014004C030: 0000000000000019 3638782D74736F68 ........host-x86
+000000014004C040: 6E6B6E752D34365F 756E696C2D6E776F _64-unknown-linu
+000000014004C050: 0000000000100078 00000000000D9800 x...............
+000000014004C060: 0000000000001F00 612D347670696800 .........hipv4-a
+000000014004C070: 6D612D6E6367646D 617368646D612D64 mdgcn-amd-amdhsa
+000000014004C080: 3630397866672D2D 0000000000000000 --gfx906........
+000000014004C090: 0000000000000000 0000000000000000 ................
+000000014004C0A0: 0000000000000000 0000000000000000 ................
+000000014004C0B0: 0000000000000000 0000000000000000 ................
+```
+
+We can see that the compiler embedded a version 4 code object (more on code
+object versions
+[here](https://www.llvm.org/docs/AMDGPUUsage.html#code-object-metadata)) and
+used the LLVM target triple `amdgcn-amd-amdhsa--gfx906` (more on target triples
+[here](https://www.llvm.org/docs/AMDGPUUsage.html#target-triples)). Don't be
+alarmed about linux showing up as a binary format, AMDGPU binaries uploaded to
+the GPU for execution are proper linux ELF binaries in their format.
+
+Alternatively we can call the compiler with `--save-temps` to dump all device
+binary to disk in separate files.
+
+```pwsh
+clang++ .\HIP-Basic\saxpy\main.hip -o saxpy.exe -I .\Common -lamdhip64 -L ${env:HIP_PATH}lib -O2 --save-temps
+```
+
+Now we can list all the temporaries created while compiling `main.hip` via
+
+```pwsh
+Get-ChildItem -Filter main-hip-* | select -Property Name
+
+Name
+----
+main-hip-amdgcn-amd-amdhsa-gfx906.bc
+main-hip-amdgcn-amd-amdhsa-gfx906.hipi
+main-hip-amdgcn-amd-amdhsa-gfx906.o
+main-hip-amdgcn-amd-amdhsa-gfx906.out
+main-hip-amdgcn-amd-amdhsa-gfx906.out.resolution.txt
+main-hip-amdgcn-amd-amdhsa-gfx906.s
+```
+
+Files with the `.s` extension hold the disassembled contents of the binary and
+the filename directly informs us of the graphics IPs used by the compiler.
+
+```pwsh
+Get-ChildItem main-hip-*.s | Get-Content
+ .text
+ .amdgcn_target "amdgcn-amd-amdhsa--gfx906"
+ .protected _Z12saxpy_kernelfPKfPfj ; -- Begin function _Z12saxpy_kernelfPKfPfj
+ .globl _Z12saxpy_kernelfPKfPfj
+ .p2align 8
+ .type _Z12saxpy_kernelfPKfPfj,@function
+_Z12saxpy_kernelfPKfPfj: ; @_Z12saxpy_kernelfPKfPfj
+; %bb.0:
+ s_load_dword s0, s[4:5], 0x4
+ s_load_dword s1, s[6:7], 0x18
+ s_waitcnt lgkmcnt(0)
+ s_and_b32 s0, s0, 0xffff
+ s_mul_i32 s8, s8, s0
+ v_add_u32_e32 v0, s8, v0
+ v_cmp_gt_u32_e32 vcc, s1, v0
+ s_and_saveexec_b64 s[0:1], vcc
+ s_cbranch_execz .LBB0_2
+; %bb.1:
+ s_load_dwordx4 s[0:3], s[6:7], 0x8
+ v_mov_b32_e32 v1, 0
+ v_lshlrev_b64 v[0:1], 2, v[0:1]
+ s_waitcnt lgkmcnt(0)
+ v_mov_b32_e32 v3, s1
+ v_add_co_u32_e32 v2, vcc, s0, v0
+ v_addc_co_u32_e32 v3, vcc, v3, v1, vcc
+ global_load_dword v2, v[2:3], off
+ v_mov_b32_e32 v3, s3
+ v_add_co_u32_e32 v0, vcc, s2, v0
+ v_addc_co_u32_e32 v1, vcc, v3, v1, vcc
+ global_load_dword v3, v[0:1], off
+ s_load_dword s0, s[6:7], 0x0
+ s_waitcnt vmcnt(0) lgkmcnt(0)
+ v_fmac_f32_e32 v3, s0, v2
+ global_store_dword v[0:1], v3, off
+.LBB0_2:
+ s_endpgm
+ ...
+```
+
+:::
+:::{tab-item} Windows & NVIDIA
+:sync: windows-nvidia
+
+Unlike HIP on AMD, when compiling using the NVIDIA support of HIP the resulting
+binary will be a valid CUDA executable as far as the binary goes. Therefor
+it'll incorporate PTX ISA (Parallel Thread eXecution Instruction Set
+Architecture) instead of AMDGPU binary. As s result, tooling shipping with the
+CUDA SDK can be used to inspect which device ISA got compiled into a specific
+executable. The tool most useful to us currently is `cuobjdump`.
+
+```bash
+cuobjdump.exe --list-ptx .\saxpy.exe
+```
+
+Which will print something like:
+
+```none
+PTX file 1: saxpy.1.sm_52.ptx
+```
+
+From this we can see that the saxpy kernel is stored as `sm_52`, which shows
+that a compute capability 5.2 ISA got embedded into the executable, so devices
+which sport compute capability 5.2 or newer will be able to run this code.
+
+:::
+::::
+
+Now that we've found what binary got embedded into the executable, we only need
+to find which format our available devices use.
+
+::::{tab-set}
+:::{tab-item} Linux & AMD
+:sync: linux-amd
+
+On Linux a utility called `rocminfo` can help us list all the properties of the
+devices available on the system, including which version of graphics IP
+(`gfxXYZ`) they employ. We'll filter the output to have only these lines:
+
+```bash
+/opt/rocm/bin/rocminfo | grep gfx
+ Name: gfx906
+ Name: amdgcn-amd-amdhsa--gfx906:sramecc+:xnack-
+```
+
+_(For the time being let's not discuss what the colon-dlimited list of device
+features are after the graphics IP. Until further notice we'll treat them as
+part of the binary version.)_
+
+:::
+:::{tab-item} Linux & NVIDIA
+:sync: linux-nvidia
+
+On Linux HIP with the NVIDIA back-end a CUDA SDK sample called `deviceQuery`
+can help us list all the properties of the devices available on the system,
+including which version of compute capability a device sports.
+(`.` compute capability is passed to `nvcc` on the
+command-line as `sm_`, for eg. `8.6` is `sm_86`.)
+
+Because it's not shipped as a binary, we may as well compile the matching
+example from ROCm.
+
+```bash
+nvcc ./HIP-Basic/device_query/main.cpp -o device_query -I ./Common -I /opt/rocm/include -O2
+```
+
+We'll filter the output to have only the lines of interest, for eg.:
+
+```bash
+./device_query | grep "major.minor"
+major.minor: 8.6
+major.minor: 7.0
+```
+
+```{tip}
+Next to the `nvcc` executable is another tool called `__nvcc_device_query`
+which simply prints the SM Architecture numbers to standard out as a comma
+separated list of numbers. The naming of this utility suggests it's not a user
+facing executable but is used by `nvcc` to determine what devices are in the
+system at hand.
+```
+
+:::
+:::{tab-item} Windows & AMD
+:sync: windows-amd
+
+On Windows a utility called `hipInfo.exe` can help us list all the properties
+of the devices available on the system, including which version of graphics IP
+(`gfxXYZ`) they employ. We'll filter the output to have only these lines:
+
+```pwsh
+& ${env:HIP_PATH}bin\hipInfo.exe | Select-String gfx
+
+gcnArchName: gfx1032
+gcnArchName: gfx1035
+```
+
+:::
+:::{tab-item} Winodws & NVIDIA
+:sync: windows-nvidia
+
+On Windows HIP with the NVIDIA back-end a CUDA SDK sample called `deviceQuery`
+can help us list all the properties of the devices available on the system,
+including which version of compute capability a device sports.
+(`.` compute capability is passed to `nvcc` on the
+command-line as `sm_`, for eg. `8.6` is `sm_86`.)
+
+Because it's not shipped as a binary, we may as well compile the matching
+example from ROCm.
+
+```pwsh
+nvcc .\HIP-Basic\device_query\main.cpp -o device_query.exe -I .\Common -I ${env:HIP_PATH}include -O2
+```
+
+We'll filter the output to have only the lines of interest, for eg.:
+
+```pwsh
+.\device_query.exe | Select-String "major.minor"
+
+major.minor: 8.6
+major.minor: 7.0
+```
+
+```{tip}
+Next to the `nvcc` executable is another tool called `__nvcc_device_query.exe`
+which simply prints the SM Architecture numbers to standard out as a comma
+separated list of numbers. The naming of this utility suggests it's not a user
+facing executable but is used by `nvcc` to determine what devices are in the
+system at hand.
+```
+
+:::
+::::
+
+Now that we know which versions of graphics IP our devices use, we can
+recompile our program with said parameters.
+
+::::{tab-set}
+:::{tab-item} Linux & AMD
+:sync: linux-amd
+
+```bash
+amdclang++ ./HIP-Basic/saxpy/main.hip -o saxpy -I ./Common -lamdhip64 -L /opt/rocm/lib -O2 --offload-arch=gfx906:sramecc+:xnack-
+```
+
+Now our sample will surely run.
+
+```none
+./saxpy
+Calculating y[i] = a * x[i] + y[i] over 1000000 elements.
+First 10 elements of the results: [ 3, 5, 7, 9, 11, 13, 15, 17, 19, 21 ]
+```
+
+:::
+:::{tab-item} Linux & NVIDIA
+:sync: linux-nvidia
+
+```bash
+nvcc ./HIP-Basic/saxpy/main.hip -o saxpy -I ./Common -I /opt/rocm/include -O2 -x cu -arch=sm_70,sm_86
+```
+
+```{tip}
+If you want to portably target the development machine which is compiling, you
+may specify `-arch=native` instead.
+```
+
+Now our sample will surely run.
+
+```none
+./saxpy
+Calculating y[i] = a * x[i] + y[i] over 1000000 elements.
+First 10 elements of the results: [ 3, 5, 7, 9, 11, 13, 15, 17, 19, 21 ]
+```
+
+:::
+:::{tab-item} Windows & AMD
+:sync: windows-amd
+
+```pwsh
+clang++ .\HIP-Basic\saxpy\main.hip -o saxpy.exe -I .\Common -lamdhip64 -L ${env:HIP_PATH}lib -O2 --offload-arch=gfx1032 --offload-arch=gfx1035
+```
+
+Now our sample will surely run.
+
+```none
+.\saxpy.exe
+Calculating y[i] = a * x[i] + y[i] over 1000000 elements.
+First 10 elements of the results: [ 3, 5, 7, 9, 11, 13, 15, 17, 19, 21 ]
+```
+
+:::
+:::{tab-item} Windows & NVIDIA
+:sync: windows-nvidia
+
+```pwsh
+nvcc .\HIP-Basic\saxpy\main.hip -o saxpy.exe -I ${env:HIP_PATH}include -I .\Common -O2 -x cu -arch=sm_70,sm_86
+```
+
+```{tip}
+If you want to portably target the development machine which is compiling, you
+may specify `-arch=native` instead.
+```
+
+Now our sample will surely run.
+
+```none
+.\saxpy.exe
+Calculating y[i] = a * x[i] + y[i] over 1000000 elements.
+First 10 elements of the results: [ 3, 5, 7, 9, 11, 13, 15, 17, 19, 21 ]
+```
+
+:::
+::::