Repository: GridTools/gt4py
Pull request #1307 (2023-08-02 09:57:35)

refactor[next]: use __gt_dims__ in LocatedField
Rename `LocatedField.axes` to `LocatedField.__gt_dims__` to make it compatible with the Cartesian and as preparation to switch to the new field implementation.

Note that gt4py.cartesian requires returning a tuple of `str`, for gt4py.next we require `tuple[Dimension]`. I propose to relax the cartesian requirement to convertible to `str`, which should already work as the documentation demands to go through `gt4py.storage.utils.get_dims()` which has string conversion.


Patch:
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index bae2463f..6033de35 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -62,7 +62,7 @@ repos:
   ## version = re.search('black==([0-9\.]*)', open("constraints.txt").read())[1] 
   ## print(f"rev: '{version}'  # version from constraints.txt")
   ##]]]
-  rev: '23.3.0'  # version from constraints.txt
+  rev: '23.7.0'  # version from constraints.txt
   ##[[[end]]]
   hooks:
   - id: black
@@ -84,7 +84,7 @@ repos:
   ## version = re.search('flake8==([0-9\.]*)', open("constraints.txt").read())[1] 
   ## print(f"rev: '{version}'  # version from constraints.txt")
   ##]]]
-  rev: '5.0.4'  # version from constraints.txt
+  rev: '6.1.0'  # version from constraints.txt
   ##[[[end]]]
   hooks:
   - id: flake8
@@ -97,11 +97,11 @@ repos:
     ##     print(f"- {pkg}==" + str(re.search(f'\n{pkg}==([0-9\.]*)', constraints)[1]))
     ##]]]
     - darglint==1.8.1
-    - flake8-bugbear==23.3.12
+    - flake8-bugbear==23.7.10
     - flake8-builtins==2.1.0
     - flake8-debugger==4.1.2
     - flake8-docstrings==1.7.0
-    - flake8-eradicate==1.4.0
+    - flake8-eradicate==1.5.0
     - flake8-mutable==1.2.0
     - flake8-pyproject==1.2.3
     - pygments==2.15.1
@@ -146,9 +146,9 @@ repos:
   ## version = re.search('mypy==([0-9\.]*)', open("constraints.txt").read())[1] 
   ## print(f"#========= FROM constraints.txt: v{version} =========")
   ##]]]
-  #========= FROM constraints.txt: v1.3.0 =========
+  #========= FROM constraints.txt: v1.4.1 =========
   ##[[[end]]]
-  rev: v1.3.0  # MUST match version ^^^^ in constraints.txt (if the mirror is up-to-date)
+  rev: v1.4.1  # MUST match version ^^^^ in constraints.txt (if the mirror is up-to-date)
   hooks:
   - id: mypy
     additional_dependencies:  # versions from constraints.txt
@@ -162,25 +162,26 @@ repos:
     ##]]]
     - astunparse==1.6.3
     - attrs==23.1.0
-    - black==23.3.0
+    - black==23.7.0
     - boltons==23.0.0
     - cached-property==1.5.2
-    - click==8.1.3
-    - cmake==3.26.3
-    - cytoolz==0.12.1
-    - deepdiff==6.3.0
+    - click==8.1.6
+    - cmake==3.27.0
+    - cytoolz==0.12.2
+    - deepdiff==6.3.1
     - devtools==0.11.0
     - frozendict==2.3.8
     - gridtools-cpp==2.3.0
-    - importlib-resources==5.12.0
+    - importlib-resources==6.0.0
     - jinja2==3.1.2
-    - lark==1.1.5
+    - lark==1.1.7
     - mako==1.2.4
+    - nanobind==1.4.0
     - ninja==1.11.1
-    - numpy==1.24.3
+    - numpy==1.24.4
     - packaging==23.1
-    - pybind11==2.10.4
-    - setuptools==67.8.0
+    - pybind11==2.11.1
+    - setuptools==68.0.0
     - tabulate==0.9.0
     - typing-extensions==4.5.0
     - xxhash==3.0.0
diff --git a/constraints.txt b/constraints.txt
index 81215599..1fddcab3 100644
--- a/constraints.txt
+++ b/constraints.txt
@@ -4,123 +4,126 @@
 #
 #    "tox run -e requirements-common"
 #
-aenum==3.1.12             # via dace
+aenum==3.1.15             # via dace
 alabaster==0.7.13         # via sphinx
 asttokens==2.2.1          # via devtools
 astunparse==1.6.3 ; python_version < "3.9"  # via dace, gt4py (pyproject.toml)
-attrs==23.1.0             # via flake8-bugbear, flake8-eradicate, gt4py (pyproject.toml), hypothesis, jsonschema
+attrs==23.1.0             # via flake8-bugbear, flake8-eradicate, gt4py (pyproject.toml), hypothesis, jsonschema, referencing
 babel==2.12.1             # via sphinx
-black==23.3.0             # via gt4py (pyproject.toml)
+black==23.7.0             # via gt4py (pyproject.toml)
 blinker==1.6.2            # via flask
 boltons==23.0.0           # via gt4py (pyproject.toml)
 build==0.10.0             # via pip-tools
 cached-property==1.5.2    # via gt4py (pyproject.toml)
-cachetools==5.3.0         # via tox
-certifi==2023.5.7         # via requests
+cachetools==5.3.1         # via tox
+certifi==2023.7.22        # via requests
 cffi==1.15.1              # via cryptography
 cfgv==3.3.1               # via pre-commit
 chardet==5.1.0            # via tox
-charset-normalizer==3.1.0  # via requests
-clang-format==16.0.4      # via -r requirements-dev.in, gt4py (pyproject.toml)
-click==8.1.3              # via black, flask, gt4py (pyproject.toml), pip-tools
-cmake==3.26.3             # via gt4py (pyproject.toml)
+charset-normalizer==3.2.0  # via requests
+clang-format==16.0.6      # via -r requirements-dev.in, gt4py (pyproject.toml)
+click==8.1.6              # via black, flask, gt4py (pyproject.toml), pip-tools
+cmake==3.27.0             # via gt4py (pyproject.toml)
 cogapp==3.3.0             # via -r requirements-dev.in
 colorama==0.4.6           # via tox
-coverage==7.2.6           # via -r requirements-dev.in, pytest-cov
-cryptography==40.0.2      # via types-paramiko, types-pyopenssl, types-redis
-cytoolz==0.12.1           # via gt4py (pyproject.toml)
-dace==0.14.2              # via gt4py (pyproject.toml)
+coverage==7.2.7           # via -r requirements-dev.in, pytest-cov
+cryptography==41.0.2      # via types-paramiko, types-pyopenssl, types-redis
+cytoolz==0.12.2           # via gt4py (pyproject.toml)
+dace==0.14.4              # via gt4py (pyproject.toml)
 darglint==1.8.1           # via -r requirements-dev.in
-deepdiff==6.3.0           # via gt4py (pyproject.toml)
+deepdiff==6.3.1           # via gt4py (pyproject.toml)
 devtools==0.11.0          # via gt4py (pyproject.toml)
-dill==0.3.6               # via dace
-distlib==0.3.6            # via virtualenv
+dill==0.3.7               # via dace
+distlib==0.3.7            # via virtualenv
 docutils==0.18.1          # via restructuredtext-lint, sphinx, sphinx-rtd-theme
-eradicate==2.2.0          # via flake8-eradicate
-exceptiongroup==1.1.1     # via hypothesis, pytest
-execnet==1.9.0            # via pytest-cache, pytest-xdist
+eradicate==2.3.0          # via flake8-eradicate
+exceptiongroup==1.1.2     # via hypothesis, pytest
+execnet==2.0.2            # via pytest-cache, pytest-xdist
 executing==1.2.0          # via devtools
-factory-boy==3.2.1        # via -r requirements-dev.in, pytest-factoryboy
-faker==18.9.0             # via factory-boy
-fastjsonschema==2.17.1    # via nbformat
-filelock==3.12.0          # via tox, virtualenv
-flake8==5.0.4             # via -r requirements-dev.in, flake8-bugbear, flake8-builtins, flake8-debugger, flake8-docstrings, flake8-eradicate, flake8-mutable, flake8-pyproject, flake8-rst-docstrings
-flake8-bugbear==23.3.12   # via -r requirements-dev.in
+factory-boy==3.3.0        # via -r requirements-dev.in, pytest-factoryboy
+faker==19.2.0             # via factory-boy
+fastjsonschema==2.18.0    # via nbformat
+filelock==3.12.2          # via tox, virtualenv
+flake8==6.1.0             # via -r requirements-dev.in, flake8-bugbear, flake8-builtins, flake8-debugger, flake8-docstrings, flake8-eradicate, flake8-mutable, flake8-pyproject, flake8-rst-docstrings
+flake8-bugbear==23.7.10   # via -r requirements-dev.in
 flake8-builtins==2.1.0    # via -r requirements-dev.in
 flake8-debugger==4.1.2    # via -r requirements-dev.in
 flake8-docstrings==1.7.0  # via -r requirements-dev.in
-flake8-eradicate==1.4.0   # via -r requirements-dev.in
+flake8-eradicate==1.5.0   # via -r requirements-dev.in
 flake8-mutable==1.2.0     # via -r requirements-dev.in
 flake8-pyproject==1.2.3   # via -r requirements-dev.in
 flake8-rst-docstrings==0.3.0  # via -r requirements-dev.in
 flask==2.3.2              # via dace
 frozendict==2.3.8         # via gt4py (pyproject.toml)
 gridtools-cpp==2.3.0      # via gt4py (pyproject.toml)
-hypothesis==6.75.3        # via -r requirements-dev.in, gt4py (pyproject.toml)
-identify==2.5.24          # via pre-commit
+hypothesis==6.82.0        # via -r requirements-dev.in, gt4py (pyproject.toml)
+identify==2.5.26          # via pre-commit
 idna==3.4                 # via requests
 imagesize==1.4.1          # via sphinx
-importlib-metadata==6.6.0  # via flask, sphinx
-importlib-resources==5.12.0 ; python_version < "3.9"  # via gt4py (pyproject.toml), jsonschema
+importlib-metadata==6.8.0  # via flask, sphinx
+importlib-resources==6.0.0 ; python_version < "3.9"  # via gt4py (pyproject.toml), jsonschema, jsonschema-specifications
 inflection==0.5.1         # via pytest-factoryboy
 iniconfig==2.0.0          # via pytest
 isort==5.12.0             # via -r requirements-dev.in
 itsdangerous==2.1.2       # via flask
 jinja2==3.1.2             # via flask, gt4py (pyproject.toml), sphinx
-jsonschema==4.17.3        # via nbformat
-jupyter-core==5.3.0       # via nbformat
-jupytext==1.14.5          # via -r requirements-dev.in
-lark==1.1.5               # via gt4py (pyproject.toml)
+jsonschema==4.18.4        # via nbformat
+jsonschema-specifications==2023.7.1  # via jsonschema
+jupyter-core==5.3.1       # via nbformat
+jupytext==1.15.0          # via -r requirements-dev.in
+lark==1.1.7               # via gt4py (pyproject.toml)
 mako==1.2.4               # via gt4py (pyproject.toml)
-markdown-it-py==2.2.0     # via jupytext, mdit-py-plugins
-markupsafe==2.1.2         # via jinja2, mako, werkzeug
+markdown-it-py==3.0.0     # via jupytext, mdit-py-plugins
+markupsafe==2.1.3         # via jinja2, mako, werkzeug
 mccabe==0.7.0             # via flake8
-mdit-py-plugins==0.3.5    # via jupytext
+mdit-py-plugins==0.4.0    # via jupytext
 mdurl==0.1.2              # via markdown-it-py
 mpmath==1.3.0             # via sympy
-mypy==1.3.0               # via -r requirements-dev.in
+mypy==1.4.1               # via -r requirements-dev.in
 mypy-extensions==1.0.0    # via black, mypy
-nbformat==5.8.0           # via jupytext
+nanobind==1.4.0           # via gt4py (pyproject.toml)
+nbformat==5.9.1           # via jupytext
 networkx==3.1             # via dace
 ninja==1.11.1             # via gt4py (pyproject.toml)
 nodeenv==1.8.0            # via pre-commit
-numpy==1.24.3             # via dace, gt4py (pyproject.toml), types-jack-client
+numpy==1.24.4             # via dace, gt4py (pyproject.toml), types-jack-client
 ordered-set==4.1.0        # via deepdiff
 packaging==23.1           # via black, build, gt4py (pyproject.toml), pyproject-api, pytest, sphinx, tox
-pathspec==0.11.1          # via black
-pip-tools==6.13.0         # via -r requirements-dev.in
-pipdeptree==2.7.1         # via -r requirements-dev.in
+pathspec==0.11.2          # via black
+pip-tools==7.1.0          # via -r requirements-dev.in
+pipdeptree==2.12.0        # via -r requirements-dev.in
 pkgutil-resolve-name==1.3.10  # via jsonschema
-platformdirs==3.5.1       # via black, jupyter-core, tox, virtualenv
-pluggy==1.0.0             # via pytest, tox
+platformdirs==3.10.0      # via black, jupyter-core, tox, virtualenv
+pluggy==1.2.0             # via pytest, tox
 ply==3.11                 # via dace
-pre-commit==3.3.2         # via -r requirements-dev.in
+pre-commit==3.3.3         # via -r requirements-dev.in
 psutil==5.9.5             # via -r requirements-dev.in, pytest-xdist
-pybind11==2.10.4          # via gt4py (pyproject.toml)
-pycodestyle==2.9.1        # via flake8, flake8-debugger
+pybind11==2.11.1          # via gt4py (pyproject.toml)
+pycodestyle==2.11.0       # via flake8, flake8-debugger
 pycparser==2.21           # via cffi
 pydocstyle==6.3.0         # via flake8-docstrings
-pyflakes==2.5.0           # via flake8
+pyflakes==3.1.0           # via flake8
 pygments==2.15.1          # via -r requirements-dev.in, flake8-rst-docstrings, sphinx
-pyproject-api==1.5.1      # via tox
+pyproject-api==1.5.3      # via tox
 pyproject-hooks==1.0.0    # via build
-pyrsistent==0.19.3        # via jsonschema
-pytest==7.3.1             # via -r requirements-dev.in, gt4py (pyproject.toml), pytest-cache, pytest-cov, pytest-factoryboy, pytest-xdist
+pytest==7.4.0             # via -r requirements-dev.in, gt4py (pyproject.toml), pytest-cache, pytest-cov, pytest-factoryboy, pytest-xdist
 pytest-cache==1.0         # via -r requirements-dev.in
-pytest-cov==4.0.0         # via -r requirements-dev.in
+pytest-cov==4.1.0         # via -r requirements-dev.in
 pytest-factoryboy==2.5.1  # via -r requirements-dev.in
 pytest-xdist==3.3.1       # via -r requirements-dev.in
 python-dateutil==2.8.2    # via faker
 pytz==2023.3              # via babel
-pyyaml==6.0               # via dace, jupytext, pre-commit
+pyyaml==6.0.1             # via dace, jupytext, pre-commit
+referencing==0.30.0       # via jsonschema, jsonschema-specifications
 requests==2.31.0          # via dace, sphinx
 restructuredtext-lint==1.4.0  # via flake8-rst-docstrings
-ruff==0.0.269             # via -r requirements-dev.in
+rpds-py==0.9.2            # via jsonschema, referencing
+ruff==0.0.280             # via -r requirements-dev.in
 six==1.16.0               # via asttokens, astunparse, python-dateutil
 snowballstemmer==2.2.0    # via pydocstyle, sphinx
 sortedcontainers==2.4.0   # via hypothesis
 sphinx==6.2.1             # via -r requirements-dev.in, sphinx-rtd-theme, sphinxcontrib-jquery
-sphinx-rtd-theme==1.2.1   # via -r requirements-dev.in
+sphinx-rtd-theme==1.2.2   # via -r requirements-dev.in
 sphinxcontrib-applehelp==1.0.4  # via sphinx
 sphinxcontrib-devhelp==1.0.2  # via sphinx
 sphinxcontrib-htmlhelp==2.0.1  # via sphinx
@@ -128,44 +131,44 @@ sphinxcontrib-jquery==4.1  # via sphinx-rtd-theme
 sphinxcontrib-jsmath==1.0.1  # via sphinx
 sphinxcontrib-qthelp==1.0.3  # via sphinx
 sphinxcontrib-serializinghtml==1.1.5  # via sphinx
-sympy==1.9                # via dace, gt4py (pyproject.toml)
+sympy==1.12               # via dace, gt4py (pyproject.toml)
 tabulate==0.9.0           # via gt4py (pyproject.toml)
 toml==0.10.2              # via jupytext
-tomli==2.0.1              # via -r requirements-dev.in, black, build, coverage, flake8-pyproject, mypy, pyproject-api, pyproject-hooks, pytest, tox
+tomli==2.0.1              # via -r requirements-dev.in, black, build, coverage, flake8-pyproject, mypy, pip-tools, pyproject-api, pyproject-hooks, pytest, tox
 toolz==0.12.0             # via cytoolz
-tox==4.5.1                # via -r requirements-dev.in
+tox==4.6.4                # via -r requirements-dev.in
 traitlets==5.9.0          # via jupyter-core, nbformat
-types-aiofiles==23.1.0.3  # via types-all
+types-aiofiles==23.1.0.5  # via types-all
 types-all==1.0.0          # via -r requirements-dev.in
-types-annoy==1.17.8.3     # via types-all
+types-annoy==1.17.8.4     # via types-all
 types-atomicwrites==1.4.5.1  # via types-all
 types-backports==0.1.3    # via types-all
 types-backports-abc==0.5.2  # via types-all
-types-bleach==6.0.0.3     # via types-all
-types-boto==2.49.18.8     # via types-all
-types-cachetools==5.3.0.5  # via types-all
+types-bleach==6.0.0.4     # via types-all
+types-boto==2.49.18.9     # via types-all
+types-cachetools==5.3.0.6  # via types-all
 types-certifi==2021.10.8.3  # via types-all
-types-cffi==1.15.1.13     # via types-jack-client
+types-cffi==1.15.1.14     # via types-jack-client
 types-characteristic==14.3.7  # via types-all
 types-chardet==5.0.4.6    # via types-all
 types-click==7.1.8        # via types-all, types-flask
-types-click-spinner==0.1.13.4  # via types-all
-types-colorama==0.4.15.11  # via types-all
-types-contextvars==2.4.7.2  # via types-all
-types-croniter==1.3.2.9   # via types-all
+types-click-spinner==0.1.13.5  # via types-all
+types-colorama==0.4.15.12  # via types-all
+types-contextvars==2.4.7.3  # via types-all
+types-croniter==1.4.0.1   # via types-all
 types-cryptography==3.3.23.2  # via types-all, types-openssl-python, types-pyjwt
 types-dataclasses==0.6.6  # via types-all
-types-dateparser==1.1.4.9  # via types-all
-types-datetimerange==2.0.0.5  # via types-all
-types-decorator==5.1.8.3  # via types-all
-types-deprecated==1.2.9.2  # via types-all
+types-dateparser==1.1.4.10  # via types-all
+types-datetimerange==2.0.0.6  # via types-all
+types-decorator==5.1.8.4  # via types-all
+types-deprecated==1.2.9.3  # via types-all
 types-docopt==0.6.11.3    # via types-all
 types-docutils==0.20.0.1  # via types-all
 types-emoji==2.1.0.3      # via types-all
 types-enum34==1.1.8       # via types-all
 types-fb303==1.0.0        # via types-all, types-scribe
 types-filelock==3.2.7     # via types-all
-types-first==2.0.5.1      # via types-all
+types-first==2.0.5.2      # via types-all
 types-flask==1.1.6        # via types-all
 types-freezegun==1.1.10   # via types-all
 types-frozendict==2.0.9   # via types-all
@@ -176,63 +179,64 @@ types-itsdangerous==1.1.6  # via types-all
 types-jack-client==0.5.10.8  # via types-all
 types-jinja2==2.11.9      # via types-all, types-flask
 types-kazoo==0.1.3        # via types-all
-types-markdown==3.4.2.9   # via types-all
+types-markdown==3.4.2.10  # via types-all
 types-markupsafe==1.1.10  # via types-all, types-jinja2
 types-maxminddb==1.5.0    # via types-all, types-geoip2
-types-mock==5.0.0.6       # via types-all
-types-mypy-extensions==1.0.0.3  # via types-all
+types-mock==5.1.0.1       # via types-all
+types-mypy-extensions==1.0.0.4  # via types-all
 types-nmap==0.1.6         # via types-all
 types-openssl-python==0.1.3  # via types-all
 types-orjson==3.6.2       # via types-all
-types-paramiko==3.0.0.10  # via types-all, types-pysftp
+types-paramiko==3.3.0.0   # via types-all, types-pysftp
 types-pathlib2==2.3.0     # via types-all
-types-pillow==9.5.0.4     # via types-all
+types-pillow==10.0.0.2    # via types-all
 types-pkg-resources==0.1.3  # via types-all
-types-polib==1.2.0.0      # via types-all
-types-protobuf==4.23.0.1  # via types-all
+types-polib==1.2.0.1      # via types-all
+types-protobuf==4.23.0.2  # via types-all
 types-pyaudio==0.2.16.6   # via types-all
 types-pycurl==7.45.2.4    # via types-all
-types-pyfarmhash==0.3.1.1  # via types-all
+types-pyfarmhash==0.3.1.2  # via types-all
 types-pyjwt==1.7.1        # via types-all
 types-pymssql==2.1.0      # via types-all
-types-pymysql==1.0.19.7   # via types-all
-types-pyopenssl==23.1.0.3  # via types-redis
-types-pyrfc3339==1.1.1.4  # via types-all
-types-pysftp==0.2.17.5    # via types-all
-types-python-dateutil==2.8.19.13  # via types-all, types-datetimerange
-types-python-gflags==3.1.7.2  # via types-all
-types-python-slugify==8.0.0.2  # via types-all
+types-pymysql==1.1.0.1    # via types-all
+types-pyopenssl==23.2.0.2  # via types-redis
+types-pyrfc3339==1.1.1.5  # via types-all
+types-pysftp==0.2.17.6    # via types-all
+types-python-dateutil==2.8.19.14  # via types-all, types-datetimerange
+types-python-gflags==3.1.7.3  # via types-all
+types-python-slugify==8.0.0.3  # via types-all
 types-pytz==2023.3.0.0    # via types-all, types-tzlocal
-types-pyvmomi==8.0.0.4    # via types-all
-types-pyyaml==6.0.12.10   # via types-all
-types-redis==4.5.5.2      # via types-all
-types-requests==2.31.0.0  # via types-all
-types-retry==0.9.9.3      # via types-all
+types-pyvmomi==8.0.0.6    # via types-all
+types-pyyaml==6.0.12.11   # via types-all
+types-redis==4.6.0.3      # via types-all
+types-requests==2.31.0.2  # via types-all
+types-retry==0.9.9.4      # via types-all
 types-routes==2.5.0       # via types-all
 types-scribe==2.0.0       # via types-all
-types-simplejson==3.19.0.1  # via types-all
-types-singledispatch==4.0.0.1  # via types-all
-types-six==1.16.21.8      # via types-all
-types-tabulate==0.9.0.2   # via types-all
+types-setuptools==68.0.0.3  # via types-cffi
+types-simplejson==3.19.0.2  # via types-all
+types-singledispatch==4.0.0.2  # via types-all
+types-six==1.16.21.9      # via types-all
+types-tabulate==0.9.0.3   # via types-all
 types-termcolor==1.1.6.2  # via types-all
-types-toml==0.10.8.6      # via types-all
+types-toml==0.10.8.7      # via types-all
 types-tornado==5.1.1      # via types-all
-types-typed-ast==1.5.8.6  # via types-all
-types-tzlocal==5.0.1.0    # via types-all
-types-ujson==5.7.0.5      # via types-all
-types-urllib3==1.26.25.13  # via types-requests
-types-waitress==2.1.4.8   # via types-all
+types-typed-ast==1.5.8.7  # via types-all
+types-tzlocal==5.0.1.1    # via types-all
+types-ujson==5.8.0.1      # via types-all
+types-urllib3==1.26.25.14  # via types-requests
+types-waitress==2.1.4.9   # via types-all
 types-werkzeug==1.0.9     # via types-all, types-flask
 types-xxhash==3.0.5.2     # via types-all
-typing-extensions==4.5.0  # via black, gt4py (pyproject.toml), mypy, pytest-factoryboy
-urllib3==2.0.2            # via requests
-virtualenv==20.23.0       # via pre-commit, tox
+typing-extensions==4.5.0  # via black, faker, gt4py (pyproject.toml), mypy, pytest-factoryboy
+urllib3==2.0.4            # via requests
+virtualenv==20.24.2       # via pre-commit, tox
 websockets==11.0.3        # via dace
-werkzeug==2.3.4           # via flask
-wheel==0.40.0             # via astunparse, pip-tools
+werkzeug==2.3.6           # via flask
+wheel==0.41.0             # via astunparse, pip-tools
 xxhash==3.0.0             # via gt4py (pyproject.toml)
-zipp==3.15.0              # via importlib-metadata, importlib-resources
+zipp==3.16.2              # via importlib-metadata, importlib-resources
 
 # The following packages are considered to be unsafe in a requirements file:
-pip==23.1.2               # via pip-tools
-setuptools==67.8.0        # via gt4py (pyproject.toml), nodeenv, pip-tools
+pip==23.2.1               # via pip-tools
+setuptools==68.0.0        # via gt4py (pyproject.toml), nodeenv, pip-tools
diff --git a/pyproject.toml b/pyproject.toml
index 7640b77e..38505ad5 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -39,6 +39,7 @@ dependencies = [
   'jinja2>=3.0.0',
   'lark>=1.1.2',
   'mako>=1.1',
+  'nanobind>=1.4.0 ',
   'ninja>=1.10',
   'numpy>=1.21.2',
   'packaging>=20.0',
@@ -84,8 +85,10 @@ full = [
   'hypothesis>=6.0.0',
   'pytest>=7.0',
   'sympy>=1.7',
-  'scipy>=1.7.2'
+  'scipy>=1.7.2',
+  'jax[cpu]>=0.4.13'
 ]
+jax = ['jax[cpu]>=0.4.13']
 performance = ['scipy>=1.7.2']
 testing = ['hypothesis>=6.0.0', 'pytest>=7.0']
 
diff --git a/requirements-dev.txt b/requirements-dev.txt
index 6ab07981..c5168e7f 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -4,123 +4,126 @@
 #
 #    "tox run -e requirements-common"
 #
-aenum==3.1.12             # via dace
+aenum==3.1.15             # via dace
 alabaster==0.7.13         # via sphinx
 asttokens==2.2.1          # via devtools
 astunparse==1.6.3 ; python_version < "3.9"  # via dace, gt4py (pyproject.toml)
-attrs==23.1.0             # via flake8-bugbear, flake8-eradicate, gt4py (pyproject.toml), hypothesis, jsonschema
+attrs==23.1.0             # via flake8-bugbear, flake8-eradicate, gt4py (pyproject.toml), hypothesis, jsonschema, referencing
 babel==2.12.1             # via sphinx
-black==23.3.0             # via gt4py (pyproject.toml)
+black==23.7.0             # via gt4py (pyproject.toml)
 blinker==1.6.2            # via flask
 boltons==23.0.0           # via gt4py (pyproject.toml)
 build==0.10.0             # via pip-tools
 cached-property==1.5.2    # via gt4py (pyproject.toml)
-cachetools==5.3.0         # via tox
-certifi==2023.5.7         # via requests
+cachetools==5.3.1         # via tox
+certifi==2023.7.22        # via requests
 cffi==1.15.1              # via cryptography
 cfgv==3.3.1               # via pre-commit
 chardet==5.1.0            # via tox
-charset-normalizer==3.1.0  # via requests
-clang-format==16.0.4      # via -r requirements-dev.in, gt4py (pyproject.toml)
-click==8.1.3              # via black, flask, gt4py (pyproject.toml), pip-tools
-cmake==3.26.3             # via gt4py (pyproject.toml)
+charset-normalizer==3.2.0  # via requests
+clang-format==16.0.6      # via -r requirements-dev.in, gt4py (pyproject.toml)
+click==8.1.6              # via black, flask, gt4py (pyproject.toml), pip-tools
+cmake==3.27.0             # via gt4py (pyproject.toml)
 cogapp==3.3.0             # via -r requirements-dev.in
 colorama==0.4.6           # via tox
-coverage[toml]==7.2.6     # via -r requirements-dev.in, pytest-cov
-cryptography==40.0.2      # via types-paramiko, types-pyopenssl, types-redis
-cytoolz==0.12.1           # via gt4py (pyproject.toml)
-dace==0.14.2              # via gt4py (pyproject.toml)
+coverage[toml]==7.2.7     # via -r requirements-dev.in, pytest-cov
+cryptography==41.0.2      # via types-paramiko, types-pyopenssl, types-redis
+cytoolz==0.12.2           # via gt4py (pyproject.toml)
+dace==0.14.4              # via gt4py (pyproject.toml)
 darglint==1.8.1           # via -r requirements-dev.in
-deepdiff==6.3.0           # via gt4py (pyproject.toml)
+deepdiff==6.3.1           # via gt4py (pyproject.toml)
 devtools==0.11.0          # via gt4py (pyproject.toml)
-dill==0.3.6               # via dace
-distlib==0.3.6            # via virtualenv
+dill==0.3.7               # via dace
+distlib==0.3.7            # via virtualenv
 docutils==0.18.1          # via restructuredtext-lint, sphinx, sphinx-rtd-theme
-eradicate==2.2.0          # via flake8-eradicate
-exceptiongroup==1.1.1     # via hypothesis, pytest
-execnet==1.9.0            # via pytest-cache, pytest-xdist
+eradicate==2.3.0          # via flake8-eradicate
+exceptiongroup==1.1.2     # via hypothesis, pytest
+execnet==2.0.2            # via pytest-cache, pytest-xdist
 executing==1.2.0          # via devtools
-factory-boy==3.2.1        # via -r requirements-dev.in, pytest-factoryboy
-faker==18.9.0             # via factory-boy
-fastjsonschema==2.17.1    # via nbformat
-filelock==3.12.0          # via tox, virtualenv
-flake8==5.0.4             # via -r requirements-dev.in, flake8-bugbear, flake8-builtins, flake8-debugger, flake8-docstrings, flake8-eradicate, flake8-mutable, flake8-pyproject, flake8-rst-docstrings
-flake8-bugbear==23.3.12   # via -r requirements-dev.in
+factory-boy==3.3.0        # via -r requirements-dev.in, pytest-factoryboy
+faker==19.2.0             # via factory-boy
+fastjsonschema==2.18.0    # via nbformat
+filelock==3.12.2          # via tox, virtualenv
+flake8==6.1.0             # via -r requirements-dev.in, flake8-bugbear, flake8-builtins, flake8-debugger, flake8-docstrings, flake8-eradicate, flake8-mutable, flake8-pyproject, flake8-rst-docstrings
+flake8-bugbear==23.7.10   # via -r requirements-dev.in
 flake8-builtins==2.1.0    # via -r requirements-dev.in
 flake8-debugger==4.1.2    # via -r requirements-dev.in
 flake8-docstrings==1.7.0  # via -r requirements-dev.in
-flake8-eradicate==1.4.0   # via -r requirements-dev.in
+flake8-eradicate==1.5.0   # via -r requirements-dev.in
 flake8-mutable==1.2.0     # via -r requirements-dev.in
 flake8-pyproject==1.2.3   # via -r requirements-dev.in
 flake8-rst-docstrings==0.3.0  # via -r requirements-dev.in
 flask==2.3.2              # via dace
 frozendict==2.3.8         # via gt4py (pyproject.toml)
 gridtools-cpp==2.3.0      # via gt4py (pyproject.toml)
-hypothesis==6.75.3        # via -r requirements-dev.in, gt4py (pyproject.toml)
-identify==2.5.24          # via pre-commit
+hypothesis==6.82.0        # via -r requirements-dev.in, gt4py (pyproject.toml)
+identify==2.5.26          # via pre-commit
 idna==3.4                 # via requests
 imagesize==1.4.1          # via sphinx
-importlib-metadata==6.6.0  # via flask, sphinx
-importlib-resources==5.12.0 ; python_version < "3.9"  # via gt4py (pyproject.toml), jsonschema
+importlib-metadata==6.8.0  # via flask, sphinx
+importlib-resources==6.0.0 ; python_version < "3.9"  # via gt4py (pyproject.toml), jsonschema, jsonschema-specifications
 inflection==0.5.1         # via pytest-factoryboy
 iniconfig==2.0.0          # via pytest
 isort==5.12.0             # via -r requirements-dev.in
 itsdangerous==2.1.2       # via flask
 jinja2==3.1.2             # via flask, gt4py (pyproject.toml), sphinx
-jsonschema==4.17.3        # via nbformat
-jupyter-core==5.3.0       # via nbformat
-jupytext==1.14.5          # via -r requirements-dev.in
-lark==1.1.5               # via gt4py (pyproject.toml)
+jsonschema==4.18.4        # via nbformat
+jsonschema-specifications==2023.7.1  # via jsonschema
+jupyter-core==5.3.1       # via nbformat
+jupytext==1.15.0          # via -r requirements-dev.in
+lark==1.1.7               # via gt4py (pyproject.toml)
 mako==1.2.4               # via gt4py (pyproject.toml)
-markdown-it-py==2.2.0     # via jupytext, mdit-py-plugins
-markupsafe==2.1.2         # via jinja2, mako, werkzeug
+markdown-it-py==3.0.0     # via jupytext, mdit-py-plugins
+markupsafe==2.1.3         # via jinja2, mako, werkzeug
 mccabe==0.7.0             # via flake8
-mdit-py-plugins==0.3.5    # via jupytext
+mdit-py-plugins==0.4.0    # via jupytext
 mdurl==0.1.2              # via markdown-it-py
 mpmath==1.3.0             # via sympy
-mypy==1.3.0               # via -r requirements-dev.in
+mypy==1.4.1               # via -r requirements-dev.in
 mypy-extensions==1.0.0    # via black, mypy
-nbformat==5.8.0           # via jupytext
+nanobind==1.4.0           # via gt4py (pyproject.toml)
+nbformat==5.9.1           # via jupytext
 networkx==3.1             # via dace
 ninja==1.11.1             # via gt4py (pyproject.toml)
 nodeenv==1.8.0            # via pre-commit
-numpy==1.24.3             # via dace, gt4py (pyproject.toml), types-jack-client
+numpy==1.24.4             # via dace, gt4py (pyproject.toml), types-jack-client
 ordered-set==4.1.0        # via deepdiff
 packaging==23.1           # via black, build, gt4py (pyproject.toml), pyproject-api, pytest, sphinx, tox
-pathspec==0.11.1          # via black
-pip-tools==6.13.0         # via -r requirements-dev.in
-pipdeptree==2.7.1         # via -r requirements-dev.in
+pathspec==0.11.2          # via black
+pip-tools==7.1.0          # via -r requirements-dev.in
+pipdeptree==2.12.0        # via -r requirements-dev.in
 pkgutil-resolve-name==1.3.10  # via jsonschema
-platformdirs==3.5.1       # via black, jupyter-core, tox, virtualenv
-pluggy==1.0.0             # via pytest, tox
+platformdirs==3.10.0      # via black, jupyter-core, tox, virtualenv
+pluggy==1.2.0             # via pytest, tox
 ply==3.11                 # via dace
-pre-commit==3.3.2         # via -r requirements-dev.in
+pre-commit==3.3.3         # via -r requirements-dev.in
 psutil==5.9.5             # via -r requirements-dev.in, pytest-xdist
-pybind11==2.10.4          # via gt4py (pyproject.toml)
-pycodestyle==2.9.1        # via flake8, flake8-debugger
+pybind11==2.11.1          # via gt4py (pyproject.toml)
+pycodestyle==2.11.0       # via flake8, flake8-debugger
 pycparser==2.21           # via cffi
 pydocstyle==6.3.0         # via flake8-docstrings
-pyflakes==2.5.0           # via flake8
+pyflakes==3.1.0           # via flake8
 pygments==2.15.1          # via -r requirements-dev.in, flake8-rst-docstrings, sphinx
-pyproject-api==1.5.1      # via tox
+pyproject-api==1.5.3      # via tox
 pyproject-hooks==1.0.0    # via build
-pyrsistent==0.19.3        # via jsonschema
-pytest==7.3.1             # via -r requirements-dev.in, gt4py (pyproject.toml), pytest-cache, pytest-cov, pytest-factoryboy, pytest-xdist
+pytest==7.4.0             # via -r requirements-dev.in, gt4py (pyproject.toml), pytest-cache, pytest-cov, pytest-factoryboy, pytest-xdist
 pytest-cache==1.0         # via -r requirements-dev.in
-pytest-cov==4.0.0         # via -r requirements-dev.in
+pytest-cov==4.1.0         # via -r requirements-dev.in
 pytest-factoryboy==2.5.1  # via -r requirements-dev.in
 pytest-xdist[psutil]==3.3.1  # via -r requirements-dev.in
 python-dateutil==2.8.2    # via faker
 pytz==2023.3              # via babel
-pyyaml==6.0               # via dace, jupytext, pre-commit
+pyyaml==6.0.1             # via dace, jupytext, pre-commit
+referencing==0.30.0       # via jsonschema, jsonschema-specifications
 requests==2.31.0          # via dace, sphinx
 restructuredtext-lint==1.4.0  # via flake8-rst-docstrings
-ruff==0.0.269             # via -r requirements-dev.in
+rpds-py==0.9.2            # via jsonschema, referencing
+ruff==0.0.280             # via -r requirements-dev.in
 six==1.16.0               # via asttokens, astunparse, python-dateutil
 snowballstemmer==2.2.0    # via pydocstyle, sphinx
 sortedcontainers==2.4.0   # via hypothesis
 sphinx==6.2.1             # via -r requirements-dev.in, sphinx-rtd-theme, sphinxcontrib-jquery
-sphinx-rtd-theme==1.2.1   # via -r requirements-dev.in
+sphinx-rtd-theme==1.2.2   # via -r requirements-dev.in
 sphinxcontrib-applehelp==1.0.4  # via sphinx
 sphinxcontrib-devhelp==1.0.2  # via sphinx
 sphinxcontrib-htmlhelp==2.0.1  # via sphinx
@@ -128,44 +131,44 @@ sphinxcontrib-jquery==4.1  # via sphinx-rtd-theme
 sphinxcontrib-jsmath==1.0.1  # via sphinx
 sphinxcontrib-qthelp==1.0.3  # via sphinx
 sphinxcontrib-serializinghtml==1.1.5  # via sphinx
-sympy==1.9                # via dace, gt4py (pyproject.toml)
+sympy==1.12               # via dace, gt4py (pyproject.toml)
 tabulate==0.9.0           # via gt4py (pyproject.toml)
 toml==0.10.2              # via jupytext
-tomli==2.0.1              # via -r requirements-dev.in, black, build, coverage, flake8-pyproject, mypy, pyproject-api, pyproject-hooks, pytest, tox
+tomli==2.0.1              # via -r requirements-dev.in, black, build, coverage, flake8-pyproject, mypy, pip-tools, pyproject-api, pyproject-hooks, pytest, tox
 toolz==0.12.0             # via cytoolz
-tox==4.5.1                # via -r requirements-dev.in
+tox==4.6.4                # via -r requirements-dev.in
 traitlets==5.9.0          # via jupyter-core, nbformat
-types-aiofiles==23.1.0.3  # via types-all
+types-aiofiles==23.1.0.5  # via types-all
 types-all==1.0.0          # via -r requirements-dev.in
-types-annoy==1.17.8.3     # via types-all
+types-annoy==1.17.8.4     # via types-all
 types-atomicwrites==1.4.5.1  # via types-all
 types-backports==0.1.3    # via types-all
 types-backports-abc==0.5.2  # via types-all
-types-bleach==6.0.0.3     # via types-all
-types-boto==2.49.18.8     # via types-all
-types-cachetools==5.3.0.5  # via types-all
+types-bleach==6.0.0.4     # via types-all
+types-boto==2.49.18.9     # via types-all
+types-cachetools==5.3.0.6  # via types-all
 types-certifi==2021.10.8.3  # via types-all
-types-cffi==1.15.1.13     # via types-jack-client
+types-cffi==1.15.1.14     # via types-jack-client
 types-characteristic==14.3.7  # via types-all
 types-chardet==5.0.4.6    # via types-all
 types-click==7.1.8        # via types-all, types-flask
-types-click-spinner==0.1.13.4  # via types-all
-types-colorama==0.4.15.11  # via types-all
-types-contextvars==2.4.7.2  # via types-all
-types-croniter==1.3.2.9   # via types-all
+types-click-spinner==0.1.13.5  # via types-all
+types-colorama==0.4.15.12  # via types-all
+types-contextvars==2.4.7.3  # via types-all
+types-croniter==1.4.0.1   # via types-all
 types-cryptography==3.3.23.2  # via types-all, types-openssl-python, types-pyjwt
 types-dataclasses==0.6.6  # via types-all
-types-dateparser==1.1.4.9  # via types-all
-types-datetimerange==2.0.0.5  # via types-all
-types-decorator==5.1.8.3  # via types-all
-types-deprecated==1.2.9.2  # via types-all
+types-dateparser==1.1.4.10  # via types-all
+types-datetimerange==2.0.0.6  # via types-all
+types-decorator==5.1.8.4  # via types-all
+types-deprecated==1.2.9.3  # via types-all
 types-docopt==0.6.11.3    # via types-all
 types-docutils==0.20.0.1  # via types-all
 types-emoji==2.1.0.3      # via types-all
 types-enum34==1.1.8       # via types-all
 types-fb303==1.0.0        # via types-all, types-scribe
 types-filelock==3.2.7     # via types-all
-types-first==2.0.5.1      # via types-all
+types-first==2.0.5.2      # via types-all
 types-flask==1.1.6        # via types-all
 types-freezegun==1.1.10   # via types-all
 types-frozendict==2.0.9   # via types-all
@@ -176,63 +179,64 @@ types-itsdangerous==1.1.6  # via types-all
 types-jack-client==0.5.10.8  # via types-all
 types-jinja2==2.11.9      # via types-all, types-flask
 types-kazoo==0.1.3        # via types-all
-types-markdown==3.4.2.9   # via types-all
+types-markdown==3.4.2.10  # via types-all
 types-markupsafe==1.1.10  # via types-all, types-jinja2
 types-maxminddb==1.5.0    # via types-all, types-geoip2
-types-mock==5.0.0.6       # via types-all
-types-mypy-extensions==1.0.0.3  # via types-all
+types-mock==5.1.0.1       # via types-all
+types-mypy-extensions==1.0.0.4  # via types-all
 types-nmap==0.1.6         # via types-all
 types-openssl-python==0.1.3  # via types-all
 types-orjson==3.6.2       # via types-all
-types-paramiko==3.0.0.10  # via types-all, types-pysftp
+types-paramiko==3.3.0.0   # via types-all, types-pysftp
 types-pathlib2==2.3.0     # via types-all
-types-pillow==9.5.0.4     # via types-all
+types-pillow==10.0.0.2    # via types-all
 types-pkg-resources==0.1.3  # via types-all
-types-polib==1.2.0.0      # via types-all
-types-protobuf==4.23.0.1  # via types-all
+types-polib==1.2.0.1      # via types-all
+types-protobuf==4.23.0.2  # via types-all
 types-pyaudio==0.2.16.6   # via types-all
 types-pycurl==7.45.2.4    # via types-all
-types-pyfarmhash==0.3.1.1  # via types-all
+types-pyfarmhash==0.3.1.2  # via types-all
 types-pyjwt==1.7.1        # via types-all
 types-pymssql==2.1.0      # via types-all
-types-pymysql==1.0.19.7   # via types-all
-types-pyopenssl==23.1.0.3  # via types-redis
-types-pyrfc3339==1.1.1.4  # via types-all
-types-pysftp==0.2.17.5    # via types-all
-types-python-dateutil==2.8.19.13  # via types-all, types-datetimerange
-types-python-gflags==3.1.7.2  # via types-all
-types-python-slugify==8.0.0.2  # via types-all
+types-pymysql==1.1.0.1    # via types-all
+types-pyopenssl==23.2.0.2  # via types-redis
+types-pyrfc3339==1.1.1.5  # via types-all
+types-pysftp==0.2.17.6    # via types-all
+types-python-dateutil==2.8.19.14  # via types-all, types-datetimerange
+types-python-gflags==3.1.7.3  # via types-all
+types-python-slugify==8.0.0.3  # via types-all
 types-pytz==2023.3.0.0    # via types-all, types-tzlocal
-types-pyvmomi==8.0.0.4    # via types-all
-types-pyyaml==6.0.12.10   # via types-all
-types-redis==4.5.5.2      # via types-all
-types-requests==2.31.0.0  # via types-all
-types-retry==0.9.9.3      # via types-all
+types-pyvmomi==8.0.0.6    # via types-all
+types-pyyaml==6.0.12.11   # via types-all
+types-redis==4.6.0.3      # via types-all
+types-requests==2.31.0.2  # via types-all
+types-retry==0.9.9.4      # via types-all
 types-routes==2.5.0       # via types-all
 types-scribe==2.0.0       # via types-all
-types-simplejson==3.19.0.1  # via types-all
-types-singledispatch==4.0.0.1  # via types-all
-types-six==1.16.21.8      # via types-all
-types-tabulate==0.9.0.2   # via types-all
+types-setuptools==68.0.0.3  # via types-cffi
+types-simplejson==3.19.0.2  # via types-all
+types-singledispatch==4.0.0.2  # via types-all
+types-six==1.16.21.9      # via types-all
+types-tabulate==0.9.0.3   # via types-all
 types-termcolor==1.1.6.2  # via types-all
-types-toml==0.10.8.6      # via types-all
+types-toml==0.10.8.7      # via types-all
 types-tornado==5.1.1      # via types-all
-types-typed-ast==1.5.8.6  # via types-all
-types-tzlocal==5.0.1.0    # via types-all
-types-ujson==5.7.0.5      # via types-all
-types-urllib3==1.26.25.13  # via types-requests
-types-waitress==2.1.4.8   # via types-all
+types-typed-ast==1.5.8.7  # via types-all
+types-tzlocal==5.0.1.1    # via types-all
+types-ujson==5.8.0.1      # via types-all
+types-urllib3==1.26.25.14  # via types-requests
+types-waitress==2.1.4.9   # via types-all
 types-werkzeug==1.0.9     # via types-all, types-flask
 types-xxhash==3.0.5.2     # via types-all
-typing-extensions==4.5.0  # via black, gt4py (pyproject.toml), mypy, pytest-factoryboy
-urllib3==2.0.2            # via requests
-virtualenv==20.23.0       # via pre-commit, tox
+typing-extensions==4.5.0  # via black, faker, gt4py (pyproject.toml), mypy, pytest-factoryboy
+urllib3==2.0.4            # via requests
+virtualenv==20.24.2       # via pre-commit, tox
 websockets==11.0.3        # via dace
-werkzeug==2.3.4           # via flask
-wheel==0.40.0             # via astunparse, pip-tools
+werkzeug==2.3.6           # via flask
+wheel==0.41.0             # via astunparse, pip-tools
 xxhash==3.0.0             # via gt4py (pyproject.toml)
-zipp==3.15.0              # via importlib-metadata, importlib-resources
+zipp==3.16.2              # via importlib-metadata, importlib-resources
 
 # The following packages are considered to be unsafe in a requirements file:
-pip==23.1.2               # via pip-tools
-setuptools==67.8.0        # via gt4py (pyproject.toml), nodeenv, pip-tools
+pip==23.2.1               # via pip-tools
+setuptools==68.0.0        # via gt4py (pyproject.toml), nodeenv, pip-tools
diff --git a/src/gt4py/cartesian/backend/dace_backend.py b/src/gt4py/cartesian/backend/dace_backend.py
index 204ce06d..60da2c36 100644
--- a/src/gt4py/cartesian/backend/dace_backend.py
+++ b/src/gt4py/cartesian/backend/dace_backend.py
@@ -25,6 +25,7 @@ from dace.sdfg.utils import inline_sdfgs
 from dace.serialize import dumps
 
 from gt4py import storage as gt_storage
+from gt4py.cartesian import config as gt_config
 from gt4py.cartesian.backend.base import CLIBackendMixin, register
 from gt4py.cartesian.backend.gtc_common import (
     BackendCodegen,
@@ -543,6 +544,8 @@ class DaCeComputationCodegen:
     def apply(cls, stencil_ir: gtir.Stencil, builder: "StencilBuilder", sdfg: dace.SDFG):
         self = cls()
         with dace.config.temporary_config():
+            if gt_config.GT4PY_USE_HIP:
+                dace.config.Config.set("compiler", "cuda", "backend", value="hip")
             dace.config.Config.set("compiler", "cuda", "max_concurrent_streams", value=-1)
             dace.config.Config.set("compiler", "cpu", "openmp_sections", value=False)
             code_objects = sdfg.generate_code()
diff --git a/src/gt4py/cartesian/backend/pyext_builder.py b/src/gt4py/cartesian/backend/pyext_builder.py
index d2959486..d2aa34bd 100644
--- a/src/gt4py/cartesian/backend/pyext_builder.py
+++ b/src/gt4py/cartesian/backend/pyext_builder.py
@@ -85,43 +85,58 @@ def get_gt_pyext_build_opts(
             "-isystem{}".format(gt_config.build_settings["boost_include_path"]),
             "-DBOOST_PP_VARIADICS",
             *extra_compile_args_from_config["cxx"],
-        ],
-        nvcc=[
-            "-std=c++17",
-            "-ftemplate-depth={}".format(gt_config.build_settings["cpp_template_depth"]),
-            "-arch=sm_{}".format(cuda_arch),
+        ]
+    )
+    extra_compile_args["cuda"] = [
+        "-std=c++17",
+        "-ftemplate-depth={}".format(gt_config.build_settings["cpp_template_depth"]),
+        "-DBOOST_PP_VARIADICS",
+        "-DBOOST_OPTIONAL_CONFIG_USE_OLD_IMPLEMENTATION_OF_OPTIONAL",
+        "-DBOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE",
+        *extra_compile_args_from_config["cuda"],
+    ]
+    if gt_config.GT4PY_USE_HIP:
+        extra_compile_args["cuda"] += [
+            "-isystem{}".format(gt_include_path),
+            "-isystem{}".format(gt_config.build_settings["boost_include_path"]),
+            "-fvisibility=hidden",
+            "-fPIC",
+        ]
+    else:
+        extra_compile_args["cuda"] += [
             "-isystem={}".format(gt_include_path),
             "-isystem={}".format(gt_config.build_settings["boost_include_path"]),
-            "-DBOOST_PP_VARIADICS",
-            "-DBOOST_OPTIONAL_CONFIG_USE_OLD_IMPLEMENTATION_OF_OPTIONAL",
-            "-DBOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE",
+            "-arch=sm_{}".format(cuda_arch),
             "--expt-relaxed-constexpr",
             "--compiler-options",
             "-fvisibility=hidden",
             "--compiler-options",
             "-fPIC",
-            *extra_compile_args_from_config["nvcc"],
-        ],
-    )
+        ]
     extra_link_args = gt_config.build_settings["extra_link_args"]
 
     mode_flags = ["-O0", "-ggdb"] if debug_mode else ["-O3", "-DNDEBUG"]
     extra_compile_args["cxx"].extend(mode_flags)
-    extra_compile_args["nvcc"].extend(mode_flags)
+    extra_compile_args["cuda"].extend(mode_flags)
     extra_link_args.extend(mode_flags)
 
     if dace_path := get_dace_module_path():
         extra_compile_args["cxx"].append(
             "-isystem{}".format(os.path.join(dace_path, "runtime/include"))
         )
-        extra_compile_args["nvcc"].append(
-            "-isystem={}".format(os.path.join(dace_path, "runtime/include"))
-        )
+        if gt_config.GT4PY_USE_HIP:
+            extra_compile_args["cuda"].append(
+                "-isystem{}".format(os.path.join(dace_path, "runtime/include"))
+            )
+        else:
+            extra_compile_args["cuda"].append(
+                "-isystem={}".format(os.path.join(dace_path, "runtime/include"))
+            )
 
     if add_profile_info:
         profile_flags = ["-pg"]
         extra_compile_args["cxx"].extend(profile_flags)
-        extra_compile_args["nvcc"].extend(profile_flags)
+        extra_compile_args["cuda"].extend(profile_flags)
         extra_link_args.extend(profile_flags)
 
     if uses_cuda:
@@ -142,8 +157,11 @@ def get_gt_pyext_build_opts(
         if uses_cuda:
             cuda_flags = []
             for cpp_flag in cpp_flags:
-                cuda_flags.extend(["--compiler-options", cpp_flag])
-            build_opts["extra_compile_args"]["nvcc"].extend(cuda_flags)
+                if gt_config.GT4PY_USE_HIP:
+                    cuda_flags.extend([cpp_flag])
+                else:
+                    cuda_flags.extend(["--compiler-options", cpp_flag])
+            build_opts["extra_compile_args"]["cuda"].extend(cuda_flags)
         elif cpp_flags:
             build_opts["extra_compile_args"].extend(cpp_flags)
 
@@ -297,7 +315,10 @@ def build_pybind_cuda_ext(
     library_dirs = library_dirs or []
     library_dirs = [*library_dirs, gt_config.build_settings["cuda_library_path"]]
     libraries = libraries or []
-    libraries = [*libraries, "cudart"]
+    if gt_config.GT4PY_USE_HIP:
+        libraries = [*libraries, "hiprtc"]
+    else:
+        libraries = [*libraries, "cudart"]
     extra_compile_args = extra_compile_args or []
 
     return build_pybind_ext(
@@ -342,16 +363,19 @@ class CUDABuildExtension(build_ext, object):
         # Save references to the original methods
         original_compile = self.compiler._compile
 
-        def nvcc_compile(obj, src, ext, cc_args, extra_postargs, pp_opts):
+        def cuda_compile(obj, src, ext, cc_args, extra_postargs, pp_opts):
             original_compiler_so = self.compiler.compiler_so
             # Copy before we make any modifications.
             cflags = copy.deepcopy(extra_postargs)
             try:
                 if os.path.splitext(src)[-1] == ".cu":
-                    nvcc_exec = os.path.join(gt_config.build_settings["cuda_bin_path"], "nvcc")
-                    self.compiler.set_executable("compiler_so", [nvcc_exec])
+                    if gt_config.GT4PY_USE_HIP:
+                        cuda_exec = os.path.join(gt_config.build_settings["cuda_bin_path"], "hipcc")
+                    else:
+                        cuda_exec = os.path.join(gt_config.build_settings["cuda_bin_path"], "nvcc")
+                    self.compiler.set_executable("compiler_so", [cuda_exec])
                     if isinstance(cflags, dict):
-                        cflags = cflags["nvcc"]
+                        cflags = cflags["cuda"]
                 elif isinstance(cflags, dict):
                     cflags = cflags["cxx"]
 
@@ -360,6 +384,6 @@ class CUDABuildExtension(build_ext, object):
                 # Put the original compiler back in place.
                 self.compiler.set_executable("compiler_so", original_compiler_so)
 
-        self.compiler._compile = nvcc_compile
+        self.compiler._compile = cuda_compile
         build_ext.build_extensions(self)
         self.compiler._compile = original_compile
diff --git a/src/gt4py/cartesian/config.py b/src/gt4py/cartesian/config.py
index 676e1f58..23bf36de 100644
--- a/src/gt4py/cartesian/config.py
+++ b/src/gt4py/cartesian/config.py
@@ -32,6 +32,17 @@ CUDA_ROOT: str = os.environ.get(
 
 CUDA_HOST_CXX: Optional[str] = os.environ.get("CUDA_HOST_CXX", None)
 
+if "GT4PY_USE_HIP" in os.environ:
+    GT4PY_USE_HIP: bool = bool(int(os.environ["GT4PY_USE_HIP"]))
+else:
+    # Autodetect cupy with ROCm/HIP support
+    try:
+        import cupy as _cp
+
+        GT4PY_USE_HIP = _cp.cuda.get_hipcc_path() is not None
+        del _cp
+    except Exception:
+        GT4PY_USE_HIP = False
 
 GT_INCLUDE_PATH: str = os.path.abspath(gridtools_cpp.get_include_dir())
 
@@ -42,28 +53,31 @@ build_settings: Dict[str, Any] = {
     "boost_include_path": os.path.join(BOOST_ROOT, "include"),
     "cuda_bin_path": os.path.join(CUDA_ROOT, "bin"),
     "cuda_include_path": os.path.join(CUDA_ROOT, "include"),
-    "cuda_library_path": os.path.join(CUDA_ROOT, "lib64"),
     "cuda_arch": os.environ.get("CUDA_ARCH", None),
     "gt_include_path": os.environ.get("GT_INCLUDE_PATH", GT_INCLUDE_PATH),
     "openmp_cppflags": os.environ.get("OPENMP_CPPFLAGS", "-fopenmp").split(),
     "openmp_ldflags": os.environ.get("OPENMP_LDFLAGS", "-fopenmp").split(),
     "extra_compile_args": {
         "cxx": [],
-        "nvcc": [],
+        "cuda": [],
     },
     "extra_link_args": [],
     "parallel_jobs": multiprocessing.cpu_count(),
     "cpp_template_depth": os.environ.get("GT_CPP_TEMPLATE_DEPTH", GT_CPP_TEMPLATE_DEPTH),
 }
+if GT4PY_USE_HIP:
+    build_settings["cuda_library_path"] = os.path.join(CUDA_ROOT, "lib")
+else:
+    build_settings["cuda_library_path"] = os.path.join(CUDA_ROOT, "lib64")
 
 if CUDA_HOST_CXX is not None:
-    build_settings["extra_compile_args"]["nvcc"].append(f"-ccbin={CUDA_HOST_CXX}")
+    build_settings["extra_compile_args"]["cuda"].append(f"-ccbin={CUDA_HOST_CXX}")
 
 cache_settings: Dict[str, Any] = {
     "dir_name": os.environ.get("GT_CACHE_DIR_NAME", ".gt_cache"),
     "root_path": os.environ.get("GT_CACHE_ROOT", os.path.abspath(".")),
     "load_retries": int(os.environ.get("GT_CACHE_LOAD_RETRIES", 3)),
-    "load_retry_delay": int(os.environ.get("GT_CACHE_LOAD_RETRY_DELAY", 100)),  # unit miliseconds
+    "load_retry_delay": int(os.environ.get("GT_CACHE_LOAD_RETRY_DELAY", 100)),  # unit milliseconds
 }
 
 code_settings: Dict[str, Any] = {"root_package_name": "_GT_"}
diff --git a/src/gt4py/cartesian/stencil_object.py b/src/gt4py/cartesian/stencil_object.py
index 67babe44..59089693 100644
--- a/src/gt4py/cartesian/stencil_object.py
+++ b/src/gt4py/cartesian/stencil_object.py
@@ -212,7 +212,7 @@ class StencilObject(abc.ABC):
         raise AttributeError("Attempting a deletion of an attribute in a frozen class")
 
     def __eq__(self, other) -> bool:
-        return type(self) == type(other)
+        return type(self) is type(other)
 
     def __str__(self) -> str:
         result = """
@@ -485,7 +485,7 @@ class StencilObject(abc.ABC):
             if parameter_info.access != AccessKind.NONE:
                 if name not in param_args:
                     raise ValueError(f"Missing value for '{name}' parameter.")
-                elif type(parameter := param_args[name]) != parameter_info.dtype:
+                elif np.dtype(type(parameter := param_args[name])) != parameter_info.dtype:
                     raise TypeError(
                         f"The type of parameter '{name}' is '{type(parameter)}' instead of '{parameter_info.dtype}'"
                     )
diff --git a/src/gt4py/eve/datamodels/core.py b/src/gt4py/eve/datamodels/core.py
index 1dfe656e..fcd53d13 100644
--- a/src/gt4py/eve/datamodels/core.py
+++ b/src/gt4py/eve/datamodels/core.py
@@ -1002,11 +1002,7 @@ def _make_type_converter(type_annotation: TypeAnnotation, name: str) -> TypeConv
 
         def _type_converter(value: Any) -> _T:
             try:
-                return (
-                    value
-                    if isinstance(value, type_annotation)  # type: ignore[arg-type]
-                    else type_annotation(value)  # type: ignore
-                )
+                return value if isinstance(value, type_annotation) else type_annotation(value)
             except Exception as error:
                 raise TypeError(
                     f"Error during coertion of given value '{value}' for field '{name}'."
diff --git a/src/gt4py/next/iterator/embedded.py b/src/gt4py/next/iterator/embedded.py
index 1be6423a..1407060f 100644
--- a/src/gt4py/next/iterator/embedded.py
+++ b/src/gt4py/next/iterator/embedded.py
@@ -174,7 +174,7 @@ class LocatedField(Protocol):
 
     @property
     @abc.abstractmethod
-    def axes(self) -> tuple[common.Dimension, ...]:
+    def __gt_dims__(self) -> tuple[common.Dimension, ...]:
         ...
 
     # TODO(havogt): define generic Protocol to provide a concrete return type
@@ -184,7 +184,7 @@ class LocatedField(Protocol):
 
     @property
     def __gt_origin__(self) -> tuple[int, ...]:
-        return tuple([0] * len(self.axes))
+        return tuple([0] * len(self.__gt_dims__))
 
 
 class MutableLocatedField(LocatedField, Protocol):
@@ -685,7 +685,9 @@ def _get_axes(
     field_or_tuple: LocatedField | tuple,
 ) -> Sequence[common.Dimension | runtime.Offset]:  # arbitrary nesting of tuples of LocatedField
     return (
-        _get_axes(field_or_tuple[0]) if isinstance(field_or_tuple, tuple) else field_or_tuple.axes
+        _get_axes(field_or_tuple[0])
+        if isinstance(field_or_tuple, tuple)
+        else field_or_tuple.__gt_dims__
     )
 
 
@@ -880,7 +882,7 @@ class LocatedFieldImpl(MutableLocatedField):
     """A Field with named dimensions/axes."""
 
     @property
-    def axes(self) -> tuple[common.Dimension, ...]:
+    def __gt_dims__(self) -> tuple[common.Dimension, ...]:
         return self._axes
 
     def __init__(
@@ -920,9 +922,10 @@ class LocatedFieldImpl(MutableLocatedField):
     @property
     def __gt_origin__(self) -> tuple[int, ...]:
         if not self.origin:
-            return tuple([0] * len(self.axes))
+            return tuple([0] * len(self.__gt_dims__))
         return cast(
-            tuple[int], get_ordered_indices(self.axes, {k.value: v for k, v in self.origin.items()})
+            tuple[int],
+            get_ordered_indices(self.__gt_dims__, {k.value: v for k, v in self.origin.items()}),
         )
 
     @property
@@ -1060,7 +1063,7 @@ class IndexField(LocatedField):
             return self.dtype.type(index[0])
 
     @property
-    def axes(self) -> tuple[common.Dimension]:
+    def __gt_dims__(self) -> tuple[common.Dimension]:
         return (self.axis,)
 
 
@@ -1077,7 +1080,7 @@ class ConstantField(LocatedField):
         return self.dtype(self.value)
 
     @property
-    def axes(self) -> tuple[()]:
+    def __gt_dims__(self) -> tuple[()]:
         return ()
 
 
@@ -1260,7 +1263,7 @@ def _get_axeses(field):
         return tuple(itertools.chain(*tuple(_get_axeses(f) for f in field)))
     else:
         assert is_located_field(field)
-        return (field.axes,)
+        return (field.__gt_dims__,)
 
 
 def _build_tuple_result(field, indices):
@@ -1290,7 +1293,7 @@ class TupleOfFields(TupleField):
             raise TypeError("Can only be instantiated with a tuple of fields")
         self.data = data
         axeses = _get_axeses(data)
-        self.axes = axeses[0]
+        self.__gt_dims__ = axeses[0]
 
     def field_getitem(self, indices):
         return _build_tuple_result(self.data, indices)
@@ -1398,14 +1401,14 @@ def fendef_embedded(fun: Callable[..., None], *args: Any, **kwargs: Any):
 
                 if column is None:
                     assert _is_concrete_position(pos)
-                    ordered_indices = get_ordered_indices(out.axes, pos)
+                    ordered_indices = get_ordered_indices(_get_axes(out), pos)
                     out.field_setitem(ordered_indices, res)
                 else:
                     col_pos = pos.copy()
                     for k in column.col_range:
                         col_pos[column.axis] = k
                         assert _is_concrete_position(col_pos)
-                        ordered_indices = get_ordered_indices(out.axes, col_pos)
+                        ordered_indices = get_ordered_indices(_get_axes(out), col_pos)
                         out.field_setitem(ordered_indices, res[k])
 
         ctx = cvars.copy_context()
diff --git a/src/gt4py/next/iterator/ir_makers.py b/src/gt4py/next/iterator/ir_makers.py
index 9eb45fbf..e74ce232 100644
--- a/src/gt4py/next/iterator/ir_makers.py
+++ b/src/gt4py/next/iterator/ir_makers.py
@@ -354,7 +354,7 @@ def promote_to_lifted_stencil(op: str | itir.SymRef | Callable) -> Callable[...,
         args = [
             f"__arg{i}" for i in range(len(its))
         ]  # TODO: `op` must not contain `SymRef(id="__argX")`
-        return lift(lambda_(*args)(op(*[deref(arg) for arg in args])))(*its)  # type: ignore[operator] # `op` is not `str`
+        return lift(lambda_(*args)(op(*[deref(arg) for arg in args])))(*its)
 
     return _impl
 
diff --git a/src/gt4py/next/iterator/transforms/symbol_ref_utils.py b/src/gt4py/next/iterator/transforms/symbol_ref_utils.py
index d6ec4e54..1f604d62 100644
--- a/src/gt4py/next/iterator/transforms/symbol_ref_utils.py
+++ b/src/gt4py/next/iterator/transforms/symbol_ref_utils.py
@@ -13,7 +13,8 @@
 # SPDX-License-Identifier: GPL-3.0-or-later
 
 import dataclasses
-from typing import Iterable, Sequence
+from collections import defaultdict
+from typing import Iterable, Optional, Sequence
 
 import gt4py.eve as eve
 from gt4py.next.iterator import ir as itir
@@ -21,36 +22,63 @@ from gt4py.next.iterator import ir as itir
 
 @dataclasses.dataclass
 class CountSymbolRefs(eve.NodeVisitor):
-    ref_counts: dict[str, int]
+    ref_counts: dict[str, int] = dataclasses.field(default_factory=lambda: defaultdict(int))
 
     @classmethod
     def apply(
-        cls, node: itir.Node | Sequence[itir.Node], symbol_names: Iterable[str]
+        cls,
+        node: itir.Node | Sequence[itir.Node],
+        symbol_names: Optional[Iterable[str]] = None,
+        *,
+        ignore_builtins: bool = True,
     ) -> dict[str, int]:
-        ref_counts = {name: 0 for name in symbol_names}
-        active_refs = set(symbol_names)
+        """
+        Count references to given or all symbols in scope.
 
-        obj = cls(ref_counts=ref_counts)
-        obj.visit(node, active_refs=active_refs)
+        Examples:
+            >>> import gt4py.next.iterator.ir_makers as im
+            >>> expr = im.plus(im.plus("x", "y"), im.plus(im.plus("x", "y"), "z"))
+            >>> CountSymbolRefs.apply(expr)
+            {'x': 2, 'y': 2, 'z': 1}
 
-        return obj.ref_counts
+            If only some symbols are of interests the search can be restricted:
 
-    def visit_SymRef(self, node: itir.SymRef, *, active_refs: set[str]):
-        if node.id in active_refs:
-            self.ref_counts[node.id] += 1
+            >>> CountSymbolRefs.apply(expr, symbol_names=["x", "z"])
+            {'x': 2, 'z': 1}
+        """
+        if ignore_builtins:
+            inactive_refs = {str(n.id) for n in itir.FencilDefinition._NODE_SYMBOLS_}
+        else:
+            inactive_refs = set()
 
-    def visit_Lambda(self, node: itir.Lambda, *, active_refs: set[str]):
-        active_refs = active_refs - {param.id for param in node.params}
+        obj = cls()
+        obj.visit(node, inactive_refs=inactive_refs)
 
-        self.generic_visit(node, active_refs=active_refs)
+        if symbol_names:
+            return {k: obj.ref_counts.get(k, 0) for k in symbol_names}
+        return dict(obj.ref_counts)
+
+    def visit_SymRef(self, node: itir.SymRef, *, inactive_refs: set[str]):
+        if node.id not in inactive_refs:
+            self.ref_counts[str(node.id)] += 1
+
+    def visit_Lambda(self, node: itir.Lambda, *, inactive_refs: set[str]):
+        inactive_refs = inactive_refs | {param.id for param in node.params}
+
+        self.generic_visit(node, inactive_refs=inactive_refs)
 
 
 def collect_symbol_refs(
-    node: itir.Node | Sequence[itir.Node], symbol_names: Iterable[str]
+    node: itir.Node | Sequence[itir.Node],
+    symbol_names: Optional[Iterable[str]] = None,
+    *,
+    ignore_builtins: bool = True,
 ) -> list[str]:
     return [
         symbol_name
-        for symbol_name, count in CountSymbolRefs.apply(node, symbol_names).items()
+        for symbol_name, count in CountSymbolRefs.apply(
+            node, symbol_names, ignore_builtins=ignore_builtins
+        ).items()
         if count > 0
     ]
 
diff --git a/src/gt4py/next/program_processors/runners/dace_iterator/__init__.py b/src/gt4py/next/program_processors/runners/dace_iterator/__init__.py
index 12dec51d..71853771 100644
--- a/src/gt4py/next/program_processors/runners/dace_iterator/__init__.py
+++ b/src/gt4py/next/program_processors/runners/dace_iterator/__init__.py
@@ -30,7 +30,7 @@ from .utility import connectivity_identifier, filter_neighbor_tables
 
 def convert_arg(arg: Any):
     if isinstance(arg, LocatedField):
-        sorted_dims = sorted(enumerate(arg.axes), key=lambda v: v[1].value)
+        sorted_dims = sorted(enumerate(arg.__gt_dims__), key=lambda v: v[1].value)
         ndim = len(sorted_dims)
         dim_indices = [dim[0] for dim in sorted_dims]
         return np.moveaxis(np.asarray(arg), range(ndim), dim_indices)
diff --git a/src/gt4py/next/program_processors/runners/gtfn_cpu.py b/src/gt4py/next/program_processors/runners/gtfn_cpu.py
index 0e3d7851..0aa755cc 100644
--- a/src/gt4py/next/program_processors/runners/gtfn_cpu.py
+++ b/src/gt4py/next/program_processors/runners/gtfn_cpu.py
@@ -32,7 +32,7 @@ from gt4py.next.type_system.type_translation import from_value
 def convert_arg(arg: Any) -> Any:
     if isinstance(arg, tuple):
         return tuple(convert_arg(a) for a in arg)
-    if hasattr(arg, "__array__") and hasattr(arg, "axes"):
+    if hasattr(arg, "__array__") and hasattr(arg, "__gt_dims__"):
         arr = np.asarray(arg)
         origin = getattr(arg, "__gt_origin__", tuple([0] * arr.ndim))
         return arr, origin
diff --git a/src/gt4py/next/type_system/type_translation.py b/src/gt4py/next/type_system/type_translation.py
index 39947db4..047e5bbc 100644
--- a/src/gt4py/next/type_system/type_translation.py
+++ b/src/gt4py/next/type_system/type_translation.py
@@ -186,7 +186,7 @@ def from_value(value: Any) -> ts.TypeSpec:
     elif isinstance(value, common.Dimension):
         symbol_type = ts.DimensionType(dim=value)
     elif isinstance(value, LocatedField):
-        dims = list(value.axes)
+        dims = list(value.__gt_dims__)
         dtype = from_type_hint(value.dtype.type)
         symbol_type = ts.FieldType(dims=dims, dtype=dtype)
     elif isinstance(value, tuple):
diff --git a/src/gt4py/storage/utils.py b/src/gt4py/storage/utils.py
index cbc3529f..a68fae1f 100644
--- a/src/gt4py/storage/utils.py
+++ b/src/gt4py/storage/utils.py
@@ -20,6 +20,8 @@ from typing import Any, Dict, Iterable, Optional, Protocol, Sequence, Tuple, Uni
 import numpy as np
 import numpy.typing as npt
 
+from gt4py.cartesian import config as gt_config
+
 
 if np.lib.NumpyVersion(np.__version__) >= "1.20.0":
     from numpy.typing import DTypeLike
@@ -243,6 +245,18 @@ def allocate_gpu(
     if device_field.ndim > 0:
         device_field = device_field[tuple(slice(0, s, None) for s in shape)]
 
+    if gt_config.GT4PY_USE_HIP:
+        # HIP/ROCm lack support for __cuda_array_interface__
+        device_field.__hip_array_interface__ = {
+            "shape": padded_shape,
+            "typestr": device_field.dtype.descr[0][1],
+            "descr": device_field.dtype.descr,
+            "stream": 1,
+            "version": 3,
+            "strides": strides,
+            "data": (device_field.data.ptr, False),
+        }
+
     return device_raw_buffer, device_field
 
 


Test patch:
diff --git a/min-extra-requirements-test.txt b/min-extra-requirements-test.txt
index 778f5957..3a50641c 100644
--- a/min-extra-requirements-test.txt
+++ b/min-extra-requirements-test.txt
@@ -44,11 +44,13 @@ gridtools-cpp==2.3.0
 hypothesis==6.0.0
 importlib-resources==5.0;python_version<'3.9'
 isort==5.10
+jax[cpu]==0.4.13
 jinja2==3.0.0
 jupytext==1.14
 lark==1.1.2
 mako==1.1
 mypy==1.0
+nanobind==1.4.0
 ninja==1.10
 numpy==1.21.2
 packaging==20.0
diff --git a/min-requirements-test.txt b/min-requirements-test.txt
index 3ab9fe85..734cdc6c 100644
--- a/min-requirements-test.txt
+++ b/min-requirements-test.txt
@@ -47,6 +47,7 @@ jupytext==1.14
 lark==1.1.2
 mako==1.1
 mypy==1.0
+nanobind==1.4.0
 ninja==1.10
 numpy==1.21.2
 packaging==20.0
diff --git a/tests/cartesian_tests/unit_tests/test_gtc/gtcpp_utils.py b/tests/cartesian_tests/unit_tests/test_gtc/gtcpp_utils.py
index 8158b76b..5b1c393f 100644
--- a/tests/cartesian_tests/unit_tests/test_gtc/gtcpp_utils.py
+++ b/tests/cartesian_tests/unit_tests/test_gtc/gtcpp_utils.py
@@ -124,7 +124,7 @@ class GTFunctorFactory(factory.Factory):
     param_list = undefined_symbol_list(
         lambda name: GTAccessorFactory(name=name),
         "applies",
-        list_creator=lambda l: GTParamListFactory(accessors=l),
+        list_creator=lambda lst: GTParamListFactory(accessors=lst),
     )
 
 
diff --git a/tests/next_tests/unit_tests/iterator_tests/test_embedded_field.py b/tests/next_tests/unit_tests/iterator_tests/test_embedded_field.py
index 2f16ad13..df93ab43 100644
--- a/tests/next_tests/unit_tests/iterator_tests/test_embedded_field.py
+++ b/tests/next_tests/unit_tests/iterator_tests/test_embedded_field.py
@@ -28,7 +28,7 @@ def test_located_field_1d():
 
     foo[0] = 42
 
-    assert foo.axes[0] == "foo"
+    assert foo.__gt_dims__[0] == "foo"
     assert foo[0] == 42
 
 
@@ -37,7 +37,7 @@ def test_located_field_2d():
 
     foo[0, 0] = 42
 
-    assert foo.axes[0] == "foo"
+    assert foo.__gt_dims__[0] == "foo"
     assert foo[0, 0] == 42
     assert foo.dtype == np.float64
 
@@ -49,12 +49,6 @@ def test_tuple_field_concept():
     field_of_tuples = make_located_field(dtype="f8,f8")
     assert embedded.can_be_tuple_field(field_of_tuples)
 
-    # TODO think about if that makes sense
-    # field_with_unnamed_dimensions = gtx.np_as_located_field("foo", unnamed_as_tuple=True)(
-    #     np.zeros((1, 2))
-    # )
-    # assert embedded.is_tuple_field(field_with_unnamed_dimensions)
-
 
 def test_field_of_tuple():
     field_of_tuples = make_located_field(dtype="f8,f8")
@@ -74,7 +68,6 @@ def test_tuple_of_tuple_of_field():
         (make_located_field(), make_located_field()),
         (make_located_field(), make_located_field()),
     )
-    print(embedded._get_axeses(tup))
     testee = embedded.TupleOfFields(tup)
     assert isinstance(testee, embedded.TupleField)